diff --git a/views/js/loader/taoQtiTestRunner.min.js b/views/js/loader/taoQtiTestRunner.min.js index 10da2319b..beeef25dd 100644 --- a/views/js/loader/taoQtiTestRunner.min.js +++ b/views/js/loader/taoQtiTestRunner.min.js @@ -1,2 +1,2 @@ -(function(){"use strict";var loaderScript=document.getElementById("amd-loader"),configUrl=loaderScript.getAttribute("data-config"),bundle=loaderScript.getAttribute("data-bundle"),loadController=function loadController(){var controllerOptions={},controllerPath=loaderScript.getAttribute("data-controller"),params=loaderScript.getAttribute("data-params");try{controllerOptions=JSON.parse(params)}catch(err){controllerOptions={}}window.require([controllerPath],function(controller){var startController=function startController(){window.started||(window.started=!0,controller.start(controllerOptions))};document.addEventListener("readystatechange",startController,!1),"complete"===document.readyState&&startController()})};window.require([configUrl],function(){window.loadBundles||(window.loaded={},window.loadBundles=function loadBundles(bundles){bundles=bundles||[],bundles=bundles.concat(window.bundles),bundles=bundles.filter(function(item,index){return item&&bundles.indexOf(item)===index&&!0!==window.loaded[item]}),require(bundles,function(){bundles.forEach(function(item){window.loaded[item]=!0}),loadController()})}),bundle||window.bundles&&window.bundles.length?window.loadBundles([bundle]):loadController()})})(),define("loader/bootstrap",function(){}),define("css!taoQtiTestCss/new-test-runner",[],function(){}),define("taoQtiTest/controller/runner/runner",["jquery","lodash","i18n","context","module","core/router","core/logger","layout/loading-bar","ui/feedback","util/url","util/locale","taoTests/runner/providerLoader","taoTests/runner/runner","css!taoQtiTestCss/new-test-runner"],function($,_,__,context,module,router,loggerFactory,loadingBar,feedback,urlUtil,locale,providerLoader,runner){"use strict";const requiredOptions=["testDefinition","testCompilation","serviceCallId","bootstrap","options","providers"];return{start(config){let exitReason;const $container=$(".runner"),logger=loggerFactory("controller/runner",{serviceCallId:config.serviceCallId,plugins:config&&config.providers&&Object.keys(config.providers.plugins)});let preventFeedback=!1,errorFeedback=null;const exit=function exit(reason,level){let url=config.options.exitUrl;const params={};reason&&(!level&&(level="warning"),params[level]=reason,url=urlUtil.build(url,params)),window.location=url},onError=function onError(err,displayMessage){onFeedback(err,displayMessage,"error")},onWarning=function onWarning(err,displayMessage){onFeedback(err,displayMessage,"warning")},onFeedback=function onFeedback(err,displayMessage,type){const typeMap={warning:{logger:"warn",feedback:"warning"},error:{logger:"error",feedback:"error"}},loggerByType=logger[typeMap[type].logger],feedbackByType=feedback()[typeMap[type].feedback];return displayMessage=displayMessage||err.message,_.isString(displayMessage)||(displayMessage=JSON.stringify(displayMessage)),loadingBar.stop(),loggerByType({displayMessage:displayMessage},err),"error"===type&&(403===err.code||500===err.code)?(displayMessage=`${__("An error occurred during the test, please content your administrator.")} ${displayMessage}`,exit(displayMessage,"error")):void(!preventFeedback&&(errorFeedback=feedbackByType(displayMessage,{timeout:-1})))},moduleConfig=module.config();return loadingBar.start(),$(".delivery-scope").attr({dir:locale.getLanguageDirection(context.locale)}),requiredOptions.every(option=>"undefined"!=typeof config[option])?void(moduleConfig&&_.isArray(moduleConfig.extraRoutes)&&moduleConfig.extraRoutes.length&&router.dispatch(moduleConfig.extraRoutes),config.provider=Object.assign(config.provider||{},{runner:"qti"}),providerLoader(config.providers,context.bundle).then(function(results){const testRunnerConfig=_.omit(config,["providers"]);if(testRunnerConfig.renderTo=$container,results.proxy&&"function"==typeof results.proxy.getAvailableProviders){const loadedProxies=results.proxy.getAvailableProviders();testRunnerConfig.provider.proxy=loadedProxies[0]}logger.debug({config:testRunnerConfig,providers:config.providers},"Start test runner"),runner(config.provider.runner,results.plugins,testRunnerConfig).on("error",onError).on("warning",onWarning).on("ready",function(){_.defer(function(){$container.removeClass("hidden")})}).on("pause",function(data){data&&data.reason&&(exitReason=data.reason)}).after("destroy",function(){this.removeAllListeners(),exit(exitReason)}).on("disablefeedbackalerts",function(){errorFeedback&&errorFeedback.close(),preventFeedback=!0}).on("enablefeedbackalerts",function(){preventFeedback=!1}).init()}).catch(function(err){onError(err,__("An error occurred during the test initialization!"))})):onError(new TypeError(__("Missing required configuration option %s",name)))}}}),define("taoQtiTest/runner/config/assetManager",["taoItems/assets/manager","taoItems/assets/strategies","taoQtiItem/portableElementRegistry/assetManager/portableAssetStrategy"],function(assetManagerFactory,assetStrategies,assetPortableElement){"use strict";function getAssetManager(testId){var assetManager;return"undefined"==typeof assetManagers[testId]?(assetManager=assetManagerFactory(defaultStrategies,{baseUrl:""}),assetManagers[testId]=assetManager):assetManager=assetManagers[testId],assetManager}assetManagerFactory=assetManagerFactory&&Object.prototype.hasOwnProperty.call(assetManagerFactory,"default")?assetManagerFactory["default"]:assetManagerFactory,assetStrategies=assetStrategies&&Object.prototype.hasOwnProperty.call(assetStrategies,"default")?assetStrategies["default"]:assetStrategies,assetPortableElement=assetPortableElement&&Object.prototype.hasOwnProperty.call(assetPortableElement,"default")?assetPortableElement["default"]:assetPortableElement;var defaultStrategies=[assetStrategies.packedUrl,assetStrategies.external,assetStrategies.base64,assetStrategies.baseUrl,assetPortableElement],assetManagers={};return getAssetManager}),define("taoQtiTest/runner/config/qtiServiceConfig",["lodash","util/url","util/config"],function(_,urlUtil,configHelper){"use strict";function configFactory(config){var storage=configHelper.from(config,_entries,_defaults),undef;return storage.timeout?storage.timeout*=1e3:storage.timeout=undef,{getTestDefinition:function getTestDefinition(){return storage.testDefinition},getTestCompilation:function getTestCompilation(){return storage.testCompilation},getServiceCallId:function getServiceCallId(){return storage.serviceCallId},getServiceController:function getServiceController(){return storage.bootstrap.serviceController||_defaults.bootstrap.serviceController},getServiceExtension:function getServiceExtension(){return storage.bootstrap.serviceExtension||_defaults.bootstrap.serviceExtension},getTestActionUrl:function getTestActionUrl(action){return urlUtil.route(action,this.getServiceController(),this.getServiceExtension(),{testDefinition:this.getTestDefinition(),testCompilation:this.getTestCompilation(),serviceCallId:this.getServiceCallId()})},getItemActionUrl:function getItemActionUrl(itemIdentifier,action){return urlUtil.route(action,this.getServiceController(),this.getServiceExtension(),{testDefinition:this.getTestDefinition(),testCompilation:this.getTestCompilation(),testServiceCallId:this.getServiceCallId(),itemDefinition:itemIdentifier})},getTelemetryUrl:function getTelemetryUrl(itemIdentifier,signal){return urlUtil.route(signal,this.getServiceController(),this.getServiceExtension(),{testDefinition:this.getTestDefinition(),testCompilation:this.getTestCompilation(),testServiceCallId:this.getServiceCallId(),itemDefinition:itemIdentifier})},getTimeout:function getTimeout(){return storage.timeout},getCommunicationConfig:function getCommunicationConfig(){var communication=storage.bootstrap.communication||{},extension=communication.extension||this.getServiceExtension(),controller=communication.controller||this.getServiceController(),action=communication.action,syncActions=communication.syncActions||[],service=urlUtil.route(action||"message",controller,extension,{testDefinition:this.getTestDefinition(),testCompilation:this.getTestCompilation(),serviceCallId:this.getServiceCallId()}),params=_.merge({},communication.params||{},{service:communication.service||service});return params.timeout?params.timeout*=1e3:params.timeout=storage.timeout,params.interval&&(params.interval*=1e3),{enabled:communication.enabled,type:communication.type,params:params,syncActions:syncActions}}}}_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,urlUtil=urlUtil&&Object.prototype.hasOwnProperty.call(urlUtil,"default")?urlUtil["default"]:urlUtil,configHelper=configHelper&&Object.prototype.hasOwnProperty.call(configHelper,"default")?configHelper["default"]:configHelper;var _defaults={bootstrap:{serviceController:"Runner",serviceExtension:"taoQtiTest"}},_entries={testDefinition:!0,testCompilation:!0,serviceCallId:!0,bootstrap:!1,timeout:!1};return configFactory}),define("taoQtiTest/runner/config/states",[],function(){"use strict";var states={testSession:Object.freeze({initial:0,interacting:1,modalFeedback:2,suspended:3,closed:4}),itemSession:Object.freeze({initial:0,interacting:1,modalFeedback:2,suspended:3,closed:4,solution:5,notSelected:255})};return states}),define("taoQtiTest/runner/helpers/currentItem",["lodash"],function(_){"use strict";_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_;var responseCardinalities={single:"base",multiple:"list",ordered:"list",record:"record"},interactionMinConstraintProperties={matchInteraction:"minAssociations",choiceInteraction:"minChoices",orderInteraction:"minChoices",associateInteraction:"minAssociations",hottextInteraction:"minChoices",hotspotInteraction:"minChoices",graphicOrderInteraction:"minChoices",graphicAssociateInteraction:"minAssociations",selectPointInteraction:"minChoices"},currentItemHelper={getDeclarations:function getDeclarations(runner){var itemRunner=runner.itemRunner;return itemRunner._item&&itemRunner._item.responses},getResponseDeclaration:function getResponseDeclaration(runner,identifier){var found=null;return _.forEach(currentItemHelper.getDeclarations(runner),function(declaration){var attributes=declaration.attributes||{};if(attributes.identifier===identifier)return found=declaration,!1}),found},toResponse:function toResponse(value,baseType,cardinality){var mappedCardinality=responseCardinalities[cardinality],response={};(_.isString(value)||_.isNumber(value))&&(value=[value]);let transform=v=>v;return"boolean"===baseType?transform=v=>!0===v||"true"===v:"integer"===baseType?transform=v=>"number"==typeof v?v:parseInt(v):"float"===baseType?transform=v=>"number"==typeof v?v:parseFloat(v):("directedPair"==baseType||"pair"==baseType)&&(transform=v=>_.isString(v)?v.split(" "):v),value=_.map(value||[],transform),mappedCardinality&&("base"===mappedCardinality?0===value.length?response.base=null:(response.base={},response.base[baseType]=value[0]):(response[mappedCardinality]={},response[mappedCardinality][baseType]=value)),response},isQtiValueNull:function isQtiValueNull(value,baseType,cardinality){var mappedCardinality=responseCardinalities[cardinality];_.isObject(value)&&null===value[mappedCardinality]&&(value=null),_.isObject(value)&&value[mappedCardinality]&&"undefined"!=typeof value[mappedCardinality][baseType]&&(value=value[mappedCardinality][baseType]);const stringyValue="string"===baseType||"integer"===baseType||"float"===baseType;return null===value||stringyValue&&""===value||"single"!==cardinality&&_.isEmpty(value)},isQuestionAnswered:function isQuestionAnswered(response,baseType,cardinality,defaultValue,constraintValue){var fullyAnswered=!0,answered,currentCardinality,responses;return defaultValue=_.isUndefined(defaultValue)?null:defaultValue,constraintValue=constraintValue||0,currentItemHelper.isQtiValueNull(response,baseType,cardinality)?answered=!1:(answered=!_.isEqual(response,currentItemHelper.toResponse(defaultValue,baseType,cardinality)),0!==constraintValue&&(currentCardinality=responseCardinalities[cardinality],responses=response[currentCardinality][baseType]||[],fullyAnswered=responses&&responses.length>=constraintValue),answered=answered&&fullyAnswered),answered},guessInteractionConstraintValues:function guessInteractionConstraintValues(runner){var itemRunner=runner.itemRunner,itemBody=itemRunner._item&&itemRunner._item.bdy||{},interactions=itemBody.elements||{},constraintValues={};return _.forEach(interactions,function(interaction){var attributes=interaction.attributes||{},qtiClass=interaction.__proto__.qtiClass,constraintProperty;Object.prototype.hasOwnProperty.call(interactionMinConstraintProperties,qtiClass)&&(constraintProperty=interactionMinConstraintProperties[qtiClass],constraintValues[attributes.responseIdentifier]=attributes[constraintProperty])}),constraintValues},isAnswered:function isAnswered(runner,partially){var itemRunner=runner.itemRunner,responses=itemRunner&&itemRunner.getResponses(),count=0,empty=0,declarations,constraintValues;return itemRunner&&(declarations=currentItemHelper.getDeclarations(runner),constraintValues=currentItemHelper.guessInteractionConstraintValues(runner),_.forEach(declarations,function(declaration){var attributes=declaration.attributes||{},response=responses[attributes.identifier],baseType=attributes.baseType,cardinality=attributes.cardinality;count++,currentItemHelper.isQuestionAnswered(response,baseType,cardinality,declaration.defaultValue,constraintValues[attributes.identifier])||empty++})),!1===partially?0{0elt.replace(taoPrefix,"").replace(/[-_\s]/g,"").toLowerCase();return categories.some(itemCategory=>normalize(itemCategory)===normalize(category))}return!1},getTestStats:function getTestStats(map){return map&&map.stats},getPartStats:function getPartStats(map,partName){var part=this.getPart(map,partName);return part&&part.stats},getSectionStats:function getSectionStats(map,sectionName){var section=this.getSection(map,sectionName);return section&§ion.stats},getScopeStats:function getScopeStats(map,position,scope){var jump=this.getJump(map,position);switch(scope){case"section":case"testSection":return this.getSectionStats(map,jump&&jump.section);case"part":case"testPart":return this.getPartStats(map,jump&&jump.part);case"testWithoutInaccessibleItems":{const testStats=this.getTestStats(map),{position:currentPartPosition,isLinear:isCurrentPartLinear}=this.getPart(map,jump&&jump.part),parts=Object.values(this.getParts(map)).filter(_ref=>{let{position:partPosition}=_ref;return partPositionb-a),linearPartIndex=isCurrentPartLinear?0:parts.findIndex(_ref2=>{let{isLinear}=_ref2;return isLinear});if(-1===linearPartIndex)return testStats;const inaccessibleParts=parts.slice(linearPartIndex),countOfInaccessibleUnasweredQestions=inaccessibleParts.reduce((acc,_ref3)=>{let{stats:{questions,answered}}=_ref3;return acc+(questions-answered)},0),countOfInaccessibleFlaggedQestions=inaccessibleParts.reduce((acc,_ref4)=>{let{stats:{flagged}}=_ref4;return acc+flagged},0);return Object.assign({},testStats,{answered:testStats.answered+countOfInaccessibleUnasweredQestions,flagged:testStats.flagged-countOfInaccessibleFlaggedQestions})}default:case"test":return this.getTestStats(map)}},getScopeMap:function getScopeMap(map,position,scope){var scopeMap=_.cloneDeep(map||{}),jump=this.getJump(scopeMap,position),part=this.getPart(scopeMap,jump&&jump.part),section=this.getSection(scopeMap,jump&&jump.section);return scope&&"test"!==scope&&(scopeMap.parts={},part&&(scopeMap.parts[jump.part]=part)),part&&("section"===scope||"testSection"===scope)&&(part.sections={},section&&(part.sections[jump.section]=section)),section&&(section.stats=this.computeItemStats(section.items)),part&&(part.stats=this.computeStats(part.sections)),scopeMap.stats=this.computeStats(scopeMap.parts),scopeMap},getScopeMapFromContext:function getScopeMapFromContext(map,context,scope){var scopeMap=_.cloneDeep(map||{}),part,section;return context&&context.testPartId&&(part=this.getPart(scopeMap,context.testPartId)),context&&context.sectionId&&(section=this.getSection(scopeMap,context.sectionId)),scope&&"test"!==scope&&(scopeMap.parts={},part&&(scopeMap.parts[context.testPartId]=part)),part&&("section"===scope||"testSection"===scope)&&(part.sections={},section&&(part.sections[context.sectionId]=section)),section&&(section.stats=this.computeItemStats(section.items)),part&&(part.stats=this.computeStats(part.sections)),scopeMap.stats=this.computeStats(scopeMap.parts),scopeMap},getItemPart:function getItemPart(map,position){var jump=this.getJump(map,position);return this.getPart(map,jump&&jump.part)},getItemSection:function getItemSection(map,position){var jump=this.getJump(map,position),part=this.getPart(map,jump&&jump.part),sections=part&&part.sections;return sections&§ions[jump&&jump.section]},getItemAt:function getItemAt(map,position){var jump=this.getJump(map,position),part=this.getPart(map,jump&&jump.part),sections=part&&part.sections,section=sections&§ions[jump&&jump.section],items=section&§ion.items;return items&&items[jump&&jump.identifier]},getItemIdentifier:function getItemIdentifier(map,position){var item;return item=_.isFinite(position)?this.getItemAt(map,position):this.getItem(map,position),item&&item.id},each:function each(map,callback){return _.isFunction(callback)&&_.forEach(map&&map.parts,function(part){_.forEach(part&&part.sections,function(section){_.forEach(section&§ion.items,function(item){callback(item,section,part,map)})})}),map},updateItemStats:function updateItemStats(map,position){var jump=this.getJump(map,position),part=this.getPart(map,jump&&jump.part),sections=part&&part.sections,section=sections&§ions[jump&&jump.section];return section&&(section.stats=this.computeItemStats(section.items)),part&&(part.stats=this.computeStats(part.sections)),map&&(map.stats=this.computeStats(map.parts)),map},computeItemStats:function computeItemStats(items){return _.reduce(items,function accStats(acc,item){return item.informational||(acc.questions++,item.answered&&acc.answered++,item.viewed&&acc.questionsViewed++),item.flagged&&acc.flagged++,item.viewed&&acc.viewed++,acc.total++,acc},getEmptyStats())},computeStats:function computeStats(collection){return _.reduce(collection,function accStats(acc,item){return acc.questions+=item.stats.questions,acc.answered+=item.stats.answered,acc.flagged+=item.stats.flagged,acc.viewed+=item.stats.viewed,acc.total+=item.stats.total,acc.questionsViewed+=item.stats.questionsViewed,acc},getEmptyStats())},patch:function patch(currentMap,partialMap){var self=this,targetMap;if(!_.isPlainObject(partialMap)||!partialMap.parts)throw new TypeError("Invalid test map format");return currentMap&&"test"!==partialMap.scope?(targetMap=_.cloneDeep(currentMap),_.forEach(partialMap.parts,function(partialPart,targetPartId){"part"===partialMap.scope&&(targetMap.parts[targetPartId]=_.cloneDeep(partialPart)),"section"===partialMap.scope&&_.forEach(partialPart.sections,function(partialSection,targetSectionId){targetMap.parts[targetPartId].sections[targetSectionId]=_.cloneDeep(partialSection),targetMap.parts[targetPartId].sections[targetSectionId].stats=self.computeItemStats(targetMap.parts[targetPartId].sections[targetSectionId].items)}),targetMap.parts[targetPartId].stats=self.computeStats(targetMap.parts[targetPartId].sections)}),targetMap.stats=this.computeStats(targetMap.parts)):targetMap=_.cloneDeep(partialMap),targetMap=this.reindex(targetMap),targetMap},reindex:function reindex(map){var offset=0,offsetPart=0,offsetSection=0,lastPartId,lastSectionId;if(!_.isPlainObject(map)||!map.parts)throw new TypeError("Invalid test map format");return map.jumps=[],_.sortBy(map&&map.parts,"position").forEach(function(part){_.sortBy(part&&part.sections,"position").forEach(function(section){_.sortBy(section&§ion.items,"position").forEach(function(item){lastPartId!==part.id&&(offsetPart=0,lastPartId=part.id,part.position=offset),lastSectionId!==section.id&&(offsetSection=0,lastSectionId=section.id,section.position=offset),item.position=offset,item.index=offsetSection+1,item.positionInPart=offsetPart,item.positionInSection=offsetSection,map.jumps[offset]={identifier:item.id,section:section.id,part:part.id,position:offset},offset++,offsetSection++,offsetPart++})})}),map},createJumpTable:function createJumpTable(map){if(!_.isPlainObject(map)||!map.parts)throw new TypeError("Invalid test map format");return map.jumps=[],this.each(map,function(item,section,part){var offset=item.position;map.jumps[offset]={identifier:item.id,section:section.id,part:part.id,position:offset}}),map}};return map}),define("taoQtiTest/runner/helpers/isReviewPanelEnabled",["taoQtiTest/runner/helpers/map"],function(mapHelper){"use strict";function isReviewPanelEnabled(runner){const reviewEnabled=mapHelper.hasItemCategory(runner.getTestMap(),runner.getTestContext().itemIdentifier,"reviewScreen",!0),itemReviewEnabled=runner.getOptions().review.enabled;return reviewEnabled&&itemReviewEnabled}return mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper,isReviewPanelEnabled}),define("taoQtiTest/runner/helpers/stats",["lodash","taoQtiTest/runner/helpers/map","taoQtiTest/runner/helpers/currentItem"],function(_,mapHelper,currentItemHelper){"use strict";_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper,currentItemHelper=currentItemHelper&&Object.prototype.hasOwnProperty.call(currentItemHelper,"default")?currentItemHelper["default"]:currentItemHelper;var stats={getInstantStats(scope,runner,sync){const map=runner.getTestMap(),context=runner.getTestContext(),item=runner.getCurrentItem(),testPart=runner.getCurrentPart(),stats=_.clone(mapHelper.getScopeStats(map,context.itemPosition,scope)),options=runner.getOptions()||{};let partiallyAnsweredIsAnswered;if(options.review&&(partiallyAnsweredIsAnswered=options.review.partiallyAnsweredIsAnswered),!item.informational){const isItemCurrentlyAnswered=currentItemHelper.isAnswered(runner,partiallyAnsweredIsAnswered);!isItemCurrentlyAnswered&&item.answered?stats.answered--:(isItemCurrentlyAnswered||sync)&&!item.answered?stats.answered++:sync&&!isItemCurrentlyAnswered&&item.answered&&testPart.isLinear&&stats.answered++}return stats}};return stats}),define("taoQtiTest/runner/helpers/messages",["i18n","taoQtiTest/runner/helpers/stats","handlebars","lib/handlebars/helpers"],function(__,statsHelper,Handlebars,Helpers0){"use strict";function messageHeaderTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}function getExitMessage(scope,runner){let message=2

",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var functionType="function",escapeExpression=this.escapeExpression,self=this,stack1;return stack1=helpers["if"].call(depth0,depth0&&depth0.header,{hash:{},inverse:self.noop,fn:self.program(1,program1,data),data:data}),stack1||0===stack1?stack1:""}),messages={getExitMessage:getExitMessage};return messages}),define("taoQtiTest/runner/helpers/navigation",["lodash","taoQtiTest/runner/helpers/map"],function(_,mapHelper){"use strict";_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper;var navigationHelper={isLeavingSection:function isLeavingSection(testContext,testMap,direction,scope,position){var section,sectionStats,nbItems,item;if(_.isPlainObject(testContext)&&_.isPlainObject(testMap)&&!_.isEmpty(testContext.sectionId)&&!_.isEmpty(testContext.itemIdentifier))return section=mapHelper.getSection(testMap,testContext.sectionId),sectionStats=mapHelper.getSectionStats(testMap,testContext.sectionId),nbItems=sectionStats&§ionStats.total,item=mapHelper.getItem(testMap,testContext.itemIdentifier),"section"===scope||"testPart"===scope||"next"===direction&&item.positionInSection+1===nbItems||"previous"===direction&&0===item.positionInSection||"jump"===direction&&0=section.position+nbItems);throw new TypeError("Invalid test context and test map")},isLeavingTestPart:function isLeavingTestPart(testContext,testMap,direction,scope,position){var testPart,testPartStats,nbItems,item,section,sectionStats;if(_.isPlainObject(testContext)&&_.isPlainObject(testMap)&&!_.isEmpty(testContext.testPartId)&&!_.isEmpty(testContext.sectionId)&&!_.isEmpty(testContext.itemIdentifier))return testPart=mapHelper.getPart(testMap,testContext.testPartId),testPartStats=mapHelper.getPartStats(testMap,testContext.testPartId),nbItems=testPartStats&&testPartStats.total,item=mapHelper.getItem(testMap,testContext.itemIdentifier),"section"===scope&&(section=mapHelper.getSection(testMap,testContext.sectionId),sectionStats=mapHelper.getSectionStats(testMap,testContext.sectionId)),"testPart"===scope||"next"===direction&&"item"===scope&&item.positionInPart+1===nbItems||"next"===direction&&"section"===scope&§ion.position+sectionStats.total>=nbItems||"previous"===direction&&"item"===scope&&0===item.positionInPart||"previous"===direction&&"section"===scope&§ion.position===testPart.position||"jump"===direction&&0=testPart.position+nbItems);throw new TypeError("Invalid test context and test map")},isLast:function isLast(testMap,itemIdentifier){return this.isLastOf(testMap,itemIdentifier,"test")},isFirst:function isFirst(testMap,itemIdentifier){return this.isFirstOf(testMap,itemIdentifier,"test")},isLastOf:function isLastOf(testMap,itemIdentifier,scope){var item,stats;if(!_.isPlainObject(testMap))throw new TypeError("Invalid test map");if(_.isEmpty(itemIdentifier))throw new TypeError("Invalid item identifier");if(scope=scope||"test",item=mapHelper.getItem(testMap,itemIdentifier),stats=mapHelper.getScopeStats(testMap,item.position,scope),stats&&_.isNumber(stats.total)){if("test"===scope)return item.position+1===stats.total;if("section"===scope||"assessmentSection"===scope||"testSection"===scope)return item.positionInSection+1===stats.total;if("part"===scope||"testPart"===scope)return item.positionInPart+1===stats.total}return!1},isFirstOf:function isFirstOf(testMap,itemIdentifier,scope){var item;if(!_.isPlainObject(testMap))throw new TypeError("Invalid test map");if(_.isEmpty(itemIdentifier))throw new TypeError("Invalid item identifier");return scope=scope||"test",item=mapHelper.getItem(testMap,itemIdentifier),"test"===scope?0===item.position:"section"===scope||"assessmentSection"===scope||"testSection"===scope?0===item.positionInSection:("part"===scope||"testPart"===scope)&&0===item.positionInPart},getSiblingItems:function getSiblingItems(testMap,itemPosition,direction,size){var itemId=mapHelper.getItemIdentifier(testMap,itemPosition),previous=null,siblings=[],itemChain=_.reduce(testMap&&testMap.jumps,function(map,jump){var ref=jump.identifier;return previous&&(map[previous].next=ref),map[ref]={identifier:ref,previous:previous,next:null},previous=ref,map},{}),directions;return size=_.isFinite(size)?parseInt(size,10):3,directions=direction&&"both"!==direction?[direction]:["previous","next"],_.forEach(directions,function walkDirection(link){var id=itemId;_.times(size,function getNeighbor(){return id=itemChain[id]&&itemChain[id][link],!!id&&void siblings.push(mapHelper.getItem(testMap,id))})}),siblings},getNextItem:function getNextItem(testMap,itemPosition){var siblings=navigationHelper.getSiblingItems(testMap,itemPosition,"next",1);return siblings.length?siblings[0]:null},getPreviousItem:function getPreviousItem(testMap,itemPosition){var siblings=navigationHelper.getSiblingItems(testMap,itemPosition,"previous",1);return siblings.length?siblings[0]:null},isMovingToNextItem:function isMovingToNextItem(action,params){return params=params||{},"timeout"===action||"skip"===action||"move"===action&&"next"===params.direction&&"item"===params.scope},isMovingToPreviousItem:function isMovingToPreviousItem(action,params){return params=params||{},"move"===action&&"previous"===params.direction&&"item"===params.scope},isJumpingToItem:function isJumpingToItem(action,params){return params=params||{},"move"===action&&"jump"===params.direction&&"item"===params.scope}};return navigationHelper}),define("taoQtiTest/runner/helpers/offlineErrorHelper",["lodash","i18n"],function(_,__){"use strict";_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__;var offlineErrorHelper={buildErrorFromContext:function buildErrorFromContext(errorData,context){var err=_.assign(new Error(errorData.message),errorData.data);return _.assign(err,context||{})},getOfflineNavError:function getOfflineNavError(){return{message:__("We are unable to connect to the server to retrieve the next item."),data:{success:!1,source:"navigator",purpose:"proxy",type:"nav",code:404}}},getOfflineExitError:function getOfflineExitError(){return{message:__("We are unable to connect the server to submit your results."),data:{success:!1,source:"navigator",purpose:"proxy",type:"finish",code:404}}},getOfflinePauseError:function getOfflinePauseError(){return{message:__("The test has been paused, we are unable to connect to the server."),data:{success:!1,source:"navigator",purpose:"proxy",type:"pause",code:404}}}};return offlineErrorHelper}),define("taoQtiTest/runner/helpers/offlineSyncModal",["jquery","i18n","core/polling","ui/hider","ui/waitingDialog/waitingDialog","handlebars","lib/handlebars/helpers","util/shortcut/registry","util/shortcut"],function($$1,__,polling,hider,waitingDialogFactory,Handlebars,Helpers0,shortcutRegistry,globalShortcut){"use strict";function offlineSyncModalCountdownTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}function offlineSyncModalWaitContentTpl(data,options,asString){var html=Template$1(data,options);return asString||!0?html:$(html)}function offlineSyncModalFactory(proxy){const waitingConfig={message:__("You are currently working offline."),waitContent:offlineSyncModalWaitContentTpl(),proceedContent:__("Your connection seems to be back, please proceed."),proceedButtonText:__("PROCEED & END ASSESSMENT"),showSecondary:!0,secondaryButtonText:__("Download"),secondaryButtonIcon:"download",buttonSeparatorText:__("or"),width:"600px"};let $secondaryButton;const betweenButtonTextSelector=".between-buttons-text",secondaryButtonWait=60;let delaySec;const $countdown=$$1(offlineSyncModalCountdownTpl());let countdownPolling;const dialogShortcut=shortcutRegistry($$1("body"),{propagate:!1,prevent:!0});dialogShortcut.disable().set("Tab Shift+Tab");const waitingDialog=waitingDialogFactory(waitingConfig),getDialogEl=selector=>waitingDialog.dialog.getDom().find(selector);return waitingDialog.on("render",()=>{delaySec=secondaryButtonWait,$secondaryButton=getDialogEl("button[data-control=\"secondary\"]"),$countdown.insertAfter($secondaryButton),proxy.after("reconnect.waiting",()=>{waitingDialog.endWait(),hider.hide(getDialogEl("p.message"))}),proxy.before("disconnect.waiting",()=>{waitingDialog.dialog.show(),waitingDialog.beginWait()}),waitingDialog.is("waiting")&&waitingDialog.trigger("begincountdown"),globalShortcut.disable(),dialogShortcut.enable()}).on("destroy",()=>{proxy.off(".waiting"),globalShortcut.enable(),dialogShortcut.disable(),dialogShortcut.clear()}).on("wait",()=>{hider.show(getDialogEl(betweenButtonTextSelector)),hider.show(getDialogEl("p.message")),waitingDialog.is("rendered")&&waitingDialog.trigger("begincountdown")}).on("begincountdown",()=>{$secondaryButton.prop("disabled",!0),countdownPolling=polling({action:function countdownAction(){delaySec--,$countdown.html(__("The download will be available in %d seconds",delaySec)),1>delaySec&&(this.stop(),$secondaryButton.removeProp("disabled"),$countdown.html(""))},interval:1e3,autoStart:!0})}).on("unwait",()=>{countdownPolling.stop(),$secondaryButton.prop("disabled",!0),$countdown.html(""),hider.hide(getDialogEl(betweenButtonTextSelector))}),waitingDialog}$$1=$$1&&Object.prototype.hasOwnProperty.call($$1,"default")?$$1["default"]:$$1,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,polling=polling&&Object.prototype.hasOwnProperty.call(polling,"default")?polling["default"]:polling,hider=hider&&Object.prototype.hasOwnProperty.call(hider,"default")?hider["default"]:hider,waitingDialogFactory=waitingDialogFactory&&Object.prototype.hasOwnProperty.call(waitingDialogFactory,"default")?waitingDialogFactory["default"]:waitingDialogFactory,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,shortcutRegistry=shortcutRegistry&&Object.prototype.hasOwnProperty.call(shortcutRegistry,"default")?shortcutRegistry["default"]:shortcutRegistry,globalShortcut=globalShortcut&&Object.prototype.hasOwnProperty.call(globalShortcut,"default")?globalShortcut["default"]:globalShortcut,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){return this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),"

\n"});Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template$1=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",helperMissing=helpers.helperMissing,escapeExpression=this.escapeExpression,helper,options;return buffer+="
\n

"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"It is not possible to save your responses while working offline.",options):helperMissing.call(depth0,"__","It is not possible to save your responses while working offline.",options)))+"

\n

"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Option A",options):helperMissing.call(depth0,"__","Option A",options)))+"

\n
    \n
  • "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Wait for your connection to come back online.",options):helperMissing.call(depth0,"__","Wait for your connection to come back online.",options)))+"
  • \n
  • "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Try connecting the machine to the internet via cable, or move to an area with a better wifi signal.",options):helperMissing.call(depth0,"__","Try connecting the machine to the internet via cable, or move to an area with a better wifi signal.",options)))+"
  • \n
  • "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"If the connection cannot be restored, see option B.",options):helperMissing.call(depth0,"__","If the connection cannot be restored, see option B.",options)))+"
  • \n
\n

"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Option B",options):helperMissing.call(depth0,"__","Option B",options)))+"

\n
    \n
  • "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Download the pupil responses and submit manually.",options):helperMissing.call(depth0,"__","Download the pupil responses and submit manually.",options)))+"
  • \n
\n

"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Step 1: Download the file (see below when available).",options):helperMissing.call(depth0,"__","Step 1: Download the file (see below when available).",options)))+" "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Do not rename it.",options):helperMissing.call(depth0,"__","Do not rename it.",options)))+"

\n

"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Step 2: When you are online again, please send the downloaded file to receptionbaseline@nfer.ac.uk together with the ",options):helperMissing.call(depth0,"__","Step 2: When you are online again, please send the downloaded file to receptionbaseline@nfer.ac.uk together with the ",options)))+"\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"name of the pupil",options):helperMissing.call(depth0,"__","name of the pupil",options)))+" "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"and",options):helperMissing.call(depth0,"__","and",options)))+" "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"the assessment (LCL or Mathematics)",options):helperMissing.call(depth0,"__","the assessment (LCL or Mathematics)",options)))+" "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"that was being taken.",options):helperMissing.call(depth0,"__","that was being taken.",options)))+"\n

\n

"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Step 3: Once you have downloaded the file you can close the browser window. Do not do anything further with the assessment whilst it shows as \"in progress\"; the status will be updated once the helpline has uploaded the file.",options):helperMissing.call(depth0,"__","Step 3: Once you have downloaded the file you can close the browser window. Do not do anything further with the assessment whilst it shows as \"in progress\"; the status will be updated once the helpline has uploaded the file.",options)))+"

\n
\n

"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"If you need help, please contact our Helpline on 0330 088 4171.",options):helperMissing.call(depth0,"__","If you need help, please contact our Helpline on 0330 088 4171.",options)))+"

\n
",buffer});return offlineSyncModalFactory}),define("taoQtiTest/runner/helpers/testContextBuilder",["lodash","util/capitalize","taoQtiTest/runner/helpers/map","taoQtiTest/runner/helpers/navigation"],function(_,capitalize,mapHelper,navigationHelper){"use strict";function buildTestContextFromPosition(testContext,testMap,position,attempt){var updatedMap=mapHelper.updateItemStats(testMap,position),item=mapHelper.getItemAt(updatedMap,position),section=mapHelper.getItemSection(updatedMap,position),part=mapHelper.getItemPart(updatedMap,position);return!!item&&getTestContext(testContext,testMap,item,section,part,position,attempt)}function buildTestContextFromJump(testContext,testMap,jump,attempt){var part=testMap.parts[jump.part],section=part.sections[jump.section],item=section.items[jump.item];return getTestContext(testContext,testMap,item,section,part,jump.position,attempt)}function getTestContext(testContext,testMap,item,section,part,position,attempt){var _Mathmax=Math.max,isLeavingSection=section.id!==testContext.sectionId,isLeavingPart=part.id!==testContext.testPartId,newTestContext=_.defaults({itemIdentifier:item.id,itemPosition:position,remainingAttempts:_Mathmax(-1,item.remainingAttempts-1),sectionId:section.id,sectionTitle:section.label,testPartId:part.id,canMoveBackward:!part.isLinear&&!navigationHelper.isFirst(testMap,item.id)},testContext);return attempt&&(newTestContext.attempt=attempt+1),isLeavingSection&&(newTestContext.numberRubrics=0,newTestContext.rubrics=""),newTestContext.timeConstraints=_.reject(testContext.timeConstraints,function(constraint){return"assessmentItemRef"===constraint.qtiClassName||isLeavingSection&&"assessmentSection"===constraint.qtiClassName||isLeavingPart&&"testPart"===constraint.qtiClassName}),item.timeConstraint&&newTestContext.timeConstraints.push(item.timeConstraint),isLeavingSection&§ion.timeConstraint&&newTestContext.timeConstraints.push(section.timeConstraint),isLeavingPart&&part.timeConstraint&&newTestContext.timeConstraints.push(part.timeConstraint),newTestContext.options=_.defaults(getOptionsFromCategories(item.categories||[]),_.pick(testContext.options,["allowComment","allowSkipping","exitButton","logoutButton"])),newTestContext}function getOptionsFromCategories(categories){return _.isArray(categories)&&categories.length?_.reduce(categories,function(acc,category){var categoryName;return _.isString(category)&&!_.isEmpty(category)&&(categoryName=category.replace("x-tao-option-","").split(/[-_]+/g).map(function(name,index){return 0===index?name:name.length?capitalize(name):""}).join(""),categoryName&&(acc[categoryName]=!0)),acc},{}):{}}_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,capitalize=capitalize&&Object.prototype.hasOwnProperty.call(capitalize,"default")?capitalize["default"]:capitalize,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper,navigationHelper=navigationHelper&&Object.prototype.hasOwnProperty.call(navigationHelper,"default")?navigationHelper["default"]:navigationHelper;var testContextBuilder={buildTestContextFromPosition:buildTestContextFromPosition,buildTestContextFromJump:buildTestContextFromJump};return testContextBuilder}),define("taoQtiTest/runner/navigator/navigator",["lodash","taoQtiTest/runner/helpers/map","taoQtiTest/runner/helpers/testContextBuilder"],function(_,mapHelper,testContextBuilder){"use strict";_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper,testContextBuilder=testContextBuilder&&Object.prototype.hasOwnProperty.call(testContextBuilder,"default")?testContextBuilder["default"]:testContextBuilder;var navigatorFactory=function navigatorFactory(testContext,testMap){if(!_.all([testContext,testMap],_.isPlainObject))throw new TypeError("The navigator must be built with a testData, a testContext and a testMap");return{navigate:function navigate(direction,scope,position){var methodName=direction.toLowerCase()+scope.substr(0,1).toUpperCase()+scope.substr(1).toLowerCase();if(_.isFunction(this[methodName]))return this[methodName](position)},nextItem:function nextItem(){return testContextBuilder.buildTestContextFromPosition(testContext,testMap,testContext.itemPosition+1)},previousItem:function previsousItem(){return testContextBuilder.buildTestContextFromPosition(testContext,testMap,testContext.itemPosition-1)},nextSection:function nextSection(){var sectionStats=mapHelper.getSectionStats(testMap,testContext.sectionId),section=mapHelper.getSection(testMap,testContext.sectionId);return testContextBuilder.buildTestContextFromPosition(testContext,testMap,section.position+sectionStats.total)},jumpItem:function jumpItem(position){return testContextBuilder.buildTestContextFromPosition(testContext,testMap,position)}}};return navigatorFactory}),define("taoQtiTest/runner/branchRule/helpers/branchRuleHelper",["lodash"],function(_){"use strict";function evaluateSubBranchRules(branchRuleDefinition,item,navigationParams,branchRuleMapper,responseStore){return new Promise(function(resolve,reject){var subBranchRuleResults=[],promises=[];branchRuleDefinition=_.omit(branchRuleDefinition,["@attributes"]),promises=_.map(branchRuleDefinition,function(subBranchRule,subBranchRuleName){return branchRuleMapper(subBranchRuleName,branchRuleDefinition[subBranchRuleName],item,navigationParams,responseStore).validate()}),Promise.all(promises).then(function(results){_.forEach(results,function(subBranchRuleResult){Array.isArray(subBranchRuleResult)?subBranchRuleResult.forEach(function(value){subBranchRuleResults.push(value)}):subBranchRuleResults.push(subBranchRuleResult)}),resolve(subBranchRuleResults)}).catch(function(err){reject(err)})})}_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_;var branchRuleHelper={evaluateSubBranchRules:evaluateSubBranchRules};return branchRuleHelper}),define("taoQtiTest/runner/branchRule/types/match",["lodash"],function(_){"use strict";function matchBranchRuleFactory(branchRuleDefinition,item,navigationParams,branchRuleMapper,responseStore){var variableIdentifier=branchRuleDefinition.variable["@attributes"].identifier,correctIdentifier=branchRuleDefinition.correct["@attributes"].identifier;return{validate:function validate(){return Promise.all([responseStore.getCorrectResponse(correctIdentifier),responseStore.getResponse(variableIdentifier)]).then(function(result){return _.contains(result[0],result[1])})}}}return _=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,matchBranchRuleFactory}),define("taoQtiTest/runner/branchRule/types/or",["taoQtiTest/runner/branchRule/helpers/branchRuleHelper"],function(branchRuleHelper){"use strict";function orBranchRuleFactory(branchRuleDefinition,item,navigationParams,branchRuleMapper,responseStore){return{validate:function validate(){return branchRuleHelper.evaluateSubBranchRules(branchRuleDefinition,item,navigationParams,branchRuleMapper,responseStore).then(function(subBranchRuleResults){return subBranchRuleResults.some(function(value){return value})})}}}return branchRuleHelper=branchRuleHelper&&Object.prototype.hasOwnProperty.call(branchRuleHelper,"default")?branchRuleHelper["default"]:branchRuleHelper,orBranchRuleFactory}),define("taoQtiTest/runner/branchRule/types/and",["taoQtiTest/runner/branchRule/helpers/branchRuleHelper"],function(branchRuleHelper){"use strict";function andBranchRuleFactory(branchRuleDefinition,item,navigationParams,branchRuleMapper,responseStore){return{validate:function validate(){return branchRuleHelper.evaluateSubBranchRules(branchRuleDefinition,item,navigationParams,branchRuleMapper,responseStore).then(function(subBranchRuleResults){return subBranchRuleResults.every(function(value){return value})})}}}return branchRuleHelper=branchRuleHelper&&Object.prototype.hasOwnProperty.call(branchRuleHelper,"default")?branchRuleHelper["default"]:branchRuleHelper,andBranchRuleFactory}),define("taoQtiTest/runner/branchRule/types/not",["lodash"],function(_){"use strict";function notBranchRuleFactory(branchRuleDefinition,item,navigationParams,branchRuleMapper,responseStore){return Array.isArray(branchRuleDefinition)||(branchRuleDefinition=[branchRuleDefinition]),{validate:function validate(){var promises=branchRuleDefinition.map(function(expression){var subBranchRuleName=_.head(_.keys(expression)),subBranchRuleDefinition=expression[subBranchRuleName];return branchRuleMapper(subBranchRuleName,subBranchRuleDefinition,item,navigationParams,responseStore).validate()});return Promise.all(promises).then(function(results){return _.map(results,function(result){return!result})})}}}return _=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,notBranchRuleFactory}),define("taoQtiTest/runner/branchRule/branchRuleMapper",["taoQtiTest/runner/branchRule/types/match","taoQtiTest/runner/branchRule/types/or","taoQtiTest/runner/branchRule/types/and","taoQtiTest/runner/branchRule/types/not"],function(matchBranchRule,orBranchRule,andBranchRule,notBranchRule){"use strict";function branchRuleMapperFactory(branchRuleName,branchRuleDefinition,item,navigationParams,responseStore){if(!(branchRuleName in branchRuleMap))throw new Error(`Invalid branch rule name: ${branchRuleName}`);return branchRuleMap[branchRuleName](branchRuleDefinition,item,navigationParams,branchRuleMapperFactory,responseStore)}matchBranchRule=matchBranchRule&&Object.prototype.hasOwnProperty.call(matchBranchRule,"default")?matchBranchRule["default"]:matchBranchRule,orBranchRule=orBranchRule&&Object.prototype.hasOwnProperty.call(orBranchRule,"default")?orBranchRule["default"]:orBranchRule,andBranchRule=andBranchRule&&Object.prototype.hasOwnProperty.call(andBranchRule,"default")?andBranchRule["default"]:andBranchRule,notBranchRule=notBranchRule&&Object.prototype.hasOwnProperty.call(notBranchRule,"default")?notBranchRule["default"]:notBranchRule;var branchRuleMap={match:matchBranchRule,or:orBranchRule,and:andBranchRule,not:notBranchRule};return branchRuleMapperFactory}),define("taoQtiTest/runner/branchRule/branchRule",["taoQtiTest/runner/branchRule/helpers/branchRuleHelper","taoQtiTest/runner/branchRule/branchRuleMapper"],function(branchRuleHelper,branchRuleMapper){"use strict";function branchRuleFactory(branchRuleDefinition,item,navigationParams,responseStore){return new Promise(function(resolve){var result;return"undefined"==typeof branchRuleDefinition["@attributes"]||"undefined"==typeof branchRuleDefinition["@attributes"].target?resolve(null):void branchRuleHelper.evaluateSubBranchRules(branchRuleDefinition,item,navigationParams,branchRuleMapper,responseStore).then(function(branchRuleResults){return result=branchRuleResults.every(function(branchRuleResult){return branchRuleResult}),result?resolve(branchRuleDefinition["@attributes"].target):void resolve(null)})})}return branchRuleHelper=branchRuleHelper&&Object.prototype.hasOwnProperty.call(branchRuleHelper,"default")?branchRuleHelper["default"]:branchRuleHelper,branchRuleMapper=branchRuleMapper&&Object.prototype.hasOwnProperty.call(branchRuleMapper,"default")?branchRuleMapper["default"]:branchRuleMapper,branchRuleFactory}),define("taoQtiTest/runner/services/offlineJumpTable",["lodash","taoQtiTest/runner/branchRule/branchRule","taoQtiTest/runner/helpers/map"],function(_,branchRule,mapHelper){"use strict";_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,branchRule=branchRule&&Object.prototype.hasOwnProperty.call(branchRule,"default")?branchRule["default"]:branchRule,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper;var offlineJumpTableFactory=function offlineJumpTableFactory(itemStore,responseStore){function addResponsesToResponseStore(params){params.itemResponse&&_.forEach(params.itemResponse,function(response,itemResponseIdentifier){var responseIdentifier=`${params.itemDefinition}.${itemResponseIdentifier}`;_.forEach(response,function(responseEntry){var responseId=responseEntry&&responseEntry.identifier;Array.isArray(responseId)?responseId.forEach(function(id){responseStore.addResponse(responseIdentifier,id)}):responseStore.addResponse(responseIdentifier,responseId)})})}function getItems(map){return _.uniq(_.map(getSimplifiedTestMap(map),function(row){return row.item}))}function getSections(map){return _.uniq(_.map(getSimplifiedTestMap(map),function(row){return row.section}))}function getSimplifiedTestMap(map){var simplifiedTestMap=[];return mapHelper.each(map,function(item,section,part){simplifiedTestMap.push({item:item.id,itemHasBranchRule:!_.isEmpty(item.branchRule),itemBranchRule:item.branchRule,section:section.id,sectionHasBranchRule:!_.isEmpty(section.branchRule),sectionBranchRule:section.branchRule,part:part.id,partHasBranchRule:!_.isEmpty(part.branchRule),partBranchRule:part.branchRule})}),simplifiedTestMap}var testMap={},jumpTable=[];return{setTestMap:function setTestMap(map){return testMap=map,this},buildJumpTable:function buildJumpTable(testContext){function calculateNextJump(){var lastJumpItem=self.getLastJump().item||null;return contextItemId===lastJumpItem?Promise.resolve():itemStore.get(lastJumpItem).then(function(item){const itemResponse={};return _.forEach(item.itemState,function(state,itemStateIdentifier){itemResponse[itemStateIdentifier]=state.response}),self.jumpToNextItem(Object.assign({},item,{itemResponse,itemDefinition:item.itemIdentifier})).then(calculateNextJump)})}const self=this,simplifiedTestMap=getSimplifiedTestMap(testMap),contextItemId=testContext?testContext.itemIdentifier:null,contextItemPosition=contextItemId?testContext.itemPosition:null,firstJumpItem=simplifiedTestMap[0];return firstJumpItem&&this.addJump(firstJumpItem.part,firstJumpItem.section,firstJumpItem.item),contextItemPosition?calculateNextJump():Promise.resolve()},putCorrectResponsesInStore:function putCorrectResponsesInStore(){const simplifiedTestMap=getSimplifiedTestMap(testMap),promises=[];return simplifiedTestMap.forEach(function(row){promises.push(itemStore.get(row.item).then(function(item){item&&_.forEach(item.itemData.data.responses,function(response){var responseIdentifier=`${item.itemIdentifier}.${response.identifier}`;responseStore.addCorrectResponse(responseIdentifier,response.correctResponses)})}).catch(function(err){return Promise.reject(err)}))}),Promise.all(promises)},init:function init(testContext){return this.putCorrectResponsesInStore().then(()=>this.buildJumpTable(testContext))},clearJumpTable:function clearJumpTable(){return jumpTable=[],this},addJump:function addJump(partIdentifier,sectionIdentifier,itemIdentifier){var self=this;return new Promise(function(resolve){var lastJump=self.getLastJump(),nextPosition="undefined"==typeof lastJump.position?0:lastJump.position+1;jumpTable.push({item:itemIdentifier,part:partIdentifier,section:sectionIdentifier,position:nextPosition}),resolve()})},jumpTo:function jumpTo(position){return jumpTable=jumpTable.filter(function(jump){return jump.position<=position}),this},jumpToSkipItem:function jumpToSkipItem(){var self=this;return new Promise(function(resolve){var simplifiedTestMap=getSimplifiedTestMap(testMap),lastJumpItem=self.getLastJump().item||null,items=getItems(testMap),itemSliceIndex=items.indexOf(lastJumpItem),itemIdentifierToAdd=items.slice(itemSliceIndex+1).shift(),itemToAdd=simplifiedTestMap.filter(function(row){return row.item===itemIdentifierToAdd}).shift();return itemToAdd?self.addJump(itemToAdd.part,itemToAdd.section,itemToAdd.item).then(resolve):resolve()})},jumpToNextItem:function jumpToNextItem(params){var self=this;return addResponsesToResponseStore(params),new Promise(function(resolve){var simplifiedTestMap=getSimplifiedTestMap(testMap),lastJumpItem=self.getLastJump().item||null,items=getItems(testMap),itemSliceIndex=items.indexOf(lastJumpItem),itemIdentifierToAdd=items.slice(itemSliceIndex+1).shift(),itemToAdd=simplifiedTestMap.filter(function(row){return row.item===itemIdentifierToAdd}).shift(),lastJumpItemData=simplifiedTestMap.filter(function(row){return row.item===lastJumpItem}).shift();return lastJumpItemData&&lastJumpItemData.itemHasBranchRule?itemStore.get(lastJumpItem).then(function(item){branchRule(lastJumpItemData.itemBranchRule,item,params,responseStore).then(function(itemIdentifierToAddd){null!==itemIdentifierToAddd&&(itemToAdd=simplifiedTestMap.filter(function(row){return row.item===itemIdentifierToAddd}).shift()),self.addJump(itemToAdd.part,itemToAdd.section,itemToAdd.item).then(resolve)}).catch(function(err){return Promise.reject(err)})}).catch(function(err){return Promise.reject(err)}):itemToAdd?self.addJump(itemToAdd.part,itemToAdd.section,itemToAdd.item).then(resolve):resolve()})},jumpToNextSection:function jumpToNextSection(){var self=this;return new Promise(function(resolve){var simplifiedTestMap=getSimplifiedTestMap(testMap),lastJumpSection=self.getLastJump().section||null,sections=getSections(testMap),sectionSliceIndex=sections.indexOf(lastJumpSection),sectionIdentifierToAdd=sections.slice(sectionSliceIndex+1).shift(),itemToAdd=simplifiedTestMap.filter(function(row){return row.section===sectionIdentifierToAdd}).shift();return itemToAdd?self.addJump(itemToAdd.part,itemToAdd.section,itemToAdd.item).then(resolve):resolve()})},jumpToPreviousItem:function jumpToPreviousItem(){return new Promise(function(resolve){jumpTable.pop(),resolve()})},getJumpTable:function getJumpTable(){return jumpTable},getLastJump:function getLastJump(){return 0{const newTestContext=testContextBuilder.buildTestContextFromJump(testContext,testMap,lastJump,itemFromStore.attempt);itemStore.update(newTestContext.itemIdentifier,"attempt",newTestContext.attempt).then(()=>resolve(newTestContext))})}).catch(function(err){reject(err)})})}}}return capitalize=capitalize&&Object.prototype.hasOwnProperty.call(capitalize,"default")?capitalize["default"]:capitalize,offlineJumpTableFactory=offlineJumpTableFactory&&Object.prototype.hasOwnProperty.call(offlineJumpTableFactory,"default")?offlineJumpTableFactory["default"]:offlineJumpTableFactory,testContextBuilder=testContextBuilder&&Object.prototype.hasOwnProperty.call(testContextBuilder,"default")?testContextBuilder["default"]:testContextBuilder,offlineNavigatorFactory}),define("taoQtiTest/runner/provider/dataUpdater",["lodash","taoQtiTest/runner/helpers/map","taoQtiTest/runner/config/states"],function(_,mapHelper,states){"use strict";function dataUpdaterFactory(testDataHolder){if(!testDataHolder||!_.isFunction(testDataHolder.get)||!_.isFunction(testDataHolder.set))throw new TypeError("A data holder is mandatory for the udpater");return{update:function update(dataSet){var self=this,isContextual=function isContextual(contextualData){return contextualData&&(_.isPlainObject(contextualData.testContext)||_.isPlainObject(contextualData.testData)||_.isPlainObject(contextualData.testMap))},updateData=function updateData(contextualData){var builtTestMap,updatedTestMap;contextualData&&(_.isPlainObject(contextualData.testData)&&testDataHolder.set("testData",contextualData.testData),_.isPlainObject(contextualData.testContext)&&testDataHolder.set("testContext",contextualData.testContext),_.isPlainObject(contextualData.testMap)&&(builtTestMap=self.buildTestMap(contextualData.testMap),builtTestMap&&testDataHolder.set("testMap",builtTestMap)),updatedTestMap=self.updateStats(),updatedTestMap&&testDataHolder.set("testMap",updatedTestMap))};isContextual(dataSet)?updateData(dataSet):updateData(_.findLast(dataSet,isContextual))},buildTestMap:function buildTestMap(testMap){var newMap=null;return testMap&&(testMap.scope&&"test"!==testMap.scope?newMap=mapHelper.patch(testDataHolder.get("testMap"),testMap):newMap=mapHelper.reindex(testMap)),newMap},updateStats:function updateStats(){const testMap=testDataHolder.get("testMap"),testContext=testDataHolder.get("testContext");let updatedTestMap=null;if(testMap&&testContext&&_.isNumber(testContext.itemPosition)){const item=mapHelper.getItemAt(testMap,testContext.itemPosition);if(item&&testContext.state===states.testSession.interacting){const testPart=mapHelper.getPart(testMap,testContext.testPartId);item.viewed=!0,testPart&&testPart.isLinear&&(item.answered=!0),updatedTestMap=mapHelper.updateItemStats(testMap,testContext.itemPosition)}}return updatedTestMap},updatePluginsConfig(plugins,pluginsConfig){if(!pluginsConfig){const testData=testDataHolder.get("testData");pluginsConfig=testData&&testData.config&&testData.config.plugins}plugins&&pluginsConfig&&_.forEach(pluginsConfig,(config,pluginName)=>{_.isPlainObject(plugins[pluginName])&&_.isFunction(plugins[pluginName].setConfig)&&_.isPlainObject(config)&&plugins[pluginName].setConfig(config)})}}}return _=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper,states=states&&Object.prototype.hasOwnProperty.call(states,"default")?states["default"]:states,dataUpdaterFactory}),define("taoQtiTest/runner/provider/toolStateBridge",["lodash"],function(_){"use strict";function toolStateBridgeFactory(testStore,activePlugins){var tools=[];if(!testStore||!_.isFunction(testStore.getStore))throw new TypeError("The toolStateBridge should be initialized with a testStore");if(!_.isArray(activePlugins)||!activePlugins.length)throw new TypeError("The toolStateBridge should be initialized with a the list of active plugins");return{setTools:function setTools(toolNames){return tools=_(toolNames).filter(function(toolName){return _.contains(activePlugins,toolName)}).map(function(toolName){return testStore.startChangeTracking(toolName),toolName}).value(),this},getTools:function getTools(){return tools},restoreState:function restoreState(toolName,toolState){return _.contains(tools,toolName)&&_.isPlainObject(toolState)?testStore.getStore(toolName).then(function(toolStore){return toolStore.clear().then(function(){return toolStore})}).then(function(toolStore){return Promise.all(_.map(toolState,function(value,key){return toolStore.setItem(key,value)}))}).then(function(){return testStore.resetChanges(toolName),!0}):Promise.resolve(!1)},restoreStates:function restoreStates(states){var self=this;return Promise.all(_.map(states,function(toolState,toolName){return self.restoreState(toolName,toolState).then(function(result){var formattedResult={};return formattedResult[toolName]=result,formattedResult})})).then(mergeCollection)},getState:function getState(toolName,reset){return _.contains(tools,toolName)&&testStore.hasChanges(toolName)?testStore.getStore(toolName).then(function(toolStore){return!1!==reset&&testStore.resetChanges(toolName),toolStore.getItems()}):Promise.resolve(!1)},getStates:function getStates(){var self=this;return Promise.all(_.map(tools,function(toolName){return self.getState(toolName).then(function(toolState){var formattedState={};return!!toolState&&(formattedState[toolName]=toolState,formattedState)})})).then(mergeCollection)}}}_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_;var mergeCollection=function mergeCollection(collection){return _.reduce(collection,function(acc,value){return value?_.merge(acc,value):acc},{})};return toolStateBridgeFactory}),define("taoQtiTest/runner/ui/toolbox/entry",["lodash","ui/component","handlebars","lib/handlebars/helpers"],function(_,componentFactory,Handlebars,Helpers0){"use strict";function entryTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}function itemComponentFactory(specs,defaults){var itemComponent;return specs=_.defaults(specs||{},itemComponentApi),itemComponent=componentFactory(specs,defaults).setTemplate(entryTpl).on("enable",function(){this.is("rendered")&&this.$component.removeProp("disabled")}).on("disable",function(){this.is("rendered")&&(this.$component.prop("disabled",!0),this.turnOff())}).on("init",function(){this.initItem()}).on("render",function(){var self=this;this.disable(),this.$component.on("mousedown",function(event){self.trigger("mousedown",event)}).on("click",function(event){self.trigger("click",event)})}),itemComponent}_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,componentFactory=componentFactory&&Object.prototype.hasOwnProperty.call(componentFactory,"default")?componentFactory["default"]:componentFactory,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var buffer="",stack1,helper;return buffer+=" ",(helper=helpers.className)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.className,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1),buffer}function program3(depth0,data){var buffer="",stack1;return buffer+="\n aria-"+escapeExpression((stack1=null==data||!1===data?data:data.key,"function"===typeof stack1?stack1.apply(depth0):stack1))+"=\""+escapeExpression("function"===typeof depth0?depth0.apply(depth0):depth0)+"\"\n ",buffer}function program5(depth0,data){var buffer="",stack1,helper;return buffer+="",buffer}function program6(depth0,data){return" no-label"}function program8(depth0,data){var buffer="",stack1,helper;return buffer+="",(helper=helpers.text)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.text,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",functionType="function",escapeExpression=this.escapeExpression,self=this,stack1,helper;return buffer+="\n \n ",stack1=helpers["if"].call(depth0,depth0&&depth0.icon,{hash:{},inverse:self.noop,fn:self.program(5,program5,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.text,{hash:{},inverse:self.noop,fn:self.program(8,program8,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n \n\n",buffer}),itemComponentApi={initItem:function initItem(){this.id=this.config.control,this.menu=null},getType:function getType(){return"entry"},getId:function getId(){return this.id},setMenuId:function setMenuId(menuId){this.menuId=menuId},getMenuId:function getMenuId(){return this.menuId},turnOn:function turnOn(){this.setState("active",!0);const element=this.getElement();element&&"option"===element.attr("role")&&element.attr("aria-selected","true").attr("aria-checked","true")},turnOff:function turnOff(){this.setState("active",!1);const element=this.getElement();element&&"option"===element.attr("role")&&element.attr("aria-selected","false").attr("aria-checked","false")},hoverOn:function hoverOn(){this.setState("hover",!0)},hoverOff:function hoverOff(){this.setState("hover",!1)}};return itemComponentFactory}),define("taoQtiTest/runner/ui/toolbox/menu",["jquery","lodash","ui/component","ui/hider","ui/stacker","handlebars","lib/handlebars/helpers"],function($$1,_,componentFactory,hider,stackerFactory,Handlebars,Helpers0){"use strict";function menuTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}function menuItemTpl(data,options,asString){var html=Template$1(data,options);return asString||!0?html:$(html)}function menuComponentFactory(specs,defaults){var _defaults,menuComponent;return _defaults={$component:$$1(),$menuButton:$$1(),$menuContainer:$$1(),$menuContent:$$1(),$menuItems:$$1(),$menuStateIcon:$$1(),hoverIndex:null,id:null,menuItems:[]},specs=_.defaults(specs||{},menuComponentApi),menuComponent=componentFactory(specs,defaults).setTemplate(menuTpl).on("enable",function enable(){this.is("rendered")&&this.$component.removeProp("disabled")}).on("disable",function disable(){this.is("rendered")&&(this.$component.prop("disabled",!0),this.closeMenu(),this.turnOff())}).on("hide",function disable(){this.is("rendered")&&this.closeMenu()}).on("init",function init(){this.initMenu()}).on("render",function render(){var self=this;this.$menuButton=this.$component.find(`[data-control="${this.config.control}-button"]`),this.$menuContainer=this.$component.find(`[data-control="${this.config.control}-menu"]`),this.$menuContent=this.$component.find(`[data-control="${this.config.control}-list"]`),this.$menuStateIcon=this.$menuButton.find(".icon-up"),this.disable(),this.$component.on("click",function toggleMenu(e){e.preventDefault(),self.is("opened")||e.stopPropagation(),self.toggleMenu()}),this.$menuContainer.on("click",function closeMenuOnItemClick(e){e.preventDefault(),e.stopPropagation(),self.closeMenu()}),this.$menuContent.on("mouseleave",this.hoverOffAll)}).on("destroy",function(){this.is("rendered")&&(this.$menuContainer.off(".menuNavigation"),this.$menuButton.off(".menuNavigation"))}),_.defaults(menuComponent,_defaults),menuComponent}$$1=$$1&&Object.prototype.hasOwnProperty.call($$1,"default")?$$1["default"]:$$1,_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,componentFactory=componentFactory&&Object.prototype.hasOwnProperty.call(componentFactory,"default")?componentFactory["default"]:componentFactory,hider=hider&&Object.prototype.hasOwnProperty.call(hider,"default")?hider["default"]:hider,stackerFactory=stackerFactory&&Object.prototype.hasOwnProperty.call(stackerFactory,"default")?stackerFactory["default"]:stackerFactory,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var buffer="",stack1,helper;return buffer+=" ",(helper=helpers.className)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.className,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1),buffer}function program3(depth0,data){var buffer="",stack1,helper;return buffer+="",buffer}function program4(depth0,data){return" no-label"}function program6(depth0,data){var buffer="",stack1,helper;return buffer+="",(helper=helpers.text)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.text,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",functionType="function",escapeExpression=this.escapeExpression,self=this,stack1,helper;return buffer+="\n \n ",stack1=helpers["if"].call(depth0,depth0&&depth0.icon,{hash:{},inverse:self.noop,fn:self.program(3,program3,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.text,{hash:{},inverse:self.noop,fn:self.program(6,program6,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n   \n \n
\n \n
\n\n",buffer});Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template$1=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var buffer="",stack1,helper;return buffer+=" ",(helper=helpers.className)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.className,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1),buffer}function program3(depth0,data){var buffer="",stack1,helper;return buffer+="\n role=\"",(helper=helpers.role)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.role,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\"\n ",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",functionType="function",escapeExpression=this.escapeExpression,self=this,stack1,helper;return buffer+="\n \n \n ",(helper=helpers.text)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.text,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\n \n",buffer}),keyCodes={TAB:9,ESC:27,ENTER:13,SPACE:32,LEFT:37,UP:38,RIGHT:39,DOWN:40},stacker=stackerFactory("test-runner"),menuComponentApi={initMenu:function initMenu(){this.id=this.config.control,this.navType=this.config.navType?this.config.navType:"fromLast",this.menuItems=[]},getType:function getType(){return"menu"},getId:function getId(){return this.id},turnOn:function turnOn(){this.setState("active",!0)},turnOff:function turnOff(){this.setState("active",!1)},toggleMenu:function showMenu(){this.is("disabled")||(this.is("opened")?this.closeMenu():this.openMenu())},indexOfClosestVisibleItem(inc,last){if(!this.menuItems.length)return-1;let position=this.hoverIndex,elem;do{if(position+=inc,position===last)return-1;elem=this.menuItems[position].getElement()}while(elem&&elem.hasClass("hidden"));return position},hoverByIndex(index){const elem=this.menuItems[index];return this.hoverIndex=index,elem&&this.hoverItem(elem.id),elem},hoverNextVisibleItem(){const index=this.indexOfClosestVisibleItem(1,this.menuItems.length),elem=this.hoverByIndex(index);return elem},hoverPreviousVisibleItem(){const index=this.indexOfClosestVisibleItem(-1,-1),elem=this.hoverByIndex(index);return elem},openMenu:function openMenu(){hider.show(this.$menuContainer),stacker.bringToFront(this.$menuContent),this.$menuStateIcon.removeClass("icon-up"),this.$menuStateIcon.addClass("icon-down"),this.turnOn(),this.enableShortcuts(),this.hoverOffAll(),document.activeElement&&document.activeElement.blur();const activeItemIndex=_.findIndex(this.menuItems,item=>item.is("active"));0<=activeItemIndex?(this.hoverIndex=activeItemIndex,this.$menuItems[this.hoverIndex].focus(),this.hoverItem(this.menuItems[activeItemIndex].id)):"fromLast"===this.navType?(this.hoverIndex=this.menuItems.length,this.hoverPreviousVisibleItem()):"fromFirst"===this.navType&&(this.hoverIndex=-1,this.hoverNextVisibleItem()),this.setState("opened",!0),this.trigger("openmenu",this)},closeMenu(){hider.hide(this.$menuContainer),this.$menuStateIcon.removeClass("icon-down"),this.$menuStateIcon.addClass("icon-up"),this.turnOff(),this.disableShortcuts(),this.hoverOffAll(),this.setState("opened",!1),this.trigger("closemenu",this),this.is("disabled")||this.$component.prop("disabled")||this.$menuButton.parent().focus()},getItemById:function getItemById(itemId){return _.find(this.menuItems,function(item){return item.getId()===itemId})},addItem:function addItem(item){item&&this.menuItems.push(item)},renderItems:function renderItems(){var self=this;this.menuItems.forEach(function(item){item.setTemplate(menuItemTpl),item.render(self.$menuContent),item.enable()}),this.$menuItems=this.$menuContent.find(".menu-item"),this.$menuItems.on("mouseenter",function highlightHoveredEntry(e){var itemId=e.currentTarget.getAttribute("data-control");self.mouseOverItem(itemId)})},mouseOverItem:function mouseOverItem(itemId){var self=this;this.menuItems.forEach(function(item,index){item.id===itemId&&(self.hoverIndex=index)}),this.hoverItem(itemId)},hasDisplayedItems:function hasDisplayedItems(){return this.menuItems.some(function(item){return!item.is("disabled")&&!item.is("hidden")})},turnOffAll:function turnOffAll(){this.menuItems.forEach(function(current){current.turnOff()})},enableShortcuts:function enableShortcuts(){var self=this;this.$menuContainer.on("keydown.menuNavigation",function(e){var currentKeyCode=e.keyCode?e.keyCode:e.charCode;e.preventDefault();currentKeyCode===keyCodes.ESC||currentKeyCode===keyCodes.TAB?self.closeMenu():currentKeyCode===keyCodes.SPACE||currentKeyCode===keyCodes.ENTER?(self.triggerHighlightedItem(),e.stopPropagation()):currentKeyCode===keyCodes.LEFT||currentKeyCode===keyCodes.UP?(self.moveUp(),e.stopPropagation()):currentKeyCode===keyCodes.RIGHT||currentKeyCode===keyCodes.DOWN?(self.moveDown(),e.stopPropagation()):void 0}),this.$menuButton.on("keydown.menuNavigation",function(e){function setFocusToItem(index){self.hoverIndex=index,self.$menuContainer.focus(),self.hoverItem(self.menuItems[self.hoverIndex].id)}var currentKeyCode=e.keyCode?e.keyCode:e.charCode;currentKeyCode===keyCodes.UP&&"fromLast"===self.navType&&(e.stopPropagation(),setFocusToItem(self.menuItems.length-1)),currentKeyCode===keyCodes.DOWN&&"fromFirst"===self.navType&&(e.stopPropagation(),setFocusToItem(0))})},disableShortcuts:function disableShortcuts(){this.$menuContainer.off(".menuNavigation"),this.$menuButton.off(".menuNavigation")},moveUp:function moveUp(){if(0= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",functionType="function",escapeExpression=this.escapeExpression,self=this,stack1,helper;return buffer+="\n ",(helper=helpers.text)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.text,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\n\n",buffer}),textComponentApi={initText:function initText(){this.id=this.config.control},getType:function getType(){return"text"},getId:function getId(){return this.id}};return textComponentFactory}),define("taoQtiTest/runner/ui/toolbox/toolbox",["lodash","jquery","ui/component","taoQtiTest/runner/ui/toolbox/entry","taoQtiTest/runner/ui/toolbox/menu","taoQtiTest/runner/ui/toolbox/text","handlebars","lib/handlebars/helpers"],function(_,$$1,componentFactory,entryFactory,menuFactory,textFactory,Handlebars,Helpers0){"use strict";function toolboxTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}function defaultRenderer($container){var self=this,menuEntries=[];_.isArray(this.allItems)&&this.allItems.forEach(function(item){self.hasMenu(item)||item.render($container)}),this.allMenus.forEach(function(menu){var menuId=menu.getId();menuEntries=self.allItems.filter(function(item){return"entry"===item.getType()&&item.getMenuId()===menuId}),menuEntries.forEach(function(item){menu.addItem(item)}),menu.renderItems()})}function toolboxComponentFactory(specs,defaults){var $document=$$1(document),toolboxComponent;return specs=_.defaults(specs||{},toolboxComponentApi),toolboxComponent=componentFactory(specs,defaults).on("init",function(){this.initToolbox()}).on("render.defaultRenderer",defaultRenderer).on("render",function(){var self=this;$document.off(".toolboxmenu"),$document.on("click.toolboxmenu",function(){self.allMenus.forEach(function(menu){menu.is("opened")&&menu.closeMenu()})})}).on("destroy",function(){$document.off(".toolboxmenu"),this.allItems.forEach(function(item){item.destroy()})}).setTemplate(toolboxTpl),toolboxComponent}_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,$$1=$$1&&Object.prototype.hasOwnProperty.call($$1,"default")?$$1["default"]:$$1,componentFactory=componentFactory&&Object.prototype.hasOwnProperty.call(componentFactory,"default")?componentFactory["default"]:componentFactory,entryFactory=entryFactory&&Object.prototype.hasOwnProperty.call(entryFactory,"default")?entryFactory["default"]:entryFactory,menuFactory=menuFactory&&Object.prototype.hasOwnProperty.call(menuFactory,"default")?menuFactory["default"]:menuFactory,textFactory=textFactory&&Object.prototype.hasOwnProperty.call(textFactory,"default")?textFactory["default"]:textFactory,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){return this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),"
    "}),toolboxComponentApi={initToolbox:function initToolbox(){this.allItems=[],this.allMenus=[]},createMenu:function createMenu(config){var self=this,menu=menuFactory().init(config);return this.allItems.push(menu),this.allMenus.push(menu),menu.on("openmenu",function closeAllMenuExcept(openedMenu){self.allMenus.forEach(function(current){openedMenu.getId()!==current.getId()&¤t.is("opened")&¤t.closeMenu()})}),menu},createEntry:function createEntry(config){const extendedConfig=Object.assign({role:"option"},config),item=entryFactory().init(extendedConfig);return this.allItems.push(item),item},createText:function createText(config){var text=textFactory().init(config);return this.allItems.push(text),text},hasMenu:function hasMenu(item){return item&&_.isFunction(item.getMenuId)&&item.getMenuId()}};return toolboxComponentFactory}),define("taoQtiTest/runner/provider/stopwatch",["core/eventifier","core/polling","core/timer"],function(eventifier,pollingFactory,timerFactory){"use strict";function stopwatchFactory(){let options=0this.trigger("tick",stopwatch.tick()),interval:config.interval,autoStart:!1}),initialized=!0},start(){this.isInitialized()&&(stopwatch.resume(),polling.start())},stop(){this.isInitialized()&&(stopwatch.pause(),polling.stop())},destroy(){this.isInitialized()&&(initialized=!1,polling.stop(),polling=null,stopwatch.stop(),stopwatch=null)}})}eventifier=eventifier&&Object.prototype.hasOwnProperty.call(eventifier,"default")?eventifier["default"]:eventifier,pollingFactory=pollingFactory&&Object.prototype.hasOwnProperty.call(pollingFactory,"default")?pollingFactory["default"]:pollingFactory,timerFactory=timerFactory&&Object.prototype.hasOwnProperty.call(timerFactory,"default")?timerFactory["default"]:timerFactory;const defaultOptions={interval:1e3};return stopwatchFactory}),define("taoQtiTest/runner/provider/qti",["jquery","lodash","i18n","core/cachedStore","util/browser","taoTests/runner/areaBroker","taoTests/runner/proxy","taoTests/runner/probeOverseer","taoTests/runner/testStore","taoQtiTest/runner/provider/dataUpdater","taoQtiTest/runner/provider/toolStateBridge","taoQtiTest/runner/helpers/currentItem","taoQtiTest/runner/helpers/map","taoQtiTest/runner/ui/toolbox/toolbox","taoQtiItem/runner/qtiItemRunner","taoQtiTest/runner/config/assetManager","handlebars","lib/handlebars/helpers","taoQtiTest/runner/config/states","taoQtiTest/runner/provider/stopwatch"],function($$1,_,__,cachedStore,browser,areaBrokerFactory,proxyFactory,probeOverseerFactory,testStoreFactory,dataUpdater,toolStateBridgeFactory,currentItemHelper,mapHelper,toolboxFactory,qtiItemRunner,getAssetManager,Handlebars,Helpers0,states,stopwatchFactory){"use strict";function layoutTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}$$1=$$1&&Object.prototype.hasOwnProperty.call($$1,"default")?$$1["default"]:$$1,_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,cachedStore=cachedStore&&Object.prototype.hasOwnProperty.call(cachedStore,"default")?cachedStore["default"]:cachedStore,browser=browser&&Object.prototype.hasOwnProperty.call(browser,"default")?browser["default"]:browser,areaBrokerFactory=areaBrokerFactory&&Object.prototype.hasOwnProperty.call(areaBrokerFactory,"default")?areaBrokerFactory["default"]:areaBrokerFactory,proxyFactory=proxyFactory&&Object.prototype.hasOwnProperty.call(proxyFactory,"default")?proxyFactory["default"]:proxyFactory,probeOverseerFactory=probeOverseerFactory&&Object.prototype.hasOwnProperty.call(probeOverseerFactory,"default")?probeOverseerFactory["default"]:probeOverseerFactory,testStoreFactory=testStoreFactory&&Object.prototype.hasOwnProperty.call(testStoreFactory,"default")?testStoreFactory["default"]:testStoreFactory,dataUpdater=dataUpdater&&Object.prototype.hasOwnProperty.call(dataUpdater,"default")?dataUpdater["default"]:dataUpdater,toolStateBridgeFactory=toolStateBridgeFactory&&Object.prototype.hasOwnProperty.call(toolStateBridgeFactory,"default")?toolStateBridgeFactory["default"]:toolStateBridgeFactory,currentItemHelper=currentItemHelper&&Object.prototype.hasOwnProperty.call(currentItemHelper,"default")?currentItemHelper["default"]:currentItemHelper,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper,toolboxFactory=toolboxFactory&&Object.prototype.hasOwnProperty.call(toolboxFactory,"default")?toolboxFactory["default"]:toolboxFactory,qtiItemRunner=qtiItemRunner&&Object.prototype.hasOwnProperty.call(qtiItemRunner,"default")?qtiItemRunner["default"]:qtiItemRunner,getAssetManager=getAssetManager&&Object.prototype.hasOwnProperty.call(getAssetManager,"default")?getAssetManager["default"]:getAssetManager,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,states=states&&Object.prototype.hasOwnProperty.call(states,"default")?states["default"]:states,stopwatchFactory=stopwatchFactory&&Object.prototype.hasOwnProperty.call(stopwatchFactory,"default")?stopwatchFactory["default"]:stopwatchFactory,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",helperMissing=helpers.helperMissing,escapeExpression=this.escapeExpression,helper,options;return buffer+="
    \n
    \n
    \n
    \n\n
    \n\n \n\n
    \n

    \n
    \n
    \n
    \n\n
    \n
    \n \n \n
    \n
    \n\n
    \n",buffer}),qtiProvider={name:"qti",loadAreaBroker:function loadAreaBroker(){var $layout=$$1(layoutTpl());return areaBrokerFactory($layout,{content:$$1("#qti-content",$layout),toolbox:$$1(".tools-box",$layout),navigation:$$1(".navi-box-list",$layout),mainLandmark:$$1("#test-title-header",$layout),control:$$1(".top-action-bar .control-box",$layout),actionsBar:$$1(".bottom-action-bar .control-box",$layout),panel:$$1(".test-sidebar-left",$layout),header:$$1(".title-box",$layout)})},loadProxy:function loadProxy(){var config=this.getConfig(),proxyProvider=config.provider.proxy||"qtiServiceProxy",proxyConfig=_.pick(config,["testDefinition","testCompilation","serviceCallId","bootstrap","options"]);return proxyFactory(proxyProvider,proxyConfig)},loadProbeOverseer:function loadProbeOverseer(){return probeOverseerFactory(this)},loadTestStore:function loadTestStore(){var config=this.getConfig(),identifier=config.serviceCallId||`test-${Date.now()}`;return testStoreFactory(identifier)},loadPersistentStates:function loadPersistentStates(){var self=this,config=this.getConfig(),persistencePromise=cachedStore(`test-states-${config.serviceCallId}`,"states");return persistencePromise.catch(function(err){self.trigger("error",err)}),persistencePromise.then(function(storage){self.stateStorage=storage})},getPersistentState:function getPersistentState(name){if(this.stateStorage)return this.stateStorage.getItem(name)},setPersistentState:function setPersistentState(name,active){var self=this,setPromise;if(this.stateStorage)return setPromise=this.stateStorage.setItem(name,active),setPromise.catch(function(err){self.trigger("error",err)}),setPromise},install(){this.dataUpdater=dataUpdater(this.getDataHolder()),this.toolStateBridge=toolStateBridgeFactory(this.getTestStore(),_.keys(this.getPlugins())),this.getCurrentItem=function getCurrentItem(){const testContext=this.getTestContext(),testMap=this.getTestMap();if(testContext&&testMap&&testContext.itemIdentifier)return mapHelper.getItem(testMap,testContext.itemIdentifier)},this.getCurrentSection=function getCurrentSection(){const testContext=this.getTestContext(),testMap=this.getTestMap();if(testContext&&testMap&&testContext.sectionId)return mapHelper.getSection(testMap,testContext.sectionId)},this.getCurrentPart=function getCurrentPart(){const testContext=this.getTestContext(),testMap=this.getTestMap();if(testContext&&testMap&&testContext.testPartId)return mapHelper.getPart(testMap,testContext.testPartId)}},init:function init(){function getItemResults(){var results={},context=self.getTestContext();return context&&self.itemRunner&&context.itemSessionState<=states.itemSession.interacting&&(results={itemResponse:self.itemRunner.getResponses(),itemState:self.itemRunner.getState()}),results}function computeNext(action,params,loadPromise){const context=self.getTestContext(),currentItem=self.getCurrentItem(),options=self.getOptions(),skipPausedAssessmentDialog=!!options.skipPausedAssessmentDialog,{partiallyAnsweredIsAnswered}=options.review;var submitError=function submitError(err){err&&err.unrecoverable?(!skipPausedAssessmentDialog&&self.trigger("alert.error",__("An unrecoverable error occurred. Your test session will be paused.")),self.trigger("pause",{message:err.message})):200===err.code?self.trigger("alert.submitError",err.message||__("An error occurred during results submission. Please retry."),load):self.trigger("error",err)};const feedbackPromise=new Promise(resolve=>{if((currentItem.hasFeedbacks||context.hasFeedbacks)&&context.itemSessionState<=states.itemSession.interacting)params=_.omit(params,["itemState","itemResponse"]),self.getProxy().submitItem(context.itemIdentifier,self.itemRunner.getState(),self.itemRunner.getResponses(),params).then(results=>results.itemSession&&(currentItem.answered=results.itemSession.itemAnswered,!0===results.displayFeedbacks&&results.feedbacks)?void self.itemRunner.renderFeedbacks(results.feedbacks,results.itemSession,function(queue){self.trigger("modalFeedbacks",queue,resolve)}):resolve()).catch(submitError);else{if("skip"===action)currentItem.answered=!1;else{const testPart=self.getCurrentPart(),isLinear=testPart&&testPart.isLinear;currentItem.answered=isLinear||currentItemHelper.isAnswered(self,partiallyAnsweredIsAnswered)}resolve()}});feedbackPromise.then(function(){return self.toolStateBridge.getStates()}).then(function(toolStates){toolStates&&0<_.size(toolStates)&&(params.toolStates=toolStates),self.setTestMap(self.dataUpdater.updateStats()),self.on(`unloaditem.${action}`,function(){self.off(`.${action}`),self.getProxy().callItemAction(context.itemIdentifier,action,params).then(function(results){return loadPromise=loadPromise||Promise.resolve(),loadPromise.then(function(){return results})}).then(function(results){self.dataUpdater.update(results),load()}).catch(submitError)}),self.unloadItem(context.itemIdentifier)}).catch(submitError)}function load(){var context=self.getTestContext();context.state<=states.testSession.interacting?self.loadItem(context.itemIdentifier):context.state===states.testSession.closed&&self.finish()}const self=this,config=this.getConfig(),areaBroker=this.getAreaBroker();areaBroker.setComponent("toolbox",toolboxFactory()),areaBroker.getToolbox().init();const stopwatch=stopwatchFactory({});stopwatch.init(),stopwatch.spread(this,"tick");const isTimerClientMode=()=>config.options.timer&&config.options.timer.restoreTimerFromClient;return this.on("ready",function(){load()}).on("move",function(direction,scope,position){var itemResults=getItemResults();this.trigger("disablenav disabletools"),computeNext("move",_.merge(itemResults,{direction:direction,scope:scope||"item",ref:position}))}).on("skip",function(scope){this.trigger("disablenav disabletools"),computeNext("skip",{scope:scope||"item"})}).on("exit",function(reason){var context=self.getTestContext();this.disableItem(context.itemIdentifier),this.getProxy().callTestAction("exitTest",_.merge(getItemResults(),{itemDefinition:context.itemIdentifier,reason:reason})).then(function(){return self.finish()}).catch(function(err){self.trigger("error",err)})}).on("timeout",function(scope,ref,timer){const context=self.getTestContext(),noAlertTimeout=mapHelper.hasItemCategory(self.getTestMap(),context.itemIdentifier,"noAlertTimeout",!0);context.isTimeout=!0,this.setTestContext(context),timer&&timer.allowLateSubmission?(self.trigger("alert.timeout",__("Time limit reached, this part of the test has ended. However you are allowed to finish the current item.")),self.before("move.latetimeout",function(){return self.off("move.latetimeout"),computeNext("timeout",_.merge(getItemResults(),{scope:scope,ref:ref,late:!0})),Promise.reject({cancel:!0})})):(this.disableItem(context.itemIdentifier),computeNext("timeout",_.merge(getItemResults(),{scope:scope,ref:ref}),new Promise(function(resolve){noAlertTimeout?resolve():self.trigger("alert.timeout",__("The time limit has been reached for this part of the test."),()=>{self.trigger("timeoutAccepted"),resolve()})})))}).on("pause",function(data){const testContext=self.getTestContext(),options=self.getOptions(),skipPausedAssessmentDialog=!!options.skipPausedAssessmentDialog;this.setState("closedOrSuspended",!0);const params={itemDefinition:testContext.itemIdentifier,reason:{reasons:data&&data.reasons,comment:data&&(data.originalMessage||data.message)}},itemState=self.itemRunner.getState();Object.keys(itemState).length&&(params.itemState=itemState),this.getProxy().callTestAction("pause",params).then(function(){self.trigger("leave",{code:states.testSession.suspended,message:data&&data.message,skipExitMessage:skipPausedAssessmentDialog})}).catch(function(err){self.trigger("error",err)})}).on("move skip exit timeout pause",function(){stopwatch.stop()}).on("loaditem",function(){var context=this.getTestContext(),warning=!1,getItemLabel=function getItemLabel(){const item=self.getCurrentItem();return item&&item.label?item.label:context.itemIdentifier};context.isTimeout?warning=__("Time limit reached for item \"%s\".",getItemLabel()):context.itemSessionState>states.itemSession.interacting&&(0===context.remainingAttempts?warning=__("No more attempts allowed for item \"%s\".",getItemLabel()):warning=__("Item \"%s\" is completed.",getItemLabel())),warning&&(self.disableItem(context.itemIdentifier),self.trigger("warning",warning))}).on("renderitem",function(){var context=this.getTestContext();this.getItemState(context.itemIdentifier,"disabled")||this.trigger("enabletools"),this.trigger("enablenav")}).after("renderitem",function(){stopwatch.start()}).on("resumeitem",function(){this.trigger("enableitem enablenav")}).on("disableitem",function(){isTimerClientMode()&&stopwatch.stop(),this.trigger("disabletools")}).on("enableitem",function(){isTimerClientMode()&&stopwatch.start(),this.trigger("enabletools")}).on("error",function(){stopwatch.stop(),this.trigger("disabletools enablenav")}).on("finish",function(){this.flush()}).on("leave",function(){this.trigger("endsession"),this.flush()}).on("flush",function(){this.destroy(),stopwatch.destroy()}),this.getProbeOverseer()&&this.getProbeOverseer().start(),this.getTestStore().getStorageIdentifier().then(function(storeId){return self.getProxy().init({storeId:storeId}).then(function(response){return response.testData&&Object.assign(config.options,response.testData.config),self.dataUpdater.update(response),self.dataUpdater.updatePluginsConfig(self.getPlugins(),self.getPluginsConfig()),self.getTestStore().clearVolatileIfStoreChange(response.lastStoreId).then(function(){return response})}).then(function(response){var isNewStore=!response.lastStoreId||response.lastStoreId!==storeId;if(response.toolStates&&isNewStore)return self.toolStateBridge.setTools(_.keys(response.toolStates)).restoreStates(response.toolStates)})})},render:function render(){var config=this.getConfig(),areaBroker=this.getAreaBroker();config.renderTo.append(areaBroker.getContainer()),areaBroker.getToolbox().render(areaBroker.getToolboxArea())},loadItem:function loadItem(itemIdentifier){return this.getProxy().getItem(itemIdentifier).then(_ref=>{let{itemData,baseUrl,itemState,portableElements,flags}=_ref;return{content:itemData,baseUrl,state:itemState,portableElements,flags}})},renderItem:function renderItem(itemIdentifier,itemData){var self=this,config=this.getConfig(),assetManager=getAssetManager(config.serviceCallId),changeState=function changeState(){self.setItemState(itemIdentifier,"changed",!0)};return new Promise(function(resolve,reject){assetManager.setData("baseUrl",itemData.baseUrl),assetManager.setData("itemIdentifier",itemIdentifier),assetManager.setData("assets",itemData.content.assets),itemData.content=itemData.content||{},self.itemRunner=qtiItemRunner(itemData.content.type,itemData.content.data,{assetManager:assetManager}).on("error",function(err){err&&err.unrecoverable?self.trigger("pause",{message:err.message}):(self.trigger("enablenav"),reject(err))}).on("init",function(){var itemContainer=self.getAreaBroker().getContentArea(),itemRenderingOptions=_.pick(itemData,["state","portableElements"]);this.render(itemContainer,itemRenderingOptions)}).on("render",function(){this.on("responsechange",changeState),this.on("statechange",changeState),resolve()}).after("render",function(){if(browser.isIOs()){const wrapperElt=self.getAreaBroker().getContainer().find(".content-wrapper").get(0);wrapperElt&&(wrapperElt.style.overflow="hidden",setTimeout(()=>wrapperElt.style.overflow="auto",0))}}).on("warning",function(err){self.trigger("warning",err)}).init()})},unloadItem:function unloadItem(){var self=this;return self.trigger("beforeunloaditem disablenav disabletools"),new Promise(function(resolve){return self.itemRunner?void self.itemRunner.on("clear",resolve).clear():void resolve()})},finish:function finish(){if(!this.getState("finish")&&(this.trigger("disablenav disabletools"),this.stateStorage))return this.stateStorage.removeStore()},flush:function flush(){var self=this,probeOverseer=this.getProbeOverseer(),proxy=this.getProxy(),flushPromise;return flushPromise=probeOverseer&&!this.getState("disconnected")?probeOverseer.flush().then(function(data){var traceData={};if(data&&data.length)return _.forEach(data,function(entry){var id=`${entry.type}-${entry.id}`;entry.marker&&(id=`${entry.marker}-${id}`),traceData[id]=entry}),self.getProxy().sendVariables(traceData)}).then(function(){probeOverseer.stop()}).catch(function(){probeOverseer.stop()}):Promise.resolve(),flushPromise.then(function(){proxy.hasCommunicator()&&proxy.getCommunicator().then(function(communicator){return communicator.close()}).catch(_.noop)})},destroy:function destroy(){var areaBroker=this.getAreaBroker();if(this.itemRunner&&this.itemRunner.clear(),this.itemRunner=null,areaBroker&&areaBroker.getToolbox().destroy(),this.getState("finish"))return this.getTestStore().remove()}};return qtiProvider}),define("taoQtiTest/runner/proxy/cache/actionStore",["lodash","taoTests/runner/testStore"],function(_,testStore){"use strict";function actionStoreFatory(id){var actionQueue=[],loadStore=function loadStore(){return testStore(id).getStore("actions")};if(_.isEmpty(id))throw new TypeError("Please specify the action store id");return{push:function push(action,params,timestamp){return actionQueue.push({action:action,timestamp:timestamp||Date.now(),parameters:params}),loadStore().then(function(actionStore){return actionStore.setItem("queue",actionQueue)})},flush:function flush(){return loadStore().then(function(actionStore){return actionStore.getItem("queue").then(function(queue){return actionQueue=[],actionStore.setItem("queue",actionQueue).then(function(){return queue})})})},update:function update(params){return _.forEach(actionQueue,function(action){action.parameters.actionId===params.actionId&&(action.parameters=params)}),loadStore().then(function(actionStore){return actionStore.setItem("queue",actionQueue)})}}}_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,testStore=testStore&&Object.prototype.hasOwnProperty.call(testStore,"default")?testStore["default"]:testStore;var storeName="actions",storeKey="queue";return actionStoreFatory}),define("taoQtiTest/runner/proxy/cache/preloaders/assets/audio",["lodash"],function(_){"use strict";_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_;var audio={name:"audio",init(assetManager){const audioBlobs={};return assetManager.prependStrategy({name:"precaching-audio",handle(url,data){const sourceUrl=url.toString();if(data.itemIdentifier&&audioBlobs[data.itemIdentifier]&&"undefined"!=typeof audioBlobs[data.itemIdentifier][sourceUrl])return URL.createObjectURL(audioBlobs[data.itemIdentifier][sourceUrl])}}),{loaded(url,sourceUrl,itemIdentifier){return!!(audioBlobs[itemIdentifier]&&audioBlobs[itemIdentifier][sourceUrl])},load(url,sourceUrl,itemIdentifier){return new Promise(resolve=>{if(audioBlobs[itemIdentifier]=audioBlobs[itemIdentifier]||{},"undefined"==typeof audioBlobs[itemIdentifier][sourceUrl]){const request=new XMLHttpRequest;request.open("GET",url,!0),request.responseType="blob",request.onerror=resolve,request.onabort=resolve,request.onload=()=>{200===request.status&&(audioBlobs[itemIdentifier][sourceUrl]=request.response),resolve()},request.send()}else resolve()})},unload(url,sourceUrl,itemIdentifier){return audioBlobs[itemIdentifier]&&(audioBlobs[itemIdentifier]=_.omit(audioBlobs[itemIdentifier],sourceUrl)),Promise.resolve()}}}};return audio}),define("taoQtiTest/runner/proxy/cache/preloaders/assets/image",["lodash"],function(_){"use strict";_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_;var image={name:"img",init(){const images={};return{loaded(url,sourceUrl,itemIdentifier){return!!(images[itemIdentifier]&&images[itemIdentifier][sourceUrl])},load(url,sourceUrl,itemIdentifier){return images[itemIdentifier]=images[itemIdentifier]||{},"Image"in window&&!images[itemIdentifier][sourceUrl]&&(images[itemIdentifier][sourceUrl]=new Image,images[itemIdentifier][sourceUrl].src=url),Promise.resolve()},unload(url,sourceUrl,itemIdentifier){return images[itemIdentifier]&&(images[itemIdentifier]=_.omit(images[itemIdentifier],sourceUrl)),Promise.resolve()}}}};return image}),define("taoQtiTest/runner/proxy/cache/preloaders/assets/stylesheet",["lodash"],function(_){"use strict";_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_;const relSupport=feature=>{const fakeLink=document.createElement("link");try{if(fakeLink.relList&&"function"==typeof fakeLink.relList.supports)return fakeLink.relList.supports(feature)}catch(err){return!1}},supportPreload=relSupport("preload"),supportPrefetch=relSupport("prefetch");var stylesheet={name:"css",init(){const stylesheets={};return{loaded(url,sourceUrl,itemIdentifier){return!!(stylesheets[itemIdentifier]&&stylesheets[itemIdentifier][sourceUrl])},load(url,sourceUrl,itemIdentifier){if(stylesheets[itemIdentifier]=stylesheets[itemIdentifier]||{},!stylesheets[itemIdentifier][sourceUrl]){const link=document.createElement("link");supportPreload?(link.setAttribute("rel","preload"),link.setAttribute("as","style")):supportPrefetch?(link.setAttribute("rel","prefetch"),link.setAttribute("as","style")):(link.disabled=!0,link.setAttribute("rel","stylesheet"),link.setAttribute("type","text/css")),link.setAttribute("data-preload",!0),link.setAttribute("href",url),document.querySelector("head").appendChild(link),stylesheets[itemIdentifier][sourceUrl]=link}return Promise.resolve()},unload(url,sourceUrl,itemIdentifier){if(stylesheets[itemIdentifier]){const link=stylesheets[itemIdentifier][sourceUrl]||document.querySelector(`head link[data-preload][href="${url}"]`);link&&document.querySelector("head").removeChild(link),stylesheets[itemIdentifier]=_.omit(stylesheets[itemIdentifier],sourceUrl)}return Promise.resolve()}}}};return stylesheet}),define("taoQtiTest/runner/proxy/cache/preloaders/assets/preloaders",["taoQtiTest/runner/proxy/cache/preloaders/assets/audio","taoQtiTest/runner/proxy/cache/preloaders/assets/image","taoQtiTest/runner/proxy/cache/preloaders/assets/stylesheet"],function(audioPreloader,imagePreloader,stylesheetPreloader){"use strict";audioPreloader=audioPreloader&&Object.prototype.hasOwnProperty.call(audioPreloader,"default")?audioPreloader["default"]:audioPreloader,imagePreloader=imagePreloader&&Object.prototype.hasOwnProperty.call(imagePreloader,"default")?imagePreloader["default"]:imagePreloader,stylesheetPreloader=stylesheetPreloader&&Object.prototype.hasOwnProperty.call(stylesheetPreloader,"default")?stylesheetPreloader["default"]:stylesheetPreloader;var preloaders=[audioPreloader,imagePreloader,stylesheetPreloader];return preloaders}),define("taoQtiTest/runner/proxy/cache/preloaderManager",["core/providerRegistry"],function(providerRegistry){"use strict";function preloaderManagerFactory(){function preloaderFactory(assetManager){const preloaders={};return preloaderFactory.getAvailableProviders().forEach(name=>{preloaders[name]=preloaderFactory.getProvider(name).init(assetManager)}),{has(name){return!!preloaders[name]},loaded(name){const preloader=preloaders[name];if(preloader&&"function"==typeof preloader.loaded){for(var _len=arguments.length,args=Array(1<_len?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return!!preloader.loaded(...args)}return!1},load(name){const preloader=preloaders[name];if(preloader&&"function"==typeof preloader.load){for(var _len2=arguments.length,args=Array(1<_len2?_len2-1:0),_key2=1;_key2<_len2;_key2++)args[_key2-1]=arguments[_key2];return Promise.resolve(preloader.load(...args))}return Promise.resolve()},unload(name){const preloader=preloaders[name];if(preloader&&"function"==typeof preloader.unload){for(var _len3=arguments.length,args=Array(1<_len3?_len3-1:0),_key3=1;_key3<_len3;_key3++)args[_key3-1]=arguments[_key3];return Promise.resolve(preloader.unload(...args))}return Promise.resolve()}}}return providerRegistry(preloaderFactory)}return providerRegistry=providerRegistry&&Object.prototype.hasOwnProperty.call(providerRegistry,"default")?providerRegistry["default"]:providerRegistry,preloaderManagerFactory}),define("taoQtiTest/runner/proxy/cache/assetPreloader",["taoQtiTest/runner/proxy/cache/preloaders/assets/preloaders","taoQtiTest/runner/proxy/cache/preloaderManager"],function(preloaders,preloaderManagerFactory){"use strict";preloaders=preloaders&&Object.prototype.hasOwnProperty.call(preloaders,"default")?preloaders["default"]:preloaders,preloaderManagerFactory=preloaderManagerFactory&&Object.prototype.hasOwnProperty.call(preloaderManagerFactory,"default")?preloaderManagerFactory["default"]:preloaderManagerFactory;const assetPreloaderFactory=preloaderManagerFactory();return preloaders.forEach(preloader=>assetPreloaderFactory.registerProvider(preloader.name,preloader)),assetPreloaderFactory}),define("taoQtiTest/runner/proxy/cache/preloaders/interactions/extendedText",["ckeditor","taoQtiItem/qtiCommonRenderer/helpers/ckConfigurator"],function(ckEditor,ckConfigurator){"use strict";function preloadCKEditor(language){return new Promise(resolve=>{const placeholder=document.createElement("div"),ckOptions={resize_enabled:!0,secure:"https:"===location.protocol,forceCustomDomain:!0,language},editor=ckEditor.inline(placeholder,ckOptions);editor.on("instanceReady",()=>{resolve(editor)}),editor.on("configLoaded",()=>{editor.config=ckConfigurator.getConfig(editor,"extendedText",ckOptions)}),("ready"===editor.status||"loaded"===editor.status)&&resolve(editor)}).then(editor=>{editor.destroy()})}ckEditor=ckEditor&&Object.prototype.hasOwnProperty.call(ckEditor,"default")?ckEditor["default"]:ckEditor,ckConfigurator=ckConfigurator&&Object.prototype.hasOwnProperty.call(ckConfigurator,"default")?ckConfigurator["default"]:ckConfigurator;const defaultLang="en",getItemLanguage=itemData=>{let lang=itemData&&itemData.data&&itemData.data.attributes&&itemData.data.attributes["xml:lang"];return lang||(lang=window.document.documentElement.getAttribute("lang")),lang&&lang.split("-")[0]||defaultLang};var extendedText={name:"extendedTextInteraction",init(){const preloadedLanguages={};return{loaded(interaction,itemData,itemIdentifier){if(interaction.attributes&&"xhtml"===interaction.attributes.format){const lang=getItemLanguage(itemData);return preloadedLanguages[lang]}return!0},load(interaction,itemData,itemIdentifier){if(interaction.attributes&&"xhtml"===interaction.attributes.format){const lang=getItemLanguage(itemData);if(!preloadedLanguages[lang])return preloadedLanguages[lang]=!0,preloadCKEditor(lang)}return Promise.resolve()},unload(interaction,itemData,itemIdentifier){return Promise.resolve()}}}};return extendedText}),define("taoQtiTest/runner/proxy/cache/preloaders/interactions/preloaders",["taoQtiTest/runner/proxy/cache/preloaders/interactions/extendedText"],function(extendedTextPreloader){"use strict";extendedTextPreloader=extendedTextPreloader&&Object.prototype.hasOwnProperty.call(extendedTextPreloader,"default")?extendedTextPreloader["default"]:extendedTextPreloader;var preloaders=[extendedTextPreloader];return preloaders}),define("taoQtiTest/runner/proxy/cache/interactionPreloader",["taoQtiTest/runner/proxy/cache/preloaders/interactions/preloaders","taoQtiTest/runner/proxy/cache/preloaderManager"],function(preloaders,preloaderManagerFactory){"use strict";preloaders=preloaders&&Object.prototype.hasOwnProperty.call(preloaders,"default")?preloaders["default"]:preloaders,preloaderManagerFactory=preloaderManagerFactory&&Object.prototype.hasOwnProperty.call(preloaderManagerFactory,"default")?preloaderManagerFactory["default"]:preloaderManagerFactory;const interactionPreloaderFactory=preloaderManagerFactory();return preloaders.forEach(preloader=>interactionPreloaderFactory.registerProvider(preloader.name,preloader)),interactionPreloaderFactory}),define("taoQtiTest/runner/proxy/cache/itemPreloader",["lodash","core/logger","taoQtiItem/runner/qtiItemRunner","taoQtiTest/runner/config/assetManager","taoQtiTest/runner/proxy/cache/assetPreloader","taoQtiTest/runner/proxy/cache/interactionPreloader","util/url"],function(_,loggerFactory,qtiItemRunner,getAssetManager,assetPreloaderFactory,interactionPreloaderFactory,urlUtil){"use strict";function itemPreloaderFactory(options){const preloadAssetManager=getAssetManager("item-preloader"),resolveAssets=item=>new Promise(resolve=>{const{assets}=item.itemData;return preloadAssetManager.setData("baseUrl",item.baseUrl),preloadAssetManager.setData("assets",assets),resolve(_.reduce(assets,(acc,assetList,type)=>{const resolved={};return _.forEach(assetList,url=>{urlUtil.isBase64(url)||(resolved[url]=preloadAssetManager.resolve(url))}),0<_.size(resolved)&&(acc[type]=resolved),acc},{}))});if(!options||!options.testId)throw new TypeError("The test identifier is mandatory to start the item preloader");const testAssetManager=getAssetManager(options.testId),assetPreloader=assetPreloaderFactory(testAssetManager),interactionPreloader=interactionPreloaderFactory(),itemLoad=item=>(logger.debug(`Start preloading of item ${item.itemIdentifier}`),new Promise((resolve,reject)=>{qtiItemRunner(item.itemData.type,item.itemData.data,{assetManager:preloadAssetManager,preload:!0}).on("init",()=>{logger.debug(`Preloading of item ${item.itemIdentifier} done`),resolve(!0)}).on("error",reject).init()})),interactionLoad=item=>Promise.all(getItemInteractions(item.itemData).map(interaction=>interactionPreloader.has(interaction.qtiClass)?(logger.debug(`Loading interaction ${interaction.serial}(${interaction.qtiClass}) for item ${item.itemIdentifier}`),interactionPreloader.load(interaction.qtiClass,interaction,item.itemData,item.itemIdentifier)):Promise.resolve())),interactionUnload=item=>Promise.all(getItemInteractions(item.itemData).map(interaction=>interactionPreloader.has(interaction.qtiClass)?(logger.debug(`Unloading interaction ${interaction.serial}(${interaction.qtiClass}) for item ${item.itemIdentifier}`),interactionPreloader.unload(interaction.qtiClass,interaction,item.itemData,item.itemIdentifier)):Promise.resolve())),assetLoad=item=>resolveAssets(item).then(resolved=>(_.forEach(resolved,(assets,type)=>{assetPreloader.has(type)?_.forEach(assets,(url,sourceUrl)=>{logger.debug(`Loading asset ${sourceUrl}(${type}) for item ${item.itemIdentifier}`),assetPreloader.load(type,url,sourceUrl,item.itemIdentifier)}):setItemFlag(item,"containsNonPreloadedAssets")}),!0)),assetUnload=item=>resolveAssets(item).then(resolved=>(_.forEach(resolved,(assets,type)=>{assetPreloader.has(type)&&_.forEach(assets,(url,sourceUrl)=>{logger.debug(`Unloading asset ${sourceUrl}(${type}) for item ${item.itemIdentifier}`),assetPreloader.unload(type,url,sourceUrl,item.itemIdentifier)})}),!0));return{preload(item){const loading=[];return isItemObjectValid(item)&&(loading.push(itemLoad(item)),loading.push(interactionLoad(item)),_.size(item.itemData.data&&item.itemData.data.feedbacks)&&setItemFlag(item,"hasFeedbacks"),_.size(item.portableElements&&item.portableElements.pci)&&setItemFlag(item,"hasPci"),0<_.size(item.itemData.assets)&&loading.push(assetLoad(item))),Promise.all(loading).then(results=>00_.isPlainObject(item)&&_.isString(item.baseUrl)&&_.isString(item.itemIdentifier)&&!_.isEmpty(item.itemIdentifier)&&_.isPlainObject(item.itemData),setItemFlag=(item,flag)=>{item.flags=item.flags||{},item.flags[flag]=!0},getItemInteractions=itemData=>{const interactions=[];return itemData.data&&itemData.data.body&&itemData.data.body.elements&&_.forEach(itemData.data.body.elements,elements=>interactions.push(elements)),interactions};return itemPreloaderFactory}),define("taoQtiTest/runner/proxy/cache/itemStore",["lodash","core/store","taoQtiTest/runner/proxy/cache/itemPreloader"],function(_,store,itemPreloaderFactory){"use strict";function itemStoreFactory(options){const config=_.defaults(options||{},defaultConfig),getStore=()=>store("item-cache",store.backends.memory),index=new Map;let lastIndexedPosition=0;const isExpired=key=>{const meta=index.get(key);return!!meta&&config.itemTTL&&Date.now()-meta.timestamp>=config.itemTTL},findFirstIndexedItem=()=>{var _NumberPOSITIVE_INFINITY=Number.POSITIVE_INFINITY;let first=null,lowest=_NumberPOSITIVE_INFINITY;return index.forEach((item,key)=>{item.position{const expired=[];return index.forEach((item,key)=>{isExpired(key)&&expired.push(key)}),expired};let itemPreloader;return config.preload&&(itemPreloader=itemPreloaderFactory(_.pick(config,["testId"]))),{setCacheSize(cacheSize){config.maxSize=cacheSize},setItemTTL(ttl){config.itemTTL=ttl},get(key){return this.has(key)?getStore().then(itemStorage=>itemStorage.getItem(key)):Promise.resolve()},has(key){return index.has(key)&&!isExpired(key)},set(key,item){return getStore().then(itemStorage=>itemStorage.setItem(key,item).then(updated=>(updated&&(!index.has(key)&&index.set(key,{position:lastIndexedPosition++,timestamp:Date.now()}),config.preload&&_.defer(()=>itemPreloader.preload(item))),1config.maxSize?this.remove(findFirstIndexedItem()).then(removed=>updated&&removed):updated)))},update(key,updateKey,updateValue){return index.has(key)&&_.isString(updateKey)?getStore().then(itemStorage=>itemStorage.getItem(key).then(itemData=>{if(_.isPlainObject(itemData))return itemData[updateKey]=updateValue,itemStorage.setItem(key,itemData)})):Promise.resolve(!1)},remove(key){return index.has(key)?getStore().then(itemStorage=>(index.delete(key),itemStorage.getItem(key).then(item=>{config.preload&&_.defer(()=>itemPreloader.unload(item))}).then(()=>itemStorage.removeItem(key)))):Promise.resolve(!1)},prune(){return Promise.all(findExpiredItems().map(this.remove))},clear(){return getStore().then(itemStorage=>(index.clear(),itemStorage.clear()))}}}_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,store=store&&Object.prototype.hasOwnProperty.call(store,"default")?store["default"]:store,itemPreloaderFactory=itemPreloaderFactory&&Object.prototype.hasOwnProperty.call(itemPreloaderFactory,"default")?itemPreloaderFactory["default"]:itemPreloaderFactory;const defaultConfig={itemTTL:0,maxSize:10,preload:!1};return itemStoreFactory}),define("taoQtiTest/runner/proxy/qtiServiceProxy",["lodash","core/promiseQueue","core/communicator","taoQtiTest/runner/config/qtiServiceConfig","core/request"],function(_,promiseQueue,communicatorFactory,configFactory,coreRequest){"use strict";_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,promiseQueue=promiseQueue&&Object.prototype.hasOwnProperty.call(promiseQueue,"default")?promiseQueue["default"]:promiseQueue,communicatorFactory=communicatorFactory&&Object.prototype.hasOwnProperty.call(communicatorFactory,"default")?communicatorFactory["default"]:communicatorFactory,configFactory=configFactory&&Object.prototype.hasOwnProperty.call(configFactory,"default")?configFactory["default"]:configFactory,coreRequest=coreRequest&&Object.prototype.hasOwnProperty.call(coreRequest,"default")?coreRequest["default"]:coreRequest;var qtiServiceProxy={name:"qtiServiceProxy",install:function install(){var self=this;this.queue=promiseQueue(),this.prepareParams=function prepareParams(actionParams){var stringifyParams=["itemState","itemResponse","toolStates"];return _.isPlainObject(actionParams)?_.mapValues(actionParams,function(value,key){return _.contains(stringifyParams,key)?JSON.stringify(value):value}):actionParams},this.request=function request(url,reqParams,contentType,noToken){return coreRequest({url:url,data:self.prepareParams(reqParams),method:reqParams?"POST":"GET",contentType:contentType,noToken:noToken,background:!1,sequential:!0,timeout:self.configStorage.getTimeout()}).then(function(response){return self.setOnline(),response&&response.success?Promise.resolve(response):Promise.reject(response)}).catch(function(error){return self.isConnectivityError(error)&&self.setOffline("request"),Promise.reject(error)})}},init:function init(config,params){return this.configStorage=configFactory(config||{}),this.request(this.configStorage.getTestActionUrl("init"),params)},destroy:function destroy(){return this.configStorage=null,this.queue=null,Promise.resolve()},getTestData:function getTestData(){return this.request(this.configStorage.getTestActionUrl("getTestData"))},getTestContext:function getTestContext(){return this.request(this.configStorage.getTestActionUrl("getTestContext"))},getTestMap:function getTestMap(){return this.request(this.configStorage.getTestActionUrl("getTestMap"))},sendVariables:function sendVariables(variables){return this.request(this.configStorage.getTestActionUrl("storeTraceData"),{traceData:JSON.stringify(variables)})},callTestAction:function callTestAction(action,params){return this.request(this.configStorage.getTestActionUrl(action),params)},getItem:function getItem(itemIdentifier,params){return this.request(this.configStorage.getItemActionUrl(itemIdentifier,"getItem"),params,void 0,!0)},submitItem:function submitItem(itemIdentifier,state,response,params){var body=_.merge({itemState:state,itemResponse:response},params||{});return this.request(this.configStorage.getItemActionUrl(itemIdentifier,"submitItem"),body)},callItemAction:function callItemAction(itemIdentifier,action,params){return this.request(this.configStorage.getItemActionUrl(itemIdentifier,action),params)},telemetry:function telemetry(itemIdentifier,signal,params){return this.request(this.configStorage.getTelemetryUrl(itemIdentifier,signal),params,null,!0)},loadCommunicator:function loadCommunicator(){var config=this.configStorage.getCommunicationConfig();return config.enabled?communicatorFactory(config.type,config.params):null}};return qtiServiceProxy}),define("taoQtiTest/runner/proxy/cache/proxy",["lodash","taoQtiTest/runner/navigator/navigator","taoQtiTest/runner/helpers/map","taoQtiTest/runner/helpers/navigation","taoQtiTest/runner/provider/dataUpdater","taoQtiTest/runner/proxy/qtiServiceProxy","taoQtiTest/runner/proxy/cache/itemStore","taoQtiTest/runner/proxy/cache/actionStore","taoQtiTest/runner/helpers/offlineErrorHelper"],function(_,testNavigatorFactory,mapHelper,navigationHelper,dataUpdater,qtiServiceProxy,itemStoreFactory,actionStoreFactory,offlineErrorHelper){"use strict";_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,testNavigatorFactory=testNavigatorFactory&&Object.prototype.hasOwnProperty.call(testNavigatorFactory,"default")?testNavigatorFactory["default"]:testNavigatorFactory,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper,navigationHelper=navigationHelper&&Object.prototype.hasOwnProperty.call(navigationHelper,"default")?navigationHelper["default"]:navigationHelper,dataUpdater=dataUpdater&&Object.prototype.hasOwnProperty.call(dataUpdater,"default")?dataUpdater["default"]:dataUpdater,qtiServiceProxy=qtiServiceProxy&&Object.prototype.hasOwnProperty.call(qtiServiceProxy,"default")?qtiServiceProxy["default"]:qtiServiceProxy,itemStoreFactory=itemStoreFactory&&Object.prototype.hasOwnProperty.call(itemStoreFactory,"default")?itemStoreFactory["default"]:itemStoreFactory,actionStoreFactory=actionStoreFactory&&Object.prototype.hasOwnProperty.call(actionStoreFactory,"default")?actionStoreFactory["default"]:actionStoreFactory,offlineErrorHelper=offlineErrorHelper&&Object.prototype.hasOwnProperty.call(offlineErrorHelper,"default")?offlineErrorHelper["default"]:offlineErrorHelper;const cacheSize=20,loadNextDelay=450,defaultItemTTL=900;var proxy=_.defaults({name:"precaching",install(config){qtiServiceProxy.install.call(this);const getItemCachingOption=(name,defaultValue)=>config&&config.options&&config.options.itemCaching?parseInt(config.options.itemCaching[name],10)||defaultValue:defaultValue;this.itemStore=itemStoreFactory({itemTTL:1e3*defaultItemTTL,maxSize:cacheSize,preload:!0,testId:config.serviceCallId}),this.actiontStore=null,this.getItemFromStore=!1,this.requestConfig={},this.actionPromises={},this.actionRejectPromises={},this.dataUpdater=dataUpdater(this.getDataHolder()),this.getCacheAmount=()=>getItemCachingOption("amount",1),this.getItemTTL=()=>1e3*getItemCachingOption("itemStoreTTL",defaultItemTTL),this.hasItem=itemIdentifier=>itemIdentifier&&this.itemStore.has(itemIdentifier),this.hasNextItem=itemIdentifier=>{const sibling=navigationHelper.getNextItem(this.getDataHolder().get("testMap"),itemIdentifier);return sibling&&this.hasItem(sibling.id)},this.hasPreviousItem=itemIdentifier=>{const sibling=navigationHelper.getPreviousItem(this.getDataHolder().get("testMap"),itemIdentifier);return sibling&&this.hasItem(sibling.id)},this.offlineAction=(action,actionParams)=>{const result={success:!0},blockingActions=["exitTest","timeout"],testContext=this.getDataHolder().get("testContext"),testMap=this.getDataHolder().get("testMap");if("pause"===action)throw offlineErrorHelper.buildErrorFromContext(offlineErrorHelper.getOfflinePauseError(),{reason:actionParams.reason});if(_.contains(blockingActions,action)||"next"===actionParams.direction&&navigationHelper.isLast(testMap,testContext.itemIdentifier))throw offlineErrorHelper.buildErrorFromContext(offlineErrorHelper.getOfflineExitError());if(actionParams.direction&&actionParams.scope){const testNavigator=testNavigatorFactory(testContext,testMap),newTestContext=testNavigator.navigate(actionParams.direction,actionParams.scope,actionParams.ref);if(!newTestContext||!newTestContext.itemIdentifier||!this.hasItem(newTestContext.itemIdentifier))throw offlineErrorHelper.buildErrorFromContext(offlineErrorHelper.getOfflineNavError());result.testContext=newTestContext}return this.markActionAsOffline(actionParams),result},this.processSyncAction=(action,actionParams,deferred)=>new Promise((resolve,reject)=>{this.scheduleAction(action,actionParams).then(actionData=>{this.actionPromises[actionData.params.actionId]=resolve,this.actionRejectPromises[actionData.params.actionId]=reject,deferred||this.syncData().then(result=>{this.isOnline()&&_.forEach(result,actionResult=>{const actionId=actionResult.requestParameters&&actionResult.requestParameters.actionId?actionResult.requestParameters.actionId:null;if(!actionResult.success&&this.actionRejectPromises[actionId]){const error=new Error(actionResult.message);return error.unrecoverable=!0,reject(error)}actionId&&this.actionPromises[actionId]&&this.actionPromises[actionId](actionResult)})}).catch(reject)}).catch(reject)}),this.scheduleAction=(action,params)=>(params.actionId=`${action}_${new Date().getTime()}`,this.actiontStore.push(action,this.prepareParams(_.defaults(params||{},this.requestConfig))).then(()=>({action,params}))),this.requestNetworkThenOffline=(url,action,actionParams,deferred,noToken)=>{const testContext=this.getDataHolder().get("testContext"),communicationConfig=this.configStorage.getCommunicationConfig(),runRequestThenOffline=()=>{let request;return communicationConfig.syncActions&&0<=communicationConfig.syncActions.indexOf(action)?request=this.processSyncAction(action,actionParams,deferred):(request=this.request(url,actionParams,void 0,noToken||!1),request.then(result=>this.isOffline()?this.scheduleAction(action,actionParams):result)),request.then(result=>this.isOffline()?this.offlineAction(action,actionParams):result).catch(error=>{if(this.isConnectivityError(error)&&this.isOffline())return this.offlineAction(action,actionParams);throw error})};return this.isOffline()?this.telemetry(testContext.itemIdentifier,"up").then(()=>this.isOnline()?runRequestThenOffline():this.scheduleAction(action,actionParams).then(()=>this.offlineAction(action,actionParams))).catch(err=>{if(this.isConnectivityError(err))return this.scheduleAction(action,actionParams).then(()=>this.offlineAction(action,actionParams));throw err}):runRequestThenOffline()},this.syncData=()=>{let actions;return this.queue.serie(()=>this.actiontStore.flush().then(data=>{if(actions=data,data&&data.length)return this.send("sync",data)}).catch(err=>{throw this.isConnectivityError(err)&&(this.setOffline("communicator"),_.forEach(actions,action=>{this.actiontStore.push(action.action,action.parameters)})),err}))},this.exportActions=()=>this.queue.serie(()=>this.actiontStore.flush().then(data=>(_.forEach(data,action=>{this.actiontStore.push(action.action,action.parameters)}),data))),this.markActionAsOffline=actionParams=>(actionParams.offline=!0,this.queue.serie(()=>this.actiontStore.update(this.prepareParams(_.defaults(actionParams||{},this.requestConfig)))))},init(config,params){if(!this.getDataHolder())throw new Error("Unable to retrieve test runners data holder");return this.requestConfig=_.pick(config,["testDefinition","testCompilation","serviceCallId"]),this.actiontStore=actionStoreFactory(config.serviceCallId),this.on("reconnect",function(){return this.syncData().then(responses=>{this.dataUpdater.update(responses)}).catch(err=>{this.trigger("error",err)})}),this.syncData(),qtiServiceProxy.init.call(this,config,params)},destroy(){return this.itemStore.clear(),this.getItemFromStore=!1,qtiServiceProxy.destroy.call(this)},getItem(itemIdentifier,params){const pruneStore=()=>this.itemStore.prune().catch(_.noop),loadNextItem=()=>{const testMap=this.getDataHolder().get("testMap"),siblings=navigationHelper.getSiblingItems(testMap,itemIdentifier,"both",this.getCacheAmount()),missing=_.reduce(siblings,(list,sibling)=>(this.hasItem(sibling.id)||list.push(sibling.id),list),[]);this.isOnline()&&missing.length&&_.delay(()=>{this.requestNetworkThenOffline(this.configStorage.getTestActionUrl("getNextItemData"),"getNextItemData",{itemDefinition:missing},!1,!0).then(response=>{if(response&&response.items)return pruneStore().then(()=>{_.forEach(response.items,item=>{item&&item.itemIdentifier&&this.itemStore.set(item.itemIdentifier,item)})})}).catch(_.noop)},loadNextDelay)};return this.itemStore.setItemTTL(this.getItemTTL()),this.getItemFromStore&&this.itemStore.has(itemIdentifier)?(loadNextItem(),this.itemStore.get(itemIdentifier)):this.request(this.configStorage.getItemActionUrl(itemIdentifier,"getItem"),params,void 0,!0).then(response=>(response&&response.success&&pruneStore().then(()=>this.itemStore.set(itemIdentifier,response)),loadNextItem(),response))},submitItem(itemIdentifier,state,response,params){return this.itemStore.update(itemIdentifier,"itemState",state).then(()=>qtiServiceProxy.submitItem.call(this,itemIdentifier,state,response,params))},sendVariables(variables,deferred){const action="storeTraceData",actionParams={traceData:JSON.stringify(variables)};return this.requestNetworkThenOffline(this.configStorage.getTestActionUrl("storeTraceData"),"storeTraceData",actionParams,deferred)},callTestAction(action,params,deferred){return this.requestNetworkThenOffline(this.configStorage.getTestActionUrl(action),action,params,deferred)},callItemAction(itemIdentifier,action,params,deferred){let updateStatePromise=Promise.resolve();const testMap=this.getDataHolder().get("testMap");return params.itemState&&(updateStatePromise=this.itemStore.update(itemIdentifier,"itemState",params.itemState)),this.getItemFromStore=navigationHelper.isMovingToNextItem(action,params)&&this.hasNextItem(itemIdentifier)||navigationHelper.isMovingToPreviousItem(action,params)&&this.hasPreviousItem(itemIdentifier)||navigationHelper.isJumpingToItem(action,params)&&this.hasItem(mapHelper.getItemIdentifier(testMap,params.ref)),(navigationHelper.isMovingToNextItem(action,params)||navigationHelper.isMovingToPreviousItem(action,params)||navigationHelper.isJumpingToItem(action,params))&&(params.start=!0),updateStatePromise.then(()=>this.requestNetworkThenOffline(this.configStorage.getItemActionUrl(itemIdentifier,action),action,_.merge({itemDefinition:itemIdentifier},params),deferred))}},qtiServiceProxy);return proxy}),define("taoQtiTest/runner/proxy/loader",["lodash","module","taoTests/runner/proxy"],function(_,module,proxy){"use strict";function load(){return new Promise(function(resolve,reject){require([config.module],function(proxyProvider){proxy.registerProvider(config.providerName,proxyProvider),resolve(config.providerName)},reject)})}_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,module=module&&Object.prototype.hasOwnProperty.call(module,"default")?module["default"]:module,proxy=proxy&&Object.prototype.hasOwnProperty.call(proxy,"default")?proxy["default"]:proxy;var config=_.defaults(module.config(),{providerName:"qtiServiceProxy",module:"taoQtiTest/runner/proxy/qtiServiceProxy"});return load}),define("taoQtiTest/runner/services/responseStore",["lodash","core/store"],function(_,store){"use strict";function responseStoreFactory(options){var config=_.defaults(options||{},defaultConfig),getResponseStore=function getResponseStore(){return store(config.responseStoreName,store.backends.memory)},getCorrectResponseStore=function getCorrectResponseStore(){return store(config.correctResponseStoreName,store.backends.memory)};return{getResponses:function getResponses(){return getResponseStore().then(function(storage){return storage.getItems()})},getCorrectResponses:function getCorrectResponses(){return getCorrectResponseStore().then(function(storage){return storage.getItems()})},getResponse:function getResponse(key){return getResponseStore().then(function(storage){return storage.getItem(key)})},getCorrectResponse:function getCorrectResponse(key){return getCorrectResponseStore().then(function(storage){return storage.getItem(key).then(function(result){return new Promise(function(resolve){return"undefined"==typeof result?resolve([]):resolve(result)})})})},addResponse:function addResponse(key,value){return getResponseStore().then(function(storage){return storage.setItem(key,value).then(function(updated){return updated})})},addCorrectResponse:function addCorrectResponse(key,value){return getCorrectResponseStore().then(function(storage){return storage.setItem(key,value).then(function(updated){return updated})})},clearResponses:function clearResponses(){return getResponseStore().then(function(storage){return storage.clear()})},clearCorrectResponses:function clearCorrectResponses(){return getCorrectResponseStore().then(function(storage){return storage.clear()})}}}_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,store=store&&Object.prototype.hasOwnProperty.call(store,"default")?store["default"]:store;var defaultConfig={responseStoreName:"response",correctResponseStoreName:"correct-response"};return responseStoreFactory}),define("taoQtiTest/runner/proxy/offline/proxy",["lodash","taoQtiTest/runner/navigator/offlineNavigator","taoQtiTest/runner/helpers/navigation","taoQtiTest/runner/provider/dataUpdater","taoQtiTest/runner/proxy/qtiServiceProxy","taoQtiTest/runner/proxy/cache/itemStore","taoQtiTest/runner/proxy/cache/actionStore","taoQtiTest/runner/helpers/offlineErrorHelper","taoQtiTest/runner/helpers/offlineSyncModal","taoQtiTest/runner/services/responseStore","util/download","taoQtiTest/runner/config/states"],function(_,offlineNavigatorFactory,navigationHelper,dataUpdater,qtiServiceProxy,itemStoreFactory,actionStoreFactory,offlineErrorHelper,offlineSyncModal,responseStoreFactory,download,states){"use strict";_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,offlineNavigatorFactory=offlineNavigatorFactory&&Object.prototype.hasOwnProperty.call(offlineNavigatorFactory,"default")?offlineNavigatorFactory["default"]:offlineNavigatorFactory,navigationHelper=navigationHelper&&Object.prototype.hasOwnProperty.call(navigationHelper,"default")?navigationHelper["default"]:navigationHelper,dataUpdater=dataUpdater&&Object.prototype.hasOwnProperty.call(dataUpdater,"default")?dataUpdater["default"]:dataUpdater,qtiServiceProxy=qtiServiceProxy&&Object.prototype.hasOwnProperty.call(qtiServiceProxy,"default")?qtiServiceProxy["default"]:qtiServiceProxy,itemStoreFactory=itemStoreFactory&&Object.prototype.hasOwnProperty.call(itemStoreFactory,"default")?itemStoreFactory["default"]:itemStoreFactory,actionStoreFactory=actionStoreFactory&&Object.prototype.hasOwnProperty.call(actionStoreFactory,"default")?actionStoreFactory["default"]:actionStoreFactory,offlineErrorHelper=offlineErrorHelper&&Object.prototype.hasOwnProperty.call(offlineErrorHelper,"default")?offlineErrorHelper["default"]:offlineErrorHelper,offlineSyncModal=offlineSyncModal&&Object.prototype.hasOwnProperty.call(offlineSyncModal,"default")?offlineSyncModal["default"]:offlineSyncModal,responseStoreFactory=responseStoreFactory&&Object.prototype.hasOwnProperty.call(responseStoreFactory,"default")?responseStoreFactory["default"]:responseStoreFactory,download=download&&Object.prototype.hasOwnProperty.call(download,"default")?download["default"]:download,states=states&&Object.prototype.hasOwnProperty.call(states,"default")?states["default"]:states;var proxy=_.defaults({name:"offline",install:function install(config){var self=this;const maxSyncAttempts=3;qtiServiceProxy.install.call(this),this.itemStore=itemStoreFactory({preload:!0,testId:config.serviceCallId}),this.responseStore=responseStoreFactory(),this.offlineNavigator=offlineNavigatorFactory(this.itemStore,this.responseStore),this.actionStore=null,this.requestConfig={},this.actionPromises={},this.syncInProgress=!1,this.dataUpdater=dataUpdater(this.getDataHolder()),this.hasItem=function hasItem(itemIdentifier){return itemIdentifier&&self.itemStore.has(itemIdentifier)},this.hasNextItem=function hasNextItem(itemIdentifier){var sibling=navigationHelper.getNextItem(this.getDataHolder().get("testMap"),itemIdentifier);return sibling&&self.hasItem(sibling.id)},this.hasPreviousItem=function hasPreviousItem(itemIdentifier){var sibling=navigationHelper.getPreviousItem(this.getDataHolder().get("testMap"),itemIdentifier);return sibling&&self.hasItem(sibling.id)},this.offlineAction=function offlineAction(action,actionParams){return new Promise(function(resolve,reject){var result={success:!0},blockingActions=["exitTest","timeout","pause"],dataHolder=self.getDataHolder(),testContext=dataHolder.get("testContext"),testMap=dataHolder.get("testMap"),isLast=!!(testContext&&testMap)&&navigationHelper.isLast(testMap,testContext.itemIdentifier),isOffline=self.isOffline(),isBlocked=_.contains(blockingActions,action),isNavigationAction="next"===actionParams.direction||"skip"===action,isMeaningfullScope=!!actionParams.scope,navigate=function(navigator,options,results){var newTestContext;navigator.setTestContext(options.testContext).setTestMap(options.testMap).navigate(actionParams.direction,actionParams.scope,actionParams.ref,actionParams).then(function(res){if(newTestContext=res,!newTestContext||!newTestContext.itemIdentifier||!self.hasItem(newTestContext.itemIdentifier))throw offlineErrorHelper.buildErrorFromContext(offlineErrorHelper.getOfflineNavError());results.testContext=newTestContext,resolve(results)}).catch(function(err){reject(err)})},isDirectionDefined;if("skip"===action&&(actionParams.direction=action),isDirectionDefined=!!actionParams.direction,isBlocked||isNavigationAction&&isLast){result.testContext={state:states.testSession.closed};const offlineSync=function(){offlineSyncModal(self).on("proceed",function(){self.syncData().then(function(){if(self.isOnline())return resolve(result)}).catch(function(){return resolve({success:!1})})}).on("secondaryaction",function(){self.initiateDownload().catch(function(){return resolve({success:!1})})})};return isOffline?offlineSync():self.syncData().then(function(){return self.isOffline()?offlineSync():resolve(result)}).catch(function(){return resolve({success:!1})})}if(!(isDirectionDefined&&isMeaningfullScope))resolve(result);else if(isOffline)navigate(self.offlineNavigator,{testContext:testContext,testMap:testMap},result);else return self.syncData().then(function(){navigate(self.offlineNavigator,{testContext:testContext,testMap:testMap},result)}).catch(function(){return resolve({success:!1})})})},this.scheduleAction=function scheduleAction(action,actionParams){return actionParams=_.assign(actionParams,{actionId:`${action}_${new Date().getTime()}`,offline:!0}),self.actionStore.push(action,self.prepareParams(_.defaults(actionParams||{},self.requestConfig))).then(function(){return{action:action,params:actionParams}})},this.sendSyncData=function sendSyncData(data){let attempt=1self.send("sync",data).then(resolve).catch(err=>self.isConnectivityError(err)&&attempt(self.syncInProgress=!1,data))})},this.prepareDownload=function prepareDownload(actions){const timestamp=Date.now(),dateTime=new Date(timestamp).toISOString(),testData=self.getDataHolder().get("testData"),testMap=self.getDataHolder().get("testMap"),niceFilename=`Download of ${testMap.title} at ${dateTime}.json`,isExitTest=actions.some(elem=>"exitTest"===elem.action);return{filename:niceFilename,content:JSON.stringify({isExitTest:isExitTest,timestamp:timestamp,testData:testData,actionQueue:actions,testConfig:self.requestConfig})}},this.initiateDownload=function initiateDownload(){return this.queue.serie(function(){return self.actionStore.flush().then(function(actions){return _.forEach(actions,function(action){self.actionStore.push(action.action,action.parameters,action.timestamp)}),actions}).then(self.prepareDownload).then(function(data){return download(data.filename,data.content)})})}},init:function init(config,params){var self=this,InitCallPromise=qtiServiceProxy.init.call(this,config,params);if(!this.getDataHolder())throw new Error("Unable to retrieve test runners data holder");return this.requestConfig=_.pick(config,["testDefinition","testCompilation","serviceCallId"]),this.actionStore=actionStoreFactory(config.serviceCallId),this.before("error",(e,error)=>!(self.isConnectivityError(error)&&self.syncInProgress)),InitCallPromise.then(function(response){var promises=[];return response.items||(response.items={}),self.itemStore.setCacheSize(_.size(response.items)),_.forEach(response.items,function(item,itemIdentifier){promises.push(self.itemStore.set(itemIdentifier,item))}),Promise.all(promises).then(()=>self.offlineNavigator.setTestContext(response.testContext).setTestMap(response.testMap).init()).then(()=>response)})},destroy:function destroy(){var self=this;return this.itemStore.clear().then(function(){return qtiServiceProxy.destroy.call(self)})},getItem:function getItem(itemIdentifier){return this.itemStore.get(itemIdentifier)},submitItem:function submitItem(itemIdentifier,state,response,params){var self=this;return this.itemStore.update(itemIdentifier,"itemState",state).then(function(){return qtiServiceProxy.submitItem.call(self,itemIdentifier,state,response,params)})},sendVariables:function sendVariables(variables){var self=this,action="storeTraceData",actionParams={traceData:JSON.stringify(variables)};return self.scheduleAction("storeTraceData",actionParams).then(function(){return self.offlineAction("storeTraceData",actionParams)}).catch(function(err){return Promise.reject(err)})},callTestAction:function callTestAction(action,params){var self=this;return self.scheduleAction(action,params).then(function(){return self.offlineAction(action,params)}).catch(function(err){return Promise.reject(err)})},callItemAction:function callItemAction(itemIdentifier,action,params){var self=this,updateStatePromise=Promise.resolve();return params.itemState&&(updateStatePromise=this.itemStore.update(itemIdentifier,"itemState",params.itemState)),(navigationHelper.isMovingToNextItem(action,params)||navigationHelper.isMovingToPreviousItem(action,params)||navigationHelper.isJumpingToItem(action,params))&&(params.start=!0),updateStatePromise.then(function(){return params=_.assign({itemDefinition:itemIdentifier},params),self.scheduleAction(action,params).then(function(){return self.offlineAction(action,params)}).catch(function(err){return Promise.reject(err)})}).catch(function(err){return Promise.reject(err)})}},qtiServiceProxy);return proxy}),function(c){var d=document,a="appendChild",i="styleSheet",s=d.createElement("style");s.type="text/css",d.getElementsByTagName("head")[0].appendChild(s),s.styleSheet?s.styleSheet.cssText=c:s.appendChild(d.createTextNode(c))}(".qti-navigator-default{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;-o-flex-direction:column;flex-direction:column;padding:0;cursor:default;min-width:calc(18rem - 8px);height:100%;position:relative}.qti-navigator-default span{display:inline-block}.qti-navigator-default .collapsed .collapsible-panel{display:none !important}.qti-navigator-default .collapsed .qti-navigator-label .icon-up{display:none}.qti-navigator-default .collapsed .qti-navigator-label .icon-down{display:inline-block}.qti-navigator-default .collapsible>.qti-navigator-label,.qti-navigator-default .qti-navigator-item>.qti-navigator-label{cursor:pointer}.qti-navigator-default.scope-test-section .qti-navigator-part>.qti-navigator-label{display:none !important}.qti-navigator-default .qti-navigator-label{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;min-width:calc(100% - 12px);padding:0 6px;line-height:3rem}.qti-navigator-default .qti-navigator-label .icon-up,.qti-navigator-default .qti-navigator-label .icon-down{line-height:3rem;margin-left:auto}.qti-navigator-default .qti-navigator-label .icon-down{display:none}.qti-navigator-default .qti-navigator-label .qti-navigator-number{display:none}.qti-navigator-default .qti-navigator-icon,.qti-navigator-default .icon{position:relative;top:1px;display:inline-block;line-height:2.8rem;margin-right:.5rem}.qti-navigator-default .unseen .qti-navigator-icon{cursor:default}.qti-navigator-default.prevents-unseen:not(.skipahead-enabled) .unseen .qti-navigator-icon,.qti-navigator-default.prevents-unseen:not(.skipahead-enabled) .unseen .qti-navigator-label{cursor:not-allowed !important}.qti-navigator-default .icon-answered:before{content:\"\uE69A\"}.qti-navigator-default .icon-viewed:before{content:\"\uE631\"}.qti-navigator-default .icon-flagged:before{content:\"\uE64E\"}.qti-navigator-default .icon-unanswered:before,.qti-navigator-default .icon-unseen:before{content:\"\uE6A5\"}.qti-navigator-default .qti-navigator-counter{text-align:right;margin-left:auto;font-size:12px;font-size:1.2rem}.qti-navigator-default .qti-navigator-actions{text-align:center}.qti-navigator-default .qti-navigator-info.collapsed{height:calc(3rem + 1px)}.qti-navigator-default .qti-navigator-info{height:calc(5*(3rem + 1px));overflow:hidden}.qti-navigator-default .qti-navigator-info>.qti-navigator-label{min-width:calc(100% - 16px);padding:0 8px}.qti-navigator-default .qti-navigator-info ul{padding:0 4px}.qti-navigator-default .qti-navigator-info ul .qti-navigator-label span.qti-navigator-text{padding:0 6px;min-width:10rem}.qti-navigator-default .qti-navigator-info ul .qti-navigator-label span.qti-navigator-icon{min-width:1.5rem}.qti-navigator-default .qti-navigator-info ul .qti-navigator-label span.qti-navigator-counter{min-width:5rem}.qti-navigator-default .qti-navigator-filters{margin-top:1rem;text-align:center;width:15rem;height:calc(3rem + (2 * 1px))}.qti-navigator-default .qti-navigator-filters ul{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch}.qti-navigator-default .qti-navigator-filters li{display:block}.qti-navigator-default .qti-navigator-filters li .qti-navigator-tab{border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px;border-left:none;line-height:3rem;min-width:5rem;cursor:pointer;white-space:nowrap}.qti-navigator-default .qti-navigator-tree{-webkit-flex:1;-moz-flex:1;-ms-flex:1;-o-flex:1;flex:1;overflow-y:auto}.qti-navigator-default .qti-navigator-linear,.qti-navigator-default .qti-navigator-linear-part{padding:8px}.qti-navigator-default .qti-navigator-linear .icon,.qti-navigator-default .qti-navigator-linear-part .icon{display:none}.qti-navigator-default .qti-navigator-linear .qti-navigator-label,.qti-navigator-default .qti-navigator-linear-part .qti-navigator-label{font-size:14px;font-size:1.4rem}.qti-navigator-default .qti-navigator-linear .qti-navigator-title,.qti-navigator-default .qti-navigator-linear-part .qti-navigator-title{font-size:14px;font-size:1.4rem;margin:8px 0}.qti-navigator-default .qti-navigator-linear .qti-navigator-message,.qti-navigator-default .qti-navigator-linear-part .qti-navigator-message{font-size:14px;font-size:1.4rem}.qti-navigator-default .qti-navigator-part>.qti-navigator-label{padding:0 8px}.qti-navigator-default .qti-navigator-part:not(:first-child){margin-top:1px}.qti-navigator-default .qti-navigator-section>.qti-navigator-label{padding:0 8px}.qti-navigator-default .qti-navigator-item{margin:1px 0;padding-left:10px}.qti-navigator-default .qti-navigator-item:first-child{margin-top:0}.qti-navigator-default .qti-navigator-item.disabled>.qti-navigator-label{cursor:not-allowed}.qti-navigator-default .qti-navigator-collapsible{cursor:pointer;text-align:center;display:none;position:absolute;top:0;bottom:0;right:0;padding-top:50%}.qti-navigator-default .qti-navigator-collapsible .icon{font-size:20px;font-size:2rem;width:1rem !important;height:2rem !important}.qti-navigator-default .qti-navigator-collapsible .qti-navigator-expand{display:none}.qti-navigator-default.collapsible{padding-right:calc(1rem + 10px) !important}.qti-navigator-default.collapsible .qti-navigator-collapsible{display:block}.qti-navigator-default.collapsed{width:calc(8rem + 1rem + 10px);min-width:8rem}.qti-navigator-default.collapsed ul{padding:0 !important}.qti-navigator-default.collapsed .qti-navigator-text,.qti-navigator-default.collapsed .qti-navigator-info>.qti-navigator-label,.qti-navigator-default.collapsed .qti-navigator-part>.qti-navigator-label,.qti-navigator-default.collapsed .qti-navigator-section>.qti-navigator-label,.qti-navigator-default.collapsed .qti-navigator-message{display:none !important}.qti-navigator-default.collapsed .qti-navigator-label{padding:0 2px !important;width:calc(8rem - 4px);min-width:calc(8rem - 4px)}.qti-navigator-default.collapsed .qti-navigator-icon,.qti-navigator-default.collapsed .icon{width:auto}.qti-navigator-default.collapsed .qti-navigator-counter{margin-left:0;min-width:4rem !important}.qti-navigator-default.collapsed .qti-navigator-collapsible .qti-navigator-collapse{display:none}.qti-navigator-default.collapsed .qti-navigator-collapsible .qti-navigator-expand{display:block}.qti-navigator-default.collapsed .qti-navigator-info{height:calc(4*(3rem + 1px))}.qti-navigator-default.collapsed .qti-navigator-info.collapsed .collapsible-panel{display:block !important}.qti-navigator-default.collapsed .qti-navigator-filters{width:calc(8rem - 16px)}.qti-navigator-default.collapsed .qti-navigator-filter span{display:none}.qti-navigator-default.collapsed .qti-navigator-filter.active span{display:block;border:0 none;width:calc(8rem - 16px)}.qti-navigator-default.collapsed .qti-navigator-item,.qti-navigator-default.collapsed .qti-navigator-linear,.qti-navigator-default.collapsed .qti-navigator-linear-part{padding-left:2px;text-align:center}.qti-navigator-default.collapsed .qti-navigator-item{overflow:hidden}.qti-navigator-default.collapsed .qti-navigator-item .qti-navigator-icon{padding-left:6px;width:2rem}.qti-navigator-default.collapsed .qti-navigator-item .qti-navigator-number{display:inline-block;margin-left:6px;margin-right:8rem}.qti-navigator-default.collapsed .qti-navigator-linear,.qti-navigator-default.collapsed .qti-navigator-linear-part{padding:0 0 8px 0}.qti-navigator-default.collapsed .qti-navigator-linear .icon,.qti-navigator-default.collapsed .qti-navigator-linear-part .icon{display:block}.qti-navigator-default.collapsed .qti-navigator-actions button{padding:0 9px 0 5px}.qti-navigator-default .qti-navigator-info>.qti-navigator-label{background-color:#d4d5d7;color:#222;border-top:1px solid #d4d5d7}.qti-navigator-default .qti-navigator-info li{border-bottom:1px solid #fff}.qti-navigator-default .qti-navigator-filter .qti-navigator-tab{background-color:#fff}.qti-navigator-default .qti-navigator-filter .qti-navigator-tab:hover{background-color:#3e7da7;color:#fff}.qti-navigator-default .qti-navigator-filter.active .qti-navigator-tab{background-color:#a4a9b1;color:#fff}.qti-navigator-default .qti-navigator-linear,.qti-navigator-default .qti-navigator-linear-part{background:#fff}.qti-navigator-default .qti-navigator-part>.qti-navigator-label{background-color:#dddfe2}.qti-navigator-default .qti-navigator-part>.qti-navigator-label:hover{background-color:#c6cacf}.qti-navigator-default .qti-navigator-part.active>.qti-navigator-label{background-color:#c0c4ca}.qti-navigator-default .qti-navigator-section>.qti-navigator-label{border-bottom:1px solid #fff}.qti-navigator-default .qti-navigator-section>.qti-navigator-label:hover{background-color:#ebe8e4}.qti-navigator-default .qti-navigator-section.active>.qti-navigator-label{background-color:#ded9d4}.qti-navigator-default .qti-navigator-item{background:#fff}.qti-navigator-default .qti-navigator-item.active{background:#0e5d91;color:#fff}.qti-navigator-default .qti-navigator-item:hover{background:#0a3f62;color:#fff}.qti-navigator-default .qti-navigator-item.disabled{background-color:#e2deda !important}.qti-navigator-default .qti-navigator-collapsible{background-color:#dfe1e4;color:#222}.qti-navigator-default .qti-navigator-collapsible .icon{color:#fff}.qti-navigator-fizzy{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;-o-flex-direction:column;flex-direction:column;cursor:default;min-width:calc(18rem - 8px);height:100%;position:relative;background-color:#f2f2f2 !important;width:30rem}.qti-navigator-fizzy .qti-navigator-tree{overflow-y:auto;max-height:100%;display:block;background:none;margin:0 5px}.qti-navigator-fizzy .qti-navigator-linear{padding:8px;margin:0 5px;background:#fff}.qti-navigator-fizzy .qti-navigator-linear .qti-navigator-message{font-size:14px;font-size:1.4rem}.qti-navigator-fizzy .qti-navigator-section{display:block}.qti-navigator-fizzy .qti-navigator-section .qti-navigator-label{background-color:initial;border:none;padding:0;line-height:initial;margin:13px 0 10px 0;font-size:15px;font-size:1.5rem}.qti-navigator-fizzy .qti-navigator-header{display:flex;justify-content:space-between;border-bottom:1px solid #cec7bf;padding:15px 0 5px 0;margin:0 5px;line-height:initial}.qti-navigator-fizzy .qti-navigator-header .qti-navigator-text{font-size:20px;font-size:2rem;font-weight:bold}.qti-navigator-fizzy .qti-navigator-header .icon-close{font-size:28px;font-size:2.8rem;line-height:3rem;color:#1f1f1f}.qti-navigator-fizzy .qti-navigator-header .icon-close:hover{color:#1f1f1f;text-decoration:none;cursor:pointer}.document-viewer-plugin{position:relative}.document-viewer-plugin .viewer-overlay{position:fixed;top:0;left:0;bottom:0;right:0;z-index:10000;width:100%;opacity:.5;background-color:#e4ecef}.document-viewer-plugin .viewer-panel{position:fixed;top:10px;left:10px;bottom:10px;right:10px;z-index:100000;color:#222;background:#f3f1ef;font-size:14px;font-size:1.4rem;border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px}.document-viewer-plugin .viewer-header{position:relative;width:100%;height:30px;padding:5px 0;z-index:1}.document-viewer-plugin .viewer-header .viewer-title{font-size:15px;font-size:1.5rem;padding:0;margin:0 0 0 1.6rem}.document-viewer-plugin .viewer-header .icon{float:right;font-size:20px;font-size:2rem;color:#266d9c;margin:1px 6px;top:3px}.document-viewer-plugin .viewer-header .icon:hover{cursor:pointer;opacity:.75}.document-viewer-plugin .viewer-content{padding:0 20px;margin-top:4px;position:relative;height:calc(100% - 40px);overflow:auto}.qti-choiceInteraction.maskable .qti-choice .answer-mask{position:absolute;top:0;right:0;height:100%;padding:5px 10px 0 10px;z-index:10;color:#0e5d91;border:solid 1px #222;background-color:#c8d6dc;text-align:right;vertical-align:middle}.qti-choiceInteraction.maskable .qti-choice .answer-mask:hover{color:#568eb2}.qti-choiceInteraction.maskable .qti-choice .answer-mask .answer-mask-toggle:before{font-family:\"tao\" !important;speak:never;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:\"\uE643\"}.qti-choiceInteraction.maskable .qti-choice .label-content{padding-right:40px}.qti-choiceInteraction.maskable .qti-choice.masked .answer-mask{width:100%}.qti-choiceInteraction.maskable .qti-choice.masked .answer-mask .answer-mask-toggle:before{font-family:\"tao\" !important;speak:never;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:\"\uE631\"}.qti-choiceInteraction.maskable .qti-choice.masked .answer-mask:hover{background-color:#d2dde2}.mask-container.mask-container{background-color:rgba(0,0,0,0)}.mask-container.mask-container .dynamic-component-title-bar{border-top-left-radius:5px;border-top-right-radius:5px;background-color:rgba(0,0,0,0);border:none;position:absolute;width:100%;z-index:1}.mask-container.mask-container .dynamic-component-title-bar.moving{background:#f3f1ef;border-bottom:1px solid #8d949e}.mask-container.mask-container .dynamic-component-title-bar .closer{display:none}.mask-container.mask-container .dynamic-component-resize-container .dynamic-component-resize-wrapper{bottom:0}.mask-container.mask-container .dynamic-component-resize-container .dynamic-component-resize-wrapper:hover,.mask-container.mask-container .dynamic-component-resize-container .dynamic-component-resize-wrapper.resizing{bottom:20px}.mask-container.mask-container .dynamic-component-content .mask{position:absolute;width:100%;height:100%;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;background:rgba(0,0,0,0);opacity:1}.mask-container.mask-container .dynamic-component-content .mask .inner{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;position:relative;width:100%;height:100%;background-color:#fff;opacity:1;box-sizing:content-box;padding-bottom:30px}.mask-container.mask-container .dynamic-component-content .mask .controls{background:#f3f1ef;position:absolute;top:0;right:0;padding:0 5px 0 10px;border-radius:5px;border-top-left-radius:0;border-bottom-right-radius:0;border-bottom:1px solid #8d949e;border-left:1px solid #8d949e;height:30px;z-index:2}.mask-container.mask-container .dynamic-component-content .mask .controls a{text-decoration:none;margin-right:5px;vertical-align:middle}.mask-container.mask-container .dynamic-component-content .mask .controls a:hover{color:#0a4166}.mask-container.mask-container .dynamic-component-content .mask .controls .view{font-size:20px;font-size:2rem}.mask-container.mask-container .dynamic-component-content .mask .controls .close{font-size:20px;font-size:2rem}.mask-container.mask-container .dynamic-component-content.moving .mask .inner{border-color:rgba(14,93,145,.5);opacity:.55}.mask-container.mask-container .dynamic-component-content.moving .mask .controls{border-left:none;border-bottom-left-radius:0;z-index:2}.mask-container.mask-container .dynamic-component-content.sizing .mask{border-color:rgba(14,93,145,.5)}.mask-container.mask-container .dynamic-component-content.sizing .mask .inner{opacity:.55}.mask-container.mask-container .dynamic-component-content.sizing .mask .controls{background-color:rgba(0,0,0,0);border-bottom:none;border-left:none}.mask-container.mask-container.previewing .dynamic-component-content .mask .inner{opacity:.15;-webkit-transition:opacity, 600ms, ease, 0s;-moz-transition:opacity, 600ms, ease, 0s;-ms-transition:opacity, 600ms, ease, 0s;-o-transition:opacity, 600ms, ease, 0s;transition:opacity, 600ms, ease, 0s}.mask-container.mask-container.previewing .dynamic-component-content .mask .controls{background-color:rgba(0,0,0,0);border-bottom:none;border-left:none}.connectivity-box{display:none;width:40px;margin-left:40px}.connectivity-box.with-message{width:60px}.connectivity-box .icon-connect,.connectivity-box .icon-disconnect{display:none;line-height:2;font-size:16px;font-size:1.6rem;text-shadow:0 1px 0 rgba(0,0,0,.9)}.connectivity-box .message-connect,.connectivity-box .message-disconnected{display:none;font-size:14px;font-size:1.4rem;text-shadow:none;margin-right:3px}.connectivity-box.connected,.connectivity-box.disconnected{display:inline-block}.connectivity-box.connected .icon-connect,.connectivity-box.connected .message-connect{display:inline-block}.connectivity-box.disconnected .icon-disconnect,.connectivity-box.disconnected .message-disconnected{display:inline-block}.line-reader-mask{box-sizing:border-box;border:0 solid #0e5d91;background-color:#f3f7fa}.line-reader-mask.hidden{display:none}.line-reader-mask.resizing{background-color:rgba(243,247,250,.8);border-color:rgba(14,93,145,.5)}.line-reader-mask.resizer{z-index:99999 !important}.line-reader-mask.resizer.se .resize-control{border-right:2px solid #0e5d91;border-bottom:2px solid #0e5d91;width:40px;height:40px}.line-reader-mask.border-top{border-top-width:1px}.line-reader-mask.border-right{border-right-width:1px}.line-reader-mask.border-bottom{border-bottom-width:1px}.line-reader-mask.border-left{border-left-width:1px}.line-reader-mask.ne{-webkit-border-top-right-radius:5px;-moz-border-radius-topright:5px;border-top-right-radius:5px}.line-reader-mask.se{-webkit-border-bottom-right-radius:5px;-moz-border-radius-bottomright:5px;border-bottom-right-radius:5px}.line-reader-mask.sw{-webkit-border-bottom-left-radius:5px;-moz-border-radius-bottomleft:5px;border-bottom-left-radius:5px}.line-reader-mask.nw{-webkit-border-top-left-radius:5px;-moz-border-radius-topleft:5px;border-top-left-radius:5px}.line-reader-mask.se .resize-control{width:20px;height:20px;margin-bottom:10px;margin-right:10px;border-right:1px solid #0e5d91;border-bottom:1px solid #0e5d91;position:absolute;right:0;bottom:0;cursor:nwse-resize}.line-reader-mask.e .resize-control{position:absolute;width:20px;height:20px;bottom:-10px;left:-10px;border-right:1px solid #0e5d91;border-bottom:1px solid #0e5d91;cursor:nesw-resize}.line-reader-mask.s .resize-control{position:absolute;width:20px;height:10px;right:-10px;border-bottom:1px solid #0e5d91}.line-reader-overlay{box-sizing:border-box;opacity:0}.line-reader-overlay.hidden{display:none}.line-reader-overlay.moving{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.line-reader-overlay.moving.n{max-height:none}.line-reader-overlay.moving,.line-reader-overlay .inner-window{overflow:hidden;position:absolute;opacity:1;background-color:rgba(0,0,0,0);border:1px solid rgba(14,93,145,.5)}.line-reader-overlay .inner-window{box-sizing:content-box}.line-reader-overlay .mask-bg{box-sizing:border-box;border:0 solid rgba(243,247,250,.8);background-color:rgba(0,0,0,0);position:absolute}.line-reader-overlay.n{max-height:30px;opacity:1}.line-reader-overlay.n .icon-mobile-menu{font-size:22px;font-size:2.2rem;display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;-o-justify-content:center;justify-content:center;border-bottom:1px solid #0e5d91;color:#0e5d91;position:absolute;left:0;top:0;height:30px;width:100%;z-index:1}.line-reader-overlay.n .icon-mobile-menu:hover{color:#0a4166}.line-reader-overlay.n .icon-mobile-menu:before{position:relative;top:3px}.line-reader-overlay .icon-mobile-menu{display:none}.line-reader-inner-drag{-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;-o-justify-content:center;justify-content:center;text-align:center;padding-top:3px;color:#0e5d91}.line-reader-inner-drag.hidden{display:none}.line-reader-inner-drag:hover{background-color:#87aec8;color:#0a4166}.line-reader-inner-drag.moving{background-color:rgba(0,0,0,0);color:#9fbed3}.line-reader-inner-drag .icon{text-shadow:none !important;border-bottom-left-radius:110px;border-bottom-right-radius:110px;border:1px solid #0e5d91;border-top:0;width:50px;height:25px;position:relative;bottom:10px}.line-reader-inner-drag .icon:before{position:relative;top:5px;left:1px}.line-reader-closer{font-size:22px;font-size:2.2rem;cursor:pointer;color:#0e5d91;width:12px;height:12px}.line-reader-closer:hover{color:#0a4166}.line-reader-closer .icon{text-shadow:none !important}.magnifier-container.magnifier-container{background-color:rgba(0,0,0,0)}.magnifier-container.magnifier-container .dynamic-component-title-bar{border-top-left-radius:5px;border-top-right-radius:5px;background-color:rgba(0,0,0,0);border:none;position:absolute;width:100%;z-index:3}.magnifier-container.magnifier-container .dynamic-component-title-bar.moving{background:#f3f1ef;border-bottom:1px solid #8d949e}.magnifier-container.magnifier-container .dynamic-component-title-bar .closer{display:none}.magnifier-container.magnifier-container .dynamic-component-resize-container .dynamic-component-resize-wrapper{bottom:0}.magnifier-container.magnifier-container .dynamic-component-resize-container .dynamic-component-resize-wrapper:hover,.magnifier-container.magnifier-container .dynamic-component-resize-container .dynamic-component-resize-wrapper.resizing{bottom:20px}.magnifier-container.magnifier-container .dynamic-component-content .magnifier{position:absolute;width:100%;height:100%;overflow:hidden;background-color:#fff;opacity:1;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;box-sizing:content-box;padding-bottom:30px}@-o-keyframes fadeIn{0%{opacity:0;visibility:visible}100%{opacity:1;visibility:visible}}@-moz-keyframes fadeIn{0%{opacity:0;visibility:visible}100%{opacity:1;visibility:visible}}@-webkit-keyframes fadeIn{0%{opacity:0;visibility:visible}100%{opacity:1;visibility:visible}}@keyframes fadeIn{0%{opacity:0;visibility:visible}100%{opacity:1;visibility:visible}}@-o-keyframes fadeOut{0%{opacity:1;visibility:visible}100%{opacity:0;visibility:hidden}}@-moz-keyframes fadeOut{0%{opacity:1;visibility:visible}100%{opacity:0;visibility:hidden}}@-webkit-keyframes fadeOut{0%{opacity:1;visibility:visible}100%{opacity:0;visibility:hidden}}@keyframes fadeOut{0%{opacity:1;visibility:visible}100%{opacity:0;visibility:hidden}}@-o-keyframes pop{0%{opacity:0;visibility:visible}50%{opacity:.5;visibility:visible;transform:scale(2)}100%{opacity:0;visibility:hidden;transform:scale(3)}}@-moz-keyframes pop{0%{opacity:0;visibility:visible}50%{opacity:.5;visibility:visible;transform:scale(2)}100%{opacity:0;visibility:hidden;transform:scale(3)}}@-webkit-keyframes pop{0%{opacity:0;visibility:visible}50%{opacity:.5;visibility:visible;transform:scale(2)}100%{opacity:0;visibility:hidden;transform:scale(3)}}@keyframes pop{0%{opacity:0;visibility:visible}50%{opacity:.5;visibility:visible;transform:scale(2)}100%{opacity:0;visibility:hidden;transform:scale(3)}}.magnifier-container.magnifier-container .dynamic-component-content .magnifier .level{position:absolute;overflow:hidden;z-index:1;top:0;left:0;bottom:0;right:0;background:rgba(0,0,0,0);color:#3e7da7;opacity:1;font-size:50px;font-size:5rem;display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;-o-justify-content:center;justify-content:center;-webkit-animation:pop 400ms forwards;-moz-animation:pop 400ms forwards;-ms-animation:pop 400ms forwards;-o-animation:pop 400ms forwards;animation:pop 400ms forwards}.magnifier-container.magnifier-container .dynamic-component-content .magnifier .level:before{content:\"x\"}.magnifier-container.magnifier-container .dynamic-component-content .magnifier .overlay{position:absolute;overflow:hidden;z-index:2;top:0;left:0;bottom:0;right:0;background:rgba(0,0,0,0)}.magnifier-container.magnifier-container .dynamic-component-content .magnifier>.controls{position:absolute;background-color:#f3f1ef;border:0 solid #8d949e;min-height:29px;z-index:4}.magnifier-container.magnifier-container .dynamic-component-content .magnifier>.controls a{color:#222;text-decoration:none;font-size:20px;font-size:2rem;margin:0 2px}.magnifier-container.magnifier-container .dynamic-component-content .magnifier>.controls a:hover{color:#0a4166}.magnifier-container.magnifier-container .dynamic-component-content .magnifier>.controls.close{top:0;right:0;border-bottom-width:1px;border-left-width:1px;-webkit-border-bottom-left-radius:5px;-moz-border-radius-bottomleft:5px;border-bottom-left-radius:5px}.magnifier-container.magnifier-container .dynamic-component-content .magnifier .inner{position:absolute}.magnifier-container.magnifier-container .dynamic-component-content.moving .magnifier .controls{border-left:none;border-bottom-left-radius:0}.magnifier-container.magnifier-container .dynamic-component-content.sizing{border-color:rgba(14,93,145,.5)}.magnifier-container.magnifier-container .dynamic-component-content.sizing .inner,.magnifier-container.magnifier-container .dynamic-component-content.sizing .controls,.magnifier-container.magnifier-container .dynamic-component-content.sizing .level{opacity:.45 !important}.progress-box .progressbar .progressbar-points{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch}.progress-box .progressbar .progressbar-points>span.progressbar-point{flex:1;display:inline-block;border:1px solid #0e5d91;background-color:#f3f1ef;height:calc(1rem - 4px);margin:0 1px 0 0}.progress-box .progressbar .progressbar-points>span.progressbar-point:last-child{margin-right:0}.progress-box .progressbar .progressbar-points>span.progressbar-point.reached{background-color:#0e5d91}.progress-box .progressbar .progressbar-points>span.progressbar-point.current{background-color:#a4a9b1}.tts-container .tts-controls{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;background-color:#f3f1ef;-webkit-box-shadow:0 2px 3px 1px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 2px 3px 1px rgba(0, 0, 0, 0.2);-ms-box-shadow:0 2px 3px 1px rgba(0, 0, 0, 0.2);-o-box-shadow:0 2px 3px 1px rgba(0, 0, 0, 0.2);box-shadow:0 2px 3px 1px rgba(0, 0, 0, 0.2)}.tts-container .tts-controls .tts-control{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;-o-justify-content:center;justify-content:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;color:#222;height:100%;padding:6px 8.5px;text-decoration:none}.tts-container .tts-controls .tts-control .tts-control-label{padding-left:7.5px}.tts-container .tts-controls .tts-control .tts-icon{font-size:18px;text-align:center;width:18px}.tts-container .tts-controls .tts-control .icon-pause{display:none}.tts-container .tts-controls .tts-control.tts-control-drag{cursor:move}.tts-container .tts-controls .tts-control.tts-control-drag .tts-icon{color:#555}.tts-container .tts-controls .tts-control.tts-control-drag:hover{background-color:rgba(0,0,0,0)}.tts-container .tts-controls .tts-control:hover{background-color:#ddd8d2}.tts-container .tts-controls .tts-control-container{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch}.tts-container .tts-controls .tts-control-container .tts-slider-container{display:none}.tts-container .tts-controls .tts-control-container .tts-slider-container .tts-slider{margin:0 8.5px;width:80px}.tts-container.playing .tts-controls .tts-control .icon-pause{display:block}.tts-container.playing .tts-controls .tts-control .icon-play{display:none}.tts-container.sfhMode .tts-controls .tts-control.tts-control-mode{-webkit-box-shadow:inset 2px 2px 4px rgba(0, 0, 0, 0.2);-moz-box-shadow:inset 2px 2px 4px rgba(0, 0, 0, 0.2);-ms-box-shadow:inset 2px 2px 4px rgba(0, 0, 0, 0.2);-o-box-shadow:inset 2px 2px 4px rgba(0, 0, 0, 0.2);box-shadow:inset 2px 2px 4px rgba(0, 0, 0, 0.2);background-color:#ddd8d2}.tts-container.settings .tts-controls .tts-control-container .tts-slider-container{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center}.tts-container.settings .tts-controls .tts-control-container:last-child{-webkit-box-shadow:inset 2px 2px 4px rgba(0, 0, 0, 0.2);-moz-box-shadow:inset 2px 2px 4px rgba(0, 0, 0, 0.2);-ms-box-shadow:inset 2px 2px 4px rgba(0, 0, 0, 0.2);-o-box-shadow:inset 2px 2px 4px rgba(0, 0, 0, 0.2);box-shadow:inset 2px 2px 4px rgba(0, 0, 0, 0.2);background-color:#ddd8d2}.tts-container.settings .tts-controls .tts-control-container .tts-control-settings:hover{background-color:rgba(0,0,0,0)}.tts-content-node{outline:none}.tts-visible.tts-component-container .test-runner-sections .tts-content-node:hover,.tts-visible.tts-component-container .test-runner-sections .tts-content-node:focus{background-color:rgba(0,0,0,0) !important;color:#222 !important}.tts-visible.tts-component-container .test-runner-sections .tts-content-node .label-box,.tts-visible.tts-component-container .test-runner-sections .tts-content-node .qti-choice{cursor:default !important}.tts-sfhMode.tts-component-container .test-runner-sections{cursor:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxNHB4IiBoZWlnaHQ9IjE0cHgiIHZpZXdCb3g9IjAgMCAxNCAxNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT5Hcm91cCAyPC90aXRsZT4gICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+ICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9IkFydGJvYXJkIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjQuMDAwMDAwLCAtMTYuMDAwMDAwKSI+ICAgICAgICAgICAgPGcgaWQ9Ikdyb3VwLTIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIzLjAwMDAwMCwgMTUuMDAwMDAwKSI+ICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtQ29weS02IiB4PSIwIiB5PSIwIiB3aWR0aD0iMTYiIGhlaWdodD0iMTYiPjwvcmVjdD4gICAgICAgICAgICAgICAgPGcgaWQ9Imljb24tLy0xNi0vLWNoZXZyb24tYm90dG9tLWNvcHkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEuMDAwMDAwLCAyLjAwMDAwMCkiIGZpbGw9IiMyRDJEMkQiPiAgICAgICAgICAgICAgICAgICAgPHBvbHlnb24gaWQ9InN3YXAtaWNvbi1jb2xvciIgcG9pbnRzPSIwIDAgMCA4IDYgNCI+PC9wb2x5Z29uPiAgICAgICAgICAgICAgICA8L2c+ICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtQ29weSIgZmlsbD0iIzJEMkQyRCIgeD0iOSIgeT0iNSIgd2lkdGg9IjYiIGhlaWdodD0iMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLUNvcHktNCIgZmlsbD0iIzJEMkQyRCIgeD0iOSIgeT0iMSIgd2lkdGg9IjYiIGhlaWdodD0iMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLUNvcHktMiIgZmlsbD0iIzJEMkQyRCIgeD0iOSIgeT0iOSIgd2lkdGg9IjYiIGhlaWdodD0iMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLUNvcHktMyIgZmlsbD0iIzJEMkQyRCIgeD0iMSIgeT0iMTMiIHdpZHRoPSIxNCIgaGVpZ2h0PSIyIj48L3JlY3Q+ICAgICAgICAgICAgPC9nPiAgICAgICAgPC9nPiAgICA8L2c+PC9zdmc+) 0 32,auto !important}.tts-sfhMode.tts-component-container .test-runner-sections .tts-content-node.tts-active-content-node:hover{color:#222 !important;background-color:#ff0 !important}.tts-sfhMode.tts-component-container .test-runner-sections .tts-content-node:hover,.tts-sfhMode.tts-component-container .test-runner-sections .tts-content-node:focus{color:#222 !important;background-color:#f3f1ef !important}.tts-sfhMode.tts-component-container .test-runner-sections .tts-content-node .label-box,.tts-sfhMode.tts-component-container .test-runner-sections .tts-content-node .qti-choice{cursor:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxNHB4IiBoZWlnaHQ9IjE0cHgiIHZpZXdCb3g9IjAgMCAxNCAxNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT5Hcm91cCAyPC90aXRsZT4gICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+ICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9IkFydGJvYXJkIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjQuMDAwMDAwLCAtMTYuMDAwMDAwKSI+ICAgICAgICAgICAgPGcgaWQ9Ikdyb3VwLTIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIzLjAwMDAwMCwgMTUuMDAwMDAwKSI+ICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtQ29weS02IiB4PSIwIiB5PSIwIiB3aWR0aD0iMTYiIGhlaWdodD0iMTYiPjwvcmVjdD4gICAgICAgICAgICAgICAgPGcgaWQ9Imljb24tLy0xNi0vLWNoZXZyb24tYm90dG9tLWNvcHkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEuMDAwMDAwLCAyLjAwMDAwMCkiIGZpbGw9IiMyRDJEMkQiPiAgICAgICAgICAgICAgICAgICAgPHBvbHlnb24gaWQ9InN3YXAtaWNvbi1jb2xvciIgcG9pbnRzPSIwIDAgMCA4IDYgNCI+PC9wb2x5Z29uPiAgICAgICAgICAgICAgICA8L2c+ICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtQ29weSIgZmlsbD0iIzJEMkQyRCIgeD0iOSIgeT0iNSIgd2lkdGg9IjYiIGhlaWdodD0iMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLUNvcHktNCIgZmlsbD0iIzJEMkQyRCIgeD0iOSIgeT0iMSIgd2lkdGg9IjYiIGhlaWdodD0iMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLUNvcHktMiIgZmlsbD0iIzJEMkQyRCIgeD0iOSIgeT0iOSIgd2lkdGg9IjYiIGhlaWdodD0iMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLUNvcHktMyIgZmlsbD0iIzJEMkQyRCIgeD0iMSIgeT0iMTMiIHdpZHRoPSIxNCIgaGVpZ2h0PSIyIj48L3JlY3Q+ICAgICAgICAgICAgPC9nPiAgICAgICAgPC9nPiAgICA8L2c+PC9zdmc+) 0 32,auto !important}.tts-sfhMode.tts-component-container .test-runner-sections img.tts-content-node:hover,.tts-sfhMode.tts-component-container .test-runner-sections img.tts-content-node:focus{padding:5px}.tts-playing.tts-component-container .test-runner-sections .tts-content-node.tts-active-content-node,.tts-playing.tts-component-container .test-runner-sections .tts-content-node.tts-active-content-node *{color:#222 !important;background-color:#ff0 !important}.tts-playing.tts-component-container .test-runner-sections .tts-content-node.tts-active-content-node:hover,.tts-playing.tts-component-container .test-runner-sections .tts-content-node.tts-active-content-node *:hover{color:#222 !important;background-color:#ff0 !important}.tts-playing.tts-component-container .test-runner-sections img.tts-content-node.tts-active-content-node{padding:5px}body.delivery-scope{min-height:100vh;max-height:100vh;margin-bottom:0}.runner{position:relative}.qti-choiceInteraction .overlay-answer-eliminator{display:none}.test-runner-scope{position:relative;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:calc(100vh - 99px)}.test-runner-scope .landmark-title-hidden{width:1px;height:1px;overflow:hidden;position:absolute}.test-runner-scope .test-runner-sections{-webkit-flex:1 1 0%;-ms-flex:1 1 0%;flex:1 1 0%;overflow:hidden;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.test-runner-scope .test-sidebar{background:#f3f1ef;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;overflow-y:auto;max-width:350px}.test-runner-scope .test-sidebar>.qti-panel{max-width:350px;padding:10px}@media only screen and (max-device-width: 800px){.test-runner-scope .test-sidebar{max-width:200px}.test-runner-scope .test-sidebar>.qti-panel{max-width:200px}}@media only screen and (min-device-width: 800px)and (max-device-width: 1280px){.test-runner-scope .test-sidebar{max-width:250px}.test-runner-scope .test-sidebar>.qti-panel{max-width:250px}}@media only screen and (min-device-width: 1280px)and (max-device-width: 1440px){.test-runner-scope .test-sidebar{max-width:300px}.test-runner-scope .test-sidebar>.qti-panel{max-width:300px}}.test-runner-scope .test-sidebar-left{border-right:1px #ddd solid}.test-runner-scope .test-sidebar-right{border-left:1px #ddd solid}.test-runner-scope .content-wrapper{position:relative;-webkit-flex:1 1 0%;-ms-flex:1 1 0%;flex:1 1 0%;overflow:auto;padding:0}.test-runner-scope .content-wrapper .overlay{position:absolute;left:0;right:0;top:0;bottom:0;width:100%;opacity:.9}.test-runner-scope .content-wrapper .overlay-full{background-color:#fff;opacity:1}.test-runner-scope #qti-content{-webkit-overflow-scrolling:touch;max-width:1024px;width:100%;margin:auto}.test-runner-scope #qti-item{width:100%;min-width:100%;height:auto;overflow:visible}.test-runner-scope .qti-item{padding:30px}.test-runner-scope .size-wrapper{max-width:1280px;margin:auto;width:100%}.test-runner-scope #qti-rubrics{margin:auto;max-width:1024px;width:100%}.test-runner-scope #qti-rubrics .qti-rubricBlock{margin:20px 0}.test-runner-scope #qti-rubrics .hidden{display:none}.test-runner-scope .visible-hidden{position:absolute;overflow:hidden;height:1px;width:1px;word-wrap:normal}.no-controls .test-runner-scope{height:100vh}.test-runner-scope .action-bar.content-action-bar{padding:2px}.test-runner-scope .action-bar.content-action-bar li{margin:2px 0 0 10px;border:none}.test-runner-scope .action-bar.content-action-bar li.btn-info{padding-top:6px;height:36px;margin-top:0;border-bottom:solid 2px rgba(0,0,0,0);border-radius:0}.test-runner-scope .action-bar.content-action-bar li.btn-info.btn-group{border:none !important;overflow:hidden;padding:0}.test-runner-scope .action-bar.content-action-bar li.btn-info.btn-group a{float:left;margin:0 2px;padding:0 15px;border:1px solid rgba(255,255,255,.3);border-radius:0px;display:inline-block;height:inherit}.test-runner-scope .action-bar.content-action-bar li.btn-info.btn-group a:first-of-type{border-top-left-radius:3px;border-bottom-left-radius:3px;margin-left:0}.test-runner-scope .action-bar.content-action-bar li.btn-info.btn-group a:last-of-type{border-top-right-radius:3px;border-bottom-right-radius:3px;margin-right:0}.test-runner-scope .action-bar.content-action-bar li.btn-info.btn-group a:hover,.test-runner-scope .action-bar.content-action-bar li.btn-info.btn-group a.active{border-color:rgba(255,255,255,.8)}.test-runner-scope .action-bar.content-action-bar li.btn-info.btn-group a .no-label{padding-right:0}.test-runner-scope .action-bar.content-action-bar li.btn-info:hover,.test-runner-scope .action-bar.content-action-bar li.btn-info.active{border-bottom-color:rgba(255,255,255,.8)}.test-runner-scope .action-bar.content-action-bar li.btn-info:active,.test-runner-scope .action-bar.content-action-bar li.btn-info.active{background:#e7eff4;border-color:rgba(255,255,255,.8)}.test-runner-scope .action-bar.content-action-bar li.btn-info:active a,.test-runner-scope .action-bar.content-action-bar li.btn-info.active a{color:#266d9c;text-shadow:none}.test-runner-scope .action-bar.content-action-bar li.btn-info:active:hover,.test-runner-scope .action-bar.content-action-bar li.btn-info.active:hover{background:#fff}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar{opacity:1;height:40px;flex-basis:40px}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box{height:38px;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:space-between;-ms-flex-pack:space-between;justify-content:space-between;padding-left:10px;padding-right:10px}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box .title-box{font-size:14px;font-size:1.4rem;padding:4px 0 0;-ms-flex:0 1 auto;-webkit-flex:0 1 auto;flex:0 1 auto}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box .progress-box,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box .item-number-box{padding-top:4px;white-space:nowrap;-ms-flex:0 1 auto;-webkit-flex:0 1 auto;flex:0 1 auto}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box .progress-box .qti-controls,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box .item-number-box .qti-controls{display:inline-block;margin-left:20px;white-space:nowrap}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box .timer-box{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box .progressbar{margin-top:5px;min-width:150px;max-width:200px;height:.6em}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box{color:rgba(255,255,255,.9);text-shadow:1px 1px 0 #000}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .lft,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .rgt{padding-left:20px}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .lft:first-child,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .rgt:first-child{padding-left:0}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .lft:last-child ul,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .rgt:last-child ul{display:inline-block}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box [class^=btn-],.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box [class*=\" btn-\"]{white-space:nowrap}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .action{position:relative;overflow:visible}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu{color:#222;background:#f3f1ef;border:1px solid #aaa9a7;overflow:auto;list-style:none;min-width:150px;margin:0;padding:0;position:absolute;bottom:36px;left:-3px}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action{display:inline-block;text-align:left;width:100%;white-space:nowrap;overflow:hidden;color:#222;border-bottom:1px solid #c2c1bf;margin:0;-moz-border-radius:0px;-webkit-border-radius:0px;border-radius:0px;height:auto;padding:8px 15px 9px;line-height:1;border-left:solid 3px rgba(0,0,0,0)}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action .icon-checkbox-checked{display:none}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.active{background-color:#dbd9d7;font-weight:bold}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon-checkbox,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon-checkbox,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.active .icon-checkbox{display:none}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon-checkbox-checked,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon-checkbox-checked,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.active .icon-checkbox-checked{display:inline-block}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:focus,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover{background-color:#0e5d91;color:#fff;border-left-color:#313030 !important}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:focus .label,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:focus .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .label,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .label,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon{color:#fff}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:focus .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon{color:#e7eff4}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action .label,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action .icon{font-size:14px;font-size:1.4rem;text-shadow:none;color:#222}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar{overflow:visible;position:relative}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .action{line-height:1.6}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .icon.no-label{padding-right:0}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed .btn-info .text,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed-hover .btn-info:not(:hover) .text,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.no-tool-label .text,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed .text,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed-over:not(:hover) .text{display:none}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed .btn-info .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed-hover .btn-info:not(:hover) .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.no-tool-label .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed-over:not(:hover) .icon{padding:0}.test-runner-scope [data-control=exit]{margin-left:20px}.test-runner-scope [data-control=comment-toggle]{display:none}.test-runner-scope.non-lti-context .title-box{display:none}.test-runner-scope [data-control=qti-comment]{background-color:#f3f1ef;position:absolute;bottom:33px;left:8px;text-align:right;padding:5px;border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px;-webkit-box-shadow:0 0 15px 1px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 0 15px 1px rgba(0, 0, 0, 0.2);-ms-box-shadow:0 0 15px 1px rgba(0, 0, 0, 0.2);-o-box-shadow:0 0 15px 1px rgba(0, 0, 0, 0.2);box-shadow:0 0 15px 1px rgba(0, 0, 0, 0.2)}.test-runner-scope [data-control=qti-comment] textarea{display:block;height:100px;resize:none;width:350px;padding:3px;margin:0 0 10px 0;border:none;font-size:13px;font-size:1.3rem;border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px}.test-runner-scope .tools-box{position:relative;overflow:visible}.wait-content .wait-content_text--centered{text-align:center}.wait-content .wait-content_actions-list{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;-o-flex-direction:column;flex-direction:column}.wait-content .wait-content_actions-list .wait-content_text--centered{position:relative;right:15px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box>.lft{float:right;margin:2px 10px 0 0}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .rgt{float:left}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list>.action>.li-inner>.icon,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list>.action>.li-inner>.icon{display:inline-block}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list>.action .action,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list>.action .action{text-align:right}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list>.action .action.active .icon.icon-checkbox-checked,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list>.action .action.active .icon.icon-checkbox-checked{display:inline-block}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list>.action .action:not(.active) .icon.icon-checkbox,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list>.action .action:not(.active) .icon.icon-checkbox{display:inline-block}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list>.action .action:not(.active):hover .icon.icon-checkbox,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list>.action .action:not(.active):hover .icon.icon-checkbox{display:none}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list>.action .action:not(.active):hover .icon.icon-checkbox-checked,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list>.action .action:not(.active):hover .icon.icon-checkbox-checked{display:inline-block}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list>.action .menu,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list>.action .menu{left:auto;right:-3px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action{float:right}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon{padding:0 0 0 9px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-right:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-left:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-fast-forward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-step-forward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-forward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-fast-backward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-step-backward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-external:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-backward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-right:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-left:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-fast-forward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-step-forward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-forward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-fast-backward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-step-backward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-external:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-backward:before{display:inline-block;transform:scaleX(-1)}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .action,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .action{text-align:right}body.delivery-scope[dir=rtl] .qti-navigator .icon-up,body.delivery-scope[dir=rtl] .qti-navigator .icon-down{margin-left:0;margin-right:auto}body.delivery-scope[dir=rtl] .qti-navigator .qti-navigator-counter{margin-left:0;margin-right:auto;text-align:left}body.delivery-scope[dir=rtl] .qti-item [class^=feedback-].small,body.delivery-scope[dir=rtl] .qti-item [class*=\" feedback-\"].small{padding:8px 45px 8px 20px;text-align:right}body.delivery-scope[dir=rtl] .qti-item [class^=feedback-].small>[class^=icon-],body.delivery-scope[dir=rtl] .qti-item [class^=feedback-].small>[class*=\" icon-\"],body.delivery-scope[dir=rtl] .qti-item [class*=\" feedback-\"].small>[class^=icon-],body.delivery-scope[dir=rtl] .qti-item [class*=\" feedback-\"].small>[class*=\" icon-\"]{left:auto;right:10px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar .control-box>.connectivity-box{margin-left:0px;margin-right:40px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar .control-box>.connectivity-box.with-message .message-connect{margin-left:3px;margin-right:0px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar .control-box>.progress-box>.qti-controls{margin-left:0px;margin-right:20px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar .control-box>.timer-box .timer-toggler{right:20px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar .control-box>.timer-box .timer-wrapper .countdown:first-child::before{content:\" \"}body.delivery-scope[dir=rtl] .runner .test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar .control-box>.timer-box .timer-wrapper .countdown:last-child::before{content:none}.action-bar .shortcuts-list-wrapper{width:100%;height:100%;position:fixed;top:0;left:0;display:flex;align-items:center;align-content:center;justify-content:center;overflow:auto;background:rgba(0,0,0,.5);z-index:10001}.action-bar .shortcuts-list-wrapper .shortcuts-list{width:auto;min-width:400px;height:auto;min-height:300px;padding:30px !important;color:#222 !important;text-shadow:none !important;position:relative;background-color:#fff;border:1px solid #ddd}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-list-description{width:450px}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-list-title{font-size:24px;margin-top:0}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-group-title{font-size:18px;margin-top:20px}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-group-title:focus{outline:3px solid #276d9b;outline-offset:3px}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-group-list{list-style:none;margin:0;padding:0}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-group-list .shortcut-item{display:-ms-flexbox;display:-webkit-flex;display:flex;float:none;margin:0}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-group-list .shortcut-item .shortcut-item-action,.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-group-list .shortcut-item .shortcut-item-shortcut{-ms-flex:0 1 50%;-webkit-flex:0 1 50%;flex:0 1 50%;margin:0;text-align:center}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-group-list .shortcut-item .shortcut-item-action{text-align:left}.action-bar .shortcuts-list-wrapper .shortcuts-list .btn-close{background-color:rgba(0,0,0,0);box-shadow:none;height:20px;padding:0;position:absolute;right:12px;top:10px;width:20px}.action-bar .shortcuts-list-wrapper .shortcuts-list .btn-close .icon-close{color:#222;font-size:20px;padding:0}.action-bar .shortcuts-list-wrapper .shortcuts-list .btn-close:focus{outline:3px solid #276d9b;outline-offset:3px}.jump-links-container .jump-links-box{display:block;width:0;height:0;position:absolute}.jump-links-container .jump-links-box .jump-link-item{position:fixed;display:block;z-index:1001}.jump-links-container .jump-links-box .jump-link{z-index:1002;position:fixed;display:block;overflow:hidden;top:10px;left:10px;width:0;padding:0 !important;font-size:2.4rem !important}.jump-links-container .jump-links-box .jump-link:focus{width:auto;height:auto;padding:30px !important;background:#f3f1ef;color:#222 !important;border:3px solid #222;outline:none;text-shadow:none !important}.jump-links-container .jump-links-box .jump-link:focus:hover{background:#f3f1ef;text-decoration:underline}\n\n/*# sourceMappingURL=../../../taoQtiTest/views/css/new-test-runner.css.map */"),define("taoQtiTest/loader/taoQtiTestRunner.bundle",function(){}),window.bundles=(window.bundles||[]).concat(["taoItems/loader/taoItemsRunner.min","taoTests/loader/taoTestsRunner.min","taoQtiItem/loader/taoQtiItemRunner.min"]); +(function(){"use strict";var loaderScript=document.getElementById("amd-loader"),configUrl=loaderScript.getAttribute("data-config"),bundle=loaderScript.getAttribute("data-bundle"),loadController=function loadController(){var controllerOptions={},controllerPath=loaderScript.getAttribute("data-controller"),params=loaderScript.getAttribute("data-params");try{controllerOptions=JSON.parse(params)}catch(err){controllerOptions={}}window.require([controllerPath],function(controller){var startController=function startController(){window.started||(window.started=!0,controller.start(controllerOptions))};document.addEventListener("readystatechange",startController,!1),"complete"===document.readyState&&startController()})};window.require([configUrl],function(){window.loadBundles||(window.loaded={},window.loadBundles=function loadBundles(bundles){bundles=bundles||[],bundles=bundles.concat(window.bundles),bundles=bundles.filter(function(item,index){return item&&bundles.indexOf(item)===index&&!0!==window.loaded[item]}),require(bundles,function(){bundles.forEach(function(item){window.loaded[item]=!0}),loadController()})}),bundle||window.bundles&&window.bundles.length?window.loadBundles([bundle]):loadController()})})(),define("loader/bootstrap",function(){}),define("css!taoQtiTestCss/new-test-runner",[],function(){}),define("taoQtiTest/controller/runner/runner",["jquery","lodash","i18n","context","module","core/router","core/logger","layout/loading-bar","ui/feedback","util/url","util/locale","taoTests/runner/providerLoader","taoTests/runner/runner","css!taoQtiTestCss/new-test-runner"],function($,_,__,context,module,router,loggerFactory,loadingBar,feedback,urlUtil,locale,providerLoader,runner){"use strict";const requiredOptions=["testDefinition","testCompilation","serviceCallId","bootstrap","options","providers"];return{start(config){let exitReason;const $container=$(".runner"),logger=loggerFactory("controller/runner",{serviceCallId:config.serviceCallId,plugins:config&&config.providers&&Object.keys(config.providers.plugins)});let preventFeedback=!1,errorFeedback=null;const exit=function exit(reason,level){let url=config.options.exitUrl;const params={};reason&&(!level&&(level="warning"),params[level]=reason,url=urlUtil.build(url,params)),window.location=url},onError=function onError(err,displayMessage){onFeedback(err,displayMessage,"error")},onWarning=function onWarning(err,displayMessage){onFeedback(err,displayMessage,"warning")},onFeedback=function onFeedback(err,displayMessage,type){const typeMap={warning:{logger:"warn",feedback:"warning"},error:{logger:"error",feedback:"error"}},loggerByType=logger[typeMap[type].logger],feedbackByType=feedback()[typeMap[type].feedback];return displayMessage=displayMessage||err.message,_.isString(displayMessage)||(displayMessage=JSON.stringify(displayMessage)),loadingBar.stop(),loggerByType({displayMessage:displayMessage},err),"error"===type&&(403===err.code||500===err.code)?(displayMessage=`${__("An error occurred during the test, please content your administrator.")} ${displayMessage}`,exit(displayMessage,"error")):void(!preventFeedback&&(errorFeedback=feedbackByType(displayMessage,{timeout:-1})))},moduleConfig=module.config();return loadingBar.start(),$(".delivery-scope").attr({dir:locale.getLanguageDirection(context.locale)}),requiredOptions.every(option=>"undefined"!=typeof config[option])?void(moduleConfig&&_.isArray(moduleConfig.extraRoutes)&&moduleConfig.extraRoutes.length&&router.dispatch(moduleConfig.extraRoutes),config.provider=Object.assign(config.provider||{},{runner:"qti"}),providerLoader(config.providers,context.bundle).then(function(results){const testRunnerConfig=_.omit(config,["providers"]);if(testRunnerConfig.renderTo=$container,results.proxy&&"function"==typeof results.proxy.getAvailableProviders){const loadedProxies=results.proxy.getAvailableProviders();testRunnerConfig.provider.proxy=loadedProxies[0]}logger.debug({config:testRunnerConfig,providers:config.providers},"Start test runner"),runner(config.provider.runner,results.plugins,testRunnerConfig).on("error",onError).on("warning",onWarning).on("ready",function(){_.defer(function(){$container.removeClass("hidden")})}).on("pause",function(data){data&&data.reason&&(exitReason=data.reason)}).after("destroy",function(){this.removeAllListeners(),exit(exitReason)}).on("disablefeedbackalerts",function(){errorFeedback&&errorFeedback.close(),preventFeedback=!0}).on("enablefeedbackalerts",function(){preventFeedback=!1}).init()}).catch(function(err){onError(err,__("An error occurred during the test initialization!"))})):onError(new TypeError(__("Missing required configuration option %s",name)))}}}),define("taoQtiTest/runner/config/assetManager",["taoItems/assets/manager","taoItems/assets/strategies","taoQtiItem/portableElementRegistry/assetManager/portableAssetStrategy"],function(assetManagerFactory,assetStrategies,assetPortableElement){"use strict";function getAssetManager(testId){var assetManager;return"undefined"==typeof assetManagers[testId]?(assetManager=assetManagerFactory(defaultStrategies,{baseUrl:""}),assetManagers[testId]=assetManager):assetManager=assetManagers[testId],assetManager}assetManagerFactory=assetManagerFactory&&Object.prototype.hasOwnProperty.call(assetManagerFactory,"default")?assetManagerFactory["default"]:assetManagerFactory,assetStrategies=assetStrategies&&Object.prototype.hasOwnProperty.call(assetStrategies,"default")?assetStrategies["default"]:assetStrategies,assetPortableElement=assetPortableElement&&Object.prototype.hasOwnProperty.call(assetPortableElement,"default")?assetPortableElement["default"]:assetPortableElement;var defaultStrategies=[assetStrategies.packedUrl,assetStrategies.external,assetStrategies.base64,assetStrategies.baseUrl,assetPortableElement],assetManagers={};return getAssetManager}),define("taoQtiTest/runner/config/qtiServiceConfig",["lodash","util/url","util/config"],function(_,urlUtil,configHelper){"use strict";function configFactory(config){var storage=configHelper.from(config,_entries,_defaults),undef;return storage.timeout?storage.timeout*=1e3:storage.timeout=undef,{getTestDefinition:function getTestDefinition(){return storage.testDefinition},getTestCompilation:function getTestCompilation(){return storage.testCompilation},getServiceCallId:function getServiceCallId(){return storage.serviceCallId},getServiceController:function getServiceController(){return storage.bootstrap.serviceController||_defaults.bootstrap.serviceController},getServiceExtension:function getServiceExtension(){return storage.bootstrap.serviceExtension||_defaults.bootstrap.serviceExtension},getTestActionUrl:function getTestActionUrl(action){return urlUtil.route(action,this.getServiceController(),this.getServiceExtension(),{testDefinition:this.getTestDefinition(),testCompilation:this.getTestCompilation(),serviceCallId:this.getServiceCallId()})},getItemActionUrl:function getItemActionUrl(itemIdentifier,action){return urlUtil.route(action,this.getServiceController(),this.getServiceExtension(),{testDefinition:this.getTestDefinition(),testCompilation:this.getTestCompilation(),testServiceCallId:this.getServiceCallId(),itemDefinition:itemIdentifier})},getTelemetryUrl:function getTelemetryUrl(itemIdentifier,signal){return urlUtil.route(signal,this.getServiceController(),this.getServiceExtension(),{testDefinition:this.getTestDefinition(),testCompilation:this.getTestCompilation(),testServiceCallId:this.getServiceCallId(),itemDefinition:itemIdentifier})},getTimeout:function getTimeout(){return storage.timeout},getCommunicationConfig:function getCommunicationConfig(){var communication=storage.bootstrap.communication||{},extension=communication.extension||this.getServiceExtension(),controller=communication.controller||this.getServiceController(),action=communication.action,syncActions=communication.syncActions||[],service=urlUtil.route(action||"message",controller,extension,{testDefinition:this.getTestDefinition(),testCompilation:this.getTestCompilation(),serviceCallId:this.getServiceCallId()}),params=_.merge({},communication.params||{},{service:communication.service||service});return params.timeout?params.timeout*=1e3:params.timeout=storage.timeout,params.interval&&(params.interval*=1e3),{enabled:communication.enabled,type:communication.type,params:params,syncActions:syncActions}}}}_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,urlUtil=urlUtil&&Object.prototype.hasOwnProperty.call(urlUtil,"default")?urlUtil["default"]:urlUtil,configHelper=configHelper&&Object.prototype.hasOwnProperty.call(configHelper,"default")?configHelper["default"]:configHelper;var _defaults={bootstrap:{serviceController:"Runner",serviceExtension:"taoQtiTest"}},_entries={testDefinition:!0,testCompilation:!0,serviceCallId:!0,bootstrap:!1,timeout:!1};return configFactory}),define("taoQtiTest/runner/config/states",[],function(){"use strict";var states={testSession:Object.freeze({initial:0,interacting:1,modalFeedback:2,suspended:3,closed:4}),itemSession:Object.freeze({initial:0,interacting:1,modalFeedback:2,suspended:3,closed:4,solution:5,notSelected:255})};return states}),define("taoQtiTest/runner/helpers/currentItem",["lodash"],function(_){"use strict";_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_;var responseCardinalities={single:"base",multiple:"list",ordered:"list",record:"record"},interactionMinConstraintProperties={matchInteraction:"minAssociations",choiceInteraction:"minChoices",orderInteraction:"minChoices",associateInteraction:"minAssociations",hottextInteraction:"minChoices",hotspotInteraction:"minChoices",graphicOrderInteraction:"minChoices",graphicAssociateInteraction:"minAssociations",selectPointInteraction:"minChoices"},currentItemHelper={getDeclarations:function getDeclarations(runner){var itemRunner=runner.itemRunner;return itemRunner._item&&itemRunner._item.responses},getResponseDeclaration:function getResponseDeclaration(runner,identifier){var found=null;return _.forEach(currentItemHelper.getDeclarations(runner),function(declaration){var attributes=declaration.attributes||{};if(attributes.identifier===identifier)return found=declaration,!1}),found},toResponse:function toResponse(value,baseType,cardinality){var mappedCardinality=responseCardinalities[cardinality],response={};(_.isString(value)||_.isNumber(value))&&(value=[value]);let transform=v=>v;return"boolean"===baseType?transform=v=>!0===v||"true"===v:"integer"===baseType?transform=v=>"number"==typeof v?v:parseInt(v):"float"===baseType?transform=v=>"number"==typeof v?v:parseFloat(v):("directedPair"==baseType||"pair"==baseType)&&(transform=v=>_.isString(v)?v.split(" "):v),value=_.map(value||[],transform),mappedCardinality&&("base"===mappedCardinality?0===value.length?response.base=null:(response.base={},response.base[baseType]=value[0]):(response[mappedCardinality]={},response[mappedCardinality][baseType]=value)),response},isQtiValueNull:function isQtiValueNull(value,baseType,cardinality){var mappedCardinality=responseCardinalities[cardinality];_.isObject(value)&&null===value[mappedCardinality]&&(value=null),_.isObject(value)&&value[mappedCardinality]&&"undefined"!=typeof value[mappedCardinality][baseType]&&(value=value[mappedCardinality][baseType]);const stringyValue="string"===baseType||"integer"===baseType||"float"===baseType;return null===value||stringyValue&&""===value||"single"!==cardinality&&_.isEmpty(value)},isQuestionAnswered:function isQuestionAnswered(response,baseType,cardinality,defaultValue,constraintValue){var fullyAnswered=!0,answered,currentCardinality,responses;return defaultValue=_.isUndefined(defaultValue)?null:defaultValue,constraintValue=constraintValue||0,currentItemHelper.isQtiValueNull(response,baseType,cardinality)?answered=!1:(answered=!_.isEqual(response,currentItemHelper.toResponse(defaultValue,baseType,cardinality)),0!==constraintValue&&(currentCardinality=responseCardinalities[cardinality],responses=response[currentCardinality][baseType]||[],fullyAnswered=responses&&responses.length>=constraintValue),answered=answered&&fullyAnswered),answered},guessInteractionConstraintValues:function guessInteractionConstraintValues(runner){var itemRunner=runner.itemRunner,itemBody=itemRunner._item&&itemRunner._item.bdy||{},interactions=itemBody.elements||{},constraintValues={};return _.forEach(interactions,function(interaction){var attributes=interaction.attributes||{},qtiClass=interaction.__proto__.qtiClass,constraintProperty;Object.prototype.hasOwnProperty.call(interactionMinConstraintProperties,qtiClass)&&(constraintProperty=interactionMinConstraintProperties[qtiClass],constraintValues[attributes.responseIdentifier]=attributes[constraintProperty])}),constraintValues},isAnswered:function isAnswered(runner,partially){var itemRunner=runner.itemRunner,responses=itemRunner&&itemRunner.getResponses(),count=0,empty=0,declarations,constraintValues;return itemRunner&&(declarations=currentItemHelper.getDeclarations(runner),constraintValues=currentItemHelper.guessInteractionConstraintValues(runner),_.forEach(declarations,function(declaration){var attributes=declaration.attributes||{},response=responses[attributes.identifier],baseType=attributes.baseType,cardinality=attributes.cardinality;count++,currentItemHelper.isQuestionAnswered(response,baseType,cardinality,declaration.defaultValue,constraintValues[attributes.identifier])||empty++})),!1===partially?0val.attributes?val.attributes.href:null)},getTextStimuliHrefs:function getTextStimuliHrefs(runner){var stimuli=this.getStimuliHrefs(runner),textStimuli;return 0{0elt.replace(taoPrefix,"").replace(/[-_\s]/g,"").toLowerCase();return categories.some(itemCategory=>normalize(itemCategory)===normalize(category))}return!1},getTestStats:function getTestStats(map){return map&&map.stats},getPartStats:function getPartStats(map,partName){var part=this.getPart(map,partName);return part&&part.stats},getSectionStats:function getSectionStats(map,sectionName){var section=this.getSection(map,sectionName);return section&§ion.stats},getScopeStats:function getScopeStats(map,position,scope){var jump=this.getJump(map,position);switch(scope){case"section":case"testSection":return this.getSectionStats(map,jump&&jump.section);case"part":case"testPart":return this.getPartStats(map,jump&&jump.part);case"testWithoutInaccessibleItems":{const testStats=this.getTestStats(map),{position:currentPartPosition,isLinear:isCurrentPartLinear}=this.getPart(map,jump&&jump.part),parts=Object.values(this.getParts(map)).filter(_ref=>{let{position:partPosition}=_ref;return partPositionb-a),linearPartIndex=isCurrentPartLinear?0:parts.findIndex(_ref2=>{let{isLinear}=_ref2;return isLinear});if(-1===linearPartIndex)return testStats;const inaccessibleParts=parts.slice(linearPartIndex),countOfInaccessibleUnasweredQestions=inaccessibleParts.reduce((acc,_ref3)=>{let{stats:{questions,answered}}=_ref3;return acc+(questions-answered)},0),countOfInaccessibleFlaggedQestions=inaccessibleParts.reduce((acc,_ref4)=>{let{stats:{flagged}}=_ref4;return acc+flagged},0);return Object.assign({},testStats,{answered:testStats.answered+countOfInaccessibleUnasweredQestions,flagged:testStats.flagged-countOfInaccessibleFlaggedQestions})}default:case"test":return this.getTestStats(map)}},getScopeMap:function getScopeMap(map,position,scope){var scopeMap=_.cloneDeep(map||{}),jump=this.getJump(scopeMap,position),part=this.getPart(scopeMap,jump&&jump.part),section=this.getSection(scopeMap,jump&&jump.section);return scope&&"test"!==scope&&(scopeMap.parts={},part&&(scopeMap.parts[jump.part]=part)),part&&("section"===scope||"testSection"===scope)&&(part.sections={},section&&(part.sections[jump.section]=section)),section&&(section.stats=this.computeItemStats(section.items)),part&&(part.stats=this.computeStats(part.sections)),scopeMap.stats=this.computeStats(scopeMap.parts),scopeMap},getScopeMapFromContext:function getScopeMapFromContext(map,context,scope){var scopeMap=_.cloneDeep(map||{}),part,section;return context&&context.testPartId&&(part=this.getPart(scopeMap,context.testPartId)),context&&context.sectionId&&(section=this.getSection(scopeMap,context.sectionId)),scope&&"test"!==scope&&(scopeMap.parts={},part&&(scopeMap.parts[context.testPartId]=part)),part&&("section"===scope||"testSection"===scope)&&(part.sections={},section&&(part.sections[context.sectionId]=section)),section&&(section.stats=this.computeItemStats(section.items)),part&&(part.stats=this.computeStats(part.sections)),scopeMap.stats=this.computeStats(scopeMap.parts),scopeMap},getItemPart:function getItemPart(map,position){var jump=this.getJump(map,position);return this.getPart(map,jump&&jump.part)},getItemSection:function getItemSection(map,position){var jump=this.getJump(map,position),part=this.getPart(map,jump&&jump.part),sections=part&&part.sections;return sections&§ions[jump&&jump.section]},getItemAt:function getItemAt(map,position){var jump=this.getJump(map,position),part=this.getPart(map,jump&&jump.part),sections=part&&part.sections,section=sections&§ions[jump&&jump.section],items=section&§ion.items;return items&&items[jump&&jump.identifier]},getItemIdentifier:function getItemIdentifier(map,position){var item;return item=_.isFinite(position)?this.getItemAt(map,position):this.getItem(map,position),item&&item.id},each:function each(map,callback){return _.isFunction(callback)&&_.forEach(map&&map.parts,function(part){_.forEach(part&&part.sections,function(section){_.forEach(section&§ion.items,function(item){callback(item,section,part,map)})})}),map},updateItemStats:function updateItemStats(map,position){var jump=this.getJump(map,position),part=this.getPart(map,jump&&jump.part),sections=part&&part.sections,section=sections&§ions[jump&&jump.section];return section&&(section.stats=this.computeItemStats(section.items)),part&&(part.stats=this.computeStats(part.sections)),map&&(map.stats=this.computeStats(map.parts)),map},computeItemStats:function computeItemStats(items){return _.reduce(items,function accStats(acc,item){return item.informational||(acc.questions++,item.answered&&acc.answered++,item.viewed&&acc.questionsViewed++),item.flagged&&acc.flagged++,item.viewed&&acc.viewed++,acc.total++,acc},getEmptyStats())},computeStats:function computeStats(collection){return _.reduce(collection,function accStats(acc,item){return acc.questions+=item.stats.questions,acc.answered+=item.stats.answered,acc.flagged+=item.stats.flagged,acc.viewed+=item.stats.viewed,acc.total+=item.stats.total,acc.questionsViewed+=item.stats.questionsViewed,acc},getEmptyStats())},patch:function patch(currentMap,partialMap){var self=this,targetMap;if(!_.isPlainObject(partialMap)||!partialMap.parts)throw new TypeError("Invalid test map format");return currentMap&&"test"!==partialMap.scope?(targetMap=_.cloneDeep(currentMap),_.forEach(partialMap.parts,function(partialPart,targetPartId){"part"===partialMap.scope&&(targetMap.parts[targetPartId]=_.cloneDeep(partialPart)),"section"===partialMap.scope&&_.forEach(partialPart.sections,function(partialSection,targetSectionId){targetMap.parts[targetPartId].sections[targetSectionId]=_.cloneDeep(partialSection),targetMap.parts[targetPartId].sections[targetSectionId].stats=self.computeItemStats(targetMap.parts[targetPartId].sections[targetSectionId].items)}),targetMap.parts[targetPartId].stats=self.computeStats(targetMap.parts[targetPartId].sections)}),targetMap.stats=this.computeStats(targetMap.parts)):targetMap=_.cloneDeep(partialMap),targetMap=this.reindex(targetMap),targetMap},reindex:function reindex(map){var offset=0,offsetPart=0,offsetSection=0,lastPartId,lastSectionId;if(!_.isPlainObject(map)||!map.parts)throw new TypeError("Invalid test map format");return map.jumps=[],_.sortBy(map&&map.parts,"position").forEach(function(part){_.sortBy(part&&part.sections,"position").forEach(function(section){_.sortBy(section&§ion.items,"position").forEach(function(item){lastPartId!==part.id&&(offsetPart=0,lastPartId=part.id,part.position=offset),lastSectionId!==section.id&&(offsetSection=0,lastSectionId=section.id,section.position=offset),item.position=offset,item.index=offsetSection+1,item.positionInPart=offsetPart,item.positionInSection=offsetSection,map.jumps[offset]={identifier:item.id,section:section.id,part:part.id,position:offset},offset++,offsetSection++,offsetPart++})})}),map},createJumpTable:function createJumpTable(map){if(!_.isPlainObject(map)||!map.parts)throw new TypeError("Invalid test map format");return map.jumps=[],this.each(map,function(item,section,part){var offset=item.position;map.jumps[offset]={identifier:item.id,section:section.id,part:part.id,position:offset}}),map}};return map}),define("taoQtiTest/runner/helpers/isReviewPanelEnabled",["taoQtiTest/runner/helpers/map"],function(mapHelper){"use strict";function isReviewPanelEnabled(runner){const reviewEnabled=mapHelper.hasItemCategory(runner.getTestMap(),runner.getTestContext().itemIdentifier,"reviewScreen",!0),itemReviewEnabled=runner.getOptions().review.enabled;return reviewEnabled&&itemReviewEnabled}return mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper,isReviewPanelEnabled}),define("taoQtiTest/runner/helpers/stats",["lodash","taoQtiTest/runner/helpers/map","taoQtiTest/runner/helpers/currentItem"],function(_,mapHelper,currentItemHelper){"use strict";_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper,currentItemHelper=currentItemHelper&&Object.prototype.hasOwnProperty.call(currentItemHelper,"default")?currentItemHelper["default"]:currentItemHelper;var stats={getInstantStats(scope,runner,sync){const map=runner.getTestMap(),context=runner.getTestContext(),item=runner.getCurrentItem(),testPart=runner.getCurrentPart(),stats=_.clone(mapHelper.getScopeStats(map,context.itemPosition,scope)),options=runner.getOptions()||{};let partiallyAnsweredIsAnswered;if(options.review&&(partiallyAnsweredIsAnswered=options.review.partiallyAnsweredIsAnswered),!item.informational){const isItemCurrentlyAnswered=currentItemHelper.isAnswered(runner,partiallyAnsweredIsAnswered);!isItemCurrentlyAnswered&&item.answered?stats.answered--:(isItemCurrentlyAnswered||sync)&&!item.answered?stats.answered++:sync&&!isItemCurrentlyAnswered&&item.answered&&testPart.isLinear&&stats.answered++}return stats}};return stats}),define("taoQtiTest/runner/helpers/messages",["i18n","taoQtiTest/runner/helpers/stats","handlebars","lib/handlebars/helpers"],function(__,statsHelper,Handlebars,Helpers0){"use strict";function messageHeaderTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}function getExitMessage(scope,runner){let message=2

    ",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var functionType="function",escapeExpression=this.escapeExpression,self=this,stack1;return stack1=helpers["if"].call(depth0,depth0&&depth0.header,{hash:{},inverse:self.noop,fn:self.program(1,program1,data),data:data}),stack1||0===stack1?stack1:""}),messages={getExitMessage:getExitMessage};return messages}),define("taoQtiTest/runner/helpers/navigation",["lodash","taoQtiTest/runner/helpers/map"],function(_,mapHelper){"use strict";_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper;var navigationHelper={isLeavingSection:function isLeavingSection(testContext,testMap,direction,scope,position){var section,sectionStats,nbItems,item;if(_.isPlainObject(testContext)&&_.isPlainObject(testMap)&&!_.isEmpty(testContext.sectionId)&&!_.isEmpty(testContext.itemIdentifier))return section=mapHelper.getSection(testMap,testContext.sectionId),sectionStats=mapHelper.getSectionStats(testMap,testContext.sectionId),nbItems=sectionStats&§ionStats.total,item=mapHelper.getItem(testMap,testContext.itemIdentifier),"section"===scope||"testPart"===scope||"next"===direction&&item.positionInSection+1===nbItems||"previous"===direction&&0===item.positionInSection||"jump"===direction&&0=section.position+nbItems);throw new TypeError("Invalid test context and test map")},isLeavingTestPart:function isLeavingTestPart(testContext,testMap,direction,scope,position){var testPart,testPartStats,nbItems,item,section,sectionStats;if(_.isPlainObject(testContext)&&_.isPlainObject(testMap)&&!_.isEmpty(testContext.testPartId)&&!_.isEmpty(testContext.sectionId)&&!_.isEmpty(testContext.itemIdentifier))return testPart=mapHelper.getPart(testMap,testContext.testPartId),testPartStats=mapHelper.getPartStats(testMap,testContext.testPartId),nbItems=testPartStats&&testPartStats.total,item=mapHelper.getItem(testMap,testContext.itemIdentifier),"section"===scope&&(section=mapHelper.getSection(testMap,testContext.sectionId),sectionStats=mapHelper.getSectionStats(testMap,testContext.sectionId)),"testPart"===scope||"next"===direction&&"item"===scope&&item.positionInPart+1===nbItems||"next"===direction&&"section"===scope&§ion.position+sectionStats.total>=nbItems||"previous"===direction&&"item"===scope&&0===item.positionInPart||"previous"===direction&&"section"===scope&§ion.position===testPart.position||"jump"===direction&&0=testPart.position+nbItems);throw new TypeError("Invalid test context and test map")},isLast:function isLast(testMap,itemIdentifier){return this.isLastOf(testMap,itemIdentifier,"test")},isFirst:function isFirst(testMap,itemIdentifier){return this.isFirstOf(testMap,itemIdentifier,"test")},isLastOf:function isLastOf(testMap,itemIdentifier,scope){var item,stats;if(!_.isPlainObject(testMap))throw new TypeError("Invalid test map");if(_.isEmpty(itemIdentifier))throw new TypeError("Invalid item identifier");if(scope=scope||"test",item=mapHelper.getItem(testMap,itemIdentifier),stats=mapHelper.getScopeStats(testMap,item.position,scope),stats&&_.isNumber(stats.total)){if("test"===scope)return item.position+1===stats.total;if("section"===scope||"assessmentSection"===scope||"testSection"===scope)return item.positionInSection+1===stats.total;if("part"===scope||"testPart"===scope)return item.positionInPart+1===stats.total}return!1},isFirstOf:function isFirstOf(testMap,itemIdentifier,scope){var item;if(!_.isPlainObject(testMap))throw new TypeError("Invalid test map");if(_.isEmpty(itemIdentifier))throw new TypeError("Invalid item identifier");return scope=scope||"test",item=mapHelper.getItem(testMap,itemIdentifier),"test"===scope?0===item.position:"section"===scope||"assessmentSection"===scope||"testSection"===scope?0===item.positionInSection:("part"===scope||"testPart"===scope)&&0===item.positionInPart},getSiblingItems:function getSiblingItems(testMap,itemPosition,direction,size){var itemId=mapHelper.getItemIdentifier(testMap,itemPosition),previous=null,siblings=[],itemChain=_.reduce(testMap&&testMap.jumps,function(map,jump){var ref=jump.identifier;return previous&&(map[previous].next=ref),map[ref]={identifier:ref,previous:previous,next:null},previous=ref,map},{}),directions;return size=_.isFinite(size)?parseInt(size,10):3,directions=direction&&"both"!==direction?[direction]:["previous","next"],_.forEach(directions,function walkDirection(link){var id=itemId;_.times(size,function getNeighbor(){return id=itemChain[id]&&itemChain[id][link],!!id&&void siblings.push(mapHelper.getItem(testMap,id))})}),siblings},getNextItem:function getNextItem(testMap,itemPosition){var siblings=navigationHelper.getSiblingItems(testMap,itemPosition,"next",1);return siblings.length?siblings[0]:null},getPreviousItem:function getPreviousItem(testMap,itemPosition){var siblings=navigationHelper.getSiblingItems(testMap,itemPosition,"previous",1);return siblings.length?siblings[0]:null},isMovingToNextItem:function isMovingToNextItem(action,params){return params=params||{},"timeout"===action||"skip"===action||"move"===action&&"next"===params.direction&&"item"===params.scope},isMovingToPreviousItem:function isMovingToPreviousItem(action,params){return params=params||{},"move"===action&&"previous"===params.direction&&"item"===params.scope},isJumpingToItem:function isJumpingToItem(action,params){return params=params||{},"move"===action&&"jump"===params.direction&&"item"===params.scope}};return navigationHelper}),define("taoQtiTest/runner/helpers/offlineErrorHelper",["lodash","i18n"],function(_,__){"use strict";_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__;var offlineErrorHelper={buildErrorFromContext:function buildErrorFromContext(errorData,context){var err=_.assign(new Error(errorData.message),errorData.data);return _.assign(err,context||{})},getOfflineNavError:function getOfflineNavError(){return{message:__("We are unable to connect to the server to retrieve the next item."),data:{success:!1,source:"navigator",purpose:"proxy",type:"nav",code:404}}},getOfflineExitError:function getOfflineExitError(){return{message:__("We are unable to connect the server to submit your results."),data:{success:!1,source:"navigator",purpose:"proxy",type:"finish",code:404}}},getOfflinePauseError:function getOfflinePauseError(){return{message:__("The test has been paused, we are unable to connect to the server."),data:{success:!1,source:"navigator",purpose:"proxy",type:"pause",code:404}}}};return offlineErrorHelper}),define("taoQtiTest/runner/helpers/offlineSyncModal",["jquery","i18n","core/polling","ui/hider","ui/waitingDialog/waitingDialog","handlebars","lib/handlebars/helpers","util/shortcut/registry","util/shortcut"],function($$1,__,polling,hider,waitingDialogFactory,Handlebars,Helpers0,shortcutRegistry,globalShortcut){"use strict";function offlineSyncModalCountdownTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}function offlineSyncModalWaitContentTpl(data,options,asString){var html=Template$1(data,options);return asString||!0?html:$(html)}function offlineSyncModalFactory(proxy){const waitingConfig={message:__("You are currently working offline."),waitContent:offlineSyncModalWaitContentTpl(),proceedContent:__("Your connection seems to be back, please proceed."),proceedButtonText:__("PROCEED & END ASSESSMENT"),showSecondary:!0,secondaryButtonText:__("Download"),secondaryButtonIcon:"download",buttonSeparatorText:__("or"),width:"600px"};let $secondaryButton;const betweenButtonTextSelector=".between-buttons-text",secondaryButtonWait=60;let delaySec;const $countdown=$$1(offlineSyncModalCountdownTpl());let countdownPolling;const dialogShortcut=shortcutRegistry($$1("body"),{propagate:!1,prevent:!0});dialogShortcut.disable().set("Tab Shift+Tab");const waitingDialog=waitingDialogFactory(waitingConfig),getDialogEl=selector=>waitingDialog.dialog.getDom().find(selector);return waitingDialog.on("render",()=>{delaySec=secondaryButtonWait,$secondaryButton=getDialogEl("button[data-control=\"secondary\"]"),$countdown.insertAfter($secondaryButton),proxy.after("reconnect.waiting",()=>{waitingDialog.endWait(),hider.hide(getDialogEl("p.message"))}),proxy.before("disconnect.waiting",()=>{waitingDialog.dialog.show(),waitingDialog.beginWait()}),waitingDialog.is("waiting")&&waitingDialog.trigger("begincountdown"),globalShortcut.disable(),dialogShortcut.enable()}).on("destroy",()=>{proxy.off(".waiting"),globalShortcut.enable(),dialogShortcut.disable(),dialogShortcut.clear()}).on("wait",()=>{hider.show(getDialogEl(betweenButtonTextSelector)),hider.show(getDialogEl("p.message")),waitingDialog.is("rendered")&&waitingDialog.trigger("begincountdown")}).on("begincountdown",()=>{$secondaryButton.prop("disabled",!0),countdownPolling=polling({action:function countdownAction(){delaySec--,$countdown.html(__("The download will be available in %d seconds",delaySec)),1>delaySec&&(this.stop(),$secondaryButton.removeProp("disabled"),$countdown.html(""))},interval:1e3,autoStart:!0})}).on("unwait",()=>{countdownPolling.stop(),$secondaryButton.prop("disabled",!0),$countdown.html(""),hider.hide(getDialogEl(betweenButtonTextSelector))}),waitingDialog}$$1=$$1&&Object.prototype.hasOwnProperty.call($$1,"default")?$$1["default"]:$$1,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,polling=polling&&Object.prototype.hasOwnProperty.call(polling,"default")?polling["default"]:polling,hider=hider&&Object.prototype.hasOwnProperty.call(hider,"default")?hider["default"]:hider,waitingDialogFactory=waitingDialogFactory&&Object.prototype.hasOwnProperty.call(waitingDialogFactory,"default")?waitingDialogFactory["default"]:waitingDialogFactory,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,shortcutRegistry=shortcutRegistry&&Object.prototype.hasOwnProperty.call(shortcutRegistry,"default")?shortcutRegistry["default"]:shortcutRegistry,globalShortcut=globalShortcut&&Object.prototype.hasOwnProperty.call(globalShortcut,"default")?globalShortcut["default"]:globalShortcut,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){return this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),"

    \n"});Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template$1=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",helperMissing=helpers.helperMissing,escapeExpression=this.escapeExpression,helper,options;return buffer+="
    \n

    "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"It is not possible to save your responses while working offline.",options):helperMissing.call(depth0,"__","It is not possible to save your responses while working offline.",options)))+"

    \n

    "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Option A",options):helperMissing.call(depth0,"__","Option A",options)))+"

    \n
      \n
    • "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Wait for your connection to come back online.",options):helperMissing.call(depth0,"__","Wait for your connection to come back online.",options)))+"
    • \n
    • "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Try connecting the machine to the internet via cable, or move to an area with a better wifi signal.",options):helperMissing.call(depth0,"__","Try connecting the machine to the internet via cable, or move to an area with a better wifi signal.",options)))+"
    • \n
    • "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"If the connection cannot be restored, see option B.",options):helperMissing.call(depth0,"__","If the connection cannot be restored, see option B.",options)))+"
    • \n
    \n

    "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Option B",options):helperMissing.call(depth0,"__","Option B",options)))+"

    \n
      \n
    • "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Download the pupil responses and submit manually.",options):helperMissing.call(depth0,"__","Download the pupil responses and submit manually.",options)))+"
    • \n
    \n

    "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Step 1: Download the file (see below when available).",options):helperMissing.call(depth0,"__","Step 1: Download the file (see below when available).",options)))+" "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Do not rename it.",options):helperMissing.call(depth0,"__","Do not rename it.",options)))+"

    \n

    "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Step 2: When you are online again, please send the downloaded file to receptionbaseline@nfer.ac.uk together with the ",options):helperMissing.call(depth0,"__","Step 2: When you are online again, please send the downloaded file to receptionbaseline@nfer.ac.uk together with the ",options)))+"\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"name of the pupil",options):helperMissing.call(depth0,"__","name of the pupil",options)))+" "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"and",options):helperMissing.call(depth0,"__","and",options)))+" "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"the assessment (LCL or Mathematics)",options):helperMissing.call(depth0,"__","the assessment (LCL or Mathematics)",options)))+" "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"that was being taken.",options):helperMissing.call(depth0,"__","that was being taken.",options)))+"\n

    \n

    "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Step 3: Once you have downloaded the file you can close the browser window. Do not do anything further with the assessment whilst it shows as \"in progress\"; the status will be updated once the helpline has uploaded the file.",options):helperMissing.call(depth0,"__","Step 3: Once you have downloaded the file you can close the browser window. Do not do anything further with the assessment whilst it shows as \"in progress\"; the status will be updated once the helpline has uploaded the file.",options)))+"

    \n
    \n

    "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"If you need help, please contact our Helpline on 0330 088 4171.",options):helperMissing.call(depth0,"__","If you need help, please contact our Helpline on 0330 088 4171.",options)))+"

    \n
    ",buffer});return offlineSyncModalFactory}),define("taoQtiTest/runner/helpers/testContextBuilder",["lodash","util/capitalize","taoQtiTest/runner/helpers/map","taoQtiTest/runner/helpers/navigation"],function(_,capitalize,mapHelper,navigationHelper){"use strict";function buildTestContextFromPosition(testContext,testMap,position,attempt){var updatedMap=mapHelper.updateItemStats(testMap,position),item=mapHelper.getItemAt(updatedMap,position),section=mapHelper.getItemSection(updatedMap,position),part=mapHelper.getItemPart(updatedMap,position);return!!item&&getTestContext(testContext,testMap,item,section,part,position,attempt)}function buildTestContextFromJump(testContext,testMap,jump,attempt){var part=testMap.parts[jump.part],section=part.sections[jump.section],item=section.items[jump.item];return getTestContext(testContext,testMap,item,section,part,jump.position,attempt)}function getTestContext(testContext,testMap,item,section,part,position,attempt){var _Mathmax=Math.max,isLeavingSection=section.id!==testContext.sectionId,isLeavingPart=part.id!==testContext.testPartId,newTestContext=_.defaults({itemIdentifier:item.id,itemPosition:position,remainingAttempts:_Mathmax(-1,item.remainingAttempts-1),sectionId:section.id,sectionTitle:section.label,testPartId:part.id,canMoveBackward:!part.isLinear&&!navigationHelper.isFirst(testMap,item.id)},testContext);return attempt&&(newTestContext.attempt=attempt+1),isLeavingSection&&(newTestContext.numberRubrics=0,newTestContext.rubrics=""),newTestContext.timeConstraints=_.reject(testContext.timeConstraints,function(constraint){return"assessmentItemRef"===constraint.qtiClassName||isLeavingSection&&"assessmentSection"===constraint.qtiClassName||isLeavingPart&&"testPart"===constraint.qtiClassName}),item.timeConstraint&&newTestContext.timeConstraints.push(item.timeConstraint),isLeavingSection&§ion.timeConstraint&&newTestContext.timeConstraints.push(section.timeConstraint),isLeavingPart&&part.timeConstraint&&newTestContext.timeConstraints.push(part.timeConstraint),newTestContext.options=_.defaults(getOptionsFromCategories(item.categories||[]),_.pick(testContext.options,["allowComment","allowSkipping","exitButton","logoutButton"])),newTestContext}function getOptionsFromCategories(categories){return _.isArray(categories)&&categories.length?_.reduce(categories,function(acc,category){var categoryName;return _.isString(category)&&!_.isEmpty(category)&&(categoryName=category.replace("x-tao-option-","").split(/[-_]+/g).map(function(name,index){return 0===index?name:name.length?capitalize(name):""}).join(""),categoryName&&(acc[categoryName]=!0)),acc},{}):{}}_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,capitalize=capitalize&&Object.prototype.hasOwnProperty.call(capitalize,"default")?capitalize["default"]:capitalize,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper,navigationHelper=navigationHelper&&Object.prototype.hasOwnProperty.call(navigationHelper,"default")?navigationHelper["default"]:navigationHelper;var testContextBuilder={buildTestContextFromPosition:buildTestContextFromPosition,buildTestContextFromJump:buildTestContextFromJump};return testContextBuilder}),define("taoQtiTest/runner/navigator/navigator",["lodash","taoQtiTest/runner/helpers/map","taoQtiTest/runner/helpers/testContextBuilder"],function(_,mapHelper,testContextBuilder){"use strict";_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper,testContextBuilder=testContextBuilder&&Object.prototype.hasOwnProperty.call(testContextBuilder,"default")?testContextBuilder["default"]:testContextBuilder;var navigatorFactory=function navigatorFactory(testContext,testMap){if(![testContext,testMap].every(_.isPlainObject))throw new TypeError("The navigator must be built with a testData, a testContext and a testMap");return{navigate:function navigate(direction,scope,position){var methodName=direction.toLowerCase()+scope.substr(0,1).toUpperCase()+scope.substr(1).toLowerCase();if(_.isFunction(this[methodName]))return this[methodName](position)},nextItem:function nextItem(){return testContextBuilder.buildTestContextFromPosition(testContext,testMap,testContext.itemPosition+1)},previousItem:function previsousItem(){return testContextBuilder.buildTestContextFromPosition(testContext,testMap,testContext.itemPosition-1)},nextSection:function nextSection(){var sectionStats=mapHelper.getSectionStats(testMap,testContext.sectionId),section=mapHelper.getSection(testMap,testContext.sectionId);return testContextBuilder.buildTestContextFromPosition(testContext,testMap,section.position+sectionStats.total)},jumpItem:function jumpItem(position){return testContextBuilder.buildTestContextFromPosition(testContext,testMap,position)}}};return navigatorFactory}),define("taoQtiTest/runner/branchRule/helpers/branchRuleHelper",["lodash"],function(_){"use strict";function evaluateSubBranchRules(branchRuleDefinition,item,navigationParams,branchRuleMapper,responseStore){return new Promise(function(resolve,reject){var subBranchRuleResults=[],promises=[];branchRuleDefinition=_.omit(branchRuleDefinition,["@attributes"]),promises=_.map(branchRuleDefinition,function(subBranchRule,subBranchRuleName){return branchRuleMapper(subBranchRuleName,branchRuleDefinition[subBranchRuleName],item,navigationParams,responseStore).validate()}),Promise.all(promises).then(function(results){_.forEach(results,function(subBranchRuleResult){Array.isArray(subBranchRuleResult)?subBranchRuleResult.forEach(function(value){subBranchRuleResults.push(value)}):subBranchRuleResults.push(subBranchRuleResult)}),resolve(subBranchRuleResults)}).catch(function(err){reject(err)})})}_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_;var branchRuleHelper={evaluateSubBranchRules:evaluateSubBranchRules};return branchRuleHelper}),define("taoQtiTest/runner/branchRule/types/match",[],function(){"use strict";function matchBranchRuleFactory(branchRuleDefinition,item,navigationParams,branchRuleMapper,responseStore){var variableIdentifier=branchRuleDefinition.variable["@attributes"].identifier,correctIdentifier=branchRuleDefinition.correct["@attributes"].identifier;return{validate:function validate(){return Promise.all([responseStore.getCorrectResponse(correctIdentifier),responseStore.getResponse(variableIdentifier)]).then(function(result){return result[0].includes(result[1])})}}}return matchBranchRuleFactory}),define("taoQtiTest/runner/branchRule/types/or",["taoQtiTest/runner/branchRule/helpers/branchRuleHelper"],function(branchRuleHelper){"use strict";function orBranchRuleFactory(branchRuleDefinition,item,navigationParams,branchRuleMapper,responseStore){return{validate:function validate(){return branchRuleHelper.evaluateSubBranchRules(branchRuleDefinition,item,navigationParams,branchRuleMapper,responseStore).then(function(subBranchRuleResults){return subBranchRuleResults.some(function(value){return value})})}}}return branchRuleHelper=branchRuleHelper&&Object.prototype.hasOwnProperty.call(branchRuleHelper,"default")?branchRuleHelper["default"]:branchRuleHelper,orBranchRuleFactory}),define("taoQtiTest/runner/branchRule/types/and",["taoQtiTest/runner/branchRule/helpers/branchRuleHelper"],function(branchRuleHelper){"use strict";function andBranchRuleFactory(branchRuleDefinition,item,navigationParams,branchRuleMapper,responseStore){return{validate:function validate(){return branchRuleHelper.evaluateSubBranchRules(branchRuleDefinition,item,navigationParams,branchRuleMapper,responseStore).then(function(subBranchRuleResults){return subBranchRuleResults.every(function(value){return value})})}}}return branchRuleHelper=branchRuleHelper&&Object.prototype.hasOwnProperty.call(branchRuleHelper,"default")?branchRuleHelper["default"]:branchRuleHelper,andBranchRuleFactory}),define("taoQtiTest/runner/branchRule/types/not",["lodash"],function(_){"use strict";function notBranchRuleFactory(branchRuleDefinition,item,navigationParams,branchRuleMapper,responseStore){return Array.isArray(branchRuleDefinition)||(branchRuleDefinition=[branchRuleDefinition]),{validate:function validate(){var promises=branchRuleDefinition.map(function(expression){var subBranchRuleName=_.head(_.keys(expression)),subBranchRuleDefinition=expression[subBranchRuleName];return branchRuleMapper(subBranchRuleName,subBranchRuleDefinition,item,navigationParams,responseStore).validate()});return Promise.all(promises).then(function(results){return _.map(results,function(result){return!result})})}}}return _=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,notBranchRuleFactory}),define("taoQtiTest/runner/branchRule/branchRuleMapper",["taoQtiTest/runner/branchRule/types/match","taoQtiTest/runner/branchRule/types/or","taoQtiTest/runner/branchRule/types/and","taoQtiTest/runner/branchRule/types/not"],function(matchBranchRule,orBranchRule,andBranchRule,notBranchRule){"use strict";function branchRuleMapperFactory(branchRuleName,branchRuleDefinition,item,navigationParams,responseStore){if(!(branchRuleName in branchRuleMap))throw new Error(`Invalid branch rule name: ${branchRuleName}`);return branchRuleMap[branchRuleName](branchRuleDefinition,item,navigationParams,branchRuleMapperFactory,responseStore)}matchBranchRule=matchBranchRule&&Object.prototype.hasOwnProperty.call(matchBranchRule,"default")?matchBranchRule["default"]:matchBranchRule,orBranchRule=orBranchRule&&Object.prototype.hasOwnProperty.call(orBranchRule,"default")?orBranchRule["default"]:orBranchRule,andBranchRule=andBranchRule&&Object.prototype.hasOwnProperty.call(andBranchRule,"default")?andBranchRule["default"]:andBranchRule,notBranchRule=notBranchRule&&Object.prototype.hasOwnProperty.call(notBranchRule,"default")?notBranchRule["default"]:notBranchRule;var branchRuleMap={match:matchBranchRule,or:orBranchRule,and:andBranchRule,not:notBranchRule};return branchRuleMapperFactory}),define("taoQtiTest/runner/branchRule/branchRule",["taoQtiTest/runner/branchRule/helpers/branchRuleHelper","taoQtiTest/runner/branchRule/branchRuleMapper"],function(branchRuleHelper,branchRuleMapper){"use strict";function branchRuleFactory(branchRuleDefinition,item,navigationParams,responseStore){return new Promise(function(resolve){var result;return"undefined"==typeof branchRuleDefinition["@attributes"]||"undefined"==typeof branchRuleDefinition["@attributes"].target?resolve(null):void branchRuleHelper.evaluateSubBranchRules(branchRuleDefinition,item,navigationParams,branchRuleMapper,responseStore).then(function(branchRuleResults){return result=branchRuleResults.every(function(branchRuleResult){return branchRuleResult}),result?resolve(branchRuleDefinition["@attributes"].target):void resolve(null)})})}return branchRuleHelper=branchRuleHelper&&Object.prototype.hasOwnProperty.call(branchRuleHelper,"default")?branchRuleHelper["default"]:branchRuleHelper,branchRuleMapper=branchRuleMapper&&Object.prototype.hasOwnProperty.call(branchRuleMapper,"default")?branchRuleMapper["default"]:branchRuleMapper,branchRuleFactory}),define("taoQtiTest/runner/services/offlineJumpTable",["lodash","taoQtiTest/runner/branchRule/branchRule","taoQtiTest/runner/helpers/map"],function(_,branchRule,mapHelper){"use strict";_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,branchRule=branchRule&&Object.prototype.hasOwnProperty.call(branchRule,"default")?branchRule["default"]:branchRule,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper;var offlineJumpTableFactory=function offlineJumpTableFactory(itemStore,responseStore){function addResponsesToResponseStore(params){params.itemResponse&&_.forEach(params.itemResponse,function(response,itemResponseIdentifier){var responseIdentifier=`${params.itemDefinition}.${itemResponseIdentifier}`;_.forEach(response,function(responseEntry){var responseId=responseEntry&&responseEntry.identifier;Array.isArray(responseId)?responseId.forEach(function(id){responseStore.addResponse(responseIdentifier,id)}):responseStore.addResponse(responseIdentifier,responseId)})})}function getItems(map){return _.uniq(_.map(getSimplifiedTestMap(map),function(row){return row.item}))}function getSections(map){return _.uniq(_.map(getSimplifiedTestMap(map),function(row){return row.section}))}function getSimplifiedTestMap(map){var simplifiedTestMap=[];return mapHelper.each(map,function(item,section,part){simplifiedTestMap.push({item:item.id,itemHasBranchRule:!_.isEmpty(item.branchRule),itemBranchRule:item.branchRule,section:section.id,sectionHasBranchRule:!_.isEmpty(section.branchRule),sectionBranchRule:section.branchRule,part:part.id,partHasBranchRule:!_.isEmpty(part.branchRule),partBranchRule:part.branchRule})}),simplifiedTestMap}var testMap={},jumpTable=[];return{setTestMap:function setTestMap(map){return testMap=map,this},buildJumpTable:function buildJumpTable(testContext){function calculateNextJump(){var lastJumpItem=self.getLastJump().item||null;return contextItemId===lastJumpItem?Promise.resolve():itemStore.get(lastJumpItem).then(function(item){const itemResponse={};return _.forEach(item.itemState,function(state,itemStateIdentifier){itemResponse[itemStateIdentifier]=state.response}),self.jumpToNextItem(Object.assign({},item,{itemResponse,itemDefinition:item.itemIdentifier})).then(calculateNextJump)})}const self=this,simplifiedTestMap=getSimplifiedTestMap(testMap),contextItemId=testContext?testContext.itemIdentifier:null,contextItemPosition=contextItemId?testContext.itemPosition:null,firstJumpItem=simplifiedTestMap[0];return firstJumpItem&&this.addJump(firstJumpItem.part,firstJumpItem.section,firstJumpItem.item),contextItemPosition?calculateNextJump():Promise.resolve()},putCorrectResponsesInStore:function putCorrectResponsesInStore(){const simplifiedTestMap=getSimplifiedTestMap(testMap),promises=[];return simplifiedTestMap.forEach(function(row){promises.push(itemStore.get(row.item).then(function(item){item&&_.forEach(item.itemData.data.responses,function(response){var responseIdentifier=`${item.itemIdentifier}.${response.identifier}`;responseStore.addCorrectResponse(responseIdentifier,response.correctResponses)})}).catch(function(err){return Promise.reject(err)}))}),Promise.all(promises)},init:function init(testContext){return this.putCorrectResponsesInStore().then(()=>this.buildJumpTable(testContext))},clearJumpTable:function clearJumpTable(){return jumpTable=[],this},addJump:function addJump(partIdentifier,sectionIdentifier,itemIdentifier){var self=this;return new Promise(function(resolve){var lastJump=self.getLastJump(),nextPosition="undefined"==typeof lastJump.position?0:lastJump.position+1;jumpTable.push({item:itemIdentifier,part:partIdentifier,section:sectionIdentifier,position:nextPosition}),resolve()})},jumpTo:function jumpTo(position){return jumpTable=jumpTable.filter(function(jump){return jump.position<=position}),this},jumpToSkipItem:function jumpToSkipItem(){var self=this;return new Promise(function(resolve){var simplifiedTestMap=getSimplifiedTestMap(testMap),lastJumpItem=self.getLastJump().item||null,items=getItems(testMap),itemSliceIndex=items.indexOf(lastJumpItem),itemIdentifierToAdd=items.slice(itemSliceIndex+1).shift(),itemToAdd=simplifiedTestMap.filter(function(row){return row.item===itemIdentifierToAdd}).shift();return itemToAdd?self.addJump(itemToAdd.part,itemToAdd.section,itemToAdd.item).then(resolve):resolve()})},jumpToNextItem:function jumpToNextItem(params){var self=this;return addResponsesToResponseStore(params),new Promise(function(resolve){var simplifiedTestMap=getSimplifiedTestMap(testMap),lastJumpItem=self.getLastJump().item||null,items=getItems(testMap),itemSliceIndex=items.indexOf(lastJumpItem),itemIdentifierToAdd=items.slice(itemSliceIndex+1).shift(),itemToAdd=simplifiedTestMap.filter(function(row){return row.item===itemIdentifierToAdd}).shift(),lastJumpItemData=simplifiedTestMap.filter(function(row){return row.item===lastJumpItem}).shift();return lastJumpItemData&&lastJumpItemData.itemHasBranchRule?itemStore.get(lastJumpItem).then(function(item){branchRule(lastJumpItemData.itemBranchRule,item,params,responseStore).then(function(itemIdentifierToAddd){null!==itemIdentifierToAddd&&(itemToAdd=simplifiedTestMap.filter(function(row){return row.item===itemIdentifierToAddd}).shift()),self.addJump(itemToAdd.part,itemToAdd.section,itemToAdd.item).then(resolve)}).catch(function(err){return Promise.reject(err)})}).catch(function(err){return Promise.reject(err)}):itemToAdd?self.addJump(itemToAdd.part,itemToAdd.section,itemToAdd.item).then(resolve):resolve()})},jumpToNextSection:function jumpToNextSection(){var self=this;return new Promise(function(resolve){var simplifiedTestMap=getSimplifiedTestMap(testMap),lastJumpSection=self.getLastJump().section||null,sections=getSections(testMap),sectionSliceIndex=sections.indexOf(lastJumpSection),sectionIdentifierToAdd=sections.slice(sectionSliceIndex+1).shift(),itemToAdd=simplifiedTestMap.filter(function(row){return row.section===sectionIdentifierToAdd}).shift();return itemToAdd?self.addJump(itemToAdd.part,itemToAdd.section,itemToAdd.item).then(resolve):resolve()})},jumpToPreviousItem:function jumpToPreviousItem(){return new Promise(function(resolve){jumpTable.pop(),resolve()})},getJumpTable:function getJumpTable(){return jumpTable},getLastJump:function getLastJump(){return 0{const newTestContext=testContextBuilder.buildTestContextFromJump(testContext,testMap,lastJump,itemFromStore.attempt);itemStore.update(newTestContext.itemIdentifier,"attempt",newTestContext.attempt).then(()=>resolve(newTestContext))})}).catch(function(err){reject(err)})})}}}return capitalize=capitalize&&Object.prototype.hasOwnProperty.call(capitalize,"default")?capitalize["default"]:capitalize,offlineJumpTableFactory=offlineJumpTableFactory&&Object.prototype.hasOwnProperty.call(offlineJumpTableFactory,"default")?offlineJumpTableFactory["default"]:offlineJumpTableFactory,testContextBuilder=testContextBuilder&&Object.prototype.hasOwnProperty.call(testContextBuilder,"default")?testContextBuilder["default"]:testContextBuilder,offlineNavigatorFactory}),define("taoQtiTest/runner/provider/dataUpdater",["lodash","taoQtiTest/runner/helpers/map","taoQtiTest/runner/config/states"],function(_,mapHelper,states){"use strict";function dataUpdaterFactory(testDataHolder){if(!testDataHolder||!_.isFunction(testDataHolder.get)||!_.isFunction(testDataHolder.set))throw new TypeError("A data holder is mandatory for the udpater");return{update:function update(dataSet){var self=this,isContextual=function isContextual(contextualData){return contextualData&&(_.isPlainObject(contextualData.testContext)||_.isPlainObject(contextualData.testData)||_.isPlainObject(contextualData.testMap))},updateData=function updateData(contextualData){var builtTestMap,updatedTestMap;contextualData&&(_.isPlainObject(contextualData.testData)&&testDataHolder.set("testData",contextualData.testData),_.isPlainObject(contextualData.testContext)&&testDataHolder.set("testContext",contextualData.testContext),_.isPlainObject(contextualData.testMap)&&(builtTestMap=self.buildTestMap(contextualData.testMap),builtTestMap&&testDataHolder.set("testMap",builtTestMap)),updatedTestMap=self.updateStats(),updatedTestMap&&testDataHolder.set("testMap",updatedTestMap))};isContextual(dataSet)?updateData(dataSet):updateData(_.findLast(dataSet,isContextual))},buildTestMap:function buildTestMap(testMap){var newMap=null;return testMap&&(testMap.scope&&"test"!==testMap.scope?newMap=mapHelper.patch(testDataHolder.get("testMap"),testMap):newMap=mapHelper.reindex(testMap)),newMap},updateStats:function updateStats(){const testMap=testDataHolder.get("testMap"),testContext=testDataHolder.get("testContext");let updatedTestMap=null;if(testMap&&testContext&&_.isNumber(testContext.itemPosition)){const item=mapHelper.getItemAt(testMap,testContext.itemPosition);if(item&&testContext.state===states.testSession.interacting){const testPart=mapHelper.getPart(testMap,testContext.testPartId);item.viewed=!0,testPart&&testPart.isLinear&&(item.answered=!0),updatedTestMap=mapHelper.updateItemStats(testMap,testContext.itemPosition)}}return updatedTestMap},updatePluginsConfig(plugins,pluginsConfig){if(!pluginsConfig){const testData=testDataHolder.get("testData");pluginsConfig=testData&&testData.config&&testData.config.plugins}plugins&&pluginsConfig&&_.forEach(pluginsConfig,(config,pluginName)=>{_.isPlainObject(plugins[pluginName])&&_.isFunction(plugins[pluginName].setConfig)&&_.isPlainObject(config)&&plugins[pluginName].setConfig(config)})}}}return _=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper,states=states&&Object.prototype.hasOwnProperty.call(states,"default")?states["default"]:states,dataUpdaterFactory}),define("taoQtiTest/runner/provider/toolStateBridge",["lodash"],function(_){"use strict";function toolStateBridgeFactory(testStore,activePlugins){var tools=[];if(!testStore||!_.isFunction(testStore.getStore))throw new TypeError("The toolStateBridge should be initialized with a testStore");if(!_.isArray(activePlugins)||!activePlugins.length)throw new TypeError("The toolStateBridge should be initialized with a the list of active plugins");return{setTools:function setTools(toolNames){return tools=_(toolNames).filter(function(toolName){return activePlugins.includes(toolName)}).map(function(toolName){return testStore.startChangeTracking(toolName),toolName}).value(),this},getTools:function getTools(){return tools},restoreState:function restoreState(toolName,toolState){return tools.includes(toolName)&&_.isPlainObject(toolState)?testStore.getStore(toolName).then(function(toolStore){return toolStore.clear().then(function(){return toolStore})}).then(function(toolStore){return Promise.all(_.map(toolState,function(value,key){return toolStore.setItem(key,value)}))}).then(function(){return testStore.resetChanges(toolName),!0}):Promise.resolve(!1)},restoreStates:function restoreStates(states){var self=this;return Promise.all(_.map(states,function(toolState,toolName){return self.restoreState(toolName,toolState).then(function(result){var formattedResult={};return formattedResult[toolName]=result,formattedResult})})).then(mergeCollection)},getState:function getState(toolName,reset){return tools.includes(toolName)&&testStore.hasChanges(toolName)?testStore.getStore(toolName).then(function(toolStore){return!1!==reset&&testStore.resetChanges(toolName),toolStore.getItems()}):Promise.resolve(!1)},getStates:function getStates(){var self=this;return Promise.all(_.map(tools,function(toolName){return self.getState(toolName).then(function(toolState){var formattedState={};return!!toolState&&(formattedState[toolName]=toolState,formattedState)})})).then(mergeCollection)}}}_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_;var mergeCollection=function mergeCollection(collection){return _.reduce(collection,function(acc,value){return value?_.merge(acc,value):acc},{})};return toolStateBridgeFactory}),define("taoQtiTest/runner/ui/toolbox/entry",["lodash","ui/component","handlebars","lib/handlebars/helpers"],function(_,componentFactory,Handlebars,Helpers0){"use strict";function entryTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}function itemComponentFactory(specs,defaults){var itemComponent;return specs=_.defaults(specs||{},itemComponentApi),itemComponent=componentFactory(specs,defaults).setTemplate(entryTpl).on("enable",function(){this.is("rendered")&&this.$component.removeProp("disabled")}).on("disable",function(){this.is("rendered")&&(this.$component.prop("disabled",!0),this.turnOff())}).on("init",function(){this.initItem()}).on("render",function(){var self=this;this.disable(),this.$component.on("mousedown",function(event){self.trigger("mousedown",event)}).on("click",function(event){self.trigger("click",event)})}),itemComponent}_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,componentFactory=componentFactory&&Object.prototype.hasOwnProperty.call(componentFactory,"default")?componentFactory["default"]:componentFactory,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var buffer="",stack1,helper;return buffer+=" ",(helper=helpers.className)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.className,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1),buffer}function program3(depth0,data){var buffer="",stack1;return buffer+="\n aria-"+escapeExpression((stack1=null==data||!1===data?data:data.key,"function"===typeof stack1?stack1.apply(depth0):stack1))+"=\""+escapeExpression("function"===typeof depth0?depth0.apply(depth0):depth0)+"\"\n ",buffer}function program5(depth0,data){var buffer="",stack1,helper;return buffer+="",buffer}function program6(depth0,data){return" no-label"}function program8(depth0,data){var buffer="",stack1,helper;return buffer+="",(helper=helpers.text)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.text,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",functionType="function",escapeExpression=this.escapeExpression,self=this,stack1,helper;return buffer+="\n \n ",stack1=helpers["if"].call(depth0,depth0&&depth0.icon,{hash:{},inverse:self.noop,fn:self.program(5,program5,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.text,{hash:{},inverse:self.noop,fn:self.program(8,program8,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n \n\n",buffer}),itemComponentApi={initItem:function initItem(){this.id=this.config.control,this.menu=null},getType:function getType(){return"entry"},getId:function getId(){return this.id},setMenuId:function setMenuId(menuId){this.menuId=menuId},getMenuId:function getMenuId(){return this.menuId},turnOn:function turnOn(){this.setState("active",!0);const element=this.getElement();element&&"option"===element.attr("role")&&element.attr("aria-selected","true").attr("aria-checked","true")},turnOff:function turnOff(){this.setState("active",!1);const element=this.getElement();element&&"option"===element.attr("role")&&element.attr("aria-selected","false").attr("aria-checked","false")},hoverOn:function hoverOn(){this.setState("hover",!0)},hoverOff:function hoverOff(){this.setState("hover",!1)}};return itemComponentFactory}),define("taoQtiTest/runner/ui/toolbox/menu",["jquery","lodash","ui/component","ui/hider","ui/stacker","handlebars","lib/handlebars/helpers"],function($$1,_,componentFactory,hider,stackerFactory,Handlebars,Helpers0){"use strict";function menuTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}function menuItemTpl(data,options,asString){var html=Template$1(data,options);return asString||!0?html:$(html)}function menuComponentFactory(specs,defaults){var _defaults,menuComponent;return _defaults={$component:$$1(),$menuButton:$$1(),$menuContainer:$$1(),$menuContent:$$1(),$menuItems:$$1(),$menuStateIcon:$$1(),hoverIndex:null,id:null,menuItems:[]},specs=_.defaults(specs||{},menuComponentApi),menuComponent=componentFactory(specs,defaults).setTemplate(menuTpl).on("enable",function enable(){this.is("rendered")&&this.$component.removeProp("disabled")}).on("disable",function disable(){this.is("rendered")&&(this.$component.prop("disabled",!0),this.closeMenu(),this.turnOff())}).on("hide",function disable(){this.is("rendered")&&this.closeMenu()}).on("init",function init(){this.initMenu()}).on("render",function render(){var self=this;this.$menuButton=this.$component.find(`[data-control="${this.config.control}-button"]`),this.$menuContainer=this.$component.find(`[data-control="${this.config.control}-menu"]`),this.$menuContent=this.$component.find(`[data-control="${this.config.control}-list"]`),this.$menuStateIcon=this.$menuButton.find(".icon-up"),this.disable(),this.$component.on("click",function toggleMenu(e){e.preventDefault(),self.is("opened")||e.stopPropagation(),self.toggleMenu()}),this.$menuContainer.on("click",function closeMenuOnItemClick(e){e.preventDefault(),e.stopPropagation(),self.closeMenu()}),this.$menuContent.on("mouseleave",this.hoverOffAll)}).on("destroy",function(){this.is("rendered")&&(this.$menuContainer.off(".menuNavigation"),this.$menuButton.off(".menuNavigation"))}),_.defaults(menuComponent,_defaults),menuComponent}$$1=$$1&&Object.prototype.hasOwnProperty.call($$1,"default")?$$1["default"]:$$1,_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,componentFactory=componentFactory&&Object.prototype.hasOwnProperty.call(componentFactory,"default")?componentFactory["default"]:componentFactory,hider=hider&&Object.prototype.hasOwnProperty.call(hider,"default")?hider["default"]:hider,stackerFactory=stackerFactory&&Object.prototype.hasOwnProperty.call(stackerFactory,"default")?stackerFactory["default"]:stackerFactory,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var buffer="",stack1,helper;return buffer+=" ",(helper=helpers.className)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.className,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1),buffer}function program3(depth0,data){var buffer="",stack1,helper;return buffer+="",buffer}function program4(depth0,data){return" no-label"}function program6(depth0,data){var buffer="",stack1,helper;return buffer+="",(helper=helpers.text)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.text,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",functionType="function",escapeExpression=this.escapeExpression,self=this,stack1,helper;return buffer+="\n \n ",stack1=helpers["if"].call(depth0,depth0&&depth0.icon,{hash:{},inverse:self.noop,fn:self.program(3,program3,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.text,{hash:{},inverse:self.noop,fn:self.program(6,program6,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n   \n \n
    \n \n
    \n\n",buffer});Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template$1=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var buffer="",stack1,helper;return buffer+=" ",(helper=helpers.className)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.className,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1),buffer}function program3(depth0,data){var buffer="",stack1,helper;return buffer+="\n role=\"",(helper=helpers.role)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.role,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\"\n ",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",functionType="function",escapeExpression=this.escapeExpression,self=this,stack1,helper;return buffer+="\n \n \n ",(helper=helpers.text)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.text,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\n \n",buffer}),keyCodes={TAB:9,ESC:27,ENTER:13,SPACE:32,LEFT:37,UP:38,RIGHT:39,DOWN:40},stacker=stackerFactory("test-runner"),menuComponentApi={initMenu:function initMenu(){this.id=this.config.control,this.navType=this.config.navType?this.config.navType:"fromLast",this.menuItems=[]},getType:function getType(){return"menu"},getId:function getId(){return this.id},turnOn:function turnOn(){this.setState("active",!0)},turnOff:function turnOff(){this.setState("active",!1)},toggleMenu:function showMenu(){this.is("disabled")||(this.is("opened")?this.closeMenu():this.openMenu())},indexOfClosestVisibleItem(inc,last){if(!this.menuItems.length)return-1;let position=this.hoverIndex,elem;do{if(position+=inc,position===last)return-1;elem=this.menuItems[position].getElement()}while(elem&&elem.hasClass("hidden"));return position},hoverByIndex(index){const elem=this.menuItems[index];return this.hoverIndex=index,elem&&this.hoverItem(elem.id),elem},hoverNextVisibleItem(){const index=this.indexOfClosestVisibleItem(1,this.menuItems.length),elem=this.hoverByIndex(index);return elem},hoverPreviousVisibleItem(){const index=this.indexOfClosestVisibleItem(-1,-1),elem=this.hoverByIndex(index);return elem},openMenu:function openMenu(){hider.show(this.$menuContainer),stacker.bringToFront(this.$menuContent),this.$menuStateIcon.removeClass("icon-up"),this.$menuStateIcon.addClass("icon-down"),this.turnOn(),this.enableShortcuts(),this.hoverOffAll(),document.activeElement&&document.activeElement.blur();const activeItemIndex=_.findIndex(this.menuItems,item=>item.is("active"));0<=activeItemIndex?(this.hoverIndex=activeItemIndex,this.$menuItems[this.hoverIndex].focus(),this.hoverItem(this.menuItems[activeItemIndex].id)):"fromLast"===this.navType?(this.hoverIndex=this.menuItems.length,this.hoverPreviousVisibleItem()):"fromFirst"===this.navType&&(this.hoverIndex=-1,this.hoverNextVisibleItem()),this.setState("opened",!0),this.trigger("openmenu",this)},closeMenu(){hider.hide(this.$menuContainer),this.$menuStateIcon.removeClass("icon-down"),this.$menuStateIcon.addClass("icon-up"),this.turnOff(),this.disableShortcuts(),this.hoverOffAll(),this.setState("opened",!1),this.trigger("closemenu",this),this.is("disabled")||this.$component.prop("disabled")||this.$menuButton.parent().focus()},getItemById:function getItemById(itemId){return _.find(this.menuItems,function(item){return item.getId()===itemId})},addItem:function addItem(item){item&&this.menuItems.push(item)},renderItems:function renderItems(){var self=this;this.menuItems.forEach(function(item){item.setTemplate(menuItemTpl),item.render(self.$menuContent),item.enable()}),this.$menuItems=this.$menuContent.find(".menu-item"),this.$menuItems.on("mouseenter",function highlightHoveredEntry(e){var itemId=e.currentTarget.getAttribute("data-control");self.mouseOverItem(itemId)})},mouseOverItem:function mouseOverItem(itemId){var self=this;this.menuItems.forEach(function(item,index){item.id===itemId&&(self.hoverIndex=index)}),this.hoverItem(itemId)},hasDisplayedItems:function hasDisplayedItems(){return this.menuItems.some(function(item){return!item.is("disabled")&&!item.is("hidden")})},turnOffAll:function turnOffAll(){this.menuItems.forEach(function(current){current.turnOff()})},enableShortcuts:function enableShortcuts(){var self=this;this.$menuContainer.on("keydown.menuNavigation",function(e){var currentKeyCode=e.keyCode?e.keyCode:e.charCode;e.preventDefault();currentKeyCode===keyCodes.ESC||currentKeyCode===keyCodes.TAB?self.closeMenu():currentKeyCode===keyCodes.SPACE||currentKeyCode===keyCodes.ENTER?(self.triggerHighlightedItem(),e.stopPropagation()):currentKeyCode===keyCodes.LEFT||currentKeyCode===keyCodes.UP?(self.moveUp(),e.stopPropagation()):currentKeyCode===keyCodes.RIGHT||currentKeyCode===keyCodes.DOWN?(self.moveDown(),e.stopPropagation()):void 0}),this.$menuButton.on("keydown.menuNavigation",function(e){function setFocusToItem(index){self.hoverIndex=index,self.$menuContainer.focus(),self.hoverItem(self.menuItems[self.hoverIndex].id)}var currentKeyCode=e.keyCode?e.keyCode:e.charCode;currentKeyCode===keyCodes.UP&&"fromLast"===self.navType&&(e.stopPropagation(),setFocusToItem(self.menuItems.length-1)),currentKeyCode===keyCodes.DOWN&&"fromFirst"===self.navType&&(e.stopPropagation(),setFocusToItem(0))})},disableShortcuts:function disableShortcuts(){this.$menuContainer.off(".menuNavigation"),this.$menuButton.off(".menuNavigation")},moveUp:function moveUp(){if(0= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",functionType="function",escapeExpression=this.escapeExpression,self=this,stack1,helper;return buffer+="\n ",(helper=helpers.text)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.text,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\n\n",buffer}),textComponentApi={initText:function initText(){this.id=this.config.control},getType:function getType(){return"text"},getId:function getId(){return this.id}};return textComponentFactory}),define("taoQtiTest/runner/ui/toolbox/toolbox",["lodash","jquery","ui/component","taoQtiTest/runner/ui/toolbox/entry","taoQtiTest/runner/ui/toolbox/menu","taoQtiTest/runner/ui/toolbox/text","handlebars","lib/handlebars/helpers"],function(_,$$1,componentFactory,entryFactory,menuFactory,textFactory,Handlebars,Helpers0){"use strict";function toolboxTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}function defaultRenderer($container){var self=this,menuEntries=[];_.isArray(this.allItems)&&this.allItems.forEach(function(item){self.hasMenu(item)||item.render($container)}),this.allMenus.forEach(function(menu){var menuId=menu.getId();menuEntries=self.allItems.filter(function(item){return"entry"===item.getType()&&item.getMenuId()===menuId}),menuEntries.forEach(function(item){menu.addItem(item)}),menu.renderItems()})}function toolboxComponentFactory(specs,defaults){var $document=$$1(document),toolboxComponent;return specs=_.defaults(specs||{},toolboxComponentApi),toolboxComponent=componentFactory(specs,defaults).on("init",function(){this.initToolbox()}).on("render.defaultRenderer",defaultRenderer).on("render",function(){var self=this;$document.off(".toolboxmenu"),$document.on("click.toolboxmenu",function(){self.allMenus.forEach(function(menu){menu.is("opened")&&menu.closeMenu()})})}).on("destroy",function(){$document.off(".toolboxmenu"),this.allItems.forEach(function(item){item.destroy()})}).setTemplate(toolboxTpl),toolboxComponent}_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,$$1=$$1&&Object.prototype.hasOwnProperty.call($$1,"default")?$$1["default"]:$$1,componentFactory=componentFactory&&Object.prototype.hasOwnProperty.call(componentFactory,"default")?componentFactory["default"]:componentFactory,entryFactory=entryFactory&&Object.prototype.hasOwnProperty.call(entryFactory,"default")?entryFactory["default"]:entryFactory,menuFactory=menuFactory&&Object.prototype.hasOwnProperty.call(menuFactory,"default")?menuFactory["default"]:menuFactory,textFactory=textFactory&&Object.prototype.hasOwnProperty.call(textFactory,"default")?textFactory["default"]:textFactory,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){return this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),"
      "}),toolboxComponentApi={initToolbox:function initToolbox(){this.allItems=[],this.allMenus=[]},createMenu:function createMenu(config){var self=this,menu=menuFactory().init(config);return this.allItems.push(menu),this.allMenus.push(menu),menu.on("openmenu",function closeAllMenuExcept(openedMenu){self.allMenus.forEach(function(current){openedMenu.getId()!==current.getId()&¤t.is("opened")&¤t.closeMenu()})}),menu},createEntry:function createEntry(config){const extendedConfig=Object.assign({role:"option"},config),item=entryFactory().init(extendedConfig);return this.allItems.push(item),item},createText:function createText(config){var text=textFactory().init(config);return this.allItems.push(text),text},hasMenu:function hasMenu(item){return item&&_.isFunction(item.getMenuId)&&item.getMenuId()}};return toolboxComponentFactory}),define("taoQtiTest/runner/provider/stopwatch",["core/eventifier","core/polling","core/timer"],function(eventifier,pollingFactory,timerFactory){"use strict";function stopwatchFactory(){let options=0this.trigger("tick",stopwatch.tick()),interval:config.interval,autoStart:!1}),initialized=!0},start(){this.isInitialized()&&(stopwatch.resume(),polling.start())},stop(){this.isInitialized()&&(stopwatch.pause(),polling.stop())},destroy(){this.isInitialized()&&(initialized=!1,polling.stop(),polling=null,stopwatch.stop(),stopwatch=null)}})}eventifier=eventifier&&Object.prototype.hasOwnProperty.call(eventifier,"default")?eventifier["default"]:eventifier,pollingFactory=pollingFactory&&Object.prototype.hasOwnProperty.call(pollingFactory,"default")?pollingFactory["default"]:pollingFactory,timerFactory=timerFactory&&Object.prototype.hasOwnProperty.call(timerFactory,"default")?timerFactory["default"]:timerFactory;const defaultOptions={interval:1e3};return stopwatchFactory}),define("taoQtiTest/runner/provider/qti",["jquery","lodash","i18n","core/cachedStore","util/browser","taoTests/runner/areaBroker","taoTests/runner/proxy","taoTests/runner/probeOverseer","taoTests/runner/testStore","taoQtiTest/runner/provider/dataUpdater","taoQtiTest/runner/provider/toolStateBridge","taoQtiTest/runner/helpers/currentItem","taoQtiTest/runner/helpers/map","taoQtiTest/runner/ui/toolbox/toolbox","taoQtiItem/runner/qtiItemRunner","taoQtiTest/runner/config/assetManager","handlebars","lib/handlebars/helpers","taoQtiTest/runner/config/states","taoQtiTest/runner/provider/stopwatch"],function($$1,_,__,cachedStore,browser,areaBrokerFactory,proxyFactory,probeOverseerFactory,testStoreFactory,dataUpdater,toolStateBridgeFactory,currentItemHelper,mapHelper,toolboxFactory,qtiItemRunner,getAssetManager,Handlebars,Helpers0,states,stopwatchFactory){"use strict";function layoutTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}$$1=$$1&&Object.prototype.hasOwnProperty.call($$1,"default")?$$1["default"]:$$1,_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,cachedStore=cachedStore&&Object.prototype.hasOwnProperty.call(cachedStore,"default")?cachedStore["default"]:cachedStore,browser=browser&&Object.prototype.hasOwnProperty.call(browser,"default")?browser["default"]:browser,areaBrokerFactory=areaBrokerFactory&&Object.prototype.hasOwnProperty.call(areaBrokerFactory,"default")?areaBrokerFactory["default"]:areaBrokerFactory,proxyFactory=proxyFactory&&Object.prototype.hasOwnProperty.call(proxyFactory,"default")?proxyFactory["default"]:proxyFactory,probeOverseerFactory=probeOverseerFactory&&Object.prototype.hasOwnProperty.call(probeOverseerFactory,"default")?probeOverseerFactory["default"]:probeOverseerFactory,testStoreFactory=testStoreFactory&&Object.prototype.hasOwnProperty.call(testStoreFactory,"default")?testStoreFactory["default"]:testStoreFactory,dataUpdater=dataUpdater&&Object.prototype.hasOwnProperty.call(dataUpdater,"default")?dataUpdater["default"]:dataUpdater,toolStateBridgeFactory=toolStateBridgeFactory&&Object.prototype.hasOwnProperty.call(toolStateBridgeFactory,"default")?toolStateBridgeFactory["default"]:toolStateBridgeFactory,currentItemHelper=currentItemHelper&&Object.prototype.hasOwnProperty.call(currentItemHelper,"default")?currentItemHelper["default"]:currentItemHelper,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper,toolboxFactory=toolboxFactory&&Object.prototype.hasOwnProperty.call(toolboxFactory,"default")?toolboxFactory["default"]:toolboxFactory,qtiItemRunner=qtiItemRunner&&Object.prototype.hasOwnProperty.call(qtiItemRunner,"default")?qtiItemRunner["default"]:qtiItemRunner,getAssetManager=getAssetManager&&Object.prototype.hasOwnProperty.call(getAssetManager,"default")?getAssetManager["default"]:getAssetManager,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,states=states&&Object.prototype.hasOwnProperty.call(states,"default")?states["default"]:states,stopwatchFactory=stopwatchFactory&&Object.prototype.hasOwnProperty.call(stopwatchFactory,"default")?stopwatchFactory["default"]:stopwatchFactory,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",helperMissing=helpers.helperMissing,escapeExpression=this.escapeExpression,helper,options;return buffer+="
      \n
      \n
      \n
      \n\n
      \n\n \n\n
      \n

      \n
      \n
      \n
      \n\n
      \n
      \n \n \n
      \n
      \n\n
      \n",buffer}),qtiProvider={name:"qti",loadAreaBroker:function loadAreaBroker(){var $layout=$$1(layoutTpl());return areaBrokerFactory($layout,{content:$$1("#qti-content",$layout),toolbox:$$1(".tools-box",$layout),navigation:$$1(".navi-box-list",$layout),mainLandmark:$$1("#test-title-header",$layout),control:$$1(".top-action-bar .control-box",$layout),actionsBar:$$1(".bottom-action-bar .control-box",$layout),panel:$$1(".test-sidebar-left",$layout),header:$$1(".title-box",$layout)})},loadProxy:function loadProxy(){var config=this.getConfig(),proxyProvider=config.provider.proxy||"qtiServiceProxy",proxyConfig=_.pick(config,["testDefinition","testCompilation","serviceCallId","bootstrap","options"]);return proxyFactory(proxyProvider,proxyConfig)},loadProbeOverseer:function loadProbeOverseer(){return probeOverseerFactory(this)},loadTestStore:function loadTestStore(){var config=this.getConfig(),identifier=config.serviceCallId||`test-${Date.now()}`;return testStoreFactory(identifier)},loadPersistentStates:function loadPersistentStates(){var self=this,config=this.getConfig(),persistencePromise=cachedStore(`test-states-${config.serviceCallId}`,"states");return persistencePromise.catch(function(err){self.trigger("error",err)}),persistencePromise.then(function(storage){self.stateStorage=storage})},getPersistentState:function getPersistentState(name){if(this.stateStorage)return this.stateStorage.getItem(name)},setPersistentState:function setPersistentState(name,active){var self=this,setPromise;if(this.stateStorage)return setPromise=this.stateStorage.setItem(name,active),setPromise.catch(function(err){self.trigger("error",err)}),setPromise},install(){this.dataUpdater=dataUpdater(this.getDataHolder()),this.toolStateBridge=toolStateBridgeFactory(this.getTestStore(),_.keys(this.getPlugins())),this.getCurrentItem=function getCurrentItem(){const testContext=this.getTestContext(),testMap=this.getTestMap();if(testContext&&testMap&&testContext.itemIdentifier)return mapHelper.getItem(testMap,testContext.itemIdentifier)},this.getCurrentSection=function getCurrentSection(){const testContext=this.getTestContext(),testMap=this.getTestMap();if(testContext&&testMap&&testContext.sectionId)return mapHelper.getSection(testMap,testContext.sectionId)},this.getCurrentPart=function getCurrentPart(){const testContext=this.getTestContext(),testMap=this.getTestMap();if(testContext&&testMap&&testContext.testPartId)return mapHelper.getPart(testMap,testContext.testPartId)}},init:function init(){function getItemResults(){var results={},context=self.getTestContext();return context&&self.itemRunner&&context.itemSessionState<=states.itemSession.interacting&&(results={itemResponse:self.itemRunner.getResponses(),itemState:self.itemRunner.getState()}),results}function computeNext(action,params,loadPromise){const context=self.getTestContext(),currentItem=self.getCurrentItem(),options=self.getOptions(),skipPausedAssessmentDialog=!!options.skipPausedAssessmentDialog,{partiallyAnsweredIsAnswered}=options.review;var submitError=function submitError(err){err&&err.unrecoverable?(!skipPausedAssessmentDialog&&self.trigger("alert.error",__("An unrecoverable error occurred. Your test session will be paused.")),self.trigger("pause",{message:err.message})):200===err.code?self.trigger("alert.submitError",err.message||__("An error occurred during results submission. Please retry."),load):self.trigger("error",err)};const feedbackPromise=new Promise(resolve=>{if((currentItem.hasFeedbacks||context.hasFeedbacks)&&context.itemSessionState<=states.itemSession.interacting)params=_.omit(params,["itemState","itemResponse"]),self.getProxy().submitItem(context.itemIdentifier,self.itemRunner.getState(),self.itemRunner.getResponses(),params).then(results=>results.itemSession&&(currentItem.answered=results.itemSession.itemAnswered,!0===results.displayFeedbacks&&results.feedbacks)?void self.itemRunner.renderFeedbacks(results.feedbacks,results.itemSession,function(queue){self.trigger("modalFeedbacks",queue,resolve)}):resolve()).catch(submitError);else{if("skip"===action)currentItem.answered=!1;else{const testPart=self.getCurrentPart(),isLinear=testPart&&testPart.isLinear;currentItem.answered=isLinear||currentItemHelper.isAnswered(self,partiallyAnsweredIsAnswered)}resolve()}});feedbackPromise.then(function(){return self.toolStateBridge.getStates()}).then(function(toolStates){toolStates&&0<_.size(toolStates)&&(params.toolStates=toolStates),self.setTestMap(self.dataUpdater.updateStats()),self.on(`unloaditem.${action}`,function(){self.off(`.${action}`),self.getProxy().callItemAction(context.itemIdentifier,action,params).then(function(results){return loadPromise=loadPromise||Promise.resolve(),loadPromise.then(function(){return results})}).then(function(results){self.dataUpdater.update(results),load()}).catch(submitError)}),self.unloadItem(context.itemIdentifier)}).catch(submitError)}function load(){var context=self.getTestContext();context.state<=states.testSession.interacting?self.loadItem(context.itemIdentifier):context.state===states.testSession.closed&&self.finish()}const self=this,config=this.getConfig(),areaBroker=this.getAreaBroker();areaBroker.setComponent("toolbox",toolboxFactory()),areaBroker.getToolbox().init();const stopwatch=stopwatchFactory({});stopwatch.init(),stopwatch.spread(this,"tick");const isTimerClientMode=()=>config.options.timer&&config.options.timer.restoreTimerFromClient;return this.on("ready",function(){load()}).on("move",function(direction,scope,position){var itemResults=getItemResults();this.trigger("disablenav disabletools"),computeNext("move",_.merge(itemResults,{direction:direction,scope:scope||"item",ref:position}))}).on("skip",function(scope){this.trigger("disablenav disabletools"),computeNext("skip",{scope:scope||"item"})}).on("exit",function(reason){var context=self.getTestContext();this.disableItem(context.itemIdentifier),this.getProxy().callTestAction("exitTest",_.merge(getItemResults(),{itemDefinition:context.itemIdentifier,reason:reason})).then(function(){return self.finish()}).catch(function(err){self.trigger("error",err)})}).on("timeout",function(scope,ref,timer){const context=self.getTestContext(),noAlertTimeout=mapHelper.hasItemCategory(self.getTestMap(),context.itemIdentifier,"noAlertTimeout",!0);context.isTimeout=!0,this.setTestContext(context),timer&&timer.allowLateSubmission?(self.trigger("alert.timeout",__("Time limit reached, this part of the test has ended. However you are allowed to finish the current item.")),self.before("move.latetimeout",function(){return self.off("move.latetimeout"),computeNext("timeout",_.merge(getItemResults(),{scope:scope,ref:ref,late:!0})),Promise.reject({cancel:!0})})):(this.disableItem(context.itemIdentifier),computeNext("timeout",_.merge(getItemResults(),{scope:scope,ref:ref}),new Promise(function(resolve){noAlertTimeout?resolve():self.trigger("alert.timeout",__("The time limit has been reached for this part of the test."),()=>{self.trigger("timeoutAccepted"),resolve()})})))}).on("pause",function(data){const testContext=self.getTestContext(),options=self.getOptions(),skipPausedAssessmentDialog=!!options.skipPausedAssessmentDialog;this.setState("closedOrSuspended",!0);const params={itemDefinition:testContext.itemIdentifier,reason:{reasons:data&&data.reasons,comment:data&&(data.originalMessage||data.message)}},itemState=self.itemRunner.getState();Object.keys(itemState).length&&(params.itemState=itemState),this.getProxy().callTestAction("pause",params).then(function(){self.trigger("leave",{code:states.testSession.suspended,message:data&&data.message,skipExitMessage:skipPausedAssessmentDialog})}).catch(function(err){self.trigger("error",err)})}).on("move skip exit timeout pause",function(){stopwatch.stop()}).on("loaditem",function(){var context=this.getTestContext(),warning=!1,getItemLabel=function getItemLabel(){const item=self.getCurrentItem();return item&&item.label?item.label:context.itemIdentifier};context.isTimeout?warning=__("Time limit reached for item \"%s\".",getItemLabel()):context.itemSessionState>states.itemSession.interacting&&(0===context.remainingAttempts?warning=__("No more attempts allowed for item \"%s\".",getItemLabel()):warning=__("Item \"%s\" is completed.",getItemLabel())),warning&&(self.disableItem(context.itemIdentifier),self.trigger("warning",warning))}).on("renderitem",function(){var context=this.getTestContext();this.getItemState(context.itemIdentifier,"disabled")||this.trigger("enabletools"),this.trigger("enablenav")}).after("renderitem",function(){stopwatch.start()}).on("resumeitem",function(){this.trigger("enableitem enablenav")}).on("disableitem",function(){isTimerClientMode()&&stopwatch.stop(),this.trigger("disabletools")}).on("enableitem",function(){isTimerClientMode()&&stopwatch.start(),this.trigger("enabletools")}).on("error",function(){stopwatch.stop(),this.trigger("disabletools enablenav")}).on("finish",function(){this.flush()}).on("leave",function(){this.trigger("endsession"),this.flush()}).on("flush",function(){this.destroy(),stopwatch.destroy()}),this.getProbeOverseer()&&this.getProbeOverseer().start(),this.getTestStore().getStorageIdentifier().then(function(storeId){return self.getProxy().init({storeId:storeId}).then(function(response){return response.testData&&Object.assign(config.options,response.testData.config),self.dataUpdater.update(response),self.dataUpdater.updatePluginsConfig(self.getPlugins(),self.getPluginsConfig()),self.getTestStore().clearVolatileIfStoreChange(response.lastStoreId).then(function(){return response})}).then(function(response){var isNewStore=!response.lastStoreId||response.lastStoreId!==storeId;if(response.toolStates&&isNewStore)return self.toolStateBridge.setTools(_.keys(response.toolStates)).restoreStates(response.toolStates)})})},render:function render(){var config=this.getConfig(),areaBroker=this.getAreaBroker();config.renderTo.append(areaBroker.getContainer()),areaBroker.getToolbox().render(areaBroker.getToolboxArea())},loadItem:function loadItem(itemIdentifier){return this.getProxy().getItem(itemIdentifier).then(_ref=>{let{itemData,baseUrl,itemState,portableElements,flags}=_ref;return{content:itemData,baseUrl,state:itemState,portableElements,flags}})},renderItem:function renderItem(itemIdentifier,itemData){var self=this,config=this.getConfig(),assetManager=getAssetManager(config.serviceCallId),changeState=function changeState(){self.setItemState(itemIdentifier,"changed",!0)};return new Promise(function(resolve,reject){assetManager.setData("baseUrl",itemData.baseUrl),assetManager.setData("itemIdentifier",itemIdentifier),assetManager.setData("assets",itemData.content.assets),itemData.content=itemData.content||{},self.itemRunner=qtiItemRunner(itemData.content.type,itemData.content.data,{assetManager:assetManager}).on("error",function(err){err&&err.unrecoverable?self.trigger("pause",{message:err.message}):(self.trigger("enablenav"),reject(err))}).on("init",function(){var itemContainer=self.getAreaBroker().getContentArea(),itemRenderingOptions=_.pick(itemData,["state","portableElements"]);this.render(itemContainer,itemRenderingOptions)}).on("render",function(){this.on("responsechange",changeState),this.on("statechange",changeState),resolve()}).after("render",function(){if(browser.isIOs()){const wrapperElt=self.getAreaBroker().getContainer().find(".content-wrapper").get(0);wrapperElt&&(wrapperElt.style.overflow="hidden",setTimeout(()=>wrapperElt.style.overflow="auto",0))}}).on("warning",function(err){self.trigger("warning",err)}).init()})},unloadItem:function unloadItem(){var self=this;return self.trigger("beforeunloaditem disablenav disabletools"),new Promise(function(resolve){return self.itemRunner?void self.itemRunner.on("clear",resolve).clear():void resolve()})},finish:function finish(){if(!this.getState("finish")&&(this.trigger("disablenav disabletools"),this.stateStorage))return this.stateStorage.removeStore()},flush:function flush(){var self=this,probeOverseer=this.getProbeOverseer(),proxy=this.getProxy(),flushPromise;return flushPromise=probeOverseer&&!this.getState("disconnected")?probeOverseer.flush().then(function(data){var traceData={};if(data&&data.length)return _.forEach(data,function(entry){var id=`${entry.type}-${entry.id}`;entry.marker&&(id=`${entry.marker}-${id}`),traceData[id]=entry}),self.getProxy().sendVariables(traceData)}).then(function(){probeOverseer.stop()}).catch(function(){probeOverseer.stop()}):Promise.resolve(),flushPromise.then(function(){proxy.hasCommunicator()&&proxy.getCommunicator().then(function(communicator){return communicator.close()}).catch(_.noop)})},destroy:function destroy(){var areaBroker=this.getAreaBroker();if(this.itemRunner&&this.itemRunner.clear(),this.itemRunner=null,areaBroker&&areaBroker.getToolbox().destroy(),this.getState("finish"))return this.getTestStore().remove()}};return qtiProvider}),define("taoQtiTest/runner/proxy/cache/actionStore",["lodash","taoTests/runner/testStore"],function(_,testStore){"use strict";function actionStoreFatory(id){var actionQueue=[],loadStore=function loadStore(){return testStore(id).getStore("actions")};if(_.isEmpty(id))throw new TypeError("Please specify the action store id");return{push:function push(action,params,timestamp){return actionQueue.push({action:action,timestamp:timestamp||Date.now(),parameters:params}),loadStore().then(function(actionStore){return actionStore.setItem("queue",actionQueue)})},flush:function flush(){return loadStore().then(function(actionStore){return actionStore.getItem("queue").then(function(queue){return actionQueue=[],actionStore.setItem("queue",actionQueue).then(function(){return queue})})})},update:function update(params){return _.forEach(actionQueue,function(action){action.parameters.actionId===params.actionId&&(action.parameters=params)}),loadStore().then(function(actionStore){return actionStore.setItem("queue",actionQueue)})}}}_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,testStore=testStore&&Object.prototype.hasOwnProperty.call(testStore,"default")?testStore["default"]:testStore;var storeName="actions",storeKey="queue";return actionStoreFatory}),define("taoQtiTest/runner/proxy/cache/preloaders/assets/audio",["lodash"],function(_){"use strict";_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_;var audio={name:"audio",init(assetManager){const audioBlobs={};return assetManager.prependStrategy({name:"precaching-audio",handle(url,data){const sourceUrl=url.toString();if(data.itemIdentifier&&audioBlobs[data.itemIdentifier]&&"undefined"!=typeof audioBlobs[data.itemIdentifier][sourceUrl])return URL.createObjectURL(audioBlobs[data.itemIdentifier][sourceUrl])}}),{loaded(url,sourceUrl,itemIdentifier){return!!(audioBlobs[itemIdentifier]&&audioBlobs[itemIdentifier][sourceUrl])},load(url,sourceUrl,itemIdentifier){return new Promise(resolve=>{if(audioBlobs[itemIdentifier]=audioBlobs[itemIdentifier]||{},"undefined"==typeof audioBlobs[itemIdentifier][sourceUrl]){const request=new XMLHttpRequest;request.open("GET",url,!0),request.responseType="blob",request.onerror=resolve,request.onabort=resolve,request.onload=()=>{200===request.status&&(audioBlobs[itemIdentifier][sourceUrl]=request.response),resolve()},request.send()}else resolve()})},unload(url,sourceUrl,itemIdentifier){return audioBlobs[itemIdentifier]&&(audioBlobs[itemIdentifier]=_.omit(audioBlobs[itemIdentifier],sourceUrl)),Promise.resolve()}}}};return audio}),define("taoQtiTest/runner/proxy/cache/preloaders/assets/image",["lodash"],function(_){"use strict";_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_;var image={name:"img",init(){const images={};return{loaded(url,sourceUrl,itemIdentifier){return!!(images[itemIdentifier]&&images[itemIdentifier][sourceUrl])},load(url,sourceUrl,itemIdentifier){return images[itemIdentifier]=images[itemIdentifier]||{},"Image"in window&&!images[itemIdentifier][sourceUrl]&&(images[itemIdentifier][sourceUrl]=new Image,images[itemIdentifier][sourceUrl].src=url),Promise.resolve()},unload(url,sourceUrl,itemIdentifier){return images[itemIdentifier]&&(images[itemIdentifier]=_.omit(images[itemIdentifier],sourceUrl)),Promise.resolve()}}}};return image}),define("taoQtiTest/runner/proxy/cache/preloaders/assets/stylesheet",["lodash"],function(_){"use strict";_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_;const relSupport=feature=>{const fakeLink=document.createElement("link");try{if(fakeLink.relList&&"function"==typeof fakeLink.relList.supports)return fakeLink.relList.supports(feature)}catch(err){return!1}},supportPreload=relSupport("preload"),supportPrefetch=relSupport("prefetch");var stylesheet={name:"css",init(){const stylesheets={};return{loaded(url,sourceUrl,itemIdentifier){return!!(stylesheets[itemIdentifier]&&stylesheets[itemIdentifier][sourceUrl])},load(url,sourceUrl,itemIdentifier){if(stylesheets[itemIdentifier]=stylesheets[itemIdentifier]||{},!stylesheets[itemIdentifier][sourceUrl]){const link=document.createElement("link");supportPreload?(link.setAttribute("rel","preload"),link.setAttribute("as","style")):supportPrefetch?(link.setAttribute("rel","prefetch"),link.setAttribute("as","style")):(link.disabled=!0,link.setAttribute("rel","stylesheet"),link.setAttribute("type","text/css")),link.setAttribute("data-preload",!0),link.setAttribute("href",url),document.querySelector("head").appendChild(link),stylesheets[itemIdentifier][sourceUrl]=link}return Promise.resolve()},unload(url,sourceUrl,itemIdentifier){if(stylesheets[itemIdentifier]){const link=stylesheets[itemIdentifier][sourceUrl]||document.querySelector(`head link[data-preload][href="${url}"]`);link&&document.querySelector("head").removeChild(link),stylesheets[itemIdentifier]=_.omit(stylesheets[itemIdentifier],sourceUrl)}return Promise.resolve()}}}};return stylesheet}),define("taoQtiTest/runner/proxy/cache/preloaders/assets/preloaders",["taoQtiTest/runner/proxy/cache/preloaders/assets/audio","taoQtiTest/runner/proxy/cache/preloaders/assets/image","taoQtiTest/runner/proxy/cache/preloaders/assets/stylesheet"],function(audioPreloader,imagePreloader,stylesheetPreloader){"use strict";audioPreloader=audioPreloader&&Object.prototype.hasOwnProperty.call(audioPreloader,"default")?audioPreloader["default"]:audioPreloader,imagePreloader=imagePreloader&&Object.prototype.hasOwnProperty.call(imagePreloader,"default")?imagePreloader["default"]:imagePreloader,stylesheetPreloader=stylesheetPreloader&&Object.prototype.hasOwnProperty.call(stylesheetPreloader,"default")?stylesheetPreloader["default"]:stylesheetPreloader;var preloaders=[audioPreloader,imagePreloader,stylesheetPreloader];return preloaders}),define("taoQtiTest/runner/proxy/cache/preloaderManager",["core/providerRegistry"],function(providerRegistry){"use strict";function preloaderManagerFactory(){function preloaderFactory(assetManager){const preloaders={};return preloaderFactory.getAvailableProviders().forEach(name=>{preloaders[name]=preloaderFactory.getProvider(name).init(assetManager)}),{has(name){return!!preloaders[name]},loaded(name){const preloader=preloaders[name];if(preloader&&"function"==typeof preloader.loaded){for(var _len=arguments.length,args=Array(1<_len?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return!!preloader.loaded(...args)}return!1},load(name){const preloader=preloaders[name];if(preloader&&"function"==typeof preloader.load){for(var _len2=arguments.length,args=Array(1<_len2?_len2-1:0),_key2=1;_key2<_len2;_key2++)args[_key2-1]=arguments[_key2];return Promise.resolve(preloader.load(...args))}return Promise.resolve()},unload(name){const preloader=preloaders[name];if(preloader&&"function"==typeof preloader.unload){for(var _len3=arguments.length,args=Array(1<_len3?_len3-1:0),_key3=1;_key3<_len3;_key3++)args[_key3-1]=arguments[_key3];return Promise.resolve(preloader.unload(...args))}return Promise.resolve()}}}return providerRegistry(preloaderFactory)}return providerRegistry=providerRegistry&&Object.prototype.hasOwnProperty.call(providerRegistry,"default")?providerRegistry["default"]:providerRegistry,preloaderManagerFactory}),define("taoQtiTest/runner/proxy/cache/assetPreloader",["taoQtiTest/runner/proxy/cache/preloaders/assets/preloaders","taoQtiTest/runner/proxy/cache/preloaderManager"],function(preloaders,preloaderManagerFactory){"use strict";preloaders=preloaders&&Object.prototype.hasOwnProperty.call(preloaders,"default")?preloaders["default"]:preloaders,preloaderManagerFactory=preloaderManagerFactory&&Object.prototype.hasOwnProperty.call(preloaderManagerFactory,"default")?preloaderManagerFactory["default"]:preloaderManagerFactory;const assetPreloaderFactory=preloaderManagerFactory();return preloaders.forEach(preloader=>assetPreloaderFactory.registerProvider(preloader.name,preloader)),assetPreloaderFactory}),define("taoQtiTest/runner/proxy/cache/preloaders/interactions/extendedText",["ckeditor","taoQtiItem/qtiCommonRenderer/helpers/ckConfigurator"],function(ckEditor,ckConfigurator){"use strict";function preloadCKEditor(language){return new Promise(resolve=>{const placeholder=document.createElement("div"),ckOptions={resize_enabled:!0,secure:"https:"===location.protocol,forceCustomDomain:!0,language},editor=ckEditor.inline(placeholder,ckOptions);editor.on("instanceReady",()=>{resolve(editor)}),editor.on("configLoaded",()=>{editor.config=ckConfigurator.getConfig(editor,"extendedText",ckOptions)}),("ready"===editor.status||"loaded"===editor.status)&&resolve(editor)}).then(editor=>{editor.destroy()})}ckEditor=ckEditor&&Object.prototype.hasOwnProperty.call(ckEditor,"default")?ckEditor["default"]:ckEditor,ckConfigurator=ckConfigurator&&Object.prototype.hasOwnProperty.call(ckConfigurator,"default")?ckConfigurator["default"]:ckConfigurator;const defaultLang="en",getItemLanguage=itemData=>{let lang=itemData&&itemData.data&&itemData.data.attributes&&itemData.data.attributes["xml:lang"];return lang||(lang=window.document.documentElement.getAttribute("lang")),lang&&lang.split("-")[0]||defaultLang};var extendedText={name:"extendedTextInteraction",init(){const preloadedLanguages={};return{loaded(interaction,itemData,itemIdentifier){if(interaction.attributes&&"xhtml"===interaction.attributes.format){const lang=getItemLanguage(itemData);return preloadedLanguages[lang]}return!0},load(interaction,itemData,itemIdentifier){if(interaction.attributes&&"xhtml"===interaction.attributes.format){const lang=getItemLanguage(itemData);if(!preloadedLanguages[lang])return preloadedLanguages[lang]=!0,preloadCKEditor(lang)}return Promise.resolve()},unload(interaction,itemData,itemIdentifier){return Promise.resolve()}}}};return extendedText}),define("taoQtiTest/runner/proxy/cache/preloaders/interactions/preloaders",["taoQtiTest/runner/proxy/cache/preloaders/interactions/extendedText"],function(extendedTextPreloader){"use strict";extendedTextPreloader=extendedTextPreloader&&Object.prototype.hasOwnProperty.call(extendedTextPreloader,"default")?extendedTextPreloader["default"]:extendedTextPreloader;var preloaders=[extendedTextPreloader];return preloaders}),define("taoQtiTest/runner/proxy/cache/interactionPreloader",["taoQtiTest/runner/proxy/cache/preloaders/interactions/preloaders","taoQtiTest/runner/proxy/cache/preloaderManager"],function(preloaders,preloaderManagerFactory){"use strict";preloaders=preloaders&&Object.prototype.hasOwnProperty.call(preloaders,"default")?preloaders["default"]:preloaders,preloaderManagerFactory=preloaderManagerFactory&&Object.prototype.hasOwnProperty.call(preloaderManagerFactory,"default")?preloaderManagerFactory["default"]:preloaderManagerFactory;const interactionPreloaderFactory=preloaderManagerFactory();return preloaders.forEach(preloader=>interactionPreloaderFactory.registerProvider(preloader.name,preloader)),interactionPreloaderFactory}),define("taoQtiTest/runner/proxy/cache/itemPreloader",["lodash","core/logger","taoQtiItem/runner/qtiItemRunner","taoQtiTest/runner/config/assetManager","taoQtiTest/runner/proxy/cache/assetPreloader","taoQtiTest/runner/proxy/cache/interactionPreloader","util/url"],function(_,loggerFactory,qtiItemRunner,getAssetManager,assetPreloaderFactory,interactionPreloaderFactory,urlUtil){"use strict";function itemPreloaderFactory(options){const preloadAssetManager=getAssetManager("item-preloader"),resolveAssets=item=>new Promise(resolve=>{const{assets}=item.itemData;return preloadAssetManager.setData("baseUrl",item.baseUrl),preloadAssetManager.setData("assets",assets),resolve(_.reduce(assets,(acc,assetList,type)=>{const resolved={};return _.forEach(assetList,url=>{urlUtil.isBase64(url)||(resolved[url]=preloadAssetManager.resolve(url))}),0<_.size(resolved)&&(acc[type]=resolved),acc},{}))});if(!options||!options.testId)throw new TypeError("The test identifier is mandatory to start the item preloader");const testAssetManager=getAssetManager(options.testId),assetPreloader=assetPreloaderFactory(testAssetManager),interactionPreloader=interactionPreloaderFactory(),itemLoad=item=>(logger.debug(`Start preloading of item ${item.itemIdentifier}`),new Promise((resolve,reject)=>{qtiItemRunner(item.itemData.type,item.itemData.data,{assetManager:preloadAssetManager,preload:!0}).on("init",()=>{logger.debug(`Preloading of item ${item.itemIdentifier} done`),resolve(!0)}).on("error",reject).init()})),interactionLoad=item=>Promise.all(getItemInteractions(item.itemData).map(interaction=>interactionPreloader.has(interaction.qtiClass)?(logger.debug(`Loading interaction ${interaction.serial}(${interaction.qtiClass}) for item ${item.itemIdentifier}`),interactionPreloader.load(interaction.qtiClass,interaction,item.itemData,item.itemIdentifier)):Promise.resolve())),interactionUnload=item=>Promise.all(getItemInteractions(item.itemData).map(interaction=>interactionPreloader.has(interaction.qtiClass)?(logger.debug(`Unloading interaction ${interaction.serial}(${interaction.qtiClass}) for item ${item.itemIdentifier}`),interactionPreloader.unload(interaction.qtiClass,interaction,item.itemData,item.itemIdentifier)):Promise.resolve())),assetLoad=item=>resolveAssets(item).then(resolved=>(_.forEach(resolved,(assets,type)=>{assetPreloader.has(type)?_.forEach(assets,(url,sourceUrl)=>{logger.debug(`Loading asset ${sourceUrl}(${type}) for item ${item.itemIdentifier}`),assetPreloader.load(type,url,sourceUrl,item.itemIdentifier)}):setItemFlag(item,"containsNonPreloadedAssets")}),!0)),assetUnload=item=>resolveAssets(item).then(resolved=>(_.forEach(resolved,(assets,type)=>{assetPreloader.has(type)&&_.forEach(assets,(url,sourceUrl)=>{logger.debug(`Unloading asset ${sourceUrl}(${type}) for item ${item.itemIdentifier}`),assetPreloader.unload(type,url,sourceUrl,item.itemIdentifier)})}),!0));return{preload(item){const loading=[];return isItemObjectValid(item)&&(loading.push(itemLoad(item)),loading.push(interactionLoad(item)),_.size(item.itemData.data&&item.itemData.data.feedbacks)&&setItemFlag(item,"hasFeedbacks"),_.size(item.portableElements&&item.portableElements.pci)&&setItemFlag(item,"hasPci"),0<_.size(item.itemData.assets)&&loading.push(assetLoad(item))),Promise.all(loading).then(results=>00_.isPlainObject(item)&&_.isString(item.baseUrl)&&_.isString(item.itemIdentifier)&&!_.isEmpty(item.itemIdentifier)&&_.isPlainObject(item.itemData),setItemFlag=(item,flag)=>{item.flags=item.flags||{},item.flags[flag]=!0},getItemInteractions=itemData=>{const interactions=[];return itemData.data&&itemData.data.body&&itemData.data.body.elements&&_.forEach(itemData.data.body.elements,elements=>interactions.push(elements)),interactions};return itemPreloaderFactory}),define("taoQtiTest/runner/proxy/cache/itemStore",["lodash","core/store","taoQtiTest/runner/proxy/cache/itemPreloader"],function(_,store,itemPreloaderFactory){"use strict";function itemStoreFactory(options){const config=_.defaults(options||{},defaultConfig),getStore=()=>store("item-cache",store.backends.memory),index=new Map;let lastIndexedPosition=0;const isExpired=key=>{const meta=index.get(key);return!!meta&&config.itemTTL&&Date.now()-meta.timestamp>=config.itemTTL},findFirstIndexedItem=()=>{var _NumberPOSITIVE_INFINITY=Number.POSITIVE_INFINITY;let first=null,lowest=_NumberPOSITIVE_INFINITY;return index.forEach((item,key)=>{item.position{const expired=[];return index.forEach((item,key)=>{isExpired(key)&&expired.push(key)}),expired};let itemPreloader;return config.preload&&(itemPreloader=itemPreloaderFactory(_.pick(config,["testId"]))),{setCacheSize(cacheSize){config.maxSize=cacheSize},setItemTTL(ttl){config.itemTTL=ttl},get(key){return this.has(key)?getStore().then(itemStorage=>itemStorage.getItem(key)):Promise.resolve()},has(key){return index.has(key)&&!isExpired(key)},set(key,item){return getStore().then(itemStorage=>itemStorage.setItem(key,item).then(updated=>(updated&&(!index.has(key)&&index.set(key,{position:lastIndexedPosition++,timestamp:Date.now()}),config.preload&&_.defer(()=>itemPreloader.preload(item))),1config.maxSize?this.remove(findFirstIndexedItem()).then(removed=>updated&&removed):updated)))},update(key,updateKey,updateValue){return index.has(key)&&_.isString(updateKey)?getStore().then(itemStorage=>itemStorage.getItem(key).then(itemData=>{if(_.isPlainObject(itemData))return itemData[updateKey]=updateValue,itemStorage.setItem(key,itemData)})):Promise.resolve(!1)},remove(key){return index.has(key)?getStore().then(itemStorage=>(index.delete(key),itemStorage.getItem(key).then(item=>{config.preload&&_.defer(()=>itemPreloader.unload(item))}).then(()=>itemStorage.removeItem(key)))):Promise.resolve(!1)},prune(){return Promise.all(findExpiredItems().map(this.remove))},clear(){return getStore().then(itemStorage=>(index.clear(),itemStorage.clear()))}}}_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,store=store&&Object.prototype.hasOwnProperty.call(store,"default")?store["default"]:store,itemPreloaderFactory=itemPreloaderFactory&&Object.prototype.hasOwnProperty.call(itemPreloaderFactory,"default")?itemPreloaderFactory["default"]:itemPreloaderFactory;const defaultConfig={itemTTL:0,maxSize:10,preload:!1};return itemStoreFactory}),define("taoQtiTest/runner/proxy/qtiServiceProxy",["lodash","core/promiseQueue","core/communicator","taoQtiTest/runner/config/qtiServiceConfig","core/request"],function(_,promiseQueue,communicatorFactory,configFactory,coreRequest){"use strict";_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,promiseQueue=promiseQueue&&Object.prototype.hasOwnProperty.call(promiseQueue,"default")?promiseQueue["default"]:promiseQueue,communicatorFactory=communicatorFactory&&Object.prototype.hasOwnProperty.call(communicatorFactory,"default")?communicatorFactory["default"]:communicatorFactory,configFactory=configFactory&&Object.prototype.hasOwnProperty.call(configFactory,"default")?configFactory["default"]:configFactory,coreRequest=coreRequest&&Object.prototype.hasOwnProperty.call(coreRequest,"default")?coreRequest["default"]:coreRequest;var qtiServiceProxy={name:"qtiServiceProxy",install:function install(){var self=this;this.queue=promiseQueue(),this.prepareParams=function prepareParams(actionParams){var stringifyParams=["itemState","itemResponse","toolStates"];return _.isPlainObject(actionParams)?_.mapValues(actionParams,function(value,key){return stringifyParams.includes(key)?JSON.stringify(value):value}):actionParams},this.request=function request(url,reqParams,contentType,noToken){return coreRequest({url:url,data:self.prepareParams(reqParams),method:reqParams?"POST":"GET",contentType:contentType,noToken:noToken,background:!1,sequential:!0,timeout:self.configStorage.getTimeout()}).then(function(response){return self.setOnline(),response&&response.success?Promise.resolve(response):Promise.reject(response)}).catch(function(error){return self.isConnectivityError(error)&&self.setOffline("request"),Promise.reject(error)})}},init:function init(config,params){return this.configStorage=configFactory(config||{}),this.request(this.configStorage.getTestActionUrl("init"),params)},destroy:function destroy(){return this.configStorage=null,this.queue=null,Promise.resolve()},getTestData:function getTestData(){return this.request(this.configStorage.getTestActionUrl("getTestData"))},getTestContext:function getTestContext(){return this.request(this.configStorage.getTestActionUrl("getTestContext"))},getTestMap:function getTestMap(){return this.request(this.configStorage.getTestActionUrl("getTestMap"))},sendVariables:function sendVariables(variables){return this.request(this.configStorage.getTestActionUrl("storeTraceData"),{traceData:JSON.stringify(variables)})},callTestAction:function callTestAction(action,params){return this.request(this.configStorage.getTestActionUrl(action),params)},getItem:function getItem(itemIdentifier,params){return this.request(this.configStorage.getItemActionUrl(itemIdentifier,"getItem"),params,void 0,!0)},submitItem:function submitItem(itemIdentifier,state,response,params){var body=_.merge({itemState:state,itemResponse:response},params||{});return this.request(this.configStorage.getItemActionUrl(itemIdentifier,"submitItem"),body)},callItemAction:function callItemAction(itemIdentifier,action,params){return this.request(this.configStorage.getItemActionUrl(itemIdentifier,action),params)},telemetry:function telemetry(itemIdentifier,signal,params){return this.request(this.configStorage.getTelemetryUrl(itemIdentifier,signal),params,null,!0)},loadCommunicator:function loadCommunicator(){var config=this.configStorage.getCommunicationConfig();return config.enabled?communicatorFactory(config.type,config.params):null}};return qtiServiceProxy}),define("taoQtiTest/runner/proxy/cache/proxy",["lodash","taoQtiTest/runner/navigator/navigator","taoQtiTest/runner/helpers/map","taoQtiTest/runner/helpers/navigation","taoQtiTest/runner/provider/dataUpdater","taoQtiTest/runner/proxy/qtiServiceProxy","taoQtiTest/runner/proxy/cache/itemStore","taoQtiTest/runner/proxy/cache/actionStore","taoQtiTest/runner/helpers/offlineErrorHelper"],function(_,testNavigatorFactory,mapHelper,navigationHelper,dataUpdater,qtiServiceProxy,itemStoreFactory,actionStoreFactory,offlineErrorHelper){"use strict";_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,testNavigatorFactory=testNavigatorFactory&&Object.prototype.hasOwnProperty.call(testNavigatorFactory,"default")?testNavigatorFactory["default"]:testNavigatorFactory,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper,navigationHelper=navigationHelper&&Object.prototype.hasOwnProperty.call(navigationHelper,"default")?navigationHelper["default"]:navigationHelper,dataUpdater=dataUpdater&&Object.prototype.hasOwnProperty.call(dataUpdater,"default")?dataUpdater["default"]:dataUpdater,qtiServiceProxy=qtiServiceProxy&&Object.prototype.hasOwnProperty.call(qtiServiceProxy,"default")?qtiServiceProxy["default"]:qtiServiceProxy,itemStoreFactory=itemStoreFactory&&Object.prototype.hasOwnProperty.call(itemStoreFactory,"default")?itemStoreFactory["default"]:itemStoreFactory,actionStoreFactory=actionStoreFactory&&Object.prototype.hasOwnProperty.call(actionStoreFactory,"default")?actionStoreFactory["default"]:actionStoreFactory,offlineErrorHelper=offlineErrorHelper&&Object.prototype.hasOwnProperty.call(offlineErrorHelper,"default")?offlineErrorHelper["default"]:offlineErrorHelper;const cacheSize=20,loadNextDelay=450,defaultItemTTL=900;var proxy=_.defaults({name:"precaching",install(config){qtiServiceProxy.install.call(this);const getItemCachingOption=(name,defaultValue)=>config&&config.options&&config.options.itemCaching?parseInt(config.options.itemCaching[name],10)||defaultValue:defaultValue;this.itemStore=itemStoreFactory({itemTTL:1e3*defaultItemTTL,maxSize:cacheSize,preload:!0,testId:config.serviceCallId}),this.actiontStore=null,this.getItemFromStore=!1,this.requestConfig={},this.actionPromises={},this.actionRejectPromises={},this.dataUpdater=dataUpdater(this.getDataHolder()),this.getCacheAmount=()=>getItemCachingOption("amount",1),this.getItemTTL=()=>1e3*getItemCachingOption("itemStoreTTL",defaultItemTTL),this.hasItem=itemIdentifier=>itemIdentifier&&this.itemStore.has(itemIdentifier),this.hasNextItem=itemIdentifier=>{const sibling=navigationHelper.getNextItem(this.getDataHolder().get("testMap"),itemIdentifier);return sibling&&this.hasItem(sibling.id)},this.hasPreviousItem=itemIdentifier=>{const sibling=navigationHelper.getPreviousItem(this.getDataHolder().get("testMap"),itemIdentifier);return sibling&&this.hasItem(sibling.id)},this.offlineAction=(action,actionParams)=>{const result={success:!0},blockingActions=["exitTest","timeout"],testContext=this.getDataHolder().get("testContext"),testMap=this.getDataHolder().get("testMap");if("pause"===action)throw offlineErrorHelper.buildErrorFromContext(offlineErrorHelper.getOfflinePauseError(),{reason:actionParams.reason});if(blockingActions.includes(action)||"next"===actionParams.direction&&navigationHelper.isLast(testMap,testContext.itemIdentifier))throw offlineErrorHelper.buildErrorFromContext(offlineErrorHelper.getOfflineExitError());if(actionParams.direction&&actionParams.scope){const testNavigator=testNavigatorFactory(testContext,testMap),newTestContext=testNavigator.navigate(actionParams.direction,actionParams.scope,actionParams.ref);if(!newTestContext||!newTestContext.itemIdentifier||!this.hasItem(newTestContext.itemIdentifier))throw offlineErrorHelper.buildErrorFromContext(offlineErrorHelper.getOfflineNavError());result.testContext=newTestContext}return this.markActionAsOffline(actionParams),result},this.processSyncAction=(action,actionParams,deferred)=>new Promise((resolve,reject)=>{this.scheduleAction(action,actionParams).then(actionData=>{this.actionPromises[actionData.params.actionId]=resolve,this.actionRejectPromises[actionData.params.actionId]=reject,deferred||this.syncData().then(result=>{this.isOnline()&&_.forEach(result,actionResult=>{const actionId=actionResult.requestParameters&&actionResult.requestParameters.actionId?actionResult.requestParameters.actionId:null;if(!actionResult.success&&this.actionRejectPromises[actionId]){const error=new Error(actionResult.message);return error.unrecoverable=!0,reject(error)}actionId&&this.actionPromises[actionId]&&this.actionPromises[actionId](actionResult)})}).catch(reject)}).catch(reject)}),this.scheduleAction=(action,params)=>(params.actionId=`${action}_${new Date().getTime()}`,this.actiontStore.push(action,this.prepareParams(_.defaults(params||{},this.requestConfig))).then(()=>({action,params}))),this.requestNetworkThenOffline=(url,action,actionParams,deferred,noToken)=>{const testContext=this.getDataHolder().get("testContext"),communicationConfig=this.configStorage.getCommunicationConfig(),runRequestThenOffline=()=>{let request;return communicationConfig.syncActions&&0<=communicationConfig.syncActions.indexOf(action)?request=this.processSyncAction(action,actionParams,deferred):(request=this.request(url,actionParams,void 0,noToken||!1),request.then(result=>this.isOffline()?this.scheduleAction(action,actionParams):result)),request.then(result=>this.isOffline()?this.offlineAction(action,actionParams):result).catch(error=>{if(this.isConnectivityError(error)&&this.isOffline())return this.offlineAction(action,actionParams);throw error})};return this.isOffline()?this.telemetry(testContext.itemIdentifier,"up").then(()=>this.isOnline()?runRequestThenOffline():this.scheduleAction(action,actionParams).then(()=>this.offlineAction(action,actionParams))).catch(err=>{if(this.isConnectivityError(err))return this.scheduleAction(action,actionParams).then(()=>this.offlineAction(action,actionParams));throw err}):runRequestThenOffline()},this.syncData=()=>{let actions;return this.queue.serie(()=>this.actiontStore.flush().then(data=>{if(actions=data,data&&data.length)return this.send("sync",data)}).catch(err=>{throw this.isConnectivityError(err)&&(this.setOffline("communicator"),_.forEach(actions,action=>{this.actiontStore.push(action.action,action.parameters)})),err}))},this.exportActions=()=>this.queue.serie(()=>this.actiontStore.flush().then(data=>(_.forEach(data,action=>{this.actiontStore.push(action.action,action.parameters)}),data))),this.markActionAsOffline=actionParams=>(actionParams.offline=!0,this.queue.serie(()=>this.actiontStore.update(this.prepareParams(_.defaults(actionParams||{},this.requestConfig)))))},init(config,params){if(!this.getDataHolder())throw new Error("Unable to retrieve test runners data holder");return this.requestConfig=_.pick(config,["testDefinition","testCompilation","serviceCallId"]),this.actiontStore=actionStoreFactory(config.serviceCallId),this.on("reconnect",function(){return this.syncData().then(responses=>{this.dataUpdater.update(responses)}).catch(err=>{this.trigger("error",err)})}),this.syncData(),qtiServiceProxy.init.call(this,config,params)},destroy(){return this.itemStore.clear(),this.getItemFromStore=!1,qtiServiceProxy.destroy.call(this)},getItem(itemIdentifier,params){const pruneStore=()=>this.itemStore.prune().catch(_.noop),loadNextItem=()=>{const testMap=this.getDataHolder().get("testMap"),siblings=navigationHelper.getSiblingItems(testMap,itemIdentifier,"both",this.getCacheAmount()),missing=_.reduce(siblings,(list,sibling)=>(this.hasItem(sibling.id)||list.push(sibling.id),list),[]);this.isOnline()&&missing.length&&_.delay(()=>{this.requestNetworkThenOffline(this.configStorage.getTestActionUrl("getNextItemData"),"getNextItemData",{itemDefinition:missing},!1,!0).then(response=>{if(response&&response.items)return pruneStore().then(()=>{_.forEach(response.items,item=>{item&&item.itemIdentifier&&this.itemStore.set(item.itemIdentifier,item)})})}).catch(_.noop)},loadNextDelay)};return this.itemStore.setItemTTL(this.getItemTTL()),this.getItemFromStore&&this.itemStore.has(itemIdentifier)?(loadNextItem(),this.itemStore.get(itemIdentifier)):this.request(this.configStorage.getItemActionUrl(itemIdentifier,"getItem"),params,void 0,!0).then(response=>(response&&response.success&&pruneStore().then(()=>this.itemStore.set(itemIdentifier,response)),loadNextItem(),response))},submitItem(itemIdentifier,state,response,params){return this.itemStore.update(itemIdentifier,"itemState",state).then(()=>qtiServiceProxy.submitItem.call(this,itemIdentifier,state,response,params))},sendVariables(variables,deferred){const action="storeTraceData",actionParams={traceData:JSON.stringify(variables)};return this.requestNetworkThenOffline(this.configStorage.getTestActionUrl("storeTraceData"),"storeTraceData",actionParams,deferred)},callTestAction(action,params,deferred){return this.requestNetworkThenOffline(this.configStorage.getTestActionUrl(action),action,params,deferred)},callItemAction(itemIdentifier,action,params,deferred){let updateStatePromise=Promise.resolve();const testMap=this.getDataHolder().get("testMap");return params.itemState&&(updateStatePromise=this.itemStore.update(itemIdentifier,"itemState",params.itemState)),this.getItemFromStore=navigationHelper.isMovingToNextItem(action,params)&&this.hasNextItem(itemIdentifier)||navigationHelper.isMovingToPreviousItem(action,params)&&this.hasPreviousItem(itemIdentifier)||navigationHelper.isJumpingToItem(action,params)&&this.hasItem(mapHelper.getItemIdentifier(testMap,params.ref)),(navigationHelper.isMovingToNextItem(action,params)||navigationHelper.isMovingToPreviousItem(action,params)||navigationHelper.isJumpingToItem(action,params))&&(params.start=!0),updateStatePromise.then(()=>this.requestNetworkThenOffline(this.configStorage.getItemActionUrl(itemIdentifier,action),action,_.merge({itemDefinition:itemIdentifier},params),deferred))}},qtiServiceProxy);return proxy}),define("taoQtiTest/runner/proxy/loader",["lodash","module","taoTests/runner/proxy"],function(_,module,proxy){"use strict";function load(){return new Promise(function(resolve,reject){require([config.module],function(proxyProvider){proxy.registerProvider(config.providerName,proxyProvider),resolve(config.providerName)},reject)})}_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,module=module&&Object.prototype.hasOwnProperty.call(module,"default")?module["default"]:module,proxy=proxy&&Object.prototype.hasOwnProperty.call(proxy,"default")?proxy["default"]:proxy;var config=_.defaults(module.config(),{providerName:"qtiServiceProxy",module:"taoQtiTest/runner/proxy/qtiServiceProxy"});return load}),define("taoQtiTest/runner/services/responseStore",["lodash","core/store"],function(_,store){"use strict";function responseStoreFactory(options){var config=_.defaults(options||{},defaultConfig),getResponseStore=function getResponseStore(){return store(config.responseStoreName,store.backends.memory)},getCorrectResponseStore=function getCorrectResponseStore(){return store(config.correctResponseStoreName,store.backends.memory)};return{getResponses:function getResponses(){return getResponseStore().then(function(storage){return storage.getItems()})},getCorrectResponses:function getCorrectResponses(){return getCorrectResponseStore().then(function(storage){return storage.getItems()})},getResponse:function getResponse(key){return getResponseStore().then(function(storage){return storage.getItem(key)})},getCorrectResponse:function getCorrectResponse(key){return getCorrectResponseStore().then(function(storage){return storage.getItem(key).then(function(result){return new Promise(function(resolve){return"undefined"==typeof result?resolve([]):resolve(result)})})})},addResponse:function addResponse(key,value){return getResponseStore().then(function(storage){return storage.setItem(key,value).then(function(updated){return updated})})},addCorrectResponse:function addCorrectResponse(key,value){return getCorrectResponseStore().then(function(storage){return storage.setItem(key,value).then(function(updated){return updated})})},clearResponses:function clearResponses(){return getResponseStore().then(function(storage){return storage.clear()})},clearCorrectResponses:function clearCorrectResponses(){return getCorrectResponseStore().then(function(storage){return storage.clear()})}}}_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,store=store&&Object.prototype.hasOwnProperty.call(store,"default")?store["default"]:store;var defaultConfig={responseStoreName:"response",correctResponseStoreName:"correct-response"};return responseStoreFactory}),define("taoQtiTest/runner/proxy/offline/proxy",["lodash","taoQtiTest/runner/navigator/offlineNavigator","taoQtiTest/runner/helpers/navigation","taoQtiTest/runner/provider/dataUpdater","taoQtiTest/runner/proxy/qtiServiceProxy","taoQtiTest/runner/proxy/cache/itemStore","taoQtiTest/runner/proxy/cache/actionStore","taoQtiTest/runner/helpers/offlineErrorHelper","taoQtiTest/runner/helpers/offlineSyncModal","taoQtiTest/runner/services/responseStore","util/download","taoQtiTest/runner/config/states"],function(_,offlineNavigatorFactory,navigationHelper,dataUpdater,qtiServiceProxy,itemStoreFactory,actionStoreFactory,offlineErrorHelper,offlineSyncModal,responseStoreFactory,download,states){"use strict";_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,offlineNavigatorFactory=offlineNavigatorFactory&&Object.prototype.hasOwnProperty.call(offlineNavigatorFactory,"default")?offlineNavigatorFactory["default"]:offlineNavigatorFactory,navigationHelper=navigationHelper&&Object.prototype.hasOwnProperty.call(navigationHelper,"default")?navigationHelper["default"]:navigationHelper,dataUpdater=dataUpdater&&Object.prototype.hasOwnProperty.call(dataUpdater,"default")?dataUpdater["default"]:dataUpdater,qtiServiceProxy=qtiServiceProxy&&Object.prototype.hasOwnProperty.call(qtiServiceProxy,"default")?qtiServiceProxy["default"]:qtiServiceProxy,itemStoreFactory=itemStoreFactory&&Object.prototype.hasOwnProperty.call(itemStoreFactory,"default")?itemStoreFactory["default"]:itemStoreFactory,actionStoreFactory=actionStoreFactory&&Object.prototype.hasOwnProperty.call(actionStoreFactory,"default")?actionStoreFactory["default"]:actionStoreFactory,offlineErrorHelper=offlineErrorHelper&&Object.prototype.hasOwnProperty.call(offlineErrorHelper,"default")?offlineErrorHelper["default"]:offlineErrorHelper,offlineSyncModal=offlineSyncModal&&Object.prototype.hasOwnProperty.call(offlineSyncModal,"default")?offlineSyncModal["default"]:offlineSyncModal,responseStoreFactory=responseStoreFactory&&Object.prototype.hasOwnProperty.call(responseStoreFactory,"default")?responseStoreFactory["default"]:responseStoreFactory,download=download&&Object.prototype.hasOwnProperty.call(download,"default")?download["default"]:download,states=states&&Object.prototype.hasOwnProperty.call(states,"default")?states["default"]:states;var proxy=_.defaults({name:"offline",install:function install(config){var self=this;const maxSyncAttempts=3;qtiServiceProxy.install.call(this),this.itemStore=itemStoreFactory({preload:!0,testId:config.serviceCallId}),this.responseStore=responseStoreFactory(),this.offlineNavigator=offlineNavigatorFactory(this.itemStore,this.responseStore),this.actionStore=null,this.requestConfig={},this.actionPromises={},this.syncInProgress=!1,this.dataUpdater=dataUpdater(this.getDataHolder()),this.hasItem=function hasItem(itemIdentifier){return itemIdentifier&&self.itemStore.has(itemIdentifier)},this.hasNextItem=function hasNextItem(itemIdentifier){var sibling=navigationHelper.getNextItem(this.getDataHolder().get("testMap"),itemIdentifier);return sibling&&self.hasItem(sibling.id)},this.hasPreviousItem=function hasPreviousItem(itemIdentifier){var sibling=navigationHelper.getPreviousItem(this.getDataHolder().get("testMap"),itemIdentifier);return sibling&&self.hasItem(sibling.id)},this.offlineAction=function offlineAction(action,actionParams){return new Promise(function(resolve,reject){var result={success:!0},blockingActions=["exitTest","timeout","pause"],dataHolder=self.getDataHolder(),testContext=dataHolder.get("testContext"),testMap=dataHolder.get("testMap"),isLast=!!(testContext&&testMap)&&navigationHelper.isLast(testMap,testContext.itemIdentifier),isOffline=self.isOffline(),isBlocked=blockingActions.includes(action),isNavigationAction="next"===actionParams.direction||"skip"===action,isMeaningfullScope=!!actionParams.scope,navigate=function(navigator,options,results){var newTestContext;navigator.setTestContext(options.testContext).setTestMap(options.testMap).navigate(actionParams.direction,actionParams.scope,actionParams.ref,actionParams).then(function(res){if(newTestContext=res,!newTestContext||!newTestContext.itemIdentifier||!self.hasItem(newTestContext.itemIdentifier))throw offlineErrorHelper.buildErrorFromContext(offlineErrorHelper.getOfflineNavError());results.testContext=newTestContext,resolve(results)}).catch(function(err){reject(err)})},isDirectionDefined;if("skip"===action&&(actionParams.direction=action),isDirectionDefined=!!actionParams.direction,isBlocked||isNavigationAction&&isLast){result.testContext={state:states.testSession.closed};const offlineSync=function(){offlineSyncModal(self).on("proceed",function(){self.syncData().then(function(){if(self.isOnline())return resolve(result)}).catch(function(){return resolve({success:!1})})}).on("secondaryaction",function(){self.initiateDownload().catch(function(){return resolve({success:!1})})})};return isOffline?offlineSync():self.syncData().then(function(){return self.isOffline()?offlineSync():resolve(result)}).catch(function(){return resolve({success:!1})})}if(!(isDirectionDefined&&isMeaningfullScope))resolve(result);else if(isOffline)navigate(self.offlineNavigator,{testContext:testContext,testMap:testMap},result);else return self.syncData().then(function(){navigate(self.offlineNavigator,{testContext:testContext,testMap:testMap},result)}).catch(function(){return resolve({success:!1})})})},this.scheduleAction=function scheduleAction(action,actionParams){return actionParams=_.assign(actionParams,{actionId:`${action}_${new Date().getTime()}`,offline:!0}),self.actionStore.push(action,self.prepareParams(_.defaults(actionParams||{},self.requestConfig))).then(function(){return{action:action,params:actionParams}})},this.sendSyncData=function sendSyncData(data){let attempt=1self.send("sync",data).then(resolve).catch(err=>self.isConnectivityError(err)&&attempt(self.syncInProgress=!1,data))})},this.prepareDownload=function prepareDownload(actions){const timestamp=Date.now(),dateTime=new Date(timestamp).toISOString(),testData=self.getDataHolder().get("testData"),testMap=self.getDataHolder().get("testMap"),niceFilename=`Download of ${testMap.title} at ${dateTime}.json`,isExitTest=actions.some(elem=>"exitTest"===elem.action);return{filename:niceFilename,content:JSON.stringify({isExitTest:isExitTest,timestamp:timestamp,testData:testData,actionQueue:actions,testConfig:self.requestConfig})}},this.initiateDownload=function initiateDownload(){return this.queue.serie(function(){return self.actionStore.flush().then(function(actions){return _.forEach(actions,function(action){self.actionStore.push(action.action,action.parameters,action.timestamp)}),actions}).then(self.prepareDownload).then(function(data){return download(data.filename,data.content)})})}},init:function init(config,params){var self=this,InitCallPromise=qtiServiceProxy.init.call(this,config,params);if(!this.getDataHolder())throw new Error("Unable to retrieve test runners data holder");return this.requestConfig=_.pick(config,["testDefinition","testCompilation","serviceCallId"]),this.actionStore=actionStoreFactory(config.serviceCallId),this.before("error",(e,error)=>!(self.isConnectivityError(error)&&self.syncInProgress)),InitCallPromise.then(function(response){var promises=[];return response.items||(response.items={}),self.itemStore.setCacheSize(_.size(response.items)),_.forEach(response.items,function(item,itemIdentifier){promises.push(self.itemStore.set(itemIdentifier,item))}),Promise.all(promises).then(()=>self.offlineNavigator.setTestContext(response.testContext).setTestMap(response.testMap).init()).then(()=>response)})},destroy:function destroy(){var self=this;return this.itemStore.clear().then(function(){return qtiServiceProxy.destroy.call(self)})},getItem:function getItem(itemIdentifier){return this.itemStore.get(itemIdentifier)},submitItem:function submitItem(itemIdentifier,state,response,params){var self=this;return this.itemStore.update(itemIdentifier,"itemState",state).then(function(){return qtiServiceProxy.submitItem.call(self,itemIdentifier,state,response,params)})},sendVariables:function sendVariables(variables){var self=this,action="storeTraceData",actionParams={traceData:JSON.stringify(variables)};return self.scheduleAction("storeTraceData",actionParams).then(function(){return self.offlineAction("storeTraceData",actionParams)}).catch(function(err){return Promise.reject(err)})},callTestAction:function callTestAction(action,params){var self=this;return self.scheduleAction(action,params).then(function(){return self.offlineAction(action,params)}).catch(function(err){return Promise.reject(err)})},callItemAction:function callItemAction(itemIdentifier,action,params){var self=this,updateStatePromise=Promise.resolve();return params.itemState&&(updateStatePromise=this.itemStore.update(itemIdentifier,"itemState",params.itemState)),(navigationHelper.isMovingToNextItem(action,params)||navigationHelper.isMovingToPreviousItem(action,params)||navigationHelper.isJumpingToItem(action,params))&&(params.start=!0),updateStatePromise.then(function(){return params=_.assign({itemDefinition:itemIdentifier},params),self.scheduleAction(action,params).then(function(){return self.offlineAction(action,params)}).catch(function(err){return Promise.reject(err)})}).catch(function(err){return Promise.reject(err)})}},qtiServiceProxy);return proxy}),function(c){var d=document,a="appendChild",i="styleSheet",s=d.createElement("style");s.type="text/css",d.getElementsByTagName("head")[0].appendChild(s),s.styleSheet?s.styleSheet.cssText=c:s.appendChild(d.createTextNode(c))}(".qti-navigator-default{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;-o-flex-direction:column;flex-direction:column;padding:0;cursor:default;min-width:calc(18rem - 8px);height:100%;position:relative}.qti-navigator-default span{display:inline-block}.qti-navigator-default .collapsed .collapsible-panel{display:none !important}.qti-navigator-default .collapsed .qti-navigator-label .icon-up{display:none}.qti-navigator-default .collapsed .qti-navigator-label .icon-down{display:inline-block}.qti-navigator-default .collapsible>.qti-navigator-label,.qti-navigator-default .qti-navigator-item>.qti-navigator-label{cursor:pointer}.qti-navigator-default.scope-test-section .qti-navigator-part>.qti-navigator-label{display:none !important}.qti-navigator-default .qti-navigator-label{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;min-width:calc(100% - 12px);padding:0 6px;line-height:3rem}.qti-navigator-default .qti-navigator-label .icon-up,.qti-navigator-default .qti-navigator-label .icon-down{line-height:3rem;margin-left:auto}.qti-navigator-default .qti-navigator-label .icon-down{display:none}.qti-navigator-default .qti-navigator-label .qti-navigator-number{display:none}.qti-navigator-default .qti-navigator-icon,.qti-navigator-default .icon{position:relative;top:1px;display:inline-block;line-height:2.8rem;margin-right:.5rem}.qti-navigator-default .unseen .qti-navigator-icon{cursor:default}.qti-navigator-default.prevents-unseen:not(.skipahead-enabled) .unseen .qti-navigator-icon,.qti-navigator-default.prevents-unseen:not(.skipahead-enabled) .unseen .qti-navigator-label{cursor:not-allowed !important}.qti-navigator-default .icon-answered:before{content:\"\uE69A\"}.qti-navigator-default .icon-viewed:before{content:\"\uE631\"}.qti-navigator-default .icon-flagged:before{content:\"\uE64E\"}.qti-navigator-default .icon-unanswered:before,.qti-navigator-default .icon-unseen:before{content:\"\uE6A5\"}.qti-navigator-default .qti-navigator-counter{text-align:right;margin-left:auto;font-size:12px;font-size:1.2rem}.qti-navigator-default .qti-navigator-actions{text-align:center}.qti-navigator-default .qti-navigator-info.collapsed{height:calc(3rem + 1px)}.qti-navigator-default .qti-navigator-info{height:calc(5*(3rem + 1px));overflow:hidden}.qti-navigator-default .qti-navigator-info>.qti-navigator-label{min-width:calc(100% - 16px);padding:0 8px}.qti-navigator-default .qti-navigator-info ul{padding:0 4px}.qti-navigator-default .qti-navigator-info ul .qti-navigator-label span.qti-navigator-text{padding:0 6px;min-width:10rem}.qti-navigator-default .qti-navigator-info ul .qti-navigator-label span.qti-navigator-icon{min-width:1.5rem}.qti-navigator-default .qti-navigator-info ul .qti-navigator-label span.qti-navigator-counter{min-width:5rem}.qti-navigator-default .qti-navigator-filters{margin-top:1rem;text-align:center;width:15rem;height:calc(3rem + (2 * 1px))}.qti-navigator-default .qti-navigator-filters ul{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch}.qti-navigator-default .qti-navigator-filters li{display:block}.qti-navigator-default .qti-navigator-filters li .qti-navigator-tab{border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px;border-left:none;line-height:3rem;min-width:5rem;cursor:pointer;white-space:nowrap}.qti-navigator-default .qti-navigator-tree{-webkit-flex:1;-moz-flex:1;-ms-flex:1;-o-flex:1;flex:1;overflow-y:auto}.qti-navigator-default .qti-navigator-linear,.qti-navigator-default .qti-navigator-linear-part{padding:8px}.qti-navigator-default .qti-navigator-linear .icon,.qti-navigator-default .qti-navigator-linear-part .icon{display:none}.qti-navigator-default .qti-navigator-linear .qti-navigator-label,.qti-navigator-default .qti-navigator-linear-part .qti-navigator-label{font-size:14px;font-size:1.4rem}.qti-navigator-default .qti-navigator-linear .qti-navigator-title,.qti-navigator-default .qti-navigator-linear-part .qti-navigator-title{font-size:14px;font-size:1.4rem;margin:8px 0}.qti-navigator-default .qti-navigator-linear .qti-navigator-message,.qti-navigator-default .qti-navigator-linear-part .qti-navigator-message{font-size:14px;font-size:1.4rem}.qti-navigator-default .qti-navigator-part>.qti-navigator-label{padding:0 8px}.qti-navigator-default .qti-navigator-part:not(:first-child){margin-top:1px}.qti-navigator-default .qti-navigator-section>.qti-navigator-label{padding:0 8px}.qti-navigator-default .qti-navigator-item{margin:1px 0;padding-left:10px}.qti-navigator-default .qti-navigator-item:first-child{margin-top:0}.qti-navigator-default .qti-navigator-item.disabled>.qti-navigator-label{cursor:not-allowed}.qti-navigator-default .qti-navigator-collapsible{cursor:pointer;text-align:center;display:none;position:absolute;top:0;bottom:0;right:0;padding-top:50%}.qti-navigator-default .qti-navigator-collapsible .icon{font-size:20px;font-size:2rem;width:1rem !important;height:2rem !important}.qti-navigator-default .qti-navigator-collapsible .qti-navigator-expand{display:none}.qti-navigator-default.collapsible{padding-right:calc(1rem + 10px) !important}.qti-navigator-default.collapsible .qti-navigator-collapsible{display:block}.qti-navigator-default.collapsed{width:calc(8rem + 1rem + 10px);min-width:8rem}.qti-navigator-default.collapsed ul{padding:0 !important}.qti-navigator-default.collapsed .qti-navigator-text,.qti-navigator-default.collapsed .qti-navigator-info>.qti-navigator-label,.qti-navigator-default.collapsed .qti-navigator-part>.qti-navigator-label,.qti-navigator-default.collapsed .qti-navigator-section>.qti-navigator-label,.qti-navigator-default.collapsed .qti-navigator-message{display:none !important}.qti-navigator-default.collapsed .qti-navigator-label{padding:0 2px !important;width:calc(8rem - 4px);min-width:calc(8rem - 4px)}.qti-navigator-default.collapsed .qti-navigator-icon,.qti-navigator-default.collapsed .icon{width:auto}.qti-navigator-default.collapsed .qti-navigator-counter{margin-left:0;min-width:4rem !important}.qti-navigator-default.collapsed .qti-navigator-collapsible .qti-navigator-collapse{display:none}.qti-navigator-default.collapsed .qti-navigator-collapsible .qti-navigator-expand{display:block}.qti-navigator-default.collapsed .qti-navigator-info{height:calc(4*(3rem + 1px))}.qti-navigator-default.collapsed .qti-navigator-info.collapsed .collapsible-panel{display:block !important}.qti-navigator-default.collapsed .qti-navigator-filters{width:calc(8rem - 16px)}.qti-navigator-default.collapsed .qti-navigator-filter span{display:none}.qti-navigator-default.collapsed .qti-navigator-filter.active span{display:block;border:0 none;width:calc(8rem - 16px)}.qti-navigator-default.collapsed .qti-navigator-item,.qti-navigator-default.collapsed .qti-navigator-linear,.qti-navigator-default.collapsed .qti-navigator-linear-part{padding-left:2px;text-align:center}.qti-navigator-default.collapsed .qti-navigator-item{overflow:hidden}.qti-navigator-default.collapsed .qti-navigator-item .qti-navigator-icon{padding-left:6px;width:2rem}.qti-navigator-default.collapsed .qti-navigator-item .qti-navigator-number{display:inline-block;margin-left:6px;margin-right:8rem}.qti-navigator-default.collapsed .qti-navigator-linear,.qti-navigator-default.collapsed .qti-navigator-linear-part{padding:0 0 8px 0}.qti-navigator-default.collapsed .qti-navigator-linear .icon,.qti-navigator-default.collapsed .qti-navigator-linear-part .icon{display:block}.qti-navigator-default.collapsed .qti-navigator-actions button{padding:0 9px 0 5px}.qti-navigator-default .qti-navigator-info>.qti-navigator-label{background-color:#d4d5d7;color:#222;border-top:1px solid #d4d5d7}.qti-navigator-default .qti-navigator-info li{border-bottom:1px solid #fff}.qti-navigator-default .qti-navigator-filter .qti-navigator-tab{background-color:#fff}.qti-navigator-default .qti-navigator-filter .qti-navigator-tab:hover{background-color:#3e7da7;color:#fff}.qti-navigator-default .qti-navigator-filter.active .qti-navigator-tab{background-color:#a4a9b1;color:#fff}.qti-navigator-default .qti-navigator-linear,.qti-navigator-default .qti-navigator-linear-part{background:#fff}.qti-navigator-default .qti-navigator-part>.qti-navigator-label{background-color:#dddfe2}.qti-navigator-default .qti-navigator-part>.qti-navigator-label:hover{background-color:#c6cacf}.qti-navigator-default .qti-navigator-part.active>.qti-navigator-label{background-color:#c0c4ca}.qti-navigator-default .qti-navigator-section>.qti-navigator-label{border-bottom:1px solid #fff}.qti-navigator-default .qti-navigator-section>.qti-navigator-label:hover{background-color:#ebe8e4}.qti-navigator-default .qti-navigator-section.active>.qti-navigator-label{background-color:#ded9d4}.qti-navigator-default .qti-navigator-item{background:#fff}.qti-navigator-default .qti-navigator-item.active{background:#0e5d91;color:#fff}.qti-navigator-default .qti-navigator-item:hover{background:#0a3f62;color:#fff}.qti-navigator-default .qti-navigator-item.disabled{background-color:#e2deda !important}.qti-navigator-default .qti-navigator-collapsible{background-color:#dfe1e4;color:#222}.qti-navigator-default .qti-navigator-collapsible .icon{color:#fff}.qti-navigator-fizzy{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;-o-flex-direction:column;flex-direction:column;cursor:default;min-width:calc(18rem - 8px);height:100%;position:relative;background-color:#f2f2f2 !important;width:30rem}.qti-navigator-fizzy .qti-navigator-tree{overflow-y:auto;max-height:100%;display:block;background:none;margin:0 5px}.qti-navigator-fizzy .qti-navigator-linear{padding:8px;margin:0 5px;background:#fff}.qti-navigator-fizzy .qti-navigator-linear .qti-navigator-message{font-size:14px;font-size:1.4rem}.qti-navigator-fizzy .qti-navigator-section{display:block}.qti-navigator-fizzy .qti-navigator-section .qti-navigator-label{background-color:initial;border:none;padding:0;line-height:initial;margin:13px 0 10px 0;font-size:15px;font-size:1.5rem}.qti-navigator-fizzy .qti-navigator-header{display:flex;justify-content:space-between;border-bottom:1px solid #cec7bf;padding:15px 0 5px 0;margin:0 5px;line-height:initial}.qti-navigator-fizzy .qti-navigator-header .qti-navigator-text{font-size:20px;font-size:2rem;font-weight:bold}.qti-navigator-fizzy .qti-navigator-header .icon-close{font-size:28px;font-size:2.8rem;line-height:3rem;color:#1f1f1f}.qti-navigator-fizzy .qti-navigator-header .icon-close:hover{color:#1f1f1f;text-decoration:none;cursor:pointer}.document-viewer-plugin{position:relative}.document-viewer-plugin .viewer-overlay{position:fixed;top:0;left:0;bottom:0;right:0;z-index:10000;width:100%;opacity:.5;background-color:#e4ecef}.document-viewer-plugin .viewer-panel{position:fixed;top:10px;left:10px;bottom:10px;right:10px;z-index:100000;color:#222;background:#f3f1ef;font-size:14px;font-size:1.4rem;border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px}.document-viewer-plugin .viewer-header{position:relative;width:100%;height:30px;padding:5px 0;z-index:1}.document-viewer-plugin .viewer-header .viewer-title{font-size:15px;font-size:1.5rem;padding:0;margin:0 0 0 1.6rem}.document-viewer-plugin .viewer-header .icon{float:right;font-size:20px;font-size:2rem;color:#266d9c;margin:1px 6px;top:3px}.document-viewer-plugin .viewer-header .icon:hover{cursor:pointer;opacity:.75}.document-viewer-plugin .viewer-content{padding:0 20px;margin-top:4px;position:relative;height:calc(100% - 40px);overflow:auto}.qti-choiceInteraction.maskable .qti-choice .answer-mask{position:absolute;top:0;right:0;height:100%;padding:5px 10px 0 10px;z-index:10;color:#0e5d91;border:solid 1px #222;background-color:#c8d6dc;text-align:right;vertical-align:middle}.qti-choiceInteraction.maskable .qti-choice .answer-mask:hover{color:#568eb2}.qti-choiceInteraction.maskable .qti-choice .answer-mask .answer-mask-toggle:before{font-family:\"tao\" !important;speak:never;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:\"\uE643\"}.qti-choiceInteraction.maskable .qti-choice .label-content{padding-right:40px}.qti-choiceInteraction.maskable .qti-choice.masked .answer-mask{width:100%}.qti-choiceInteraction.maskable .qti-choice.masked .answer-mask .answer-mask-toggle:before{font-family:\"tao\" !important;speak:never;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:\"\uE631\"}.qti-choiceInteraction.maskable .qti-choice.masked .answer-mask:hover{background-color:#d2dde2}.mask-container.mask-container{background-color:rgba(0,0,0,0)}.mask-container.mask-container .dynamic-component-title-bar{border-top-left-radius:5px;border-top-right-radius:5px;background-color:rgba(0,0,0,0);border:none;position:absolute;width:100%;z-index:1}.mask-container.mask-container .dynamic-component-title-bar.moving{background:#f3f1ef;border-bottom:1px solid #8d949e}.mask-container.mask-container .dynamic-component-title-bar .closer{display:none}.mask-container.mask-container .dynamic-component-resize-container .dynamic-component-resize-wrapper{bottom:0}.mask-container.mask-container .dynamic-component-resize-container .dynamic-component-resize-wrapper:hover,.mask-container.mask-container .dynamic-component-resize-container .dynamic-component-resize-wrapper.resizing{bottom:20px}.mask-container.mask-container .dynamic-component-content .mask{position:absolute;width:100%;height:100%;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;background:rgba(0,0,0,0);opacity:1}.mask-container.mask-container .dynamic-component-content .mask .inner{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;position:relative;width:100%;height:100%;background-color:#fff;opacity:1;box-sizing:content-box;padding-bottom:30px}.mask-container.mask-container .dynamic-component-content .mask .controls{background:#f3f1ef;position:absolute;top:0;right:0;padding:0 5px 0 10px;border-radius:5px;border-top-left-radius:0;border-bottom-right-radius:0;border-bottom:1px solid #8d949e;border-left:1px solid #8d949e;height:30px;z-index:2}.mask-container.mask-container .dynamic-component-content .mask .controls a{text-decoration:none;margin-right:5px;vertical-align:middle}.mask-container.mask-container .dynamic-component-content .mask .controls a:hover{color:#0a4166}.mask-container.mask-container .dynamic-component-content .mask .controls .view{font-size:20px;font-size:2rem}.mask-container.mask-container .dynamic-component-content .mask .controls .close{font-size:20px;font-size:2rem}.mask-container.mask-container .dynamic-component-content.moving .mask .inner{border-color:rgba(14,93,145,.5);opacity:.55}.mask-container.mask-container .dynamic-component-content.moving .mask .controls{border-left:none;border-bottom-left-radius:0;z-index:2}.mask-container.mask-container .dynamic-component-content.sizing .mask{border-color:rgba(14,93,145,.5)}.mask-container.mask-container .dynamic-component-content.sizing .mask .inner{opacity:.55}.mask-container.mask-container .dynamic-component-content.sizing .mask .controls{background-color:rgba(0,0,0,0);border-bottom:none;border-left:none}.mask-container.mask-container.previewing .dynamic-component-content .mask .inner{opacity:.15;-webkit-transition:opacity, 600ms, ease, 0s;-moz-transition:opacity, 600ms, ease, 0s;-ms-transition:opacity, 600ms, ease, 0s;-o-transition:opacity, 600ms, ease, 0s;transition:opacity, 600ms, ease, 0s}.mask-container.mask-container.previewing .dynamic-component-content .mask .controls{background-color:rgba(0,0,0,0);border-bottom:none;border-left:none}.connectivity-box{display:none;width:40px;margin-left:40px}.connectivity-box.with-message{width:60px}.connectivity-box .icon-connect,.connectivity-box .icon-disconnect{display:none;line-height:2;font-size:16px;font-size:1.6rem;text-shadow:0 1px 0 rgba(0,0,0,.9)}.connectivity-box .message-connect,.connectivity-box .message-disconnected{display:none;font-size:14px;font-size:1.4rem;text-shadow:none;margin-right:3px}.connectivity-box.connected,.connectivity-box.disconnected{display:inline-block}.connectivity-box.connected .icon-connect,.connectivity-box.connected .message-connect{display:inline-block}.connectivity-box.disconnected .icon-disconnect,.connectivity-box.disconnected .message-disconnected{display:inline-block}.line-reader-mask{box-sizing:border-box;border:0 solid #0e5d91;background-color:#f3f7fa}.line-reader-mask.hidden{display:none}.line-reader-mask.resizing{background-color:rgba(243,247,250,.8);border-color:rgba(14,93,145,.5)}.line-reader-mask.resizer{z-index:99999 !important}.line-reader-mask.resizer.se .resize-control{border-right:2px solid #0e5d91;border-bottom:2px solid #0e5d91;width:40px;height:40px}.line-reader-mask.border-top{border-top-width:1px}.line-reader-mask.border-right{border-right-width:1px}.line-reader-mask.border-bottom{border-bottom-width:1px}.line-reader-mask.border-left{border-left-width:1px}.line-reader-mask.ne{-webkit-border-top-right-radius:5px;-moz-border-radius-topright:5px;border-top-right-radius:5px}.line-reader-mask.se{-webkit-border-bottom-right-radius:5px;-moz-border-radius-bottomright:5px;border-bottom-right-radius:5px}.line-reader-mask.sw{-webkit-border-bottom-left-radius:5px;-moz-border-radius-bottomleft:5px;border-bottom-left-radius:5px}.line-reader-mask.nw{-webkit-border-top-left-radius:5px;-moz-border-radius-topleft:5px;border-top-left-radius:5px}.line-reader-mask.se .resize-control{width:20px;height:20px;margin-bottom:10px;margin-right:10px;border-right:1px solid #0e5d91;border-bottom:1px solid #0e5d91;position:absolute;right:0;bottom:0;cursor:nwse-resize}.line-reader-mask.e .resize-control{position:absolute;width:20px;height:20px;bottom:-10px;left:-10px;border-right:1px solid #0e5d91;border-bottom:1px solid #0e5d91;cursor:nesw-resize}.line-reader-mask.s .resize-control{position:absolute;width:20px;height:10px;right:-10px;border-bottom:1px solid #0e5d91}.line-reader-overlay{box-sizing:border-box;opacity:0}.line-reader-overlay.hidden{display:none}.line-reader-overlay.moving{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.line-reader-overlay.moving.n{max-height:none}.line-reader-overlay.moving,.line-reader-overlay .inner-window{overflow:hidden;position:absolute;opacity:1;background-color:rgba(0,0,0,0);border:1px solid rgba(14,93,145,.5)}.line-reader-overlay .inner-window{box-sizing:content-box}.line-reader-overlay .mask-bg{box-sizing:border-box;border:0 solid rgba(243,247,250,.8);background-color:rgba(0,0,0,0);position:absolute}.line-reader-overlay.n{max-height:30px;opacity:1}.line-reader-overlay.n .icon-mobile-menu{font-size:22px;font-size:2.2rem;display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;-o-justify-content:center;justify-content:center;border-bottom:1px solid #0e5d91;color:#0e5d91;position:absolute;left:0;top:0;height:30px;width:100%;z-index:1}.line-reader-overlay.n .icon-mobile-menu:hover{color:#0a4166}.line-reader-overlay.n .icon-mobile-menu:before{position:relative;top:3px}.line-reader-overlay .icon-mobile-menu{display:none}.line-reader-inner-drag{-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;-o-justify-content:center;justify-content:center;text-align:center;padding-top:3px;color:#0e5d91}.line-reader-inner-drag.hidden{display:none}.line-reader-inner-drag:hover{background-color:#87aec8;color:#0a4166}.line-reader-inner-drag.moving{background-color:rgba(0,0,0,0);color:#9fbed3}.line-reader-inner-drag .icon{text-shadow:none !important;border-bottom-left-radius:110px;border-bottom-right-radius:110px;border:1px solid #0e5d91;border-top:0;width:50px;height:25px;position:relative;bottom:10px}.line-reader-inner-drag .icon:before{position:relative;top:5px;left:1px}.line-reader-closer{font-size:22px;font-size:2.2rem;cursor:pointer;color:#0e5d91;width:12px;height:12px}.line-reader-closer:hover{color:#0a4166}.line-reader-closer .icon{text-shadow:none !important}.magnifier-container.magnifier-container{background-color:rgba(0,0,0,0)}.magnifier-container.magnifier-container .dynamic-component-title-bar{border-top-left-radius:5px;border-top-right-radius:5px;background-color:rgba(0,0,0,0);border:none;position:absolute;width:100%;z-index:3}.magnifier-container.magnifier-container .dynamic-component-title-bar.moving{background:#f3f1ef;border-bottom:1px solid #8d949e}.magnifier-container.magnifier-container .dynamic-component-title-bar .closer{display:none}.magnifier-container.magnifier-container .dynamic-component-resize-container .dynamic-component-resize-wrapper{bottom:0}.magnifier-container.magnifier-container .dynamic-component-resize-container .dynamic-component-resize-wrapper:hover,.magnifier-container.magnifier-container .dynamic-component-resize-container .dynamic-component-resize-wrapper.resizing{bottom:20px}.magnifier-container.magnifier-container .dynamic-component-content .magnifier{position:absolute;width:100%;height:100%;overflow:hidden;background-color:#fff;opacity:1;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;box-sizing:content-box;padding-bottom:30px}@-o-keyframes fadeIn{0%{opacity:0;visibility:visible}100%{opacity:1;visibility:visible}}@-moz-keyframes fadeIn{0%{opacity:0;visibility:visible}100%{opacity:1;visibility:visible}}@-webkit-keyframes fadeIn{0%{opacity:0;visibility:visible}100%{opacity:1;visibility:visible}}@keyframes fadeIn{0%{opacity:0;visibility:visible}100%{opacity:1;visibility:visible}}@-o-keyframes fadeOut{0%{opacity:1;visibility:visible}100%{opacity:0;visibility:hidden}}@-moz-keyframes fadeOut{0%{opacity:1;visibility:visible}100%{opacity:0;visibility:hidden}}@-webkit-keyframes fadeOut{0%{opacity:1;visibility:visible}100%{opacity:0;visibility:hidden}}@keyframes fadeOut{0%{opacity:1;visibility:visible}100%{opacity:0;visibility:hidden}}@-o-keyframes pop{0%{opacity:0;visibility:visible}50%{opacity:.5;visibility:visible;transform:scale(2)}100%{opacity:0;visibility:hidden;transform:scale(3)}}@-moz-keyframes pop{0%{opacity:0;visibility:visible}50%{opacity:.5;visibility:visible;transform:scale(2)}100%{opacity:0;visibility:hidden;transform:scale(3)}}@-webkit-keyframes pop{0%{opacity:0;visibility:visible}50%{opacity:.5;visibility:visible;transform:scale(2)}100%{opacity:0;visibility:hidden;transform:scale(3)}}@keyframes pop{0%{opacity:0;visibility:visible}50%{opacity:.5;visibility:visible;transform:scale(2)}100%{opacity:0;visibility:hidden;transform:scale(3)}}.magnifier-container.magnifier-container .dynamic-component-content .magnifier .level{position:absolute;overflow:hidden;z-index:1;top:0;left:0;bottom:0;right:0;background:rgba(0,0,0,0);color:#3e7da7;opacity:1;font-size:50px;font-size:5rem;display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;-o-justify-content:center;justify-content:center;-webkit-animation:pop 400ms forwards;-moz-animation:pop 400ms forwards;-ms-animation:pop 400ms forwards;-o-animation:pop 400ms forwards;animation:pop 400ms forwards}.magnifier-container.magnifier-container .dynamic-component-content .magnifier .level:before{content:\"x\"}.magnifier-container.magnifier-container .dynamic-component-content .magnifier .overlay{position:absolute;overflow:hidden;z-index:2;top:0;left:0;bottom:0;right:0;background:rgba(0,0,0,0)}.magnifier-container.magnifier-container .dynamic-component-content .magnifier>.controls{position:absolute;background-color:#f3f1ef;border:0 solid #8d949e;min-height:29px;z-index:4}.magnifier-container.magnifier-container .dynamic-component-content .magnifier>.controls a{color:#222;text-decoration:none;font-size:20px;font-size:2rem;margin:0 2px}.magnifier-container.magnifier-container .dynamic-component-content .magnifier>.controls a:hover{color:#0a4166}.magnifier-container.magnifier-container .dynamic-component-content .magnifier>.controls.close{top:0;right:0;border-bottom-width:1px;border-left-width:1px;-webkit-border-bottom-left-radius:5px;-moz-border-radius-bottomleft:5px;border-bottom-left-radius:5px}.magnifier-container.magnifier-container .dynamic-component-content .magnifier .inner{position:absolute}.magnifier-container.magnifier-container .dynamic-component-content.moving .magnifier .controls{border-left:none;border-bottom-left-radius:0}.magnifier-container.magnifier-container .dynamic-component-content.sizing{border-color:rgba(14,93,145,.5)}.magnifier-container.magnifier-container .dynamic-component-content.sizing .inner,.magnifier-container.magnifier-container .dynamic-component-content.sizing .controls,.magnifier-container.magnifier-container .dynamic-component-content.sizing .level{opacity:.45 !important}.progress-box .progressbar .progressbar-points{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch}.progress-box .progressbar .progressbar-points>span.progressbar-point{flex:1;display:inline-block;border:1px solid #0e5d91;background-color:#f3f1ef;height:calc(1rem - 4px);margin:0 1px 0 0}.progress-box .progressbar .progressbar-points>span.progressbar-point:last-child{margin-right:0}.progress-box .progressbar .progressbar-points>span.progressbar-point.reached{background-color:#0e5d91}.progress-box .progressbar .progressbar-points>span.progressbar-point.current{background-color:#a4a9b1}.tts-container .tts-controls{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;background-color:#f3f1ef;-webkit-box-shadow:0 2px 3px 1px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 2px 3px 1px rgba(0, 0, 0, 0.2);-ms-box-shadow:0 2px 3px 1px rgba(0, 0, 0, 0.2);-o-box-shadow:0 2px 3px 1px rgba(0, 0, 0, 0.2);box-shadow:0 2px 3px 1px rgba(0, 0, 0, 0.2)}.tts-container .tts-controls .tts-control{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;-o-justify-content:center;justify-content:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;color:#222;height:100%;padding:6px 8.5px;text-decoration:none}.tts-container .tts-controls .tts-control .tts-control-label{padding-left:7.5px}.tts-container .tts-controls .tts-control .tts-icon{font-size:18px;text-align:center;width:18px}.tts-container .tts-controls .tts-control .icon-pause{display:none}.tts-container .tts-controls .tts-control.tts-control-drag{cursor:move}.tts-container .tts-controls .tts-control.tts-control-drag .tts-icon{color:#555}.tts-container .tts-controls .tts-control.tts-control-drag:hover{background-color:rgba(0,0,0,0)}.tts-container .tts-controls .tts-control:hover{background-color:#ddd8d2}.tts-container .tts-controls .tts-control-container{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch}.tts-container .tts-controls .tts-control-container .tts-slider-container{display:none}.tts-container .tts-controls .tts-control-container .tts-slider-container .tts-slider{margin:0 8.5px;width:80px}.tts-container.playing .tts-controls .tts-control .icon-pause{display:block}.tts-container.playing .tts-controls .tts-control .icon-play{display:none}.tts-container.sfhMode .tts-controls .tts-control.tts-control-mode{-webkit-box-shadow:inset 2px 2px 4px rgba(0, 0, 0, 0.2);-moz-box-shadow:inset 2px 2px 4px rgba(0, 0, 0, 0.2);-ms-box-shadow:inset 2px 2px 4px rgba(0, 0, 0, 0.2);-o-box-shadow:inset 2px 2px 4px rgba(0, 0, 0, 0.2);box-shadow:inset 2px 2px 4px rgba(0, 0, 0, 0.2);background-color:#ddd8d2}.tts-container.settings .tts-controls .tts-control-container .tts-slider-container{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center}.tts-container.settings .tts-controls .tts-control-container:last-child{-webkit-box-shadow:inset 2px 2px 4px rgba(0, 0, 0, 0.2);-moz-box-shadow:inset 2px 2px 4px rgba(0, 0, 0, 0.2);-ms-box-shadow:inset 2px 2px 4px rgba(0, 0, 0, 0.2);-o-box-shadow:inset 2px 2px 4px rgba(0, 0, 0, 0.2);box-shadow:inset 2px 2px 4px rgba(0, 0, 0, 0.2);background-color:#ddd8d2}.tts-container.settings .tts-controls .tts-control-container .tts-control-settings:hover{background-color:rgba(0,0,0,0)}.tts-content-node{outline:none}.tts-visible.tts-component-container .test-runner-sections .tts-content-node:hover,.tts-visible.tts-component-container .test-runner-sections .tts-content-node:focus{background-color:rgba(0,0,0,0) !important;color:#222 !important}.tts-visible.tts-component-container .test-runner-sections .tts-content-node .label-box,.tts-visible.tts-component-container .test-runner-sections .tts-content-node .qti-choice{cursor:default !important}.tts-sfhMode.tts-component-container .test-runner-sections{cursor:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxNHB4IiBoZWlnaHQ9IjE0cHgiIHZpZXdCb3g9IjAgMCAxNCAxNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT5Hcm91cCAyPC90aXRsZT4gICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+ICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9IkFydGJvYXJkIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjQuMDAwMDAwLCAtMTYuMDAwMDAwKSI+ICAgICAgICAgICAgPGcgaWQ9Ikdyb3VwLTIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIzLjAwMDAwMCwgMTUuMDAwMDAwKSI+ICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtQ29weS02IiB4PSIwIiB5PSIwIiB3aWR0aD0iMTYiIGhlaWdodD0iMTYiPjwvcmVjdD4gICAgICAgICAgICAgICAgPGcgaWQ9Imljb24tLy0xNi0vLWNoZXZyb24tYm90dG9tLWNvcHkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEuMDAwMDAwLCAyLjAwMDAwMCkiIGZpbGw9IiMyRDJEMkQiPiAgICAgICAgICAgICAgICAgICAgPHBvbHlnb24gaWQ9InN3YXAtaWNvbi1jb2xvciIgcG9pbnRzPSIwIDAgMCA4IDYgNCI+PC9wb2x5Z29uPiAgICAgICAgICAgICAgICA8L2c+ICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtQ29weSIgZmlsbD0iIzJEMkQyRCIgeD0iOSIgeT0iNSIgd2lkdGg9IjYiIGhlaWdodD0iMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLUNvcHktNCIgZmlsbD0iIzJEMkQyRCIgeD0iOSIgeT0iMSIgd2lkdGg9IjYiIGhlaWdodD0iMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLUNvcHktMiIgZmlsbD0iIzJEMkQyRCIgeD0iOSIgeT0iOSIgd2lkdGg9IjYiIGhlaWdodD0iMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLUNvcHktMyIgZmlsbD0iIzJEMkQyRCIgeD0iMSIgeT0iMTMiIHdpZHRoPSIxNCIgaGVpZ2h0PSIyIj48L3JlY3Q+ICAgICAgICAgICAgPC9nPiAgICAgICAgPC9nPiAgICA8L2c+PC9zdmc+) 0 32,auto !important}.tts-sfhMode.tts-component-container .test-runner-sections .tts-content-node.tts-active-content-node:hover{color:#222 !important;background-color:#ff0 !important}.tts-sfhMode.tts-component-container .test-runner-sections .tts-content-node:hover,.tts-sfhMode.tts-component-container .test-runner-sections .tts-content-node:focus{color:#222 !important;background-color:#f3f1ef !important}.tts-sfhMode.tts-component-container .test-runner-sections .tts-content-node .label-box,.tts-sfhMode.tts-component-container .test-runner-sections .tts-content-node .qti-choice{cursor:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxNHB4IiBoZWlnaHQ9IjE0cHgiIHZpZXdCb3g9IjAgMCAxNCAxNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT5Hcm91cCAyPC90aXRsZT4gICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+ICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9IkFydGJvYXJkIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjQuMDAwMDAwLCAtMTYuMDAwMDAwKSI+ICAgICAgICAgICAgPGcgaWQ9Ikdyb3VwLTIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIzLjAwMDAwMCwgMTUuMDAwMDAwKSI+ICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtQ29weS02IiB4PSIwIiB5PSIwIiB3aWR0aD0iMTYiIGhlaWdodD0iMTYiPjwvcmVjdD4gICAgICAgICAgICAgICAgPGcgaWQ9Imljb24tLy0xNi0vLWNoZXZyb24tYm90dG9tLWNvcHkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEuMDAwMDAwLCAyLjAwMDAwMCkiIGZpbGw9IiMyRDJEMkQiPiAgICAgICAgICAgICAgICAgICAgPHBvbHlnb24gaWQ9InN3YXAtaWNvbi1jb2xvciIgcG9pbnRzPSIwIDAgMCA4IDYgNCI+PC9wb2x5Z29uPiAgICAgICAgICAgICAgICA8L2c+ICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtQ29weSIgZmlsbD0iIzJEMkQyRCIgeD0iOSIgeT0iNSIgd2lkdGg9IjYiIGhlaWdodD0iMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLUNvcHktNCIgZmlsbD0iIzJEMkQyRCIgeD0iOSIgeT0iMSIgd2lkdGg9IjYiIGhlaWdodD0iMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLUNvcHktMiIgZmlsbD0iIzJEMkQyRCIgeD0iOSIgeT0iOSIgd2lkdGg9IjYiIGhlaWdodD0iMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLUNvcHktMyIgZmlsbD0iIzJEMkQyRCIgeD0iMSIgeT0iMTMiIHdpZHRoPSIxNCIgaGVpZ2h0PSIyIj48L3JlY3Q+ICAgICAgICAgICAgPC9nPiAgICAgICAgPC9nPiAgICA8L2c+PC9zdmc+) 0 32,auto !important}.tts-sfhMode.tts-component-container .test-runner-sections img.tts-content-node:hover,.tts-sfhMode.tts-component-container .test-runner-sections img.tts-content-node:focus{padding:5px}.tts-playing.tts-component-container .test-runner-sections .tts-content-node.tts-active-content-node,.tts-playing.tts-component-container .test-runner-sections .tts-content-node.tts-active-content-node *{color:#222 !important;background-color:#ff0 !important}.tts-playing.tts-component-container .test-runner-sections .tts-content-node.tts-active-content-node:hover,.tts-playing.tts-component-container .test-runner-sections .tts-content-node.tts-active-content-node *:hover{color:#222 !important;background-color:#ff0 !important}.tts-playing.tts-component-container .test-runner-sections img.tts-content-node.tts-active-content-node{padding:5px}body.delivery-scope{min-height:100vh;max-height:100vh;margin-bottom:0}.runner{position:relative}.qti-choiceInteraction .overlay-answer-eliminator{display:none}.test-runner-scope{position:relative;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:calc(100vh - 99px)}.test-runner-scope .landmark-title-hidden{width:1px;height:1px;overflow:hidden;position:absolute}.test-runner-scope .test-runner-sections{-webkit-flex:1 1 0%;-ms-flex:1 1 0%;flex:1 1 0%;overflow:hidden;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.test-runner-scope .test-sidebar{background:#f3f1ef;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;overflow-y:auto;max-width:350px}.test-runner-scope .test-sidebar>.qti-panel{max-width:350px;padding:10px}@media only screen and (max-device-width: 800px){.test-runner-scope .test-sidebar{max-width:200px}.test-runner-scope .test-sidebar>.qti-panel{max-width:200px}}@media only screen and (min-device-width: 800px)and (max-device-width: 1280px){.test-runner-scope .test-sidebar{max-width:250px}.test-runner-scope .test-sidebar>.qti-panel{max-width:250px}}@media only screen and (min-device-width: 1280px)and (max-device-width: 1440px){.test-runner-scope .test-sidebar{max-width:300px}.test-runner-scope .test-sidebar>.qti-panel{max-width:300px}}.test-runner-scope .test-sidebar-left{border-right:1px #ddd solid}.test-runner-scope .test-sidebar-right{border-left:1px #ddd solid}.test-runner-scope .content-wrapper{position:relative;-webkit-flex:1 1 0%;-ms-flex:1 1 0%;flex:1 1 0%;overflow:auto;padding:0}.test-runner-scope .content-wrapper .overlay{position:absolute;left:0;right:0;top:0;bottom:0;width:100%;opacity:.9}.test-runner-scope .content-wrapper .overlay-full{background-color:#fff;opacity:1}.test-runner-scope #qti-content{-webkit-overflow-scrolling:touch;max-width:1024px;width:100%;margin:auto}.test-runner-scope #qti-item{width:100%;min-width:100%;height:auto;overflow:visible}.test-runner-scope .qti-item{padding:30px}.test-runner-scope .size-wrapper{max-width:1280px;margin:auto;width:100%}.test-runner-scope #qti-rubrics{margin:auto;max-width:1024px;width:100%}.test-runner-scope #qti-rubrics .qti-rubricBlock{margin:20px 0}.test-runner-scope #qti-rubrics .hidden{display:none}.test-runner-scope .visible-hidden{position:absolute;overflow:hidden;height:1px;width:1px;word-wrap:normal}.no-controls .test-runner-scope{height:100vh}.test-runner-scope .action-bar.content-action-bar{padding:2px}.test-runner-scope .action-bar.content-action-bar li{margin:2px 0 0 10px;border:none}.test-runner-scope .action-bar.content-action-bar li.btn-info{padding-top:6px;height:36px;margin-top:0;border-bottom:solid 2px rgba(0,0,0,0);border-radius:0}.test-runner-scope .action-bar.content-action-bar li.btn-info.btn-group{border:none !important;overflow:hidden;padding:0}.test-runner-scope .action-bar.content-action-bar li.btn-info.btn-group a{float:left;margin:0 2px;padding:0 15px;border:1px solid rgba(255,255,255,.3);border-radius:0px;display:inline-block;height:inherit}.test-runner-scope .action-bar.content-action-bar li.btn-info.btn-group a:first-of-type{border-top-left-radius:3px;border-bottom-left-radius:3px;margin-left:0}.test-runner-scope .action-bar.content-action-bar li.btn-info.btn-group a:last-of-type{border-top-right-radius:3px;border-bottom-right-radius:3px;margin-right:0}.test-runner-scope .action-bar.content-action-bar li.btn-info.btn-group a:hover,.test-runner-scope .action-bar.content-action-bar li.btn-info.btn-group a.active{border-color:rgba(255,255,255,.8)}.test-runner-scope .action-bar.content-action-bar li.btn-info.btn-group a .no-label{padding-right:0}.test-runner-scope .action-bar.content-action-bar li.btn-info:hover,.test-runner-scope .action-bar.content-action-bar li.btn-info.active{border-bottom-color:rgba(255,255,255,.8)}.test-runner-scope .action-bar.content-action-bar li.btn-info:active,.test-runner-scope .action-bar.content-action-bar li.btn-info.active{background:#e7eff4;border-color:rgba(255,255,255,.8)}.test-runner-scope .action-bar.content-action-bar li.btn-info:active a,.test-runner-scope .action-bar.content-action-bar li.btn-info.active a{color:#266d9c;text-shadow:none}.test-runner-scope .action-bar.content-action-bar li.btn-info:active:hover,.test-runner-scope .action-bar.content-action-bar li.btn-info.active:hover{background:#fff}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar{opacity:1;height:40px;flex-basis:40px}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box{height:38px;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:space-between;-ms-flex-pack:space-between;justify-content:space-between;padding-left:10px;padding-right:10px}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box .title-box{font-size:14px;font-size:1.4rem;padding:4px 0 0;-ms-flex:0 1 auto;-webkit-flex:0 1 auto;flex:0 1 auto}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box .progress-box,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box .item-number-box{padding-top:4px;white-space:nowrap;-ms-flex:0 1 auto;-webkit-flex:0 1 auto;flex:0 1 auto}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box .progress-box .qti-controls,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box .item-number-box .qti-controls{display:inline-block;margin-left:20px;white-space:nowrap}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box .timer-box{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box .progressbar{margin-top:5px;min-width:150px;max-width:200px;height:.6em}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box{color:rgba(255,255,255,.9);text-shadow:1px 1px 0 #000}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .lft,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .rgt{padding-left:20px}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .lft:first-child,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .rgt:first-child{padding-left:0}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .lft:last-child ul,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .rgt:last-child ul{display:inline-block}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box [class^=btn-],.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box [class*=\" btn-\"]{white-space:nowrap}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .action{position:relative;overflow:visible}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu{color:#222;background:#f3f1ef;border:1px solid #aaa9a7;overflow:auto;list-style:none;min-width:150px;margin:0;padding:0;position:absolute;bottom:36px;left:-3px}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action{display:inline-block;text-align:left;width:100%;white-space:nowrap;overflow:hidden;color:#222;border-bottom:1px solid #c2c1bf;margin:0;-moz-border-radius:0px;-webkit-border-radius:0px;border-radius:0px;height:auto;padding:8px 15px 9px;line-height:1;border-left:solid 3px rgba(0,0,0,0)}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action .icon-checkbox-checked{display:none}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.active{background-color:#dbd9d7;font-weight:bold}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon-checkbox,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon-checkbox,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.active .icon-checkbox{display:none}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon-checkbox-checked,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon-checkbox-checked,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.active .icon-checkbox-checked{display:inline-block}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:focus,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover{background-color:#0e5d91;color:#fff;border-left-color:#313030 !important}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:focus .label,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:focus .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .label,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .label,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon{color:#fff}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:focus .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon{color:#e7eff4}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action .label,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action .icon{font-size:14px;font-size:1.4rem;text-shadow:none;color:#222}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar{overflow:visible;position:relative}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .action{line-height:1.6}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .icon.no-label{padding-right:0}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed .btn-info .text,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed-hover .btn-info:not(:hover) .text,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.no-tool-label .text,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed .text,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed-over:not(:hover) .text{display:none}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed .btn-info .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed-hover .btn-info:not(:hover) .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.no-tool-label .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed-over:not(:hover) .icon{padding:0}.test-runner-scope [data-control=exit]{margin-left:20px}.test-runner-scope [data-control=comment-toggle]{display:none}.test-runner-scope.non-lti-context .title-box{display:none}.test-runner-scope [data-control=qti-comment]{background-color:#f3f1ef;position:absolute;bottom:33px;left:8px;text-align:right;padding:5px;border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px;-webkit-box-shadow:0 0 15px 1px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 0 15px 1px rgba(0, 0, 0, 0.2);-ms-box-shadow:0 0 15px 1px rgba(0, 0, 0, 0.2);-o-box-shadow:0 0 15px 1px rgba(0, 0, 0, 0.2);box-shadow:0 0 15px 1px rgba(0, 0, 0, 0.2)}.test-runner-scope [data-control=qti-comment] textarea{display:block;height:100px;resize:none;width:350px;padding:3px;margin:0 0 10px 0;border:none;font-size:13px;font-size:1.3rem;border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px}.test-runner-scope .tools-box{position:relative;overflow:visible}.wait-content .wait-content_text--centered{text-align:center}.wait-content .wait-content_actions-list{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;-o-flex-direction:column;flex-direction:column}.wait-content .wait-content_actions-list .wait-content_text--centered{position:relative;right:15px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box>.lft{float:right;margin:2px 10px 0 0}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .rgt{float:left}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list>.action>.li-inner>.icon,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list>.action>.li-inner>.icon{display:inline-block}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list>.action .action,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list>.action .action{text-align:right}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list>.action .action.active .icon.icon-checkbox-checked,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list>.action .action.active .icon.icon-checkbox-checked{display:inline-block}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list>.action .action:not(.active) .icon.icon-checkbox,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list>.action .action:not(.active) .icon.icon-checkbox{display:inline-block}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list>.action .action:not(.active):hover .icon.icon-checkbox,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list>.action .action:not(.active):hover .icon.icon-checkbox{display:none}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list>.action .action:not(.active):hover .icon.icon-checkbox-checked,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list>.action .action:not(.active):hover .icon.icon-checkbox-checked{display:inline-block}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list>.action .menu,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list>.action .menu{left:auto;right:-3px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action{float:right}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon{padding:0 0 0 9px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-right:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-left:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-fast-forward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-step-forward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-forward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-fast-backward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-step-backward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-external:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-backward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-right:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-left:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-fast-forward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-step-forward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-forward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-fast-backward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-step-backward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-external:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-backward:before{display:inline-block;transform:scaleX(-1)}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .action,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .action{text-align:right}body.delivery-scope[dir=rtl] .qti-navigator .icon-up,body.delivery-scope[dir=rtl] .qti-navigator .icon-down{margin-left:0;margin-right:auto}body.delivery-scope[dir=rtl] .qti-navigator .qti-navigator-counter{margin-left:0;margin-right:auto;text-align:left}body.delivery-scope[dir=rtl] .qti-item [class^=feedback-].small,body.delivery-scope[dir=rtl] .qti-item [class*=\" feedback-\"].small{padding:8px 45px 8px 20px;text-align:right}body.delivery-scope[dir=rtl] .qti-item [class^=feedback-].small>[class^=icon-],body.delivery-scope[dir=rtl] .qti-item [class^=feedback-].small>[class*=\" icon-\"],body.delivery-scope[dir=rtl] .qti-item [class*=\" feedback-\"].small>[class^=icon-],body.delivery-scope[dir=rtl] .qti-item [class*=\" feedback-\"].small>[class*=\" icon-\"]{left:auto;right:10px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar .control-box>.connectivity-box{margin-left:0px;margin-right:40px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar .control-box>.connectivity-box.with-message .message-connect{margin-left:3px;margin-right:0px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar .control-box>.progress-box>.qti-controls{margin-left:0px;margin-right:20px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar .control-box>.timer-box .timer-toggler{right:20px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar .control-box>.timer-box .timer-wrapper .countdown:first-child::before{content:\" \"}body.delivery-scope[dir=rtl] .runner .test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar .control-box>.timer-box .timer-wrapper .countdown:last-child::before{content:none}.action-bar .shortcuts-list-wrapper{width:100%;height:100%;position:fixed;top:0;left:0;display:flex;align-items:center;align-content:center;justify-content:center;overflow:auto;background:rgba(0,0,0,.5);z-index:10001}.action-bar .shortcuts-list-wrapper .shortcuts-list{width:auto;min-width:400px;height:auto;min-height:300px;padding:30px !important;color:#222 !important;text-shadow:none !important;position:relative;background-color:#fff;border:1px solid #ddd}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-list-description{width:450px}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-list-title{font-size:24px;margin-top:0}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-group-title{font-size:18px;margin-top:20px}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-group-title:focus{outline:3px solid #276d9b;outline-offset:3px}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-group-list{list-style:none;margin:0;padding:0}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-group-list .shortcut-item{display:-ms-flexbox;display:-webkit-flex;display:flex;float:none;margin:0}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-group-list .shortcut-item .shortcut-item-action,.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-group-list .shortcut-item .shortcut-item-shortcut{-ms-flex:0 1 50%;-webkit-flex:0 1 50%;flex:0 1 50%;margin:0;text-align:center}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-group-list .shortcut-item .shortcut-item-action{text-align:left}.action-bar .shortcuts-list-wrapper .shortcuts-list .btn-close{background-color:rgba(0,0,0,0);box-shadow:none;height:20px;padding:0;position:absolute;right:12px;top:10px;width:20px}.action-bar .shortcuts-list-wrapper .shortcuts-list .btn-close .icon-close{color:#222;font-size:20px;padding:0}.action-bar .shortcuts-list-wrapper .shortcuts-list .btn-close:focus{outline:3px solid #276d9b;outline-offset:3px}.jump-links-container .jump-links-box{display:block;width:0;height:0;position:absolute}.jump-links-container .jump-links-box .jump-link-item{position:fixed;display:block;z-index:1001}.jump-links-container .jump-links-box .jump-link{z-index:1002;position:fixed;display:block;overflow:hidden;top:10px;left:10px;width:0;padding:0 !important;font-size:2.4rem !important}.jump-links-container .jump-links-box .jump-link:focus{width:auto;height:auto;padding:30px !important;background:#f3f1ef;color:#222 !important;border:3px solid #222;outline:none;text-shadow:none !important}.jump-links-container .jump-links-box .jump-link:focus:hover{background:#f3f1ef;text-decoration:underline}\n\n/*# sourceMappingURL=../../../taoQtiTest/views/css/new-test-runner.css.map */"),define("taoQtiTest/loader/taoQtiTestRunner.bundle",function(){}),window.bundles=(window.bundles||[]).concat(["taoItems/loader/taoItemsRunner.min","taoTests/loader/taoTestsRunner.min","taoQtiItem/loader/taoQtiItemRunner.min"]); //# sourceMappingURL=taoQtiTestRunner.min.js.map \ No newline at end of file diff --git a/views/js/loader/taoQtiTestRunner.min.js.map b/views/js/loader/taoQtiTestRunner.min.js.map index c1fd4609b..fa8471acc 100644 --- a/views/js/loader/taoQtiTestRunner.min.js.map +++ b/views/js/loader/taoQtiTestRunner.min.js.map @@ -1 +1 @@ -{"version":3,"names":["loaderScript","document","getElementById","configUrl","getAttribute","bundle","loadController","controllerOptions","controllerPath","params","JSON","parse","err","window","require","controller","startController","started","start","addEventListener","readyState","loadBundles","loaded","bundles","concat","filter","item","index","indexOf","forEach","length","define","$","_","__","context","module","router","loggerFactory","loadingBar","feedback","urlUtil","locale","providerLoader","runner","requiredOptions","config","exitReason","$container","logger","serviceCallId","plugins","providers","Object","keys","preventFeedback","errorFeedback","exit","reason","level","url","options","exitUrl","build","location","onError","displayMessage","onFeedback","onWarning","type","typeMap","warning","error","loggerByType","feedbackByType","message","isString","stringify","stop","code","timeout","moduleConfig","attr","dir","getLanguageDirection","every","option","isArray","extraRoutes","dispatch","provider","assign","then","results","testRunnerConfig","omit","renderTo","proxy","getAvailableProviders","loadedProxies","debug","on","defer","removeClass","data","after","removeAllListeners","close","init","catch","TypeError","name","assetManagerFactory","assetStrategies","assetPortableElement","getAssetManager","testId","assetManager","assetManagers","defaultStrategies","baseUrl","prototype","hasOwnProperty","call","packedUrl","external","base64","configHelper","configFactory","storage","from","_entries","_defaults","undef","getTestDefinition","testDefinition","getTestCompilation","testCompilation","getServiceCallId","getServiceController","bootstrap","serviceController","getServiceExtension","serviceExtension","getTestActionUrl","action","route","getItemActionUrl","itemIdentifier","testServiceCallId","itemDefinition","getTelemetryUrl","signal","getTimeout","getCommunicationConfig","communication","extension","syncActions","service","merge","interval","enabled","states","testSession","freeze","initial","interacting","modalFeedback","suspended","closed","itemSession","solution","notSelected","responseCardinalities","single","multiple","ordered","record","interactionMinConstraintProperties","matchInteraction","choiceInteraction","orderInteraction","associateInteraction","hottextInteraction","hotspotInteraction","graphicOrderInteraction","graphicAssociateInteraction","selectPointInteraction","currentItemHelper","getDeclarations","itemRunner","_item","responses","getResponseDeclaration","identifier","found","declaration","attributes","toResponse","value","baseType","cardinality","mappedCardinality","response","isNumber","transform","v","parseInt","parseFloat","split","map","base","isQtiValueNull","isObject","stringyValue","isEmpty","isQuestionAnswered","defaultValue","constraintValue","fullyAnswered","answered","currentCardinality","isUndefined","isEqual","guessInteractionConstraintValues","itemBody","bdy","interactions","elements","constraintValues","interaction","qtiClass","__proto__","constraintProperty","responseIdentifier","isAnswered","partially","getResponses","count","empty","declarations","getStimuliHrefs","values","element","pluck","getTextStimuliHrefs","stimuli","textStimuli","stimulusHref","domNode","querySelector","childNodes","some","child","nodeType","TEXT_NODE","getTimerMessage","hours","minutes","seconds","unansweredQuestions","scope","timerMessage","timeArr","timeArgArr","unit","idx","push","answeredMessage","questionsMessage","join","getEmptyStats","questions","flagged","viewed","total","questionsViewed","getJumps","jumps","getParts","parts","getSections","result","part","sections","section","id","getActiveItem","mapWithActive","active","items","getNextSections","sectionId","canList","getJump","position","getPart","partName","getSection","sectionName","getItem","jump","find","getItemAt","getItemCategories","Array","categories","hasItemCategory","category","fuzzyMatch","arguments","taoPrefix","exactMatch","includes","startsWith","normalize","elt","replace","toLowerCase","itemCategory","getTestStats","stats","getPartStats","getSectionStats","getScopeStats","testStats","currentPartPosition","isLinear","isCurrentPartLinear","_ref","partPosition","sort","a","b","linearPartIndex","findIndex","_ref2","inaccessibleParts","slice","countOfInaccessibleUnasweredQestions","reduce","acc","_ref3","countOfInaccessibleFlaggedQestions","_ref4","getScopeMap","scopeMap","cloneDeep","computeItemStats","computeStats","getScopeMapFromContext","testPartId","getItemPart","getItemSection","getItemIdentifier","isFinite","each","callback","isFunction","updateItemStats","accStats","informational","collection","patch","currentMap","partialMap","self","targetMap","isPlainObject","partialPart","targetPartId","partialSection","targetSectionId","reindex","offset","offsetPart","offsetSection","lastPartId","lastSectionId","sortBy","positionInPart","positionInSection","createJumpTable","mapHelper","isReviewPanelEnabled","reviewEnabled","getTestMap","getTestContext","itemReviewEnabled","getOptions","review","getInstantStats","sync","getCurrentItem","testPart","getCurrentPart","clone","itemPosition","partiallyAnsweredIsAnswered","isItemCurrentlyAnswered","statsHelper","Handlebars","Helpers0","messageHeaderTpl","asString","html","Template","getExitMessage","submitButtonLabel","itemsCountMessage","testRunnerOptions","messageEnabled","enableUnansweredItemsWarning","getUnansweredItemsWarning","trim","getHeader","getActionMessage","header","msg","getFlaggedItemsWarning","flaggedCount","toString","unansweredCount","__initialized","template","depth0","helpers","partials","program1","buffer","stack1","helper","hash","escapeExpression","compilerInfo","functionType","inverse","noop","fn","program","messages","navigationHelper","isLeavingSection","testContext","testMap","direction","sectionStats","nbItems","isLeavingTestPart","testPartStats","isLast","isLastOf","isFirst","isFirstOf","getSiblingItems","size","itemId","previous","siblings","itemChain","ref","next","directions","walkDirection","link","times","getNeighbor","getNextItem","getPreviousItem","isMovingToNextItem","isMovingToPreviousItem","isJumpingToItem","offlineErrorHelper","buildErrorFromContext","errorData","Error","getOfflineNavError","success","source","purpose","getOfflineExitError","getOfflinePauseError","$$1","polling","hider","waitingDialogFactory","shortcutRegistry","globalShortcut","offlineSyncModalCountdownTpl","offlineSyncModalWaitContentTpl","Template$1","offlineSyncModalFactory","waitingConfig","waitContent","proceedContent","proceedButtonText","showSecondary","secondaryButtonText","secondaryButtonIcon","buttonSeparatorText","width","$secondaryButton","betweenButtonTextSelector","secondaryButtonWait","delaySec","$countdown","countdownPolling","dialogShortcut","propagate","prevent","disable","set","waitingDialog","getDialogEl","selector","dialog","getDom","insertAfter","endWait","hide","before","show","beginWait","is","trigger","enable","off","clear","prop","countdownAction","removeProp","autoStart","helperMissing","capitalize","buildTestContextFromPosition","attempt","updatedMap","buildTestContextFromJump","_Mathmax","Math","max","isLeavingPart","newTestContext","defaults","remainingAttempts","sectionTitle","label","canMoveBackward","numberRubrics","rubrics","timeConstraints","reject","constraint","qtiClassName","timeConstraint","getOptionsFromCategories","pick","categoryName","testContextBuilder","navigatorFactory","all","navigate","methodName","substr","toUpperCase","nextItem","previousItem","previsousItem","nextSection","jumpItem","evaluateSubBranchRules","branchRuleDefinition","navigationParams","branchRuleMapper","responseStore","Promise","resolve","subBranchRuleResults","promises","subBranchRule","subBranchRuleName","validate","subBranchRuleResult","branchRuleHelper","matchBranchRuleFactory","variableIdentifier","variable","correctIdentifier","correct","getCorrectResponse","getResponse","contains","orBranchRuleFactory","andBranchRuleFactory","notBranchRuleFactory","expression","head","subBranchRuleDefinition","matchBranchRule","orBranchRule","andBranchRule","notBranchRule","branchRuleMapperFactory","branchRuleName","branchRuleMap","match","or","and","not","branchRuleFactory","target","branchRuleResults","branchRuleResult","branchRule","offlineJumpTableFactory","itemStore","addResponsesToResponseStore","itemResponse","itemResponseIdentifier","responseEntry","responseId","addResponse","getItems","uniq","getSimplifiedTestMap","row","simplifiedTestMap","itemHasBranchRule","itemBranchRule","sectionHasBranchRule","sectionBranchRule","partHasBranchRule","partBranchRule","jumpTable","setTestMap","buildJumpTable","calculateNextJump","lastJumpItem","getLastJump","contextItemId","get","itemState","state","itemStateIdentifier","jumpToNextItem","contextItemPosition","firstJumpItem","addJump","putCorrectResponsesInStore","itemData","addCorrectResponse","correctResponses","clearJumpTable","partIdentifier","sectionIdentifier","lastJump","nextPosition","jumpTo","jumpToSkipItem","itemSliceIndex","itemIdentifierToAdd","shift","itemToAdd","lastJumpItemData","itemIdentifierToAddd","jumpToNextSection","lastJumpSection","sectionSliceIndex","sectionIdentifierToAdd","jumpToPreviousItem","pop","getJumpTable","offlineNavigatorFactory","offlineJumpTableHelper","setTestData","setTestContext","navigationActionName","itemFromStore","update","dataUpdaterFactory","testDataHolder","dataSet","isContextual","contextualData","testData","updateData","builtTestMap","updatedTestMap","buildTestMap","updateStats","findLast","newMap","updatePluginsConfig","pluginsConfig","pluginName","setConfig","toolStateBridgeFactory","testStore","activePlugins","tools","getStore","setTools","toolNames","toolName","startChangeTracking","getTools","restoreState","toolState","toolStore","key","setItem","resetChanges","restoreStates","formattedResult","mergeCollection","getState","reset","hasChanges","getStates","formattedState","componentFactory","entryTpl","itemComponentFactory","specs","itemComponent","itemComponentApi","setTemplate","$component","turnOff","initItem","event","className","program3","apply","program5","icon","unless","text","program6","program8","control","title","aria","menu","getType","getId","setMenuId","menuId","getMenuId","turnOn","setState","getElement","hoverOn","hoverOff","stackerFactory","menuTpl","menuItemTpl","menuComponentFactory","menuComponent","$menuButton","$menuContainer","$menuContent","$menuItems","$menuStateIcon","hoverIndex","menuItems","menuComponentApi","closeMenu","initMenu","render","toggleMenu","e","preventDefault","stopPropagation","closeMenuOnItemClick","hoverOffAll","program4","role","keyCodes","TAB","ESC","ENTER","SPACE","LEFT","UP","RIGHT","DOWN","stacker","navType","showMenu","openMenu","indexOfClosestVisibleItem","inc","last","elem","hasClass","hoverByIndex","hoverItem","hoverNextVisibleItem","hoverPreviousVisibleItem","bringToFront","addClass","enableShortcuts","activeElement","blur","activeItemIndex","focus","disableShortcuts","parent","getItemById","addItem","renderItems","highlightHoveredEntry","currentTarget","mouseOverItem","hasDisplayedItems","turnOffAll","current","currentKeyCode","keyCode","charCode","triggerHighlightedItem","moveUp","moveDown","setFocusToItem","itemToHover","activeItem","setNavigationType","textTpl","textComponentFactory","textComponent","textComponentApi","initText","entryFactory","menuFactory","textFactory","toolboxTpl","defaultRenderer","menuEntries","allItems","hasMenu","allMenus","toolboxComponentFactory","$document","toolboxComponent","toolboxComponentApi","initToolbox","destroy","createMenu","closeAllMenuExcept","openedMenu","createEntry","extendedConfig","createText","eventifier","pollingFactory","timerFactory","stopwatchFactory","defaultOptions","initialized","stopwatch","isInitialized","tick","resume","pause","cachedStore","browser","areaBrokerFactory","proxyFactory","probeOverseerFactory","testStoreFactory","dataUpdater","toolboxFactory","qtiItemRunner","layoutTpl","qtiProvider","loadAreaBroker","$layout","content","toolbox","navigation","mainLandmark","actionsBar","panel","loadProxy","getConfig","proxyProvider","proxyConfig","loadProbeOverseer","loadTestStore","Date","now","loadPersistentStates","persistencePromise","stateStorage","getPersistentState","setPersistentState","setPromise","install","getDataHolder","toolStateBridge","getTestStore","getPlugins","getCurrentSection","getItemResults","itemSessionState","computeNext","loadPromise","currentItem","skipPausedAssessmentDialog","submitError","unrecoverable","load","feedbackPromise","hasFeedbacks","getProxy","submitItem","itemAnswered","displayFeedbacks","feedbacks","renderFeedbacks","queue","toolStates","callItemAction","unloadItem","loadItem","finish","areaBroker","getAreaBroker","setComponent","getToolbox","spread","isTimerClientMode","timer","restoreTimerFromClient","itemResults","disableItem","callTestAction","noAlertTimeout","isTimeout","allowLateSubmission","late","cancel","reasons","comment","originalMessage","skipExitMessage","getItemLabel","getItemState","flush","getProbeOverseer","getStorageIdentifier","storeId","getPluginsConfig","clearVolatileIfStoreChange","lastStoreId","isNewStore","append","getContainer","getToolboxArea","portableElements","flags","renderItem","changeState","setItemState","setData","assets","itemContainer","getContentArea","itemRenderingOptions","isIOs","wrapperElt","style","overflow","setTimeout","removeStore","probeOverseer","flushPromise","traceData","entry","marker","sendVariables","hasCommunicator","getCommunicator","communicator","remove","actionStoreFatory","actionQueue","loadStore","timestamp","parameters","actionStore","actionId","storeName","storeKey","audio","audioBlobs","prependStrategy","handle","sourceUrl","URL","createObjectURL","request","XMLHttpRequest","open","responseType","onerror","onabort","onload","status","send","unload","image","images","Image","src","relSupport","feature","fakeLink","createElement","relList","supports","supportPreload","supportPrefetch","stylesheet","stylesheets","setAttribute","disabled","appendChild","removeChild","audioPreloader","imagePreloader","stylesheetPreloader","preloaders","providerRegistry","preloaderManagerFactory","preloaderFactory","getProvider","has","preloader","_len","args","_key","_len2","_key2","_len3","_key3","assetPreloaderFactory","registerProvider","ckEditor","ckConfigurator","preloadCKEditor","language","placeholder","ckOptions","resize_enabled","secure","protocol","forceCustomDomain","editor","inline","defaultLang","getItemLanguage","lang","documentElement","extendedText","preloadedLanguages","format","extendedTextPreloader","interactionPreloaderFactory","itemPreloaderFactory","preloadAssetManager","resolveAssets","assetList","resolved","isBase64","testAssetManager","assetPreloader","interactionPreloader","itemLoad","preload","interactionLoad","getItemInteractions","serial","interactionUnload","assetLoad","setItemFlag","assetUnload","loading","isItemObjectValid","pci","isTrue","flag","body","store","itemStoreFactory","defaultConfig","backends","memory","Map","lastIndexedPosition","isExpired","meta","itemTTL","findFirstIndexedItem","_NumberPOSITIVE_INFINITY","Number","POSITIVE_INFINITY","first","lowest","findExpiredItems","expired","itemPreloader","setCacheSize","cacheSize","maxSize","setItemTTL","ttl","itemStorage","updated","removed","updateKey","updateValue","delete","removeItem","prune","promiseQueue","communicatorFactory","coreRequest","qtiServiceProxy","prepareParams","actionParams","stringifyParams","mapValues","reqParams","contentType","noToken","method","background","sequential","configStorage","setOnline","isConnectivityError","setOffline","getTestData","variables","telemetry","loadCommunicator","testNavigatorFactory","actionStoreFactory","loadNextDelay","defaultItemTTL","getItemCachingOption","itemCaching","actiontStore","getItemFromStore","requestConfig","actionPromises","actionRejectPromises","getCacheAmount","getItemTTL","hasItem","hasNextItem","sibling","hasPreviousItem","offlineAction","blockingActions","testNavigator","markActionAsOffline","processSyncAction","deferred","scheduleAction","actionData","syncData","isOnline","actionResult","requestParameters","getTime","requestNetworkThenOffline","communicationConfig","runRequestThenOffline","isOffline","actions","serie","exportActions","offline","pruneStore","loadNextItem","missing","list","delay","updateStatePromise","providerName","responseStoreFactory","getResponseStore","responseStoreName","getCorrectResponseStore","correctResponseStoreName","getCorrectResponses","clearResponses","clearCorrectResponses","offlineSyncModal","download","maxSyncAttempts","offlineNavigator","syncInProgress","dataHolder","isBlocked","isNavigationAction","isMeaningfullScope","navigator","res","isDirectionDefined","offlineSync","initiateDownload","sendSyncData","prepareDownload","dateTime","toISOString","niceFilename","isExitTest","filename","testConfig","InitCallPromise","c","d","i","s","getElementsByTagName","styleSheet","cssText","createTextNode"],"sources":["/github/workspace/tao/views/build/config-wrap-start-default.js","../../loader/bootstrap.js","css!taoQtiTestCss/new-test-runner","../controller/runner/runner.js","../runner/config/assetManager.js","../runner/config/qtiServiceConfig.js","../runner/config/states.js","../runner/helpers/currentItem.js","../runner/helpers/getTimerMessage.js","../runner/helpers/map.js","../runner/helpers/isReviewPanelEnabled.js","../runner/helpers/stats.js","../runner/helpers/messages.js","../runner/helpers/navigation.js","../runner/helpers/offlineErrorHelper.js","../runner/helpers/offlineSyncModal.js","../runner/helpers/testContextBuilder.js","../runner/navigator/navigator.js","../runner/branchRule/helpers/branchRuleHelper.js","../runner/branchRule/types/match.js","../runner/branchRule/types/or.js","../runner/branchRule/types/and.js","../runner/branchRule/types/not.js","../runner/branchRule/branchRuleMapper.js","../runner/branchRule/branchRule.js","../runner/services/offlineJumpTable.js","../runner/navigator/offlineNavigator.js","../runner/provider/dataUpdater.js","../runner/provider/toolStateBridge.js","../runner/ui/toolbox/entry.js","../runner/ui/toolbox/menu.js","../runner/ui/toolbox/text.js","../runner/ui/toolbox/toolbox.js","../runner/provider/stopwatch.js","../runner/provider/qti.js","../runner/proxy/cache/actionStore.js","../runner/proxy/cache/preloaders/assets/audio.js","../runner/proxy/cache/preloaders/assets/image.js","../runner/proxy/cache/preloaders/assets/stylesheet.js","../runner/proxy/cache/preloaders/assets/preloaders.js","../runner/proxy/cache/preloaderManager.js","../runner/proxy/cache/assetPreloader.js","../runner/proxy/cache/preloaders/interactions/extendedText.js","../runner/proxy/cache/preloaders/interactions/preloaders.js","../runner/proxy/cache/interactionPreloader.js","../runner/proxy/cache/itemPreloader.js","../runner/proxy/cache/itemStore.js","../runner/proxy/qtiServiceProxy.js","../runner/proxy/cache/proxy.js","../runner/proxy/loader.js","../runner/services/responseStore.js","../runner/proxy/offline/proxy.js","onLayerEnd0.js","module-create.js","/github/workspace/tao/views/build/config-wrap-end-default.js"],"sourcesContent":["\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2018 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Bootstrap the app, start the entry controller\n * @author Bertrand Chevrier \n */\n(function(){\n 'use strict';\n\n\n\n var loaderScript = document.getElementById('amd-loader');\n var configUrl = loaderScript.getAttribute('data-config');\n var bundle = loaderScript.getAttribute('data-bundle');\n\n var loadController = function loadController(){\n var controllerOptions = {};\n var controllerPath = loaderScript.getAttribute('data-controller');\n var params = loaderScript.getAttribute('data-params');\n try{\n controllerOptions = JSON.parse(params);\n } catch(err){\n controllerOptions = {};\n }\n window.require([controllerPath], function(controller) {\n var startController = function startController(){\n if(!window.started){\n window.started = true;\n controller.start(controllerOptions);\n }\n };\n document.addEventListener('readystatechange', startController, false);\n if (document.readyState === 'complete') {\n startController();\n }\n });\n };\n\n //always start to load the config\n window.require([configUrl], function() {\n\n //define the global loading mechanism\n if(!window.loadBundles){\n //keep tracl of loaded bundles, even if require does it,\n //this prevent some unecessary cycles\n window.loaded = {};\n\n /**\n * Loading entry point for inter bundle dependency,\n * always take the bundles from the params and window.bundles\n * @param {String[]} [bundles] - an optional list of bundle to load\n */\n window.loadBundles = function loadBundles(bundles){\n bundles = bundles || [];\n bundles = bundles.concat(window.bundles)\n bundles = bundles.filter( function(item, index){\n return item && bundles.indexOf(item) === index && window.loaded[item] !== true;\n });\n require(bundles, function(){\n bundles.forEach( function( item ) {\n window.loaded[item] = true;\n });\n loadController();\n });\n }\n }\n\n if(bundle || (window.bundles && window.bundles.length)) {\n window.loadBundles([bundle]);\n } else {\n loadController();\n }\n });\n})();\n\ndefine(\"loader/bootstrap\", function(){});\n\n","\ndefine('css!taoQtiTestCss/new-test-runner',[],function(){});\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2019 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Test runner controller entry\n *\n * @author Bertrand Chevrier \n */\ndefine('taoQtiTest/controller/runner/runner',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'context',\n 'module',\n 'core/router',\n 'core/logger',\n 'layout/loading-bar',\n 'ui/feedback',\n 'util/url',\n 'util/locale',\n 'taoTests/runner/providerLoader',\n 'taoTests/runner/runner',\n 'css!taoQtiTestCss/new-test-runner'\n], function (\n $,\n _,\n __,\n context,\n module,\n router,\n loggerFactory,\n loadingBar,\n feedback,\n urlUtil,\n locale,\n providerLoader,\n runner\n) {\n 'use strict';\n\n /**\n * List of options required by the controller\n * @type {String[]}\n */\n const requiredOptions = [\n 'testDefinition',\n 'testCompilation',\n 'serviceCallId',\n 'bootstrap',\n 'options',\n 'providers'\n ];\n\n /**\n * The runner controller\n */\n return {\n\n /**\n * Controller entry point\n *\n * @param {Object} config - the testRunner config\n * @param {String} config.testDefinition - the test definition id\n * @param {String} config.testCompilation - the test compilation id\n * @param {String} config.serviceCallId - the service call id\n * @param {Object} config.bootstrap - contains the extension and the controller to call\n * @param {Object} config.options - the full URL where to return at the final end of the test\n * @param {Object[]} config.providers - the collection of providers to load\n */\n start(config) {\n let exitReason;\n const $container = $('.runner');\n\n const logger = loggerFactory('controller/runner', {\n serviceCallId : config.serviceCallId,\n plugins : config && config.providers && Object.keys(config.providers.plugins)\n });\n\n let preventFeedback = false;\n let errorFeedback = null;\n\n /**\n * Exit the test runner using the configured exitUrl\n * @param {String} [reason] - to add a warning once left\n * @param {String} [level] - error level\n */\n const exit = function exit(reason, level){\n let url = config.options.exitUrl;\n const params = {};\n if (reason) {\n if (!level) {\n level = 'warning';\n }\n params[level] = reason;\n url = urlUtil.build(url, params);\n }\n window.location = url;\n };\n\n /**\n * Handles errors\n * @param {Error} err - the thrown error\n * @param {String} [displayMessage] - an alternate message to display\n */\n const onError = function onError(err, displayMessage) {\n onFeedback(err, displayMessage, \"error\");\n };\n\n /**\n * Handles warnings\n * @param {Error} err - the thrown error\n * @param {String} [displayMessage] - an alternate message to display\n */\n const onWarning = function onWarning(err, displayMessage) {\n onFeedback(err, displayMessage, \"warning\");\n };\n\n /**\n * Handles errors & warnings\n * @param {Error} err - the thrown error\n * @param {String} [displayMessage] - an alternate message to display\n * @param {String} [type] - \"error\" or \"warning\"\n */\n const onFeedback = function onFeedback(err, displayMessage, type) {\n const typeMap = {\n warning: {\n logger: \"warn\",\n feedback: \"warning\"\n },\n error: {\n logger: \"error\",\n feedback: \"error\"\n }\n };\n const loggerByType = logger[typeMap[type].logger];\n const feedbackByType = feedback()[typeMap[type].feedback];\n\n displayMessage = displayMessage || err.message;\n\n if(!_.isString(displayMessage)){\n displayMessage = JSON.stringify(displayMessage);\n }\n loadingBar.stop();\n\n loggerByType({ displayMessage : displayMessage }, err);\n\n if(type === \"error\" && (err.code === 403 || err.code === 500)) {\n displayMessage = `${__('An error occurred during the test, please content your administrator.')} ${displayMessage}`;\n return exit(displayMessage, 'error');\n }\n if (!preventFeedback) {\n errorFeedback = feedbackByType(displayMessage, {timeout: -1});\n }\n };\n\n const moduleConfig = module.config();\n\n loadingBar.start();\n\n // adding attr for RTL languages\n $('.delivery-scope').attr({dir: locale.getLanguageDirection(context.locale)});\n\n // verify required config\n if ( ! requiredOptions.every( option => typeof config[option] !== 'undefined') ) {\n return onError(new TypeError(__('Missing required configuration option %s', name)));\n }\n\n // dispatch any extra registered routes\n if (moduleConfig && _.isArray(moduleConfig.extraRoutes) && moduleConfig.extraRoutes.length) {\n router.dispatch(moduleConfig.extraRoutes);\n }\n\n //for the qti provider to be selected here\n config.provider = Object.assign( config.provider || {}, { runner: 'qti' });\n\n //load the plugins and the proxy provider\n providerLoader(config.providers, context.bundle)\n .then(function (results) {\n\n const testRunnerConfig = _.omit(config, ['providers']);\n testRunnerConfig.renderTo = $container;\n\n if (results.proxy && typeof results.proxy.getAvailableProviders === 'function') {\n const loadedProxies = results.proxy.getAvailableProviders();\n testRunnerConfig.provider.proxy = loadedProxies[0];\n }\n\n logger.debug({\n config: testRunnerConfig,\n providers : config.providers\n }, 'Start test runner');\n\n //instantiate the QtiTestRunner\n runner(config.provider.runner, results.plugins, testRunnerConfig)\n .on('error', onError)\n .on('warning', onWarning)\n .on('ready', function () {\n _.defer(function () {\n $container.removeClass('hidden');\n });\n })\n .on('pause', function(data) {\n if (data && data.reason) {\n exitReason = data.reason;\n }\n })\n .after('destroy', function () {\n this.removeAllListeners();\n\n // at the end, we are redirected to the exit URL\n exit(exitReason);\n })\n\n //FIXME this event should not be triggered on the test runner\n .on('disablefeedbackalerts', function() {\n if (errorFeedback) {\n errorFeedback.close();\n }\n preventFeedback = true;\n })\n\n //FIXME this event should not be triggered on the test runner\n .on('enablefeedbackalerts', function() {\n preventFeedback = false;\n })\n .init();\n })\n .catch(function(err){\n onError(err, __('An error occurred during the test initialization!'));\n });\n }\n };\n});\n\n","define('taoQtiTest/runner/config/assetManager',['taoItems/assets/manager', 'taoItems/assets/strategies', 'taoQtiItem/portableElementRegistry/assetManager/portableAssetStrategy'], function (assetManagerFactory, assetStrategies, assetPortableElement) { 'use strict';\n\n assetManagerFactory = assetManagerFactory && Object.prototype.hasOwnProperty.call(assetManagerFactory, 'default') ? assetManagerFactory['default'] : assetManagerFactory;\n assetStrategies = assetStrategies && Object.prototype.hasOwnProperty.call(assetStrategies, 'default') ? assetStrategies['default'] : assetStrategies;\n assetPortableElement = assetPortableElement && Object.prototype.hasOwnProperty.call(assetPortableElement, 'default') ? assetPortableElement['default'] : assetPortableElement;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017-2019 Open Assessment Technologies SA ;\n */\n\n /**\n * The default strategies\n */\n var defaultStrategies = [assetStrategies.packedUrl, assetStrategies.external, assetStrategies.base64, assetStrategies.baseUrl, assetPortableElement];\n\n //keep reference per test id\n var assetManagers = {};\n\n /**\n * Gives access to a configured assetManagerFactory\n * @param {String} testId - a unique identifier for the test instance\n * @returns {assetManagerFactory}\n */\n function getAssetManager(testId) {\n var assetManager;\n if (typeof assetManagers[testId] !== 'undefined') {\n assetManager = assetManagers[testId];\n } else {\n assetManager = assetManagerFactory(defaultStrategies, {\n baseUrl: ''\n });\n assetManagers[testId] = assetManager;\n }\n return assetManager;\n }\n\n return getAssetManager;\n\n});\n\n","define('taoQtiTest/runner/config/qtiServiceConfig',['lodash', 'util/url', 'util/config'], function (_, urlUtil, configHelper) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n urlUtil = urlUtil && Object.prototype.hasOwnProperty.call(urlUtil, 'default') ? urlUtil['default'] : urlUtil;\n configHelper = configHelper && Object.prototype.hasOwnProperty.call(configHelper, 'default') ? configHelper['default'] : configHelper;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2018 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Some default config values\n * @type {Object}\n * @private\n */\n var _defaults = {\n bootstrap: {\n serviceController: 'Runner',\n serviceExtension: 'taoQtiTest'\n }\n };\n\n /**\n * The list of handled config entries. Each required entry is set to true, while optional entries are set to false.\n * @type {Object}\n * @private\n */\n var _entries = {\n testDefinition: true,\n testCompilation: true,\n serviceCallId: true,\n bootstrap: false,\n timeout: false\n };\n\n /**\n * Creates a config object for the proxy implementation\n * @param {Object} config - Some required and optional config\n * @param {String} config.testDefinition - The URI of the test\n * @param {String} config.testCompilation - The URI of the compiled delivery\n * @param {String} config.serviceCallId - The URI of the service call\n * @param {String} [config.serviceController] - The name of the service controller\n * @param {String} [config.serviceExtension] - The name of the extension containing the service controller\n * @returns {Object}\n */\n function configFactory(config) {\n // protected storage\n var storage = configHelper.from(config, _entries, _defaults);\n var undef;\n\n // convert some values from seconds to milliseconds\n if (storage.timeout) {\n storage.timeout *= 1000;\n } else {\n storage.timeout = undef;\n }\n\n // returns only a proxy storage object : no direct access to data is provided\n return {\n /**\n * Gets the URI of the test\n * @returns {String}\n */\n getTestDefinition: function getTestDefinition() {\n return storage.testDefinition;\n },\n /**\n * Gets the URI of the compiled delivery\n * @returns {String}\n */\n getTestCompilation: function getTestCompilation() {\n return storage.testCompilation;\n },\n /**\n * Gets the URI of the service call\n * @returns {String}\n */\n getServiceCallId: function getServiceCallId() {\n return storage.serviceCallId;\n },\n /**\n * Gets the name of the service controller\n * @returns {String}\n */\n getServiceController: function getServiceController() {\n return storage.bootstrap.serviceController || _defaults.bootstrap.serviceController;\n },\n /**\n * Gets the name of the extension containing the service controller\n * @returns {String}\n */\n getServiceExtension: function getServiceExtension() {\n return storage.bootstrap.serviceExtension || _defaults.bootstrap.serviceExtension;\n },\n /**\n * Gets an URL of a service action related to the test\n * @param {String} action - the name of the action to request\n * @returns {String} - Returns the URL\n */\n getTestActionUrl: function getTestActionUrl(action) {\n return urlUtil.route(action, this.getServiceController(), this.getServiceExtension(), {\n testDefinition: this.getTestDefinition(),\n testCompilation: this.getTestCompilation(),\n serviceCallId: this.getServiceCallId()\n });\n },\n /**\n * Gets an URL of a service action related to a particular item\n * @param {String} itemIdentifier - The URI of the item\n * @param {String} action - the name of the action to request\n * @returns {String} - Returns the URL\n */\n getItemActionUrl: function getItemActionUrl(itemIdentifier, action) {\n return urlUtil.route(action, this.getServiceController(), this.getServiceExtension(), {\n testDefinition: this.getTestDefinition(),\n testCompilation: this.getTestCompilation(),\n testServiceCallId: this.getServiceCallId(),\n itemDefinition: itemIdentifier\n });\n },\n /**\n * Gets an URL of a telemetry signal related to a particular item\n * @param {String} itemIdentifier - The URI of the item\n * @param {String} signal - the name of the signal to request\n * @returns {String} - Returns the URL\n */\n getTelemetryUrl: function getTelemetryUrl(itemIdentifier, signal) {\n return urlUtil.route(signal, this.getServiceController(), this.getServiceExtension(), {\n testDefinition: this.getTestDefinition(),\n testCompilation: this.getTestCompilation(),\n testServiceCallId: this.getServiceCallId(),\n itemDefinition: itemIdentifier\n });\n },\n /**\n * Gets the request timeout\n * @returns {Number}\n */\n getTimeout: function getTimeout() {\n return storage.timeout;\n },\n /**\n * Gets the config for the communication channel\n * @returns {Object}\n */\n getCommunicationConfig: function getCommunicationConfig() {\n var communication = storage.bootstrap.communication || {};\n var extension = communication.extension || this.getServiceExtension();\n var controller = communication.controller || this.getServiceController();\n var action = communication.action;\n var syncActions = communication.syncActions || [];\n\n // build the service address from the provided config\n // it can be overwritten by a full url from the config\n var service = urlUtil.route(action || 'message', controller, extension, {\n testDefinition: this.getTestDefinition(),\n testCompilation: this.getTestCompilation(),\n serviceCallId: this.getServiceCallId()\n });\n\n // append the address of the remote service to target\n var params = _.merge({}, communication.params || {}, {\n service: communication.service || service\n });\n\n // convert some values from seconds to milliseconds\n if (params.timeout) {\n params.timeout *= 1000;\n } else {\n params.timeout = storage.timeout;\n }\n if (params.interval) {\n params.interval *= 1000;\n }\n return {\n enabled: communication.enabled,\n type: communication.type,\n params: params,\n syncActions: syncActions\n };\n }\n };\n }\n\n return configFactory;\n\n});\n\n","define('taoQtiTest/runner/config/states',[],function () { 'use strict';\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * The possible states\n * @author Bertrand Chevrier \n */\n var states = {\n //the test session states\n testSession: Object.freeze({\n initial: 0,\n interacting: 1,\n modalFeedback: 2,\n suspended: 3,\n closed: 4\n }),\n //the item session states\n itemSession: Object.freeze({\n initial: 0,\n interacting: 1,\n modalFeedback: 2,\n suspended: 3,\n closed: 4,\n solution: 5,\n notSelected: 255\n })\n };\n\n return states;\n\n});\n\n","define('taoQtiTest/runner/helpers/currentItem',['lodash'], function (_) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * List of QTI model cardinalities\n * @type {Object}\n */\n var responseCardinalities = {\n single: 'base',\n multiple: 'list',\n ordered: 'list',\n record: 'record'\n };\n\n /**\n * List of QTI interaction minConstraint properties\n * @type {Object}\n */\n var interactionMinConstraintProperties = {\n matchInteraction: 'minAssociations',\n choiceInteraction: 'minChoices',\n orderInteraction: 'minChoices',\n associateInteraction: 'minAssociations',\n hottextInteraction: 'minChoices',\n hotspotInteraction: 'minChoices',\n graphicOrderInteraction: 'minChoices',\n graphicAssociateInteraction: 'minAssociations',\n selectPointInteraction: 'minChoices'\n };\n\n /**\n * @typedef {currentItemHelper}\n */\n var currentItemHelper = {\n /**\n * Gets the responses declarations of the current item.\n * @param {Object} runner - testRunner instance\n * @returns {Object}\n */\n getDeclarations: function getDeclarations(runner) {\n var itemRunner = runner.itemRunner;\n return itemRunner._item && itemRunner._item.responses;\n },\n /**\n * Gets a response declaration by the identifier of the response\n * @param {Object} runner - testRunner instance\n * @param {String} identifier - The identifier of the response\n * @returns {Object|null}\n */\n getResponseDeclaration: function getResponseDeclaration(runner, identifier) {\n var found = null;\n _.forEach(currentItemHelper.getDeclarations(runner), function (declaration) {\n var attributes = declaration.attributes || {};\n if (attributes.identifier === identifier) {\n found = declaration;\n return false;\n }\n });\n return found;\n },\n /**\n * Convert a value to a response object\n * @param {Array|String} value\n * @param {String} baseType\n * @param {String} cardinality\n * @returns {Object}\n */\n toResponse: function toResponse(value, baseType, cardinality) {\n var mappedCardinality = responseCardinalities[cardinality];\n var response = {};\n if (_.isString(value) || _.isNumber(value)) {\n value = [value];\n }\n let transform = v => v;\n if (baseType === 'boolean') {\n transform = v => v === true || v === 'true';\n } else if (baseType === 'integer') {\n transform = v => typeof v === 'number' ? v : parseInt(v);\n } else if (baseType === 'float') {\n transform = v => typeof v === 'number' ? v : parseFloat(v);\n } else if (baseType === 'directedPair' || baseType === 'pair') {\n transform = v => {\n if (_.isString(v)) {\n return v.split(' ');\n }\n return v;\n };\n }\n value = _.map(value || [], transform);\n if (mappedCardinality) {\n if (mappedCardinality === 'base') {\n if (value.length === 0) {\n //return empty response:\n response.base = null;\n } else {\n response.base = {};\n response.base[baseType] = value[0];\n }\n } else {\n response[mappedCardinality] = {};\n response[mappedCardinality][baseType] = value;\n }\n }\n return response;\n },\n /**\n * Checks if the provided value can be considered as null\n * @param {Object} value\n * @param {String} baseType\n * @param {String} cardinality\n * @returns {boolean}\n */\n isQtiValueNull: function isQtiValueNull(value, baseType, cardinality) {\n var mappedCardinality = responseCardinalities[cardinality];\n if (_.isObject(value) && value[mappedCardinality] === null) {\n value = null;\n }\n if (_.isObject(value) && value[mappedCardinality] && 'undefined' !== typeof value[mappedCardinality][baseType]) {\n value = value[mappedCardinality][baseType];\n }\n const stringyValue = 'string' === baseType || 'integer' === baseType || 'float' === baseType;\n return null === value || stringyValue && value === '' || cardinality !== 'single' && _.isEmpty(value);\n },\n /**\n * Tells if an item question has been answered or not\n * @param {Object} response\n * @param {String} baseType\n * @param {String} cardinality\n * @param {Object} [defaultValue]\n * @param {Object} constraintValue\n * @returns {*}\n */\n isQuestionAnswered: function isQuestionAnswered(response, baseType, cardinality, defaultValue, constraintValue) {\n var answered, currentCardinality, responses;\n var fullyAnswered = true;\n defaultValue = _.isUndefined(defaultValue) ? null : defaultValue;\n constraintValue = constraintValue || 0;\n if (currentItemHelper.isQtiValueNull(response, baseType, cardinality)) {\n answered = false;\n } else {\n answered = !_.isEqual(response, currentItemHelper.toResponse(defaultValue, baseType, cardinality));\n if (constraintValue !== 0) {\n currentCardinality = responseCardinalities[cardinality];\n responses = response[currentCardinality][baseType] || [];\n fullyAnswered = responses && responses.length >= constraintValue;\n }\n answered = answered && fullyAnswered;\n }\n return answered;\n },\n guessInteractionConstraintValues: function guessInteractionConstraintValues(runner) {\n var itemRunner = runner.itemRunner;\n var itemBody = itemRunner._item && itemRunner._item.bdy || {};\n var interactions = itemBody.elements || {};\n var constraintValues = {};\n _.forEach(interactions, function (interaction) {\n var attributes = interaction.attributes || {};\n var qtiClass = interaction.__proto__.qtiClass;\n var constraintProperty;\n if (Object.prototype.hasOwnProperty.call(interactionMinConstraintProperties, qtiClass)) {\n constraintProperty = interactionMinConstraintProperties[qtiClass];\n constraintValues[attributes.responseIdentifier] = attributes[constraintProperty];\n }\n });\n return constraintValues;\n },\n /**\n * Tells is the current item has been answered or not\n * The item is considered answered when at least one response has been set to not empty {base : null}\n * @param {Object} runner - testRunner instance\n * @param {Boolean} [partially=true] - if false all questions must have been answered\n * @returns {Boolean}\n */\n isAnswered: function isAnswered(runner, partially) {\n var itemRunner = runner.itemRunner;\n var responses = itemRunner && itemRunner.getResponses();\n var count = 0;\n var empty = 0;\n var declarations, constraintValues;\n if (itemRunner) {\n declarations = currentItemHelper.getDeclarations(runner);\n constraintValues = currentItemHelper.guessInteractionConstraintValues(runner);\n _.forEach(declarations, function (declaration) {\n var attributes = declaration.attributes || {};\n var response = responses[attributes.identifier];\n var baseType = attributes.baseType;\n var cardinality = attributes.cardinality;\n count++;\n if (!currentItemHelper.isQuestionAnswered(response, baseType, cardinality, declaration.defaultValue, constraintValues[attributes.identifier])) {\n empty++;\n }\n });\n }\n if (partially === false) {\n return count > 0 && empty === 0;\n }\n return count > 0 && empty < count;\n },\n /**\n * Gets list of shared stimuli hrefs in the current item\n *\n * @param {Object} runner - testRunner instance\n * @returns {Array}\n */\n getStimuliHrefs: function getStimuliHrefs(runner) {\n var itemRunner = runner.itemRunner;\n var itemBody = itemRunner._item && itemRunner._item.bdy || {};\n var interactions = itemBody.elements || {};\n return _(interactions).values().filter(function (element) {\n return element.qtiClass === 'include';\n }).pluck('attributes').pluck('href').value();\n },\n /**\n * Find the list of text stimulus ids in the current item\n * Depends on the DOM already being loaded\n * @param {Object} runner - testRunner instance\n * @returns {Array}\n */\n getTextStimuliHrefs: function getTextStimuliHrefs(runner) {\n var stimuli = this.getStimuliHrefs(runner);\n var textStimuli;\n if (stimuli.length > 0) {\n // Filter the ones containing text:\n textStimuli = stimuli.filter(function (stimulusHref) {\n var domNode = document.querySelector(`.qti-include[data-href=\"${stimulusHref}\"]`);\n return _(domNode.childNodes).some(function (child) {\n return child.nodeType === child.TEXT_NODE;\n });\n });\n return textStimuli;\n }\n return [];\n }\n };\n\n return currentItemHelper;\n\n});\n\n","define('taoQtiTest/runner/helpers/getTimerMessage',['i18n'], function (__) { 'use strict';\n\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n\n /**\n * Returns timer information string\n * @returns {Boolean}\n */\n function getTimerMessage(hours, minutes, seconds, unansweredQuestions, scope) {\n let timerMessage;\n const timeArr = [hours, minutes, seconds];\n const timeArgArr = [];\n [__('hours'), __('minutes'), __('seconds')].forEach((unit, idx) => {\n if (timeArr[idx] > 0) {\n timeArgArr.push(`${timeArr[idx]} ${unit}`);\n }\n });\n let answeredMessage;\n if (!unansweredQuestions || scope === 'item') {\n answeredMessage = __('the current question');\n } else {\n let questionsMessage = __('questions');\n if (unansweredQuestions === 1) {\n questionsMessage = __('question');\n }\n answeredMessage = __('remaining %s %s', unansweredQuestions, questionsMessage);\n }\n if (timeArgArr.length === 0) {\n timerMessage = __('%s to answer %s', 'no time left', answeredMessage);\n } else {\n timerMessage = __('%s to answer %s', timeArgArr.join(', '), answeredMessage);\n }\n return timerMessage;\n }\n\n return getTimerMessage;\n\n});\n\n","define('taoQtiTest/runner/helpers/map',['lodash'], function (_) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * @typedef {Object} itemStats\n * @property {Number} questions - the number of questions items\n * @property {Number} answered - the number of answered questions\n * @property {Number} flagged - the number of items flagged for review\n * @property {Number} viewed - the number of viewed items\n * @property {Number} total - the total number of items\n * @property {Number} questionsViewed - the number of viewed questions\n */\n\n /**\n * Gets an empty stats record\n * @returns {itemStats}\n */\n function getEmptyStats() {\n return {\n questions: 0,\n answered: 0,\n flagged: 0,\n viewed: 0,\n total: 0,\n questionsViewed: 0\n };\n }\n\n /**\n * Defines a helper that provides extractors for an assessment test map\n */\n var map = {\n /**\n * Gets the jumps table\n * @param {Object} map - The assessment test map\n * @returns {Object}\n */\n getJumps: function getJumps(map) {\n return map && map.jumps;\n },\n /**\n * Gets the parts table\n * @param {Object} map - The assessment test map\n * @returns {Object}\n */\n getParts: function getParts(map) {\n return map && map.parts;\n },\n /**\n * Get sections table\n * @param {Object} map - The assessment test map\n * @returns {Object} the sections\n */\n getSections: function getSections(map) {\n var parts = this.getParts(map),\n result = {};\n _.forEach(parts, function (part) {\n var sections = part.sections;\n if (sections) {\n _.forEach(sections, function (section) {\n result[section.id] = section;\n });\n }\n });\n return result;\n },\n /**\n * Get active item from the test map\n * @param {Object} mapWithActive - The assessment test map which has active part/section/item marked\n * @returns {Object} the active item\n */\n getActiveItem: function getActiveItem(mapWithActive) {\n var parts = this.getParts(mapWithActive),\n result = {};\n _.forEach(parts, function (part) {\n var sections = part.sections;\n if (sections) {\n _.forEach(sections, function (section) {\n if (section.active) {\n const items = section.items;\n _.forEach(items, function (item) {\n if (item.active) {\n result = item;\n }\n });\n }\n });\n }\n });\n return result;\n },\n /**\n * Return the list of remaining sections.\n * @param {Object} map - The assessment test map\n * @param {String} sectionId - The next sections will be gathered once this sectionId has been reached\n * @returns {Object} the next sections\n */\n getNextSections: function getNextSections(map, sectionId) {\n var sections = this.getSections(map),\n result = {},\n canList = false;\n _.forEach(sections, function (section) {\n if (canList) {\n result[section.id] = section;\n }\n if (section.id === sectionId) {\n canList = true;\n }\n });\n return result;\n },\n /**\n * Gets the jump at a particular position\n * @param {Object} map - The assessment test map\n * @param {Number} position - The position of the item\n * @returns {Object}\n */\n getJump: function getJump(map, position) {\n var jumps = this.getJumps(map);\n return jumps && jumps[position];\n },\n /**\n * Gets a test part by its identifier\n * @param {Object} map - The assessment test map\n * @param {String} partName - The identifier of the test part\n * @returns {Object}\n */\n getPart: function getPart(map, partName) {\n var parts = this.getParts(map);\n return parts && parts[partName];\n },\n /**\n * Gets a test section by its identifier\n * @param {Object} map - The assessment test map\n * @param {String} sectionName - The identifier of the test section\n * @returns {Object}\n */\n getSection: function getSection(map, sectionName) {\n var parts = this.getParts(map);\n var section = null;\n _.forEach(parts, function (part) {\n var sections = part.sections;\n if (sections && sections[sectionName]) {\n section = sections[sectionName];\n return false;\n }\n });\n return section;\n },\n /**\n * Gets a test item by its identifier\n * @param {Object} map - The assessment test map\n * @param {String} itemIdentifier - The identifier of the test item\n * @returns {Object}\n */\n getItem(map, itemIdentifier) {\n const jump = _.find(this.getJumps(map), {\n identifier: itemIdentifier\n });\n return this.getItemAt(map, jump && jump.position);\n },\n /**\n * Gets a test item by its identifier\n * @param {Object} map - The assessment test map\n * @param {String} itemIdentifier - The identifier of the test item\n * @returns {String[]} the raw list of categories\n */\n getItemCategories(map, itemIdentifier) {\n const item = this.getItem(map, itemIdentifier);\n if (item && Array.isArray(item.categories)) {\n return item.categories;\n }\n return [];\n },\n /**\n * Check if an item has a category\n * @param {Object} map - The assessment test map\n * @param {String} itemIdentifier - The identifier of the test item\n * @param {String} category - the category to check\n * @param {Boolean} [fuzzyMatch=false] - if true the prefix or the case doesn't matter\n * @returns {String[]} the raw list of categories\n */\n hasItemCategory(map, itemIdentifier, category) {\n let fuzzyMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n const taoPrefix = 'x-tao-option-';\n const categories = this.getItemCategories(map, itemIdentifier);\n if (!category || !category.length) {\n return false;\n }\n const exactMatch = categories.includes(category);\n if (exactMatch) {\n return true;\n }\n if (fuzzyMatch) {\n //check by adding the prefix first\n if (!category.startsWith(taoPrefix) && category.includes(`${taoPrefix}${category}`)) {\n return true;\n }\n\n //compare without the prefix and any case system\n const normalize = elt => elt.replace(taoPrefix, '').replace(/[-_\\s]/g, '').toLowerCase();\n return categories.some(itemCategory => normalize(itemCategory) === normalize(category));\n }\n return false;\n },\n /**\n * Gets the global stats of the assessment test\n * @param {Object} map - The assessment test map\n * @returns {itemStats}\n */\n getTestStats: function getTestStats(map) {\n return map && map.stats;\n },\n /**\n * Gets the stats of the test part containing a particular position\n * @param {Object} map - The assessment test map\n * @param {String} partName - The identifier of the test part\n * @returns {itemStats}\n */\n getPartStats: function getPartStats(map, partName) {\n var part = this.getPart(map, partName);\n return part && part.stats;\n },\n /**\n * Gets the stats of the test section containing a particular position\n * @param {Object} map - The assessment test map\n * @param {String} sectionName - The identifier of the test section\n * @returns {itemStats}\n */\n getSectionStats: function getSectionStats(map, sectionName) {\n var section = this.getSection(map, sectionName);\n return section && section.stats;\n },\n /**\n * Gets the stats related to a particular scope\n * @param {Object} map - The assessment test map\n * @param {Number} position - The current position\n * @param {String} [scope] - The name of the scope. Can be: test, part, section (default: test)\n * @returns {itemStats}\n */\n getScopeStats: function getScopeStats(map, position, scope) {\n var jump = this.getJump(map, position);\n switch (scope) {\n case 'section':\n case 'testSection':\n return this.getSectionStats(map, jump && jump.section);\n case 'part':\n case 'testPart':\n return this.getPartStats(map, jump && jump.part);\n\n // During calculation stats for this case,\n // we are considiring all unanswered inaccessible items as answered\n case 'testWithoutInaccessibleItems':\n {\n const testStats = this.getTestStats(map);\n const {\n position: currentPartPosition,\n isLinear: isCurrentPartLinear\n } = this.getPart(map, jump && jump.part);\n const parts = Object.values(this.getParts(map)).filter(_ref => {\n let {\n position: partPosition\n } = _ref;\n return partPosition < currentPartPosition;\n }).sort((a, b) => b - a);\n\n // Find the neirest part to which test taker can not navigate\n const linearPartIndex = isCurrentPartLinear ? 0 : parts.findIndex(_ref2 => {\n let {\n isLinear\n } = _ref2;\n return isLinear;\n });\n if (linearPartIndex === -1) {\n return testStats;\n }\n\n // Calculate all unanswered and flagged questions in inaccessible parts\n const inaccessibleParts = parts.slice(linearPartIndex);\n const countOfInaccessibleUnasweredQestions = inaccessibleParts.reduce((acc, _ref3) => {\n let {\n stats: {\n questions,\n answered\n }\n } = _ref3;\n return acc + (questions - answered);\n }, 0);\n const countOfInaccessibleFlaggedQestions = inaccessibleParts.reduce((acc, _ref4) => {\n let {\n stats: {\n flagged\n }\n } = _ref4;\n return acc + flagged;\n }, 0);\n return Object.assign({}, testStats, {\n answered: testStats.answered + countOfInaccessibleUnasweredQestions,\n flagged: testStats.flagged - countOfInaccessibleFlaggedQestions\n });\n }\n default:\n case 'test':\n return this.getTestStats(map);\n }\n },\n /**\n * Gets the map of a particular scope from a particular position\n * @param {Object} map - The assessment test map\n * @param {Number} position - The current position\n * @param {String} [scope] - The name of the scope. Can be: test, part, section (default: test)\n * @returns {object} The scoped map\n */\n getScopeMap: function getScopeMap(map, position, scope) {\n // need a clone of the map as we will change some properties\n var scopeMap = _.cloneDeep(map || {});\n\n // gets the current part and section\n var jump = this.getJump(scopeMap, position);\n var part = this.getPart(scopeMap, jump && jump.part);\n var section = this.getSection(scopeMap, jump && jump.section);\n\n // reduce the map to the scope part\n if (scope && scope !== 'test') {\n scopeMap.parts = {};\n if (part) {\n scopeMap.parts[jump.part] = part;\n }\n }\n\n // reduce the map to the scope section\n if (part && (scope === 'section' || scope === 'testSection')) {\n part.sections = {};\n if (section) {\n part.sections[jump.section] = section;\n }\n }\n\n // update the stats to reflect the scope\n if (section) {\n section.stats = this.computeItemStats(section.items);\n }\n if (part) {\n part.stats = this.computeStats(part.sections);\n }\n scopeMap.stats = this.computeStats(scopeMap.parts);\n return scopeMap;\n },\n /**\n * Gets the map of a particular scope from a current context\n * @param {Object} map - The assessment test map\n * @param {Object} context - The current session context\n * @param {String} [scope] - The name of the scope. Can be: test, part, section (default: test)\n * @returns {object} The scoped map\n */\n getScopeMapFromContext: function getScopeMapFromContext(map, context, scope) {\n // need a clone of the map as we will change some properties\n var scopeMap = _.cloneDeep(map || {});\n var part;\n var section;\n\n // gets the current part and section\n if (context && context.testPartId) {\n part = this.getPart(scopeMap, context.testPartId);\n }\n if (context && context.sectionId) {\n section = this.getSection(scopeMap, context.sectionId);\n }\n\n // reduce the map to the scope part\n if (scope && scope !== 'test') {\n scopeMap.parts = {};\n if (part) {\n scopeMap.parts[context.testPartId] = part;\n }\n }\n\n // reduce the map to the scope section\n if (part && (scope === 'section' || scope === 'testSection')) {\n part.sections = {};\n if (section) {\n part.sections[context.sectionId] = section;\n }\n }\n\n // update the stats to reflect the scope\n if (section) {\n section.stats = this.computeItemStats(section.items);\n }\n if (part) {\n part.stats = this.computeStats(part.sections);\n }\n scopeMap.stats = this.computeStats(scopeMap.parts);\n return scopeMap;\n },\n /**\n * Gets the test part containing a particular position\n * @param {Object} map - The assessment test map\n * @param {Number} position - The position of the item\n * @returns {Object}\n */\n getItemPart: function getItemPart(map, position) {\n var jump = this.getJump(map, position);\n return this.getPart(map, jump && jump.part);\n },\n /**\n * Gets the test section containing a particular position\n * @param {Object} map - The assessment test map\n * @param {Number} position - The position of the item\n * @returns {Object}\n */\n getItemSection: function getItemSection(map, position) {\n var jump = this.getJump(map, position);\n var part = this.getPart(map, jump && jump.part);\n var sections = part && part.sections;\n return sections && sections[jump && jump.section];\n },\n /**\n * Gets the item located at a particular position\n * @param {Object} map - The assessment test map\n * @param {Number} position - The position of the item\n * @returns {Object}\n */\n getItemAt: function getItemAt(map, position) {\n var jump = this.getJump(map, position);\n var part = this.getPart(map, jump && jump.part);\n var sections = part && part.sections;\n var section = sections && sections[jump && jump.section];\n var items = section && section.items;\n return items && items[jump && jump.identifier];\n },\n /**\n * Gets the identifier of an existing item\n * @param {Object} map - The assessment test map\n * @param {Number|String} position - The position of the item, can already be the identifier\n * @returns {String}\n */\n getItemIdentifier: function getItemIdentifier(map, position) {\n var item;\n if (_.isFinite(position)) {\n item = this.getItemAt(map, position);\n } else {\n item = this.getItem(map, position);\n }\n return item && item.id;\n },\n /**\n * Applies a callback on each item of the provided map\n * @param {Object} map - The assessment test map\n * @param {Function} callback(item, section, part, map) - A callback to apply on each item\n * @returns {Object}\n */\n each: function each(map, callback) {\n if (_.isFunction(callback)) {\n _.forEach(map && map.parts, function (part) {\n _.forEach(part && part.sections, function (section) {\n _.forEach(section && section.items, function (item) {\n callback(item, section, part, map);\n });\n });\n });\n }\n return map;\n },\n /**\n * Update the map stats from a particular item\n * @param {Object} map - The assessment test map\n * @param {Number} position - The position of the item\n * @returns {Object}\n */\n updateItemStats: function updateItemStats(map, position) {\n var jump = this.getJump(map, position);\n var part = this.getPart(map, jump && jump.part);\n var sections = part && part.sections;\n var section = sections && sections[jump && jump.section];\n if (section) {\n section.stats = this.computeItemStats(section.items);\n }\n if (part) {\n part.stats = this.computeStats(part.sections);\n }\n if (map) {\n map.stats = this.computeStats(map.parts);\n }\n return map;\n },\n /**\n * Computes the stats for a list of items\n * @param {Object} items\n * @returns {itemStats}\n */\n computeItemStats: function computeItemStats(items) {\n return _.reduce(items, function accStats(acc, item) {\n if (!item.informational) {\n acc.questions++;\n if (item.answered) {\n acc.answered++;\n }\n if (item.viewed) {\n acc.questionsViewed++;\n }\n }\n if (item.flagged) {\n acc.flagged++;\n }\n if (item.viewed) {\n acc.viewed++;\n }\n acc.total++;\n return acc;\n }, getEmptyStats());\n },\n /**\n * Computes the global stats of a collection of stats\n * @param {Object} collection\n * @returns {itemStats}\n */\n computeStats: function computeStats(collection) {\n return _.reduce(collection, function accStats(acc, item) {\n acc.questions += item.stats.questions;\n acc.answered += item.stats.answered;\n acc.flagged += item.stats.flagged;\n acc.viewed += item.stats.viewed;\n acc.total += item.stats.total;\n acc.questionsViewed += item.stats.questionsViewed;\n return acc;\n }, getEmptyStats());\n },\n /**\n * Patch a testMap with a partial testMap.\n *\n * If the currentMap is null or the scope is test,\n * we just use the partialMap as it is.\n *\n * Indexes, position and stats will be (re)built.\n *\n * @param {Object} currentMap - the map to patch\n * @param {Object} partialMap - the patch\n * @param {String} partialMap.scope - indicate the scope of the patch (test, part or section)\n * @returns {Object} the patched testMap\n * @throws {TypeError} if the partialMap is no a map\n */\n patch: function patch(currentMap, partialMap) {\n var self = this;\n var targetMap;\n if (!_.isPlainObject(partialMap) || !partialMap.parts) {\n throw new TypeError('Invalid test map format');\n }\n if (!currentMap || partialMap.scope === 'test') {\n targetMap = _.cloneDeep(partialMap);\n } else {\n targetMap = _.cloneDeep(currentMap);\n _.forEach(partialMap.parts, function (partialPart, targetPartId) {\n if (partialMap.scope === 'part') {\n //replace the target part\n targetMap.parts[targetPartId] = _.cloneDeep(partialPart);\n }\n if (partialMap.scope === 'section') {\n _.forEach(partialPart.sections, function (partialSection, targetSectionId) {\n //replace the target section\n targetMap.parts[targetPartId].sections[targetSectionId] = _.cloneDeep(partialSection);\n\n //compte new section stats\n targetMap.parts[targetPartId].sections[targetSectionId].stats = self.computeItemStats(targetMap.parts[targetPartId].sections[targetSectionId].items);\n });\n }\n //compte new/updated part stats\n targetMap.parts[targetPartId].stats = self.computeStats(targetMap.parts[targetPartId].sections);\n });\n //compte updated test stats\n targetMap.stats = this.computeStats(targetMap.parts);\n }\n\n //the updated map can have a different size than the original\n targetMap = this.reindex(targetMap);\n return targetMap;\n },\n /**\n * Rebuild the indexes, positions of all map parts.\n * Then recreate the jump table.\n *\n * @param {Object} map - the map to reindex\n * @returns {Object} the brand new map\n * @throws {TypeError} if the map is no a map\n */\n reindex: function reindex(map) {\n var offset = 0;\n var offsetPart = 0;\n var offsetSection = 0;\n var lastPartId;\n var lastSectionId;\n if (!_.isPlainObject(map) || !map.parts) {\n throw new TypeError('Invalid test map format');\n }\n\n //remove the jump table\n map.jumps = [];\n\n //browse the test map, by position\n _.sortBy(map && map.parts, 'position').forEach(function (part) {\n _.sortBy(part && part.sections, 'position').forEach(function (section) {\n _.sortBy(section && section.items, 'position').forEach(function (item) {\n if (lastPartId !== part.id) {\n offsetPart = 0;\n lastPartId = part.id;\n part.position = offset;\n }\n if (lastSectionId !== section.id) {\n offsetSection = 0;\n lastSectionId = section.id;\n section.position = offset;\n }\n item.position = offset;\n item.index = offsetSection + 1;\n item.positionInPart = offsetPart;\n item.positionInSection = offsetSection;\n map.jumps[offset] = {\n identifier: item.id,\n section: section.id,\n part: part.id,\n position: offset\n };\n offset++;\n offsetSection++;\n offsetPart++;\n });\n });\n });\n return map;\n },\n /**\n * Create the jump table for a test map\n *\n * @param {Object} map - the map\n * @returns {Object} the brand new map with a jump table\n * @throws {TypeError} if the map is no a map\n */\n createJumpTable: function createJumpTable(map) {\n if (!_.isPlainObject(map) || !map.parts) {\n throw new TypeError('Invalid test map format');\n }\n map.jumps = [];\n this.each(map, function (item, section, part) {\n var offset = item.position;\n map.jumps[offset] = {\n identifier: item.id,\n section: section.id,\n part: part.id,\n position: offset\n };\n });\n return map;\n }\n };\n\n return map;\n\n});\n\n","define('taoQtiTest/runner/helpers/isReviewPanelEnabled',['taoQtiTest/runner/helpers/map'], function (mapHelper) { 'use strict';\n\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n\n /**\n * Tells if the review panel is enabled\n * @returns {Boolean}\n */\n function isReviewPanelEnabled(runner) {\n const reviewEnabled = mapHelper.hasItemCategory(runner.getTestMap(), runner.getTestContext().itemIdentifier, 'reviewScreen', true);\n const itemReviewEnabled = runner.getOptions().review.enabled;\n return reviewEnabled && itemReviewEnabled;\n }\n\n return isReviewPanelEnabled;\n\n});\n\n","define('taoQtiTest/runner/helpers/stats',['lodash', 'taoQtiTest/runner/helpers/map', 'taoQtiTest/runner/helpers/currentItem'], function (_, mapHelper, currentItemHelper) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n currentItemHelper = currentItemHelper && Object.prototype.hasOwnProperty.call(currentItemHelper, 'default') ? currentItemHelper['default'] : currentItemHelper;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2019 (original work) Open Assessment Technologies SA ;\n */\n var stats = {\n /**\n * Return scope stats that takes into account any test taker interaction made since the item has been loaded\n * @param {String} scope - scope to consider for calculating the stats\n * @param {Object} runner - testRunner instance\n * @param {Boolean} sync - flag for sync the unanswered stats in exit message and the unanswered stats in the toolbox. Default false\n * @returns {Object} the stats\n */\n getInstantStats(scope, runner, sync) {\n const map = runner.getTestMap();\n const context = runner.getTestContext();\n const item = runner.getCurrentItem();\n const testPart = runner.getCurrentPart();\n const stats = _.clone(mapHelper.getScopeStats(map, context.itemPosition, scope));\n const options = runner.getOptions() || {};\n let partiallyAnsweredIsAnswered;\n if (options.review) {\n partiallyAnsweredIsAnswered = options.review.partiallyAnsweredIsAnswered;\n }\n if (!item.informational) {\n const isItemCurrentlyAnswered = currentItemHelper.isAnswered(runner, partiallyAnsweredIsAnswered);\n if (!isItemCurrentlyAnswered && item.answered) {\n stats.answered--;\n } else if ((isItemCurrentlyAnswered || sync) && !item.answered) {\n stats.answered++;\n // eslint-disable-next-line no-dupe-else-if\n } else if (sync && !isItemCurrentlyAnswered && item.answered && testPart.isLinear) {\n stats.answered++;\n }\n }\n return stats;\n }\n };\n\n return stats;\n\n});\n\n","define('taoQtiTest/runner/helpers/messages',['i18n', 'taoQtiTest/runner/helpers/stats', 'handlebars', 'lib/handlebars/helpers'], function (__, statsHelper, Handlebars, Helpers0) { 'use strict';\n\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n statsHelper = statsHelper && Object.prototype.hasOwnProperty.call(statsHelper, 'default') ? statsHelper['default'] : statsHelper;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var stack1, functionType=\"function\", escapeExpression=this.escapeExpression, self=this;\n\n function program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\";\n if (helper = helpers.header) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.header); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"

      \";\n return buffer;\n }\n\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.header), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { return stack1; }\n else { return ''; }\n });\n function messageHeaderTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2021 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Completes an exit message\n * @param {String} scope - scope to consider for calculating the stats\n * @param {Object} runner - testRunner instance\n * @param {String} message - custom message that will be appended to the unanswered stats count\n * @param {Boolean} sync - flag for sync the unanswered stats in exit message and the unanswered stats in the toolbox\n * @param {String|undefined} submitButtonLabel - point the user to the submit button\n * @returns {String} Returns the message text\n */\n function getExitMessage(scope, runner) {\n let message = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n let sync = arguments.length > 3 ? arguments[3] : undefined;\n let submitButtonLabel = arguments.length > 4 ? arguments[4] : undefined;\n let itemsCountMessage = '';\n const testRunnerOptions = runner.getOptions();\n const messageEnabled = testRunnerOptions.enableUnansweredItemsWarning;\n if (messageEnabled) {\n itemsCountMessage = getUnansweredItemsWarning(scope, runner, sync).trim();\n if (itemsCountMessage) {\n itemsCountMessage += '.';\n }\n }\n return `${getHeader(scope)}${itemsCountMessage} ${getActionMessage(scope, submitButtonLabel)}${message}`.trim();\n }\n\n /**\n * Build message if not all items have answers\n * @param {String} scope - scope to consider for calculating the stats\n * @returns {String} Returns the message text\n */\n function getHeader(scope) {\n let header = '';\n if (scope === 'section' || scope === 'testSection') {\n header = __('You are about to leave this section.');\n } else if (scope === 'test' || scope === 'testWithoutInaccessibleItems') {\n header = __('You are about to submit the test.');\n } else if (scope === 'part') {\n header = __('You are about to submit this test part.');\n }\n return messageHeaderTpl({\n header: header.trim()\n });\n }\n\n /**\n * Generates the message to help users perform the action\n * @param {String} scope - scope to consider for calculating the stats\n * @param {String} [submitButtonLabel] - Pointed user perform click on given button\n * @returns {String} Returns the message text\n */\n function getActionMessage(scope) {\n let submitButtonLabel = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : __('OK');\n var msg;\n switch (scope) {\n case 'section':\n case 'testSection':\n case 'part':\n return __('Click \"%s\" to continue.', submitButtonLabel).trim();\n case 'test':\n case 'testWithoutInaccessibleItems':\n msg = __('You will not be able to access this test once submitted. Click \"%s\" to continue and submit the test.', submitButtonLabel);\n return `${msg}`;\n }\n return '';\n }\n\n /**\n * Build message for the flagged items if any.\n * @param {Object} stats - The stats for the current context\n * @param {String} [message] - The existing message to complete\n * @returns {string|*}\n */\n function getFlaggedItemsWarning(stats) {\n let message = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n const flaggedCount = stats && stats.flagged;\n if (!flaggedCount) {\n return message;\n }\n if (message) {\n return `${message} ${__('and you flagged %s item(s) that you can review now', flaggedCount.toString())}`;\n }\n return __('You flagged %s item(s) that you can review now', flaggedCount.toString());\n }\n\n /**\n * Build message if not all items have answers\n * @param {String} scope - scope to consider for calculating the stats\n * @param {Object} runner - testRunner instance\n * @param {Boolean} sync - flag for sync the unanswered stats in exit message and the unanswered stats in the toolbox. Default false\n * @returns {String} Returns the message text\n */\n function getUnansweredItemsWarning(scope, runner, sync) {\n const stats = statsHelper.getInstantStats(scope, runner, sync);\n const unansweredCount = stats && stats.questions - stats.answered;\n const flaggedCount = stats && stats.flagged;\n let itemsCountMessage = '';\n if (scope === 'section' || scope === 'testSection') {\n itemsCountMessage = __('You answered %s of %s question(s) for this section of the test', stats.answered.toString(), stats.questions.toString());\n if (flaggedCount) {\n itemsCountMessage += `, ${__('and flagged %s of them', flaggedCount.toString())}`;\n }\n } else if (scope === 'test' || scope === 'testWithoutInaccessibleItems') {\n if (unansweredCount > 1) {\n itemsCountMessage = __('There are %s unanswered questions', unansweredCount.toString());\n } else if (unansweredCount === 1) {\n itemsCountMessage = __('There is %s unanswered question', unansweredCount.toString());\n }\n if (flaggedCount) {\n itemsCountMessage = getFlaggedItemsWarning(stats, itemsCountMessage);\n }\n } else if (scope === 'part') {\n if (unansweredCount > 1) {\n itemsCountMessage = __('There are %s unanswered questions in this part of the test', unansweredCount.toString());\n } else if (unansweredCount === 1) {\n itemsCountMessage = __('There is %s unanswered question in this part of the test', unansweredCount.toString());\n }\n if (flaggedCount) {\n itemsCountMessage = getFlaggedItemsWarning(stats, itemsCountMessage);\n }\n }\n itemsCountMessage = itemsCountMessage.trim();\n return itemsCountMessage;\n }\n var messages = {\n getExitMessage: getExitMessage\n };\n\n return messages;\n\n});\n\n","define('taoQtiTest/runner/helpers/navigation',['lodash', 'taoQtiTest/runner/helpers/map'], function (_, mapHelper) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * @typedef {Object} navigationHelper\n */\n var navigationHelper = {\n /**\n * Check whether the test taker is leaving a section\n *\n * @param {Object} testContext - the actual test context\n * @param {String} testContext.itemIdentifier - the id of the current item\n * @param {String} testContext.sectionId - the id of the current section\n * @param {Object} testMap - the actual test map\n * @param {String} direction - the move direction (next, previous or jump)\n * @param {String} scope - the move scope (item, section, testPart)\n * @param {Number} [position] - the position in case of jump\n * @returns {Boolean} true if the action leads to a section leave\n * @throws {TypeError} if the context or the map are incorrect\n */\n isLeavingSection: function isLeavingSection(testContext, testMap, direction, scope, position) {\n var section;\n var sectionStats;\n var nbItems;\n var item;\n if (_.isPlainObject(testContext) && _.isPlainObject(testMap) && !_.isEmpty(testContext.sectionId) && !_.isEmpty(testContext.itemIdentifier)) {\n section = mapHelper.getSection(testMap, testContext.sectionId);\n sectionStats = mapHelper.getSectionStats(testMap, testContext.sectionId);\n nbItems = sectionStats && sectionStats.total;\n item = mapHelper.getItem(testMap, testContext.itemIdentifier);\n return scope === 'section' || scope === 'testPart' || direction === 'next' && item.positionInSection + 1 === nbItems || direction === 'previous' && item.positionInSection === 0 || direction === 'jump' && position > 0 && (position < section.position || position >= section.position + nbItems);\n }\n throw new TypeError('Invalid test context and test map');\n },\n /**\n * Check whether the test taker is leaving a test part\n *\n * @param {Object} testContext - the actual test context\n * @param {String} testContext.itemIdentifier - the id of the current item\n * @param {String} testContext.sectionId - the id of the current section\n * @param {String} testContext.testPartId - the id of the current testPart\n * @param {Object} testMap - the actual test map\n * @param {String} direction - the move direction (next, previous or jump)\n * @param {String} scope - the move scope (item, section, testPart)\n * @param {Number} [position] - the position in case of jump\n * @returns {Boolean} true if the action leads to a section leave\n * @throws {TypeError} if the context or the map are incorrect\n */\n isLeavingTestPart: function isLeavingTestPart(testContext, testMap, direction, scope, position) {\n var testPart;\n var testPartStats;\n var nbItems;\n var item;\n var section;\n var sectionStats;\n if (_.isPlainObject(testContext) && _.isPlainObject(testMap) && !_.isEmpty(testContext.testPartId) && !_.isEmpty(testContext.sectionId) && !_.isEmpty(testContext.itemIdentifier)) {\n testPart = mapHelper.getPart(testMap, testContext.testPartId);\n testPartStats = mapHelper.getPartStats(testMap, testContext.testPartId);\n nbItems = testPartStats && testPartStats.total;\n item = mapHelper.getItem(testMap, testContext.itemIdentifier);\n if (scope === 'section') {\n section = mapHelper.getSection(testMap, testContext.sectionId);\n sectionStats = mapHelper.getSectionStats(testMap, testContext.sectionId);\n }\n return scope === 'testPart' || direction === 'next' && scope === 'item' && item.positionInPart + 1 === nbItems || direction === 'next' && scope === 'section' && section.position + sectionStats.total >= nbItems || direction === 'previous' && scope === 'item' && item.positionInPart === 0 || direction === 'previous' && scope === 'section' && section.position === testPart.position || direction === 'jump' && position > 0 && (position < testPart.position || position >= testPart.position + nbItems);\n }\n throw new TypeError('Invalid test context and test map');\n },\n /**\n * Check if the given item is the last of the test\n * @param {Object} testMap - the test map\n * @param {String} itemIdentifier - the identifier of the item\n * @returns {Boolean} true if the item is the last one\n */\n isLast: function isLast(testMap, itemIdentifier) {\n return this.isLastOf(testMap, itemIdentifier, 'test');\n },\n /**\n * Check if the given item is the first of a test\n * @param {Object} testMap - the test map\n * @param {String} itemIdentifier - the identifier of the item\n * @returns {Boolean} true if the item is the first one\n */\n isFirst: function isFirst(testMap, itemIdentifier) {\n return this.isFirstOf(testMap, itemIdentifier, 'test');\n },\n /**\n * Check if the given item is the last of a the given scope\n * @param {Object} testMap - the test map\n * @param {String} itemIdentifier - the identifier of the item\n * @param {String} [scope = 'test'] - the target scope\n * @returns {Boolean} true if the item is the last one\n */\n isLastOf: function isLastOf(testMap, itemIdentifier, scope) {\n var item;\n var stats;\n if (!_.isPlainObject(testMap)) {\n throw new TypeError('Invalid test map');\n }\n if (_.isEmpty(itemIdentifier)) {\n throw new TypeError('Invalid item identifier');\n }\n scope = scope || 'test';\n item = mapHelper.getItem(testMap, itemIdentifier);\n stats = mapHelper.getScopeStats(testMap, item.position, scope);\n if (stats && _.isNumber(stats.total)) {\n if (scope === 'test') {\n return item.position + 1 === stats.total;\n }\n if (scope === 'section' || scope === 'assessmentSection' || scope === 'testSection') {\n return item.positionInSection + 1 === stats.total;\n }\n if (scope === 'part' || scope === 'testPart') {\n return item.positionInPart + 1 === stats.total;\n }\n }\n return false;\n },\n /**\n * Check if the given item is the first of a the given scope\n * @param {Object} testMap - the test map\n * @param {String} itemIdentifier - the identifier of the item\n * @param {String} [scope = 'test'] - the target scope\n * @returns {Boolean} true if the item is the first one\n */\n isFirstOf: function isFirstOf(testMap, itemIdentifier, scope) {\n var item;\n if (!_.isPlainObject(testMap)) {\n throw new TypeError('Invalid test map');\n }\n if (_.isEmpty(itemIdentifier)) {\n throw new TypeError('Invalid item identifier');\n }\n scope = scope || 'test';\n item = mapHelper.getItem(testMap, itemIdentifier);\n if (scope === 'test') {\n return item.position === 0;\n }\n if (scope === 'section' || scope === 'assessmentSection' || scope === 'testSection') {\n return item.positionInSection === 0;\n }\n if (scope === 'part' || scope === 'testPart') {\n return item.positionInPart === 0;\n }\n return false;\n },\n /**\n * Gets the map descriptors of the sibling items\n * @param {Object} testMap\n * @param {Number|String} itemPosition - (could be also the item id)\n * @param {String} [direction='both'] - previous/next/both\n * @param {Number} [size=3] - will be 2xsize if direction is both\n * @returns {Object[]} the collections of items\n */\n getSiblingItems: function getSiblingItems(testMap, itemPosition, direction, size) {\n var itemId = mapHelper.getItemIdentifier(testMap, itemPosition);\n var previous = null;\n var siblings = [];\n var directions;\n var itemChain = _.reduce(testMap && testMap.jumps, function (map, jump) {\n var ref = jump.identifier;\n if (previous) {\n map[previous].next = ref;\n }\n map[ref] = {\n identifier: ref,\n previous: previous,\n next: null\n };\n previous = ref;\n return map;\n }, {});\n size = _.isFinite(size) ? parseInt(size, 10) : 3;\n if (!direction || direction === 'both') {\n directions = ['previous', 'next'];\n } else {\n directions = [direction];\n }\n _.forEach(directions, function walkDirection(link) {\n var id = itemId;\n _.times(size, function getNeighbor() {\n id = itemChain[id] && itemChain[id][link];\n if (id) {\n siblings.push(mapHelper.getItem(testMap, id));\n } else {\n return false;\n }\n });\n });\n return siblings;\n },\n /**\n * Gets the map descriptor of the next item\n * @param {Object} testMap\n * @param {Number|String} itemPosition - (could be also the item id)\n * @returns {Object}\n */\n getNextItem: function getNextItem(testMap, itemPosition) {\n var siblings = navigationHelper.getSiblingItems(testMap, itemPosition, 'next', 1);\n if (siblings.length) {\n return siblings[0];\n }\n return null;\n },\n /**\n * Gets the map descriptor of the previous item\n * @param {Object} testMap\n * @param {Number|String} itemPosition - (could be also the item id)\n * @returns {Object}\n */\n getPreviousItem: function getPreviousItem(testMap, itemPosition) {\n var siblings = navigationHelper.getSiblingItems(testMap, itemPosition, 'previous', 1);\n if (siblings.length) {\n return siblings[0];\n }\n return null;\n },\n /**\n * Checks if an action will move forward.\n * @param {String} action - the name of the action that will be performed\n * @param {Object} [params] - some optional parameters that apply to the action\n * @returns {Boolean}\n */\n isMovingToNextItem: function isMovingToNextItem(action, params) {\n params = params || {};\n return action === 'timeout' || action === 'skip' || action === 'move' && params.direction === 'next' && params.scope === 'item';\n },\n /**\n * Checks if an action will move backward.\n * @param {String} action - the name of the action that will be performed\n * @param {Object} [params] - some optional parameters that apply to the action\n * @returns {Boolean}\n */\n isMovingToPreviousItem: function isMovingToPreviousItem(action, params) {\n params = params || {};\n return action === 'move' && params.direction === 'previous' && params.scope === 'item';\n },\n /**\n * Checks if an action will jump on another item.\n * @param {String} action - the name of the action that will be performed\n * @param {Object} [params] - some optional parameters that apply to the action\n * @returns {Boolean}\n */\n isJumpingToItem: function isJumpingToItem(action, params) {\n params = params || {};\n return action === 'move' && params.direction === 'jump' && params.scope === 'item';\n }\n };\n\n return navigationHelper;\n\n});\n\n","define('taoQtiTest/runner/helpers/offlineErrorHelper',['lodash', 'i18n'], function (_, __) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * @typedef {Object} OfflineErrorObject\n * @property {string} message\n * @property {Object} data\n * @property {boolean} data.success\n * @property {string} data.source\n * @property {string} data.purpose\n * @property {string} data.type\n * @property {number} data.code\n */\n\n var offlineErrorHelper = {\n /**\n * Builds a new Error object from the given context and returns it\n * @param {Object} errorData\n * @param {Object} [context]\n * @returns {Object}\n */\n buildErrorFromContext: function buildErrorFromContext(errorData, context) {\n var err = _.assign(new Error(errorData.message), errorData.data);\n return _.assign(err, context || {});\n },\n /**\n * Returns an object which contains the required data to compose an OfflineNavigationError.\n * This error get triggered in case when the test taker is unable to navigate offline.\n *\n * @returns {OfflineErrorObject}\n */\n getOfflineNavError: function getOfflineNavError() {\n return {\n message: __('We are unable to connect to the server to retrieve the next item.'),\n data: {\n success: false,\n source: 'navigator',\n purpose: 'proxy',\n type: 'nav',\n code: 404\n }\n };\n },\n /**\n * Returns an object which contains the required data to compose an OfflineExitError.\n * This error get triggered in case when the test taker is unable to exit the test offline.\n *\n * @returns {OfflineErrorObject}\n */\n getOfflineExitError: function getOfflineExitError() {\n return {\n message: __('We are unable to connect the server to submit your results.'),\n data: {\n success: false,\n source: 'navigator',\n purpose: 'proxy',\n type: 'finish',\n code: 404\n }\n };\n },\n /**\n * Returns an object which contains the required data to compose an OfflinePauseError.\n * This error get triggered in case when the test get paused in offline mode.\n *\n * @returns {OfflineErrorObject}\n */\n getOfflinePauseError: function getOfflinePauseError() {\n return {\n message: __('The test has been paused, we are unable to connect to the server.'),\n data: {\n success: false,\n source: 'navigator',\n purpose: 'proxy',\n type: 'pause',\n code: 404\n }\n };\n }\n };\n\n return offlineErrorHelper;\n\n});\n\n","define('taoQtiTest/runner/helpers/offlineSyncModal',['jquery', 'i18n', 'core/polling', 'ui/hider', 'ui/waitingDialog/waitingDialog', 'handlebars', 'lib/handlebars/helpers', 'util/shortcut/registry', 'util/shortcut'], function ($$1, __, polling, hider, waitingDialogFactory, Handlebars, Helpers0, shortcutRegistry, globalShortcut) { 'use strict';\n\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n polling = polling && Object.prototype.hasOwnProperty.call(polling, 'default') ? polling['default'] : polling;\n hider = hider && Object.prototype.hasOwnProperty.call(hider, 'default') ? hider['default'] : hider;\n waitingDialogFactory = waitingDialogFactory && Object.prototype.hasOwnProperty.call(waitingDialogFactory, 'default') ? waitingDialogFactory['default'] : waitingDialogFactory;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n shortcutRegistry = shortcutRegistry && Object.prototype.hasOwnProperty.call(shortcutRegistry, 'default') ? shortcutRegistry['default'] : shortcutRegistry;\n globalShortcut = globalShortcut && Object.prototype.hasOwnProperty.call(globalShortcut, 'default') ? globalShortcut['default'] : globalShortcut;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); \n\n\n return \"

      \\n\";\n });\n function offlineSyncModalCountdownTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template$1 = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", helper, options, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;\n\n\n buffer += \"
      \\n

      \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"It is not possible to save your responses while working offline.\", options) : helperMissing.call(depth0, \"__\", \"It is not possible to save your responses while working offline.\", options)))\n + \"

      \\n

      \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Option A\", options) : helperMissing.call(depth0, \"__\", \"Option A\", options)))\n + \"

      \\n
        \\n
      • \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Wait for your connection to come back online.\", options) : helperMissing.call(depth0, \"__\", \"Wait for your connection to come back online.\", options)))\n + \"
      • \\n
      • \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Try connecting the machine to the internet via cable, or move to an area with a better wifi signal.\", options) : helperMissing.call(depth0, \"__\", \"Try connecting the machine to the internet via cable, or move to an area with a better wifi signal.\", options)))\n + \"
      • \\n
      • \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"If the connection cannot be restored, see option B.\", options) : helperMissing.call(depth0, \"__\", \"If the connection cannot be restored, see option B.\", options)))\n + \"
      • \\n
      \\n

      \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Option B\", options) : helperMissing.call(depth0, \"__\", \"Option B\", options)))\n + \"

      \\n
        \\n
      • \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Download the pupil responses and submit manually.\", options) : helperMissing.call(depth0, \"__\", \"Download the pupil responses and submit manually.\", options)))\n + \"
      • \\n
      \\n

      \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Step 1: Download the file (see below when available).\", options) : helperMissing.call(depth0, \"__\", \"Step 1: Download the file (see below when available).\", options)))\n + \" \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Do not rename it.\", options) : helperMissing.call(depth0, \"__\", \"Do not rename it.\", options)))\n + \"

      \\n

      \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Step 2: When you are online again, please send the downloaded file to receptionbaseline@nfer.ac.uk together with the \", options) : helperMissing.call(depth0, \"__\", \"Step 2: When you are online again, please send the downloaded file to receptionbaseline@nfer.ac.uk together with the \", options)))\n + \"\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"name of the pupil\", options) : helperMissing.call(depth0, \"__\", \"name of the pupil\", options)))\n + \" \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"and\", options) : helperMissing.call(depth0, \"__\", \"and\", options)))\n + \" \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"the assessment (LCL or Mathematics)\", options) : helperMissing.call(depth0, \"__\", \"the assessment (LCL or Mathematics)\", options)))\n + \" \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"that was being taken.\", options) : helperMissing.call(depth0, \"__\", \"that was being taken.\", options)))\n + \"\\n

      \\n

      \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Step 3: Once you have downloaded the file you can close the browser window. Do not do anything further with the assessment whilst it shows as \\\"in progress\\\"; the status will be updated once the helpline has uploaded the file.\", options) : helperMissing.call(depth0, \"__\", \"Step 3: Once you have downloaded the file you can close the browser window. Do not do anything further with the assessment whilst it shows as \\\"in progress\\\"; the status will be updated once the helpline has uploaded the file.\", options)))\n + \"

      \\n
      \\n

      \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"If you need help, please contact our Helpline on 0330 088 4171.\", options) : helperMissing.call(depth0, \"__\", \"If you need help, please contact our Helpline on 0330 088 4171.\", options)))\n + \"

      \\n
      \";\n return buffer;\n });\n function offlineSyncModalWaitContentTpl(data, options, asString) {\n var html = Template$1(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Display the waiting dialog, while waiting the connection to be back\n * @param {Object} [proxy] - test runner proxy\n * @returns {waitingDialog} resolves once the wait is over and the user click on 'proceed'\n */\n function offlineSyncModalFactory(proxy) {\n const waitingConfig = {\n message: __('You are currently working offline.'),\n waitContent: offlineSyncModalWaitContentTpl(),\n proceedContent: __('Your connection seems to be back, please proceed.'),\n proceedButtonText: __('PROCEED & END ASSESSMENT'),\n showSecondary: true,\n secondaryButtonText: __('Download'),\n secondaryButtonIcon: 'download',\n buttonSeparatorText: __('or'),\n width: '600px'\n };\n let $secondaryButton;\n const betweenButtonTextSelector = '.between-buttons-text';\n const secondaryButtonWait = 60; // seconds to wait until it enables\n let delaySec;\n const $countdown = $$1(offlineSyncModalCountdownTpl());\n let countdownPolling;\n const dialogShortcut = shortcutRegistry($$1('body'), {\n propagate: false,\n prevent: true\n });\n\n // starts with shortcuts disabled, prevents the TAB key to be used to move outside the dialog box\n dialogShortcut.disable().set('Tab Shift+Tab');\n\n //creates the waiting modal dialog\n const waitingDialog = waitingDialogFactory(waitingConfig);\n const getDialogEl = selector => waitingDialog.dialog.getDom().find(selector);\n waitingDialog.on('render', () => {\n delaySec = secondaryButtonWait;\n $secondaryButton = getDialogEl('button[data-control=\"secondary\"]');\n $countdown.insertAfter($secondaryButton);\n proxy.after('reconnect.waiting', () => {\n waitingDialog.endWait();\n hider.hide(getDialogEl('p.message'));\n });\n proxy.before('disconnect.waiting', () => {\n // need to open dialog again if it is closed\n waitingDialog.dialog.show();\n waitingDialog.beginWait();\n });\n\n // if render comes before beginWait:\n if (waitingDialog.is('waiting')) {\n waitingDialog.trigger('begincountdown');\n }\n globalShortcut.disable();\n dialogShortcut.enable();\n }).on('destroy', () => {\n proxy.off('.waiting');\n globalShortcut.enable();\n dialogShortcut.disable();\n dialogShortcut.clear();\n }).on('wait', () => {\n hider.show(getDialogEl(betweenButtonTextSelector));\n hider.show(getDialogEl('p.message'));\n // if beginWait comes before render:\n if (waitingDialog.is('rendered')) {\n waitingDialog.trigger('begincountdown');\n }\n }).on('begincountdown', () => {\n // Set up secondary button time delay:\n // it can only be clicked after 60 seconds have passed\n // if disconnect-reconnect delay will be left seconds\n $secondaryButton.prop('disabled', true);\n countdownPolling = polling({\n action: function countdownAction() {\n delaySec--;\n $countdown.html(__('The download will be available in %d seconds', delaySec));\n if (delaySec < 1) {\n this.stop();\n $secondaryButton.removeProp('disabled');\n $countdown.html('');\n }\n },\n interval: 1000,\n autoStart: true\n });\n }).on('unwait', () => {\n countdownPolling.stop();\n $secondaryButton.prop('disabled', true);\n $countdown.html('');\n hider.hide(getDialogEl(betweenButtonTextSelector));\n });\n return waitingDialog;\n }\n\n return offlineSyncModalFactory;\n\n});\n\n","define('taoQtiTest/runner/helpers/testContextBuilder',['lodash', 'util/capitalize', 'taoQtiTest/runner/helpers/map', 'taoQtiTest/runner/helpers/navigation'], function (_, capitalize, mapHelper, navigationHelper) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n capitalize = capitalize && Object.prototype.hasOwnProperty.call(capitalize, 'default') ? capitalize['default'] : capitalize;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n navigationHelper = navigationHelper && Object.prototype.hasOwnProperty.call(navigationHelper, 'default') ? navigationHelper['default'] : navigationHelper;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Returns the updated test context from an item in the given position.\n *\n * @param {Object} testContext\n * @param {Object} testMap\n * @param {Integer} position\n * @returns {Object}\n */\n function buildTestContextFromPosition(testContext, testMap, position, attempt) {\n var updatedMap = mapHelper.updateItemStats(testMap, position),\n item = mapHelper.getItemAt(updatedMap, position),\n section = mapHelper.getItemSection(updatedMap, position),\n part = mapHelper.getItemPart(updatedMap, position);\n if (!item) {\n return false;\n }\n return getTestContext(testContext, testMap, item, section, part, position, attempt);\n }\n\n /**\n * Returns the updated test context from a jump table entry.\n *\n * @param {Object} testContext\n * @param {Object} testMap\n * @param {Object} jump\n * @param {String} jump.item\n * @param {String} jump.section\n * @param {String} jump.part\n * @param {Integer} jump.position\n * @returns {Object}\n */\n function buildTestContextFromJump(testContext, testMap, jump, attempt) {\n var part = testMap.parts[jump.part],\n section = part.sections[jump.section],\n item = section.items[jump.item];\n return getTestContext(testContext, testMap, item, section, part, jump.position, attempt);\n }\n\n /**\n * Returns the updated test context.\n *\n * @param {Object} testContext\n * @param {Object} testMap\n * @param {Object} item\n * @param {String} item.id\n * @param {Boolean} item.answered\n * @param {Integer} item.remainingAttempts\n * @param {Object} item.timeConstraint\n * @param {String[]} item.categories\n * @param {Object} section\n * @param {String} section.id\n * @param {String} section.label\n * @param {Object} section.timeConstraint\n * @param {Object} part\n * @param {String} part.id\n * @param {Boolean} part.isLinear\n * @param {Object} part.timeConstraint\n * @param {Integer} position\n * @returns {Object} the new test context\n * @private\n */\n function getTestContext(testContext, testMap, item, section, part, position, attempt) {\n var isLeavingSection = section.id !== testContext.sectionId,\n isLeavingPart = part.id !== testContext.testPartId,\n newTestContext = _.defaults({\n itemIdentifier: item.id,\n itemPosition: position,\n remainingAttempts: Math.max(-1, item.remainingAttempts - 1),\n sectionId: section.id,\n sectionTitle: section.label,\n testPartId: part.id,\n canMoveBackward: !part.isLinear && !navigationHelper.isFirst(testMap, item.id)\n }, testContext);\n if (attempt) {\n newTestContext.attempt = attempt + 1;\n }\n if (isLeavingSection) {\n newTestContext.numberRubrics = 0;\n newTestContext.rubrics = '';\n }\n newTestContext.timeConstraints = _.reject(testContext.timeConstraints, function (constraint) {\n return constraint.qtiClassName === 'assessmentItemRef' || isLeavingSection && constraint.qtiClassName === 'assessmentSection' || isLeavingPart && constraint.qtiClassName === 'testPart';\n });\n if (item.timeConstraint) {\n newTestContext.timeConstraints.push(item.timeConstraint);\n }\n if (isLeavingSection && section.timeConstraint) {\n newTestContext.timeConstraints.push(section.timeConstraint);\n }\n if (isLeavingPart && part.timeConstraint) {\n newTestContext.timeConstraints.push(part.timeConstraint);\n }\n newTestContext.options = _.defaults(getOptionsFromCategories(item.categories || []), _.pick(testContext.options, ['allowComment', 'allowSkipping', 'exitButton', 'logoutButton']));\n return newTestContext;\n }\n\n /**\n * Transforms the categories into context options.\n *\n * @param {String[]} categories - the list of categories\n * @returns {Object} the options object like \n * @private\n */\n function getOptionsFromCategories(categories) {\n if (!_.isArray(categories) || !categories.length) {\n return {};\n }\n return _.reduce(categories, function (acc, category) {\n var categoryName;\n if (_.isString(category) && !_.isEmpty(category)) {\n // transfrom the category name in an option name:\n // x-tao-option-review-screen to reviewScreen\n categoryName = category.replace('x-tao-option-', '').split(/[-_]+/g).map(function (name, index) {\n if (index === 0) {\n return name;\n }\n if (name.length) {\n return capitalize(name);\n }\n return '';\n }).join('');\n if (categoryName) {\n acc[categoryName] = true;\n }\n }\n return acc;\n }, {});\n }\n var testContextBuilder = {\n buildTestContextFromPosition: buildTestContextFromPosition,\n buildTestContextFromJump: buildTestContextFromJump\n };\n\n return testContextBuilder;\n\n});\n\n","define('taoQtiTest/runner/navigator/navigator',['lodash', 'taoQtiTest/runner/helpers/map', 'taoQtiTest/runner/helpers/testContextBuilder'], function (_, mapHelper, testContextBuilder) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n testContextBuilder = testContextBuilder && Object.prototype.hasOwnProperty.call(testContextBuilder, 'default') ? testContextBuilder['default'] : testContextBuilder;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Gives you a navigator\n * @param {Object} testContext\n * @param {Object} testMap\n * @returns {Object} the navigator\n * @throws {TypeError} if the given parameters aren't objects\n */\n var navigatorFactory = function navigatorFactory(testContext, testMap) {\n if (!_.all([testContext, testMap], _.isPlainObject)) {\n throw new TypeError('The navigator must be built with a testData, a testContext and a testMap');\n }\n return {\n /**\n * Selects and execute the navigation method based on the direction/scope.\n *\n * @param {String} direction - the move direction (next, previous or jump)\n * @param {String} scope - the move scope (item, section, testPart)\n * @param {Number} [position] - the position in case of jump\n * @returns {Object|Boolean} - false if we can't navigate, otherwise the result of the nav\n */\n navigate: function navigate(direction, scope, position) {\n var methodName = direction.toLowerCase() + scope.substr(0, 1).toUpperCase() + scope.substr(1).toLowerCase();\n if (_.isFunction(this[methodName])) {\n return this[methodName](position);\n }\n },\n /**\n * Navigate to the next item\n * @returns {Object} the new test context\n */\n nextItem: function nextItem() {\n return testContextBuilder.buildTestContextFromPosition(testContext, testMap, testContext.itemPosition + 1);\n },\n /**\n * Navigate to the next item\n * @returns {Object} the new test context\n */\n previousItem: function previsousItem() {\n return testContextBuilder.buildTestContextFromPosition(testContext, testMap, testContext.itemPosition - 1);\n },\n /**\n * Navigate to the next item\n * @returns {Object} the new test context\n */\n nextSection: function nextSection() {\n var sectionStats = mapHelper.getSectionStats(testMap, testContext.sectionId);\n var section = mapHelper.getSection(testMap, testContext.sectionId);\n return testContextBuilder.buildTestContextFromPosition(testContext, testMap, section.position + sectionStats.total);\n },\n /**\n * Navigate to the given position\n * @param {Number} position - the position\n * @returns {Object} the new test context\n */\n jumpItem: function jumpItem(position) {\n return testContextBuilder.buildTestContextFromPosition(testContext, testMap, position);\n }\n };\n };\n\n return navigatorFactory;\n\n});\n\n","define('taoQtiTest/runner/branchRule/helpers/branchRuleHelper',['lodash'], function (_) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Parses sub branch rules and returns an array of results\n *\n * @param {Object} branchRuleDefinition\n * @param {Object} item\n * @param {Object} navigationParams\n * @param {Function} branchRuleMapper\n * @param {Object} responseStore\n * @returns {Promise}\n */\n function evaluateSubBranchRules(branchRuleDefinition, item, navigationParams, branchRuleMapper, responseStore) {\n return new Promise(function (resolve, reject) {\n var subBranchRuleResults = [],\n promises = [];\n\n // Remove the @attributes from the branch rule definition\n branchRuleDefinition = _.omit(branchRuleDefinition, ['@attributes']);\n promises = _.map(branchRuleDefinition, function (subBranchRule, subBranchRuleName) {\n return branchRuleMapper(subBranchRuleName, branchRuleDefinition[subBranchRuleName], item, navigationParams, responseStore).validate();\n });\n Promise.all(promises).then(function (results) {\n _.forEach(results, function (subBranchRuleResult) {\n // if the result is an array (e.g. in case of NOT), add all elements of it to the results\n if (Array.isArray(subBranchRuleResult)) {\n subBranchRuleResult.forEach(function (value) {\n subBranchRuleResults.push(value);\n });\n // otherwise add the single value to the results\n } else {\n subBranchRuleResults.push(subBranchRuleResult);\n }\n });\n resolve(subBranchRuleResults);\n }).catch(function (err) {\n reject(err);\n });\n });\n }\n var branchRuleHelper = {\n evaluateSubBranchRules: evaluateSubBranchRules\n };\n\n return branchRuleHelper;\n\n});\n\n","define('taoQtiTest/runner/branchRule/types/match',['lodash'], function (_) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * MATCH branching rule\n *\n * @param {Object} branchRuleDefinition the definition object of the branch rule, which contains additional branching rules, and also the target\n * @param {Object} item item object from the itemStore\n * @param {Object} navigationParams object of navigation parameters which got passed to the navigation action\n * @param {branchRuleMapper} branchRuleMapper\n * @param {responseStore} responseStore\n */\n function matchBranchRuleFactory(branchRuleDefinition, item, navigationParams, branchRuleMapper, responseStore) {\n var variableIdentifier = branchRuleDefinition.variable['@attributes'].identifier;\n var correctIdentifier = branchRuleDefinition.correct['@attributes'].identifier;\n return {\n /**\n * Evaluates that the value of given variable is matching or not of the value of the given correct response\n * @returns {boolean}\n */\n validate: function validate() {\n return Promise.all([responseStore.getCorrectResponse(correctIdentifier), responseStore.getResponse(variableIdentifier)]).then(function (result) {\n return _.contains(result[0], result[1]);\n });\n }\n };\n }\n\n return matchBranchRuleFactory;\n\n});\n\n","define('taoQtiTest/runner/branchRule/types/or',['taoQtiTest/runner/branchRule/helpers/branchRuleHelper'], function (branchRuleHelper) { 'use strict';\n\n branchRuleHelper = branchRuleHelper && Object.prototype.hasOwnProperty.call(branchRuleHelper, 'default') ? branchRuleHelper['default'] : branchRuleHelper;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * OR branching rule\n *\n * @param {Object} branchRuleDefinition the definition object of the branch rule, which contains additional branching rules, and also the target\n * @param {Object} item item object from the itemStore\n * @param {Object} navigationParams object of navigation parameters which got passed to the navigation action\n * @param {branchRuleMapper} branchRuleMapper\n * @param {responseStore} responseStore\n */\n function orBranchRuleFactory(branchRuleDefinition, item, navigationParams, branchRuleMapper, responseStore) {\n return {\n /**\n * Evaluates an OR expression on all the given expressions and returns the result\n * @returns {Promise}\n */\n validate: function validate() {\n return branchRuleHelper.evaluateSubBranchRules(branchRuleDefinition, item, navigationParams, branchRuleMapper, responseStore).then(function (subBranchRuleResults) {\n return subBranchRuleResults.some(function (value) {\n return value;\n });\n });\n }\n };\n }\n\n return orBranchRuleFactory;\n\n});\n\n","define('taoQtiTest/runner/branchRule/types/and',['taoQtiTest/runner/branchRule/helpers/branchRuleHelper'], function (branchRuleHelper) { 'use strict';\n\n branchRuleHelper = branchRuleHelper && Object.prototype.hasOwnProperty.call(branchRuleHelper, 'default') ? branchRuleHelper['default'] : branchRuleHelper;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * AND branching rule\n *\n * @param {Object} branchRuleDefinition the definition object of the branch rule, which contains additional branching rules, and also the target\n * @param {Object} item item object from the itemStore\n * @param {Object} navigationParams object of navigation parameters which got passed to the navigation action\n * @param {branchRuleMapper} branchRuleMapper\n * @param {responseStore} responseStore\n */\n function andBranchRuleFactory(branchRuleDefinition, item, navigationParams, branchRuleMapper, responseStore) {\n return {\n /**\n * Evaluates an AND expression on all the given expressions and returns the result\n * @returns {Promise}\n */\n validate: function validate() {\n return branchRuleHelper.evaluateSubBranchRules(branchRuleDefinition, item, navigationParams, branchRuleMapper, responseStore).then(function (subBranchRuleResults) {\n return subBranchRuleResults.every(function (value) {\n return value;\n });\n });\n }\n };\n }\n\n return andBranchRuleFactory;\n\n});\n\n","define('taoQtiTest/runner/branchRule/types/not',['lodash'], function (_) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * NOT branching rule\n *\n * @param {Object} branchRuleDefinition the definition object of the branch rule, which contains additional branching rules, and also the target\n * @param {Object} item item object from the itemStore\n * @param {Object} navigationParams object of navigation parameters which got passed to the navigation action\n * @param {branchRuleMapper} branchRuleMapper\n * @param {responseStore} responseStore\n */\n function notBranchRuleFactory(branchRuleDefinition, item, navigationParams, branchRuleMapper, responseStore) {\n // If the NOT branching rule has only one child, cast it as an array\n if (!Array.isArray(branchRuleDefinition)) {\n branchRuleDefinition = [branchRuleDefinition];\n }\n return {\n /**\n * Evaluates a NOT expression on the given expressions and returns an array of results\n * @returns {Promise}\n */\n validate: function validate() {\n var promises = branchRuleDefinition.map(function (expression) {\n var subBranchRuleName = _.head(_.keys(expression)),\n subBranchRuleDefinition = expression[subBranchRuleName];\n return branchRuleMapper(subBranchRuleName, subBranchRuleDefinition, item, navigationParams, responseStore).validate();\n });\n return Promise.all(promises).then(function (results) {\n return _.map(results, function (result) {\n return !result;\n });\n });\n }\n };\n }\n\n return notBranchRuleFactory;\n\n});\n\n","define('taoQtiTest/runner/branchRule/branchRuleMapper',['taoQtiTest/runner/branchRule/types/match', 'taoQtiTest/runner/branchRule/types/or', 'taoQtiTest/runner/branchRule/types/and', 'taoQtiTest/runner/branchRule/types/not'], function (matchBranchRule, orBranchRule, andBranchRule, notBranchRule) { 'use strict';\n\n matchBranchRule = matchBranchRule && Object.prototype.hasOwnProperty.call(matchBranchRule, 'default') ? matchBranchRule['default'] : matchBranchRule;\n orBranchRule = orBranchRule && Object.prototype.hasOwnProperty.call(orBranchRule, 'default') ? orBranchRule['default'] : orBranchRule;\n andBranchRule = andBranchRule && Object.prototype.hasOwnProperty.call(andBranchRule, 'default') ? andBranchRule['default'] : andBranchRule;\n notBranchRule = notBranchRule && Object.prototype.hasOwnProperty.call(notBranchRule, 'default') ? notBranchRule['default'] : notBranchRule;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n var branchRuleMap = {\n match: matchBranchRule,\n or: orBranchRule,\n and: andBranchRule,\n not: notBranchRule\n };\n\n /**\n * Returns the proper branching rule based on the given name\n *\n * @param {string} branchRuleName\n * @param {Object} branchRuleDefinition the definition object of the branch rule, which contains additional branching rules also\n * @param {Object} item item object from the itemStore\n * @param {Object} navigationParams object of navigation parameters which got passed to the navigation action\n * @param {responseStore} responseStore\n */\n function branchRuleMapperFactory(branchRuleName, branchRuleDefinition, item, navigationParams, responseStore) {\n if (!(branchRuleName in branchRuleMap)) {\n throw new Error(`Invalid branch rule name: ${branchRuleName}`);\n }\n return branchRuleMap[branchRuleName](branchRuleDefinition, item, navigationParams, branchRuleMapperFactory, responseStore);\n }\n\n return branchRuleMapperFactory;\n\n});\n\n","define('taoQtiTest/runner/branchRule/branchRule',['taoQtiTest/runner/branchRule/helpers/branchRuleHelper', 'taoQtiTest/runner/branchRule/branchRuleMapper'], function (branchRuleHelper, branchRuleMapper) { 'use strict';\n\n branchRuleHelper = branchRuleHelper && Object.prototype.hasOwnProperty.call(branchRuleHelper, 'default') ? branchRuleHelper['default'] : branchRuleHelper;\n branchRuleMapper = branchRuleMapper && Object.prototype.hasOwnProperty.call(branchRuleMapper, 'default') ? branchRuleMapper['default'] : branchRuleMapper;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Evaluates all the branch rules and returns the `@attributes.target` if the evaluation returns true, null otherwise\n *\n * @param {Object} branchRuleDefinition the definition object of the branch rule, which contains additional branching rules, and also the target\n * @param {Object} item item object from the itemStore\n * @param {Object} navigationParams object of navigation parameters which got passed to the navigation action\n * @param {responseStore} responseStore\n * @returns {Promise}\n */\n function branchRuleFactory(branchRuleDefinition, item, navigationParams, responseStore) {\n return new Promise(function (resolve) {\n var result;\n if (typeof branchRuleDefinition['@attributes'] === 'undefined' || typeof branchRuleDefinition['@attributes']['target'] === 'undefined') {\n return resolve(null);\n }\n branchRuleHelper.evaluateSubBranchRules(branchRuleDefinition, item, navigationParams, branchRuleMapper, responseStore).then(function (branchRuleResults) {\n result = branchRuleResults.every(function (branchRuleResult) {\n return branchRuleResult;\n });\n if (result) {\n return resolve(branchRuleDefinition['@attributes']['target']);\n }\n resolve(null);\n });\n });\n }\n\n return branchRuleFactory;\n\n});\n\n","define('taoQtiTest/runner/services/offlineJumpTable',['lodash', 'taoQtiTest/runner/branchRule/branchRule', 'taoQtiTest/runner/helpers/map'], function (_, branchRule, mapHelper) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n branchRule = branchRule && Object.prototype.hasOwnProperty.call(branchRule, 'default') ? branchRule['default'] : branchRule;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Jump table entry definition.\n *\n * @typedef Jump\n * @property {string} item - the identifier of the item\n * @property {string} section - the identifier of the section\n * @property {string} part - the identifier of the part\n * @property {integer} position - the position of the jump entry, starting from 0\n */\n /**\n * Helper class for the offline version of the jump table which helps the navigation of the test taker.\n */\n var offlineJumpTableFactory = function offlineJumpTableFactory(itemStore, responseStore) {\n var testMap = {};\n var jumpTable = [];\n\n /**\n * Put all the responses from the navigation parameters into the responseStore\n *\n * @param {Object} params\n */\n function addResponsesToResponseStore(params) {\n if (params.itemResponse) {\n _.forEach(params.itemResponse, function (response, itemResponseIdentifier) {\n var responseIdentifier = `${params.itemDefinition}.${itemResponseIdentifier}`;\n _.forEach(response, function (responseEntry) {\n var responseId = responseEntry && responseEntry.identifier;\n if (Array.isArray(responseId)) {\n responseId.forEach(function (id) {\n responseStore.addResponse(responseIdentifier, id);\n });\n } else {\n responseStore.addResponse(responseIdentifier, responseId);\n }\n });\n });\n }\n }\n\n /**\n * Returns all the item identifiers in order.\n *\n * @param {Object} map\n * @returns {Array}\n */\n function getItems(map) {\n return _.uniq(_.map(getSimplifiedTestMap(map), function (row) {\n return row.item;\n }));\n }\n\n /**\n * Returns all the section identifiers in order.\n *\n * @param {Object} map\n * @returns {Array}\n */\n function getSections(map) {\n return _.uniq(_.map(getSimplifiedTestMap(map), function (row) {\n return row.section;\n }));\n }\n\n /**\n * Returns a simplified test map array, which will contain the item, section and part identifiers.\n *\n * @param {Object} map\n * @returns {Array}\n */\n function getSimplifiedTestMap(map) {\n var simplifiedTestMap = [];\n mapHelper.each(map, function (item, section, part) {\n simplifiedTestMap.push({\n item: item.id,\n itemHasBranchRule: !_.isEmpty(item.branchRule),\n itemBranchRule: item.branchRule,\n section: section.id,\n sectionHasBranchRule: !_.isEmpty(section.branchRule),\n sectionBranchRule: section.branchRule,\n part: part.id,\n partHasBranchRule: !_.isEmpty(part.branchRule),\n partBranchRule: part.branchRule\n });\n });\n return simplifiedTestMap;\n }\n return {\n /**\n * Setter for test map\n *\n * @param {Object} map\n * @returns {offlineJumpTableFactory}\n */\n setTestMap: function setTestMap(map) {\n testMap = map;\n return this;\n },\n /**\n * Build jumpTable\n *\n * @param {Object} testContext\n * @returns {Promise}\n */\n buildJumpTable: function buildJumpTable(testContext) {\n const self = this;\n const simplifiedTestMap = getSimplifiedTestMap(testMap);\n const contextItemId = testContext ? testContext.itemIdentifier : null;\n const contextItemPosition = contextItemId ? testContext.itemPosition : null;\n const firstJumpItem = simplifiedTestMap[0];\n if (firstJumpItem) {\n this.addJump(firstJumpItem.part, firstJumpItem.section, firstJumpItem.item);\n }\n if (!contextItemPosition) {\n return Promise.resolve();\n }\n function calculateNextJump() {\n var lastJumpItem = self.getLastJump().item || null;\n if (contextItemId !== lastJumpItem) {\n return itemStore.get(lastJumpItem).then(function (item) {\n const itemResponse = {};\n _.forEach(item.itemState, function (state, itemStateIdentifier) {\n itemResponse[itemStateIdentifier] = state.response;\n });\n return self.jumpToNextItem(Object.assign({}, item, {\n itemResponse,\n itemDefinition: item.itemIdentifier\n })).then(calculateNextJump);\n });\n }\n return Promise.resolve();\n }\n return calculateNextJump();\n },\n /**\n * Put all correct responses to the responseStore\n *\n * @param {Object} testContext\n * @returns {Promise}\n */\n putCorrectResponsesInStore: function putCorrectResponsesInStore() {\n const simplifiedTestMap = getSimplifiedTestMap(testMap);\n const promises = [];\n simplifiedTestMap.forEach(function (row) {\n promises.push(itemStore.get(row.item).then(function (item) {\n if (item) {\n _.forEach(item.itemData.data.responses, function (response) {\n var responseIdentifier = `${item.itemIdentifier}.${response.identifier}`;\n responseStore.addCorrectResponse(responseIdentifier, response.correctResponses);\n });\n }\n }).catch(function (err) {\n return Promise.reject(err);\n }));\n });\n return Promise.all(promises);\n },\n /**\n * Initialization method for the offline jump table, which is responsible to add the first item as the first\n * jump and collect the correct responses for the branching rules.\n * @param {Object} [testContext] - current test context is needed in order to continue test after interruption\n * @returns {Promise}\n */\n init: function init(testContext) {\n return this.putCorrectResponsesInStore().then(() => this.buildJumpTable(testContext));\n },\n /**\n * Clears the jump table\n *\n * @returns {offlineJumpTableFactory}\n */\n clearJumpTable: function clearJumpTable() {\n jumpTable = [];\n return this;\n },\n /**\n * Adds a new jump into the end of the jump table\n *\n * @param {String} partIdentifier\n * @param {String} sectionIdentifier\n * @param {String} itemIdentifier\n */\n addJump: function addJump(partIdentifier, sectionIdentifier, itemIdentifier) {\n var self = this;\n return new Promise(function (resolve) {\n var lastJump = self.getLastJump();\n var nextPosition = typeof lastJump.position !== 'undefined' ? lastJump.position + 1 : 0;\n jumpTable.push({\n item: itemIdentifier,\n part: partIdentifier,\n section: sectionIdentifier,\n position: nextPosition\n });\n resolve();\n });\n },\n /**\n * Jumps into a specific position inside the jump table. The jump entry in the given position\n * will be the last element of the jump table, every other entry after this entry will get deleted\n *\n * @param {Integer} position\n * @returns {offlineJumpTableFactory}\n */\n jumpTo: function jumpTo(position) {\n jumpTable = jumpTable.filter(function (jump) {\n return jump.position <= position;\n });\n return this;\n },\n /**\n * Jumps to the next item without taking the branching rules into account\n *\n * @returns {Promise}\n */\n jumpToSkipItem: function jumpToSkipItem() {\n var self = this;\n return new Promise(function (resolve) {\n var simplifiedTestMap = getSimplifiedTestMap(testMap);\n var lastJumpItem = self.getLastJump().item || null;\n var items = getItems(testMap);\n var itemSliceIndex = items.indexOf(lastJumpItem);\n var itemIdentifierToAdd = items.slice(itemSliceIndex + 1).shift();\n var itemToAdd = simplifiedTestMap.filter(function (row) {\n return row.item === itemIdentifierToAdd;\n }).shift();\n if (itemToAdd) {\n return self.addJump(itemToAdd.part, itemToAdd.section, itemToAdd.item).then(resolve);\n } else {\n return resolve();\n }\n });\n },\n /**\n * Adds the next item to the end of the jump table\n *\n * @param {Object} params\n * @returns {Promise}\n */\n jumpToNextItem: function jumpToNextItem(params) {\n var self = this;\n addResponsesToResponseStore(params);\n return new Promise(function (resolve) {\n var simplifiedTestMap = getSimplifiedTestMap(testMap);\n var lastJumpItem = self.getLastJump().item || null;\n var items = getItems(testMap);\n var itemSliceIndex = items.indexOf(lastJumpItem);\n var itemIdentifierToAdd = items.slice(itemSliceIndex + 1).shift();\n var itemToAdd = simplifiedTestMap.filter(function (row) {\n return row.item === itemIdentifierToAdd;\n }).shift();\n var lastJumpItemData = simplifiedTestMap.filter(function (row) {\n return row.item === lastJumpItem;\n }).shift();\n if (lastJumpItemData && lastJumpItemData.itemHasBranchRule) {\n return itemStore.get(lastJumpItem).then(function (item) {\n branchRule(lastJumpItemData.itemBranchRule, item, params, responseStore).then(function (itemIdentifierToAddd) {\n if (itemIdentifierToAddd !== null) {\n itemToAdd = simplifiedTestMap.filter(function (row) {\n return row.item === itemIdentifierToAddd;\n }).shift();\n }\n self.addJump(itemToAdd.part, itemToAdd.section, itemToAdd.item).then(resolve);\n }).catch(function (err) {\n return Promise.reject(err);\n });\n }).catch(function (err) {\n return Promise.reject(err);\n });\n } else {\n if (itemToAdd) {\n return self.addJump(itemToAdd.part, itemToAdd.section, itemToAdd.item).then(resolve);\n } else {\n return resolve();\n }\n }\n });\n },\n /**\n * Adds the first item of the next section to the end of the jump table\n *\n * @returns {Promise}\n */\n jumpToNextSection: function jumpToNextSection() {\n var self = this;\n return new Promise(function (resolve) {\n var simplifiedTestMap = getSimplifiedTestMap(testMap);\n var lastJumpSection = self.getLastJump().section || null;\n var sections = getSections(testMap);\n var sectionSliceIndex = sections.indexOf(lastJumpSection);\n var sectionIdentifierToAdd = sections.slice(sectionSliceIndex + 1).shift();\n var itemToAdd = simplifiedTestMap.filter(function (row) {\n return row.section === sectionIdentifierToAdd;\n }).shift();\n if (itemToAdd) {\n return self.addJump(itemToAdd.part, itemToAdd.section, itemToAdd.item).then(resolve);\n } else {\n return resolve();\n }\n });\n },\n /**\n * Jumps to the previous item by deleting the last entry of the jump table.\n *\n * @returns {Promise}\n */\n jumpToPreviousItem: function jumpToPreviousItem() {\n return new Promise(function (resolve) {\n jumpTable.pop();\n resolve();\n });\n },\n /**\n * Returns the jump table.\n *\n * @returns {Jump[]}\n */\n getJumpTable: function getJumpTable() {\n return jumpTable;\n },\n /**\n * Returns the last entry of the jump table which represent the current state of the navigation.\n *\n * @returns {Jump}\n */\n getLastJump: function getLastJump() {\n return jumpTable.length > 0 ? jumpTable[jumpTable.length - 1] : {};\n }\n };\n };\n\n return offlineJumpTableFactory;\n\n});\n\n","define('taoQtiTest/runner/navigator/offlineNavigator',['util/capitalize', 'taoQtiTest/runner/services/offlineJumpTable', 'taoQtiTest/runner/helpers/testContextBuilder'], function (capitalize, offlineJumpTableFactory, testContextBuilder) { 'use strict';\n\n capitalize = capitalize && Object.prototype.hasOwnProperty.call(capitalize, 'default') ? capitalize['default'] : capitalize;\n offlineJumpTableFactory = offlineJumpTableFactory && Object.prototype.hasOwnProperty.call(offlineJumpTableFactory, 'default') ? offlineJumpTableFactory['default'] : offlineJumpTableFactory;\n testContextBuilder = testContextBuilder && Object.prototype.hasOwnProperty.call(testContextBuilder, 'default') ? testContextBuilder['default'] : testContextBuilder;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * @param {itemStore} itemStore\n * @param {responseStore} responseStore\n * @returns {Object}\n */\n function offlineNavigatorFactory(itemStore, responseStore) {\n var testContext,\n testMap,\n offlineJumpTableHelper = offlineJumpTableFactory(itemStore, responseStore);\n return {\n /**\n * @deprecated\n * @param {Object} data\n * @returns {this}\n */\n setTestData: function setTestData() {\n return this;\n },\n /**\n * @param {Object} context\n * @returns {this}\n */\n setTestContext: function setTestContext(context) {\n testContext = context;\n return this;\n },\n /**\n * @param {Object} map\n * @returns {this}\n */\n setTestMap: function setTestMap(map) {\n testMap = map;\n return this;\n },\n /**\n * Initialization method for the offline navigator component\n * It get called in proxy init function\n *\n * @returns {Promise}\n */\n init: function init() {\n offlineJumpTableHelper.setTestMap(testMap);\n return offlineJumpTableHelper.init(testContext);\n },\n /**\n * Helper function to clear the jump table\n * It's used only in tests\n *\n * @returns {this}\n */\n clearJumpTable: function clearJumpTable() {\n offlineJumpTableHelper.clearJumpTable();\n return this;\n },\n /**\n * Performs the navigation action and returns the new test context.\n *\n * @param {String} direction\n * @param {String} scope\n * @param {Integer} position\n * @param {Object} params\n * @returns {Promise} the new test context\n */\n navigate: function navigate(direction, scope, position, params) {\n return new Promise(function (resolve, reject) {\n var lastJump,\n navigationActionName = `jumpTo${capitalize(direction)}${capitalize(scope)}`;\n if (typeof offlineJumpTableHelper[navigationActionName] === 'undefined' || typeof offlineJumpTableHelper[navigationActionName] !== 'function') {\n throw new Error('Invalid navigation action');\n }\n offlineJumpTableHelper[navigationActionName](params).then(function () {\n lastJump = offlineJumpTableHelper.getLastJump();\n // new textContext doesn't know about item attempt\n // attempt is stored in itemStore\n // 1. get attempt from itemStore and increase it\n // 2. set it in new textContext\n // 3. store new attempt in itemStore\n // 4. return new textContext with right attempt\n itemStore.get(lastJump.item).then(itemFromStore => {\n const newTestContext = testContextBuilder.buildTestContextFromJump(testContext, testMap, lastJump, itemFromStore.attempt);\n itemStore.update(newTestContext.itemIdentifier, 'attempt', newTestContext.attempt).then(() => resolve(newTestContext));\n });\n }).catch(function (err) {\n reject(err);\n });\n });\n }\n };\n }\n\n return offlineNavigatorFactory;\n\n});\n\n","define('taoQtiTest/runner/provider/dataUpdater',['lodash', 'taoQtiTest/runner/helpers/map', 'taoQtiTest/runner/config/states'], function (_, mapHelper, states) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n states = states && Object.prototype.hasOwnProperty.call(states, 'default') ? states['default'] : states;\n\n /*\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017 (original work) Open Assessment Technologies SA\n *\n */\n\n /**\n * Get the updater\n * @param {Map} testDataHolder - the data holder\n * @returns {dataUpdater}\n * @throws {TypeError} if the data holder is not or incorrectly set\n */\n function dataUpdaterFactory(testDataHolder) {\n if (!testDataHolder || !_.isFunction(testDataHolder.get) || !_.isFunction(testDataHolder.set)) {\n throw new TypeError('A data holder is mandatory for the udpater');\n }\n\n /**\n * Exposes the methods to update test data\n * @typedef {Object} dataUpdater\n */\n return {\n /**\n * Update test data from a dataSet (usually their raw data given by the proxy).\n * If the dataSet is a collection, we use only the last matching object.\n * @param {Object|Object[]} dataSet - object[s] that contains or not testData, testContext & testMap\n */\n update: function update(dataSet) {\n var self = this;\n\n /**\n * Check if a collection's item contains test contextual data\n * @param {Object} contextualData\n * @returns {Boolean}\n */\n var isContextual = function isContextual(contextualData) {\n return contextualData && (_.isPlainObject(contextualData.testContext) || _.isPlainObject(contextualData.testData) || _.isPlainObject(contextualData.testMap));\n };\n\n /**\n * Update the test data from contextual data\n * @param {Object} contextualData\n */\n var updateData = function updateData(contextualData) {\n var builtTestMap;\n var updatedTestMap;\n if (contextualData) {\n if (_.isPlainObject(contextualData.testData)) {\n testDataHolder.set('testData', contextualData.testData);\n }\n if (_.isPlainObject(contextualData.testContext)) {\n testDataHolder.set('testContext', contextualData.testContext);\n }\n if (_.isPlainObject(contextualData.testMap)) {\n //the received map is not complete and should be \"built\"\n builtTestMap = self.buildTestMap(contextualData.testMap);\n if (builtTestMap) {\n testDataHolder.set('testMap', builtTestMap);\n }\n }\n\n //always update the map stats\n updatedTestMap = self.updateStats();\n if (updatedTestMap) {\n testDataHolder.set('testMap', updatedTestMap);\n }\n }\n };\n if (isContextual(dataSet)) {\n updateData(dataSet);\n } else {\n updateData(_.findLast(dataSet, isContextual));\n }\n },\n /**\n * - reindex and build the jump table\n * - patch the current testMap if a partial map is set\n *\n * @param {Object} testMap - the testMap to build\n * @returns {Object} the built testMap\n */\n buildTestMap: function buildTestMap(testMap) {\n var newMap = null;\n if (testMap) {\n if (testMap.scope && testMap.scope !== 'test') {\n newMap = mapHelper.patch(testDataHolder.get('testMap'), testMap);\n } else {\n newMap = mapHelper.reindex(testMap);\n }\n }\n return newMap;\n },\n /**\n * Update current map stats based on the context\n *\n * @returns {Object} the updated testMap\n */\n updateStats: function updateStats() {\n const testMap = testDataHolder.get('testMap');\n const testContext = testDataHolder.get('testContext');\n let updatedTestMap = null;\n if (testMap && testContext && _.isNumber(testContext.itemPosition)) {\n const item = mapHelper.getItemAt(testMap, testContext.itemPosition);\n if (item && testContext.state === states.testSession.interacting) {\n const testPart = mapHelper.getPart(testMap, testContext.testPartId);\n\n //flag as viewed, always\n item.viewed = true;\n if (testPart && testPart.isLinear) {\n item.answered = true;\n }\n updatedTestMap = mapHelper.updateItemStats(testMap, testContext.itemPosition);\n }\n }\n return updatedTestMap;\n },\n /**\n * Let's you update the plugins configuration from when filling testData\n * @param {plugin[]} plugins - the test runner plugins\n * @param {Objectt} [pluginsConfig] - the configuration to set on the plugins\n */\n updatePluginsConfig(plugins, pluginsConfig) {\n //to keep backward compatibility with the deprecated testData\n if (!pluginsConfig) {\n const testData = testDataHolder.get('testData');\n pluginsConfig = testData && testData.config && testData.config.plugins;\n }\n if (plugins && pluginsConfig) {\n _.forEach(pluginsConfig, (config, pluginName) => {\n if (_.isPlainObject(plugins[pluginName]) && _.isFunction(plugins[pluginName].setConfig) && _.isPlainObject(config)) {\n plugins[pluginName].setConfig(config);\n }\n });\n }\n }\n };\n }\n\n return dataUpdaterFactory;\n\n});\n\n","define('taoQtiTest/runner/provider/toolStateBridge',['lodash'], function (_) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n\n /*\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2018 (original work) Open Assessment Technologies SA\n *\n */\n\n /**\n * Merge each item of a collection with the next\n * @param {Object[]} collection\n * @return {Object} the merged collection\n */\n var mergeCollection = function mergeCollection(collection) {\n return _.reduce(collection, function (acc, value) {\n if (value) {\n return _.merge(acc, value);\n }\n return acc;\n }, {});\n };\n\n /**\n * Build the toolStateBridge instance.\n *\n *\n * In order to allow state management for a tool the matching plugin\n * needs to be activated.\n *\n * @param {testStore} testStore - the testStore instance\n * @param {String[]} activePlugins - the list of active plugins\n * @returns {toolStateBridge}\n */\n function toolStateBridgeFactory(testStore, activePlugins) {\n var tools = [];\n if (!testStore || !_.isFunction(testStore.getStore)) {\n throw new TypeError('The toolStateBridge should be initialized with a testStore');\n }\n if (!_.isArray(activePlugins) || !activePlugins.length) {\n throw new TypeError('The toolStateBridge should be initialized with a the list of active plugins');\n }\n\n /**\n * @typedef {Object} toolStateBridge\n */\n return {\n /**\n * Set the tools to manage the states.\n * Each toolName MUST match a plugin name.\n *\n * This trigger the change tracking in the testStore for the\n * stores with the tool/plugin name.\n *\n * @param {String[]} toolNames - the list of tool names\n * @returns {toolStateBridge} chains\n */\n setTools: function setTools(toolNames) {\n tools = _(toolNames).filter(function (toolName) {\n return _.contains(activePlugins, toolName);\n }).map(function (toolName) {\n testStore.startChangeTracking(toolName);\n return toolName;\n }).value();\n return this;\n },\n /**\n * Get the list of tools\n * @returns {String[]} the list of configured tools\n */\n getTools: function getTools() {\n return tools;\n },\n /**\n * Restore the state of the given tool\n * @param {String} toolName - the name of the tool\n * @param {Object} toolState - the state to restore\n * @returns {Promise} resolves with true if restored\n */\n restoreState: function restoreState(toolName, toolState) {\n if (_.contains(tools, toolName) && _.isPlainObject(toolState)) {\n return testStore.getStore(toolName).then(function (toolStore) {\n return toolStore.clear().then(function () {\n return toolStore;\n });\n }).then(function (toolStore) {\n return Promise.all(_.map(toolState, function (value, key) {\n return toolStore.setItem(key, value);\n }));\n }).then(function () {\n testStore.resetChanges(toolName);\n return true;\n });\n }\n return Promise.resolve(false);\n },\n /**\n * Restore the states of multiple tools\n * @param {Object} states - key is the toolName and the value the state to resolve\n * @returns {Promise} key is the restored toolName and the value is the status\n */\n restoreStates: function restoreStates(states) {\n var self = this;\n return Promise.all(_.map(states, function (toolState, toolName) {\n return self.restoreState(toolName, toolState).then(function (result) {\n var formattedResult = {};\n formattedResult[toolName] = result;\n return formattedResult;\n });\n })).then(mergeCollection);\n },\n /**\n * Get the state of a given tool\n * @param {String} toolName - the name of the tool\n * @param {Boolean} [reset] - do we reset the change tracking ?\n * @returns {Promise} resolves with the state\n */\n getState: function getState(toolName, reset) {\n if (_.contains(tools, toolName) && testStore.hasChanges(toolName)) {\n return testStore.getStore(toolName).then(function (toolStore) {\n if (reset !== false) {\n testStore.resetChanges(toolName);\n }\n return toolStore.getItems();\n });\n }\n return Promise.resolve(false);\n },\n /**\n * Get the state for all tools with changes\n * @returns {Promise} resolves with the states\n */\n getStates: function getStates() {\n var self = this;\n return Promise.all(_.map(tools, function (toolName) {\n return self.getState(toolName).then(function (toolState) {\n //format the state to keep the tool identifier\n var formattedState = {};\n if (toolState) {\n formattedState[toolName] = toolState;\n return formattedState;\n }\n return false;\n });\n })).then(mergeCollection);\n }\n };\n }\n\n return toolStateBridgeFactory;\n\n});\n\n","define('taoQtiTest/runner/ui/toolbox/entry',['lodash', 'ui/component', 'handlebars', 'lib/handlebars/helpers'], function (_, componentFactory, Handlebars, Helpers0) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n componentFactory = componentFactory && Object.prototype.hasOwnProperty.call(componentFactory, 'default') ? componentFactory['default'] : componentFactory;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, functionType=\"function\", escapeExpression=this.escapeExpression, self=this;\n\n function program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \" \";\n if (helper = helpers.className) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.className); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1);\n return buffer;\n }\n\n function program3(depth0,data) {\n \n var buffer = \"\", stack1;\n buffer += \"\\n aria-\"\n + escapeExpression(((stack1 = (data == null || data === false ? data : data.key)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1))\n + \"=\\\"\"\n + escapeExpression((typeof depth0 === functionType ? depth0.apply(depth0) : depth0))\n + \"\\\"\\n \";\n return buffer;\n }\n\n function program5(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\";\n return buffer;\n }\n function program6(depth0,data) {\n \n \n return \" no-label\";\n }\n\n function program8(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\";\n if (helper = helpers.text) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.text); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\";\n return buffer;\n }\n\n buffer += \"\\n \\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.icon), {hash:{},inverse:self.noop,fn:self.program(5, program5, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.text), {hash:{},inverse:self.noop,fn:self.program(8, program8, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \\n\\n\";\n return buffer;\n });\n function entryTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017 (original work) Open Assessment Technologies SA;\n */\n var itemComponentApi = {\n /**\n * Initialise the item\n */\n initItem: function initItem() {\n this.id = this.config.control;\n this.menu = null;\n },\n /**\n * Get the type of the component\n */\n getType: function getType() {\n return 'entry';\n },\n /**\n * Get the item Id\n * @returns {String}\n */\n getId: function getId() {\n return this.id;\n },\n /**\n * Set the menu to whom the item belong\n * @param {String} menuId\n * @returns {String}\n */\n setMenuId: function setMenuId(menuId) {\n this.menuId = menuId;\n },\n /**\n * Get the id of the menu to whom the item belong\n * @returns {String}\n */\n getMenuId: function getMenuId() {\n return this.menuId;\n },\n /**\n * Set the item as active. For example, if it opens a tool,\n * the item should be represented 'on' as long as the tool remains opened\n */\n turnOn: function turnOn() {\n this.setState('active', true);\n const element = this.getElement();\n if (!element || element.attr('role') !== 'option') {\n // Not pretty bit quick\n return;\n }\n element.attr('aria-selected', 'true') // JAWS ignores aria-selected attribute\n .attr('aria-checked', 'true'); // NVDA not read aria-selected=\"true\"\n },\n\n /**\n * Set the item as inactive\n */\n turnOff: function turnOff() {\n this.setState('active', false);\n const element = this.getElement();\n if (!element || element.attr('role') !== 'option') {\n // Not pretty bit quick\n return;\n }\n element.attr('aria-selected', 'false') // NVDA + Chrome ignores aria-checked=\"false\"\n .attr('aria-checked', 'false');\n },\n /**\n * Set the item as hovered, whether by the mouse or by keyboard navigation\n */\n hoverOn: function hoverOn() {\n this.setState('hover', true);\n },\n /**\n * Turn off the hovered style\n */\n hoverOff: function hoverOff() {\n this.setState('hover', false);\n }\n };\n\n /**\n * The item factory\n */\n function itemComponentFactory(specs, defaults) {\n var itemComponent;\n specs = _.defaults(specs || {}, itemComponentApi);\n itemComponent = componentFactory(specs, defaults).setTemplate(entryTpl).on('enable', function () {\n if (this.is('rendered')) {\n this.$component.removeProp('disabled');\n }\n }).on('disable', function () {\n if (this.is('rendered')) {\n this.$component.prop('disabled', true);\n this.turnOff();\n }\n }).on('init', function () {\n this.initItem();\n }).on('render', function () {\n var self = this;\n this.disable(); // we always render disabled by default\n\n // forward DOM events to the component object\n this.$component.on('mousedown', function (event) {\n self.trigger('mousedown', event);\n }).on('click', function (event) {\n self.trigger('click', event);\n });\n });\n return itemComponent;\n }\n\n return itemComponentFactory;\n\n});\n\n","define('taoQtiTest/runner/ui/toolbox/menu',['jquery', 'lodash', 'ui/component', 'ui/hider', 'ui/stacker', 'handlebars', 'lib/handlebars/helpers'], function ($$1, _, componentFactory, hider, stackerFactory, Handlebars, Helpers0) { 'use strict';\n\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n componentFactory = componentFactory && Object.prototype.hasOwnProperty.call(componentFactory, 'default') ? componentFactory['default'] : componentFactory;\n hider = hider && Object.prototype.hasOwnProperty.call(hider, 'default') ? hider['default'] : hider;\n stackerFactory = stackerFactory && Object.prototype.hasOwnProperty.call(stackerFactory, 'default') ? stackerFactory['default'] : stackerFactory;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, functionType=\"function\", escapeExpression=this.escapeExpression, self=this;\n\n function program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \" \";\n if (helper = helpers.className) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.className); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1);\n return buffer;\n }\n\n function program3(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\";\n return buffer;\n }\n function program4(depth0,data) {\n \n \n return \" no-label\";\n }\n\n function program6(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\";\n if (helper = helpers.text) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.text); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\";\n return buffer;\n }\n\n buffer += \"\\n \\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.icon), {hash:{},inverse:self.noop,fn:self.program(3, program3, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.text), {hash:{},inverse:self.noop,fn:self.program(6, program6, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n   \\n \\n
      \\n \\n
      \\n\\n\";\n return buffer;\n });\n function menuTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template$1 = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, functionType=\"function\", escapeExpression=this.escapeExpression, self=this;\n\n function program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \" \";\n if (helper = helpers.className) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.className); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1);\n return buffer;\n }\n\n function program3(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\\n role=\\\"\";\n if (helper = helpers.role) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.role); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\\"\\n \";\n return buffer;\n }\n\n buffer += \"\\n \\n \\n \";\n if (helper = helpers.text) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.text); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\n \\n\";\n return buffer;\n });\n function menuItemTpl(data, options, asString) {\n var html = Template$1(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017-2020 (original work) Open Assessment Technologies SA;\n */\n var keyCodes = {\n TAB: 9,\n ESC: 27,\n ENTER: 13,\n SPACE: 32,\n LEFT: 37,\n UP: 38,\n RIGHT: 39,\n DOWN: 40\n };\n var stacker = stackerFactory('test-runner');\n var menuComponentApi = {\n /**\n * Initialise the menu\n */\n initMenu: function initMenu() {\n this.id = this.config.control;\n this.navType = this.config.navType ? this.config.navType : 'fromLast';\n this.menuItems = [];\n },\n /**\n * Get the type of the component\n */\n getType: function getType() {\n return 'menu';\n },\n /**\n * Get the menu Id\n * @returns {String}\n */\n getId: function getId() {\n return this.id;\n },\n /**\n * Set the menu as active, essentially meaning that the menu panel is opened\n */\n turnOn: function turnOn() {\n this.setState('active', true);\n },\n /**\n * Set the menu as inactive\n */\n turnOff: function turnOff() {\n this.setState('active', false);\n },\n /**\n * =====================\n * Actions on menu panel\n * =====================\n */\n\n /**\n * open/close the menu\n */\n toggleMenu: function showMenu() {\n if (!this.is('disabled')) {\n if (this.is('opened')) {\n this.closeMenu();\n } else {\n this.openMenu();\n }\n }\n },\n /**\n * It needs to find closest visible item.\n *\n * @param {Number} last - index to stop.\n * @param {-1|1} inc - incrementor. -1 - navigate to the top, 1 - to the bottom.\n *\n * @returns {Number} returns index > 0 if a visible item was found and -1 otherwise.\n */\n indexOfClosestVisibleItem(inc, last) {\n if (!this.menuItems.length) {\n return -1;\n }\n let elem;\n let position = this.hoverIndex;\n do {\n position += inc;\n if (position === last) {\n return -1;\n }\n elem = this.menuItems[position].getElement();\n } while (elem && elem.hasClass('hidden'));\n return position;\n },\n /**\n * Changes hoverIndex and hover item.\n *\n * @param {Number} index - item index to hover.\n *\n * @returns the menu item.\n */\n hoverByIndex(index) {\n const elem = this.menuItems[index];\n this.hoverIndex = index;\n if (elem) {\n this.hoverItem(elem.id);\n }\n return elem;\n },\n hoverNextVisibleItem() {\n const index = this.indexOfClosestVisibleItem(1, this.menuItems.length);\n const elem = this.hoverByIndex(index);\n return elem;\n },\n hoverPreviousVisibleItem() {\n const index = this.indexOfClosestVisibleItem(-1, -1);\n const elem = this.hoverByIndex(index);\n return elem;\n },\n /**\n * open the menu\n */\n openMenu: function openMenu() {\n // show the DOM element\n hider.show(this.$menuContainer);\n stacker.bringToFront(this.$menuContent);\n\n // change the menu button icon\n this.$menuStateIcon.removeClass('icon-up');\n this.$menuStateIcon.addClass('icon-down');\n\n // turn on the menu button\n this.turnOn();\n\n // setup keyboard navigation & highlighting\n this.enableShortcuts();\n this.hoverOffAll();\n if (document.activeElement) {\n document.activeElement.blur();\n }\n const activeItemIndex = _.findIndex(this.menuItems, item => item.is('active'));\n if (activeItemIndex >= 0) {\n this.hoverIndex = activeItemIndex;\n this.$menuItems[this.hoverIndex].focus();\n this.hoverItem(this.menuItems[activeItemIndex].id);\n } else if (this.navType === 'fromLast') {\n // fromLast (default) navigation: focus on button and then using UP go to last item\n this.hoverIndex = this.menuItems.length; // we start on the button, not at the max array index\n // which would be menuItems.length-1\n this.hoverPreviousVisibleItem();\n } else if (this.navType === 'fromFirst') {\n // fromFirst navigation: focus on button and then using DOWN go to first item\n this.hoverIndex = -1; // we start on the button, not the first element\n // which would be 0\n this.hoverNextVisibleItem();\n }\n\n // component inner state\n this.setState('opened', true);\n this.trigger('openmenu', this);\n },\n /**\n * close the menu\n */\n closeMenu() {\n // hide the DOM element\n hider.hide(this.$menuContainer);\n\n // change the menu button icon\n this.$menuStateIcon.removeClass('icon-down');\n this.$menuStateIcon.addClass('icon-up');\n\n // turn off the button\n this.turnOff();\n\n // disable keyboard navigation & highlighting\n this.disableShortcuts();\n this.hoverOffAll();\n\n // component inner state\n this.setState('opened', false);\n this.trigger('closemenu', this);\n\n // Move focus if the menu wasn't disabled before the close action was launched.\n if (!this.is('disabled') && !this.$component.prop('disabled')) {\n this.$menuButton.parent().focus(); // It needs for screenreaders to correctly read menu button after submenu was closed\n }\n },\n\n /**\n * =====================\n * Actions on menu items\n * =====================\n */\n\n /**\n * Look for a item in the internal item registry\n * @param {String} itemId\n * @returns {Object|undefined}\n */\n getItemById: function getItemById(itemId) {\n return _.find(this.menuItems, function (item) {\n return item.getId() === itemId;\n });\n },\n /**\n * Adds an item to the menu\n * @param {Component} item\n */\n addItem: function addItem(item) {\n if (item) {\n this.menuItems.push(item);\n }\n },\n /**\n * Render menu items into the menu panel\n */\n renderItems: function renderItems() {\n var self = this;\n this.menuItems.forEach(function (item) {\n item.setTemplate(menuItemTpl); // the item has been created as generic. Let's give him now the menu entry template\n item.render(self.$menuContent);\n item.enable();\n });\n\n // bind mouse behavior on menu items\n this.$menuItems = this.$menuContent.find('.menu-item');\n this.$menuItems.on('mouseenter', function highlightHoveredEntry(e) {\n var itemId = e.currentTarget.getAttribute('data-control');\n self.mouseOverItem(itemId);\n });\n },\n /**\n * Highlight the currently hovered item\n * @param {String} itemId\n */\n mouseOverItem: function mouseOverItem(itemId) {\n var self = this;\n\n // look for item index\n this.menuItems.forEach(function (item, index) {\n if (item.id === itemId) {\n self.hoverIndex = index;\n }\n });\n this.hoverItem(itemId);\n },\n /**\n * Check that the menu has at least one of its entries displayed\n * @returns {boolean}\n */\n hasDisplayedItems: function hasDisplayedItems() {\n return this.menuItems.some(function (item) {\n return !item.is('disabled') && !item.is('hidden');\n });\n },\n /**\n * Set all entries in the menu to inactive\n */\n turnOffAll: function turnOffAll() {\n this.menuItems.forEach(function (current) {\n current.turnOff();\n });\n },\n /**\n * =====================\n * Menu items navigation\n * =====================\n */\n\n /**\n * register the event handlers for keyboard navigation\n */\n enableShortcuts: function enableShortcuts() {\n var self = this;\n this.$menuContainer.on('keydown.menuNavigation', function (e) {\n var currentKeyCode = e.keyCode ? e.keyCode : e.charCode;\n e.preventDefault();\n switch (currentKeyCode) {\n case keyCodes.ESC:\n case keyCodes.TAB:\n self.closeMenu();\n break;\n case keyCodes.SPACE:\n case keyCodes.ENTER:\n self.triggerHighlightedItem();\n e.stopPropagation();\n break;\n case keyCodes.LEFT:\n case keyCodes.UP:\n self.moveUp();\n e.stopPropagation();\n break;\n case keyCodes.RIGHT:\n case keyCodes.DOWN:\n self.moveDown();\n e.stopPropagation();\n break;\n }\n });\n this.$menuButton.on('keydown.menuNavigation', function (e) {\n var currentKeyCode = e.keyCode ? e.keyCode : e.charCode;\n function setFocusToItem(index) {\n self.hoverIndex = index;\n self.$menuContainer.focus();\n self.hoverItem(self.menuItems[self.hoverIndex].id);\n }\n if (currentKeyCode === keyCodes.UP && self.navType === 'fromLast') {\n e.stopPropagation();\n setFocusToItem(self.menuItems.length - 1);\n }\n if (currentKeyCode === keyCodes.DOWN && self.navType === 'fromFirst') {\n e.stopPropagation();\n setFocusToItem(0);\n }\n });\n },\n /**\n * remove the event handlers for keyboard navigation\n */\n disableShortcuts: function disableShortcuts() {\n this.$menuContainer.off('.menuNavigation');\n this.$menuButton.off('.menuNavigation');\n },\n /**\n * Move the highlight to the previous not hidden item\n */\n moveUp: function moveUp() {\n if (this.hoverIndex > 0) {\n const elem = this.hoverPreviousVisibleItem();\n if (!elem) {\n this.closeMenu();\n }\n // move to the menu button\n } else if (this.hoverIndex === 0) {\n this.hoverIndex--;\n this.closeMenu();\n }\n },\n /**\n * Move the highlight to the next not hidden item, or to the menu button if we are on the last item\n */\n moveDown: function moveDown() {\n // move to the next item\n if (this.hoverIndex < this.menuItems.length - 1) {\n const elem = this.hoverNextVisibleItem();\n if (!elem) {\n this.closeMenu();\n }\n // move to the menu button\n } else if (this.hoverIndex === this.menuItems.length - 1) {\n this.hoverIndex++;\n this.closeMenu();\n }\n },\n /**\n * Highlight the given item\n * @param {String} itemId\n */\n hoverItem: function hoverItem(itemId) {\n var itemToHover = this.getItemById(itemId);\n this.hoverOffAll();\n if (itemToHover) {\n itemToHover.hoverOn();\n itemToHover.getElement().focus();\n }\n },\n /**\n * Remove highlight from all items\n */\n hoverOffAll: function hoverOffAll() {\n this.menuItems.forEach(function (current) {\n if (current) {\n current.hoverOff();\n }\n });\n },\n /**\n * Run a click event on the DOM element of the currently highlighted item\n */\n triggerHighlightedItem: function triggerHighlightedItem() {\n var activeItem;\n if (this.menuItems[this.hoverIndex]) {\n activeItem = this.menuItems[this.hoverIndex];\n activeItem.getElement().trigger('click');\n this.closeMenu();\n\n // give back the focus\n this.$component.focus();\n }\n },\n /**\n * Set navigation type\n * @param {String} type - 'fromLast', 'fromFirst'\n */\n setNavigationType: function setNavigationType(type) {\n if (['fromLast', 'fromFirst'].includes(type)) {\n this.navType = type;\n }\n }\n };\n\n /**\n * The menu component factory\n */\n function menuComponentFactory(specs, defaults) {\n var _defaults, menuComponent;\n _defaults = {\n $component: $$1(),\n $menuButton: $$1(),\n $menuContainer: $$1(),\n $menuContent: $$1(),\n $menuItems: $$1(),\n $menuStateIcon: $$1(),\n hoverIndex: null,\n id: null,\n menuItems: []\n };\n specs = _.defaults(specs || {}, menuComponentApi);\n menuComponent = componentFactory(specs, defaults).setTemplate(menuTpl).on('enable', function enable() {\n if (this.is('rendered')) {\n this.$component.removeProp('disabled');\n }\n }).on('disable', function disable() {\n if (this.is('rendered')) {\n this.$component.prop('disabled', true);\n this.closeMenu();\n this.turnOff();\n }\n }).on('hide', function disable() {\n if (this.is('rendered')) {\n this.closeMenu();\n }\n }).on('init', function init() {\n this.initMenu();\n }).on('render', function render() {\n var self = this;\n\n // get access to DOM elements\n this.$menuButton = this.$component.find(`[data-control=\"${this.config.control}-button\"]`);\n this.$menuContainer = this.$component.find(`[data-control=\"${this.config.control}-menu\"]`);\n this.$menuContent = this.$component.find(`[data-control=\"${this.config.control}-list\"]`);\n this.$menuStateIcon = this.$menuButton.find('.icon-up');\n this.disable(); // always render disabled by default\n\n // add behavior\n this.$component.on('click', function toggleMenu(e) {\n e.preventDefault();\n if (!self.is('opened')) {\n e.stopPropagation(); // prevent higher handler to auto-close the menu on click\n }\n\n self.toggleMenu();\n });\n this.$menuContainer.on('click', function closeMenuOnItemClick(e) {\n e.preventDefault();\n e.stopPropagation(); // so the menu doesn't get toggled again when the event bubble to the component\n self.closeMenu();\n });\n this.$menuContent.on('mouseleave', this.hoverOffAll);\n }).on('destroy', function () {\n if (this.is('rendered')) {\n this.$menuContainer.off('.menuNavigation');\n this.$menuButton.off('.menuNavigation');\n }\n });\n\n // Apply default properties to the menuComponent\n _.defaults(menuComponent, _defaults);\n return menuComponent;\n }\n\n return menuComponentFactory;\n\n});\n\n","define('taoQtiTest/runner/ui/toolbox/text',['lodash', 'ui/component', 'handlebars', 'lib/handlebars/helpers'], function (_, componentFactory, Handlebars, Helpers0) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n componentFactory = componentFactory && Object.prototype.hasOwnProperty.call(componentFactory, 'default') ? componentFactory['default'] : componentFactory;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, functionType=\"function\", escapeExpression=this.escapeExpression, self=this;\n\n function program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"class=\\\"\";\n if (helper = helpers.className) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.className); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\\"\\n \";\n return buffer;\n }\n\n function program3(depth0,data) {\n \n var buffer = \"\", stack1;\n buffer += \"\\n aria-\"\n + escapeExpression(((stack1 = (data == null || data === false ? data : data.key)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1))\n + \"=\\\"\"\n + escapeExpression((typeof depth0 === functionType ? depth0.apply(depth0) : depth0))\n + \"\\\"\\n \";\n return buffer;\n }\n\n buffer += \"\\n \";\n if (helper = helpers.text) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.text); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\n\\n\";\n return buffer;\n });\n function textTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017 (original work) Open Assessment Technologies SA;\n */\n var textComponentApi = {\n /**\n * Initialise text\n * @returns {String}\n */\n initText: function initText() {\n this.id = this.config.control;\n },\n /**\n * Get the type of the component\n */\n getType: function getType() {\n return 'text';\n },\n /**\n * Get the item Id\n * @returns {String}\n */\n getId: function getId() {\n return this.id;\n }\n };\n\n /**\n * The text factory\n */\n function textComponentFactory(specs, defaults) {\n var textComponent;\n specs = _.defaults(specs || {}, textComponentApi);\n textComponent = componentFactory(specs, defaults).setTemplate(textTpl).on('init', function () {\n this.initText();\n }).on('render', function () {\n this.disable(); // always render disabled first\n });\n\n return textComponent;\n }\n\n return textComponentFactory;\n\n});\n\n","define('taoQtiTest/runner/ui/toolbox/toolbox',['lodash', 'jquery', 'ui/component', 'taoQtiTest/runner/ui/toolbox/entry', 'taoQtiTest/runner/ui/toolbox/menu', 'taoQtiTest/runner/ui/toolbox/text', 'handlebars', 'lib/handlebars/helpers'], function (_, $$1, componentFactory, entryFactory, menuFactory, textFactory, Handlebars, Helpers0) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n componentFactory = componentFactory && Object.prototype.hasOwnProperty.call(componentFactory, 'default') ? componentFactory['default'] : componentFactory;\n entryFactory = entryFactory && Object.prototype.hasOwnProperty.call(entryFactory, 'default') ? entryFactory['default'] : entryFactory;\n menuFactory = menuFactory && Object.prototype.hasOwnProperty.call(menuFactory, 'default') ? menuFactory['default'] : menuFactory;\n textFactory = textFactory && Object.prototype.hasOwnProperty.call(textFactory, 'default') ? textFactory['default'] : textFactory;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); \n\n\n return \"
        \";\n });\n function toolboxTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017 (original work) Open Assessment Technologies SA;\n */\n var toolboxComponentApi = {\n /**\n * Initialize the toolbox\n */\n initToolbox: function initToolbox() {\n this.allItems = [];\n this.allMenus = [];\n },\n /**\n * Create a menu component instance\n * @param {Object} config\n * @param {String} config.control - will be used as the instance id and in the data-control html attribute\n * @param {String} config.title - will be used in the title html attribute\n * @param {String} config.icon - the icon for the button\n * @param {String} config.text - the button label\n * @param {String} config.className - an extra class\n * @returns {Component} the create instance\n */\n createMenu: function createMenu(config) {\n var self = this,\n menu = menuFactory().init(config);\n this.allItems.push(menu);\n this.allMenus.push(menu);\n\n // add an event handler to close all opened menu when opening\n menu.on('openmenu', function closeAllMenuExcept(openedMenu) {\n self.allMenus.forEach(function (current) {\n if (openedMenu.getId() !== current.getId() && current.is('opened')) {\n current.closeMenu();\n }\n });\n });\n return menu;\n },\n /**\n * Create a entry component instance\n * @param {Object} config\n * @param {String} config.control - will be used as the instance id and in the data-control html attribute\n * @param {String} config.title - will be used in the title html attribute\n * @param {String} config.icon - the icon for the button\n * @param {String} config.text - the button label\n * @param {String} config.className - an extra class\n * @returns {Component} the create instance\n */\n createEntry: function createEntry(config) {\n const extendedConfig = Object.assign({\n role: \"option\"\n }, config);\n const item = entryFactory().init(extendedConfig);\n this.allItems.push(item);\n return item;\n },\n /**\n * Create a text component instance\n * @param {Object} config\n * @param {String} config.control - will be used as the instance id and in the data-control html attribute\n * @param {String} config.text - the text content\n * @param {String} config.className - an extra class\n * @returns {Component} the create instance\n */\n createText: function createText(config) {\n var text = textFactory().init(config);\n this.allItems.push(text);\n return text;\n },\n /**\n * If the given item belongs to a menu\n * @param {Object} item\n * @returns {Boolean}\n */\n hasMenu: function hasMenu(item) {\n return item && _.isFunction(item.getMenuId) && item.getMenuId();\n }\n };\n\n /**\n * Default renderer. It simply appends all the registered items in the toolbox, one after the other\n * @param {jQuery} $container - where to render\n */\n function defaultRenderer($container) {\n var self = this,\n menuEntries = [];\n\n // render first level\n if (_.isArray(this.allItems)) {\n this.allItems.forEach(function (item) {\n // items belonging to menus will be processed later\n if (!self.hasMenu(item)) {\n item.render($container);\n }\n });\n }\n\n // Render each menu\n this.allMenus.forEach(function (menu) {\n var menuId = menu.getId();\n\n // first, we gather all items relevant to the current menu\n menuEntries = self.allItems.filter(function (item) {\n return item.getType() === 'entry' && item.getMenuId() === menuId;\n });\n\n // we then add entries to the current menu\n menuEntries.forEach(function (item) {\n menu.addItem(item);\n });\n\n // and finally render the whole menu\n menu.renderItems();\n });\n }\n\n /**\n * The toolbox factory\n */\n function toolboxComponentFactory(specs, defaults) {\n var $document = $$1(document),\n toolboxComponent;\n specs = _.defaults(specs || {}, toolboxComponentApi);\n toolboxComponent = componentFactory(specs, defaults).on('init', function () {\n this.initToolbox();\n })\n // overridable renderer\n .on('render.defaultRenderer', defaultRenderer)\n\n // non-overridable renderer\n .on('render', function () {\n var self = this;\n\n // fixme: try to bind this behavior on the blur event of each menu\n $document.off('.toolboxmenu');\n $document.on('click.toolboxmenu', function () {\n self.allMenus.forEach(function (menu) {\n if (menu.is('opened')) {\n menu.closeMenu();\n }\n });\n });\n }).on('destroy', function () {\n $document.off('.toolboxmenu');\n this.allItems.forEach(function (item) {\n item.destroy();\n });\n }).setTemplate(toolboxTpl);\n return toolboxComponent;\n }\n\n return toolboxComponentFactory;\n\n});\n\n","define('taoQtiTest/runner/provider/stopwatch',['core/eventifier', 'core/polling', 'core/timer'], function (eventifier, pollingFactory, timerFactory) { 'use strict';\n\n eventifier = eventifier && Object.prototype.hasOwnProperty.call(eventifier, 'default') ? eventifier['default'] : eventifier;\n pollingFactory = pollingFactory && Object.prototype.hasOwnProperty.call(pollingFactory, 'default') ? pollingFactory['default'] : pollingFactory;\n timerFactory = timerFactory && Object.prototype.hasOwnProperty.call(timerFactory, 'default') ? timerFactory['default'] : timerFactory;\n\n /*\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 (original work) Open Assessment Technologies SA\n *\n */\n const defaultOptions = {\n interval: 1000\n };\n\n /**\n * The stopwatch factory\n * @param {Object} options\n * @param {Number} [options.interval]\n * @returns {Object} stopwatch instance\n */\n function stopwatchFactory() {\n let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n const config = Object.assign({}, defaultOptions, options);\n let initialized = false;\n let polling;\n let stopwatch;\n return eventifier({\n /**\n * Is this instance initialized\n * @returns {Boolean}\n */\n isInitialized() {\n return initialized;\n },\n /**\n * Initialize stopwatch\n */\n init() {\n stopwatch = timerFactory({\n autoStart: false\n });\n\n /**\n * @fires tick - every time when interval is elapsed\n */\n polling = pollingFactory({\n action: () => this.trigger('tick', stopwatch.tick()),\n interval: config.interval,\n autoStart: false\n });\n initialized = true;\n },\n /**\n * Start stopwatch\n */\n start() {\n if (this.isInitialized()) {\n stopwatch.resume();\n polling.start();\n }\n },\n /**\n * Stop stopwatch\n */\n stop() {\n if (this.isInitialized()) {\n stopwatch.pause();\n polling.stop();\n }\n },\n /**\n * Destory stopwatch by stoping the timer\n */\n destroy() {\n if (this.isInitialized()) {\n initialized = false;\n polling.stop();\n polling = null;\n stopwatch.stop();\n stopwatch = null;\n }\n }\n });\n }\n\n return stopwatchFactory;\n\n});\n\n","define('taoQtiTest/runner/provider/qti',['jquery', 'lodash', 'i18n', 'core/cachedStore', 'util/browser', 'taoTests/runner/areaBroker', 'taoTests/runner/proxy', 'taoTests/runner/probeOverseer', 'taoTests/runner/testStore', 'taoQtiTest/runner/provider/dataUpdater', 'taoQtiTest/runner/provider/toolStateBridge', 'taoQtiTest/runner/helpers/currentItem', 'taoQtiTest/runner/helpers/map', 'taoQtiTest/runner/ui/toolbox/toolbox', 'taoQtiItem/runner/qtiItemRunner', 'taoQtiTest/runner/config/assetManager', 'handlebars', 'lib/handlebars/helpers', 'taoQtiTest/runner/config/states', 'taoQtiTest/runner/provider/stopwatch'], function ($$1, _, __, cachedStore, browser, areaBrokerFactory, proxyFactory, probeOverseerFactory, testStoreFactory, dataUpdater, toolStateBridgeFactory, currentItemHelper, mapHelper, toolboxFactory, qtiItemRunner, getAssetManager, Handlebars, Helpers0, states, stopwatchFactory) { 'use strict';\n\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n cachedStore = cachedStore && Object.prototype.hasOwnProperty.call(cachedStore, 'default') ? cachedStore['default'] : cachedStore;\n browser = browser && Object.prototype.hasOwnProperty.call(browser, 'default') ? browser['default'] : browser;\n areaBrokerFactory = areaBrokerFactory && Object.prototype.hasOwnProperty.call(areaBrokerFactory, 'default') ? areaBrokerFactory['default'] : areaBrokerFactory;\n proxyFactory = proxyFactory && Object.prototype.hasOwnProperty.call(proxyFactory, 'default') ? proxyFactory['default'] : proxyFactory;\n probeOverseerFactory = probeOverseerFactory && Object.prototype.hasOwnProperty.call(probeOverseerFactory, 'default') ? probeOverseerFactory['default'] : probeOverseerFactory;\n testStoreFactory = testStoreFactory && Object.prototype.hasOwnProperty.call(testStoreFactory, 'default') ? testStoreFactory['default'] : testStoreFactory;\n dataUpdater = dataUpdater && Object.prototype.hasOwnProperty.call(dataUpdater, 'default') ? dataUpdater['default'] : dataUpdater;\n toolStateBridgeFactory = toolStateBridgeFactory && Object.prototype.hasOwnProperty.call(toolStateBridgeFactory, 'default') ? toolStateBridgeFactory['default'] : toolStateBridgeFactory;\n currentItemHelper = currentItemHelper && Object.prototype.hasOwnProperty.call(currentItemHelper, 'default') ? currentItemHelper['default'] : currentItemHelper;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n toolboxFactory = toolboxFactory && Object.prototype.hasOwnProperty.call(toolboxFactory, 'default') ? toolboxFactory['default'] : toolboxFactory;\n qtiItemRunner = qtiItemRunner && Object.prototype.hasOwnProperty.call(qtiItemRunner, 'default') ? qtiItemRunner['default'] : qtiItemRunner;\n getAssetManager = getAssetManager && Object.prototype.hasOwnProperty.call(getAssetManager, 'default') ? getAssetManager['default'] : getAssetManager;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n states = states && Object.prototype.hasOwnProperty.call(states, 'default') ? states['default'] : states;\n stopwatchFactory = stopwatchFactory && Object.prototype.hasOwnProperty.call(stopwatchFactory, 'default') ? stopwatchFactory['default'] : stopwatchFactory;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", helper, options, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;\n\n\n buffer += \"
        \\n
        \\n
        \\n
        \\n\\n
        \\n\\n \\n\\n
        \\n

        \\n
        \\n
        \\n
        \\n\\n
        \\n
        \\n \\n \\n
        \\n
        \\n\\n
        \\n\";\n return buffer;\n });\n function layoutTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2021 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * A Test runner provider to be registered against the runner\n */\n var qtiProvider = {\n //provider name\n name: 'qti',\n /**\n * Initialize and load the area broker with a correct mapping\n * @returns {areaBroker}\n */\n loadAreaBroker: function loadAreaBroker() {\n var $layout = $$1(layoutTpl());\n return areaBrokerFactory($layout, {\n content: $$1('#qti-content', $layout),\n toolbox: $$1('.tools-box', $layout),\n navigation: $$1('.navi-box-list', $layout),\n mainLandmark: $$1('#test-title-header', $layout),\n control: $$1('.top-action-bar .control-box', $layout),\n actionsBar: $$1('.bottom-action-bar .control-box', $layout),\n panel: $$1('.test-sidebar-left', $layout),\n header: $$1('.title-box', $layout)\n });\n },\n /**\n * Initialize and load the test runner proxy\n * @returns {proxy}\n */\n loadProxy: function loadProxy() {\n var config = this.getConfig();\n var proxyProvider = config.provider.proxy || 'qtiServiceProxy';\n var proxyConfig = _.pick(config, ['testDefinition', 'testCompilation', 'serviceCallId', 'bootstrap', 'options']);\n return proxyFactory(proxyProvider, proxyConfig);\n },\n /**\n * Initialize and load the probe overseer\n * @returns {probeOverseer}\n */\n loadProbeOverseer: function loadProbeOverseer() {\n //the test run needs to be identified uniquely\n return probeOverseerFactory(this);\n },\n /**\n * Initialize and load the test store\n * @returns {testStore}\n */\n loadTestStore: function loadTestStore() {\n var config = this.getConfig();\n\n //the test run needs to be identified uniquely\n var identifier = config.serviceCallId || `test-${Date.now()}`;\n return testStoreFactory(identifier);\n },\n /**\n * Loads the persistent states storage\n *\n * @returns {Promise}\n */\n loadPersistentStates: function loadPersistentStates() {\n var self = this;\n var config = this.getConfig();\n var persistencePromise = cachedStore(`test-states-${config.serviceCallId}`, 'states');\n persistencePromise.catch(function (err) {\n self.trigger('error', err);\n });\n return persistencePromise.then(function (storage) {\n self.stateStorage = storage;\n });\n },\n /**\n * Checks a runner persistent state\n *\n * @param {String} name - the state name\n * @returns {Boolean} if active, false if not set\n */\n getPersistentState: function getPersistentState(name) {\n if (this.stateStorage) {\n return this.stateStorage.getItem(name);\n }\n },\n /**\n * Defines a runner persistent state\n *\n * @param {String} name - the state name\n * @param {Boolean} active - is the state active\n * @returns {Promise} Returns a promise that:\n * - will be resolved once the state is fully stored\n * - will be rejected if any error occurs or if the state name is not a valid string\n */\n setPersistentState: function setPersistentState(name, active) {\n var self = this;\n var setPromise;\n if (this.stateStorage) {\n setPromise = this.stateStorage.setItem(name, active);\n setPromise.catch(function (err) {\n self.trigger('error', err);\n });\n return setPromise;\n }\n },\n /**\n * Install step : install new methods/behavior\n *\n * @this {runner} the runner context, not the provider\n */\n install() {\n /**\n * Delegates the update of testMap, testContext and testData\n * to a 3rd part component, the dataUpdater.\n */\n this.dataUpdater = dataUpdater(this.getDataHolder());\n\n /**\n * The tool state bridge manages the state of the tools (plugins)\n * it updated directly the store of the plugins when configured to resume their values\n */\n this.toolStateBridge = toolStateBridgeFactory(this.getTestStore(), _.keys(this.getPlugins()));\n\n /**\n * Convenience function to load the current item from the testMap\n * @returns {Object?} the current item if any or falsy\n */\n this.getCurrentItem = function getCurrentItem() {\n const testContext = this.getTestContext();\n const testMap = this.getTestMap();\n if (testContext && testMap && testContext.itemIdentifier) {\n return mapHelper.getItem(testMap, testContext.itemIdentifier);\n }\n };\n\n /**\n * Convenience function to load the current section from the testMap\n * @returns {Object?} the current section if any or falsy\n */\n this.getCurrentSection = function getCurrentSection() {\n const testContext = this.getTestContext();\n const testMap = this.getTestMap();\n if (testContext && testMap && testContext.sectionId) {\n return mapHelper.getSection(testMap, testContext.sectionId);\n }\n };\n\n /**\n * Convenience function to load the current part from the testMap\n * @returns {Object?} the current part if any or falsy\n */\n this.getCurrentPart = function getCurrentPart() {\n const testContext = this.getTestContext();\n const testMap = this.getTestMap();\n if (testContext && testMap && testContext.testPartId) {\n return mapHelper.getPart(testMap, testContext.testPartId);\n }\n };\n },\n /**\n * Initialization of the provider, called during test runner init phase.\n *\n * We install behaviors during this phase (ie. even handlers)\n * and we call proxy.init.\n *\n * @this {runner} the runner context, not the provider\n * @returns {Promise} to chain proxy.init\n */\n init: function init() {\n const self = this;\n const config = this.getConfig();\n const areaBroker = this.getAreaBroker();\n\n /**\n * Retrieve the item results\n * @returns {Object} the results\n */\n function getItemResults() {\n var results = {};\n var context = self.getTestContext();\n if (context && self.itemRunner && context.itemSessionState <= states.itemSession.interacting) {\n results = {\n itemResponse: self.itemRunner.getResponses(),\n itemState: self.itemRunner.getState()\n };\n }\n return results;\n }\n\n /**\n * Compute the next item for the given action\n * @param {String} action - item action like move/next, skip, etc.\n * @param {Object} [params] - the item action additional params\n * @param {Promise} [loadPromise] - wait this Promise to resolve before loading the item.\n */\n function computeNext(action, params, loadPromise) {\n const context = self.getTestContext();\n const currentItem = self.getCurrentItem();\n const options = self.getOptions();\n const skipPausedAssessmentDialog = !!options.skipPausedAssessmentDialog;\n const {\n partiallyAnsweredIsAnswered\n } = options.review;\n\n //catch server errors\n var submitError = function submitError(err) {\n if (err && err.unrecoverable) {\n if (!skipPausedAssessmentDialog) {\n self.trigger('alert.error', __('An unrecoverable error occurred. Your test session will be paused.'));\n }\n self.trigger('pause', {\n message: err.message\n });\n } else if (err.code === 200) {\n //some server errors are valid, so we don't fail (prevent empty responses)\n self.trigger('alert.submitError', err.message || __('An error occurred during results submission. Please retry.'), load);\n } else {\n self.trigger('error', err);\n }\n };\n\n //if we have to display modal feedbacks, we submit the responses before the move\n const feedbackPromise = new Promise(resolve => {\n //@deprecated feedbacks from testContext\n if ((currentItem.hasFeedbacks || context.hasFeedbacks) && context.itemSessionState <= states.itemSession.interacting) {\n params = _.omit(params, ['itemState', 'itemResponse']);\n self.getProxy().submitItem(context.itemIdentifier, self.itemRunner.getState(), self.itemRunner.getResponses(), params).then(results => {\n if (results.itemSession) {\n currentItem.answered = results.itemSession.itemAnswered;\n if (results.displayFeedbacks === true && results.feedbacks) {\n self.itemRunner.renderFeedbacks(results.feedbacks, results.itemSession, function (queue) {\n self.trigger('modalFeedbacks', queue, resolve);\n });\n return;\n }\n }\n return resolve();\n }).catch(submitError);\n } else {\n if (action === 'skip') {\n currentItem.answered = false;\n } else {\n // when the test part is linear, the item is always answered as we cannot come back to it\n const testPart = self.getCurrentPart();\n const isLinear = testPart && testPart.isLinear;\n currentItem.answered = isLinear || currentItemHelper.isAnswered(self, partiallyAnsweredIsAnswered);\n }\n resolve();\n }\n });\n feedbackPromise.then(function () {\n return self.toolStateBridge.getStates();\n }).then(function (toolStates) {\n if (toolStates && _.size(toolStates) > 0) {\n params.toolStates = toolStates;\n }\n\n // ensure the answered state of the current item is correctly set and the stats are aligned\n self.setTestMap(self.dataUpdater.updateStats());\n\n //to be sure load start after unload...\n //we add an intermediate ns event on unload\n self.on(`unloaditem.${action}`, function () {\n self.off(`.${action}`);\n self.getProxy().callItemAction(context.itemIdentifier, action, params).then(function (results) {\n loadPromise = loadPromise || Promise.resolve();\n return loadPromise.then(function () {\n return results;\n });\n }).then(function (results) {\n //update testData, testContext and build testMap\n self.dataUpdater.update(results);\n load();\n }).catch(submitError);\n });\n self.unloadItem(context.itemIdentifier);\n }).catch(submitError);\n }\n\n /**\n * Load the next action: load the current item or call finish based the test state\n */\n function load() {\n var context = self.getTestContext();\n if (context.state <= states.testSession.interacting) {\n self.loadItem(context.itemIdentifier);\n } else if (context.state === states.testSession.closed) {\n self.finish();\n }\n }\n areaBroker.setComponent('toolbox', toolboxFactory());\n areaBroker.getToolbox().init();\n const stopwatch = stopwatchFactory({});\n stopwatch.init();\n stopwatch.spread(this, 'tick');\n const isTimerClientMode = () => config.options.timer && config.options.timer.restoreTimerFromClient;\n\n /*\n * Install behavior on events\n */\n this.on('ready', function () {\n //load the 1st item\n load();\n }).on('move', function (direction, scope, position) {\n // get the item results/state before disabling the tools\n // otherwise the state could be partially lost for tools that clean up when disabling\n var itemResults = getItemResults();\n this.trigger('disablenav disabletools');\n computeNext('move', _.merge(itemResults, {\n direction: direction,\n scope: scope || 'item',\n ref: position\n }));\n }).on('skip', function (scope) {\n this.trigger('disablenav disabletools');\n computeNext('skip', {\n scope: scope || 'item'\n });\n }).on('exit', function (reason) {\n var context = self.getTestContext();\n this.disableItem(context.itemIdentifier);\n this.getProxy().callTestAction('exitTest', _.merge(getItemResults(), {\n itemDefinition: context.itemIdentifier,\n reason: reason\n })).then(function () {\n return self.finish();\n }).catch(function (err) {\n self.trigger('error', err);\n });\n }).on('timeout', function (scope, ref, timer) {\n const context = self.getTestContext();\n const noAlertTimeout = mapHelper.hasItemCategory(self.getTestMap(), context.itemIdentifier, 'noAlertTimeout', true);\n context.isTimeout = true;\n this.setTestContext(context);\n if (timer && timer.allowLateSubmission) {\n self.trigger('alert.timeout', __('Time limit reached, this part of the test has ended. However you are allowed to finish the current item.'));\n self.before('move.latetimeout', function () {\n self.off('move.latetimeout');\n computeNext('timeout', _.merge(getItemResults(), {\n scope: scope,\n ref: ref,\n late: true\n }));\n return Promise.reject({\n cancel: true\n });\n });\n } else {\n this.disableItem(context.itemIdentifier);\n computeNext('timeout', _.merge(getItemResults(), {\n scope: scope,\n ref: ref\n }), new Promise(function (resolve) {\n if (noAlertTimeout) {\n resolve();\n } else {\n self.trigger('alert.timeout', __('The time limit has been reached for this part of the test.'), () => {\n self.trigger('timeoutAccepted');\n resolve();\n });\n }\n }));\n }\n }).on('pause', function (data) {\n const testContext = self.getTestContext();\n const options = self.getOptions();\n const skipPausedAssessmentDialog = !!options.skipPausedAssessmentDialog;\n this.setState('closedOrSuspended', true);\n const params = {\n itemDefinition: testContext.itemIdentifier,\n reason: {\n reasons: data && data.reasons,\n comment: data && (data.originalMessage || data.message)\n }\n };\n const itemState = self.itemRunner.getState();\n if (Object.keys(itemState).length) {\n params.itemState = itemState;\n }\n this.getProxy().callTestAction('pause', params).then(function () {\n self.trigger('leave', {\n code: states.testSession.suspended,\n message: data && data.message,\n skipExitMessage: skipPausedAssessmentDialog\n });\n }).catch(function (err) {\n self.trigger('error', err);\n });\n }).on('move skip exit timeout pause', function () {\n stopwatch.stop();\n }).on('loaditem', function () {\n var context = this.getTestContext();\n var warning = false;\n\n /**\n * Get the label of the current item\n * @returns {String} the label (fallback to the item identifier);\n */\n var getItemLabel = function getItemLabel() {\n const item = self.getCurrentItem();\n return item && item.label ? item.label : context.itemIdentifier;\n };\n\n //The item is rendered but in a state that prevents us from interacting\n if (context.isTimeout) {\n warning = __('Time limit reached for item \"%s\".', getItemLabel());\n } else if (context.itemSessionState > states.itemSession.interacting) {\n if (context.remainingAttempts === 0) {\n warning = __('No more attempts allowed for item \"%s\".', getItemLabel());\n } else {\n warning = __('Item \"%s\" is completed.', getItemLabel());\n }\n }\n\n //we disable the item and warn the user\n if (warning) {\n self.disableItem(context.itemIdentifier);\n self.trigger('warning', warning);\n }\n }).on('renderitem', function () {\n var context = this.getTestContext();\n if (!this.getItemState(context.itemIdentifier, 'disabled')) {\n this.trigger('enabletools');\n }\n this.trigger('enablenav');\n }).after('renderitem', function () {\n stopwatch.start();\n }).on('resumeitem', function () {\n this.trigger('enableitem enablenav');\n }).on('disableitem', function () {\n if (isTimerClientMode()) {\n stopwatch.stop();\n }\n this.trigger('disabletools');\n }).on('enableitem', function () {\n if (isTimerClientMode()) {\n stopwatch.start();\n }\n this.trigger('enabletools');\n }).on('error', function () {\n stopwatch.stop();\n this.trigger('disabletools enablenav');\n }).on('finish', function () {\n this.flush();\n }).on('leave', function () {\n this.trigger('endsession');\n this.flush();\n }).on('flush', function () {\n this.destroy();\n stopwatch.destroy();\n });\n\n //starts the event collection\n if (this.getProbeOverseer()) {\n this.getProbeOverseer().start();\n }\n\n //get the current store identifier to send it along with the init call\n return this.getTestStore().getStorageIdentifier().then(function (storeId) {\n //load data and current context in parallel at initialization\n return self.getProxy().init({\n storeId: storeId\n }).then(function (response) {\n //handle backward compatibility with testData\n if (response.testData) {\n Object.assign(config.options, response.testData.config);\n }\n\n //fill the dataHolder, build the jump table, etc.\n self.dataUpdater.update(response);\n\n //set the plugin config\n self.dataUpdater.updatePluginsConfig(self.getPlugins(), self.getPluginsConfig());\n\n //this checks the received storeId and clear the volatiles stores\n return self.getTestStore().clearVolatileIfStoreChange(response.lastStoreId).then(function () {\n return response;\n });\n }).then(function (response) {\n var isNewStore = !response.lastStoreId || response.lastStoreId !== storeId;\n if (response.toolStates && isNewStore) {\n return self.toolStateBridge.setTools(_.keys(response.toolStates)).restoreStates(response.toolStates);\n }\n });\n });\n },\n /**\n * Rendering phase of the test runner\n *\n * Attach the test runner to the DOM\n *\n * @this {runner} the runner context, not the provider\n */\n render: function render() {\n var config = this.getConfig();\n var areaBroker = this.getAreaBroker();\n config.renderTo.append(areaBroker.getContainer());\n areaBroker.getToolbox().render(areaBroker.getToolboxArea());\n },\n /**\n * LoadItem phase of the test runner\n *\n * We call the proxy in order to get the item data\n *\n * @this {runner} the runner context, not the provider\n * @param {String} itemIdentifier - The identifier of the item to update\n * @returns {Promise} that calls in parallel the state and the item data\n */\n loadItem: function loadItem(itemIdentifier) {\n return this.getProxy().getItem(itemIdentifier).then(_ref => {\n let {\n itemData,\n baseUrl,\n itemState,\n portableElements,\n flags\n } = _ref;\n return {\n content: itemData,\n baseUrl,\n state: itemState,\n portableElements,\n flags\n };\n });\n },\n /**\n * RenderItem phase of the test runner\n *\n * Here we initialize the item runner and wrap it's call to the test runner\n *\n * @this {runner} the runner context, not the provider\n * @param {String} itemIdentifier - The identifier of the item to update\n * @param {Object} itemData - The definition data of the item\n * @returns {Promise} resolves when the item is ready\n */\n renderItem: function renderItem(itemIdentifier, itemData) {\n var self = this;\n var config = this.getConfig();\n var assetManager = getAssetManager(config.serviceCallId);\n var changeState = function changeState() {\n self.setItemState(itemIdentifier, 'changed', true);\n };\n return new Promise(function (resolve, reject) {\n assetManager.setData('baseUrl', itemData.baseUrl);\n assetManager.setData('itemIdentifier', itemIdentifier);\n assetManager.setData('assets', itemData.content.assets);\n itemData.content = itemData.content || {};\n self.itemRunner = qtiItemRunner(itemData.content.type, itemData.content.data, {\n assetManager: assetManager\n }).on('error', function (err) {\n if (err && err.unrecoverable) {\n self.trigger('pause', {\n message: err.message\n });\n } else {\n self.trigger('enablenav');\n reject(err);\n }\n }).on('init', function () {\n var itemContainer = self.getAreaBroker().getContentArea();\n var itemRenderingOptions = _.pick(itemData, ['state', 'portableElements']);\n this.render(itemContainer, itemRenderingOptions);\n }).on('render', function () {\n this.on('responsechange', changeState);\n this.on('statechange', changeState);\n resolve();\n }).after('render', function () {\n //iOS only fix: sometimes the wrapper is not scrollable because of some bugs in Safari iOS\n //we have to force it to reconsider if the scroll needs to apply\n if (browser.isIOs()) {\n const wrapperElt = self.getAreaBroker().getContainer().find('.content-wrapper').get(0);\n if (wrapperElt) {\n wrapperElt.style.overflow = 'hidden';\n setTimeout(() => wrapperElt.style.overflow = 'auto', 0);\n }\n }\n }).on('warning', function (err) {\n self.trigger('warning', err);\n }).init();\n });\n },\n /**\n * UnloadItem phase of the test runner\n *\n * Item clean up\n *\n * @this {runner} the runner context, not the provider\n * @returns {Promise} resolves when the item is cleared\n */\n unloadItem: function unloadItem() {\n var self = this;\n self.trigger('beforeunloaditem disablenav disabletools');\n return new Promise(function (resolve) {\n if (self.itemRunner) {\n self.itemRunner.on('clear', resolve).clear();\n return;\n }\n resolve();\n });\n },\n /**\n * Finish phase of the test runner\n *\n * Calls proxy.finish to close the test\n *\n * @this {runner} the runner context, not the provider\n * @returns {Promise} proxy.finish\n */\n finish: function finish() {\n if (!this.getState('finish')) {\n this.trigger('disablenav disabletools');\n if (this.stateStorage) {\n return this.stateStorage.removeStore();\n }\n }\n },\n /**\n * Flushes the test variables before leaving the runner\n *\n * Clean up\n *\n * @this {runner} the runner context, not the provider\n * @returns {Promise}\n */\n flush: function flush() {\n var self = this;\n var probeOverseer = this.getProbeOverseer();\n var proxy = this.getProxy();\n var flushPromise;\n\n //if there is trace data collected by the probes\n if (probeOverseer && !this.getState('disconnected')) {\n flushPromise = probeOverseer.flush().then(function (data) {\n var traceData = {};\n\n //we reformat the time set into a trace variables\n if (data && data.length) {\n _.forEach(data, function (entry) {\n var id = `${entry.type}-${entry.id}`;\n if (entry.marker) {\n id = `${entry.marker}-${id}`;\n }\n traceData[id] = entry;\n });\n //and send them\n return self.getProxy().sendVariables(traceData);\n }\n }).then(function () {\n probeOverseer.stop();\n }).catch(function () {\n probeOverseer.stop();\n });\n } else {\n flushPromise = Promise.resolve();\n }\n return flushPromise.then(function () {\n // safely stop the communicator to prevent inconsistent communication while leaving\n if (proxy.hasCommunicator()) {\n proxy.getCommunicator().then(function (communicator) {\n return communicator.close();\n })\n // Silently catch the potential errors to avoid polluting the console.\n // The code above is present to close an already open communicator in order to avoid later\n // communication while the test is destroying. So if any error occurs here it is not very important,\n // the most time it will be a missing communicator error, due to disabled config.\n .catch(_.noop);\n }\n });\n },\n /**\n * Destroy phase of the test runner\n *\n * Clean up\n *\n * @this {runner} the runner context, not the provider\n * @returns void\n */\n destroy: function destroy() {\n var areaBroker = this.getAreaBroker();\n\n // prevent the item to be displayed while test runner is destroying\n if (this.itemRunner) {\n this.itemRunner.clear();\n }\n this.itemRunner = null;\n if (areaBroker) {\n areaBroker.getToolbox().destroy();\n }\n\n //we remove the store(s) only if the finish step was reached\n if (this.getState('finish')) {\n return this.getTestStore().remove();\n }\n }\n };\n\n return qtiProvider;\n\n});\n\n","define('taoQtiTest/runner/proxy/cache/actionStore',['lodash', 'taoTests/runner/testStore'], function (_, testStore) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n testStore = testStore && Object.prototype.hasOwnProperty.call(testStore, 'default') ? testStore['default'] : testStore;\n\n /*\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017 Open Assessment Technologies SA\n */\n var storeName = 'actions';\n var storeKey = 'queue';\n\n /**\n * Create an action store\n *\n * @param {String} id - the store id, to identify a test\n * @returns {actionStore}\n */\n function actionStoreFatory(id) {\n var actionQueue = [];\n\n /**\n * Load the store from the testStore\n * @returns {Promise} the storage instance\n */\n var loadStore = function loadStore() {\n return testStore(id).getStore(storeName);\n };\n if (_.isEmpty(id)) {\n throw new TypeError('Please specify the action store id');\n }\n\n /**\n * @typedef {actionStore}\n */\n return {\n /**\n * Push an action to the store\n * @param {String} action - the action name\n * @param {Object} params - the action parameters\n * @returns {Promise} resolves when the action is stored\n */\n push: function push(action, params, timestamp) {\n actionQueue.push({\n action: action,\n timestamp: timestamp || Date.now(),\n parameters: params\n });\n return loadStore().then(function (actionStore) {\n return actionStore.setItem(storeKey, actionQueue);\n });\n },\n /**\n * Flush the action store and retrieve the data\n * @returns {Promise} resolves with the flushed data\n */\n flush: function flush() {\n return loadStore().then(function (actionStore) {\n return actionStore.getItem(storeKey).then(function (queue) {\n actionQueue = [];\n return actionStore.setItem(storeKey, actionQueue).then(function () {\n return queue;\n });\n });\n });\n },\n /**\n * Update action parameters. Action to update will be defined by params.actionId parameter value.\n * @param {Object} params - the action parameters\n * @returns {Promise} resolves when the action is stored\n */\n update: function update(params) {\n _.forEach(actionQueue, function (action) {\n if (action.parameters.actionId === params.actionId) {\n action.parameters = params;\n }\n });\n return loadStore().then(function (actionStore) {\n return actionStore.setItem(storeKey, actionQueue);\n });\n }\n };\n }\n\n return actionStoreFatory;\n\n});\n\n","define('taoQtiTest/runner/proxy/cache/preloaders/assets/audio',['lodash'], function (_) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n\n /*\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017-2021 Open Assessment Technologies SA\n */\n\n /**\n * (Pre)load audio content.\n *\n * @author Bertrand Chevrier \n */\n var audio = {\n /**\n * The name of the preloader\n * @type {string}\n */\n name: 'audio',\n /**\n * Manages the preloading of audio files\n * @param assetManager - A reference to the assetManager\n * @returns {assetPreloader}\n */\n init(assetManager) {\n //keep references to preloaded audio blobs\n const audioBlobs = {};\n\n //prepend a strategy to resolves cached assets\n assetManager.prependStrategy({\n name: 'precaching-audio',\n handle(url, data) {\n const sourceUrl = url.toString();\n\n //resolves precached audio files\n if (data.itemIdentifier && audioBlobs[data.itemIdentifier] && 'undefined' !== typeof audioBlobs[data.itemIdentifier][sourceUrl]) {\n //creates an internal URL to link the audio blob\n return URL.createObjectURL(audioBlobs[data.itemIdentifier][sourceUrl]);\n }\n }\n });\n return {\n /**\n * Tells whether an audio file was preloaded or not\n * @param {string} url - the url of the audio file to preload\n * @param {string} sourceUrl - the unresolved URL (used to index)\n * @param {string} itemIdentifier - the id of the item the asset belongs to\n * @returns {boolean}\n */\n loaded(url, sourceUrl, itemIdentifier) {\n return !!(audioBlobs[itemIdentifier] && audioBlobs[itemIdentifier][sourceUrl]);\n },\n /**\n * Preloads audio files : save the blobs for later use in the asset manager\n * @param {string} url - the url of the audio file to preload\n * @param {string} sourceUrl - the unresolved URL (used to index)\n * @param {string} itemIdentifier - the id of the item the asset belongs to\n * @returns {Promise}\n */\n load(url, sourceUrl, itemIdentifier) {\n return new Promise(resolve => {\n audioBlobs[itemIdentifier] = audioBlobs[itemIdentifier] || {};\n if ('undefined' === typeof audioBlobs[itemIdentifier][sourceUrl]) {\n //direct XHR to benefit from the \"blob\" response type\n const request = new XMLHttpRequest();\n request.open('GET', url, true);\n request.responseType = 'blob';\n request.onerror = resolve;\n request.onabort = resolve;\n request.onload = () => {\n if (request.status === 200) {\n //save the blob, directly\n audioBlobs[itemIdentifier][sourceUrl] = request.response;\n }\n resolve();\n };\n //ignore failed requests, best effort only\n request.send();\n } else {\n resolve();\n }\n });\n },\n /**\n * Removes loaded audio files\n * @param {string} url - the url of the audio file to unload\n * @param {string} sourceUrl - the unresolved URL\n * @param {string} itemIdentifier - the id of the item the asset belongs to\n * @returns {Promise}\n */\n unload(url, sourceUrl, itemIdentifier) {\n if (audioBlobs[itemIdentifier]) {\n audioBlobs[itemIdentifier] = _.omit(audioBlobs[itemIdentifier], sourceUrl);\n }\n return Promise.resolve();\n }\n };\n }\n };\n\n return audio;\n\n});\n\n","define('taoQtiTest/runner/proxy/cache/preloaders/assets/image',['lodash'], function (_) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n\n /*\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017-2021 Open Assessment Technologies SA\n */\n\n /**\n * (Pre)load images.\n *\n * @author Bertrand Chevrier \n */\n var image = {\n /**\n * The name of the preloader\n * @type {string}\n */\n name: 'img',\n /**\n * Manages the preloading of images\n * @returns {assetPreloader}\n */\n init() {\n //keep references to preloaded images attached\n //in order to prevent garbage collection of cached images\n const images = {};\n return {\n /**\n * Tells whether an image was preloaded or not\n * @param {string} url - the url of the image to preload\n * @param {string} sourceUrl - the unresolved URL (used to index)\n * @param {string} itemIdentifier - the id of the item the asset belongs to\n * @returns {boolean}\n */\n loaded(url, sourceUrl, itemIdentifier) {\n return !!(images[itemIdentifier] && images[itemIdentifier][sourceUrl]);\n },\n /**\n * Preloads an image, using the in memory Image object\n * @param {string} url - the url of the image to preload\n * @param {string} sourceUrl - the unresolved URL (used to index)\n * @param {string} itemIdentifier - the id of the item the asset belongs to\n * @returns {Promise}\n */\n load(url, sourceUrl, itemIdentifier) {\n images[itemIdentifier] = images[itemIdentifier] || {};\n if ('Image' in window && !images[itemIdentifier][sourceUrl]) {\n images[itemIdentifier][sourceUrl] = new Image();\n images[itemIdentifier][sourceUrl].src = url;\n }\n return Promise.resolve();\n },\n /**\n * Removes images ref so they can be garbage collected\n * @param {string} url - the url of the image to unload\n * @param {string} sourceUrl - the unresolved URL (used to index)\n * @param {string} itemIdentifier - the id of the item the asset belongs to\n * @returns {Promise}\n */\n unload(url, sourceUrl, itemIdentifier) {\n if (images[itemIdentifier]) {\n images[itemIdentifier] = _.omit(images[itemIdentifier], sourceUrl);\n }\n return Promise.resolve();\n }\n };\n }\n };\n\n return image;\n\n});\n\n","define('taoQtiTest/runner/proxy/cache/preloaders/assets/stylesheet',['lodash'], function (_) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n\n /*\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017-2021 Open Assessment Technologies SA\n */\n\n /**\n * Test the support of possible `` values.\n * @param {string} feature - the value to test\n * @returns {boolean}\n * @private\n */\n const relSupport = feature => {\n const fakeLink = document.createElement('link');\n try {\n if (fakeLink.relList && 'function' === typeof fakeLink.relList.supports) {\n return fakeLink.relList.supports(feature);\n }\n } catch (err) {\n return false;\n }\n };\n\n /**\n * Does the current env supports ``\n * @type {boolean}\n * @private\n */\n const supportPreload = relSupport('preload');\n\n /**\n * Does the current env supports ``\n * @type {boolean}\n * @private\n */\n const supportPrefetch = relSupport('prefetch');\n\n /**\n * (Pre)load stylesheets.\n *\n * @author Bertrand Chevrier \n */\n var stylesheet = {\n /**\n * The name of the preloader\n * @type {string}\n */\n name: 'css',\n /**\n * Manages the preloading of stylesheets\n * @returns {assetPreloader}\n */\n init() {\n //keep references to preloaded CSS files\n const stylesheets = {};\n return {\n /**\n * Tells whether a stylesheet was preloaded or not\n * @param {string} url - the url of the stylesheet to preload\n * @param {string} sourceUrl - the unresolved URL (used to index)\n * @param {string} itemIdentifier - the id of the item the asset belongs to\n * @returns {boolean}\n */\n loaded(url, sourceUrl, itemIdentifier) {\n return !!(stylesheets[itemIdentifier] && stylesheets[itemIdentifier][sourceUrl]);\n },\n /**\n * Preloads a stylesheet\n * @param {string} url - the url of the stylesheet to preload\n * @param {string} sourceUrl - the unresolved URL (used to index)\n * @param {string} itemIdentifier - the id of the item the asset belongs to\n * @returns {Promise}\n */\n load(url, sourceUrl, itemIdentifier) {\n stylesheets[itemIdentifier] = stylesheets[itemIdentifier] || {};\n if (!stylesheets[itemIdentifier][sourceUrl]) {\n const link = document.createElement('link');\n if (supportPreload) {\n link.setAttribute('rel', 'preload');\n link.setAttribute('as', 'style');\n } else if (supportPrefetch) {\n link.setAttribute('rel', 'prefetch');\n link.setAttribute('as', 'style');\n } else {\n link.disabled = true;\n link.setAttribute('rel', 'stylesheet');\n link.setAttribute('type', 'text/css');\n }\n link.setAttribute('data-preload', true);\n link.setAttribute('href', url);\n document.querySelector('head').appendChild(link);\n stylesheets[itemIdentifier][sourceUrl] = link;\n }\n return Promise.resolve();\n },\n /**\n * Removes the prefetched stylesheet\n * @param {string} url - the url of the stylesheet to unload\n * * @param {string} sourceUrl - the unresolved URL (used to index)\n * @param {string} itemIdentifier - the id of the item the asset belongs to\n * @returns {Promise}\n */\n unload(url, sourceUrl, itemIdentifier) {\n if (stylesheets[itemIdentifier]) {\n const link = stylesheets[itemIdentifier][sourceUrl] || document.querySelector(`head link[data-preload][href=\"${url}\"]`);\n if (link) {\n document.querySelector('head').removeChild(link);\n }\n stylesheets[itemIdentifier] = _.omit(stylesheets[itemIdentifier], sourceUrl);\n }\n return Promise.resolve();\n }\n };\n }\n };\n\n return stylesheet;\n\n});\n\n","define('taoQtiTest/runner/proxy/cache/preloaders/assets/preloaders',['taoQtiTest/runner/proxy/cache/preloaders/assets/audio', 'taoQtiTest/runner/proxy/cache/preloaders/assets/image', 'taoQtiTest/runner/proxy/cache/preloaders/assets/stylesheet'], function (audioPreloader, imagePreloader, stylesheetPreloader) { 'use strict';\n\n\taudioPreloader = audioPreloader && Object.prototype.hasOwnProperty.call(audioPreloader, 'default') ? audioPreloader['default'] : audioPreloader;\n\timagePreloader = imagePreloader && Object.prototype.hasOwnProperty.call(imagePreloader, 'default') ? imagePreloader['default'] : imagePreloader;\n\tstylesheetPreloader = stylesheetPreloader && Object.prototype.hasOwnProperty.call(stylesheetPreloader, 'default') ? stylesheetPreloader['default'] : stylesheetPreloader;\n\n\t/*\n\t * This program is free software; you can redistribute it and/or\n\t * modify it under the terms of the GNU General Public License\n\t * as published by the Free Software Foundation; under version 2\n\t * of the License (non-upgradable).\n\t *\n\t * This program is distributed in the hope that it will be useful,\n\t * but WITHOUT ANY WARRANTY; without even the implied warranty of\n\t * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\t * GNU General Public License for more details.\n\t *\n\t * You should have received a copy of the GNU General Public License\n\t * along with this program; if not, write to the Free Software\n\t * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n\t *\n\t * Copyright (c) 2021 Open Assessment Technologies SA\n\t */\n\n\t/**\n\t * The list of asset loader factories\n\t * @type {Function[]}\n\t */\n\tvar preloaders = [audioPreloader, imagePreloader, stylesheetPreloader];\n\n\treturn preloaders;\n\n});\n\n","define('taoQtiTest/runner/proxy/cache/preloaderManager',['core/providerRegistry'], function (providerRegistry) { 'use strict';\n\n providerRegistry = providerRegistry && Object.prototype.hasOwnProperty.call(providerRegistry, 'default') ? providerRegistry['default'] : providerRegistry;\n\n /*\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2021 Open Assessment Technologies SA\n */\n\n /**\n * @typedef {object} preloaderManager\n * @property {Function} has - Tells whether an asset is loaded or not\n * @property {preloaderManagerAction} loaded - Tells whether an asset is loaded or not\n * @property {preloaderManagerAction} load - Preload an asset\n * @property {preloaderManagerAction} unload - Unload an asset\n */\n\n /**\n * @callback preloaderManagerAction\n * @param {string} name - The type of asset to preload\n * @param {...any} args - The list of args related to the preloader.\n * @returns {any}\n */\n\n /**\n * Creates a preloader manager.\n * @return {Function}\n */\n function preloaderManagerFactory() {\n /**\n * Manages the preloading of assets\n * @param assetManager - A reference to the assetManager\n * @return {preloaderManager}\n */\n function preloaderFactory(assetManager) {\n const preloaders = {};\n preloaderFactory.getAvailableProviders().forEach(name => {\n preloaders[name] = preloaderFactory.getProvider(name).init(assetManager);\n });\n\n /**\n * @typedef preloaderManager\n */\n return {\n /**\n * Checks whether or not an asset preloader exists for a particular type\n * @param {string} name\n * @returns {boolean}\n */\n has(name) {\n return !!preloaders[name];\n },\n /**\n * Tells whether an asset was preloaded or not\n * @param {string} name - The type of asset to preload\n * @param {...any} args - The list of args related to the preloader.\n * @returns {boolean}\n */\n loaded(name) {\n const preloader = preloaders[name];\n if (preloader && 'function' === typeof preloader.loaded) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return !!preloader.loaded(...args);\n }\n return false;\n },\n /**\n * Preloads an asset with respect to it type\n * @param {string} name - The type of asset to preload\n * @param {...any} args - The list of args related to the preloader.\n * @returns {Promise}\n */\n load(name) {\n const preloader = preloaders[name];\n if (preloader && 'function' === typeof preloader.load) {\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n return Promise.resolve(preloader.load(...args));\n }\n return Promise.resolve();\n },\n /**\n * Unloads an asset with respect to it type\n * @param {string} name - The type of asset to unload\n * @param {...any} args - The list of args related to the preloader.\n * @returns {Promise}\n */\n unload(name) {\n const preloader = preloaders[name];\n if (preloader && 'function' === typeof preloader.unload) {\n for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {\n args[_key3 - 1] = arguments[_key3];\n }\n return Promise.resolve(preloader.unload(...args));\n }\n return Promise.resolve();\n }\n };\n }\n return providerRegistry(preloaderFactory);\n }\n\n return preloaderManagerFactory;\n\n});\n\n","define('taoQtiTest/runner/proxy/cache/assetPreloader',['taoQtiTest/runner/proxy/cache/preloaders/assets/preloaders', 'taoQtiTest/runner/proxy/cache/preloaderManager'], function (preloaders, preloaderManagerFactory) { 'use strict';\n\n\tpreloaders = preloaders && Object.prototype.hasOwnProperty.call(preloaders, 'default') ? preloaders['default'] : preloaders;\n\tpreloaderManagerFactory = preloaderManagerFactory && Object.prototype.hasOwnProperty.call(preloaderManagerFactory, 'default') ? preloaderManagerFactory['default'] : preloaderManagerFactory;\n\n\t/*\n\t * This program is free software; you can redistribute it and/or\n\t * modify it under the terms of the GNU General Public License\n\t * as published by the Free Software Foundation; under version 2\n\t * of the License (non-upgradable).\n\t *\n\t * This program is distributed in the hope that it will be useful,\n\t * but WITHOUT ANY WARRANTY; without even the implied warranty of\n\t * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\t * GNU General Public License for more details.\n\t *\n\t * You should have received a copy of the GNU General Public License\n\t * along with this program; if not, write to the Free Software\n\t * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n\t *\n\t * Copyright (c) 2021 Open Assessment Technologies SA\n\t */\n\n\t/**\n\t * @callback assetPreloaderManagerAction\n\t * @param {string} type - The type of asset to preload\n\t * @param {string} url - the url of the asset to load/unload\n\t * @param {string} [sourceUrl] - the unresolved URL (used to index)\n\t * @param {string} [itemIdentifier] - the id of the item the asset belongs to\n\t */\n\n\t/**\n\t * @callback assetPreloaderAction\n\t * @param {string} url - the url of the asset to load/unload\n\t * @param {string} [sourceUrl] - the unresolved URL (used to index)\n\t * @param {string} [itemIdentifier] - the id of the item the asset belongs to\n\t */\n\n\t/**\n\t * @typedef {object} assetPreloaderManager\n\t * @property {string} name - The name of the preloader\n\t * @property {assetPreloaderManagerAction} loaded - Tells whether an asset is loaded or not\n\t * @property {assetPreloaderManagerAction} load - Preload an asset\n\t * @property {assetPreloaderManagerAction} unload - Unload an asset\n\t */\n\n\t/**\n\t * @typedef {object} assetPreloader\n\t * @property {string} name - The name of the preloader\n\t * @property {assetPreloaderAction} loaded - Tells whether an asset is loaded or not\n\t * @property {assetPreloaderAction} load - Preload an asset\n\t * @property {assetPreloaderAction} unload - Unload an asset\n\t */\n\n\t/**\n\t * Manages the preloading of assets\n\t * @function assetPreloaderFactory\n\t * @param assetManager - A reference to the assetManager\n\t * @return {assetPreloaderManager}\n\t */\n\tconst assetPreloaderFactory = preloaderManagerFactory();\n\tpreloaders.forEach(preloader => assetPreloaderFactory.registerProvider(preloader.name, preloader));\n\n\treturn assetPreloaderFactory;\n\n});\n\n","define('taoQtiTest/runner/proxy/cache/preloaders/interactions/extendedText',['ckeditor', 'taoQtiItem/qtiCommonRenderer/helpers/ckConfigurator'], function (ckEditor, ckConfigurator) { 'use strict';\n\n ckEditor = ckEditor && Object.prototype.hasOwnProperty.call(ckEditor, 'default') ? ckEditor['default'] : ckEditor;\n ckConfigurator = ckConfigurator && Object.prototype.hasOwnProperty.call(ckConfigurator, 'default') ? ckConfigurator['default'] : ckConfigurator;\n\n /*\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2021 Open Assessment Technologies SA\n */\n\n /**\n * Preloads CKEditor runtimes for a particular language\n * @param {string} language\n * @returns {Promise}\n */\n function preloadCKEditor(language) {\n return new Promise(resolve => {\n const placeholder = document.createElement('div');\n const ckOptions = {\n resize_enabled: true,\n secure: location.protocol === 'https:',\n forceCustomDomain: true,\n language\n };\n const editor = ckEditor.inline(placeholder, ckOptions);\n editor.on('instanceReady', () => {\n resolve(editor);\n });\n editor.on('configLoaded', () => {\n editor.config = ckConfigurator.getConfig(editor, 'extendedText', ckOptions);\n });\n if (editor.status === 'ready' || editor.status === 'loaded') {\n resolve(editor);\n }\n }).then(editor => {\n editor.destroy();\n });\n }\n\n /**\n * The default item language\n * @type {string}\n * @private\n */\n const defaultLang = 'en';\n\n /**\n * Gets the item's language\n * @param {object} itemData - The item data\n * @returns {string}\n * @private\n */\n const getItemLanguage = itemData => {\n let lang = itemData && itemData.data && itemData.data.attributes && itemData.data.attributes['xml:lang'];\n if (!lang) {\n lang = window.document.documentElement.getAttribute('lang');\n }\n return lang && lang.split('-')[0] || defaultLang;\n };\n\n /**\n * Preloads the runtimes for an extendedText interaction\n */\n var extendedText = {\n /**\n * The name of the preloader\n * @type {string}\n */\n name: 'extendedTextInteraction',\n /**\n * Manages the preloading of the extendedText interaction runtimes\n * @returns {interactionPreloader}\n */\n init() {\n const preloadedLanguages = {};\n return {\n /**\n * Tells whether the runtimes has been preloaded or not\n * @param {object} interaction - The interaction\n * @param {object} itemData - The item data\n * @param {string} itemIdentifier - the id of the item the interaction belongs to\n * @returns {boolean}\n */\n // eslint-disable-next-line no-unused-vars\n loaded(interaction, itemData, itemIdentifier) {\n if (interaction.attributes && interaction.attributes.format === 'xhtml') {\n const lang = getItemLanguage(itemData);\n return preloadedLanguages[lang];\n }\n return true;\n },\n /**\n * Preloads runtimes for an extendedText interaction\n * @param {object} interaction - The interaction\n * @param {object} itemData - The item data\n * @param {string} itemIdentifier - the id of the item the interaction belongs to\n * @returns {Promise}\n */\n // eslint-disable-next-line no-unused-vars\n load(interaction, itemData, itemIdentifier) {\n if (interaction.attributes && interaction.attributes.format === 'xhtml') {\n const lang = getItemLanguage(itemData);\n if (!preloadedLanguages[lang]) {\n preloadedLanguages[lang] = true;\n return preloadCKEditor(lang);\n }\n }\n return Promise.resolve();\n },\n /**\n * Unloads runtimes for an extendedText interaction\n * @param {object} interaction - The interaction\n * @param {object} itemData - The item data\n * @param {string} itemIdentifier - the id of the item the interaction belongs to\n * @returns {Promise}\n */\n // eslint-disable-next-line no-unused-vars\n unload(interaction, itemData, itemIdentifier) {\n // nothing to do actually\n return Promise.resolve();\n }\n };\n }\n };\n\n return extendedText;\n\n});\n\n","define('taoQtiTest/runner/proxy/cache/preloaders/interactions/preloaders',['taoQtiTest/runner/proxy/cache/preloaders/interactions/extendedText'], function (extendedTextPreloader) { 'use strict';\n\n\textendedTextPreloader = extendedTextPreloader && Object.prototype.hasOwnProperty.call(extendedTextPreloader, 'default') ? extendedTextPreloader['default'] : extendedTextPreloader;\n\n\t/*\n\t * This program is free software; you can redistribute it and/or\n\t * modify it under the terms of the GNU General Public License\n\t * as published by the Free Software Foundation; under version 2\n\t * of the License (non-upgradable).\n\t *\n\t * This program is distributed in the hope that it will be useful,\n\t * but WITHOUT ANY WARRANTY; without even the implied warranty of\n\t * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\t * GNU General Public License for more details.\n\t *\n\t * You should have received a copy of the GNU General Public License\n\t * along with this program; if not, write to the Free Software\n\t * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n\t *\n\t * Copyright (c) 2021 Open Assessment Technologies SA\n\t */\n\n\t/**\n\t * The list of asset loader factories\n\t * @type {Function[]}\n\t */\n\tvar preloaders = [extendedTextPreloader];\n\n\treturn preloaders;\n\n});\n\n","define('taoQtiTest/runner/proxy/cache/interactionPreloader',['taoQtiTest/runner/proxy/cache/preloaders/interactions/preloaders', 'taoQtiTest/runner/proxy/cache/preloaderManager'], function (preloaders, preloaderManagerFactory) { 'use strict';\n\n\tpreloaders = preloaders && Object.prototype.hasOwnProperty.call(preloaders, 'default') ? preloaders['default'] : preloaders;\n\tpreloaderManagerFactory = preloaderManagerFactory && Object.prototype.hasOwnProperty.call(preloaderManagerFactory, 'default') ? preloaderManagerFactory['default'] : preloaderManagerFactory;\n\n\t/*\n\t * This program is free software; you can redistribute it and/or\n\t * modify it under the terms of the GNU General Public License\n\t * as published by the Free Software Foundation; under version 2\n\t * of the License (non-upgradable).\n\t *\n\t * This program is distributed in the hope that it will be useful,\n\t * but WITHOUT ANY WARRANTY; without even the implied warranty of\n\t * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\t * GNU General Public License for more details.\n\t *\n\t * You should have received a copy of the GNU General Public License\n\t * along with this program; if not, write to the Free Software\n\t * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n\t *\n\t * Copyright (c) 2021 Open Assessment Technologies SA\n\t */\n\n\t/**\n\t * @callback interactionPreloaderManagerAction\n\t * @param {string} type - The type of asset to preload\n\t * @param {object} interaction - The interaction\n\t * @param {object} itemData - The item data\n\t * @param {string} itemIdentifier - the id of the item the interaction belongs to\n\t */\n\n\t/**\n\t * @callback interactionPreloaderAction\n\t * @param {object} interaction - The interaction\n\t * @param {object} itemData - The item data\n\t * @param {string} itemIdentifier - the id of the item the interaction belongs to\n\t */\n\n\t/**\n\t * @typedef {object} interactionPreloaderManager\n\t * @property {string} name - The name of the preloader\n\t * @property {interactionPreloaderManagerAction} loaded - Tells whether an interaction is loaded or not\n\t * @property {interactionPreloaderManagerAction} load - Preload an interaction\n\t * @property {interactionPreloaderManagerAction} unload - Unload an interaction\n\t */\n\n\t/**\n\t * @typedef {object} interactionPreloader\n\t * @property {string} name - The name of the preloader\n\t * @property {interactionPreloaderAction} loaded - Tells whether an interaction is loaded or not\n\t * @property {interactionPreloaderAction} load - Preload an interaction\n\t * @property {interactionPreloaderAction} unload - Unload an interaction\n\t */\n\n\t/**\n\t * Manages the preloading of assets\n\t * @function assetPreloaderFactory\n\t * @param assetManager - A reference to the assetManager\n\t * @return {assetPreloaderManager}\n\t */\n\tconst interactionPreloaderFactory = preloaderManagerFactory();\n\tpreloaders.forEach(preloader => interactionPreloaderFactory.registerProvider(preloader.name, preloader));\n\n\treturn interactionPreloaderFactory;\n\n});\n\n","define('taoQtiTest/runner/proxy/cache/itemPreloader',['lodash', 'core/logger', 'taoQtiItem/runner/qtiItemRunner', 'taoQtiTest/runner/config/assetManager', 'taoQtiTest/runner/proxy/cache/assetPreloader', 'taoQtiTest/runner/proxy/cache/interactionPreloader', 'util/url'], function (_, loggerFactory, qtiItemRunner, getAssetManager, assetPreloaderFactory, interactionPreloaderFactory, urlUtil) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n loggerFactory = loggerFactory && Object.prototype.hasOwnProperty.call(loggerFactory, 'default') ? loggerFactory['default'] : loggerFactory;\n qtiItemRunner = qtiItemRunner && Object.prototype.hasOwnProperty.call(qtiItemRunner, 'default') ? qtiItemRunner['default'] : qtiItemRunner;\n getAssetManager = getAssetManager && Object.prototype.hasOwnProperty.call(getAssetManager, 'default') ? getAssetManager['default'] : getAssetManager;\n assetPreloaderFactory = assetPreloaderFactory && Object.prototype.hasOwnProperty.call(assetPreloaderFactory, 'default') ? assetPreloaderFactory['default'] : assetPreloaderFactory;\n interactionPreloaderFactory = interactionPreloaderFactory && Object.prototype.hasOwnProperty.call(interactionPreloaderFactory, 'default') ? interactionPreloaderFactory['default'] : interactionPreloaderFactory;\n urlUtil = urlUtil && Object.prototype.hasOwnProperty.call(urlUtil, 'default') ? urlUtil['default'] : urlUtil;\n\n /*\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017-2021 Open Assessment Technologies SA\n */\n\n /**\n * @type {logger}\n * @private\n */\n const logger = loggerFactory('taoQtiTest/runner/proxy/cache/itemPreloader');\n\n /**\n * Check if the given item object matches the expectations\n * @param {object} item\n * @param {string} item.itemIdentifier - the item identifier\n * @param {string} item.baseUrl - item baseUrl\n * @param {object} item.itemData.assets - assets per types : img : ['url1', 'url2' ]\n * @returns {boolean}\n * @private\n */\n const isItemObjectValid = item => {\n return _.isPlainObject(item) && _.isString(item.baseUrl) && _.isString(item.itemIdentifier) && !_.isEmpty(item.itemIdentifier) && _.isPlainObject(item.itemData);\n };\n\n /**\n * Sets a flag onto an item\n * @param {object} item - The item to flag\n * @param {string} flag - The flag name to set\n */\n const setItemFlag = (item, flag) => {\n item.flags = item.flags || {};\n item.flags[flag] = true;\n };\n\n /**\n * Extracts the list of interactions from the item\n * @param {object} itemData\n * @returns {object[]}\n */\n const getItemInteractions = itemData => {\n const interactions = [];\n if (itemData.data && itemData.data.body && itemData.data.body.elements) {\n _.forEach(itemData.data.body.elements, elements => interactions.push(elements));\n }\n return interactions;\n };\n\n /**\n * Create an instance of an item preloader\n * @param {object} options\n * @param {string} options.testId - the unique identifier of the test instance, required to get the asset manager\n * @returns {itemPreloader}\n * @throws {TypeError} if the testId is not defined\n */\n function itemPreloaderFactory(options) {\n //we also have a specific instance of the asset manager to\n //resolve assets of a next item (we can't use the test asset manager).\n const preloadAssetManager = getAssetManager('item-preloader');\n\n /**\n * Resolves assets URLS using the assetManager\n * @param {object} item\n * @param {string} item.itemIdentifier - the item identifier\n * @param {string} item.baseUrl - item baseUrl\n * @param {string} item.itemData.type - type of item\n * @param {object} item.itemData.data - item data\n * @param {object} item.itemData.assets - assets per types : img : ['url1', 'url2' ]\n * @returns {Promise} assets with URLs resolved\n * @private\n */\n const resolveAssets = item => {\n return new Promise(resolve => {\n const {\n assets\n } = item.itemData;\n preloadAssetManager.setData('baseUrl', item.baseUrl);\n preloadAssetManager.setData('assets', assets);\n return resolve(_.reduce(assets, (acc, assetList, type) => {\n const resolved = {};\n _.forEach(assetList, url => {\n //filter base64 (also it seems sometimes we just have base64 data, without the protocol...)\n if (!urlUtil.isBase64(url)) {\n resolved[url] = preloadAssetManager.resolve(url);\n }\n });\n if (_.size(resolved) > 0) {\n acc[type] = resolved;\n }\n return acc;\n }, {}));\n });\n };\n if (!options || !options.testId) {\n throw new TypeError('The test identifier is mandatory to start the item preloader');\n }\n\n //this is the test asset manager, referenced under options.testId\n const testAssetManager = getAssetManager(options.testId);\n\n //mechanisms to preload assets and runtimes\n const assetPreloader = assetPreloaderFactory(testAssetManager);\n const interactionPreloader = interactionPreloaderFactory();\n\n /**\n * Preload the item runner\n * @param {object} item\n * @param {string} item.itemIdentifier - the item identifier\n * @param {string} item.baseUrl - item baseUrl\n * @param {string} item.itemData.type - type of item\n * @param {object} item.itemData.data - item data\n * @param {object} item.itemData.assets - assets per types : img : ['url1', 'url2' ]\n * @returns {Promise}\n * @private\n */\n const itemLoad = item => {\n logger.debug(`Start preloading of item ${item.itemIdentifier}`);\n return new Promise((resolve, reject) => {\n qtiItemRunner(item.itemData.type, item.itemData.data, {\n assetManager: preloadAssetManager,\n preload: true\n }).on('init', () => {\n logger.debug(`Preloading of item ${item.itemIdentifier} done`);\n resolve(true);\n }).on('error', reject).init();\n });\n };\n\n /**\n * Preload the interactions\n * @param {object} item\n * @param {string} item.itemIdentifier - the item identifier\n * @param {object} item.itemData.data - item data\n * @returns {Promise}\n * @private\n */\n const interactionLoad = item => {\n return Promise.all(getItemInteractions(item.itemData).map(interaction => {\n if (interactionPreloader.has(interaction.qtiClass)) {\n logger.debug(`Loading interaction ${interaction.serial}(${interaction.qtiClass}) for item ${item.itemIdentifier}`);\n return interactionPreloader.load(interaction.qtiClass, interaction, item.itemData, item.itemIdentifier);\n }\n return Promise.resolve();\n }));\n };\n\n /**\n * Unload the interactions\n * @param {object} item\n * @param {string} item.itemIdentifier - the item identifier\n * @param {object} item.itemData.data - item data\n * @returns {Promise}\n * @private\n */\n const interactionUnload = item => {\n return Promise.all(getItemInteractions(item.itemData).map(interaction => {\n if (interactionPreloader.has(interaction.qtiClass)) {\n logger.debug(`Unloading interaction ${interaction.serial}(${interaction.qtiClass}) for item ${item.itemIdentifier}`);\n return interactionPreloader.unload(interaction.qtiClass, interaction, item.itemData, item.itemIdentifier);\n }\n return Promise.resolve();\n }));\n };\n\n /**\n * Preload the item assets\n * @param {object} item\n * @param {string} item.itemIdentifier - the item identifier\n * @param {string} item.baseUrl - item baseUrl\n * @param {string} item.itemData.type - type of item\n * @param {object} item.itemData.data - item data\n * @param {object} item.itemData.assets - assets per types : img : ['url1', 'url2' ]\n * @returns {Promise}\n * @private\n */\n const assetLoad = item => {\n return resolveAssets(item).then(resolved => {\n _.forEach(resolved, (assets, type) => {\n if (assetPreloader.has(type)) {\n _.forEach(assets, (url, sourceUrl) => {\n logger.debug(`Loading asset ${sourceUrl}(${type}) for item ${item.itemIdentifier}`);\n assetPreloader.load(type, url, sourceUrl, item.itemIdentifier);\n });\n } else {\n setItemFlag(item, 'containsNonPreloadedAssets');\n }\n });\n return true;\n });\n };\n\n /**\n * Unload the item assets\n * @param {object} item\n * @param {string} item.itemIdentifier - the item identifier\n * @param {string} item.baseUrl - item baseUrl\n * @param {string} item.itemData.type - type of item\n * @param {object} item.itemData.data - item data\n * @param {object} item.itemData.assets - assets per types : img : ['url1', 'url2' ]\n * @returns {Promise}\n * @private\n */\n const assetUnload = item => {\n return resolveAssets(item).then(resolved => {\n _.forEach(resolved, (assets, type) => {\n if (assetPreloader.has(type)) {\n _.forEach(assets, (url, sourceUrl) => {\n logger.debug(`Unloading asset ${sourceUrl}(${type}) for item ${item.itemIdentifier}`);\n assetPreloader.unload(type, url, sourceUrl, item.itemIdentifier);\n });\n }\n });\n return true;\n });\n };\n\n /**\n * @typedef {object} itemPreloader\n */\n return {\n /**\n * Preload the given item (runtime and assets)\n *\n * @param {object} item\n * @param {string} item.itemIdentifier - the item identifier\n * @param {string} item.baseUrl - item baseUrl\n * @param {string} item.itemData.type - type of item\n * @param {object} item.itemData.data - item data\n * @param {object} item.itemData.assets - assets per types : img : ['url1', 'url2' ]\n * @returns {Promise} resolves with true if the item is loaded\n */\n preload(item) {\n const loading = [];\n if (isItemObjectValid(item)) {\n loading.push(itemLoad(item));\n loading.push(interactionLoad(item));\n if (_.size(item.itemData.data && item.itemData.data.feedbacks)) {\n setItemFlag(item, 'hasFeedbacks');\n }\n if (_.size(item.portableElements && item.portableElements.pci)) {\n setItemFlag(item, 'hasPci');\n }\n if (_.size(item.itemData.assets) > 0) {\n loading.push(assetLoad(item));\n }\n }\n return Promise.all(loading).then(results => results.length > 0 && _.all(results, _.isTrue));\n },\n /**\n * Unload the assets for the given item\n *\n * @param {object} item\n * @param {string} item.itemIdentifier - the item identifier\n * @param {string} item.baseUrl - item baseUrl\n * @param {string} item.itemData.type - type of item\n * @param {object} item.itemData.data - item data\n * @param {object} item.itemData.assets - assets per types : img : ['url1', 'url2' ]\n * @returns {Promise}\n */\n unload(item) {\n const loading = [];\n if (isItemObjectValid(item)) {\n loading.push(interactionUnload(item));\n if (_.size(item.itemData.assets) > 0) {\n loading.push(assetUnload(item));\n }\n }\n return Promise.all(loading).then(results => results.length > 0 && _.all(results, _.isTrue));\n }\n };\n }\n\n return itemPreloaderFactory;\n\n});\n\n","define('taoQtiTest/runner/proxy/cache/itemStore',['lodash', 'core/store', 'taoQtiTest/runner/proxy/cache/itemPreloader'], function (_, store, itemPreloaderFactory) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n store = store && Object.prototype.hasOwnProperty.call(store, 'default') ? store['default'] : store;\n itemPreloaderFactory = itemPreloaderFactory && Object.prototype.hasOwnProperty.call(itemPreloaderFactory, 'default') ? itemPreloaderFactory['default'] : itemPreloaderFactory;\n\n /*\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017-2021 Open Assessment Technologies SA\n */\n\n /**\n * The default number of items to store\n */\n const defaultConfig = {\n itemTTL: 0,\n maxSize: 10,\n preload: false\n };\n\n /**\n * Create an item store\n * @param {object} [options]\n * @param {number} [options.itemTTL = 0] - The TTL for each item in the store, in milliseconds. 0 means no TTL.\n * @param {number} [options.maxSize = 10] - the store limit\n * @param {boolean} [options.preload] - do we preload items when storing them\n * @param {string} [options.testId] - the unique identifier of the test instance, required if preload is true\n *\n * @returns {itemStore}\n */\n function itemStoreFactory(options) {\n const config = _.defaults(options || {}, defaultConfig);\n\n // in memory storage\n const getStore = () => store('item-cache', store.backends.memory);\n\n // maintain an index to resolve existence synchronously\n const index = new Map();\n let lastIndexedPosition = 0;\n\n // check if a key has expired\n const isExpired = key => {\n const meta = index.get(key);\n if (meta) {\n return config.itemTTL && Date.now() - meta.timestamp >= config.itemTTL;\n }\n return false;\n };\n\n // retrieve the first item by position from the index\n const findFirstIndexedItem = () => {\n let first = null;\n let lowest = Number.POSITIVE_INFINITY;\n index.forEach((item, key) => {\n if (item.position < lowest) {\n lowest = item.position;\n first = key;\n }\n });\n return first;\n };\n\n // retrieve all expired items from the index\n const findExpiredItems = () => {\n const expired = [];\n index.forEach((item, key) => {\n if (isExpired(key)) {\n expired.push(key);\n }\n });\n return expired;\n };\n let itemPreloader;\n if (config.preload) {\n itemPreloader = itemPreloaderFactory(_.pick(config, ['testId']));\n }\n\n /**\n * @typedef itemStore\n */\n return {\n /**\n * Setter to override the cache size\n *\n * @param {number} cacheSize\n */\n setCacheSize(cacheSize) {\n config.maxSize = cacheSize;\n },\n /**\n * Sets the item store TTL.\n * @param {number} ttl\n */\n setItemTTL(ttl) {\n config.itemTTL = ttl;\n },\n /**\n * Get the item form the given key/id/uri\n * @param {string} key - something identifier\n * @returns {Promise} the item\n */\n get(key) {\n if (!this.has(key)) {\n return Promise.resolve();\n }\n return getStore().then(itemStorage => itemStorage.getItem(key));\n },\n /**\n * Check whether the given item is in the store\n * @param {string} key - something identifier\n * @returns {boolean}\n */\n has(key) {\n return index.has(key) && !isExpired(key);\n },\n /**\n * Add/Set an item into the store, under the given key\n * @param {string} key - something identifier\n * @param {object} item - the item\n * @returns {Promise} chains\n */\n set(key, item) {\n return getStore().then(itemStorage => {\n return itemStorage.setItem(key, item).then(updated => {\n if (updated) {\n if (!index.has(key)) {\n index.set(key, {\n position: lastIndexedPosition++,\n timestamp: Date.now()\n });\n }\n if (config.preload) {\n _.defer(() => itemPreloader.preload(item));\n }\n }\n\n //do we reach the limit ? then remove one\n if (index.size > 1 && index.size > config.maxSize) {\n return this.remove(findFirstIndexedItem()).then(removed => updated && removed);\n }\n return updated;\n });\n });\n },\n /**\n * Update some data of a store item\n * @param {string} key - something identifier\n * @param {string} updateKey - key to update\n * @param {*} updateValue - new data for the updateKey\n * @returns {Promise} resolves with the update status\n */\n update(key, updateKey, updateValue) {\n if (index.has(key) && _.isString(updateKey)) {\n return getStore().then(itemStorage => {\n return itemStorage.getItem(key).then(itemData => {\n if (_.isPlainObject(itemData)) {\n itemData[updateKey] = updateValue;\n return itemStorage.setItem(key, itemData);\n }\n });\n });\n }\n return Promise.resolve(false);\n },\n /**\n * Remove the item from the store\n * @param {string} key - something identifier\n * @returns {Promise} resolves once removed\n */\n remove(key) {\n if (index.has(key)) {\n return getStore().then(itemStorage => {\n index.delete(key);\n return itemStorage.getItem(key).then(item => {\n if (config.preload) {\n _.defer(() => itemPreloader.unload(item));\n }\n }).then(() => itemStorage.removeItem(key));\n });\n }\n return Promise.resolve(false);\n },\n /**\n * Prune the store from expired content.\n * @returns {Promise}\n */\n prune() {\n return Promise.all(findExpiredItems().map(this.remove));\n },\n /**\n * Clear the store\n * @returns {Promise}\n */\n clear() {\n return getStore().then(itemStorage => {\n index.clear();\n return itemStorage.clear();\n });\n }\n };\n }\n\n return itemStoreFactory;\n\n});\n\n","define('taoQtiTest/runner/proxy/qtiServiceProxy',['lodash', 'core/promiseQueue', 'core/communicator', 'taoQtiTest/runner/config/qtiServiceConfig', 'core/request'], function (_, promiseQueue, communicatorFactory, configFactory, coreRequest) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n promiseQueue = promiseQueue && Object.prototype.hasOwnProperty.call(promiseQueue, 'default') ? promiseQueue['default'] : promiseQueue;\n communicatorFactory = communicatorFactory && Object.prototype.hasOwnProperty.call(communicatorFactory, 'default') ? communicatorFactory['default'] : communicatorFactory;\n configFactory = configFactory && Object.prototype.hasOwnProperty.call(configFactory, 'default') ? configFactory['default'] : configFactory;\n coreRequest = coreRequest && Object.prototype.hasOwnProperty.call(coreRequest, 'default') ? coreRequest['default'] : coreRequest;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * QTI proxy definition\n * Related to remote services calls\n * @type {Object}\n */\n var qtiServiceProxy = {\n name: 'qtiServiceProxy',\n /**\n * Installs the proxy\n */\n install: function install() {\n var self = this;\n\n /**\n * A promise queue to ensure requests run sequentially\n */\n this.queue = promiseQueue();\n\n /**\n * Some parameters needs special handling...\n * @param {Object} actionParams - the input parameters\n * @returns {Object} output parameters\n */\n this.prepareParams = function prepareParams(actionParams) {\n //some parameters need to be JSON.stringified\n var stringifyParams = ['itemState', 'itemResponse', 'toolStates'];\n if (_.isPlainObject(actionParams)) {\n return _.mapValues(actionParams, function (value, key) {\n if (_.contains(stringifyParams, key)) {\n return JSON.stringify(value);\n }\n return value;\n });\n }\n return actionParams;\n };\n\n /**\n * Proxy request function. Returns a promise\n * Applied options: asynchronous call, JSON data, no cache\n * @param {String} url\n * @param {Object} [reqParams]\n * @param {String} [contentType] - to force the content type\n * @param {Boolean} [noToken] - to disable the token\n * @returns {Promise}\n */\n this.request = function request(url, reqParams, contentType, noToken) {\n return coreRequest({\n url: url,\n data: self.prepareParams(reqParams),\n method: reqParams ? 'POST' : 'GET',\n contentType: contentType,\n noToken: noToken,\n background: false,\n sequential: true,\n timeout: self.configStorage.getTimeout()\n }).then(function (response) {\n self.setOnline();\n if (response && response.success) {\n return Promise.resolve(response);\n } else {\n return Promise.reject(response);\n }\n }).catch(function (error) {\n if (self.isConnectivityError(error)) {\n self.setOffline('request');\n }\n return Promise.reject(error);\n });\n };\n },\n /**\n * Initializes the proxy\n * @param {Object} config - The config provided to the proxy factory\n * @param {String} config.testDefinition - The URI of the test\n * @param {String} config.testCompilation - The URI of the compiled delivery\n * @param {String} config.serviceCallId - The URI of the service call\n * @param {Object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The proxy will be fully initialized on resolve.\n * Any error will be provided if rejected.\n */\n init: function init(config, params) {\n // store config in a dedicated configStorage\n this.configStorage = configFactory(config || {});\n\n // request for initialization\n return this.request(this.configStorage.getTestActionUrl('init'), params);\n },\n /**\n * Uninstalls the proxy\n * @returns {Promise} - Returns a promise. The proxy will be fully uninstalled on resolve.\n * Any error will be provided if rejected.\n */\n destroy: function destroy() {\n // no request, just a resources cleaning\n this.configStorage = null;\n this.queue = null;\n\n // the method must return a promise\n return Promise.resolve();\n },\n /**\n * Gets the test definition data\n * @returns {Promise} - Returns a promise. The test definition data will be provided on resolve.\n * Any error will be provided if rejected.\n */\n getTestData: function getTestData() {\n return this.request(this.configStorage.getTestActionUrl('getTestData'));\n },\n /**\n * Gets the test context\n * @returns {Promise} - Returns a promise. The context object will be provided on resolve.\n * Any error will be provided if rejected.\n */\n getTestContext: function getTestContext() {\n return this.request(this.configStorage.getTestActionUrl('getTestContext'));\n },\n /**\n * Gets the test map\n * @returns {Promise} - Returns a promise. The test map object will be provided on resolve.\n * Any error will be provided if rejected.\n */\n getTestMap: function getTestMap() {\n return this.request(this.configStorage.getTestActionUrl('getTestMap'));\n },\n /**\n * Sends the test variables\n * @param {Object} variables\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n * @fires sendVariables\n */\n sendVariables: function sendVariables(variables) {\n return this.request(this.configStorage.getTestActionUrl('storeTraceData'), {\n traceData: JSON.stringify(variables)\n });\n },\n /**\n * Calls an action related to the test\n * @param {String} action - The name of the action to call\n * @param {Object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n */\n callTestAction: function callTestAction(action, params) {\n return this.request(this.configStorage.getTestActionUrl(action), params);\n },\n /**\n * Gets an item definition by its identifier, also gets its current state\n * @param {String} itemIdentifier - The identifier of the item to get\n * @param {Object} [params] - additional parameters\n * @returns {Promise} - Returns a promise. The item data will be provided on resolve.\n * Any error will be provided if rejected.\n */\n getItem: function getItem(itemIdentifier, params) {\n return this.request(this.configStorage.getItemActionUrl(itemIdentifier, 'getItem'), params, void 0, true);\n },\n /**\n * Submits the state and the response of a particular item\n * @param {String} itemIdentifier - The identifier of the item to update\n * @param {Object} state - The state to submit\n * @param {Object} response - The response object to submit\n * @param {Object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n */\n submitItem: function submitItem(itemIdentifier, state, response, params) {\n var body = _.merge({\n itemState: state,\n itemResponse: response\n }, params || {});\n return this.request(this.configStorage.getItemActionUrl(itemIdentifier, 'submitItem'), body);\n },\n /**\n * Calls an action related to a particular item\n * @param {String} itemIdentifier - The identifier of the item for which call the action\n * @param {String} action - The name of the action to call\n * @param {Object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n */\n callItemAction: function callItemAction(itemIdentifier, action, params) {\n return this.request(this.configStorage.getItemActionUrl(itemIdentifier, action), params);\n },\n /**\n * Sends a telemetry signal\n * @param {String} itemIdentifier - The identifier of the item for which sends the telemetry signal\n * @param {String} signal - The name of the signal to send\n * @param {Object} [params] - Some optional parameters to join to the signal\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n * @fires telemetry\n */\n telemetry: function telemetry(itemIdentifier, signal, params) {\n return this.request(this.configStorage.getTelemetryUrl(itemIdentifier, signal), params, null, true);\n },\n /**\n * Builds the communication channel\n * @returns {communicator|null} the communication channel\n */\n loadCommunicator: function loadCommunicator() {\n var config = this.configStorage.getCommunicationConfig();\n if (config.enabled) {\n return communicatorFactory(config.type, config.params);\n }\n return null;\n }\n };\n\n return qtiServiceProxy;\n\n});\n\n","define('taoQtiTest/runner/proxy/cache/proxy',['lodash', 'taoQtiTest/runner/navigator/navigator', 'taoQtiTest/runner/helpers/map', 'taoQtiTest/runner/helpers/navigation', 'taoQtiTest/runner/provider/dataUpdater', 'taoQtiTest/runner/proxy/qtiServiceProxy', 'taoQtiTest/runner/proxy/cache/itemStore', 'taoQtiTest/runner/proxy/cache/actionStore', 'taoQtiTest/runner/helpers/offlineErrorHelper'], function (_, testNavigatorFactory, mapHelper, navigationHelper, dataUpdater, qtiServiceProxy, itemStoreFactory, actionStoreFactory, offlineErrorHelper) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n testNavigatorFactory = testNavigatorFactory && Object.prototype.hasOwnProperty.call(testNavigatorFactory, 'default') ? testNavigatorFactory['default'] : testNavigatorFactory;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n navigationHelper = navigationHelper && Object.prototype.hasOwnProperty.call(navigationHelper, 'default') ? navigationHelper['default'] : navigationHelper;\n dataUpdater = dataUpdater && Object.prototype.hasOwnProperty.call(dataUpdater, 'default') ? dataUpdater['default'] : dataUpdater;\n qtiServiceProxy = qtiServiceProxy && Object.prototype.hasOwnProperty.call(qtiServiceProxy, 'default') ? qtiServiceProxy['default'] : qtiServiceProxy;\n itemStoreFactory = itemStoreFactory && Object.prototype.hasOwnProperty.call(itemStoreFactory, 'default') ? itemStoreFactory['default'] : itemStoreFactory;\n actionStoreFactory = actionStoreFactory && Object.prototype.hasOwnProperty.call(actionStoreFactory, 'default') ? actionStoreFactory['default'] : actionStoreFactory;\n offlineErrorHelper = offlineErrorHelper && Object.prototype.hasOwnProperty.call(offlineErrorHelper, 'default') ? offlineErrorHelper['default'] : offlineErrorHelper;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017-2021 Open Assessment Technologies SA\n */\n\n /**\n * The number of items to keep in the cache\n * @type {number}\n * @private\n */\n const cacheSize = 20;\n\n /**\n * The number of ms to wait after an item is loaded\n * to start loading the next.\n * This value is more or less the time needed to render an item.\n * @type {number}\n * @private\n */\n const loadNextDelay = 450;\n\n /**\n * The default TimeToLive for assets resolving, in seconds.\n * Each item comes with a baseUrl that may have a TTL bound to it.\n * Once this TTL is expired, the assets won't be reachable.\n * For this reason, we need to remove from the cache items having an expired TTL.\n * @type {number}\n * @private\n */\n const defaultItemTTL = 15 * 60;\n\n /**\n * Overrides the qtiServiceProxy with the precaching behavior\n * @extends taoQtiTest/runner/proxy/qtiServiceProxy\n */\n var proxy = _.defaults({\n name: 'precaching',\n /**\n * Installs the proxy\n * @param {object} config\n */\n install(config) {\n //install the parent proxy\n qtiServiceProxy.install.call(this);\n\n /**\n * Gets the value of an item caching option. All values are numeric only.\n * @param {string} name\n * @param {number} defaultValue\n * @returns {number}\n */\n const getItemCachingOption = (name, defaultValue) => {\n if (config && config.options && config.options.itemCaching) {\n return parseInt(config.options.itemCaching[name], 10) || defaultValue;\n }\n return defaultValue;\n };\n\n //we keep items here\n this.itemStore = itemStoreFactory({\n itemTTL: defaultItemTTL * 1000,\n maxSize: cacheSize,\n preload: true,\n testId: config.serviceCallId\n });\n\n //where we keep actions\n this.actiontStore = null;\n\n //can we load the next item from the cache/store ?\n this.getItemFromStore = false;\n\n //configuration params, that comes on every request/params\n this.requestConfig = {};\n\n //scheduled action promises which supposed to be resolved after action synchronization.\n this.actionPromises = {};\n\n //scheduled action reject promises which supposed to be rejected in case of failed synchronization.\n this.actionRejectPromises = {};\n\n //let's you update test data (testContext and testMap)\n this.dataUpdater = dataUpdater(this.getDataHolder());\n\n /**\n * Get the item cache size from the test data\n * @returns {number} the cache size\n */\n this.getCacheAmount = () => getItemCachingOption('amount', 1);\n\n /**\n * Get the item store TimeToLive\n * @returns {number} the item store TTL\n */\n this.getItemTTL = () => getItemCachingOption('itemStoreTTL', defaultItemTTL) * 1000;\n\n /**\n * Check whether we have the item in the store\n * @param {string} itemIdentifier - the item identifier\n * @returns {boolean}\n */\n this.hasItem = itemIdentifier => itemIdentifier && this.itemStore.has(itemIdentifier);\n\n /**\n * Check whether we have the next item in the store\n * @param {string} itemIdentifier - the CURRENT item identifier\n * @returns {boolean}\n */\n this.hasNextItem = itemIdentifier => {\n const sibling = navigationHelper.getNextItem(this.getDataHolder().get('testMap'), itemIdentifier);\n return sibling && this.hasItem(sibling.id);\n };\n\n /**\n * Check whether we have the previous item in the store\n * @param {string} itemIdentifier - the CURRENT item identifier\n * @returns {boolean}\n */\n this.hasPreviousItem = itemIdentifier => {\n const sibling = navigationHelper.getPreviousItem(this.getDataHolder().get('testMap'), itemIdentifier);\n return sibling && this.hasItem(sibling.id);\n };\n\n /**\n * Offline ? We try to navigate offline, or just say 'ok'\n *\n * @param {string} action - the action name (ie. move, skip, timeout)\n * @param {object} actionParams - the parameters sent along the action\n * @returns {object} action result\n */\n this.offlineAction = (action, actionParams) => {\n const result = {\n success: true\n };\n const blockingActions = ['exitTest', 'timeout'];\n const testContext = this.getDataHolder().get('testContext');\n const testMap = this.getDataHolder().get('testMap');\n if (action === 'pause') {\n throw offlineErrorHelper.buildErrorFromContext(offlineErrorHelper.getOfflinePauseError(), {\n reason: actionParams.reason\n });\n }\n\n //we just block those actions and the end of the test\n if (_.contains(blockingActions, action) || actionParams.direction === 'next' && navigationHelper.isLast(testMap, testContext.itemIdentifier)) {\n throw offlineErrorHelper.buildErrorFromContext(offlineErrorHelper.getOfflineExitError());\n }\n\n // try the navigation if the actionParams context meaningful data\n if (actionParams.direction && actionParams.scope) {\n const testNavigator = testNavigatorFactory(testContext, testMap);\n const newTestContext = testNavigator.navigate(actionParams.direction, actionParams.scope, actionParams.ref);\n\n //we are really not able to navigate\n if (!newTestContext || !newTestContext.itemIdentifier || !this.hasItem(newTestContext.itemIdentifier)) {\n throw offlineErrorHelper.buildErrorFromContext(offlineErrorHelper.getOfflineNavError());\n }\n result.testContext = newTestContext;\n }\n this.markActionAsOffline(actionParams);\n return result;\n };\n\n /**\n * Process action which should be sent using message channel.\n *\n * @param {string} action\n * @param {object} actionParams\n * @param {boolean} deferred\n *\n * @returns {Promise} resolves with the action result\n */\n this.processSyncAction = (action, actionParams, deferred) => {\n return new Promise((resolve, reject) => {\n this.scheduleAction(action, actionParams).then(actionData => {\n this.actionPromises[actionData.params.actionId] = resolve;\n this.actionRejectPromises[actionData.params.actionId] = reject;\n if (!deferred) {\n this.syncData().then(result => {\n if (this.isOnline()) {\n _.forEach(result, actionResult => {\n const actionId = actionResult.requestParameters && actionResult.requestParameters.actionId ? actionResult.requestParameters.actionId : null;\n if (!actionResult.success && this.actionRejectPromises[actionId]) {\n const error = new Error(actionResult.message);\n error.unrecoverable = true;\n return reject(error);\n }\n if (actionId && this.actionPromises[actionId]) {\n this.actionPromises[actionId](actionResult);\n }\n });\n }\n }).catch(reject);\n }\n }).catch(reject);\n });\n };\n\n /**\n * Schedule an action do be done with next call\n *\n * @param {string} action - the action name (ie. move, skip, timeout)\n * @param {object} params - the parameters sent along the action\n * @returns {Promise} resolves with the action data\n */\n this.scheduleAction = (action, params) => {\n params.actionId = `${action}_${new Date().getTime()}`;\n return this.actiontStore.push(action, this.prepareParams(_.defaults(params || {}, this.requestConfig))).then(() => ({\n action,\n params\n }));\n };\n\n /**\n * Request/Offline strategy :\n *\n * ├─ Online\n * │ └─ run the request\n * │ ├─ request ok\n * │ └─ request fails\n * │ └─ run the offline action\n * └── Offline\n * └─ send a telemetry request (connection could be back)\n * ├─ request ok\n * │ └─ sync data\n * │ └─ run the request (back to the tree root)\n * └─ request fails\n * └─ run the offline action\n *\n * @param {string} url\n * @param {string} action - the action name (ie. move, skip, timeout)\n * @param {object} actionParams - the parameters sent along the action\n * @param {boolean} deferred whether action can be scheduled (put into queue) to be sent in a bunch of actions later.\n * @param {boolean} noToken whether the request should be sent with a CSRF token or not\n *\n * @returns {Promise} resolves with the action result\n */\n this.requestNetworkThenOffline = (url, action, actionParams, deferred, noToken) => {\n const testContext = this.getDataHolder().get('testContext');\n const communicationConfig = this.configStorage.getCommunicationConfig();\n\n //perform the request, but fallback on offline if the request itself fails\n const runRequestThenOffline = () => {\n let request;\n if (communicationConfig.syncActions && communicationConfig.syncActions.indexOf(action) >= 0) {\n request = this.processSyncAction(action, actionParams, deferred);\n } else {\n //action is not synchronizable\n //fallback to direct request\n request = this.request(url, actionParams, void 0, noToken || false);\n request.then(result => {\n if (this.isOffline()) {\n return this.scheduleAction(action, actionParams);\n }\n return result;\n });\n }\n return request.then(result => {\n if (this.isOffline()) {\n return this.offlineAction(action, actionParams);\n }\n return result;\n }).catch(error => {\n if (this.isConnectivityError(error) && this.isOffline()) {\n return this.offlineAction(action, actionParams);\n }\n throw error;\n });\n };\n if (this.isOffline()) {\n //try the telemetry action, just in case\n return this.telemetry(testContext.itemIdentifier, 'up').then(() => {\n //if the up request succeed, we run the request\n if (this.isOnline()) {\n return runRequestThenOffline();\n }\n return this.scheduleAction(action, actionParams).then(() => {\n return this.offlineAction(action, actionParams);\n });\n }).catch(err => {\n if (this.isConnectivityError(err)) {\n return this.scheduleAction(action, actionParams).then(() => {\n return this.offlineAction(action, actionParams);\n });\n }\n throw err;\n });\n }\n\n //by default we try to run the request first\n return runRequestThenOffline();\n };\n\n /**\n * Flush and synchronize actions collected while offline\n * @returns {Promise} resolves with the action result\n */\n this.syncData = () => {\n let actions;\n return this.queue.serie(() => {\n return this.actiontStore.flush().then(data => {\n actions = data;\n if (data && data.length) {\n return this.send('sync', data);\n }\n }).catch(err => {\n if (this.isConnectivityError(err)) {\n this.setOffline('communicator');\n _.forEach(actions, action => {\n this.actiontStore.push(action.action, action.parameters);\n });\n }\n throw err;\n });\n });\n };\n\n /**\n * Flush the offline actions from the actionStore before reinserting them.\n * The exported copy can be used for file download.\n * The retained copy can still be synced as the test progresses.\n *\n * @returns {Promise} resolves with the store contents\n */\n this.exportActions = () => {\n return this.queue.serie(() => {\n return this.actiontStore.flush().then(data => {\n _.forEach(data, action => {\n this.actiontStore.push(action.action, action.parameters);\n });\n return data;\n });\n });\n };\n\n /**\n * Mark action as performed in offline mode\n * Action to mark as offline will be defined by actionParams.actionId parameter value.\n *\n * @param {object} actionParams - the action parameters\n * @returns {Promise}\n */\n this.markActionAsOffline = actionParams => {\n actionParams.offline = true;\n return this.queue.serie(() => {\n return this.actiontStore.update(this.prepareParams(_.defaults(actionParams || {}, this.requestConfig)));\n });\n };\n },\n /**\n * Initializes the proxy\n * @param {object} config - The config provided to the proxy factory\n * @param {string} config.testDefinition - The URI of the test\n * @param {string} config.testCompilation - The URI of the compiled delivery\n * @param {string} config.serviceCallId - The URI of the service call\n * @param {object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The proxy will be fully initialized on resolve.\n * Any error will be provided if rejected.\n */\n init(config, params) {\n if (!this.getDataHolder()) {\n throw new Error('Unable to retrieve test runners data holder');\n }\n\n //those needs to be in each request params.\n this.requestConfig = _.pick(config, ['testDefinition', 'testCompilation', 'serviceCallId']);\n\n //set up the action store for the current service call\n this.actiontStore = actionStoreFactory(config.serviceCallId);\n\n //we resynchronise as soon as the connection is back\n this.on('reconnect', function () {\n return this.syncData().then(responses => {\n this.dataUpdater.update(responses);\n }).catch(err => {\n this.trigger('error', err);\n });\n });\n\n //if some actions remains not synchronized\n this.syncData();\n\n //run the init\n return qtiServiceProxy.init.call(this, config, params);\n },\n /**\n * Uninstalls the proxy\n * @returns {Promise} - Returns a promise. The proxy will be fully uninstalled on resolve.\n * Any error will be provided if rejected.\n */\n destroy() {\n this.itemStore.clear();\n this.getItemFromStore = false;\n return qtiServiceProxy.destroy.call(this);\n },\n /**\n * Gets an item definition by its identifier, also gets its current state\n * @param {string} itemIdentifier - The identifier of the item to get\n * @param {object} [params] - additional parameters\n * @returns {Promise} - Returns a promise. The item data will be provided on resolve.\n * Any error will be provided if rejected.\n */\n getItem(itemIdentifier, params) {\n // remove the expired entries from the cache\n // prune anyway, if an issue occurs it should not prevent the remaining process to happen\n const pruneStore = () => this.itemStore.prune().catch(_.noop);\n\n /**\n * try to load the next items\n */\n const loadNextItem = () => {\n const testMap = this.getDataHolder().get('testMap');\n const siblings = navigationHelper.getSiblingItems(testMap, itemIdentifier, 'both', this.getCacheAmount());\n const missing = _.reduce(siblings, (list, sibling) => {\n if (!this.hasItem(sibling.id)) {\n list.push(sibling.id);\n }\n return list;\n }, []);\n\n //don't run a request if not needed\n if (this.isOnline() && missing.length) {\n _.delay(() => {\n this.requestNetworkThenOffline(this.configStorage.getTestActionUrl('getNextItemData'), 'getNextItemData', {\n itemDefinition: missing\n }, false, true).then(response => {\n if (response && response.items) {\n return pruneStore().then(() => {\n _.forEach(response.items, item => {\n if (item && item.itemIdentifier) {\n //store the response and start caching assets\n this.itemStore.set(item.itemIdentifier, item);\n }\n });\n });\n }\n }).catch(_.noop);\n }, loadNextDelay);\n }\n };\n\n // the additional proxy options are supplied after the 'init' phase as a result of the `init` action,\n // we need to apply them later\n this.itemStore.setItemTTL(this.getItemTTL());\n\n //resolve from the store\n if (this.getItemFromStore && this.itemStore.has(itemIdentifier)) {\n loadNextItem();\n return this.itemStore.get(itemIdentifier);\n }\n return this.request(this.configStorage.getItemActionUrl(itemIdentifier, 'getItem'), params, void 0, true).then(response => {\n if (response && response.success) {\n pruneStore().then(() => this.itemStore.set(itemIdentifier, response));\n }\n loadNextItem();\n return response;\n });\n },\n /**\n * Submits the state and the response of a particular item\n * @param {string} itemIdentifier - The identifier of the item to update\n * @param {object} state - The state to submit\n * @param {object} response - The response object to submit\n * @param {object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n */\n submitItem(itemIdentifier, state, response, params) {\n return this.itemStore.update(itemIdentifier, 'itemState', state).then(() => {\n return qtiServiceProxy.submitItem.call(this, itemIdentifier, state, response, params);\n });\n },\n /**\n * Sends the test variables\n * @param {object} variables\n * @param {boolean} deferred whether action can be scheduled (put into queue) to be sent in a bunch of actions later.\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n * @fires sendVariables\n */\n sendVariables(variables, deferred) {\n const action = 'storeTraceData';\n const actionParams = {\n traceData: JSON.stringify(variables)\n };\n return this.requestNetworkThenOffline(this.configStorage.getTestActionUrl(action), action, actionParams, deferred);\n },\n /**\n * Calls an action related to the test\n * @param {string} action - The name of the action to call\n * @param {object} [params] - Some optional parameters to join to the call\n * @param {boolean} deferred whether action can be scheduled (put into queue) to be sent in a bunch of actions later.\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n */\n callTestAction(action, params, deferred) {\n return this.requestNetworkThenOffline(this.configStorage.getTestActionUrl(action), action, params, deferred);\n },\n /**\n * Calls an action related to a particular item\n * @param {string} itemIdentifier - The identifier of the item for which call the action\n * @param {string} action - The name of the action to call\n * @param {object} [params] - Some optional parameters to join to the call\n * @param {boolean} deferred whether action can be scheduled (put into queue) to be sent in a bunch of actions later.\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n */\n callItemAction(itemIdentifier, action, params, deferred) {\n let updateStatePromise = Promise.resolve();\n const testMap = this.getDataHolder().get('testMap');\n\n //update the item state\n if (params.itemState) {\n updateStatePromise = this.itemStore.update(itemIdentifier, 'itemState', params.itemState);\n }\n\n //check if we have already the item for the action we are going to perform\n this.getItemFromStore = navigationHelper.isMovingToNextItem(action, params) && this.hasNextItem(itemIdentifier) || navigationHelper.isMovingToPreviousItem(action, params) && this.hasPreviousItem(itemIdentifier) || navigationHelper.isJumpingToItem(action, params) && this.hasItem(mapHelper.getItemIdentifier(testMap, params.ref));\n\n //If item action is move to another item ensure the next request will start the timer\n if (navigationHelper.isMovingToNextItem(action, params) || navigationHelper.isMovingToPreviousItem(action, params) || navigationHelper.isJumpingToItem(action, params)) {\n params.start = true;\n }\n return updateStatePromise.then(() => {\n return this.requestNetworkThenOffline(this.configStorage.getItemActionUrl(itemIdentifier, action), action, _.merge({\n itemDefinition: itemIdentifier\n }, params), deferred);\n });\n }\n }, qtiServiceProxy);\n\n return proxy;\n\n});\n\n","define('taoQtiTest/runner/proxy/loader',['lodash', 'module', 'taoTests/runner/proxy'], function (_, module, proxy) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n module = module && Object.prototype.hasOwnProperty.call(module, 'default') ? module['default'] : module;\n proxy = proxy && Object.prototype.hasOwnProperty.call(proxy, 'default') ? proxy['default'] : proxy;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017-2019 Open Assessment Technologies SA ;\n */\n\n /**\n * The configuration of the provider to use with it's AMD module\n */\n var config = _.defaults(module.config(), {\n providerName: 'qtiServiceProxy',\n module: 'taoQtiTest/runner/proxy/qtiServiceProxy'\n });\n\n /**\n * Load and register the configured providers\n * @returns {Promise} resolves with the regsitered provider name\n */\n function load() {\n return new Promise(function (resolve, reject) {\n require([config.module], function (proxyProvider) {\n proxy.registerProvider(config.providerName, proxyProvider);\n resolve(config.providerName);\n }, reject);\n });\n }\n\n return load;\n\n});\n\n","define('taoQtiTest/runner/services/responseStore',['lodash', 'core/store'], function (_, store) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n store = store && Object.prototype.hasOwnProperty.call(store, 'default') ? store['default'] : store;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n var defaultConfig = {\n responseStoreName: 'response',\n correctResponseStoreName: 'correct-response'\n };\n\n /**\n * @param {Object} options\n * @param {string} options.responseStoreName\n * @param {string} options.correctResponseStoreName\n */\n function responseStoreFactory(options) {\n var config = _.defaults(options || {}, defaultConfig);\n\n /**\n * @returns {Promise}\n */\n var getResponseStore = function getResponseStore() {\n return store(config.responseStoreName, store.backends.memory);\n };\n\n /**\n * @returns {Promise}\n */\n var getCorrectResponseStore = function getCorrectResponseStore() {\n return store(config.correctResponseStoreName, store.backends.memory);\n };\n return {\n /**\n * @returns {Promise}\n */\n getResponses: function getResponses() {\n return getResponseStore().then(function (storage) {\n return storage.getItems();\n });\n },\n /**\n * @returns {Promise}\n */\n getCorrectResponses: function getCorrectResponses() {\n return getCorrectResponseStore().then(function (storage) {\n return storage.getItems();\n });\n },\n /**\n * @param {string} key\n * @returns {Promise}\n */\n getResponse: function getResponse(key) {\n return getResponseStore().then(function (storage) {\n return storage.getItem(key);\n });\n },\n /**\n * @param {string} key\n * @returns {Promise}\n */\n getCorrectResponse: function getCorrectResponse(key) {\n return getCorrectResponseStore().then(function (storage) {\n return storage.getItem(key).then(function (result) {\n return new Promise(function (resolve) {\n if (typeof result === 'undefined') {\n return resolve([]);\n }\n return resolve(result);\n });\n });\n });\n },\n /**\n * @param {string} key\n * @param {string} value\n * @returns {Promise}\n */\n addResponse: function addResponse(key, value) {\n return getResponseStore().then(function (storage) {\n return storage.setItem(key, value).then(function (updated) {\n return updated;\n });\n });\n },\n /**\n * @param {string} key\n * @param {string[]} value\n * @returns {Promise}\n */\n addCorrectResponse: function addCorrectResponse(key, value) {\n return getCorrectResponseStore().then(function (storage) {\n return storage.setItem(key, value).then(function (updated) {\n return updated;\n });\n });\n },\n /**\n * @returns {Promise}\n */\n clearResponses: function clearResponses() {\n return getResponseStore().then(function (storage) {\n return storage.clear();\n });\n },\n /**\n * @returns {Promise}\n */\n clearCorrectResponses: function clearCorrectResponses() {\n return getCorrectResponseStore().then(function (storage) {\n return storage.clear();\n });\n }\n };\n }\n\n return responseStoreFactory;\n\n});\n\n","define('taoQtiTest/runner/proxy/offline/proxy',['lodash', 'taoQtiTest/runner/navigator/offlineNavigator', 'taoQtiTest/runner/helpers/navigation', 'taoQtiTest/runner/provider/dataUpdater', 'taoQtiTest/runner/proxy/qtiServiceProxy', 'taoQtiTest/runner/proxy/cache/itemStore', 'taoQtiTest/runner/proxy/cache/actionStore', 'taoQtiTest/runner/helpers/offlineErrorHelper', 'taoQtiTest/runner/helpers/offlineSyncModal', 'taoQtiTest/runner/services/responseStore', 'util/download', 'taoQtiTest/runner/config/states'], function (_, offlineNavigatorFactory, navigationHelper, dataUpdater, qtiServiceProxy, itemStoreFactory, actionStoreFactory, offlineErrorHelper, offlineSyncModal, responseStoreFactory, download, states) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n offlineNavigatorFactory = offlineNavigatorFactory && Object.prototype.hasOwnProperty.call(offlineNavigatorFactory, 'default') ? offlineNavigatorFactory['default'] : offlineNavigatorFactory;\n navigationHelper = navigationHelper && Object.prototype.hasOwnProperty.call(navigationHelper, 'default') ? navigationHelper['default'] : navigationHelper;\n dataUpdater = dataUpdater && Object.prototype.hasOwnProperty.call(dataUpdater, 'default') ? dataUpdater['default'] : dataUpdater;\n qtiServiceProxy = qtiServiceProxy && Object.prototype.hasOwnProperty.call(qtiServiceProxy, 'default') ? qtiServiceProxy['default'] : qtiServiceProxy;\n itemStoreFactory = itemStoreFactory && Object.prototype.hasOwnProperty.call(itemStoreFactory, 'default') ? itemStoreFactory['default'] : itemStoreFactory;\n actionStoreFactory = actionStoreFactory && Object.prototype.hasOwnProperty.call(actionStoreFactory, 'default') ? actionStoreFactory['default'] : actionStoreFactory;\n offlineErrorHelper = offlineErrorHelper && Object.prototype.hasOwnProperty.call(offlineErrorHelper, 'default') ? offlineErrorHelper['default'] : offlineErrorHelper;\n offlineSyncModal = offlineSyncModal && Object.prototype.hasOwnProperty.call(offlineSyncModal, 'default') ? offlineSyncModal['default'] : offlineSyncModal;\n responseStoreFactory = responseStoreFactory && Object.prototype.hasOwnProperty.call(responseStoreFactory, 'default') ? responseStoreFactory['default'] : responseStoreFactory;\n download = download && Object.prototype.hasOwnProperty.call(download, 'default') ? download['default'] : download;\n states = states && Object.prototype.hasOwnProperty.call(states, 'default') ? states['default'] : states;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Overrides the qtiServiceProxy with the offline behavior\n * @extends taoQtiTest/runner/proxy/qtiServiceProxy\n */\n var proxy = _.defaults({\n name: 'offline',\n /**\n * Installs the proxy\n * @param {object} config\n */\n install: function install(config) {\n var self = this;\n const maxSyncAttempts = 3;\n\n // install the parent proxy\n qtiServiceProxy.install.call(this);\n\n // we keep items here\n this.itemStore = itemStoreFactory({\n preload: true,\n testId: config.serviceCallId\n });\n this.responseStore = responseStoreFactory();\n this.offlineNavigator = offlineNavigatorFactory(this.itemStore, this.responseStore);\n\n // where we keep actions\n this.actionStore = null;\n\n // configuration params, that comes on every request/params\n this.requestConfig = {};\n\n // scheduled action promises which supposed to be resolved after action synchronization.\n this.actionPromises = {};\n this.syncInProgress = false; // is data synchronization in progress\n\n // let's you update test data (testContext and testMap)\n this.dataUpdater = dataUpdater(this.getDataHolder());\n\n /**\n * Check whether we have the item in the store\n *\n * @param {String} itemIdentifier - the item identifier\n * @returns {Boolean}\n */\n this.hasItem = function hasItem(itemIdentifier) {\n return itemIdentifier && self.itemStore.has(itemIdentifier);\n };\n\n /**\n * Check whether we have the next item in the store\n *\n * @param {String} itemIdentifier - the CURRENT item identifier\n * @returns {Boolean}\n */\n this.hasNextItem = function hasNextItem(itemIdentifier) {\n var sibling = navigationHelper.getNextItem(this.getDataHolder().get('testMap'), itemIdentifier);\n return sibling && self.hasItem(sibling.id);\n };\n\n /**\n * Check whether we have the previous item in the store\n *\n * @param {String} itemIdentifier - the CURRENT item identifier\n * @returns {Boolean}\n */\n this.hasPreviousItem = function hasPreviousItem(itemIdentifier) {\n var sibling = navigationHelper.getPreviousItem(this.getDataHolder().get('testMap'), itemIdentifier);\n return sibling && self.hasItem(sibling.id);\n };\n\n /**\n * Offline navigation\n *\n * @param {String} action - the action name (ie. move, skip, timeout)\n * @param {Object} actionParams - the parameters sent along the action\n * @returns {Object} action result\n */\n this.offlineAction = function offlineAction(action, actionParams) {\n return new Promise(function (resolve, reject) {\n var result = {\n success: true\n };\n var blockingActions = ['exitTest', 'timeout', 'pause'];\n var dataHolder = self.getDataHolder();\n var testContext = dataHolder.get('testContext');\n var testMap = dataHolder.get('testMap');\n var isLast = testContext && testMap ? navigationHelper.isLast(testMap, testContext.itemIdentifier) : false;\n var isOffline = self.isOffline();\n var isBlocked = _.contains(blockingActions, action);\n var isNavigationAction = actionParams.direction === 'next' || action === 'skip';\n var isDirectionDefined;\n var isMeaningfullScope = !!actionParams.scope;\n\n /***\n * performs navigation trough items of given test parameters according to action parameters\n * doesent need active internet connection\n * @param navigator - navigator helper used with this proxy\n * @param {Object} options - options to manage the navigation\n * @param {Object} options.testContext - current test testContext dataset\n * @param {Object} results - navigtion result output object\n */\n var navigate = function (navigator, options, results) {\n var newTestContext;\n navigator.setTestContext(options.testContext).setTestMap(options.testMap).navigate(actionParams.direction, actionParams.scope, actionParams.ref, actionParams).then(function (res) {\n newTestContext = res;\n if (!newTestContext || !newTestContext.itemIdentifier || !self.hasItem(newTestContext.itemIdentifier)) {\n throw offlineErrorHelper.buildErrorFromContext(offlineErrorHelper.getOfflineNavError());\n }\n results.testContext = newTestContext;\n resolve(results);\n }).catch(function (err) {\n reject(err);\n });\n };\n if (action === 'skip') {\n actionParams.direction = action;\n }\n isDirectionDefined = !!actionParams.direction;\n if (isBlocked || isNavigationAction && isLast) {\n // the last item of the test\n result.testContext = {\n state: states.testSession.closed\n };\n const offlineSync = function () {\n offlineSyncModal(self).on('proceed', function () {\n self.syncData().then(function () {\n // if is online resolve promise\n if (self.isOnline()) {\n return resolve(result);\n }\n }).catch(function () {\n return resolve({\n success: false\n });\n });\n }).on('secondaryaction', function () {\n self.initiateDownload().catch(function () {\n return resolve({\n success: false\n });\n });\n });\n };\n if (isOffline) {\n return offlineSync();\n } else {\n return self.syncData().then(function () {\n if (self.isOffline()) {\n // in case last request was failed and connection lost\n // show offlineWaitingDialog\n return offlineSync();\n }\n return resolve(result);\n }).catch(function () {\n return resolve({\n success: false\n });\n });\n }\n } else if (isDirectionDefined && isMeaningfullScope) {\n //navigation actions\n if (isOffline) {\n navigate(self.offlineNavigator, {\n testContext: testContext,\n testMap: testMap\n }, result);\n } else {\n return self.syncData().then(function () {\n navigate(self.offlineNavigator, {\n testContext: testContext,\n testMap: testMap\n }, result);\n }).catch(function () {\n return resolve({\n success: false\n });\n });\n }\n } else {\n //common behaviour\n resolve(result);\n }\n });\n };\n\n /**\n * Schedule an action do be done with next call\n *\n * @param {String} action - the action name (ie. move, skip, timeout)\n * @param {Object} actionParams - the parameters sent along the action\n * @returns {Promise} resolves with the action data\n */\n this.scheduleAction = function scheduleAction(action, actionParams) {\n actionParams = _.assign(actionParams, {\n actionId: `${action}_${new Date().getTime()}`,\n offline: true\n });\n return self.actionStore.push(action, self.prepareParams(_.defaults(actionParams || {}, self.requestConfig))).then(function () {\n return {\n action: action,\n params: actionParams\n };\n });\n };\n\n /**\n * Try to sync data until reached max attempts\n *\n * @param {Object} data - sync payload\n * @param {Number} attempt - current attempt\n * @returns {Promise} resolves with the action result\n */\n this.sendSyncData = function sendSyncData(data) {\n let attempt = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n return new Promise((resolve, reject) => self.send('sync', data).then(resolve).catch(err => {\n if (self.isConnectivityError(err) && attempt < maxSyncAttempts) {\n return self.sendSyncData(data, attempt + 1).then(resolve).catch(reject);\n }\n return reject(err);\n }));\n };\n\n /**\n * Flush and synchronize actions collected while offline\n *\n * @returns {Promise} resolves with the action result\n */\n this.syncData = function syncData() {\n var actions;\n this.syncInProgress = true;\n return this.queue.serie(function () {\n return self.actionStore.flush().then(function (data) {\n actions = data;\n if (data && data.length) {\n return self.sendSyncData(data);\n }\n }).catch(function (err) {\n if (self.isConnectivityError(err)) {\n self.setOffline('communicator');\n _.forEach(actions, function (action) {\n self.actionStore.push(action.action, action.parameters, action.timestamp);\n });\n return;\n }\n self.syncInProgress = false;\n self.trigger('error', err);\n throw err;\n }).then(data => {\n self.syncInProgress = false;\n return data;\n });\n });\n };\n this.prepareDownload = function prepareDownload(actions) {\n const timestamp = Date.now();\n const dateTime = new Date(timestamp).toISOString();\n\n //@deprecated\n const testData = self.getDataHolder().get('testData');\n const testMap = self.getDataHolder().get('testMap');\n const niceFilename = `Download of ${testMap.title} at ${dateTime}.json`;\n const isExitTest = actions.some(elem => elem.action === 'exitTest');\n return {\n filename: niceFilename,\n content: JSON.stringify({\n isExitTest: isExitTest,\n timestamp: timestamp,\n testData: testData,\n actionQueue: actions,\n testConfig: self.requestConfig\n })\n };\n };\n this.initiateDownload = function initiateDownload() {\n return this.queue.serie(function () {\n return self.actionStore.flush().then(function (actions) {\n _.forEach(actions, function (action) {\n self.actionStore.push(action.action, action.parameters, action.timestamp);\n });\n return actions;\n }).then(self.prepareDownload).then(function (data) {\n return download(data.filename, data.content);\n });\n });\n };\n },\n /**\n * Initializes the proxy\n *\n * @param {Object} config - The config provided to the proxy factory\n * @param {String} config.testDefinition - The URI of the test\n * @param {String} config.testCompilation - The URI of the compiled delivery\n * @param {String} config.serviceCallId - The URI of the service call\n * @param {Object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The proxy will be fully initialized on resolve.\n * Any error will be provided if rejected.\n */\n init: function init(config, params) {\n var self = this;\n\n // run the init\n var InitCallPromise = qtiServiceProxy.init.call(this, config, params);\n if (!this.getDataHolder()) {\n throw new Error('Unable to retrieve test runners data holder');\n }\n\n // those needs to be in each request params.\n this.requestConfig = _.pick(config, ['testDefinition', 'testCompilation', 'serviceCallId']);\n\n // set up the action store for the current service call\n this.actionStore = actionStoreFactory(config.serviceCallId);\n\n // stop error event propagation if sync is in progress\n this.before('error', (e, error) => {\n if (self.isConnectivityError(error) && self.syncInProgress) {\n return false;\n }\n return true;\n });\n return InitCallPromise.then(function (response) {\n var promises = [];\n if (!response.items) {\n response.items = {};\n }\n self.itemStore.setCacheSize(_.size(response.items));\n _.forEach(response.items, function (item, itemIdentifier) {\n promises.push(self.itemStore.set(itemIdentifier, item));\n });\n return Promise.all(promises).then(() => {\n return self.offlineNavigator.setTestContext(response.testContext).setTestMap(response.testMap).init();\n }).then(() => response);\n });\n },\n /**\n * Uninstalls the proxy\n *\n * @returns {Promise} - Returns a promise. The proxy will be fully uninstalled on resolve.\n * Any error will be provided if rejected.\n */\n destroy: function destroy() {\n var self = this;\n return this.itemStore.clear().then(function () {\n return qtiServiceProxy.destroy.call(self);\n });\n },\n /**\n * Gets an item definition by its identifier, also gets its current state\n *\n * @param {String} itemIdentifier\n * @returns {Promise} - Returns a promise. The item data will be provided on resolve.\n * Any error will be provided if rejected.\n */\n getItem: function getItem(itemIdentifier) {\n return this.itemStore.get(itemIdentifier);\n },\n /**\n * Submits the state and the response of a particular item\n *\n * @param {String} itemIdentifier - The identifier of the item to update\n * @param {Object} state - The state to submit\n * @param {Object} response - The response object to submit\n * @param {Object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n */\n submitItem: function submitItem(itemIdentifier, state, response, params) {\n var self = this;\n return this.itemStore.update(itemIdentifier, 'itemState', state).then(function () {\n return qtiServiceProxy.submitItem.call(self, itemIdentifier, state, response, params);\n });\n },\n /**\n * Sends the test variables\n *\n * @param {Object} variables\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n * @fires sendVariables\n */\n sendVariables: function sendVariables(variables) {\n var self = this,\n action = 'storeTraceData',\n actionParams = {\n traceData: JSON.stringify(variables)\n };\n return self.scheduleAction(action, actionParams).then(function () {\n return self.offlineAction(action, actionParams);\n }).catch(function (err) {\n return Promise.reject(err);\n });\n },\n /**\n * Calls an action related to the test\n *\n * @param {String} action - The name of the action to call\n * @param {Object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n */\n callTestAction: function callTestAction(action, params) {\n var self = this;\n return self.scheduleAction(action, params).then(function () {\n return self.offlineAction(action, params);\n }).catch(function (err) {\n return Promise.reject(err);\n });\n },\n /**\n * Calls an action related to a particular item\n *\n * @param {String} itemIdentifier - The identifier of the item for which call the action\n * @param {String} action - The name of the action to call\n * @param {Object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n */\n callItemAction: function callItemAction(itemIdentifier, action, params) {\n var self = this,\n updateStatePromise = Promise.resolve();\n\n //update the item state\n if (params.itemState) {\n updateStatePromise = this.itemStore.update(itemIdentifier, 'itemState', params.itemState);\n }\n\n // If item action is move to another item ensure the next request will start the timer\n if (navigationHelper.isMovingToNextItem(action, params) || navigationHelper.isMovingToPreviousItem(action, params) || navigationHelper.isJumpingToItem(action, params)) {\n params.start = true;\n }\n return updateStatePromise.then(function () {\n params = _.assign({\n itemDefinition: itemIdentifier\n }, params);\n return self.scheduleAction(action, params).then(function () {\n return self.offlineAction(action, params);\n }).catch(function (err) {\n return Promise.reject(err);\n });\n }).catch(function (err) {\n return Promise.reject(err);\n });\n }\n }, qtiServiceProxy);\n\n return proxy;\n\n});\n\n","\n(function(c){var d=document,a='appendChild',i='styleSheet',s=d.createElement('style');s.type='text/css';d.getElementsByTagName('head')[0][a](s);s[i]?s[i].cssText=c:s[a](d.createTextNode(c));})\n('.qti-navigator-default{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;-o-flex-direction:column;flex-direction:column;padding:0;cursor:default;min-width:calc(18rem - 8px);height:100%;position:relative}.qti-navigator-default span{display:inline-block}.qti-navigator-default .collapsed .collapsible-panel{display:none !important}.qti-navigator-default .collapsed .qti-navigator-label .icon-up{display:none}.qti-navigator-default .collapsed .qti-navigator-label .icon-down{display:inline-block}.qti-navigator-default .collapsible>.qti-navigator-label,.qti-navigator-default .qti-navigator-item>.qti-navigator-label{cursor:pointer}.qti-navigator-default.scope-test-section .qti-navigator-part>.qti-navigator-label{display:none !important}.qti-navigator-default .qti-navigator-label{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;min-width:calc(100% - 12px);padding:0 6px;line-height:3rem}.qti-navigator-default .qti-navigator-label .icon-up,.qti-navigator-default .qti-navigator-label .icon-down{line-height:3rem;margin-left:auto}.qti-navigator-default .qti-navigator-label .icon-down{display:none}.qti-navigator-default .qti-navigator-label .qti-navigator-number{display:none}.qti-navigator-default .qti-navigator-icon,.qti-navigator-default .icon{position:relative;top:1px;display:inline-block;line-height:2.8rem;margin-right:.5rem}.qti-navigator-default .unseen .qti-navigator-icon{cursor:default}.qti-navigator-default.prevents-unseen:not(.skipahead-enabled) .unseen .qti-navigator-icon,.qti-navigator-default.prevents-unseen:not(.skipahead-enabled) .unseen .qti-navigator-label{cursor:not-allowed !important}.qti-navigator-default .icon-answered:before{content:\\\"\\\"}.qti-navigator-default .icon-viewed:before{content:\\\"\\\"}.qti-navigator-default .icon-flagged:before{content:\\\"\\\"}.qti-navigator-default .icon-unanswered:before,.qti-navigator-default .icon-unseen:before{content:\\\"\\\"}.qti-navigator-default .qti-navigator-counter{text-align:right;margin-left:auto;font-size:12px;font-size:1.2rem}.qti-navigator-default .qti-navigator-actions{text-align:center}.qti-navigator-default .qti-navigator-info.collapsed{height:calc(3rem + 1px)}.qti-navigator-default .qti-navigator-info{height:calc(5*(3rem + 1px));overflow:hidden}.qti-navigator-default .qti-navigator-info>.qti-navigator-label{min-width:calc(100% - 16px);padding:0 8px}.qti-navigator-default .qti-navigator-info ul{padding:0 4px}.qti-navigator-default .qti-navigator-info ul .qti-navigator-label span.qti-navigator-text{padding:0 6px;min-width:10rem}.qti-navigator-default .qti-navigator-info ul .qti-navigator-label span.qti-navigator-icon{min-width:1.5rem}.qti-navigator-default .qti-navigator-info ul .qti-navigator-label span.qti-navigator-counter{min-width:5rem}.qti-navigator-default .qti-navigator-filters{margin-top:1rem;text-align:center;width:15rem;height:calc(3rem + (2 * 1px))}.qti-navigator-default .qti-navigator-filters ul{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch}.qti-navigator-default .qti-navigator-filters li{display:block}.qti-navigator-default .qti-navigator-filters li .qti-navigator-tab{border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px;border-left:none;line-height:3rem;min-width:5rem;cursor:pointer;white-space:nowrap}.qti-navigator-default .qti-navigator-tree{-webkit-flex:1;-moz-flex:1;-ms-flex:1;-o-flex:1;flex:1;overflow-y:auto}.qti-navigator-default .qti-navigator-linear,.qti-navigator-default .qti-navigator-linear-part{padding:8px}.qti-navigator-default .qti-navigator-linear .icon,.qti-navigator-default .qti-navigator-linear-part .icon{display:none}.qti-navigator-default .qti-navigator-linear .qti-navigator-label,.qti-navigator-default .qti-navigator-linear-part .qti-navigator-label{font-size:14px;font-size:1.4rem}.qti-navigator-default .qti-navigator-linear .qti-navigator-title,.qti-navigator-default .qti-navigator-linear-part .qti-navigator-title{font-size:14px;font-size:1.4rem;margin:8px 0}.qti-navigator-default .qti-navigator-linear .qti-navigator-message,.qti-navigator-default .qti-navigator-linear-part .qti-navigator-message{font-size:14px;font-size:1.4rem}.qti-navigator-default .qti-navigator-part>.qti-navigator-label{padding:0 8px}.qti-navigator-default .qti-navigator-part:not(:first-child){margin-top:1px}.qti-navigator-default .qti-navigator-section>.qti-navigator-label{padding:0 8px}.qti-navigator-default .qti-navigator-item{margin:1px 0;padding-left:10px}.qti-navigator-default .qti-navigator-item:first-child{margin-top:0}.qti-navigator-default .qti-navigator-item.disabled>.qti-navigator-label{cursor:not-allowed}.qti-navigator-default .qti-navigator-collapsible{cursor:pointer;text-align:center;display:none;position:absolute;top:0;bottom:0;right:0;padding-top:50%}.qti-navigator-default .qti-navigator-collapsible .icon{font-size:20px;font-size:2rem;width:1rem !important;height:2rem !important}.qti-navigator-default .qti-navigator-collapsible .qti-navigator-expand{display:none}.qti-navigator-default.collapsible{padding-right:calc(1rem + 10px) !important}.qti-navigator-default.collapsible .qti-navigator-collapsible{display:block}.qti-navigator-default.collapsed{width:calc(8rem + 1rem + 10px);min-width:8rem}.qti-navigator-default.collapsed ul{padding:0 !important}.qti-navigator-default.collapsed .qti-navigator-text,.qti-navigator-default.collapsed .qti-navigator-info>.qti-navigator-label,.qti-navigator-default.collapsed .qti-navigator-part>.qti-navigator-label,.qti-navigator-default.collapsed .qti-navigator-section>.qti-navigator-label,.qti-navigator-default.collapsed .qti-navigator-message{display:none !important}.qti-navigator-default.collapsed .qti-navigator-label{padding:0 2px !important;width:calc(8rem - 4px);min-width:calc(8rem - 4px)}.qti-navigator-default.collapsed .qti-navigator-icon,.qti-navigator-default.collapsed .icon{width:auto}.qti-navigator-default.collapsed .qti-navigator-counter{margin-left:0;min-width:4rem !important}.qti-navigator-default.collapsed .qti-navigator-collapsible .qti-navigator-collapse{display:none}.qti-navigator-default.collapsed .qti-navigator-collapsible .qti-navigator-expand{display:block}.qti-navigator-default.collapsed .qti-navigator-info{height:calc(4*(3rem + 1px))}.qti-navigator-default.collapsed .qti-navigator-info.collapsed .collapsible-panel{display:block !important}.qti-navigator-default.collapsed .qti-navigator-filters{width:calc(8rem - 16px)}.qti-navigator-default.collapsed .qti-navigator-filter span{display:none}.qti-navigator-default.collapsed .qti-navigator-filter.active span{display:block;border:0 none;width:calc(8rem - 16px)}.qti-navigator-default.collapsed .qti-navigator-item,.qti-navigator-default.collapsed .qti-navigator-linear,.qti-navigator-default.collapsed .qti-navigator-linear-part{padding-left:2px;text-align:center}.qti-navigator-default.collapsed .qti-navigator-item{overflow:hidden}.qti-navigator-default.collapsed .qti-navigator-item .qti-navigator-icon{padding-left:6px;width:2rem}.qti-navigator-default.collapsed .qti-navigator-item .qti-navigator-number{display:inline-block;margin-left:6px;margin-right:8rem}.qti-navigator-default.collapsed .qti-navigator-linear,.qti-navigator-default.collapsed .qti-navigator-linear-part{padding:0 0 8px 0}.qti-navigator-default.collapsed .qti-navigator-linear .icon,.qti-navigator-default.collapsed .qti-navigator-linear-part .icon{display:block}.qti-navigator-default.collapsed .qti-navigator-actions button{padding:0 9px 0 5px}.qti-navigator-default .qti-navigator-info>.qti-navigator-label{background-color:#d4d5d7;color:#222;border-top:1px solid #d4d5d7}.qti-navigator-default .qti-navigator-info li{border-bottom:1px solid #fff}.qti-navigator-default .qti-navigator-filter .qti-navigator-tab{background-color:#fff}.qti-navigator-default .qti-navigator-filter .qti-navigator-tab:hover{background-color:#3e7da7;color:#fff}.qti-navigator-default .qti-navigator-filter.active .qti-navigator-tab{background-color:#a4a9b1;color:#fff}.qti-navigator-default .qti-navigator-linear,.qti-navigator-default .qti-navigator-linear-part{background:#fff}.qti-navigator-default .qti-navigator-part>.qti-navigator-label{background-color:#dddfe2}.qti-navigator-default .qti-navigator-part>.qti-navigator-label:hover{background-color:#c6cacf}.qti-navigator-default .qti-navigator-part.active>.qti-navigator-label{background-color:#c0c4ca}.qti-navigator-default .qti-navigator-section>.qti-navigator-label{border-bottom:1px solid #fff}.qti-navigator-default .qti-navigator-section>.qti-navigator-label:hover{background-color:#ebe8e4}.qti-navigator-default .qti-navigator-section.active>.qti-navigator-label{background-color:#ded9d4}.qti-navigator-default .qti-navigator-item{background:#fff}.qti-navigator-default .qti-navigator-item.active{background:#0e5d91;color:#fff}.qti-navigator-default .qti-navigator-item:hover{background:#0a3f62;color:#fff}.qti-navigator-default .qti-navigator-item.disabled{background-color:#e2deda !important}.qti-navigator-default .qti-navigator-collapsible{background-color:#dfe1e4;color:#222}.qti-navigator-default .qti-navigator-collapsible .icon{color:#fff}.qti-navigator-fizzy{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;-o-flex-direction:column;flex-direction:column;cursor:default;min-width:calc(18rem - 8px);height:100%;position:relative;background-color:#f2f2f2 !important;width:30rem}.qti-navigator-fizzy .qti-navigator-tree{overflow-y:auto;max-height:100%;display:block;background:none;margin:0 5px}.qti-navigator-fizzy .qti-navigator-linear{padding:8px;margin:0 5px;background:#fff}.qti-navigator-fizzy .qti-navigator-linear .qti-navigator-message{font-size:14px;font-size:1.4rem}.qti-navigator-fizzy .qti-navigator-section{display:block}.qti-navigator-fizzy .qti-navigator-section .qti-navigator-label{background-color:initial;border:none;padding:0;line-height:initial;margin:13px 0 10px 0;font-size:15px;font-size:1.5rem}.qti-navigator-fizzy .qti-navigator-header{display:flex;justify-content:space-between;border-bottom:1px solid #cec7bf;padding:15px 0 5px 0;margin:0 5px;line-height:initial}.qti-navigator-fizzy .qti-navigator-header .qti-navigator-text{font-size:20px;font-size:2rem;font-weight:bold}.qti-navigator-fizzy .qti-navigator-header .icon-close{font-size:28px;font-size:2.8rem;line-height:3rem;color:#1f1f1f}.qti-navigator-fizzy .qti-navigator-header .icon-close:hover{color:#1f1f1f;text-decoration:none;cursor:pointer}.document-viewer-plugin{position:relative}.document-viewer-plugin .viewer-overlay{position:fixed;top:0;left:0;bottom:0;right:0;z-index:10000;width:100%;opacity:.5;background-color:#e4ecef}.document-viewer-plugin .viewer-panel{position:fixed;top:10px;left:10px;bottom:10px;right:10px;z-index:100000;color:#222;background:#f3f1ef;font-size:14px;font-size:1.4rem;border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px}.document-viewer-plugin .viewer-header{position:relative;width:100%;height:30px;padding:5px 0;z-index:1}.document-viewer-plugin .viewer-header .viewer-title{font-size:15px;font-size:1.5rem;padding:0;margin:0 0 0 1.6rem}.document-viewer-plugin .viewer-header .icon{float:right;font-size:20px;font-size:2rem;color:#266d9c;margin:1px 6px;top:3px}.document-viewer-plugin .viewer-header .icon:hover{cursor:pointer;opacity:.75}.document-viewer-plugin .viewer-content{padding:0 20px;margin-top:4px;position:relative;height:calc(100% - 40px);overflow:auto}.qti-choiceInteraction.maskable .qti-choice .answer-mask{position:absolute;top:0;right:0;height:100%;padding:5px 10px 0 10px;z-index:10;color:#0e5d91;border:solid 1px #222;background-color:#c8d6dc;text-align:right;vertical-align:middle}.qti-choiceInteraction.maskable .qti-choice .answer-mask:hover{color:#568eb2}.qti-choiceInteraction.maskable .qti-choice .answer-mask .answer-mask-toggle:before{font-family:\\\"tao\\\" !important;speak:never;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:\\\"\\\"}.qti-choiceInteraction.maskable .qti-choice .label-content{padding-right:40px}.qti-choiceInteraction.maskable .qti-choice.masked .answer-mask{width:100%}.qti-choiceInteraction.maskable .qti-choice.masked .answer-mask .answer-mask-toggle:before{font-family:\\\"tao\\\" !important;speak:never;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:\\\"\\\"}.qti-choiceInteraction.maskable .qti-choice.masked .answer-mask:hover{background-color:#d2dde2}.mask-container.mask-container{background-color:rgba(0,0,0,0)}.mask-container.mask-container .dynamic-component-title-bar{border-top-left-radius:5px;border-top-right-radius:5px;background-color:rgba(0,0,0,0);border:none;position:absolute;width:100%;z-index:1}.mask-container.mask-container .dynamic-component-title-bar.moving{background:#f3f1ef;border-bottom:1px solid #8d949e}.mask-container.mask-container .dynamic-component-title-bar .closer{display:none}.mask-container.mask-container .dynamic-component-resize-container .dynamic-component-resize-wrapper{bottom:0}.mask-container.mask-container .dynamic-component-resize-container .dynamic-component-resize-wrapper:hover,.mask-container.mask-container .dynamic-component-resize-container .dynamic-component-resize-wrapper.resizing{bottom:20px}.mask-container.mask-container .dynamic-component-content .mask{position:absolute;width:100%;height:100%;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;background:rgba(0,0,0,0);opacity:1}.mask-container.mask-container .dynamic-component-content .mask .inner{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;position:relative;width:100%;height:100%;background-color:#fff;opacity:1;box-sizing:content-box;padding-bottom:30px}.mask-container.mask-container .dynamic-component-content .mask .controls{background:#f3f1ef;position:absolute;top:0;right:0;padding:0 5px 0 10px;border-radius:5px;border-top-left-radius:0;border-bottom-right-radius:0;border-bottom:1px solid #8d949e;border-left:1px solid #8d949e;height:30px;z-index:2}.mask-container.mask-container .dynamic-component-content .mask .controls a{text-decoration:none;margin-right:5px;vertical-align:middle}.mask-container.mask-container .dynamic-component-content .mask .controls a:hover{color:#0a4166}.mask-container.mask-container .dynamic-component-content .mask .controls .view{font-size:20px;font-size:2rem}.mask-container.mask-container .dynamic-component-content .mask .controls .close{font-size:20px;font-size:2rem}.mask-container.mask-container .dynamic-component-content.moving .mask .inner{border-color:rgba(14,93,145,.5);opacity:.55}.mask-container.mask-container .dynamic-component-content.moving .mask .controls{border-left:none;border-bottom-left-radius:0;z-index:2}.mask-container.mask-container .dynamic-component-content.sizing .mask{border-color:rgba(14,93,145,.5)}.mask-container.mask-container .dynamic-component-content.sizing .mask .inner{opacity:.55}.mask-container.mask-container .dynamic-component-content.sizing .mask .controls{background-color:rgba(0,0,0,0);border-bottom:none;border-left:none}.mask-container.mask-container.previewing .dynamic-component-content .mask .inner{opacity:.15;-webkit-transition:opacity, 600ms, ease, 0s;-moz-transition:opacity, 600ms, ease, 0s;-ms-transition:opacity, 600ms, ease, 0s;-o-transition:opacity, 600ms, ease, 0s;transition:opacity, 600ms, ease, 0s}.mask-container.mask-container.previewing .dynamic-component-content .mask .controls{background-color:rgba(0,0,0,0);border-bottom:none;border-left:none}.connectivity-box{display:none;width:40px;margin-left:40px}.connectivity-box.with-message{width:60px}.connectivity-box .icon-connect,.connectivity-box .icon-disconnect{display:none;line-height:2;font-size:16px;font-size:1.6rem;text-shadow:0 1px 0 rgba(0,0,0,.9)}.connectivity-box .message-connect,.connectivity-box .message-disconnected{display:none;font-size:14px;font-size:1.4rem;text-shadow:none;margin-right:3px}.connectivity-box.connected,.connectivity-box.disconnected{display:inline-block}.connectivity-box.connected .icon-connect,.connectivity-box.connected .message-connect{display:inline-block}.connectivity-box.disconnected .icon-disconnect,.connectivity-box.disconnected .message-disconnected{display:inline-block}.line-reader-mask{box-sizing:border-box;border:0 solid #0e5d91;background-color:#f3f7fa}.line-reader-mask.hidden{display:none}.line-reader-mask.resizing{background-color:rgba(243,247,250,.8);border-color:rgba(14,93,145,.5)}.line-reader-mask.resizer{z-index:99999 !important}.line-reader-mask.resizer.se .resize-control{border-right:2px solid #0e5d91;border-bottom:2px solid #0e5d91;width:40px;height:40px}.line-reader-mask.border-top{border-top-width:1px}.line-reader-mask.border-right{border-right-width:1px}.line-reader-mask.border-bottom{border-bottom-width:1px}.line-reader-mask.border-left{border-left-width:1px}.line-reader-mask.ne{-webkit-border-top-right-radius:5px;-moz-border-radius-topright:5px;border-top-right-radius:5px}.line-reader-mask.se{-webkit-border-bottom-right-radius:5px;-moz-border-radius-bottomright:5px;border-bottom-right-radius:5px}.line-reader-mask.sw{-webkit-border-bottom-left-radius:5px;-moz-border-radius-bottomleft:5px;border-bottom-left-radius:5px}.line-reader-mask.nw{-webkit-border-top-left-radius:5px;-moz-border-radius-topleft:5px;border-top-left-radius:5px}.line-reader-mask.se .resize-control{width:20px;height:20px;margin-bottom:10px;margin-right:10px;border-right:1px solid #0e5d91;border-bottom:1px solid #0e5d91;position:absolute;right:0;bottom:0;cursor:nwse-resize}.line-reader-mask.e .resize-control{position:absolute;width:20px;height:20px;bottom:-10px;left:-10px;border-right:1px solid #0e5d91;border-bottom:1px solid #0e5d91;cursor:nesw-resize}.line-reader-mask.s .resize-control{position:absolute;width:20px;height:10px;right:-10px;border-bottom:1px solid #0e5d91}.line-reader-overlay{box-sizing:border-box;opacity:0}.line-reader-overlay.hidden{display:none}.line-reader-overlay.moving{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.line-reader-overlay.moving.n{max-height:none}.line-reader-overlay.moving,.line-reader-overlay .inner-window{overflow:hidden;position:absolute;opacity:1;background-color:rgba(0,0,0,0);border:1px solid rgba(14,93,145,.5)}.line-reader-overlay .inner-window{box-sizing:content-box}.line-reader-overlay .mask-bg{box-sizing:border-box;border:0 solid rgba(243,247,250,.8);background-color:rgba(0,0,0,0);position:absolute}.line-reader-overlay.n{max-height:30px;opacity:1}.line-reader-overlay.n .icon-mobile-menu{font-size:22px;font-size:2.2rem;display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;-o-justify-content:center;justify-content:center;border-bottom:1px solid #0e5d91;color:#0e5d91;position:absolute;left:0;top:0;height:30px;width:100%;z-index:1}.line-reader-overlay.n .icon-mobile-menu:hover{color:#0a4166}.line-reader-overlay.n .icon-mobile-menu:before{position:relative;top:3px}.line-reader-overlay .icon-mobile-menu{display:none}.line-reader-inner-drag{-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;-o-justify-content:center;justify-content:center;text-align:center;padding-top:3px;color:#0e5d91}.line-reader-inner-drag.hidden{display:none}.line-reader-inner-drag:hover{background-color:#87aec8;color:#0a4166}.line-reader-inner-drag.moving{background-color:rgba(0,0,0,0);color:#9fbed3}.line-reader-inner-drag .icon{text-shadow:none !important;border-bottom-left-radius:110px;border-bottom-right-radius:110px;border:1px solid #0e5d91;border-top:0;width:50px;height:25px;position:relative;bottom:10px}.line-reader-inner-drag .icon:before{position:relative;top:5px;left:1px}.line-reader-closer{font-size:22px;font-size:2.2rem;cursor:pointer;color:#0e5d91;width:12px;height:12px}.line-reader-closer:hover{color:#0a4166}.line-reader-closer .icon{text-shadow:none !important}.magnifier-container.magnifier-container{background-color:rgba(0,0,0,0)}.magnifier-container.magnifier-container .dynamic-component-title-bar{border-top-left-radius:5px;border-top-right-radius:5px;background-color:rgba(0,0,0,0);border:none;position:absolute;width:100%;z-index:3}.magnifier-container.magnifier-container .dynamic-component-title-bar.moving{background:#f3f1ef;border-bottom:1px solid #8d949e}.magnifier-container.magnifier-container .dynamic-component-title-bar .closer{display:none}.magnifier-container.magnifier-container .dynamic-component-resize-container .dynamic-component-resize-wrapper{bottom:0}.magnifier-container.magnifier-container .dynamic-component-resize-container .dynamic-component-resize-wrapper:hover,.magnifier-container.magnifier-container .dynamic-component-resize-container .dynamic-component-resize-wrapper.resizing{bottom:20px}.magnifier-container.magnifier-container .dynamic-component-content .magnifier{position:absolute;width:100%;height:100%;overflow:hidden;background-color:#fff;opacity:1;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;box-sizing:content-box;padding-bottom:30px}@-o-keyframes fadeIn{0%{opacity:0;visibility:visible}100%{opacity:1;visibility:visible}}@-moz-keyframes fadeIn{0%{opacity:0;visibility:visible}100%{opacity:1;visibility:visible}}@-webkit-keyframes fadeIn{0%{opacity:0;visibility:visible}100%{opacity:1;visibility:visible}}@keyframes fadeIn{0%{opacity:0;visibility:visible}100%{opacity:1;visibility:visible}}@-o-keyframes fadeOut{0%{opacity:1;visibility:visible}100%{opacity:0;visibility:hidden}}@-moz-keyframes fadeOut{0%{opacity:1;visibility:visible}100%{opacity:0;visibility:hidden}}@-webkit-keyframes fadeOut{0%{opacity:1;visibility:visible}100%{opacity:0;visibility:hidden}}@keyframes fadeOut{0%{opacity:1;visibility:visible}100%{opacity:0;visibility:hidden}}@-o-keyframes pop{0%{opacity:0;visibility:visible}50%{opacity:.5;visibility:visible;transform:scale(2)}100%{opacity:0;visibility:hidden;transform:scale(3)}}@-moz-keyframes pop{0%{opacity:0;visibility:visible}50%{opacity:.5;visibility:visible;transform:scale(2)}100%{opacity:0;visibility:hidden;transform:scale(3)}}@-webkit-keyframes pop{0%{opacity:0;visibility:visible}50%{opacity:.5;visibility:visible;transform:scale(2)}100%{opacity:0;visibility:hidden;transform:scale(3)}}@keyframes pop{0%{opacity:0;visibility:visible}50%{opacity:.5;visibility:visible;transform:scale(2)}100%{opacity:0;visibility:hidden;transform:scale(3)}}.magnifier-container.magnifier-container .dynamic-component-content .magnifier .level{position:absolute;overflow:hidden;z-index:1;top:0;left:0;bottom:0;right:0;background:rgba(0,0,0,0);color:#3e7da7;opacity:1;font-size:50px;font-size:5rem;display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;-o-justify-content:center;justify-content:center;-webkit-animation:pop 400ms forwards;-moz-animation:pop 400ms forwards;-ms-animation:pop 400ms forwards;-o-animation:pop 400ms forwards;animation:pop 400ms forwards}.magnifier-container.magnifier-container .dynamic-component-content .magnifier .level:before{content:\\\"x\\\"}.magnifier-container.magnifier-container .dynamic-component-content .magnifier .overlay{position:absolute;overflow:hidden;z-index:2;top:0;left:0;bottom:0;right:0;background:rgba(0,0,0,0)}.magnifier-container.magnifier-container .dynamic-component-content .magnifier>.controls{position:absolute;background-color:#f3f1ef;border:0 solid #8d949e;min-height:29px;z-index:4}.magnifier-container.magnifier-container .dynamic-component-content .magnifier>.controls a{color:#222;text-decoration:none;font-size:20px;font-size:2rem;margin:0 2px}.magnifier-container.magnifier-container .dynamic-component-content .magnifier>.controls a:hover{color:#0a4166}.magnifier-container.magnifier-container .dynamic-component-content .magnifier>.controls.close{top:0;right:0;border-bottom-width:1px;border-left-width:1px;-webkit-border-bottom-left-radius:5px;-moz-border-radius-bottomleft:5px;border-bottom-left-radius:5px}.magnifier-container.magnifier-container .dynamic-component-content .magnifier .inner{position:absolute}.magnifier-container.magnifier-container .dynamic-component-content.moving .magnifier .controls{border-left:none;border-bottom-left-radius:0}.magnifier-container.magnifier-container .dynamic-component-content.sizing{border-color:rgba(14,93,145,.5)}.magnifier-container.magnifier-container .dynamic-component-content.sizing .inner,.magnifier-container.magnifier-container .dynamic-component-content.sizing .controls,.magnifier-container.magnifier-container .dynamic-component-content.sizing .level{opacity:.45 !important}.progress-box .progressbar .progressbar-points{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch}.progress-box .progressbar .progressbar-points>span.progressbar-point{flex:1;display:inline-block;border:1px solid #0e5d91;background-color:#f3f1ef;height:calc(1rem - 4px);margin:0 1px 0 0}.progress-box .progressbar .progressbar-points>span.progressbar-point:last-child{margin-right:0}.progress-box .progressbar .progressbar-points>span.progressbar-point.reached{background-color:#0e5d91}.progress-box .progressbar .progressbar-points>span.progressbar-point.current{background-color:#a4a9b1}.tts-container .tts-controls{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;background-color:#f3f1ef;-webkit-box-shadow:0 2px 3px 1px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 2px 3px 1px rgba(0, 0, 0, 0.2);-ms-box-shadow:0 2px 3px 1px rgba(0, 0, 0, 0.2);-o-box-shadow:0 2px 3px 1px rgba(0, 0, 0, 0.2);box-shadow:0 2px 3px 1px rgba(0, 0, 0, 0.2)}.tts-container .tts-controls .tts-control{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;-o-justify-content:center;justify-content:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;color:#222;height:100%;padding:6px 8.5px;text-decoration:none}.tts-container .tts-controls .tts-control .tts-control-label{padding-left:7.5px}.tts-container .tts-controls .tts-control .tts-icon{font-size:18px;text-align:center;width:18px}.tts-container .tts-controls .tts-control .icon-pause{display:none}.tts-container .tts-controls .tts-control.tts-control-drag{cursor:move}.tts-container .tts-controls .tts-control.tts-control-drag .tts-icon{color:#555}.tts-container .tts-controls .tts-control.tts-control-drag:hover{background-color:rgba(0,0,0,0)}.tts-container .tts-controls .tts-control:hover{background-color:#ddd8d2}.tts-container .tts-controls .tts-control-container{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch}.tts-container .tts-controls .tts-control-container .tts-slider-container{display:none}.tts-container .tts-controls .tts-control-container .tts-slider-container .tts-slider{margin:0 8.5px;width:80px}.tts-container.playing .tts-controls .tts-control .icon-pause{display:block}.tts-container.playing .tts-controls .tts-control .icon-play{display:none}.tts-container.sfhMode .tts-controls .tts-control.tts-control-mode{-webkit-box-shadow:inset 2px 2px 4px rgba(0, 0, 0, 0.2);-moz-box-shadow:inset 2px 2px 4px rgba(0, 0, 0, 0.2);-ms-box-shadow:inset 2px 2px 4px rgba(0, 0, 0, 0.2);-o-box-shadow:inset 2px 2px 4px rgba(0, 0, 0, 0.2);box-shadow:inset 2px 2px 4px rgba(0, 0, 0, 0.2);background-color:#ddd8d2}.tts-container.settings .tts-controls .tts-control-container .tts-slider-container{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center}.tts-container.settings .tts-controls .tts-control-container:last-child{-webkit-box-shadow:inset 2px 2px 4px rgba(0, 0, 0, 0.2);-moz-box-shadow:inset 2px 2px 4px rgba(0, 0, 0, 0.2);-ms-box-shadow:inset 2px 2px 4px rgba(0, 0, 0, 0.2);-o-box-shadow:inset 2px 2px 4px rgba(0, 0, 0, 0.2);box-shadow:inset 2px 2px 4px rgba(0, 0, 0, 0.2);background-color:#ddd8d2}.tts-container.settings .tts-controls .tts-control-container .tts-control-settings:hover{background-color:rgba(0,0,0,0)}.tts-content-node{outline:none}.tts-visible.tts-component-container .test-runner-sections .tts-content-node:hover,.tts-visible.tts-component-container .test-runner-sections .tts-content-node:focus{background-color:rgba(0,0,0,0) !important;color:#222 !important}.tts-visible.tts-component-container .test-runner-sections .tts-content-node .label-box,.tts-visible.tts-component-container .test-runner-sections .tts-content-node .qti-choice{cursor:default !important}.tts-sfhMode.tts-component-container .test-runner-sections{cursor:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxNHB4IiBoZWlnaHQ9IjE0cHgiIHZpZXdCb3g9IjAgMCAxNCAxNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT5Hcm91cCAyPC90aXRsZT4gICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+ICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9IkFydGJvYXJkIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjQuMDAwMDAwLCAtMTYuMDAwMDAwKSI+ICAgICAgICAgICAgPGcgaWQ9Ikdyb3VwLTIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIzLjAwMDAwMCwgMTUuMDAwMDAwKSI+ICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtQ29weS02IiB4PSIwIiB5PSIwIiB3aWR0aD0iMTYiIGhlaWdodD0iMTYiPjwvcmVjdD4gICAgICAgICAgICAgICAgPGcgaWQ9Imljb24tLy0xNi0vLWNoZXZyb24tYm90dG9tLWNvcHkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEuMDAwMDAwLCAyLjAwMDAwMCkiIGZpbGw9IiMyRDJEMkQiPiAgICAgICAgICAgICAgICAgICAgPHBvbHlnb24gaWQ9InN3YXAtaWNvbi1jb2xvciIgcG9pbnRzPSIwIDAgMCA4IDYgNCI+PC9wb2x5Z29uPiAgICAgICAgICAgICAgICA8L2c+ICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtQ29weSIgZmlsbD0iIzJEMkQyRCIgeD0iOSIgeT0iNSIgd2lkdGg9IjYiIGhlaWdodD0iMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLUNvcHktNCIgZmlsbD0iIzJEMkQyRCIgeD0iOSIgeT0iMSIgd2lkdGg9IjYiIGhlaWdodD0iMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLUNvcHktMiIgZmlsbD0iIzJEMkQyRCIgeD0iOSIgeT0iOSIgd2lkdGg9IjYiIGhlaWdodD0iMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLUNvcHktMyIgZmlsbD0iIzJEMkQyRCIgeD0iMSIgeT0iMTMiIHdpZHRoPSIxNCIgaGVpZ2h0PSIyIj48L3JlY3Q+ICAgICAgICAgICAgPC9nPiAgICAgICAgPC9nPiAgICA8L2c+PC9zdmc+) 0 32,auto !important}.tts-sfhMode.tts-component-container .test-runner-sections .tts-content-node.tts-active-content-node:hover{color:#222 !important;background-color:#ff0 !important}.tts-sfhMode.tts-component-container .test-runner-sections .tts-content-node:hover,.tts-sfhMode.tts-component-container .test-runner-sections .tts-content-node:focus{color:#222 !important;background-color:#f3f1ef !important}.tts-sfhMode.tts-component-container .test-runner-sections .tts-content-node .label-box,.tts-sfhMode.tts-component-container .test-runner-sections .tts-content-node .qti-choice{cursor:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxNHB4IiBoZWlnaHQ9IjE0cHgiIHZpZXdCb3g9IjAgMCAxNCAxNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT5Hcm91cCAyPC90aXRsZT4gICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+ICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9IkFydGJvYXJkIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjQuMDAwMDAwLCAtMTYuMDAwMDAwKSI+ICAgICAgICAgICAgPGcgaWQ9Ikdyb3VwLTIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIzLjAwMDAwMCwgMTUuMDAwMDAwKSI+ICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtQ29weS02IiB4PSIwIiB5PSIwIiB3aWR0aD0iMTYiIGhlaWdodD0iMTYiPjwvcmVjdD4gICAgICAgICAgICAgICAgPGcgaWQ9Imljb24tLy0xNi0vLWNoZXZyb24tYm90dG9tLWNvcHkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEuMDAwMDAwLCAyLjAwMDAwMCkiIGZpbGw9IiMyRDJEMkQiPiAgICAgICAgICAgICAgICAgICAgPHBvbHlnb24gaWQ9InN3YXAtaWNvbi1jb2xvciIgcG9pbnRzPSIwIDAgMCA4IDYgNCI+PC9wb2x5Z29uPiAgICAgICAgICAgICAgICA8L2c+ICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtQ29weSIgZmlsbD0iIzJEMkQyRCIgeD0iOSIgeT0iNSIgd2lkdGg9IjYiIGhlaWdodD0iMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLUNvcHktNCIgZmlsbD0iIzJEMkQyRCIgeD0iOSIgeT0iMSIgd2lkdGg9IjYiIGhlaWdodD0iMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLUNvcHktMiIgZmlsbD0iIzJEMkQyRCIgeD0iOSIgeT0iOSIgd2lkdGg9IjYiIGhlaWdodD0iMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLUNvcHktMyIgZmlsbD0iIzJEMkQyRCIgeD0iMSIgeT0iMTMiIHdpZHRoPSIxNCIgaGVpZ2h0PSIyIj48L3JlY3Q+ICAgICAgICAgICAgPC9nPiAgICAgICAgPC9nPiAgICA8L2c+PC9zdmc+) 0 32,auto !important}.tts-sfhMode.tts-component-container .test-runner-sections img.tts-content-node:hover,.tts-sfhMode.tts-component-container .test-runner-sections img.tts-content-node:focus{padding:5px}.tts-playing.tts-component-container .test-runner-sections .tts-content-node.tts-active-content-node,.tts-playing.tts-component-container .test-runner-sections .tts-content-node.tts-active-content-node *{color:#222 !important;background-color:#ff0 !important}.tts-playing.tts-component-container .test-runner-sections .tts-content-node.tts-active-content-node:hover,.tts-playing.tts-component-container .test-runner-sections .tts-content-node.tts-active-content-node *:hover{color:#222 !important;background-color:#ff0 !important}.tts-playing.tts-component-container .test-runner-sections img.tts-content-node.tts-active-content-node{padding:5px}body.delivery-scope{min-height:100vh;max-height:100vh;margin-bottom:0}.runner{position:relative}.qti-choiceInteraction .overlay-answer-eliminator{display:none}.test-runner-scope{position:relative;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:calc(100vh - 99px)}.test-runner-scope .landmark-title-hidden{width:1px;height:1px;overflow:hidden;position:absolute}.test-runner-scope .test-runner-sections{-webkit-flex:1 1 0%;-ms-flex:1 1 0%;flex:1 1 0%;overflow:hidden;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.test-runner-scope .test-sidebar{background:#f3f1ef;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;overflow-y:auto;max-width:350px}.test-runner-scope .test-sidebar>.qti-panel{max-width:350px;padding:10px}@media only screen and (max-device-width: 800px){.test-runner-scope .test-sidebar{max-width:200px}.test-runner-scope .test-sidebar>.qti-panel{max-width:200px}}@media only screen and (min-device-width: 800px)and (max-device-width: 1280px){.test-runner-scope .test-sidebar{max-width:250px}.test-runner-scope .test-sidebar>.qti-panel{max-width:250px}}@media only screen and (min-device-width: 1280px)and (max-device-width: 1440px){.test-runner-scope .test-sidebar{max-width:300px}.test-runner-scope .test-sidebar>.qti-panel{max-width:300px}}.test-runner-scope .test-sidebar-left{border-right:1px #ddd solid}.test-runner-scope .test-sidebar-right{border-left:1px #ddd solid}.test-runner-scope .content-wrapper{position:relative;-webkit-flex:1 1 0%;-ms-flex:1 1 0%;flex:1 1 0%;overflow:auto;padding:0}.test-runner-scope .content-wrapper .overlay{position:absolute;left:0;right:0;top:0;bottom:0;width:100%;opacity:.9}.test-runner-scope .content-wrapper .overlay-full{background-color:#fff;opacity:1}.test-runner-scope #qti-content{-webkit-overflow-scrolling:touch;max-width:1024px;width:100%;margin:auto}.test-runner-scope #qti-item{width:100%;min-width:100%;height:auto;overflow:visible}.test-runner-scope .qti-item{padding:30px}.test-runner-scope .size-wrapper{max-width:1280px;margin:auto;width:100%}.test-runner-scope #qti-rubrics{margin:auto;max-width:1024px;width:100%}.test-runner-scope #qti-rubrics .qti-rubricBlock{margin:20px 0}.test-runner-scope #qti-rubrics .hidden{display:none}.test-runner-scope .visible-hidden{position:absolute;overflow:hidden;height:1px;width:1px;word-wrap:normal}.no-controls .test-runner-scope{height:100vh}.test-runner-scope .action-bar.content-action-bar{padding:2px}.test-runner-scope .action-bar.content-action-bar li{margin:2px 0 0 10px;border:none}.test-runner-scope .action-bar.content-action-bar li.btn-info{padding-top:6px;height:36px;margin-top:0;border-bottom:solid 2px rgba(0,0,0,0);border-radius:0}.test-runner-scope .action-bar.content-action-bar li.btn-info.btn-group{border:none !important;overflow:hidden;padding:0}.test-runner-scope .action-bar.content-action-bar li.btn-info.btn-group a{float:left;margin:0 2px;padding:0 15px;border:1px solid rgba(255,255,255,.3);border-radius:0px;display:inline-block;height:inherit}.test-runner-scope .action-bar.content-action-bar li.btn-info.btn-group a:first-of-type{border-top-left-radius:3px;border-bottom-left-radius:3px;margin-left:0}.test-runner-scope .action-bar.content-action-bar li.btn-info.btn-group a:last-of-type{border-top-right-radius:3px;border-bottom-right-radius:3px;margin-right:0}.test-runner-scope .action-bar.content-action-bar li.btn-info.btn-group a:hover,.test-runner-scope .action-bar.content-action-bar li.btn-info.btn-group a.active{border-color:rgba(255,255,255,.8)}.test-runner-scope .action-bar.content-action-bar li.btn-info.btn-group a .no-label{padding-right:0}.test-runner-scope .action-bar.content-action-bar li.btn-info:hover,.test-runner-scope .action-bar.content-action-bar li.btn-info.active{border-bottom-color:rgba(255,255,255,.8)}.test-runner-scope .action-bar.content-action-bar li.btn-info:active,.test-runner-scope .action-bar.content-action-bar li.btn-info.active{background:#e7eff4;border-color:rgba(255,255,255,.8)}.test-runner-scope .action-bar.content-action-bar li.btn-info:active a,.test-runner-scope .action-bar.content-action-bar li.btn-info.active a{color:#266d9c;text-shadow:none}.test-runner-scope .action-bar.content-action-bar li.btn-info:active:hover,.test-runner-scope .action-bar.content-action-bar li.btn-info.active:hover{background:#fff}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar{opacity:1;height:40px;flex-basis:40px}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box{height:38px;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:space-between;-ms-flex-pack:space-between;justify-content:space-between;padding-left:10px;padding-right:10px}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box .title-box{font-size:14px;font-size:1.4rem;padding:4px 0 0;-ms-flex:0 1 auto;-webkit-flex:0 1 auto;flex:0 1 auto}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box .progress-box,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box .item-number-box{padding-top:4px;white-space:nowrap;-ms-flex:0 1 auto;-webkit-flex:0 1 auto;flex:0 1 auto}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box .progress-box .qti-controls,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box .item-number-box .qti-controls{display:inline-block;margin-left:20px;white-space:nowrap}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box .timer-box{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box .progressbar{margin-top:5px;min-width:150px;max-width:200px;height:.6em}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box{color:rgba(255,255,255,.9);text-shadow:1px 1px 0 #000}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .lft,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .rgt{padding-left:20px}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .lft:first-child,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .rgt:first-child{padding-left:0}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .lft:last-child ul,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .rgt:last-child ul{display:inline-block}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box [class^=btn-],.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box [class*=\\\" btn-\\\"]{white-space:nowrap}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .action{position:relative;overflow:visible}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu{color:#222;background:#f3f1ef;border:1px solid #aaa9a7;overflow:auto;list-style:none;min-width:150px;margin:0;padding:0;position:absolute;bottom:36px;left:-3px}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action{display:inline-block;text-align:left;width:100%;white-space:nowrap;overflow:hidden;color:#222;border-bottom:1px solid #c2c1bf;margin:0;-moz-border-radius:0px;-webkit-border-radius:0px;border-radius:0px;height:auto;padding:8px 15px 9px;line-height:1;border-left:solid 3px rgba(0,0,0,0)}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action .icon-checkbox-checked{display:none}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.active{background-color:#dbd9d7;font-weight:bold}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon-checkbox,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon-checkbox,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.active .icon-checkbox{display:none}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon-checkbox-checked,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon-checkbox-checked,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.active .icon-checkbox-checked{display:inline-block}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:focus,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover{background-color:#0e5d91;color:#fff;border-left-color:#313030 !important}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:focus .label,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:focus .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .label,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .label,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon{color:#fff}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:focus .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon{color:#e7eff4}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action .label,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action .icon{font-size:14px;font-size:1.4rem;text-shadow:none;color:#222}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar{overflow:visible;position:relative}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .action{line-height:1.6}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .icon.no-label{padding-right:0}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed .btn-info .text,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed-hover .btn-info:not(:hover) .text,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.no-tool-label .text,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed .text,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed-over:not(:hover) .text{display:none}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed .btn-info .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed-hover .btn-info:not(:hover) .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.no-tool-label .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed-over:not(:hover) .icon{padding:0}.test-runner-scope [data-control=exit]{margin-left:20px}.test-runner-scope [data-control=comment-toggle]{display:none}.test-runner-scope.non-lti-context .title-box{display:none}.test-runner-scope [data-control=qti-comment]{background-color:#f3f1ef;position:absolute;bottom:33px;left:8px;text-align:right;padding:5px;border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px;-webkit-box-shadow:0 0 15px 1px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 0 15px 1px rgba(0, 0, 0, 0.2);-ms-box-shadow:0 0 15px 1px rgba(0, 0, 0, 0.2);-o-box-shadow:0 0 15px 1px rgba(0, 0, 0, 0.2);box-shadow:0 0 15px 1px rgba(0, 0, 0, 0.2)}.test-runner-scope [data-control=qti-comment] textarea{display:block;height:100px;resize:none;width:350px;padding:3px;margin:0 0 10px 0;border:none;font-size:13px;font-size:1.3rem;border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px}.test-runner-scope .tools-box{position:relative;overflow:visible}.wait-content .wait-content_text--centered{text-align:center}.wait-content .wait-content_actions-list{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;-o-flex-direction:column;flex-direction:column}.wait-content .wait-content_actions-list .wait-content_text--centered{position:relative;right:15px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box>.lft{float:right;margin:2px 10px 0 0}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .rgt{float:left}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list>.action>.li-inner>.icon,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list>.action>.li-inner>.icon{display:inline-block}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list>.action .action,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list>.action .action{text-align:right}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list>.action .action.active .icon.icon-checkbox-checked,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list>.action .action.active .icon.icon-checkbox-checked{display:inline-block}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list>.action .action:not(.active) .icon.icon-checkbox,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list>.action .action:not(.active) .icon.icon-checkbox{display:inline-block}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list>.action .action:not(.active):hover .icon.icon-checkbox,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list>.action .action:not(.active):hover .icon.icon-checkbox{display:none}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list>.action .action:not(.active):hover .icon.icon-checkbox-checked,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list>.action .action:not(.active):hover .icon.icon-checkbox-checked{display:inline-block}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list>.action .menu,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list>.action .menu{left:auto;right:-3px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action{float:right}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon{padding:0 0 0 9px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-right:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-left:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-fast-forward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-step-forward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-forward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-fast-backward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-step-backward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-external:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-backward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-right:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-left:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-fast-forward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-step-forward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-forward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-fast-backward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-step-backward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-external:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-backward:before{display:inline-block;transform:scaleX(-1)}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .action,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .action{text-align:right}body.delivery-scope[dir=rtl] .qti-navigator .icon-up,body.delivery-scope[dir=rtl] .qti-navigator .icon-down{margin-left:0;margin-right:auto}body.delivery-scope[dir=rtl] .qti-navigator .qti-navigator-counter{margin-left:0;margin-right:auto;text-align:left}body.delivery-scope[dir=rtl] .qti-item [class^=feedback-].small,body.delivery-scope[dir=rtl] .qti-item [class*=\\\" feedback-\\\"].small{padding:8px 45px 8px 20px;text-align:right}body.delivery-scope[dir=rtl] .qti-item [class^=feedback-].small>[class^=icon-],body.delivery-scope[dir=rtl] .qti-item [class^=feedback-].small>[class*=\\\" icon-\\\"],body.delivery-scope[dir=rtl] .qti-item [class*=\\\" feedback-\\\"].small>[class^=icon-],body.delivery-scope[dir=rtl] .qti-item [class*=\\\" feedback-\\\"].small>[class*=\\\" icon-\\\"]{left:auto;right:10px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar .control-box>.connectivity-box{margin-left:0px;margin-right:40px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar .control-box>.connectivity-box.with-message .message-connect{margin-left:3px;margin-right:0px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar .control-box>.progress-box>.qti-controls{margin-left:0px;margin-right:20px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar .control-box>.timer-box .timer-toggler{right:20px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar .control-box>.timer-box .timer-wrapper .countdown:first-child::before{content:\\\" \\\"}body.delivery-scope[dir=rtl] .runner .test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar .control-box>.timer-box .timer-wrapper .countdown:last-child::before{content:none}.action-bar .shortcuts-list-wrapper{width:100%;height:100%;position:fixed;top:0;left:0;display:flex;align-items:center;align-content:center;justify-content:center;overflow:auto;background:rgba(0,0,0,.5);z-index:10001}.action-bar .shortcuts-list-wrapper .shortcuts-list{width:auto;min-width:400px;height:auto;min-height:300px;padding:30px !important;color:#222 !important;text-shadow:none !important;position:relative;background-color:#fff;border:1px solid #ddd}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-list-description{width:450px}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-list-title{font-size:24px;margin-top:0}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-group-title{font-size:18px;margin-top:20px}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-group-title:focus{outline:3px solid #276d9b;outline-offset:3px}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-group-list{list-style:none;margin:0;padding:0}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-group-list .shortcut-item{display:-ms-flexbox;display:-webkit-flex;display:flex;float:none;margin:0}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-group-list .shortcut-item .shortcut-item-action,.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-group-list .shortcut-item .shortcut-item-shortcut{-ms-flex:0 1 50%;-webkit-flex:0 1 50%;flex:0 1 50%;margin:0;text-align:center}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-group-list .shortcut-item .shortcut-item-action{text-align:left}.action-bar .shortcuts-list-wrapper .shortcuts-list .btn-close{background-color:rgba(0,0,0,0);box-shadow:none;height:20px;padding:0;position:absolute;right:12px;top:10px;width:20px}.action-bar .shortcuts-list-wrapper .shortcuts-list .btn-close .icon-close{color:#222;font-size:20px;padding:0}.action-bar .shortcuts-list-wrapper .shortcuts-list .btn-close:focus{outline:3px solid #276d9b;outline-offset:3px}.jump-links-container .jump-links-box{display:block;width:0;height:0;position:absolute}.jump-links-container .jump-links-box .jump-link-item{position:fixed;display:block;z-index:1001}.jump-links-container .jump-links-box .jump-link{z-index:1002;position:fixed;display:block;overflow:hidden;top:10px;left:10px;width:0;padding:0 !important;font-size:2.4rem !important}.jump-links-container .jump-links-box .jump-link:focus{width:auto;height:auto;padding:30px !important;background:#f3f1ef;color:#222 !important;border:3px solid #222;outline:none;text-shadow:none !important}.jump-links-container .jump-links-box .jump-link:focus:hover{background:#f3f1ef;text-decoration:underline}\\n\\n/*# sourceMappingURL=../../../taoQtiTest/views/css/new-test-runner.css.map */');\n","\ndefine(\"taoQtiTest/loader/taoQtiTestRunner.bundle\", function(){});\n","window.bundles = (window.bundles || []).concat([\"taoItems/loader/taoItemsRunner.min\",\"taoTests/loader/taoTestsRunner.min\",\"taoQtiItem/loader/taoQtiItemRunner.min\"]);\n"],"mappings":"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"} \ No newline at end of file +{"version":3,"names":["loaderScript","document","getElementById","configUrl","getAttribute","bundle","loadController","controllerOptions","controllerPath","params","JSON","parse","err","window","require","controller","startController","started","start","addEventListener","readyState","loadBundles","loaded","bundles","concat","filter","item","index","indexOf","forEach","length","define","$","_","__","context","module","router","loggerFactory","loadingBar","feedback","urlUtil","locale","providerLoader","runner","requiredOptions","config","exitReason","$container","logger","serviceCallId","plugins","providers","Object","keys","preventFeedback","errorFeedback","exit","reason","level","url","options","exitUrl","build","location","onError","displayMessage","onFeedback","onWarning","type","typeMap","warning","error","loggerByType","feedbackByType","message","isString","stringify","stop","code","timeout","moduleConfig","attr","dir","getLanguageDirection","every","option","isArray","extraRoutes","dispatch","provider","assign","then","results","testRunnerConfig","omit","renderTo","proxy","getAvailableProviders","loadedProxies","debug","on","defer","removeClass","data","after","removeAllListeners","close","init","catch","TypeError","name","assetManagerFactory","assetStrategies","assetPortableElement","getAssetManager","testId","assetManager","assetManagers","defaultStrategies","baseUrl","prototype","hasOwnProperty","call","packedUrl","external","base64","configHelper","configFactory","storage","from","_entries","_defaults","undef","getTestDefinition","testDefinition","getTestCompilation","testCompilation","getServiceCallId","getServiceController","bootstrap","serviceController","getServiceExtension","serviceExtension","getTestActionUrl","action","route","getItemActionUrl","itemIdentifier","testServiceCallId","itemDefinition","getTelemetryUrl","signal","getTimeout","getCommunicationConfig","communication","extension","syncActions","service","merge","interval","enabled","states","testSession","freeze","initial","interacting","modalFeedback","suspended","closed","itemSession","solution","notSelected","responseCardinalities","single","multiple","ordered","record","interactionMinConstraintProperties","matchInteraction","choiceInteraction","orderInteraction","associateInteraction","hottextInteraction","hotspotInteraction","graphicOrderInteraction","graphicAssociateInteraction","selectPointInteraction","currentItemHelper","getDeclarations","itemRunner","_item","responses","getResponseDeclaration","identifier","found","declaration","attributes","toResponse","value","baseType","cardinality","mappedCardinality","response","isNumber","transform","v","parseInt","parseFloat","split","map","base","isQtiValueNull","isObject","stringyValue","isEmpty","isQuestionAnswered","defaultValue","constraintValue","fullyAnswered","answered","currentCardinality","isUndefined","isEqual","guessInteractionConstraintValues","itemBody","bdy","interactions","elements","constraintValues","interaction","qtiClass","__proto__","constraintProperty","responseIdentifier","isAnswered","partially","getResponses","count","empty","declarations","getStimuliHrefs","values","element","val","href","getTextStimuliHrefs","stimuli","textStimuli","stimulusHref","domNode","querySelector","childNodes","some","child","nodeType","TEXT_NODE","getTimerMessage","hours","minutes","seconds","unansweredQuestions","scope","timerMessage","timeArr","timeArgArr","unit","idx","push","answeredMessage","questionsMessage","join","getEmptyStats","questions","flagged","viewed","total","questionsViewed","getJumps","jumps","getParts","parts","getSections","result","part","sections","section","id","getActiveItem","mapWithActive","active","items","getNextSections","sectionId","canList","getJump","position","getPart","partName","getSection","sectionName","getItem","jump","find","getItemAt","getItemCategories","Array","categories","hasItemCategory","category","fuzzyMatch","arguments","taoPrefix","exactMatch","includes","startsWith","normalize","elt","replace","toLowerCase","itemCategory","getTestStats","stats","getPartStats","getSectionStats","getScopeStats","testStats","currentPartPosition","isLinear","isCurrentPartLinear","_ref","partPosition","sort","a","b","linearPartIndex","findIndex","_ref2","inaccessibleParts","slice","countOfInaccessibleUnasweredQestions","reduce","acc","_ref3","countOfInaccessibleFlaggedQestions","_ref4","getScopeMap","scopeMap","cloneDeep","computeItemStats","computeStats","getScopeMapFromContext","testPartId","getItemPart","getItemSection","getItemIdentifier","isFinite","each","callback","isFunction","updateItemStats","accStats","informational","collection","patch","currentMap","partialMap","self","targetMap","isPlainObject","partialPart","targetPartId","partialSection","targetSectionId","reindex","offset","offsetPart","offsetSection","lastPartId","lastSectionId","sortBy","positionInPart","positionInSection","createJumpTable","mapHelper","isReviewPanelEnabled","reviewEnabled","getTestMap","getTestContext","itemReviewEnabled","getOptions","review","getInstantStats","sync","getCurrentItem","testPart","getCurrentPart","clone","itemPosition","partiallyAnsweredIsAnswered","isItemCurrentlyAnswered","statsHelper","Handlebars","Helpers0","messageHeaderTpl","asString","html","Template","getExitMessage","submitButtonLabel","itemsCountMessage","testRunnerOptions","messageEnabled","enableUnansweredItemsWarning","getUnansweredItemsWarning","trim","getHeader","getActionMessage","header","msg","getFlaggedItemsWarning","flaggedCount","toString","unansweredCount","__initialized","template","depth0","helpers","partials","program1","buffer","stack1","helper","hash","escapeExpression","compilerInfo","functionType","inverse","noop","fn","program","messages","navigationHelper","isLeavingSection","testContext","testMap","direction","sectionStats","nbItems","isLeavingTestPart","testPartStats","isLast","isLastOf","isFirst","isFirstOf","getSiblingItems","size","itemId","previous","siblings","itemChain","ref","next","directions","walkDirection","link","times","getNeighbor","getNextItem","getPreviousItem","isMovingToNextItem","isMovingToPreviousItem","isJumpingToItem","offlineErrorHelper","buildErrorFromContext","errorData","Error","getOfflineNavError","success","source","purpose","getOfflineExitError","getOfflinePauseError","$$1","polling","hider","waitingDialogFactory","shortcutRegistry","globalShortcut","offlineSyncModalCountdownTpl","offlineSyncModalWaitContentTpl","Template$1","offlineSyncModalFactory","waitingConfig","waitContent","proceedContent","proceedButtonText","showSecondary","secondaryButtonText","secondaryButtonIcon","buttonSeparatorText","width","$secondaryButton","betweenButtonTextSelector","secondaryButtonWait","delaySec","$countdown","countdownPolling","dialogShortcut","propagate","prevent","disable","set","waitingDialog","getDialogEl","selector","dialog","getDom","insertAfter","endWait","hide","before","show","beginWait","is","trigger","enable","off","clear","prop","countdownAction","removeProp","autoStart","helperMissing","capitalize","buildTestContextFromPosition","attempt","updatedMap","buildTestContextFromJump","_Mathmax","Math","max","isLeavingPart","newTestContext","defaults","remainingAttempts","sectionTitle","label","canMoveBackward","numberRubrics","rubrics","timeConstraints","reject","constraint","qtiClassName","timeConstraint","getOptionsFromCategories","pick","categoryName","testContextBuilder","navigatorFactory","navigate","methodName","substr","toUpperCase","nextItem","previousItem","previsousItem","nextSection","jumpItem","evaluateSubBranchRules","branchRuleDefinition","navigationParams","branchRuleMapper","responseStore","Promise","resolve","subBranchRuleResults","promises","subBranchRule","subBranchRuleName","validate","all","subBranchRuleResult","branchRuleHelper","matchBranchRuleFactory","variableIdentifier","variable","correctIdentifier","correct","getCorrectResponse","getResponse","orBranchRuleFactory","andBranchRuleFactory","notBranchRuleFactory","expression","head","subBranchRuleDefinition","matchBranchRule","orBranchRule","andBranchRule","notBranchRule","branchRuleMapperFactory","branchRuleName","branchRuleMap","match","or","and","not","branchRuleFactory","target","branchRuleResults","branchRuleResult","branchRule","offlineJumpTableFactory","itemStore","addResponsesToResponseStore","itemResponse","itemResponseIdentifier","responseEntry","responseId","addResponse","getItems","uniq","getSimplifiedTestMap","row","simplifiedTestMap","itemHasBranchRule","itemBranchRule","sectionHasBranchRule","sectionBranchRule","partHasBranchRule","partBranchRule","jumpTable","setTestMap","buildJumpTable","calculateNextJump","lastJumpItem","getLastJump","contextItemId","get","itemState","state","itemStateIdentifier","jumpToNextItem","contextItemPosition","firstJumpItem","addJump","putCorrectResponsesInStore","itemData","addCorrectResponse","correctResponses","clearJumpTable","partIdentifier","sectionIdentifier","lastJump","nextPosition","jumpTo","jumpToSkipItem","itemSliceIndex","itemIdentifierToAdd","shift","itemToAdd","lastJumpItemData","itemIdentifierToAddd","jumpToNextSection","lastJumpSection","sectionSliceIndex","sectionIdentifierToAdd","jumpToPreviousItem","pop","getJumpTable","offlineNavigatorFactory","offlineJumpTableHelper","setTestData","setTestContext","navigationActionName","itemFromStore","update","dataUpdaterFactory","testDataHolder","dataSet","isContextual","contextualData","testData","updateData","builtTestMap","updatedTestMap","buildTestMap","updateStats","findLast","newMap","updatePluginsConfig","pluginsConfig","pluginName","setConfig","toolStateBridgeFactory","testStore","activePlugins","tools","getStore","setTools","toolNames","toolName","startChangeTracking","getTools","restoreState","toolState","toolStore","key","setItem","resetChanges","restoreStates","formattedResult","mergeCollection","getState","reset","hasChanges","getStates","formattedState","componentFactory","entryTpl","itemComponentFactory","specs","itemComponent","itemComponentApi","setTemplate","$component","turnOff","initItem","event","className","program3","apply","program5","icon","unless","text","program6","program8","control","title","aria","menu","getType","getId","setMenuId","menuId","getMenuId","turnOn","setState","getElement","hoverOn","hoverOff","stackerFactory","menuTpl","menuItemTpl","menuComponentFactory","menuComponent","$menuButton","$menuContainer","$menuContent","$menuItems","$menuStateIcon","hoverIndex","menuItems","menuComponentApi","closeMenu","initMenu","render","toggleMenu","e","preventDefault","stopPropagation","closeMenuOnItemClick","hoverOffAll","program4","role","keyCodes","TAB","ESC","ENTER","SPACE","LEFT","UP","RIGHT","DOWN","stacker","navType","showMenu","openMenu","indexOfClosestVisibleItem","inc","last","elem","hasClass","hoverByIndex","hoverItem","hoverNextVisibleItem","hoverPreviousVisibleItem","bringToFront","addClass","enableShortcuts","activeElement","blur","activeItemIndex","focus","disableShortcuts","parent","getItemById","addItem","renderItems","highlightHoveredEntry","currentTarget","mouseOverItem","hasDisplayedItems","turnOffAll","current","currentKeyCode","keyCode","charCode","triggerHighlightedItem","moveUp","moveDown","setFocusToItem","itemToHover","activeItem","setNavigationType","textTpl","textComponentFactory","textComponent","textComponentApi","initText","entryFactory","menuFactory","textFactory","toolboxTpl","defaultRenderer","menuEntries","allItems","hasMenu","allMenus","toolboxComponentFactory","$document","toolboxComponent","toolboxComponentApi","initToolbox","destroy","createMenu","closeAllMenuExcept","openedMenu","createEntry","extendedConfig","createText","eventifier","pollingFactory","timerFactory","stopwatchFactory","defaultOptions","initialized","stopwatch","isInitialized","tick","resume","pause","cachedStore","browser","areaBrokerFactory","proxyFactory","probeOverseerFactory","testStoreFactory","dataUpdater","toolboxFactory","qtiItemRunner","layoutTpl","qtiProvider","loadAreaBroker","$layout","content","toolbox","navigation","mainLandmark","actionsBar","panel","loadProxy","getConfig","proxyProvider","proxyConfig","loadProbeOverseer","loadTestStore","Date","now","loadPersistentStates","persistencePromise","stateStorage","getPersistentState","setPersistentState","setPromise","install","getDataHolder","toolStateBridge","getTestStore","getPlugins","getCurrentSection","getItemResults","itemSessionState","computeNext","loadPromise","currentItem","skipPausedAssessmentDialog","submitError","unrecoverable","load","feedbackPromise","hasFeedbacks","getProxy","submitItem","itemAnswered","displayFeedbacks","feedbacks","renderFeedbacks","queue","toolStates","callItemAction","unloadItem","loadItem","finish","areaBroker","getAreaBroker","setComponent","getToolbox","spread","isTimerClientMode","timer","restoreTimerFromClient","itemResults","disableItem","callTestAction","noAlertTimeout","isTimeout","allowLateSubmission","late","cancel","reasons","comment","originalMessage","skipExitMessage","getItemLabel","getItemState","flush","getProbeOverseer","getStorageIdentifier","storeId","getPluginsConfig","clearVolatileIfStoreChange","lastStoreId","isNewStore","append","getContainer","getToolboxArea","portableElements","flags","renderItem","changeState","setItemState","setData","assets","itemContainer","getContentArea","itemRenderingOptions","isIOs","wrapperElt","style","overflow","setTimeout","removeStore","probeOverseer","flushPromise","traceData","entry","marker","sendVariables","hasCommunicator","getCommunicator","communicator","remove","actionStoreFatory","actionQueue","loadStore","timestamp","parameters","actionStore","actionId","storeName","storeKey","audio","audioBlobs","prependStrategy","handle","sourceUrl","URL","createObjectURL","request","XMLHttpRequest","open","responseType","onerror","onabort","onload","status","send","unload","image","images","Image","src","relSupport","feature","fakeLink","createElement","relList","supports","supportPreload","supportPrefetch","stylesheet","stylesheets","setAttribute","disabled","appendChild","removeChild","audioPreloader","imagePreloader","stylesheetPreloader","preloaders","providerRegistry","preloaderManagerFactory","preloaderFactory","getProvider","has","preloader","_len","args","_key","_len2","_key2","_len3","_key3","assetPreloaderFactory","registerProvider","ckEditor","ckConfigurator","preloadCKEditor","language","placeholder","ckOptions","resize_enabled","secure","protocol","forceCustomDomain","editor","inline","defaultLang","getItemLanguage","lang","documentElement","extendedText","preloadedLanguages","format","extendedTextPreloader","interactionPreloaderFactory","itemPreloaderFactory","preloadAssetManager","resolveAssets","assetList","resolved","isBase64","testAssetManager","assetPreloader","interactionPreloader","itemLoad","preload","interactionLoad","getItemInteractions","serial","interactionUnload","assetLoad","setItemFlag","assetUnload","loading","isItemObjectValid","pci","Boolean","flag","body","store","itemStoreFactory","defaultConfig","backends","memory","Map","lastIndexedPosition","isExpired","meta","itemTTL","findFirstIndexedItem","_NumberPOSITIVE_INFINITY","Number","POSITIVE_INFINITY","first","lowest","findExpiredItems","expired","itemPreloader","setCacheSize","cacheSize","maxSize","setItemTTL","ttl","itemStorage","updated","removed","updateKey","updateValue","delete","removeItem","prune","promiseQueue","communicatorFactory","coreRequest","qtiServiceProxy","prepareParams","actionParams","stringifyParams","mapValues","reqParams","contentType","noToken","method","background","sequential","configStorage","setOnline","isConnectivityError","setOffline","getTestData","variables","telemetry","loadCommunicator","testNavigatorFactory","actionStoreFactory","loadNextDelay","defaultItemTTL","getItemCachingOption","itemCaching","actiontStore","getItemFromStore","requestConfig","actionPromises","actionRejectPromises","getCacheAmount","getItemTTL","hasItem","hasNextItem","sibling","hasPreviousItem","offlineAction","blockingActions","testNavigator","markActionAsOffline","processSyncAction","deferred","scheduleAction","actionData","syncData","isOnline","actionResult","requestParameters","getTime","requestNetworkThenOffline","communicationConfig","runRequestThenOffline","isOffline","actions","serie","exportActions","offline","pruneStore","loadNextItem","missing","list","delay","updateStatePromise","providerName","responseStoreFactory","getResponseStore","responseStoreName","getCorrectResponseStore","correctResponseStoreName","getCorrectResponses","clearResponses","clearCorrectResponses","offlineSyncModal","download","maxSyncAttempts","offlineNavigator","syncInProgress","dataHolder","isBlocked","isNavigationAction","isMeaningfullScope","navigator","res","isDirectionDefined","offlineSync","initiateDownload","sendSyncData","prepareDownload","dateTime","toISOString","niceFilename","isExitTest","filename","testConfig","InitCallPromise","c","d","i","s","getElementsByTagName","styleSheet","cssText","createTextNode"],"sources":["/github/workspace/tao/views/build/config-wrap-start-default.js","../../loader/bootstrap.js","css!taoQtiTestCss/new-test-runner","../controller/runner/runner.js","../runner/config/assetManager.js","../runner/config/qtiServiceConfig.js","../runner/config/states.js","../runner/helpers/currentItem.js","../runner/helpers/getTimerMessage.js","../runner/helpers/map.js","../runner/helpers/isReviewPanelEnabled.js","../runner/helpers/stats.js","../runner/helpers/messages.js","../runner/helpers/navigation.js","../runner/helpers/offlineErrorHelper.js","../runner/helpers/offlineSyncModal.js","../runner/helpers/testContextBuilder.js","../runner/navigator/navigator.js","../runner/branchRule/helpers/branchRuleHelper.js","../runner/branchRule/types/match.js","../runner/branchRule/types/or.js","../runner/branchRule/types/and.js","../runner/branchRule/types/not.js","../runner/branchRule/branchRuleMapper.js","../runner/branchRule/branchRule.js","../runner/services/offlineJumpTable.js","../runner/navigator/offlineNavigator.js","../runner/provider/dataUpdater.js","../runner/provider/toolStateBridge.js","../runner/ui/toolbox/entry.js","../runner/ui/toolbox/menu.js","../runner/ui/toolbox/text.js","../runner/ui/toolbox/toolbox.js","../runner/provider/stopwatch.js","../runner/provider/qti.js","../runner/proxy/cache/actionStore.js","../runner/proxy/cache/preloaders/assets/audio.js","../runner/proxy/cache/preloaders/assets/image.js","../runner/proxy/cache/preloaders/assets/stylesheet.js","../runner/proxy/cache/preloaders/assets/preloaders.js","../runner/proxy/cache/preloaderManager.js","../runner/proxy/cache/assetPreloader.js","../runner/proxy/cache/preloaders/interactions/extendedText.js","../runner/proxy/cache/preloaders/interactions/preloaders.js","../runner/proxy/cache/interactionPreloader.js","../runner/proxy/cache/itemPreloader.js","../runner/proxy/cache/itemStore.js","../runner/proxy/qtiServiceProxy.js","../runner/proxy/cache/proxy.js","../runner/proxy/loader.js","../runner/services/responseStore.js","../runner/proxy/offline/proxy.js","onLayerEnd0.js","module-create.js","/github/workspace/tao/views/build/config-wrap-end-default.js"],"sourcesContent":["\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2018 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Bootstrap the app, start the entry controller\n * @author Bertrand Chevrier \n */\n(function(){\n 'use strict';\n\n\n\n var loaderScript = document.getElementById('amd-loader');\n var configUrl = loaderScript.getAttribute('data-config');\n var bundle = loaderScript.getAttribute('data-bundle');\n\n var loadController = function loadController(){\n var controllerOptions = {};\n var controllerPath = loaderScript.getAttribute('data-controller');\n var params = loaderScript.getAttribute('data-params');\n try{\n controllerOptions = JSON.parse(params);\n } catch(err){\n controllerOptions = {};\n }\n window.require([controllerPath], function(controller) {\n var startController = function startController(){\n if(!window.started){\n window.started = true;\n controller.start(controllerOptions);\n }\n };\n document.addEventListener('readystatechange', startController, false);\n if (document.readyState === 'complete') {\n startController();\n }\n });\n };\n\n //always start to load the config\n window.require([configUrl], function() {\n\n //define the global loading mechanism\n if(!window.loadBundles){\n //keep tracl of loaded bundles, even if require does it,\n //this prevent some unecessary cycles\n window.loaded = {};\n\n /**\n * Loading entry point for inter bundle dependency,\n * always take the bundles from the params and window.bundles\n * @param {String[]} [bundles] - an optional list of bundle to load\n */\n window.loadBundles = function loadBundles(bundles){\n bundles = bundles || [];\n bundles = bundles.concat(window.bundles)\n bundles = bundles.filter( function(item, index){\n return item && bundles.indexOf(item) === index && window.loaded[item] !== true;\n });\n require(bundles, function(){\n bundles.forEach( function( item ) {\n window.loaded[item] = true;\n });\n loadController();\n });\n }\n }\n\n if(bundle || (window.bundles && window.bundles.length)) {\n window.loadBundles([bundle]);\n } else {\n loadController();\n }\n });\n})();\n\ndefine(\"loader/bootstrap\", function(){});\n\n","\ndefine('css!taoQtiTestCss/new-test-runner',[],function(){});\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2019 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Test runner controller entry\n *\n * @author Bertrand Chevrier \n */\ndefine('taoQtiTest/controller/runner/runner',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'context',\n 'module',\n 'core/router',\n 'core/logger',\n 'layout/loading-bar',\n 'ui/feedback',\n 'util/url',\n 'util/locale',\n 'taoTests/runner/providerLoader',\n 'taoTests/runner/runner',\n 'css!taoQtiTestCss/new-test-runner'\n], function (\n $,\n _,\n __,\n context,\n module,\n router,\n loggerFactory,\n loadingBar,\n feedback,\n urlUtil,\n locale,\n providerLoader,\n runner\n) {\n 'use strict';\n\n /**\n * List of options required by the controller\n * @type {String[]}\n */\n const requiredOptions = [\n 'testDefinition',\n 'testCompilation',\n 'serviceCallId',\n 'bootstrap',\n 'options',\n 'providers'\n ];\n\n /**\n * The runner controller\n */\n return {\n\n /**\n * Controller entry point\n *\n * @param {Object} config - the testRunner config\n * @param {String} config.testDefinition - the test definition id\n * @param {String} config.testCompilation - the test compilation id\n * @param {String} config.serviceCallId - the service call id\n * @param {Object} config.bootstrap - contains the extension and the controller to call\n * @param {Object} config.options - the full URL where to return at the final end of the test\n * @param {Object[]} config.providers - the collection of providers to load\n */\n start(config) {\n let exitReason;\n const $container = $('.runner');\n\n const logger = loggerFactory('controller/runner', {\n serviceCallId : config.serviceCallId,\n plugins : config && config.providers && Object.keys(config.providers.plugins)\n });\n\n let preventFeedback = false;\n let errorFeedback = null;\n\n /**\n * Exit the test runner using the configured exitUrl\n * @param {String} [reason] - to add a warning once left\n * @param {String} [level] - error level\n */\n const exit = function exit(reason, level){\n let url = config.options.exitUrl;\n const params = {};\n if (reason) {\n if (!level) {\n level = 'warning';\n }\n params[level] = reason;\n url = urlUtil.build(url, params);\n }\n window.location = url;\n };\n\n /**\n * Handles errors\n * @param {Error} err - the thrown error\n * @param {String} [displayMessage] - an alternate message to display\n */\n const onError = function onError(err, displayMessage) {\n onFeedback(err, displayMessage, \"error\");\n };\n\n /**\n * Handles warnings\n * @param {Error} err - the thrown error\n * @param {String} [displayMessage] - an alternate message to display\n */\n const onWarning = function onWarning(err, displayMessage) {\n onFeedback(err, displayMessage, \"warning\");\n };\n\n /**\n * Handles errors & warnings\n * @param {Error} err - the thrown error\n * @param {String} [displayMessage] - an alternate message to display\n * @param {String} [type] - \"error\" or \"warning\"\n */\n const onFeedback = function onFeedback(err, displayMessage, type) {\n const typeMap = {\n warning: {\n logger: \"warn\",\n feedback: \"warning\"\n },\n error: {\n logger: \"error\",\n feedback: \"error\"\n }\n };\n const loggerByType = logger[typeMap[type].logger];\n const feedbackByType = feedback()[typeMap[type].feedback];\n\n displayMessage = displayMessage || err.message;\n\n if(!_.isString(displayMessage)){\n displayMessage = JSON.stringify(displayMessage);\n }\n loadingBar.stop();\n\n loggerByType({ displayMessage : displayMessage }, err);\n\n if(type === \"error\" && (err.code === 403 || err.code === 500)) {\n displayMessage = `${__('An error occurred during the test, please content your administrator.')} ${displayMessage}`;\n return exit(displayMessage, 'error');\n }\n if (!preventFeedback) {\n errorFeedback = feedbackByType(displayMessage, {timeout: -1});\n }\n };\n\n const moduleConfig = module.config();\n\n loadingBar.start();\n\n // adding attr for RTL languages\n $('.delivery-scope').attr({dir: locale.getLanguageDirection(context.locale)});\n\n // verify required config\n if ( ! requiredOptions.every( option => typeof config[option] !== 'undefined') ) {\n return onError(new TypeError(__('Missing required configuration option %s', name)));\n }\n\n // dispatch any extra registered routes\n if (moduleConfig && _.isArray(moduleConfig.extraRoutes) && moduleConfig.extraRoutes.length) {\n router.dispatch(moduleConfig.extraRoutes);\n }\n\n //for the qti provider to be selected here\n config.provider = Object.assign( config.provider || {}, { runner: 'qti' });\n\n //load the plugins and the proxy provider\n providerLoader(config.providers, context.bundle)\n .then(function (results) {\n\n const testRunnerConfig = _.omit(config, ['providers']);\n testRunnerConfig.renderTo = $container;\n\n if (results.proxy && typeof results.proxy.getAvailableProviders === 'function') {\n const loadedProxies = results.proxy.getAvailableProviders();\n testRunnerConfig.provider.proxy = loadedProxies[0];\n }\n\n logger.debug({\n config: testRunnerConfig,\n providers : config.providers\n }, 'Start test runner');\n\n //instantiate the QtiTestRunner\n runner(config.provider.runner, results.plugins, testRunnerConfig)\n .on('error', onError)\n .on('warning', onWarning)\n .on('ready', function () {\n _.defer(function () {\n $container.removeClass('hidden');\n });\n })\n .on('pause', function(data) {\n if (data && data.reason) {\n exitReason = data.reason;\n }\n })\n .after('destroy', function () {\n this.removeAllListeners();\n\n // at the end, we are redirected to the exit URL\n exit(exitReason);\n })\n\n //FIXME this event should not be triggered on the test runner\n .on('disablefeedbackalerts', function() {\n if (errorFeedback) {\n errorFeedback.close();\n }\n preventFeedback = true;\n })\n\n //FIXME this event should not be triggered on the test runner\n .on('enablefeedbackalerts', function() {\n preventFeedback = false;\n })\n .init();\n })\n .catch(function(err){\n onError(err, __('An error occurred during the test initialization!'));\n });\n }\n };\n});\n\n","define('taoQtiTest/runner/config/assetManager',['taoItems/assets/manager', 'taoItems/assets/strategies', 'taoQtiItem/portableElementRegistry/assetManager/portableAssetStrategy'], function (assetManagerFactory, assetStrategies, assetPortableElement) { 'use strict';\n\n assetManagerFactory = assetManagerFactory && Object.prototype.hasOwnProperty.call(assetManagerFactory, 'default') ? assetManagerFactory['default'] : assetManagerFactory;\n assetStrategies = assetStrategies && Object.prototype.hasOwnProperty.call(assetStrategies, 'default') ? assetStrategies['default'] : assetStrategies;\n assetPortableElement = assetPortableElement && Object.prototype.hasOwnProperty.call(assetPortableElement, 'default') ? assetPortableElement['default'] : assetPortableElement;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017-2019 Open Assessment Technologies SA ;\n */\n\n /**\n * The default strategies\n */\n var defaultStrategies = [assetStrategies.packedUrl, assetStrategies.external, assetStrategies.base64, assetStrategies.baseUrl, assetPortableElement];\n\n //keep reference per test id\n var assetManagers = {};\n\n /**\n * Gives access to a configured assetManagerFactory\n * @param {String} testId - a unique identifier for the test instance\n * @returns {assetManagerFactory}\n */\n function getAssetManager(testId) {\n var assetManager;\n if (typeof assetManagers[testId] !== 'undefined') {\n assetManager = assetManagers[testId];\n } else {\n assetManager = assetManagerFactory(defaultStrategies, {\n baseUrl: ''\n });\n assetManagers[testId] = assetManager;\n }\n return assetManager;\n }\n\n return getAssetManager;\n\n});\n\n","define('taoQtiTest/runner/config/qtiServiceConfig',['lodash', 'util/url', 'util/config'], function (_, urlUtil, configHelper) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n urlUtil = urlUtil && Object.prototype.hasOwnProperty.call(urlUtil, 'default') ? urlUtil['default'] : urlUtil;\n configHelper = configHelper && Object.prototype.hasOwnProperty.call(configHelper, 'default') ? configHelper['default'] : configHelper;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2018 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Some default config values\n * @type {Object}\n * @private\n */\n var _defaults = {\n bootstrap: {\n serviceController: 'Runner',\n serviceExtension: 'taoQtiTest'\n }\n };\n\n /**\n * The list of handled config entries. Each required entry is set to true, while optional entries are set to false.\n * @type {Object}\n * @private\n */\n var _entries = {\n testDefinition: true,\n testCompilation: true,\n serviceCallId: true,\n bootstrap: false,\n timeout: false\n };\n\n /**\n * Creates a config object for the proxy implementation\n * @param {Object} config - Some required and optional config\n * @param {String} config.testDefinition - The URI of the test\n * @param {String} config.testCompilation - The URI of the compiled delivery\n * @param {String} config.serviceCallId - The URI of the service call\n * @param {String} [config.serviceController] - The name of the service controller\n * @param {String} [config.serviceExtension] - The name of the extension containing the service controller\n * @returns {Object}\n */\n function configFactory(config) {\n // protected storage\n var storage = configHelper.from(config, _entries, _defaults);\n var undef;\n\n // convert some values from seconds to milliseconds\n if (storage.timeout) {\n storage.timeout *= 1000;\n } else {\n storage.timeout = undef;\n }\n\n // returns only a proxy storage object : no direct access to data is provided\n return {\n /**\n * Gets the URI of the test\n * @returns {String}\n */\n getTestDefinition: function getTestDefinition() {\n return storage.testDefinition;\n },\n /**\n * Gets the URI of the compiled delivery\n * @returns {String}\n */\n getTestCompilation: function getTestCompilation() {\n return storage.testCompilation;\n },\n /**\n * Gets the URI of the service call\n * @returns {String}\n */\n getServiceCallId: function getServiceCallId() {\n return storage.serviceCallId;\n },\n /**\n * Gets the name of the service controller\n * @returns {String}\n */\n getServiceController: function getServiceController() {\n return storage.bootstrap.serviceController || _defaults.bootstrap.serviceController;\n },\n /**\n * Gets the name of the extension containing the service controller\n * @returns {String}\n */\n getServiceExtension: function getServiceExtension() {\n return storage.bootstrap.serviceExtension || _defaults.bootstrap.serviceExtension;\n },\n /**\n * Gets an URL of a service action related to the test\n * @param {String} action - the name of the action to request\n * @returns {String} - Returns the URL\n */\n getTestActionUrl: function getTestActionUrl(action) {\n return urlUtil.route(action, this.getServiceController(), this.getServiceExtension(), {\n testDefinition: this.getTestDefinition(),\n testCompilation: this.getTestCompilation(),\n serviceCallId: this.getServiceCallId()\n });\n },\n /**\n * Gets an URL of a service action related to a particular item\n * @param {String} itemIdentifier - The URI of the item\n * @param {String} action - the name of the action to request\n * @returns {String} - Returns the URL\n */\n getItemActionUrl: function getItemActionUrl(itemIdentifier, action) {\n return urlUtil.route(action, this.getServiceController(), this.getServiceExtension(), {\n testDefinition: this.getTestDefinition(),\n testCompilation: this.getTestCompilation(),\n testServiceCallId: this.getServiceCallId(),\n itemDefinition: itemIdentifier\n });\n },\n /**\n * Gets an URL of a telemetry signal related to a particular item\n * @param {String} itemIdentifier - The URI of the item\n * @param {String} signal - the name of the signal to request\n * @returns {String} - Returns the URL\n */\n getTelemetryUrl: function getTelemetryUrl(itemIdentifier, signal) {\n return urlUtil.route(signal, this.getServiceController(), this.getServiceExtension(), {\n testDefinition: this.getTestDefinition(),\n testCompilation: this.getTestCompilation(),\n testServiceCallId: this.getServiceCallId(),\n itemDefinition: itemIdentifier\n });\n },\n /**\n * Gets the request timeout\n * @returns {Number}\n */\n getTimeout: function getTimeout() {\n return storage.timeout;\n },\n /**\n * Gets the config for the communication channel\n * @returns {Object}\n */\n getCommunicationConfig: function getCommunicationConfig() {\n var communication = storage.bootstrap.communication || {};\n var extension = communication.extension || this.getServiceExtension();\n var controller = communication.controller || this.getServiceController();\n var action = communication.action;\n var syncActions = communication.syncActions || [];\n\n // build the service address from the provided config\n // it can be overwritten by a full url from the config\n var service = urlUtil.route(action || 'message', controller, extension, {\n testDefinition: this.getTestDefinition(),\n testCompilation: this.getTestCompilation(),\n serviceCallId: this.getServiceCallId()\n });\n\n // append the address of the remote service to target\n var params = _.merge({}, communication.params || {}, {\n service: communication.service || service\n });\n\n // convert some values from seconds to milliseconds\n if (params.timeout) {\n params.timeout *= 1000;\n } else {\n params.timeout = storage.timeout;\n }\n if (params.interval) {\n params.interval *= 1000;\n }\n return {\n enabled: communication.enabled,\n type: communication.type,\n params: params,\n syncActions: syncActions\n };\n }\n };\n }\n\n return configFactory;\n\n});\n\n","define('taoQtiTest/runner/config/states',[],function () { 'use strict';\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * The possible states\n * @author Bertrand Chevrier \n */\n var states = {\n //the test session states\n testSession: Object.freeze({\n initial: 0,\n interacting: 1,\n modalFeedback: 2,\n suspended: 3,\n closed: 4\n }),\n //the item session states\n itemSession: Object.freeze({\n initial: 0,\n interacting: 1,\n modalFeedback: 2,\n suspended: 3,\n closed: 4,\n solution: 5,\n notSelected: 255\n })\n };\n\n return states;\n\n});\n\n","define('taoQtiTest/runner/helpers/currentItem',['lodash'], function (_) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * List of QTI model cardinalities\n * @type {Object}\n */\n var responseCardinalities = {\n single: 'base',\n multiple: 'list',\n ordered: 'list',\n record: 'record'\n };\n\n /**\n * List of QTI interaction minConstraint properties\n * @type {Object}\n */\n var interactionMinConstraintProperties = {\n matchInteraction: 'minAssociations',\n choiceInteraction: 'minChoices',\n orderInteraction: 'minChoices',\n associateInteraction: 'minAssociations',\n hottextInteraction: 'minChoices',\n hotspotInteraction: 'minChoices',\n graphicOrderInteraction: 'minChoices',\n graphicAssociateInteraction: 'minAssociations',\n selectPointInteraction: 'minChoices'\n };\n\n /**\n * @typedef {currentItemHelper}\n */\n var currentItemHelper = {\n /**\n * Gets the responses declarations of the current item.\n * @param {Object} runner - testRunner instance\n * @returns {Object}\n */\n getDeclarations: function getDeclarations(runner) {\n var itemRunner = runner.itemRunner;\n return itemRunner._item && itemRunner._item.responses;\n },\n /**\n * Gets a response declaration by the identifier of the response\n * @param {Object} runner - testRunner instance\n * @param {String} identifier - The identifier of the response\n * @returns {Object|null}\n */\n getResponseDeclaration: function getResponseDeclaration(runner, identifier) {\n var found = null;\n _.forEach(currentItemHelper.getDeclarations(runner), function (declaration) {\n var attributes = declaration.attributes || {};\n if (attributes.identifier === identifier) {\n found = declaration;\n return false;\n }\n });\n return found;\n },\n /**\n * Convert a value to a response object\n * @param {Array|String} value\n * @param {String} baseType\n * @param {String} cardinality\n * @returns {Object}\n */\n toResponse: function toResponse(value, baseType, cardinality) {\n var mappedCardinality = responseCardinalities[cardinality];\n var response = {};\n if (_.isString(value) || _.isNumber(value)) {\n value = [value];\n }\n let transform = v => v;\n if (baseType === 'boolean') {\n transform = v => v === true || v === 'true';\n } else if (baseType === 'integer') {\n transform = v => typeof v === 'number' ? v : parseInt(v);\n } else if (baseType === 'float') {\n transform = v => typeof v === 'number' ? v : parseFloat(v);\n } else if (baseType === 'directedPair' || baseType === 'pair') {\n transform = v => {\n if (_.isString(v)) {\n return v.split(' ');\n }\n return v;\n };\n }\n value = _.map(value || [], transform);\n if (mappedCardinality) {\n if (mappedCardinality === 'base') {\n if (value.length === 0) {\n //return empty response:\n response.base = null;\n } else {\n response.base = {};\n response.base[baseType] = value[0];\n }\n } else {\n response[mappedCardinality] = {};\n response[mappedCardinality][baseType] = value;\n }\n }\n return response;\n },\n /**\n * Checks if the provided value can be considered as null\n * @param {Object} value\n * @param {String} baseType\n * @param {String} cardinality\n * @returns {boolean}\n */\n isQtiValueNull: function isQtiValueNull(value, baseType, cardinality) {\n var mappedCardinality = responseCardinalities[cardinality];\n if (_.isObject(value) && value[mappedCardinality] === null) {\n value = null;\n }\n if (_.isObject(value) && value[mappedCardinality] && 'undefined' !== typeof value[mappedCardinality][baseType]) {\n value = value[mappedCardinality][baseType];\n }\n const stringyValue = 'string' === baseType || 'integer' === baseType || 'float' === baseType;\n return null === value || stringyValue && value === '' || cardinality !== 'single' && _.isEmpty(value);\n },\n /**\n * Tells if an item question has been answered or not\n * @param {Object} response\n * @param {String} baseType\n * @param {String} cardinality\n * @param {Object} [defaultValue]\n * @param {Object} constraintValue\n * @returns {*}\n */\n isQuestionAnswered: function isQuestionAnswered(response, baseType, cardinality, defaultValue, constraintValue) {\n var answered, currentCardinality, responses;\n var fullyAnswered = true;\n defaultValue = _.isUndefined(defaultValue) ? null : defaultValue;\n constraintValue = constraintValue || 0;\n if (currentItemHelper.isQtiValueNull(response, baseType, cardinality)) {\n answered = false;\n } else {\n answered = !_.isEqual(response, currentItemHelper.toResponse(defaultValue, baseType, cardinality));\n if (constraintValue !== 0) {\n currentCardinality = responseCardinalities[cardinality];\n responses = response[currentCardinality][baseType] || [];\n fullyAnswered = responses && responses.length >= constraintValue;\n }\n answered = answered && fullyAnswered;\n }\n return answered;\n },\n guessInteractionConstraintValues: function guessInteractionConstraintValues(runner) {\n var itemRunner = runner.itemRunner;\n var itemBody = itemRunner._item && itemRunner._item.bdy || {};\n var interactions = itemBody.elements || {};\n var constraintValues = {};\n _.forEach(interactions, function (interaction) {\n var attributes = interaction.attributes || {};\n var qtiClass = interaction.__proto__.qtiClass;\n var constraintProperty;\n if (Object.prototype.hasOwnProperty.call(interactionMinConstraintProperties, qtiClass)) {\n constraintProperty = interactionMinConstraintProperties[qtiClass];\n constraintValues[attributes.responseIdentifier] = attributes[constraintProperty];\n }\n });\n return constraintValues;\n },\n /**\n * Tells is the current item has been answered or not\n * The item is considered answered when at least one response has been set to not empty {base : null}\n * @param {Object} runner - testRunner instance\n * @param {Boolean} [partially=true] - if false all questions must have been answered\n * @returns {Boolean}\n */\n isAnswered: function isAnswered(runner, partially) {\n var itemRunner = runner.itemRunner;\n var responses = itemRunner && itemRunner.getResponses();\n var count = 0;\n var empty = 0;\n var declarations, constraintValues;\n if (itemRunner) {\n declarations = currentItemHelper.getDeclarations(runner);\n constraintValues = currentItemHelper.guessInteractionConstraintValues(runner);\n _.forEach(declarations, function (declaration) {\n var attributes = declaration.attributes || {};\n var response = responses[attributes.identifier];\n var baseType = attributes.baseType;\n var cardinality = attributes.cardinality;\n count++;\n if (!currentItemHelper.isQuestionAnswered(response, baseType, cardinality, declaration.defaultValue, constraintValues[attributes.identifier])) {\n empty++;\n }\n });\n }\n if (partially === false) {\n return count > 0 && empty === 0;\n }\n return count > 0 && empty < count;\n },\n /**\n * Gets list of shared stimuli hrefs in the current item\n *\n * @param {Object} runner - testRunner instance\n * @returns {Array}\n */\n getStimuliHrefs: function getStimuliHrefs(runner) {\n var itemRunner = runner.itemRunner;\n var itemBody = itemRunner._item && itemRunner._item.bdy || {};\n var interactions = itemBody.elements || {};\n return _(interactions).values().filter(function (element) {\n return element.qtiClass === 'include';\n }).value().map(val => val.attributes ? val.attributes.href : null);\n },\n /**\n * Find the list of text stimulus ids in the current item\n * Depends on the DOM already being loaded\n * @param {Object} runner - testRunner instance\n * @returns {Array}\n */\n getTextStimuliHrefs: function getTextStimuliHrefs(runner) {\n var stimuli = this.getStimuliHrefs(runner);\n var textStimuli;\n if (stimuli.length > 0) {\n // Filter the ones containing text:\n textStimuli = stimuli.filter(function (stimulusHref) {\n var domNode = document.querySelector(`.qti-include[data-href=\"${stimulusHref}\"]`);\n return _(domNode.childNodes).some(function (child) {\n return child.nodeType === child.TEXT_NODE;\n });\n });\n return textStimuli;\n }\n return [];\n }\n };\n\n return currentItemHelper;\n\n});\n\n","define('taoQtiTest/runner/helpers/getTimerMessage',['i18n'], function (__) { 'use strict';\n\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n\n /**\n * Returns timer information string\n * @returns {Boolean}\n */\n function getTimerMessage(hours, minutes, seconds, unansweredQuestions, scope) {\n let timerMessage;\n const timeArr = [hours, minutes, seconds];\n const timeArgArr = [];\n [__('hours'), __('minutes'), __('seconds')].forEach((unit, idx) => {\n if (timeArr[idx] > 0) {\n timeArgArr.push(`${timeArr[idx]} ${unit}`);\n }\n });\n let answeredMessage;\n if (!unansweredQuestions || scope === 'item') {\n answeredMessage = __('the current question');\n } else {\n let questionsMessage = __('questions');\n if (unansweredQuestions === 1) {\n questionsMessage = __('question');\n }\n answeredMessage = __('remaining %s %s', unansweredQuestions, questionsMessage);\n }\n if (timeArgArr.length === 0) {\n timerMessage = __('%s to answer %s', 'no time left', answeredMessage);\n } else {\n timerMessage = __('%s to answer %s', timeArgArr.join(', '), answeredMessage);\n }\n return timerMessage;\n }\n\n return getTimerMessage;\n\n});\n\n","define('taoQtiTest/runner/helpers/map',['lodash'], function (_) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * @typedef {Object} itemStats\n * @property {Number} questions - the number of questions items\n * @property {Number} answered - the number of answered questions\n * @property {Number} flagged - the number of items flagged for review\n * @property {Number} viewed - the number of viewed items\n * @property {Number} total - the total number of items\n * @property {Number} questionsViewed - the number of viewed questions\n */\n\n /**\n * Gets an empty stats record\n * @returns {itemStats}\n */\n function getEmptyStats() {\n return {\n questions: 0,\n answered: 0,\n flagged: 0,\n viewed: 0,\n total: 0,\n questionsViewed: 0\n };\n }\n\n /**\n * Defines a helper that provides extractors for an assessment test map\n */\n var map = {\n /**\n * Gets the jumps table\n * @param {Object} map - The assessment test map\n * @returns {Object}\n */\n getJumps: function getJumps(map) {\n return map && map.jumps;\n },\n /**\n * Gets the parts table\n * @param {Object} map - The assessment test map\n * @returns {Object}\n */\n getParts: function getParts(map) {\n return map && map.parts;\n },\n /**\n * Get sections table\n * @param {Object} map - The assessment test map\n * @returns {Object} the sections\n */\n getSections: function getSections(map) {\n var parts = this.getParts(map),\n result = {};\n _.forEach(parts, function (part) {\n var sections = part.sections;\n if (sections) {\n _.forEach(sections, function (section) {\n result[section.id] = section;\n });\n }\n });\n return result;\n },\n /**\n * Get active item from the test map\n * @param {Object} mapWithActive - The assessment test map which has active part/section/item marked\n * @returns {Object} the active item\n */\n getActiveItem: function getActiveItem(mapWithActive) {\n var parts = this.getParts(mapWithActive),\n result = {};\n _.forEach(parts, function (part) {\n var sections = part.sections;\n if (sections) {\n _.forEach(sections, function (section) {\n if (section.active) {\n const items = section.items;\n _.forEach(items, function (item) {\n if (item.active) {\n result = item;\n }\n });\n }\n });\n }\n });\n return result;\n },\n /**\n * Return the list of remaining sections.\n * @param {Object} map - The assessment test map\n * @param {String} sectionId - The next sections will be gathered once this sectionId has been reached\n * @returns {Object} the next sections\n */\n getNextSections: function getNextSections(map, sectionId) {\n var sections = this.getSections(map),\n result = {},\n canList = false;\n _.forEach(sections, function (section) {\n if (canList) {\n result[section.id] = section;\n }\n if (section.id === sectionId) {\n canList = true;\n }\n });\n return result;\n },\n /**\n * Gets the jump at a particular position\n * @param {Object} map - The assessment test map\n * @param {Number} position - The position of the item\n * @returns {Object}\n */\n getJump: function getJump(map, position) {\n var jumps = this.getJumps(map);\n return jumps && jumps[position];\n },\n /**\n * Gets a test part by its identifier\n * @param {Object} map - The assessment test map\n * @param {String} partName - The identifier of the test part\n * @returns {Object}\n */\n getPart: function getPart(map, partName) {\n var parts = this.getParts(map);\n return parts && parts[partName];\n },\n /**\n * Gets a test section by its identifier\n * @param {Object} map - The assessment test map\n * @param {String} sectionName - The identifier of the test section\n * @returns {Object}\n */\n getSection: function getSection(map, sectionName) {\n var parts = this.getParts(map);\n var section = null;\n _.forEach(parts, function (part) {\n var sections = part.sections;\n if (sections && sections[sectionName]) {\n section = sections[sectionName];\n return false;\n }\n });\n return section;\n },\n /**\n * Gets a test item by its identifier\n * @param {Object} map - The assessment test map\n * @param {String} itemIdentifier - The identifier of the test item\n * @returns {Object}\n */\n getItem(map, itemIdentifier) {\n const jump = _.find(this.getJumps(map), {\n identifier: itemIdentifier\n });\n return this.getItemAt(map, jump && jump.position);\n },\n /**\n * Gets a test item by its identifier\n * @param {Object} map - The assessment test map\n * @param {String} itemIdentifier - The identifier of the test item\n * @returns {String[]} the raw list of categories\n */\n getItemCategories(map, itemIdentifier) {\n const item = this.getItem(map, itemIdentifier);\n if (item && Array.isArray(item.categories)) {\n return item.categories;\n }\n return [];\n },\n /**\n * Check if an item has a category\n * @param {Object} map - The assessment test map\n * @param {String} itemIdentifier - The identifier of the test item\n * @param {String} category - the category to check\n * @param {Boolean} [fuzzyMatch=false] - if true the prefix or the case doesn't matter\n * @returns {String[]} the raw list of categories\n */\n hasItemCategory(map, itemIdentifier, category) {\n let fuzzyMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n const taoPrefix = 'x-tao-option-';\n const categories = this.getItemCategories(map, itemIdentifier);\n if (!category || !category.length) {\n return false;\n }\n const exactMatch = categories.includes(category);\n if (exactMatch) {\n return true;\n }\n if (fuzzyMatch) {\n //check by adding the prefix first\n if (!category.startsWith(taoPrefix) && category.includes(`${taoPrefix}${category}`)) {\n return true;\n }\n\n //compare without the prefix and any case system\n const normalize = elt => elt.replace(taoPrefix, '').replace(/[-_\\s]/g, '').toLowerCase();\n return categories.some(itemCategory => normalize(itemCategory) === normalize(category));\n }\n return false;\n },\n /**\n * Gets the global stats of the assessment test\n * @param {Object} map - The assessment test map\n * @returns {itemStats}\n */\n getTestStats: function getTestStats(map) {\n return map && map.stats;\n },\n /**\n * Gets the stats of the test part containing a particular position\n * @param {Object} map - The assessment test map\n * @param {String} partName - The identifier of the test part\n * @returns {itemStats}\n */\n getPartStats: function getPartStats(map, partName) {\n var part = this.getPart(map, partName);\n return part && part.stats;\n },\n /**\n * Gets the stats of the test section containing a particular position\n * @param {Object} map - The assessment test map\n * @param {String} sectionName - The identifier of the test section\n * @returns {itemStats}\n */\n getSectionStats: function getSectionStats(map, sectionName) {\n var section = this.getSection(map, sectionName);\n return section && section.stats;\n },\n /**\n * Gets the stats related to a particular scope\n * @param {Object} map - The assessment test map\n * @param {Number} position - The current position\n * @param {String} [scope] - The name of the scope. Can be: test, part, section (default: test)\n * @returns {itemStats}\n */\n getScopeStats: function getScopeStats(map, position, scope) {\n var jump = this.getJump(map, position);\n switch (scope) {\n case 'section':\n case 'testSection':\n return this.getSectionStats(map, jump && jump.section);\n case 'part':\n case 'testPart':\n return this.getPartStats(map, jump && jump.part);\n\n // During calculation stats for this case,\n // we are considiring all unanswered inaccessible items as answered\n case 'testWithoutInaccessibleItems':\n {\n const testStats = this.getTestStats(map);\n const {\n position: currentPartPosition,\n isLinear: isCurrentPartLinear\n } = this.getPart(map, jump && jump.part);\n const parts = Object.values(this.getParts(map)).filter(_ref => {\n let {\n position: partPosition\n } = _ref;\n return partPosition < currentPartPosition;\n }).sort((a, b) => b - a);\n\n // Find the neirest part to which test taker can not navigate\n const linearPartIndex = isCurrentPartLinear ? 0 : parts.findIndex(_ref2 => {\n let {\n isLinear\n } = _ref2;\n return isLinear;\n });\n if (linearPartIndex === -1) {\n return testStats;\n }\n\n // Calculate all unanswered and flagged questions in inaccessible parts\n const inaccessibleParts = parts.slice(linearPartIndex);\n const countOfInaccessibleUnasweredQestions = inaccessibleParts.reduce((acc, _ref3) => {\n let {\n stats: {\n questions,\n answered\n }\n } = _ref3;\n return acc + (questions - answered);\n }, 0);\n const countOfInaccessibleFlaggedQestions = inaccessibleParts.reduce((acc, _ref4) => {\n let {\n stats: {\n flagged\n }\n } = _ref4;\n return acc + flagged;\n }, 0);\n return Object.assign({}, testStats, {\n answered: testStats.answered + countOfInaccessibleUnasweredQestions,\n flagged: testStats.flagged - countOfInaccessibleFlaggedQestions\n });\n }\n default:\n case 'test':\n return this.getTestStats(map);\n }\n },\n /**\n * Gets the map of a particular scope from a particular position\n * @param {Object} map - The assessment test map\n * @param {Number} position - The current position\n * @param {String} [scope] - The name of the scope. Can be: test, part, section (default: test)\n * @returns {object} The scoped map\n */\n getScopeMap: function getScopeMap(map, position, scope) {\n // need a clone of the map as we will change some properties\n var scopeMap = _.cloneDeep(map || {});\n\n // gets the current part and section\n var jump = this.getJump(scopeMap, position);\n var part = this.getPart(scopeMap, jump && jump.part);\n var section = this.getSection(scopeMap, jump && jump.section);\n\n // reduce the map to the scope part\n if (scope && scope !== 'test') {\n scopeMap.parts = {};\n if (part) {\n scopeMap.parts[jump.part] = part;\n }\n }\n\n // reduce the map to the scope section\n if (part && (scope === 'section' || scope === 'testSection')) {\n part.sections = {};\n if (section) {\n part.sections[jump.section] = section;\n }\n }\n\n // update the stats to reflect the scope\n if (section) {\n section.stats = this.computeItemStats(section.items);\n }\n if (part) {\n part.stats = this.computeStats(part.sections);\n }\n scopeMap.stats = this.computeStats(scopeMap.parts);\n return scopeMap;\n },\n /**\n * Gets the map of a particular scope from a current context\n * @param {Object} map - The assessment test map\n * @param {Object} context - The current session context\n * @param {String} [scope] - The name of the scope. Can be: test, part, section (default: test)\n * @returns {object} The scoped map\n */\n getScopeMapFromContext: function getScopeMapFromContext(map, context, scope) {\n // need a clone of the map as we will change some properties\n var scopeMap = _.cloneDeep(map || {});\n var part;\n var section;\n\n // gets the current part and section\n if (context && context.testPartId) {\n part = this.getPart(scopeMap, context.testPartId);\n }\n if (context && context.sectionId) {\n section = this.getSection(scopeMap, context.sectionId);\n }\n\n // reduce the map to the scope part\n if (scope && scope !== 'test') {\n scopeMap.parts = {};\n if (part) {\n scopeMap.parts[context.testPartId] = part;\n }\n }\n\n // reduce the map to the scope section\n if (part && (scope === 'section' || scope === 'testSection')) {\n part.sections = {};\n if (section) {\n part.sections[context.sectionId] = section;\n }\n }\n\n // update the stats to reflect the scope\n if (section) {\n section.stats = this.computeItemStats(section.items);\n }\n if (part) {\n part.stats = this.computeStats(part.sections);\n }\n scopeMap.stats = this.computeStats(scopeMap.parts);\n return scopeMap;\n },\n /**\n * Gets the test part containing a particular position\n * @param {Object} map - The assessment test map\n * @param {Number} position - The position of the item\n * @returns {Object}\n */\n getItemPart: function getItemPart(map, position) {\n var jump = this.getJump(map, position);\n return this.getPart(map, jump && jump.part);\n },\n /**\n * Gets the test section containing a particular position\n * @param {Object} map - The assessment test map\n * @param {Number} position - The position of the item\n * @returns {Object}\n */\n getItemSection: function getItemSection(map, position) {\n var jump = this.getJump(map, position);\n var part = this.getPart(map, jump && jump.part);\n var sections = part && part.sections;\n return sections && sections[jump && jump.section];\n },\n /**\n * Gets the item located at a particular position\n * @param {Object} map - The assessment test map\n * @param {Number} position - The position of the item\n * @returns {Object}\n */\n getItemAt: function getItemAt(map, position) {\n var jump = this.getJump(map, position);\n var part = this.getPart(map, jump && jump.part);\n var sections = part && part.sections;\n var section = sections && sections[jump && jump.section];\n var items = section && section.items;\n return items && items[jump && jump.identifier];\n },\n /**\n * Gets the identifier of an existing item\n * @param {Object} map - The assessment test map\n * @param {Number|String} position - The position of the item, can already be the identifier\n * @returns {String}\n */\n getItemIdentifier: function getItemIdentifier(map, position) {\n var item;\n if (_.isFinite(position)) {\n item = this.getItemAt(map, position);\n } else {\n item = this.getItem(map, position);\n }\n return item && item.id;\n },\n /**\n * Applies a callback on each item of the provided map\n * @param {Object} map - The assessment test map\n * @param {Function} callback(item, section, part, map) - A callback to apply on each item\n * @returns {Object}\n */\n each: function each(map, callback) {\n if (_.isFunction(callback)) {\n _.forEach(map && map.parts, function (part) {\n _.forEach(part && part.sections, function (section) {\n _.forEach(section && section.items, function (item) {\n callback(item, section, part, map);\n });\n });\n });\n }\n return map;\n },\n /**\n * Update the map stats from a particular item\n * @param {Object} map - The assessment test map\n * @param {Number} position - The position of the item\n * @returns {Object}\n */\n updateItemStats: function updateItemStats(map, position) {\n var jump = this.getJump(map, position);\n var part = this.getPart(map, jump && jump.part);\n var sections = part && part.sections;\n var section = sections && sections[jump && jump.section];\n if (section) {\n section.stats = this.computeItemStats(section.items);\n }\n if (part) {\n part.stats = this.computeStats(part.sections);\n }\n if (map) {\n map.stats = this.computeStats(map.parts);\n }\n return map;\n },\n /**\n * Computes the stats for a list of items\n * @param {Object} items\n * @returns {itemStats}\n */\n computeItemStats: function computeItemStats(items) {\n return _.reduce(items, function accStats(acc, item) {\n if (!item.informational) {\n acc.questions++;\n if (item.answered) {\n acc.answered++;\n }\n if (item.viewed) {\n acc.questionsViewed++;\n }\n }\n if (item.flagged) {\n acc.flagged++;\n }\n if (item.viewed) {\n acc.viewed++;\n }\n acc.total++;\n return acc;\n }, getEmptyStats());\n },\n /**\n * Computes the global stats of a collection of stats\n * @param {Object} collection\n * @returns {itemStats}\n */\n computeStats: function computeStats(collection) {\n return _.reduce(collection, function accStats(acc, item) {\n acc.questions += item.stats.questions;\n acc.answered += item.stats.answered;\n acc.flagged += item.stats.flagged;\n acc.viewed += item.stats.viewed;\n acc.total += item.stats.total;\n acc.questionsViewed += item.stats.questionsViewed;\n return acc;\n }, getEmptyStats());\n },\n /**\n * Patch a testMap with a partial testMap.\n *\n * If the currentMap is null or the scope is test,\n * we just use the partialMap as it is.\n *\n * Indexes, position and stats will be (re)built.\n *\n * @param {Object} currentMap - the map to patch\n * @param {Object} partialMap - the patch\n * @param {String} partialMap.scope - indicate the scope of the patch (test, part or section)\n * @returns {Object} the patched testMap\n * @throws {TypeError} if the partialMap is no a map\n */\n patch: function patch(currentMap, partialMap) {\n var self = this;\n var targetMap;\n if (!_.isPlainObject(partialMap) || !partialMap.parts) {\n throw new TypeError('Invalid test map format');\n }\n if (!currentMap || partialMap.scope === 'test') {\n targetMap = _.cloneDeep(partialMap);\n } else {\n targetMap = _.cloneDeep(currentMap);\n _.forEach(partialMap.parts, function (partialPart, targetPartId) {\n if (partialMap.scope === 'part') {\n //replace the target part\n targetMap.parts[targetPartId] = _.cloneDeep(partialPart);\n }\n if (partialMap.scope === 'section') {\n _.forEach(partialPart.sections, function (partialSection, targetSectionId) {\n //replace the target section\n targetMap.parts[targetPartId].sections[targetSectionId] = _.cloneDeep(partialSection);\n\n //compte new section stats\n targetMap.parts[targetPartId].sections[targetSectionId].stats = self.computeItemStats(targetMap.parts[targetPartId].sections[targetSectionId].items);\n });\n }\n //compte new/updated part stats\n targetMap.parts[targetPartId].stats = self.computeStats(targetMap.parts[targetPartId].sections);\n });\n //compte updated test stats\n targetMap.stats = this.computeStats(targetMap.parts);\n }\n\n //the updated map can have a different size than the original\n targetMap = this.reindex(targetMap);\n return targetMap;\n },\n /**\n * Rebuild the indexes, positions of all map parts.\n * Then recreate the jump table.\n *\n * @param {Object} map - the map to reindex\n * @returns {Object} the brand new map\n * @throws {TypeError} if the map is no a map\n */\n reindex: function reindex(map) {\n var offset = 0;\n var offsetPart = 0;\n var offsetSection = 0;\n var lastPartId;\n var lastSectionId;\n if (!_.isPlainObject(map) || !map.parts) {\n throw new TypeError('Invalid test map format');\n }\n\n //remove the jump table\n map.jumps = [];\n\n //browse the test map, by position\n _.sortBy(map && map.parts, 'position').forEach(function (part) {\n _.sortBy(part && part.sections, 'position').forEach(function (section) {\n _.sortBy(section && section.items, 'position').forEach(function (item) {\n if (lastPartId !== part.id) {\n offsetPart = 0;\n lastPartId = part.id;\n part.position = offset;\n }\n if (lastSectionId !== section.id) {\n offsetSection = 0;\n lastSectionId = section.id;\n section.position = offset;\n }\n item.position = offset;\n item.index = offsetSection + 1;\n item.positionInPart = offsetPart;\n item.positionInSection = offsetSection;\n map.jumps[offset] = {\n identifier: item.id,\n section: section.id,\n part: part.id,\n position: offset\n };\n offset++;\n offsetSection++;\n offsetPart++;\n });\n });\n });\n return map;\n },\n /**\n * Create the jump table for a test map\n *\n * @param {Object} map - the map\n * @returns {Object} the brand new map with a jump table\n * @throws {TypeError} if the map is no a map\n */\n createJumpTable: function createJumpTable(map) {\n if (!_.isPlainObject(map) || !map.parts) {\n throw new TypeError('Invalid test map format');\n }\n map.jumps = [];\n this.each(map, function (item, section, part) {\n var offset = item.position;\n map.jumps[offset] = {\n identifier: item.id,\n section: section.id,\n part: part.id,\n position: offset\n };\n });\n return map;\n }\n };\n\n return map;\n\n});\n\n","define('taoQtiTest/runner/helpers/isReviewPanelEnabled',['taoQtiTest/runner/helpers/map'], function (mapHelper) { 'use strict';\n\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n\n /**\n * Tells if the review panel is enabled\n * @returns {Boolean}\n */\n function isReviewPanelEnabled(runner) {\n const reviewEnabled = mapHelper.hasItemCategory(runner.getTestMap(), runner.getTestContext().itemIdentifier, 'reviewScreen', true);\n const itemReviewEnabled = runner.getOptions().review.enabled;\n return reviewEnabled && itemReviewEnabled;\n }\n\n return isReviewPanelEnabled;\n\n});\n\n","define('taoQtiTest/runner/helpers/stats',['lodash', 'taoQtiTest/runner/helpers/map', 'taoQtiTest/runner/helpers/currentItem'], function (_, mapHelper, currentItemHelper) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n currentItemHelper = currentItemHelper && Object.prototype.hasOwnProperty.call(currentItemHelper, 'default') ? currentItemHelper['default'] : currentItemHelper;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2019 (original work) Open Assessment Technologies SA ;\n */\n var stats = {\n /**\n * Return scope stats that takes into account any test taker interaction made since the item has been loaded\n * @param {String} scope - scope to consider for calculating the stats\n * @param {Object} runner - testRunner instance\n * @param {Boolean} sync - flag for sync the unanswered stats in exit message and the unanswered stats in the toolbox. Default false\n * @returns {Object} the stats\n */\n getInstantStats(scope, runner, sync) {\n const map = runner.getTestMap();\n const context = runner.getTestContext();\n const item = runner.getCurrentItem();\n const testPart = runner.getCurrentPart();\n const stats = _.clone(mapHelper.getScopeStats(map, context.itemPosition, scope));\n const options = runner.getOptions() || {};\n let partiallyAnsweredIsAnswered;\n if (options.review) {\n partiallyAnsweredIsAnswered = options.review.partiallyAnsweredIsAnswered;\n }\n if (!item.informational) {\n const isItemCurrentlyAnswered = currentItemHelper.isAnswered(runner, partiallyAnsweredIsAnswered);\n if (!isItemCurrentlyAnswered && item.answered) {\n stats.answered--;\n } else if ((isItemCurrentlyAnswered || sync) && !item.answered) {\n stats.answered++;\n // eslint-disable-next-line no-dupe-else-if\n } else if (sync && !isItemCurrentlyAnswered && item.answered && testPart.isLinear) {\n stats.answered++;\n }\n }\n return stats;\n }\n };\n\n return stats;\n\n});\n\n","define('taoQtiTest/runner/helpers/messages',['i18n', 'taoQtiTest/runner/helpers/stats', 'handlebars', 'lib/handlebars/helpers'], function (__, statsHelper, Handlebars, Helpers0) { 'use strict';\n\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n statsHelper = statsHelper && Object.prototype.hasOwnProperty.call(statsHelper, 'default') ? statsHelper['default'] : statsHelper;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var stack1, functionType=\"function\", escapeExpression=this.escapeExpression, self=this;\n\n function program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\";\n if (helper = helpers.header) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.header); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"

        \";\n return buffer;\n }\n\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.header), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { return stack1; }\n else { return ''; }\n });\n function messageHeaderTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2021 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Completes an exit message\n * @param {String} scope - scope to consider for calculating the stats\n * @param {Object} runner - testRunner instance\n * @param {String} message - custom message that will be appended to the unanswered stats count\n * @param {Boolean} sync - flag for sync the unanswered stats in exit message and the unanswered stats in the toolbox\n * @param {String|undefined} submitButtonLabel - point the user to the submit button\n * @returns {String} Returns the message text\n */\n function getExitMessage(scope, runner) {\n let message = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n let sync = arguments.length > 3 ? arguments[3] : undefined;\n let submitButtonLabel = arguments.length > 4 ? arguments[4] : undefined;\n let itemsCountMessage = '';\n const testRunnerOptions = runner.getOptions();\n const messageEnabled = testRunnerOptions.enableUnansweredItemsWarning;\n if (messageEnabled) {\n itemsCountMessage = getUnansweredItemsWarning(scope, runner, sync).trim();\n if (itemsCountMessage) {\n itemsCountMessage += '.';\n }\n }\n return `${getHeader(scope)}${itemsCountMessage} ${getActionMessage(scope, submitButtonLabel)}${message}`.trim();\n }\n\n /**\n * Build message if not all items have answers\n * @param {String} scope - scope to consider for calculating the stats\n * @returns {String} Returns the message text\n */\n function getHeader(scope) {\n let header = '';\n if (scope === 'section' || scope === 'testSection') {\n header = __('You are about to leave this section.');\n } else if (scope === 'test' || scope === 'testWithoutInaccessibleItems') {\n header = __('You are about to submit the test.');\n } else if (scope === 'part') {\n header = __('You are about to submit this test part.');\n }\n return messageHeaderTpl({\n header: header.trim()\n });\n }\n\n /**\n * Generates the message to help users perform the action\n * @param {String} scope - scope to consider for calculating the stats\n * @param {String} [submitButtonLabel] - Pointed user perform click on given button\n * @returns {String} Returns the message text\n */\n function getActionMessage(scope) {\n let submitButtonLabel = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : __('OK');\n var msg;\n switch (scope) {\n case 'section':\n case 'testSection':\n case 'part':\n return __('Click \"%s\" to continue.', submitButtonLabel).trim();\n case 'test':\n case 'testWithoutInaccessibleItems':\n msg = __('You will not be able to access this test once submitted. Click \"%s\" to continue and submit the test.', submitButtonLabel);\n return `${msg}`;\n }\n return '';\n }\n\n /**\n * Build message for the flagged items if any.\n * @param {Object} stats - The stats for the current context\n * @param {String} [message] - The existing message to complete\n * @returns {string|*}\n */\n function getFlaggedItemsWarning(stats) {\n let message = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n const flaggedCount = stats && stats.flagged;\n if (!flaggedCount) {\n return message;\n }\n if (message) {\n return `${message} ${__('and you flagged %s item(s) that you can review now', flaggedCount.toString())}`;\n }\n return __('You flagged %s item(s) that you can review now', flaggedCount.toString());\n }\n\n /**\n * Build message if not all items have answers\n * @param {String} scope - scope to consider for calculating the stats\n * @param {Object} runner - testRunner instance\n * @param {Boolean} sync - flag for sync the unanswered stats in exit message and the unanswered stats in the toolbox. Default false\n * @returns {String} Returns the message text\n */\n function getUnansweredItemsWarning(scope, runner, sync) {\n const stats = statsHelper.getInstantStats(scope, runner, sync);\n const unansweredCount = stats && stats.questions - stats.answered;\n const flaggedCount = stats && stats.flagged;\n let itemsCountMessage = '';\n if (scope === 'section' || scope === 'testSection') {\n itemsCountMessage = __('You answered %s of %s question(s) for this section of the test', stats.answered.toString(), stats.questions.toString());\n if (flaggedCount) {\n itemsCountMessage += `, ${__('and flagged %s of them', flaggedCount.toString())}`;\n }\n } else if (scope === 'test' || scope === 'testWithoutInaccessibleItems') {\n if (unansweredCount > 1) {\n itemsCountMessage = __('There are %s unanswered questions', unansweredCount.toString());\n } else if (unansweredCount === 1) {\n itemsCountMessage = __('There is %s unanswered question', unansweredCount.toString());\n }\n if (flaggedCount) {\n itemsCountMessage = getFlaggedItemsWarning(stats, itemsCountMessage);\n }\n } else if (scope === 'part') {\n if (unansweredCount > 1) {\n itemsCountMessage = __('There are %s unanswered questions in this part of the test', unansweredCount.toString());\n } else if (unansweredCount === 1) {\n itemsCountMessage = __('There is %s unanswered question in this part of the test', unansweredCount.toString());\n }\n if (flaggedCount) {\n itemsCountMessage = getFlaggedItemsWarning(stats, itemsCountMessage);\n }\n }\n itemsCountMessage = itemsCountMessage.trim();\n return itemsCountMessage;\n }\n var messages = {\n getExitMessage: getExitMessage\n };\n\n return messages;\n\n});\n\n","define('taoQtiTest/runner/helpers/navigation',['lodash', 'taoQtiTest/runner/helpers/map'], function (_, mapHelper) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * @typedef {Object} navigationHelper\n */\n var navigationHelper = {\n /**\n * Check whether the test taker is leaving a section\n *\n * @param {Object} testContext - the actual test context\n * @param {String} testContext.itemIdentifier - the id of the current item\n * @param {String} testContext.sectionId - the id of the current section\n * @param {Object} testMap - the actual test map\n * @param {String} direction - the move direction (next, previous or jump)\n * @param {String} scope - the move scope (item, section, testPart)\n * @param {Number} [position] - the position in case of jump\n * @returns {Boolean} true if the action leads to a section leave\n * @throws {TypeError} if the context or the map are incorrect\n */\n isLeavingSection: function isLeavingSection(testContext, testMap, direction, scope, position) {\n var section;\n var sectionStats;\n var nbItems;\n var item;\n if (_.isPlainObject(testContext) && _.isPlainObject(testMap) && !_.isEmpty(testContext.sectionId) && !_.isEmpty(testContext.itemIdentifier)) {\n section = mapHelper.getSection(testMap, testContext.sectionId);\n sectionStats = mapHelper.getSectionStats(testMap, testContext.sectionId);\n nbItems = sectionStats && sectionStats.total;\n item = mapHelper.getItem(testMap, testContext.itemIdentifier);\n return scope === 'section' || scope === 'testPart' || direction === 'next' && item.positionInSection + 1 === nbItems || direction === 'previous' && item.positionInSection === 0 || direction === 'jump' && position > 0 && (position < section.position || position >= section.position + nbItems);\n }\n throw new TypeError('Invalid test context and test map');\n },\n /**\n * Check whether the test taker is leaving a test part\n *\n * @param {Object} testContext - the actual test context\n * @param {String} testContext.itemIdentifier - the id of the current item\n * @param {String} testContext.sectionId - the id of the current section\n * @param {String} testContext.testPartId - the id of the current testPart\n * @param {Object} testMap - the actual test map\n * @param {String} direction - the move direction (next, previous or jump)\n * @param {String} scope - the move scope (item, section, testPart)\n * @param {Number} [position] - the position in case of jump\n * @returns {Boolean} true if the action leads to a section leave\n * @throws {TypeError} if the context or the map are incorrect\n */\n isLeavingTestPart: function isLeavingTestPart(testContext, testMap, direction, scope, position) {\n var testPart;\n var testPartStats;\n var nbItems;\n var item;\n var section;\n var sectionStats;\n if (_.isPlainObject(testContext) && _.isPlainObject(testMap) && !_.isEmpty(testContext.testPartId) && !_.isEmpty(testContext.sectionId) && !_.isEmpty(testContext.itemIdentifier)) {\n testPart = mapHelper.getPart(testMap, testContext.testPartId);\n testPartStats = mapHelper.getPartStats(testMap, testContext.testPartId);\n nbItems = testPartStats && testPartStats.total;\n item = mapHelper.getItem(testMap, testContext.itemIdentifier);\n if (scope === 'section') {\n section = mapHelper.getSection(testMap, testContext.sectionId);\n sectionStats = mapHelper.getSectionStats(testMap, testContext.sectionId);\n }\n return scope === 'testPart' || direction === 'next' && scope === 'item' && item.positionInPart + 1 === nbItems || direction === 'next' && scope === 'section' && section.position + sectionStats.total >= nbItems || direction === 'previous' && scope === 'item' && item.positionInPart === 0 || direction === 'previous' && scope === 'section' && section.position === testPart.position || direction === 'jump' && position > 0 && (position < testPart.position || position >= testPart.position + nbItems);\n }\n throw new TypeError('Invalid test context and test map');\n },\n /**\n * Check if the given item is the last of the test\n * @param {Object} testMap - the test map\n * @param {String} itemIdentifier - the identifier of the item\n * @returns {Boolean} true if the item is the last one\n */\n isLast: function isLast(testMap, itemIdentifier) {\n return this.isLastOf(testMap, itemIdentifier, 'test');\n },\n /**\n * Check if the given item is the first of a test\n * @param {Object} testMap - the test map\n * @param {String} itemIdentifier - the identifier of the item\n * @returns {Boolean} true if the item is the first one\n */\n isFirst: function isFirst(testMap, itemIdentifier) {\n return this.isFirstOf(testMap, itemIdentifier, 'test');\n },\n /**\n * Check if the given item is the last of a the given scope\n * @param {Object} testMap - the test map\n * @param {String} itemIdentifier - the identifier of the item\n * @param {String} [scope = 'test'] - the target scope\n * @returns {Boolean} true if the item is the last one\n */\n isLastOf: function isLastOf(testMap, itemIdentifier, scope) {\n var item;\n var stats;\n if (!_.isPlainObject(testMap)) {\n throw new TypeError('Invalid test map');\n }\n if (_.isEmpty(itemIdentifier)) {\n throw new TypeError('Invalid item identifier');\n }\n scope = scope || 'test';\n item = mapHelper.getItem(testMap, itemIdentifier);\n stats = mapHelper.getScopeStats(testMap, item.position, scope);\n if (stats && _.isNumber(stats.total)) {\n if (scope === 'test') {\n return item.position + 1 === stats.total;\n }\n if (scope === 'section' || scope === 'assessmentSection' || scope === 'testSection') {\n return item.positionInSection + 1 === stats.total;\n }\n if (scope === 'part' || scope === 'testPart') {\n return item.positionInPart + 1 === stats.total;\n }\n }\n return false;\n },\n /**\n * Check if the given item is the first of a the given scope\n * @param {Object} testMap - the test map\n * @param {String} itemIdentifier - the identifier of the item\n * @param {String} [scope = 'test'] - the target scope\n * @returns {Boolean} true if the item is the first one\n */\n isFirstOf: function isFirstOf(testMap, itemIdentifier, scope) {\n var item;\n if (!_.isPlainObject(testMap)) {\n throw new TypeError('Invalid test map');\n }\n if (_.isEmpty(itemIdentifier)) {\n throw new TypeError('Invalid item identifier');\n }\n scope = scope || 'test';\n item = mapHelper.getItem(testMap, itemIdentifier);\n if (scope === 'test') {\n return item.position === 0;\n }\n if (scope === 'section' || scope === 'assessmentSection' || scope === 'testSection') {\n return item.positionInSection === 0;\n }\n if (scope === 'part' || scope === 'testPart') {\n return item.positionInPart === 0;\n }\n return false;\n },\n /**\n * Gets the map descriptors of the sibling items\n * @param {Object} testMap\n * @param {Number|String} itemPosition - (could be also the item id)\n * @param {String} [direction='both'] - previous/next/both\n * @param {Number} [size=3] - will be 2xsize if direction is both\n * @returns {Object[]} the collections of items\n */\n getSiblingItems: function getSiblingItems(testMap, itemPosition, direction, size) {\n var itemId = mapHelper.getItemIdentifier(testMap, itemPosition);\n var previous = null;\n var siblings = [];\n var directions;\n var itemChain = _.reduce(testMap && testMap.jumps, function (map, jump) {\n var ref = jump.identifier;\n if (previous) {\n map[previous].next = ref;\n }\n map[ref] = {\n identifier: ref,\n previous: previous,\n next: null\n };\n previous = ref;\n return map;\n }, {});\n size = _.isFinite(size) ? parseInt(size, 10) : 3;\n if (!direction || direction === 'both') {\n directions = ['previous', 'next'];\n } else {\n directions = [direction];\n }\n _.forEach(directions, function walkDirection(link) {\n var id = itemId;\n _.times(size, function getNeighbor() {\n id = itemChain[id] && itemChain[id][link];\n if (id) {\n siblings.push(mapHelper.getItem(testMap, id));\n } else {\n return false;\n }\n });\n });\n return siblings;\n },\n /**\n * Gets the map descriptor of the next item\n * @param {Object} testMap\n * @param {Number|String} itemPosition - (could be also the item id)\n * @returns {Object}\n */\n getNextItem: function getNextItem(testMap, itemPosition) {\n var siblings = navigationHelper.getSiblingItems(testMap, itemPosition, 'next', 1);\n if (siblings.length) {\n return siblings[0];\n }\n return null;\n },\n /**\n * Gets the map descriptor of the previous item\n * @param {Object} testMap\n * @param {Number|String} itemPosition - (could be also the item id)\n * @returns {Object}\n */\n getPreviousItem: function getPreviousItem(testMap, itemPosition) {\n var siblings = navigationHelper.getSiblingItems(testMap, itemPosition, 'previous', 1);\n if (siblings.length) {\n return siblings[0];\n }\n return null;\n },\n /**\n * Checks if an action will move forward.\n * @param {String} action - the name of the action that will be performed\n * @param {Object} [params] - some optional parameters that apply to the action\n * @returns {Boolean}\n */\n isMovingToNextItem: function isMovingToNextItem(action, params) {\n params = params || {};\n return action === 'timeout' || action === 'skip' || action === 'move' && params.direction === 'next' && params.scope === 'item';\n },\n /**\n * Checks if an action will move backward.\n * @param {String} action - the name of the action that will be performed\n * @param {Object} [params] - some optional parameters that apply to the action\n * @returns {Boolean}\n */\n isMovingToPreviousItem: function isMovingToPreviousItem(action, params) {\n params = params || {};\n return action === 'move' && params.direction === 'previous' && params.scope === 'item';\n },\n /**\n * Checks if an action will jump on another item.\n * @param {String} action - the name of the action that will be performed\n * @param {Object} [params] - some optional parameters that apply to the action\n * @returns {Boolean}\n */\n isJumpingToItem: function isJumpingToItem(action, params) {\n params = params || {};\n return action === 'move' && params.direction === 'jump' && params.scope === 'item';\n }\n };\n\n return navigationHelper;\n\n});\n\n","define('taoQtiTest/runner/helpers/offlineErrorHelper',['lodash', 'i18n'], function (_, __) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * @typedef {Object} OfflineErrorObject\n * @property {string} message\n * @property {Object} data\n * @property {boolean} data.success\n * @property {string} data.source\n * @property {string} data.purpose\n * @property {string} data.type\n * @property {number} data.code\n */\n\n var offlineErrorHelper = {\n /**\n * Builds a new Error object from the given context and returns it\n * @param {Object} errorData\n * @param {Object} [context]\n * @returns {Object}\n */\n buildErrorFromContext: function buildErrorFromContext(errorData, context) {\n var err = _.assign(new Error(errorData.message), errorData.data);\n return _.assign(err, context || {});\n },\n /**\n * Returns an object which contains the required data to compose an OfflineNavigationError.\n * This error get triggered in case when the test taker is unable to navigate offline.\n *\n * @returns {OfflineErrorObject}\n */\n getOfflineNavError: function getOfflineNavError() {\n return {\n message: __('We are unable to connect to the server to retrieve the next item.'),\n data: {\n success: false,\n source: 'navigator',\n purpose: 'proxy',\n type: 'nav',\n code: 404\n }\n };\n },\n /**\n * Returns an object which contains the required data to compose an OfflineExitError.\n * This error get triggered in case when the test taker is unable to exit the test offline.\n *\n * @returns {OfflineErrorObject}\n */\n getOfflineExitError: function getOfflineExitError() {\n return {\n message: __('We are unable to connect the server to submit your results.'),\n data: {\n success: false,\n source: 'navigator',\n purpose: 'proxy',\n type: 'finish',\n code: 404\n }\n };\n },\n /**\n * Returns an object which contains the required data to compose an OfflinePauseError.\n * This error get triggered in case when the test get paused in offline mode.\n *\n * @returns {OfflineErrorObject}\n */\n getOfflinePauseError: function getOfflinePauseError() {\n return {\n message: __('The test has been paused, we are unable to connect to the server.'),\n data: {\n success: false,\n source: 'navigator',\n purpose: 'proxy',\n type: 'pause',\n code: 404\n }\n };\n }\n };\n\n return offlineErrorHelper;\n\n});\n\n","define('taoQtiTest/runner/helpers/offlineSyncModal',['jquery', 'i18n', 'core/polling', 'ui/hider', 'ui/waitingDialog/waitingDialog', 'handlebars', 'lib/handlebars/helpers', 'util/shortcut/registry', 'util/shortcut'], function ($$1, __, polling, hider, waitingDialogFactory, Handlebars, Helpers0, shortcutRegistry, globalShortcut) { 'use strict';\n\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n polling = polling && Object.prototype.hasOwnProperty.call(polling, 'default') ? polling['default'] : polling;\n hider = hider && Object.prototype.hasOwnProperty.call(hider, 'default') ? hider['default'] : hider;\n waitingDialogFactory = waitingDialogFactory && Object.prototype.hasOwnProperty.call(waitingDialogFactory, 'default') ? waitingDialogFactory['default'] : waitingDialogFactory;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n shortcutRegistry = shortcutRegistry && Object.prototype.hasOwnProperty.call(shortcutRegistry, 'default') ? shortcutRegistry['default'] : shortcutRegistry;\n globalShortcut = globalShortcut && Object.prototype.hasOwnProperty.call(globalShortcut, 'default') ? globalShortcut['default'] : globalShortcut;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); \n\n\n return \"

        \\n\";\n });\n function offlineSyncModalCountdownTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template$1 = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", helper, options, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;\n\n\n buffer += \"
        \\n

        \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"It is not possible to save your responses while working offline.\", options) : helperMissing.call(depth0, \"__\", \"It is not possible to save your responses while working offline.\", options)))\n + \"

        \\n

        \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Option A\", options) : helperMissing.call(depth0, \"__\", \"Option A\", options)))\n + \"

        \\n
          \\n
        • \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Wait for your connection to come back online.\", options) : helperMissing.call(depth0, \"__\", \"Wait for your connection to come back online.\", options)))\n + \"
        • \\n
        • \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Try connecting the machine to the internet via cable, or move to an area with a better wifi signal.\", options) : helperMissing.call(depth0, \"__\", \"Try connecting the machine to the internet via cable, or move to an area with a better wifi signal.\", options)))\n + \"
        • \\n
        • \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"If the connection cannot be restored, see option B.\", options) : helperMissing.call(depth0, \"__\", \"If the connection cannot be restored, see option B.\", options)))\n + \"
        • \\n
        \\n

        \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Option B\", options) : helperMissing.call(depth0, \"__\", \"Option B\", options)))\n + \"

        \\n
          \\n
        • \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Download the pupil responses and submit manually.\", options) : helperMissing.call(depth0, \"__\", \"Download the pupil responses and submit manually.\", options)))\n + \"
        • \\n
        \\n

        \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Step 1: Download the file (see below when available).\", options) : helperMissing.call(depth0, \"__\", \"Step 1: Download the file (see below when available).\", options)))\n + \" \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Do not rename it.\", options) : helperMissing.call(depth0, \"__\", \"Do not rename it.\", options)))\n + \"

        \\n

        \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Step 2: When you are online again, please send the downloaded file to receptionbaseline@nfer.ac.uk together with the \", options) : helperMissing.call(depth0, \"__\", \"Step 2: When you are online again, please send the downloaded file to receptionbaseline@nfer.ac.uk together with the \", options)))\n + \"\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"name of the pupil\", options) : helperMissing.call(depth0, \"__\", \"name of the pupil\", options)))\n + \" \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"and\", options) : helperMissing.call(depth0, \"__\", \"and\", options)))\n + \" \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"the assessment (LCL or Mathematics)\", options) : helperMissing.call(depth0, \"__\", \"the assessment (LCL or Mathematics)\", options)))\n + \" \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"that was being taken.\", options) : helperMissing.call(depth0, \"__\", \"that was being taken.\", options)))\n + \"\\n

        \\n

        \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Step 3: Once you have downloaded the file you can close the browser window. Do not do anything further with the assessment whilst it shows as \\\"in progress\\\"; the status will be updated once the helpline has uploaded the file.\", options) : helperMissing.call(depth0, \"__\", \"Step 3: Once you have downloaded the file you can close the browser window. Do not do anything further with the assessment whilst it shows as \\\"in progress\\\"; the status will be updated once the helpline has uploaded the file.\", options)))\n + \"

        \\n
        \\n

        \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"If you need help, please contact our Helpline on 0330 088 4171.\", options) : helperMissing.call(depth0, \"__\", \"If you need help, please contact our Helpline on 0330 088 4171.\", options)))\n + \"

        \\n
        \";\n return buffer;\n });\n function offlineSyncModalWaitContentTpl(data, options, asString) {\n var html = Template$1(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Display the waiting dialog, while waiting the connection to be back\n * @param {Object} [proxy] - test runner proxy\n * @returns {waitingDialog} resolves once the wait is over and the user click on 'proceed'\n */\n function offlineSyncModalFactory(proxy) {\n const waitingConfig = {\n message: __('You are currently working offline.'),\n waitContent: offlineSyncModalWaitContentTpl(),\n proceedContent: __('Your connection seems to be back, please proceed.'),\n proceedButtonText: __('PROCEED & END ASSESSMENT'),\n showSecondary: true,\n secondaryButtonText: __('Download'),\n secondaryButtonIcon: 'download',\n buttonSeparatorText: __('or'),\n width: '600px'\n };\n let $secondaryButton;\n const betweenButtonTextSelector = '.between-buttons-text';\n const secondaryButtonWait = 60; // seconds to wait until it enables\n let delaySec;\n const $countdown = $$1(offlineSyncModalCountdownTpl());\n let countdownPolling;\n const dialogShortcut = shortcutRegistry($$1('body'), {\n propagate: false,\n prevent: true\n });\n\n // starts with shortcuts disabled, prevents the TAB key to be used to move outside the dialog box\n dialogShortcut.disable().set('Tab Shift+Tab');\n\n //creates the waiting modal dialog\n const waitingDialog = waitingDialogFactory(waitingConfig);\n const getDialogEl = selector => waitingDialog.dialog.getDom().find(selector);\n waitingDialog.on('render', () => {\n delaySec = secondaryButtonWait;\n $secondaryButton = getDialogEl('button[data-control=\"secondary\"]');\n $countdown.insertAfter($secondaryButton);\n proxy.after('reconnect.waiting', () => {\n waitingDialog.endWait();\n hider.hide(getDialogEl('p.message'));\n });\n proxy.before('disconnect.waiting', () => {\n // need to open dialog again if it is closed\n waitingDialog.dialog.show();\n waitingDialog.beginWait();\n });\n\n // if render comes before beginWait:\n if (waitingDialog.is('waiting')) {\n waitingDialog.trigger('begincountdown');\n }\n globalShortcut.disable();\n dialogShortcut.enable();\n }).on('destroy', () => {\n proxy.off('.waiting');\n globalShortcut.enable();\n dialogShortcut.disable();\n dialogShortcut.clear();\n }).on('wait', () => {\n hider.show(getDialogEl(betweenButtonTextSelector));\n hider.show(getDialogEl('p.message'));\n // if beginWait comes before render:\n if (waitingDialog.is('rendered')) {\n waitingDialog.trigger('begincountdown');\n }\n }).on('begincountdown', () => {\n // Set up secondary button time delay:\n // it can only be clicked after 60 seconds have passed\n // if disconnect-reconnect delay will be left seconds\n $secondaryButton.prop('disabled', true);\n countdownPolling = polling({\n action: function countdownAction() {\n delaySec--;\n $countdown.html(__('The download will be available in %d seconds', delaySec));\n if (delaySec < 1) {\n this.stop();\n $secondaryButton.removeProp('disabled');\n $countdown.html('');\n }\n },\n interval: 1000,\n autoStart: true\n });\n }).on('unwait', () => {\n countdownPolling.stop();\n $secondaryButton.prop('disabled', true);\n $countdown.html('');\n hider.hide(getDialogEl(betweenButtonTextSelector));\n });\n return waitingDialog;\n }\n\n return offlineSyncModalFactory;\n\n});\n\n","define('taoQtiTest/runner/helpers/testContextBuilder',['lodash', 'util/capitalize', 'taoQtiTest/runner/helpers/map', 'taoQtiTest/runner/helpers/navigation'], function (_, capitalize, mapHelper, navigationHelper) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n capitalize = capitalize && Object.prototype.hasOwnProperty.call(capitalize, 'default') ? capitalize['default'] : capitalize;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n navigationHelper = navigationHelper && Object.prototype.hasOwnProperty.call(navigationHelper, 'default') ? navigationHelper['default'] : navigationHelper;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Returns the updated test context from an item in the given position.\n *\n * @param {Object} testContext\n * @param {Object} testMap\n * @param {Integer} position\n * @returns {Object}\n */\n function buildTestContextFromPosition(testContext, testMap, position, attempt) {\n var updatedMap = mapHelper.updateItemStats(testMap, position),\n item = mapHelper.getItemAt(updatedMap, position),\n section = mapHelper.getItemSection(updatedMap, position),\n part = mapHelper.getItemPart(updatedMap, position);\n if (!item) {\n return false;\n }\n return getTestContext(testContext, testMap, item, section, part, position, attempt);\n }\n\n /**\n * Returns the updated test context from a jump table entry.\n *\n * @param {Object} testContext\n * @param {Object} testMap\n * @param {Object} jump\n * @param {String} jump.item\n * @param {String} jump.section\n * @param {String} jump.part\n * @param {Integer} jump.position\n * @returns {Object}\n */\n function buildTestContextFromJump(testContext, testMap, jump, attempt) {\n var part = testMap.parts[jump.part],\n section = part.sections[jump.section],\n item = section.items[jump.item];\n return getTestContext(testContext, testMap, item, section, part, jump.position, attempt);\n }\n\n /**\n * Returns the updated test context.\n *\n * @param {Object} testContext\n * @param {Object} testMap\n * @param {Object} item\n * @param {String} item.id\n * @param {Boolean} item.answered\n * @param {Integer} item.remainingAttempts\n * @param {Object} item.timeConstraint\n * @param {String[]} item.categories\n * @param {Object} section\n * @param {String} section.id\n * @param {String} section.label\n * @param {Object} section.timeConstraint\n * @param {Object} part\n * @param {String} part.id\n * @param {Boolean} part.isLinear\n * @param {Object} part.timeConstraint\n * @param {Integer} position\n * @returns {Object} the new test context\n * @private\n */\n function getTestContext(testContext, testMap, item, section, part, position, attempt) {\n var isLeavingSection = section.id !== testContext.sectionId,\n isLeavingPart = part.id !== testContext.testPartId,\n newTestContext = _.defaults({\n itemIdentifier: item.id,\n itemPosition: position,\n remainingAttempts: Math.max(-1, item.remainingAttempts - 1),\n sectionId: section.id,\n sectionTitle: section.label,\n testPartId: part.id,\n canMoveBackward: !part.isLinear && !navigationHelper.isFirst(testMap, item.id)\n }, testContext);\n if (attempt) {\n newTestContext.attempt = attempt + 1;\n }\n if (isLeavingSection) {\n newTestContext.numberRubrics = 0;\n newTestContext.rubrics = '';\n }\n newTestContext.timeConstraints = _.reject(testContext.timeConstraints, function (constraint) {\n return constraint.qtiClassName === 'assessmentItemRef' || isLeavingSection && constraint.qtiClassName === 'assessmentSection' || isLeavingPart && constraint.qtiClassName === 'testPart';\n });\n if (item.timeConstraint) {\n newTestContext.timeConstraints.push(item.timeConstraint);\n }\n if (isLeavingSection && section.timeConstraint) {\n newTestContext.timeConstraints.push(section.timeConstraint);\n }\n if (isLeavingPart && part.timeConstraint) {\n newTestContext.timeConstraints.push(part.timeConstraint);\n }\n newTestContext.options = _.defaults(getOptionsFromCategories(item.categories || []), _.pick(testContext.options, ['allowComment', 'allowSkipping', 'exitButton', 'logoutButton']));\n return newTestContext;\n }\n\n /**\n * Transforms the categories into context options.\n *\n * @param {String[]} categories - the list of categories\n * @returns {Object} the options object like \n * @private\n */\n function getOptionsFromCategories(categories) {\n if (!_.isArray(categories) || !categories.length) {\n return {};\n }\n return _.reduce(categories, function (acc, category) {\n var categoryName;\n if (_.isString(category) && !_.isEmpty(category)) {\n // transfrom the category name in an option name:\n // x-tao-option-review-screen to reviewScreen\n categoryName = category.replace('x-tao-option-', '').split(/[-_]+/g).map(function (name, index) {\n if (index === 0) {\n return name;\n }\n if (name.length) {\n return capitalize(name);\n }\n return '';\n }).join('');\n if (categoryName) {\n acc[categoryName] = true;\n }\n }\n return acc;\n }, {});\n }\n var testContextBuilder = {\n buildTestContextFromPosition: buildTestContextFromPosition,\n buildTestContextFromJump: buildTestContextFromJump\n };\n\n return testContextBuilder;\n\n});\n\n","define('taoQtiTest/runner/navigator/navigator',['lodash', 'taoQtiTest/runner/helpers/map', 'taoQtiTest/runner/helpers/testContextBuilder'], function (_, mapHelper, testContextBuilder) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n testContextBuilder = testContextBuilder && Object.prototype.hasOwnProperty.call(testContextBuilder, 'default') ? testContextBuilder['default'] : testContextBuilder;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Gives you a navigator\n * @param {Object} testContext\n * @param {Object} testMap\n * @returns {Object} the navigator\n * @throws {TypeError} if the given parameters aren't objects\n */\n var navigatorFactory = function navigatorFactory(testContext, testMap) {\n if (![testContext, testMap].every(_.isPlainObject)) {\n throw new TypeError('The navigator must be built with a testData, a testContext and a testMap');\n }\n return {\n /**\n * Selects and execute the navigation method based on the direction/scope.\n *\n * @param {String} direction - the move direction (next, previous or jump)\n * @param {String} scope - the move scope (item, section, testPart)\n * @param {Number} [position] - the position in case of jump\n * @returns {Object|Boolean} - false if we can't navigate, otherwise the result of the nav\n */\n navigate: function navigate(direction, scope, position) {\n var methodName = direction.toLowerCase() + scope.substr(0, 1).toUpperCase() + scope.substr(1).toLowerCase();\n if (_.isFunction(this[methodName])) {\n return this[methodName](position);\n }\n },\n /**\n * Navigate to the next item\n * @returns {Object} the new test context\n */\n nextItem: function nextItem() {\n return testContextBuilder.buildTestContextFromPosition(testContext, testMap, testContext.itemPosition + 1);\n },\n /**\n * Navigate to the next item\n * @returns {Object} the new test context\n */\n previousItem: function previsousItem() {\n return testContextBuilder.buildTestContextFromPosition(testContext, testMap, testContext.itemPosition - 1);\n },\n /**\n * Navigate to the next item\n * @returns {Object} the new test context\n */\n nextSection: function nextSection() {\n var sectionStats = mapHelper.getSectionStats(testMap, testContext.sectionId);\n var section = mapHelper.getSection(testMap, testContext.sectionId);\n return testContextBuilder.buildTestContextFromPosition(testContext, testMap, section.position + sectionStats.total);\n },\n /**\n * Navigate to the given position\n * @param {Number} position - the position\n * @returns {Object} the new test context\n */\n jumpItem: function jumpItem(position) {\n return testContextBuilder.buildTestContextFromPosition(testContext, testMap, position);\n }\n };\n };\n\n return navigatorFactory;\n\n});\n\n","define('taoQtiTest/runner/branchRule/helpers/branchRuleHelper',['lodash'], function (_) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Parses sub branch rules and returns an array of results\n *\n * @param {Object} branchRuleDefinition\n * @param {Object} item\n * @param {Object} navigationParams\n * @param {Function} branchRuleMapper\n * @param {Object} responseStore\n * @returns {Promise}\n */\n function evaluateSubBranchRules(branchRuleDefinition, item, navigationParams, branchRuleMapper, responseStore) {\n return new Promise(function (resolve, reject) {\n var subBranchRuleResults = [],\n promises = [];\n\n // Remove the @attributes from the branch rule definition\n branchRuleDefinition = _.omit(branchRuleDefinition, ['@attributes']);\n promises = _.map(branchRuleDefinition, function (subBranchRule, subBranchRuleName) {\n return branchRuleMapper(subBranchRuleName, branchRuleDefinition[subBranchRuleName], item, navigationParams, responseStore).validate();\n });\n Promise.all(promises).then(function (results) {\n _.forEach(results, function (subBranchRuleResult) {\n // if the result is an array (e.g. in case of NOT), add all elements of it to the results\n if (Array.isArray(subBranchRuleResult)) {\n subBranchRuleResult.forEach(function (value) {\n subBranchRuleResults.push(value);\n });\n // otherwise add the single value to the results\n } else {\n subBranchRuleResults.push(subBranchRuleResult);\n }\n });\n resolve(subBranchRuleResults);\n }).catch(function (err) {\n reject(err);\n });\n });\n }\n var branchRuleHelper = {\n evaluateSubBranchRules: evaluateSubBranchRules\n };\n\n return branchRuleHelper;\n\n});\n\n","define('taoQtiTest/runner/branchRule/types/match',[],function () { 'use strict';\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n /**\n * @author Péter Halász \n */\n\n /**\n * MATCH branching rule\n *\n * @param {Object} branchRuleDefinition the definition object of the branch rule, which contains additional branching rules, and also the target\n * @param {Object} item item object from the itemStore\n * @param {Object} navigationParams object of navigation parameters which got passed to the navigation action\n * @param {branchRuleMapper} branchRuleMapper\n * @param {responseStore} responseStore\n */\n function matchBranchRuleFactory(branchRuleDefinition, item, navigationParams, branchRuleMapper, responseStore) {\n var variableIdentifier = branchRuleDefinition.variable['@attributes'].identifier;\n var correctIdentifier = branchRuleDefinition.correct['@attributes'].identifier;\n return {\n /**\n * Evaluates that the value of given variable is matching or not of the value of the given correct response\n * @returns {boolean}\n */\n validate: function validate() {\n return Promise.all([responseStore.getCorrectResponse(correctIdentifier), responseStore.getResponse(variableIdentifier)]).then(function (result) {\n return result[0].includes(result[1]);\n });\n }\n };\n }\n\n return matchBranchRuleFactory;\n\n});\n\n","define('taoQtiTest/runner/branchRule/types/or',['taoQtiTest/runner/branchRule/helpers/branchRuleHelper'], function (branchRuleHelper) { 'use strict';\n\n branchRuleHelper = branchRuleHelper && Object.prototype.hasOwnProperty.call(branchRuleHelper, 'default') ? branchRuleHelper['default'] : branchRuleHelper;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * OR branching rule\n *\n * @param {Object} branchRuleDefinition the definition object of the branch rule, which contains additional branching rules, and also the target\n * @param {Object} item item object from the itemStore\n * @param {Object} navigationParams object of navigation parameters which got passed to the navigation action\n * @param {branchRuleMapper} branchRuleMapper\n * @param {responseStore} responseStore\n */\n function orBranchRuleFactory(branchRuleDefinition, item, navigationParams, branchRuleMapper, responseStore) {\n return {\n /**\n * Evaluates an OR expression on all the given expressions and returns the result\n * @returns {Promise}\n */\n validate: function validate() {\n return branchRuleHelper.evaluateSubBranchRules(branchRuleDefinition, item, navigationParams, branchRuleMapper, responseStore).then(function (subBranchRuleResults) {\n return subBranchRuleResults.some(function (value) {\n return value;\n });\n });\n }\n };\n }\n\n return orBranchRuleFactory;\n\n});\n\n","define('taoQtiTest/runner/branchRule/types/and',['taoQtiTest/runner/branchRule/helpers/branchRuleHelper'], function (branchRuleHelper) { 'use strict';\n\n branchRuleHelper = branchRuleHelper && Object.prototype.hasOwnProperty.call(branchRuleHelper, 'default') ? branchRuleHelper['default'] : branchRuleHelper;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * AND branching rule\n *\n * @param {Object} branchRuleDefinition the definition object of the branch rule, which contains additional branching rules, and also the target\n * @param {Object} item item object from the itemStore\n * @param {Object} navigationParams object of navigation parameters which got passed to the navigation action\n * @param {branchRuleMapper} branchRuleMapper\n * @param {responseStore} responseStore\n */\n function andBranchRuleFactory(branchRuleDefinition, item, navigationParams, branchRuleMapper, responseStore) {\n return {\n /**\n * Evaluates an AND expression on all the given expressions and returns the result\n * @returns {Promise}\n */\n validate: function validate() {\n return branchRuleHelper.evaluateSubBranchRules(branchRuleDefinition, item, navigationParams, branchRuleMapper, responseStore).then(function (subBranchRuleResults) {\n return subBranchRuleResults.every(function (value) {\n return value;\n });\n });\n }\n };\n }\n\n return andBranchRuleFactory;\n\n});\n\n","define('taoQtiTest/runner/branchRule/types/not',['lodash'], function (_) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * NOT branching rule\n *\n * @param {Object} branchRuleDefinition the definition object of the branch rule, which contains additional branching rules, and also the target\n * @param {Object} item item object from the itemStore\n * @param {Object} navigationParams object of navigation parameters which got passed to the navigation action\n * @param {branchRuleMapper} branchRuleMapper\n * @param {responseStore} responseStore\n */\n function notBranchRuleFactory(branchRuleDefinition, item, navigationParams, branchRuleMapper, responseStore) {\n // If the NOT branching rule has only one child, cast it as an array\n if (!Array.isArray(branchRuleDefinition)) {\n branchRuleDefinition = [branchRuleDefinition];\n }\n return {\n /**\n * Evaluates a NOT expression on the given expressions and returns an array of results\n * @returns {Promise}\n */\n validate: function validate() {\n var promises = branchRuleDefinition.map(function (expression) {\n var subBranchRuleName = _.head(_.keys(expression)),\n subBranchRuleDefinition = expression[subBranchRuleName];\n return branchRuleMapper(subBranchRuleName, subBranchRuleDefinition, item, navigationParams, responseStore).validate();\n });\n return Promise.all(promises).then(function (results) {\n return _.map(results, function (result) {\n return !result;\n });\n });\n }\n };\n }\n\n return notBranchRuleFactory;\n\n});\n\n","define('taoQtiTest/runner/branchRule/branchRuleMapper',['taoQtiTest/runner/branchRule/types/match', 'taoQtiTest/runner/branchRule/types/or', 'taoQtiTest/runner/branchRule/types/and', 'taoQtiTest/runner/branchRule/types/not'], function (matchBranchRule, orBranchRule, andBranchRule, notBranchRule) { 'use strict';\n\n matchBranchRule = matchBranchRule && Object.prototype.hasOwnProperty.call(matchBranchRule, 'default') ? matchBranchRule['default'] : matchBranchRule;\n orBranchRule = orBranchRule && Object.prototype.hasOwnProperty.call(orBranchRule, 'default') ? orBranchRule['default'] : orBranchRule;\n andBranchRule = andBranchRule && Object.prototype.hasOwnProperty.call(andBranchRule, 'default') ? andBranchRule['default'] : andBranchRule;\n notBranchRule = notBranchRule && Object.prototype.hasOwnProperty.call(notBranchRule, 'default') ? notBranchRule['default'] : notBranchRule;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n var branchRuleMap = {\n match: matchBranchRule,\n or: orBranchRule,\n and: andBranchRule,\n not: notBranchRule\n };\n\n /**\n * Returns the proper branching rule based on the given name\n *\n * @param {string} branchRuleName\n * @param {Object} branchRuleDefinition the definition object of the branch rule, which contains additional branching rules also\n * @param {Object} item item object from the itemStore\n * @param {Object} navigationParams object of navigation parameters which got passed to the navigation action\n * @param {responseStore} responseStore\n */\n function branchRuleMapperFactory(branchRuleName, branchRuleDefinition, item, navigationParams, responseStore) {\n if (!(branchRuleName in branchRuleMap)) {\n throw new Error(`Invalid branch rule name: ${branchRuleName}`);\n }\n return branchRuleMap[branchRuleName](branchRuleDefinition, item, navigationParams, branchRuleMapperFactory, responseStore);\n }\n\n return branchRuleMapperFactory;\n\n});\n\n","define('taoQtiTest/runner/branchRule/branchRule',['taoQtiTest/runner/branchRule/helpers/branchRuleHelper', 'taoQtiTest/runner/branchRule/branchRuleMapper'], function (branchRuleHelper, branchRuleMapper) { 'use strict';\n\n branchRuleHelper = branchRuleHelper && Object.prototype.hasOwnProperty.call(branchRuleHelper, 'default') ? branchRuleHelper['default'] : branchRuleHelper;\n branchRuleMapper = branchRuleMapper && Object.prototype.hasOwnProperty.call(branchRuleMapper, 'default') ? branchRuleMapper['default'] : branchRuleMapper;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Evaluates all the branch rules and returns the `@attributes.target` if the evaluation returns true, null otherwise\n *\n * @param {Object} branchRuleDefinition the definition object of the branch rule, which contains additional branching rules, and also the target\n * @param {Object} item item object from the itemStore\n * @param {Object} navigationParams object of navigation parameters which got passed to the navigation action\n * @param {responseStore} responseStore\n * @returns {Promise}\n */\n function branchRuleFactory(branchRuleDefinition, item, navigationParams, responseStore) {\n return new Promise(function (resolve) {\n var result;\n if (typeof branchRuleDefinition['@attributes'] === 'undefined' || typeof branchRuleDefinition['@attributes']['target'] === 'undefined') {\n return resolve(null);\n }\n branchRuleHelper.evaluateSubBranchRules(branchRuleDefinition, item, navigationParams, branchRuleMapper, responseStore).then(function (branchRuleResults) {\n result = branchRuleResults.every(function (branchRuleResult) {\n return branchRuleResult;\n });\n if (result) {\n return resolve(branchRuleDefinition['@attributes']['target']);\n }\n resolve(null);\n });\n });\n }\n\n return branchRuleFactory;\n\n});\n\n","define('taoQtiTest/runner/services/offlineJumpTable',['lodash', 'taoQtiTest/runner/branchRule/branchRule', 'taoQtiTest/runner/helpers/map'], function (_, branchRule, mapHelper) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n branchRule = branchRule && Object.prototype.hasOwnProperty.call(branchRule, 'default') ? branchRule['default'] : branchRule;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Jump table entry definition.\n *\n * @typedef Jump\n * @property {string} item - the identifier of the item\n * @property {string} section - the identifier of the section\n * @property {string} part - the identifier of the part\n * @property {integer} position - the position of the jump entry, starting from 0\n */\n /**\n * Helper class for the offline version of the jump table which helps the navigation of the test taker.\n */\n var offlineJumpTableFactory = function offlineJumpTableFactory(itemStore, responseStore) {\n var testMap = {};\n var jumpTable = [];\n\n /**\n * Put all the responses from the navigation parameters into the responseStore\n *\n * @param {Object} params\n */\n function addResponsesToResponseStore(params) {\n if (params.itemResponse) {\n _.forEach(params.itemResponse, function (response, itemResponseIdentifier) {\n var responseIdentifier = `${params.itemDefinition}.${itemResponseIdentifier}`;\n _.forEach(response, function (responseEntry) {\n var responseId = responseEntry && responseEntry.identifier;\n if (Array.isArray(responseId)) {\n responseId.forEach(function (id) {\n responseStore.addResponse(responseIdentifier, id);\n });\n } else {\n responseStore.addResponse(responseIdentifier, responseId);\n }\n });\n });\n }\n }\n\n /**\n * Returns all the item identifiers in order.\n *\n * @param {Object} map\n * @returns {Array}\n */\n function getItems(map) {\n return _.uniq(_.map(getSimplifiedTestMap(map), function (row) {\n return row.item;\n }));\n }\n\n /**\n * Returns all the section identifiers in order.\n *\n * @param {Object} map\n * @returns {Array}\n */\n function getSections(map) {\n return _.uniq(_.map(getSimplifiedTestMap(map), function (row) {\n return row.section;\n }));\n }\n\n /**\n * Returns a simplified test map array, which will contain the item, section and part identifiers.\n *\n * @param {Object} map\n * @returns {Array}\n */\n function getSimplifiedTestMap(map) {\n var simplifiedTestMap = [];\n mapHelper.each(map, function (item, section, part) {\n simplifiedTestMap.push({\n item: item.id,\n itemHasBranchRule: !_.isEmpty(item.branchRule),\n itemBranchRule: item.branchRule,\n section: section.id,\n sectionHasBranchRule: !_.isEmpty(section.branchRule),\n sectionBranchRule: section.branchRule,\n part: part.id,\n partHasBranchRule: !_.isEmpty(part.branchRule),\n partBranchRule: part.branchRule\n });\n });\n return simplifiedTestMap;\n }\n return {\n /**\n * Setter for test map\n *\n * @param {Object} map\n * @returns {offlineJumpTableFactory}\n */\n setTestMap: function setTestMap(map) {\n testMap = map;\n return this;\n },\n /**\n * Build jumpTable\n *\n * @param {Object} testContext\n * @returns {Promise}\n */\n buildJumpTable: function buildJumpTable(testContext) {\n const self = this;\n const simplifiedTestMap = getSimplifiedTestMap(testMap);\n const contextItemId = testContext ? testContext.itemIdentifier : null;\n const contextItemPosition = contextItemId ? testContext.itemPosition : null;\n const firstJumpItem = simplifiedTestMap[0];\n if (firstJumpItem) {\n this.addJump(firstJumpItem.part, firstJumpItem.section, firstJumpItem.item);\n }\n if (!contextItemPosition) {\n return Promise.resolve();\n }\n function calculateNextJump() {\n var lastJumpItem = self.getLastJump().item || null;\n if (contextItemId !== lastJumpItem) {\n return itemStore.get(lastJumpItem).then(function (item) {\n const itemResponse = {};\n _.forEach(item.itemState, function (state, itemStateIdentifier) {\n itemResponse[itemStateIdentifier] = state.response;\n });\n return self.jumpToNextItem(Object.assign({}, item, {\n itemResponse,\n itemDefinition: item.itemIdentifier\n })).then(calculateNextJump);\n });\n }\n return Promise.resolve();\n }\n return calculateNextJump();\n },\n /**\n * Put all correct responses to the responseStore\n *\n * @param {Object} testContext\n * @returns {Promise}\n */\n putCorrectResponsesInStore: function putCorrectResponsesInStore() {\n const simplifiedTestMap = getSimplifiedTestMap(testMap);\n const promises = [];\n simplifiedTestMap.forEach(function (row) {\n promises.push(itemStore.get(row.item).then(function (item) {\n if (item) {\n _.forEach(item.itemData.data.responses, function (response) {\n var responseIdentifier = `${item.itemIdentifier}.${response.identifier}`;\n responseStore.addCorrectResponse(responseIdentifier, response.correctResponses);\n });\n }\n }).catch(function (err) {\n return Promise.reject(err);\n }));\n });\n return Promise.all(promises);\n },\n /**\n * Initialization method for the offline jump table, which is responsible to add the first item as the first\n * jump and collect the correct responses for the branching rules.\n * @param {Object} [testContext] - current test context is needed in order to continue test after interruption\n * @returns {Promise}\n */\n init: function init(testContext) {\n return this.putCorrectResponsesInStore().then(() => this.buildJumpTable(testContext));\n },\n /**\n * Clears the jump table\n *\n * @returns {offlineJumpTableFactory}\n */\n clearJumpTable: function clearJumpTable() {\n jumpTable = [];\n return this;\n },\n /**\n * Adds a new jump into the end of the jump table\n *\n * @param {String} partIdentifier\n * @param {String} sectionIdentifier\n * @param {String} itemIdentifier\n */\n addJump: function addJump(partIdentifier, sectionIdentifier, itemIdentifier) {\n var self = this;\n return new Promise(function (resolve) {\n var lastJump = self.getLastJump();\n var nextPosition = typeof lastJump.position !== 'undefined' ? lastJump.position + 1 : 0;\n jumpTable.push({\n item: itemIdentifier,\n part: partIdentifier,\n section: sectionIdentifier,\n position: nextPosition\n });\n resolve();\n });\n },\n /**\n * Jumps into a specific position inside the jump table. The jump entry in the given position\n * will be the last element of the jump table, every other entry after this entry will get deleted\n *\n * @param {Integer} position\n * @returns {offlineJumpTableFactory}\n */\n jumpTo: function jumpTo(position) {\n jumpTable = jumpTable.filter(function (jump) {\n return jump.position <= position;\n });\n return this;\n },\n /**\n * Jumps to the next item without taking the branching rules into account\n *\n * @returns {Promise}\n */\n jumpToSkipItem: function jumpToSkipItem() {\n var self = this;\n return new Promise(function (resolve) {\n var simplifiedTestMap = getSimplifiedTestMap(testMap);\n var lastJumpItem = self.getLastJump().item || null;\n var items = getItems(testMap);\n var itemSliceIndex = items.indexOf(lastJumpItem);\n var itemIdentifierToAdd = items.slice(itemSliceIndex + 1).shift();\n var itemToAdd = simplifiedTestMap.filter(function (row) {\n return row.item === itemIdentifierToAdd;\n }).shift();\n if (itemToAdd) {\n return self.addJump(itemToAdd.part, itemToAdd.section, itemToAdd.item).then(resolve);\n } else {\n return resolve();\n }\n });\n },\n /**\n * Adds the next item to the end of the jump table\n *\n * @param {Object} params\n * @returns {Promise}\n */\n jumpToNextItem: function jumpToNextItem(params) {\n var self = this;\n addResponsesToResponseStore(params);\n return new Promise(function (resolve) {\n var simplifiedTestMap = getSimplifiedTestMap(testMap);\n var lastJumpItem = self.getLastJump().item || null;\n var items = getItems(testMap);\n var itemSliceIndex = items.indexOf(lastJumpItem);\n var itemIdentifierToAdd = items.slice(itemSliceIndex + 1).shift();\n var itemToAdd = simplifiedTestMap.filter(function (row) {\n return row.item === itemIdentifierToAdd;\n }).shift();\n var lastJumpItemData = simplifiedTestMap.filter(function (row) {\n return row.item === lastJumpItem;\n }).shift();\n if (lastJumpItemData && lastJumpItemData.itemHasBranchRule) {\n return itemStore.get(lastJumpItem).then(function (item) {\n branchRule(lastJumpItemData.itemBranchRule, item, params, responseStore).then(function (itemIdentifierToAddd) {\n if (itemIdentifierToAddd !== null) {\n itemToAdd = simplifiedTestMap.filter(function (row) {\n return row.item === itemIdentifierToAddd;\n }).shift();\n }\n self.addJump(itemToAdd.part, itemToAdd.section, itemToAdd.item).then(resolve);\n }).catch(function (err) {\n return Promise.reject(err);\n });\n }).catch(function (err) {\n return Promise.reject(err);\n });\n } else {\n if (itemToAdd) {\n return self.addJump(itemToAdd.part, itemToAdd.section, itemToAdd.item).then(resolve);\n } else {\n return resolve();\n }\n }\n });\n },\n /**\n * Adds the first item of the next section to the end of the jump table\n *\n * @returns {Promise}\n */\n jumpToNextSection: function jumpToNextSection() {\n var self = this;\n return new Promise(function (resolve) {\n var simplifiedTestMap = getSimplifiedTestMap(testMap);\n var lastJumpSection = self.getLastJump().section || null;\n var sections = getSections(testMap);\n var sectionSliceIndex = sections.indexOf(lastJumpSection);\n var sectionIdentifierToAdd = sections.slice(sectionSliceIndex + 1).shift();\n var itemToAdd = simplifiedTestMap.filter(function (row) {\n return row.section === sectionIdentifierToAdd;\n }).shift();\n if (itemToAdd) {\n return self.addJump(itemToAdd.part, itemToAdd.section, itemToAdd.item).then(resolve);\n } else {\n return resolve();\n }\n });\n },\n /**\n * Jumps to the previous item by deleting the last entry of the jump table.\n *\n * @returns {Promise}\n */\n jumpToPreviousItem: function jumpToPreviousItem() {\n return new Promise(function (resolve) {\n jumpTable.pop();\n resolve();\n });\n },\n /**\n * Returns the jump table.\n *\n * @returns {Jump[]}\n */\n getJumpTable: function getJumpTable() {\n return jumpTable;\n },\n /**\n * Returns the last entry of the jump table which represent the current state of the navigation.\n *\n * @returns {Jump}\n */\n getLastJump: function getLastJump() {\n return jumpTable.length > 0 ? jumpTable[jumpTable.length - 1] : {};\n }\n };\n };\n\n return offlineJumpTableFactory;\n\n});\n\n","define('taoQtiTest/runner/navigator/offlineNavigator',['util/capitalize', 'taoQtiTest/runner/services/offlineJumpTable', 'taoQtiTest/runner/helpers/testContextBuilder'], function (capitalize, offlineJumpTableFactory, testContextBuilder) { 'use strict';\n\n capitalize = capitalize && Object.prototype.hasOwnProperty.call(capitalize, 'default') ? capitalize['default'] : capitalize;\n offlineJumpTableFactory = offlineJumpTableFactory && Object.prototype.hasOwnProperty.call(offlineJumpTableFactory, 'default') ? offlineJumpTableFactory['default'] : offlineJumpTableFactory;\n testContextBuilder = testContextBuilder && Object.prototype.hasOwnProperty.call(testContextBuilder, 'default') ? testContextBuilder['default'] : testContextBuilder;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * @param {itemStore} itemStore\n * @param {responseStore} responseStore\n * @returns {Object}\n */\n function offlineNavigatorFactory(itemStore, responseStore) {\n var testContext,\n testMap,\n offlineJumpTableHelper = offlineJumpTableFactory(itemStore, responseStore);\n return {\n /**\n * @deprecated\n * @param {Object} data\n * @returns {this}\n */\n setTestData: function setTestData() {\n return this;\n },\n /**\n * @param {Object} context\n * @returns {this}\n */\n setTestContext: function setTestContext(context) {\n testContext = context;\n return this;\n },\n /**\n * @param {Object} map\n * @returns {this}\n */\n setTestMap: function setTestMap(map) {\n testMap = map;\n return this;\n },\n /**\n * Initialization method for the offline navigator component\n * It get called in proxy init function\n *\n * @returns {Promise}\n */\n init: function init() {\n offlineJumpTableHelper.setTestMap(testMap);\n return offlineJumpTableHelper.init(testContext);\n },\n /**\n * Helper function to clear the jump table\n * It's used only in tests\n *\n * @returns {this}\n */\n clearJumpTable: function clearJumpTable() {\n offlineJumpTableHelper.clearJumpTable();\n return this;\n },\n /**\n * Performs the navigation action and returns the new test context.\n *\n * @param {String} direction\n * @param {String} scope\n * @param {Integer} position\n * @param {Object} params\n * @returns {Promise} the new test context\n */\n navigate: function navigate(direction, scope, position, params) {\n return new Promise(function (resolve, reject) {\n var lastJump,\n navigationActionName = `jumpTo${capitalize(direction)}${capitalize(scope)}`;\n if (typeof offlineJumpTableHelper[navigationActionName] === 'undefined' || typeof offlineJumpTableHelper[navigationActionName] !== 'function') {\n throw new Error('Invalid navigation action');\n }\n offlineJumpTableHelper[navigationActionName](params).then(function () {\n lastJump = offlineJumpTableHelper.getLastJump();\n // new textContext doesn't know about item attempt\n // attempt is stored in itemStore\n // 1. get attempt from itemStore and increase it\n // 2. set it in new textContext\n // 3. store new attempt in itemStore\n // 4. return new textContext with right attempt\n itemStore.get(lastJump.item).then(itemFromStore => {\n const newTestContext = testContextBuilder.buildTestContextFromJump(testContext, testMap, lastJump, itemFromStore.attempt);\n itemStore.update(newTestContext.itemIdentifier, 'attempt', newTestContext.attempt).then(() => resolve(newTestContext));\n });\n }).catch(function (err) {\n reject(err);\n });\n });\n }\n };\n }\n\n return offlineNavigatorFactory;\n\n});\n\n","define('taoQtiTest/runner/provider/dataUpdater',['lodash', 'taoQtiTest/runner/helpers/map', 'taoQtiTest/runner/config/states'], function (_, mapHelper, states) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n states = states && Object.prototype.hasOwnProperty.call(states, 'default') ? states['default'] : states;\n\n /*\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017 (original work) Open Assessment Technologies SA\n *\n */\n\n /**\n * Get the updater\n * @param {Map} testDataHolder - the data holder\n * @returns {dataUpdater}\n * @throws {TypeError} if the data holder is not or incorrectly set\n */\n function dataUpdaterFactory(testDataHolder) {\n if (!testDataHolder || !_.isFunction(testDataHolder.get) || !_.isFunction(testDataHolder.set)) {\n throw new TypeError('A data holder is mandatory for the udpater');\n }\n\n /**\n * Exposes the methods to update test data\n * @typedef {Object} dataUpdater\n */\n return {\n /**\n * Update test data from a dataSet (usually their raw data given by the proxy).\n * If the dataSet is a collection, we use only the last matching object.\n * @param {Object|Object[]} dataSet - object[s] that contains or not testData, testContext & testMap\n */\n update: function update(dataSet) {\n var self = this;\n\n /**\n * Check if a collection's item contains test contextual data\n * @param {Object} contextualData\n * @returns {Boolean}\n */\n var isContextual = function isContextual(contextualData) {\n return contextualData && (_.isPlainObject(contextualData.testContext) || _.isPlainObject(contextualData.testData) || _.isPlainObject(contextualData.testMap));\n };\n\n /**\n * Update the test data from contextual data\n * @param {Object} contextualData\n */\n var updateData = function updateData(contextualData) {\n var builtTestMap;\n var updatedTestMap;\n if (contextualData) {\n if (_.isPlainObject(contextualData.testData)) {\n testDataHolder.set('testData', contextualData.testData);\n }\n if (_.isPlainObject(contextualData.testContext)) {\n testDataHolder.set('testContext', contextualData.testContext);\n }\n if (_.isPlainObject(contextualData.testMap)) {\n //the received map is not complete and should be \"built\"\n builtTestMap = self.buildTestMap(contextualData.testMap);\n if (builtTestMap) {\n testDataHolder.set('testMap', builtTestMap);\n }\n }\n\n //always update the map stats\n updatedTestMap = self.updateStats();\n if (updatedTestMap) {\n testDataHolder.set('testMap', updatedTestMap);\n }\n }\n };\n if (isContextual(dataSet)) {\n updateData(dataSet);\n } else {\n updateData(_.findLast(dataSet, isContextual));\n }\n },\n /**\n * - reindex and build the jump table\n * - patch the current testMap if a partial map is set\n *\n * @param {Object} testMap - the testMap to build\n * @returns {Object} the built testMap\n */\n buildTestMap: function buildTestMap(testMap) {\n var newMap = null;\n if (testMap) {\n if (testMap.scope && testMap.scope !== 'test') {\n newMap = mapHelper.patch(testDataHolder.get('testMap'), testMap);\n } else {\n newMap = mapHelper.reindex(testMap);\n }\n }\n return newMap;\n },\n /**\n * Update current map stats based on the context\n *\n * @returns {Object} the updated testMap\n */\n updateStats: function updateStats() {\n const testMap = testDataHolder.get('testMap');\n const testContext = testDataHolder.get('testContext');\n let updatedTestMap = null;\n if (testMap && testContext && _.isNumber(testContext.itemPosition)) {\n const item = mapHelper.getItemAt(testMap, testContext.itemPosition);\n if (item && testContext.state === states.testSession.interacting) {\n const testPart = mapHelper.getPart(testMap, testContext.testPartId);\n\n //flag as viewed, always\n item.viewed = true;\n if (testPart && testPart.isLinear) {\n item.answered = true;\n }\n updatedTestMap = mapHelper.updateItemStats(testMap, testContext.itemPosition);\n }\n }\n return updatedTestMap;\n },\n /**\n * Let's you update the plugins configuration from when filling testData\n * @param {plugin[]} plugins - the test runner plugins\n * @param {Objectt} [pluginsConfig] - the configuration to set on the plugins\n */\n updatePluginsConfig(plugins, pluginsConfig) {\n //to keep backward compatibility with the deprecated testData\n if (!pluginsConfig) {\n const testData = testDataHolder.get('testData');\n pluginsConfig = testData && testData.config && testData.config.plugins;\n }\n if (plugins && pluginsConfig) {\n _.forEach(pluginsConfig, (config, pluginName) => {\n if (_.isPlainObject(plugins[pluginName]) && _.isFunction(plugins[pluginName].setConfig) && _.isPlainObject(config)) {\n plugins[pluginName].setConfig(config);\n }\n });\n }\n }\n };\n }\n\n return dataUpdaterFactory;\n\n});\n\n","define('taoQtiTest/runner/provider/toolStateBridge',['lodash'], function (_) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n\n /*\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2018 (original work) Open Assessment Technologies SA\n *\n */\n\n /**\n * Merge each item of a collection with the next\n * @param {Object[]} collection\n * @return {Object} the merged collection\n */\n var mergeCollection = function mergeCollection(collection) {\n return _.reduce(collection, function (acc, value) {\n if (value) {\n return _.merge(acc, value);\n }\n return acc;\n }, {});\n };\n\n /**\n * Build the toolStateBridge instance.\n *\n *\n * In order to allow state management for a tool the matching plugin\n * needs to be activated.\n *\n * @param {testStore} testStore - the testStore instance\n * @param {String[]} activePlugins - the list of active plugins\n * @returns {toolStateBridge}\n */\n function toolStateBridgeFactory(testStore, activePlugins) {\n var tools = [];\n if (!testStore || !_.isFunction(testStore.getStore)) {\n throw new TypeError('The toolStateBridge should be initialized with a testStore');\n }\n if (!_.isArray(activePlugins) || !activePlugins.length) {\n throw new TypeError('The toolStateBridge should be initialized with a the list of active plugins');\n }\n\n /**\n * @typedef {Object} toolStateBridge\n */\n return {\n /**\n * Set the tools to manage the states.\n * Each toolName MUST match a plugin name.\n *\n * This trigger the change tracking in the testStore for the\n * stores with the tool/plugin name.\n *\n * @param {String[]} toolNames - the list of tool names\n * @returns {toolStateBridge} chains\n */\n setTools: function setTools(toolNames) {\n tools = _(toolNames).filter(function (toolName) {\n return activePlugins.includes(toolName);\n }).map(function (toolName) {\n testStore.startChangeTracking(toolName);\n return toolName;\n }).value();\n return this;\n },\n /**\n * Get the list of tools\n * @returns {String[]} the list of configured tools\n */\n getTools: function getTools() {\n return tools;\n },\n /**\n * Restore the state of the given tool\n * @param {String} toolName - the name of the tool\n * @param {Object} toolState - the state to restore\n * @returns {Promise} resolves with true if restored\n */\n restoreState: function restoreState(toolName, toolState) {\n if (tools.includes(toolName) && _.isPlainObject(toolState)) {\n return testStore.getStore(toolName).then(function (toolStore) {\n return toolStore.clear().then(function () {\n return toolStore;\n });\n }).then(function (toolStore) {\n return Promise.all(_.map(toolState, function (value, key) {\n return toolStore.setItem(key, value);\n }));\n }).then(function () {\n testStore.resetChanges(toolName);\n return true;\n });\n }\n return Promise.resolve(false);\n },\n /**\n * Restore the states of multiple tools\n * @param {Object} states - key is the toolName and the value the state to resolve\n * @returns {Promise} key is the restored toolName and the value is the status\n */\n restoreStates: function restoreStates(states) {\n var self = this;\n return Promise.all(_.map(states, function (toolState, toolName) {\n return self.restoreState(toolName, toolState).then(function (result) {\n var formattedResult = {};\n formattedResult[toolName] = result;\n return formattedResult;\n });\n })).then(mergeCollection);\n },\n /**\n * Get the state of a given tool\n * @param {String} toolName - the name of the tool\n * @param {Boolean} [reset] - do we reset the change tracking ?\n * @returns {Promise} resolves with the state\n */\n getState: function getState(toolName, reset) {\n if (tools.includes(toolName) && testStore.hasChanges(toolName)) {\n return testStore.getStore(toolName).then(function (toolStore) {\n if (reset !== false) {\n testStore.resetChanges(toolName);\n }\n return toolStore.getItems();\n });\n }\n return Promise.resolve(false);\n },\n /**\n * Get the state for all tools with changes\n * @returns {Promise} resolves with the states\n */\n getStates: function getStates() {\n var self = this;\n return Promise.all(_.map(tools, function (toolName) {\n return self.getState(toolName).then(function (toolState) {\n //format the state to keep the tool identifier\n var formattedState = {};\n if (toolState) {\n formattedState[toolName] = toolState;\n return formattedState;\n }\n return false;\n });\n })).then(mergeCollection);\n }\n };\n }\n\n return toolStateBridgeFactory;\n\n});\n\n","define('taoQtiTest/runner/ui/toolbox/entry',['lodash', 'ui/component', 'handlebars', 'lib/handlebars/helpers'], function (_, componentFactory, Handlebars, Helpers0) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n componentFactory = componentFactory && Object.prototype.hasOwnProperty.call(componentFactory, 'default') ? componentFactory['default'] : componentFactory;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, functionType=\"function\", escapeExpression=this.escapeExpression, self=this;\n\n function program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \" \";\n if (helper = helpers.className) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.className); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1);\n return buffer;\n }\n\n function program3(depth0,data) {\n \n var buffer = \"\", stack1;\n buffer += \"\\n aria-\"\n + escapeExpression(((stack1 = (data == null || data === false ? data : data.key)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1))\n + \"=\\\"\"\n + escapeExpression((typeof depth0 === functionType ? depth0.apply(depth0) : depth0))\n + \"\\\"\\n \";\n return buffer;\n }\n\n function program5(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\";\n return buffer;\n }\n function program6(depth0,data) {\n \n \n return \" no-label\";\n }\n\n function program8(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\";\n if (helper = helpers.text) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.text); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\";\n return buffer;\n }\n\n buffer += \"\\n \\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.icon), {hash:{},inverse:self.noop,fn:self.program(5, program5, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.text), {hash:{},inverse:self.noop,fn:self.program(8, program8, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \\n\\n\";\n return buffer;\n });\n function entryTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017 (original work) Open Assessment Technologies SA;\n */\n var itemComponentApi = {\n /**\n * Initialise the item\n */\n initItem: function initItem() {\n this.id = this.config.control;\n this.menu = null;\n },\n /**\n * Get the type of the component\n */\n getType: function getType() {\n return 'entry';\n },\n /**\n * Get the item Id\n * @returns {String}\n */\n getId: function getId() {\n return this.id;\n },\n /**\n * Set the menu to whom the item belong\n * @param {String} menuId\n * @returns {String}\n */\n setMenuId: function setMenuId(menuId) {\n this.menuId = menuId;\n },\n /**\n * Get the id of the menu to whom the item belong\n * @returns {String}\n */\n getMenuId: function getMenuId() {\n return this.menuId;\n },\n /**\n * Set the item as active. For example, if it opens a tool,\n * the item should be represented 'on' as long as the tool remains opened\n */\n turnOn: function turnOn() {\n this.setState('active', true);\n const element = this.getElement();\n if (!element || element.attr('role') !== 'option') {\n // Not pretty bit quick\n return;\n }\n element.attr('aria-selected', 'true') // JAWS ignores aria-selected attribute\n .attr('aria-checked', 'true'); // NVDA not read aria-selected=\"true\"\n },\n\n /**\n * Set the item as inactive\n */\n turnOff: function turnOff() {\n this.setState('active', false);\n const element = this.getElement();\n if (!element || element.attr('role') !== 'option') {\n // Not pretty bit quick\n return;\n }\n element.attr('aria-selected', 'false') // NVDA + Chrome ignores aria-checked=\"false\"\n .attr('aria-checked', 'false');\n },\n /**\n * Set the item as hovered, whether by the mouse or by keyboard navigation\n */\n hoverOn: function hoverOn() {\n this.setState('hover', true);\n },\n /**\n * Turn off the hovered style\n */\n hoverOff: function hoverOff() {\n this.setState('hover', false);\n }\n };\n\n /**\n * The item factory\n */\n function itemComponentFactory(specs, defaults) {\n var itemComponent;\n specs = _.defaults(specs || {}, itemComponentApi);\n itemComponent = componentFactory(specs, defaults).setTemplate(entryTpl).on('enable', function () {\n if (this.is('rendered')) {\n this.$component.removeProp('disabled');\n }\n }).on('disable', function () {\n if (this.is('rendered')) {\n this.$component.prop('disabled', true);\n this.turnOff();\n }\n }).on('init', function () {\n this.initItem();\n }).on('render', function () {\n var self = this;\n this.disable(); // we always render disabled by default\n\n // forward DOM events to the component object\n this.$component.on('mousedown', function (event) {\n self.trigger('mousedown', event);\n }).on('click', function (event) {\n self.trigger('click', event);\n });\n });\n return itemComponent;\n }\n\n return itemComponentFactory;\n\n});\n\n","define('taoQtiTest/runner/ui/toolbox/menu',['jquery', 'lodash', 'ui/component', 'ui/hider', 'ui/stacker', 'handlebars', 'lib/handlebars/helpers'], function ($$1, _, componentFactory, hider, stackerFactory, Handlebars, Helpers0) { 'use strict';\n\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n componentFactory = componentFactory && Object.prototype.hasOwnProperty.call(componentFactory, 'default') ? componentFactory['default'] : componentFactory;\n hider = hider && Object.prototype.hasOwnProperty.call(hider, 'default') ? hider['default'] : hider;\n stackerFactory = stackerFactory && Object.prototype.hasOwnProperty.call(stackerFactory, 'default') ? stackerFactory['default'] : stackerFactory;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, functionType=\"function\", escapeExpression=this.escapeExpression, self=this;\n\n function program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \" \";\n if (helper = helpers.className) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.className); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1);\n return buffer;\n }\n\n function program3(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\";\n return buffer;\n }\n function program4(depth0,data) {\n \n \n return \" no-label\";\n }\n\n function program6(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\";\n if (helper = helpers.text) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.text); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\";\n return buffer;\n }\n\n buffer += \"\\n \\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.icon), {hash:{},inverse:self.noop,fn:self.program(3, program3, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.text), {hash:{},inverse:self.noop,fn:self.program(6, program6, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n   \\n \\n
        \\n \\n
        \\n\\n\";\n return buffer;\n });\n function menuTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template$1 = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, functionType=\"function\", escapeExpression=this.escapeExpression, self=this;\n\n function program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \" \";\n if (helper = helpers.className) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.className); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1);\n return buffer;\n }\n\n function program3(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\\n role=\\\"\";\n if (helper = helpers.role) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.role); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\\"\\n \";\n return buffer;\n }\n\n buffer += \"\\n \\n \\n \";\n if (helper = helpers.text) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.text); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\n \\n\";\n return buffer;\n });\n function menuItemTpl(data, options, asString) {\n var html = Template$1(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017-2020 (original work) Open Assessment Technologies SA;\n */\n var keyCodes = {\n TAB: 9,\n ESC: 27,\n ENTER: 13,\n SPACE: 32,\n LEFT: 37,\n UP: 38,\n RIGHT: 39,\n DOWN: 40\n };\n var stacker = stackerFactory('test-runner');\n var menuComponentApi = {\n /**\n * Initialise the menu\n */\n initMenu: function initMenu() {\n this.id = this.config.control;\n this.navType = this.config.navType ? this.config.navType : 'fromLast';\n this.menuItems = [];\n },\n /**\n * Get the type of the component\n */\n getType: function getType() {\n return 'menu';\n },\n /**\n * Get the menu Id\n * @returns {String}\n */\n getId: function getId() {\n return this.id;\n },\n /**\n * Set the menu as active, essentially meaning that the menu panel is opened\n */\n turnOn: function turnOn() {\n this.setState('active', true);\n },\n /**\n * Set the menu as inactive\n */\n turnOff: function turnOff() {\n this.setState('active', false);\n },\n /**\n * =====================\n * Actions on menu panel\n * =====================\n */\n\n /**\n * open/close the menu\n */\n toggleMenu: function showMenu() {\n if (!this.is('disabled')) {\n if (this.is('opened')) {\n this.closeMenu();\n } else {\n this.openMenu();\n }\n }\n },\n /**\n * It needs to find closest visible item.\n *\n * @param {Number} last - index to stop.\n * @param {-1|1} inc - incrementor. -1 - navigate to the top, 1 - to the bottom.\n *\n * @returns {Number} returns index > 0 if a visible item was found and -1 otherwise.\n */\n indexOfClosestVisibleItem(inc, last) {\n if (!this.menuItems.length) {\n return -1;\n }\n let elem;\n let position = this.hoverIndex;\n do {\n position += inc;\n if (position === last) {\n return -1;\n }\n elem = this.menuItems[position].getElement();\n } while (elem && elem.hasClass('hidden'));\n return position;\n },\n /**\n * Changes hoverIndex and hover item.\n *\n * @param {Number} index - item index to hover.\n *\n * @returns the menu item.\n */\n hoverByIndex(index) {\n const elem = this.menuItems[index];\n this.hoverIndex = index;\n if (elem) {\n this.hoverItem(elem.id);\n }\n return elem;\n },\n hoverNextVisibleItem() {\n const index = this.indexOfClosestVisibleItem(1, this.menuItems.length);\n const elem = this.hoverByIndex(index);\n return elem;\n },\n hoverPreviousVisibleItem() {\n const index = this.indexOfClosestVisibleItem(-1, -1);\n const elem = this.hoverByIndex(index);\n return elem;\n },\n /**\n * open the menu\n */\n openMenu: function openMenu() {\n // show the DOM element\n hider.show(this.$menuContainer);\n stacker.bringToFront(this.$menuContent);\n\n // change the menu button icon\n this.$menuStateIcon.removeClass('icon-up');\n this.$menuStateIcon.addClass('icon-down');\n\n // turn on the menu button\n this.turnOn();\n\n // setup keyboard navigation & highlighting\n this.enableShortcuts();\n this.hoverOffAll();\n if (document.activeElement) {\n document.activeElement.blur();\n }\n const activeItemIndex = _.findIndex(this.menuItems, item => item.is('active'));\n if (activeItemIndex >= 0) {\n this.hoverIndex = activeItemIndex;\n this.$menuItems[this.hoverIndex].focus();\n this.hoverItem(this.menuItems[activeItemIndex].id);\n } else if (this.navType === 'fromLast') {\n // fromLast (default) navigation: focus on button and then using UP go to last item\n this.hoverIndex = this.menuItems.length; // we start on the button, not at the max array index\n // which would be menuItems.length-1\n this.hoverPreviousVisibleItem();\n } else if (this.navType === 'fromFirst') {\n // fromFirst navigation: focus on button and then using DOWN go to first item\n this.hoverIndex = -1; // we start on the button, not the first element\n // which would be 0\n this.hoverNextVisibleItem();\n }\n\n // component inner state\n this.setState('opened', true);\n this.trigger('openmenu', this);\n },\n /**\n * close the menu\n */\n closeMenu() {\n // hide the DOM element\n hider.hide(this.$menuContainer);\n\n // change the menu button icon\n this.$menuStateIcon.removeClass('icon-down');\n this.$menuStateIcon.addClass('icon-up');\n\n // turn off the button\n this.turnOff();\n\n // disable keyboard navigation & highlighting\n this.disableShortcuts();\n this.hoverOffAll();\n\n // component inner state\n this.setState('opened', false);\n this.trigger('closemenu', this);\n\n // Move focus if the menu wasn't disabled before the close action was launched.\n if (!this.is('disabled') && !this.$component.prop('disabled')) {\n this.$menuButton.parent().focus(); // It needs for screenreaders to correctly read menu button after submenu was closed\n }\n },\n\n /**\n * =====================\n * Actions on menu items\n * =====================\n */\n\n /**\n * Look for a item in the internal item registry\n * @param {String} itemId\n * @returns {Object|undefined}\n */\n getItemById: function getItemById(itemId) {\n return _.find(this.menuItems, function (item) {\n return item.getId() === itemId;\n });\n },\n /**\n * Adds an item to the menu\n * @param {Component} item\n */\n addItem: function addItem(item) {\n if (item) {\n this.menuItems.push(item);\n }\n },\n /**\n * Render menu items into the menu panel\n */\n renderItems: function renderItems() {\n var self = this;\n this.menuItems.forEach(function (item) {\n item.setTemplate(menuItemTpl); // the item has been created as generic. Let's give him now the menu entry template\n item.render(self.$menuContent);\n item.enable();\n });\n\n // bind mouse behavior on menu items\n this.$menuItems = this.$menuContent.find('.menu-item');\n this.$menuItems.on('mouseenter', function highlightHoveredEntry(e) {\n var itemId = e.currentTarget.getAttribute('data-control');\n self.mouseOverItem(itemId);\n });\n },\n /**\n * Highlight the currently hovered item\n * @param {String} itemId\n */\n mouseOverItem: function mouseOverItem(itemId) {\n var self = this;\n\n // look for item index\n this.menuItems.forEach(function (item, index) {\n if (item.id === itemId) {\n self.hoverIndex = index;\n }\n });\n this.hoverItem(itemId);\n },\n /**\n * Check that the menu has at least one of its entries displayed\n * @returns {boolean}\n */\n hasDisplayedItems: function hasDisplayedItems() {\n return this.menuItems.some(function (item) {\n return !item.is('disabled') && !item.is('hidden');\n });\n },\n /**\n * Set all entries in the menu to inactive\n */\n turnOffAll: function turnOffAll() {\n this.menuItems.forEach(function (current) {\n current.turnOff();\n });\n },\n /**\n * =====================\n * Menu items navigation\n * =====================\n */\n\n /**\n * register the event handlers for keyboard navigation\n */\n enableShortcuts: function enableShortcuts() {\n var self = this;\n this.$menuContainer.on('keydown.menuNavigation', function (e) {\n var currentKeyCode = e.keyCode ? e.keyCode : e.charCode;\n e.preventDefault();\n switch (currentKeyCode) {\n case keyCodes.ESC:\n case keyCodes.TAB:\n self.closeMenu();\n break;\n case keyCodes.SPACE:\n case keyCodes.ENTER:\n self.triggerHighlightedItem();\n e.stopPropagation();\n break;\n case keyCodes.LEFT:\n case keyCodes.UP:\n self.moveUp();\n e.stopPropagation();\n break;\n case keyCodes.RIGHT:\n case keyCodes.DOWN:\n self.moveDown();\n e.stopPropagation();\n break;\n }\n });\n this.$menuButton.on('keydown.menuNavigation', function (e) {\n var currentKeyCode = e.keyCode ? e.keyCode : e.charCode;\n function setFocusToItem(index) {\n self.hoverIndex = index;\n self.$menuContainer.focus();\n self.hoverItem(self.menuItems[self.hoverIndex].id);\n }\n if (currentKeyCode === keyCodes.UP && self.navType === 'fromLast') {\n e.stopPropagation();\n setFocusToItem(self.menuItems.length - 1);\n }\n if (currentKeyCode === keyCodes.DOWN && self.navType === 'fromFirst') {\n e.stopPropagation();\n setFocusToItem(0);\n }\n });\n },\n /**\n * remove the event handlers for keyboard navigation\n */\n disableShortcuts: function disableShortcuts() {\n this.$menuContainer.off('.menuNavigation');\n this.$menuButton.off('.menuNavigation');\n },\n /**\n * Move the highlight to the previous not hidden item\n */\n moveUp: function moveUp() {\n if (this.hoverIndex > 0) {\n const elem = this.hoverPreviousVisibleItem();\n if (!elem) {\n this.closeMenu();\n }\n // move to the menu button\n } else if (this.hoverIndex === 0) {\n this.hoverIndex--;\n this.closeMenu();\n }\n },\n /**\n * Move the highlight to the next not hidden item, or to the menu button if we are on the last item\n */\n moveDown: function moveDown() {\n // move to the next item\n if (this.hoverIndex < this.menuItems.length - 1) {\n const elem = this.hoverNextVisibleItem();\n if (!elem) {\n this.closeMenu();\n }\n // move to the menu button\n } else if (this.hoverIndex === this.menuItems.length - 1) {\n this.hoverIndex++;\n this.closeMenu();\n }\n },\n /**\n * Highlight the given item\n * @param {String} itemId\n */\n hoverItem: function hoverItem(itemId) {\n var itemToHover = this.getItemById(itemId);\n this.hoverOffAll();\n if (itemToHover) {\n itemToHover.hoverOn();\n itemToHover.getElement().focus();\n }\n },\n /**\n * Remove highlight from all items\n */\n hoverOffAll: function hoverOffAll() {\n this.menuItems.forEach(function (current) {\n if (current) {\n current.hoverOff();\n }\n });\n },\n /**\n * Run a click event on the DOM element of the currently highlighted item\n */\n triggerHighlightedItem: function triggerHighlightedItem() {\n var activeItem;\n if (this.menuItems[this.hoverIndex]) {\n activeItem = this.menuItems[this.hoverIndex];\n activeItem.getElement().trigger('click');\n this.closeMenu();\n\n // give back the focus\n this.$component.focus();\n }\n },\n /**\n * Set navigation type\n * @param {String} type - 'fromLast', 'fromFirst'\n */\n setNavigationType: function setNavigationType(type) {\n if (['fromLast', 'fromFirst'].includes(type)) {\n this.navType = type;\n }\n }\n };\n\n /**\n * The menu component factory\n */\n function menuComponentFactory(specs, defaults) {\n var _defaults, menuComponent;\n _defaults = {\n $component: $$1(),\n $menuButton: $$1(),\n $menuContainer: $$1(),\n $menuContent: $$1(),\n $menuItems: $$1(),\n $menuStateIcon: $$1(),\n hoverIndex: null,\n id: null,\n menuItems: []\n };\n specs = _.defaults(specs || {}, menuComponentApi);\n menuComponent = componentFactory(specs, defaults).setTemplate(menuTpl).on('enable', function enable() {\n if (this.is('rendered')) {\n this.$component.removeProp('disabled');\n }\n }).on('disable', function disable() {\n if (this.is('rendered')) {\n this.$component.prop('disabled', true);\n this.closeMenu();\n this.turnOff();\n }\n }).on('hide', function disable() {\n if (this.is('rendered')) {\n this.closeMenu();\n }\n }).on('init', function init() {\n this.initMenu();\n }).on('render', function render() {\n var self = this;\n\n // get access to DOM elements\n this.$menuButton = this.$component.find(`[data-control=\"${this.config.control}-button\"]`);\n this.$menuContainer = this.$component.find(`[data-control=\"${this.config.control}-menu\"]`);\n this.$menuContent = this.$component.find(`[data-control=\"${this.config.control}-list\"]`);\n this.$menuStateIcon = this.$menuButton.find('.icon-up');\n this.disable(); // always render disabled by default\n\n // add behavior\n this.$component.on('click', function toggleMenu(e) {\n e.preventDefault();\n if (!self.is('opened')) {\n e.stopPropagation(); // prevent higher handler to auto-close the menu on click\n }\n\n self.toggleMenu();\n });\n this.$menuContainer.on('click', function closeMenuOnItemClick(e) {\n e.preventDefault();\n e.stopPropagation(); // so the menu doesn't get toggled again when the event bubble to the component\n self.closeMenu();\n });\n this.$menuContent.on('mouseleave', this.hoverOffAll);\n }).on('destroy', function () {\n if (this.is('rendered')) {\n this.$menuContainer.off('.menuNavigation');\n this.$menuButton.off('.menuNavigation');\n }\n });\n\n // Apply default properties to the menuComponent\n _.defaults(menuComponent, _defaults);\n return menuComponent;\n }\n\n return menuComponentFactory;\n\n});\n\n","define('taoQtiTest/runner/ui/toolbox/text',['lodash', 'ui/component', 'handlebars', 'lib/handlebars/helpers'], function (_, componentFactory, Handlebars, Helpers0) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n componentFactory = componentFactory && Object.prototype.hasOwnProperty.call(componentFactory, 'default') ? componentFactory['default'] : componentFactory;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, functionType=\"function\", escapeExpression=this.escapeExpression, self=this;\n\n function program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"class=\\\"\";\n if (helper = helpers.className) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.className); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\\"\\n \";\n return buffer;\n }\n\n function program3(depth0,data) {\n \n var buffer = \"\", stack1;\n buffer += \"\\n aria-\"\n + escapeExpression(((stack1 = (data == null || data === false ? data : data.key)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1))\n + \"=\\\"\"\n + escapeExpression((typeof depth0 === functionType ? depth0.apply(depth0) : depth0))\n + \"\\\"\\n \";\n return buffer;\n }\n\n buffer += \"\\n \";\n if (helper = helpers.text) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.text); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\n\\n\";\n return buffer;\n });\n function textTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017 (original work) Open Assessment Technologies SA;\n */\n var textComponentApi = {\n /**\n * Initialise text\n * @returns {String}\n */\n initText: function initText() {\n this.id = this.config.control;\n },\n /**\n * Get the type of the component\n */\n getType: function getType() {\n return 'text';\n },\n /**\n * Get the item Id\n * @returns {String}\n */\n getId: function getId() {\n return this.id;\n }\n };\n\n /**\n * The text factory\n */\n function textComponentFactory(specs, defaults) {\n var textComponent;\n specs = _.defaults(specs || {}, textComponentApi);\n textComponent = componentFactory(specs, defaults).setTemplate(textTpl).on('init', function () {\n this.initText();\n }).on('render', function () {\n this.disable(); // always render disabled first\n });\n\n return textComponent;\n }\n\n return textComponentFactory;\n\n});\n\n","define('taoQtiTest/runner/ui/toolbox/toolbox',['lodash', 'jquery', 'ui/component', 'taoQtiTest/runner/ui/toolbox/entry', 'taoQtiTest/runner/ui/toolbox/menu', 'taoQtiTest/runner/ui/toolbox/text', 'handlebars', 'lib/handlebars/helpers'], function (_, $$1, componentFactory, entryFactory, menuFactory, textFactory, Handlebars, Helpers0) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n componentFactory = componentFactory && Object.prototype.hasOwnProperty.call(componentFactory, 'default') ? componentFactory['default'] : componentFactory;\n entryFactory = entryFactory && Object.prototype.hasOwnProperty.call(entryFactory, 'default') ? entryFactory['default'] : entryFactory;\n menuFactory = menuFactory && Object.prototype.hasOwnProperty.call(menuFactory, 'default') ? menuFactory['default'] : menuFactory;\n textFactory = textFactory && Object.prototype.hasOwnProperty.call(textFactory, 'default') ? textFactory['default'] : textFactory;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); \n\n\n return \"
          \";\n });\n function toolboxTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017 (original work) Open Assessment Technologies SA;\n */\n var toolboxComponentApi = {\n /**\n * Initialize the toolbox\n */\n initToolbox: function initToolbox() {\n this.allItems = [];\n this.allMenus = [];\n },\n /**\n * Create a menu component instance\n * @param {Object} config\n * @param {String} config.control - will be used as the instance id and in the data-control html attribute\n * @param {String} config.title - will be used in the title html attribute\n * @param {String} config.icon - the icon for the button\n * @param {String} config.text - the button label\n * @param {String} config.className - an extra class\n * @returns {Component} the create instance\n */\n createMenu: function createMenu(config) {\n var self = this,\n menu = menuFactory().init(config);\n this.allItems.push(menu);\n this.allMenus.push(menu);\n\n // add an event handler to close all opened menu when opening\n menu.on('openmenu', function closeAllMenuExcept(openedMenu) {\n self.allMenus.forEach(function (current) {\n if (openedMenu.getId() !== current.getId() && current.is('opened')) {\n current.closeMenu();\n }\n });\n });\n return menu;\n },\n /**\n * Create a entry component instance\n * @param {Object} config\n * @param {String} config.control - will be used as the instance id and in the data-control html attribute\n * @param {String} config.title - will be used in the title html attribute\n * @param {String} config.icon - the icon for the button\n * @param {String} config.text - the button label\n * @param {String} config.className - an extra class\n * @returns {Component} the create instance\n */\n createEntry: function createEntry(config) {\n const extendedConfig = Object.assign({\n role: \"option\"\n }, config);\n const item = entryFactory().init(extendedConfig);\n this.allItems.push(item);\n return item;\n },\n /**\n * Create a text component instance\n * @param {Object} config\n * @param {String} config.control - will be used as the instance id and in the data-control html attribute\n * @param {String} config.text - the text content\n * @param {String} config.className - an extra class\n * @returns {Component} the create instance\n */\n createText: function createText(config) {\n var text = textFactory().init(config);\n this.allItems.push(text);\n return text;\n },\n /**\n * If the given item belongs to a menu\n * @param {Object} item\n * @returns {Boolean}\n */\n hasMenu: function hasMenu(item) {\n return item && _.isFunction(item.getMenuId) && item.getMenuId();\n }\n };\n\n /**\n * Default renderer. It simply appends all the registered items in the toolbox, one after the other\n * @param {jQuery} $container - where to render\n */\n function defaultRenderer($container) {\n var self = this,\n menuEntries = [];\n\n // render first level\n if (_.isArray(this.allItems)) {\n this.allItems.forEach(function (item) {\n // items belonging to menus will be processed later\n if (!self.hasMenu(item)) {\n item.render($container);\n }\n });\n }\n\n // Render each menu\n this.allMenus.forEach(function (menu) {\n var menuId = menu.getId();\n\n // first, we gather all items relevant to the current menu\n menuEntries = self.allItems.filter(function (item) {\n return item.getType() === 'entry' && item.getMenuId() === menuId;\n });\n\n // we then add entries to the current menu\n menuEntries.forEach(function (item) {\n menu.addItem(item);\n });\n\n // and finally render the whole menu\n menu.renderItems();\n });\n }\n\n /**\n * The toolbox factory\n */\n function toolboxComponentFactory(specs, defaults) {\n var $document = $$1(document),\n toolboxComponent;\n specs = _.defaults(specs || {}, toolboxComponentApi);\n toolboxComponent = componentFactory(specs, defaults).on('init', function () {\n this.initToolbox();\n })\n // overridable renderer\n .on('render.defaultRenderer', defaultRenderer)\n\n // non-overridable renderer\n .on('render', function () {\n var self = this;\n\n // fixme: try to bind this behavior on the blur event of each menu\n $document.off('.toolboxmenu');\n $document.on('click.toolboxmenu', function () {\n self.allMenus.forEach(function (menu) {\n if (menu.is('opened')) {\n menu.closeMenu();\n }\n });\n });\n }).on('destroy', function () {\n $document.off('.toolboxmenu');\n this.allItems.forEach(function (item) {\n item.destroy();\n });\n }).setTemplate(toolboxTpl);\n return toolboxComponent;\n }\n\n return toolboxComponentFactory;\n\n});\n\n","define('taoQtiTest/runner/provider/stopwatch',['core/eventifier', 'core/polling', 'core/timer'], function (eventifier, pollingFactory, timerFactory) { 'use strict';\n\n eventifier = eventifier && Object.prototype.hasOwnProperty.call(eventifier, 'default') ? eventifier['default'] : eventifier;\n pollingFactory = pollingFactory && Object.prototype.hasOwnProperty.call(pollingFactory, 'default') ? pollingFactory['default'] : pollingFactory;\n timerFactory = timerFactory && Object.prototype.hasOwnProperty.call(timerFactory, 'default') ? timerFactory['default'] : timerFactory;\n\n /*\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 (original work) Open Assessment Technologies SA\n *\n */\n const defaultOptions = {\n interval: 1000\n };\n\n /**\n * The stopwatch factory\n * @param {Object} options\n * @param {Number} [options.interval]\n * @returns {Object} stopwatch instance\n */\n function stopwatchFactory() {\n let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n const config = Object.assign({}, defaultOptions, options);\n let initialized = false;\n let polling;\n let stopwatch;\n return eventifier({\n /**\n * Is this instance initialized\n * @returns {Boolean}\n */\n isInitialized() {\n return initialized;\n },\n /**\n * Initialize stopwatch\n */\n init() {\n stopwatch = timerFactory({\n autoStart: false\n });\n\n /**\n * @fires tick - every time when interval is elapsed\n */\n polling = pollingFactory({\n action: () => this.trigger('tick', stopwatch.tick()),\n interval: config.interval,\n autoStart: false\n });\n initialized = true;\n },\n /**\n * Start stopwatch\n */\n start() {\n if (this.isInitialized()) {\n stopwatch.resume();\n polling.start();\n }\n },\n /**\n * Stop stopwatch\n */\n stop() {\n if (this.isInitialized()) {\n stopwatch.pause();\n polling.stop();\n }\n },\n /**\n * Destory stopwatch by stoping the timer\n */\n destroy() {\n if (this.isInitialized()) {\n initialized = false;\n polling.stop();\n polling = null;\n stopwatch.stop();\n stopwatch = null;\n }\n }\n });\n }\n\n return stopwatchFactory;\n\n});\n\n","define('taoQtiTest/runner/provider/qti',['jquery', 'lodash', 'i18n', 'core/cachedStore', 'util/browser', 'taoTests/runner/areaBroker', 'taoTests/runner/proxy', 'taoTests/runner/probeOverseer', 'taoTests/runner/testStore', 'taoQtiTest/runner/provider/dataUpdater', 'taoQtiTest/runner/provider/toolStateBridge', 'taoQtiTest/runner/helpers/currentItem', 'taoQtiTest/runner/helpers/map', 'taoQtiTest/runner/ui/toolbox/toolbox', 'taoQtiItem/runner/qtiItemRunner', 'taoQtiTest/runner/config/assetManager', 'handlebars', 'lib/handlebars/helpers', 'taoQtiTest/runner/config/states', 'taoQtiTest/runner/provider/stopwatch'], function ($$1, _, __, cachedStore, browser, areaBrokerFactory, proxyFactory, probeOverseerFactory, testStoreFactory, dataUpdater, toolStateBridgeFactory, currentItemHelper, mapHelper, toolboxFactory, qtiItemRunner, getAssetManager, Handlebars, Helpers0, states, stopwatchFactory) { 'use strict';\n\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n cachedStore = cachedStore && Object.prototype.hasOwnProperty.call(cachedStore, 'default') ? cachedStore['default'] : cachedStore;\n browser = browser && Object.prototype.hasOwnProperty.call(browser, 'default') ? browser['default'] : browser;\n areaBrokerFactory = areaBrokerFactory && Object.prototype.hasOwnProperty.call(areaBrokerFactory, 'default') ? areaBrokerFactory['default'] : areaBrokerFactory;\n proxyFactory = proxyFactory && Object.prototype.hasOwnProperty.call(proxyFactory, 'default') ? proxyFactory['default'] : proxyFactory;\n probeOverseerFactory = probeOverseerFactory && Object.prototype.hasOwnProperty.call(probeOverseerFactory, 'default') ? probeOverseerFactory['default'] : probeOverseerFactory;\n testStoreFactory = testStoreFactory && Object.prototype.hasOwnProperty.call(testStoreFactory, 'default') ? testStoreFactory['default'] : testStoreFactory;\n dataUpdater = dataUpdater && Object.prototype.hasOwnProperty.call(dataUpdater, 'default') ? dataUpdater['default'] : dataUpdater;\n toolStateBridgeFactory = toolStateBridgeFactory && Object.prototype.hasOwnProperty.call(toolStateBridgeFactory, 'default') ? toolStateBridgeFactory['default'] : toolStateBridgeFactory;\n currentItemHelper = currentItemHelper && Object.prototype.hasOwnProperty.call(currentItemHelper, 'default') ? currentItemHelper['default'] : currentItemHelper;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n toolboxFactory = toolboxFactory && Object.prototype.hasOwnProperty.call(toolboxFactory, 'default') ? toolboxFactory['default'] : toolboxFactory;\n qtiItemRunner = qtiItemRunner && Object.prototype.hasOwnProperty.call(qtiItemRunner, 'default') ? qtiItemRunner['default'] : qtiItemRunner;\n getAssetManager = getAssetManager && Object.prototype.hasOwnProperty.call(getAssetManager, 'default') ? getAssetManager['default'] : getAssetManager;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n states = states && Object.prototype.hasOwnProperty.call(states, 'default') ? states['default'] : states;\n stopwatchFactory = stopwatchFactory && Object.prototype.hasOwnProperty.call(stopwatchFactory, 'default') ? stopwatchFactory['default'] : stopwatchFactory;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", helper, options, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;\n\n\n buffer += \"
          \\n
          \\n
          \\n
          \\n\\n
          \\n\\n \\n\\n
          \\n

          \\n
          \\n
          \\n
          \\n\\n
          \\n
          \\n \\n \\n
          \\n
          \\n\\n
          \\n\";\n return buffer;\n });\n function layoutTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2021 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * A Test runner provider to be registered against the runner\n */\n var qtiProvider = {\n //provider name\n name: 'qti',\n /**\n * Initialize and load the area broker with a correct mapping\n * @returns {areaBroker}\n */\n loadAreaBroker: function loadAreaBroker() {\n var $layout = $$1(layoutTpl());\n return areaBrokerFactory($layout, {\n content: $$1('#qti-content', $layout),\n toolbox: $$1('.tools-box', $layout),\n navigation: $$1('.navi-box-list', $layout),\n mainLandmark: $$1('#test-title-header', $layout),\n control: $$1('.top-action-bar .control-box', $layout),\n actionsBar: $$1('.bottom-action-bar .control-box', $layout),\n panel: $$1('.test-sidebar-left', $layout),\n header: $$1('.title-box', $layout)\n });\n },\n /**\n * Initialize and load the test runner proxy\n * @returns {proxy}\n */\n loadProxy: function loadProxy() {\n var config = this.getConfig();\n var proxyProvider = config.provider.proxy || 'qtiServiceProxy';\n var proxyConfig = _.pick(config, ['testDefinition', 'testCompilation', 'serviceCallId', 'bootstrap', 'options']);\n return proxyFactory(proxyProvider, proxyConfig);\n },\n /**\n * Initialize and load the probe overseer\n * @returns {probeOverseer}\n */\n loadProbeOverseer: function loadProbeOverseer() {\n //the test run needs to be identified uniquely\n return probeOverseerFactory(this);\n },\n /**\n * Initialize and load the test store\n * @returns {testStore}\n */\n loadTestStore: function loadTestStore() {\n var config = this.getConfig();\n\n //the test run needs to be identified uniquely\n var identifier = config.serviceCallId || `test-${Date.now()}`;\n return testStoreFactory(identifier);\n },\n /**\n * Loads the persistent states storage\n *\n * @returns {Promise}\n */\n loadPersistentStates: function loadPersistentStates() {\n var self = this;\n var config = this.getConfig();\n var persistencePromise = cachedStore(`test-states-${config.serviceCallId}`, 'states');\n persistencePromise.catch(function (err) {\n self.trigger('error', err);\n });\n return persistencePromise.then(function (storage) {\n self.stateStorage = storage;\n });\n },\n /**\n * Checks a runner persistent state\n *\n * @param {String} name - the state name\n * @returns {Boolean} if active, false if not set\n */\n getPersistentState: function getPersistentState(name) {\n if (this.stateStorage) {\n return this.stateStorage.getItem(name);\n }\n },\n /**\n * Defines a runner persistent state\n *\n * @param {String} name - the state name\n * @param {Boolean} active - is the state active\n * @returns {Promise} Returns a promise that:\n * - will be resolved once the state is fully stored\n * - will be rejected if any error occurs or if the state name is not a valid string\n */\n setPersistentState: function setPersistentState(name, active) {\n var self = this;\n var setPromise;\n if (this.stateStorage) {\n setPromise = this.stateStorage.setItem(name, active);\n setPromise.catch(function (err) {\n self.trigger('error', err);\n });\n return setPromise;\n }\n },\n /**\n * Install step : install new methods/behavior\n *\n * @this {runner} the runner context, not the provider\n */\n install() {\n /**\n * Delegates the update of testMap, testContext and testData\n * to a 3rd part component, the dataUpdater.\n */\n this.dataUpdater = dataUpdater(this.getDataHolder());\n\n /**\n * The tool state bridge manages the state of the tools (plugins)\n * it updated directly the store of the plugins when configured to resume their values\n */\n this.toolStateBridge = toolStateBridgeFactory(this.getTestStore(), _.keys(this.getPlugins()));\n\n /**\n * Convenience function to load the current item from the testMap\n * @returns {Object?} the current item if any or falsy\n */\n this.getCurrentItem = function getCurrentItem() {\n const testContext = this.getTestContext();\n const testMap = this.getTestMap();\n if (testContext && testMap && testContext.itemIdentifier) {\n return mapHelper.getItem(testMap, testContext.itemIdentifier);\n }\n };\n\n /**\n * Convenience function to load the current section from the testMap\n * @returns {Object?} the current section if any or falsy\n */\n this.getCurrentSection = function getCurrentSection() {\n const testContext = this.getTestContext();\n const testMap = this.getTestMap();\n if (testContext && testMap && testContext.sectionId) {\n return mapHelper.getSection(testMap, testContext.sectionId);\n }\n };\n\n /**\n * Convenience function to load the current part from the testMap\n * @returns {Object?} the current part if any or falsy\n */\n this.getCurrentPart = function getCurrentPart() {\n const testContext = this.getTestContext();\n const testMap = this.getTestMap();\n if (testContext && testMap && testContext.testPartId) {\n return mapHelper.getPart(testMap, testContext.testPartId);\n }\n };\n },\n /**\n * Initialization of the provider, called during test runner init phase.\n *\n * We install behaviors during this phase (ie. even handlers)\n * and we call proxy.init.\n *\n * @this {runner} the runner context, not the provider\n * @returns {Promise} to chain proxy.init\n */\n init: function init() {\n const self = this;\n const config = this.getConfig();\n const areaBroker = this.getAreaBroker();\n\n /**\n * Retrieve the item results\n * @returns {Object} the results\n */\n function getItemResults() {\n var results = {};\n var context = self.getTestContext();\n if (context && self.itemRunner && context.itemSessionState <= states.itemSession.interacting) {\n results = {\n itemResponse: self.itemRunner.getResponses(),\n itemState: self.itemRunner.getState()\n };\n }\n return results;\n }\n\n /**\n * Compute the next item for the given action\n * @param {String} action - item action like move/next, skip, etc.\n * @param {Object} [params] - the item action additional params\n * @param {Promise} [loadPromise] - wait this Promise to resolve before loading the item.\n */\n function computeNext(action, params, loadPromise) {\n const context = self.getTestContext();\n const currentItem = self.getCurrentItem();\n const options = self.getOptions();\n const skipPausedAssessmentDialog = !!options.skipPausedAssessmentDialog;\n const {\n partiallyAnsweredIsAnswered\n } = options.review;\n\n //catch server errors\n var submitError = function submitError(err) {\n if (err && err.unrecoverable) {\n if (!skipPausedAssessmentDialog) {\n self.trigger('alert.error', __('An unrecoverable error occurred. Your test session will be paused.'));\n }\n self.trigger('pause', {\n message: err.message\n });\n } else if (err.code === 200) {\n //some server errors are valid, so we don't fail (prevent empty responses)\n self.trigger('alert.submitError', err.message || __('An error occurred during results submission. Please retry.'), load);\n } else {\n self.trigger('error', err);\n }\n };\n\n //if we have to display modal feedbacks, we submit the responses before the move\n const feedbackPromise = new Promise(resolve => {\n //@deprecated feedbacks from testContext\n if ((currentItem.hasFeedbacks || context.hasFeedbacks) && context.itemSessionState <= states.itemSession.interacting) {\n params = _.omit(params, ['itemState', 'itemResponse']);\n self.getProxy().submitItem(context.itemIdentifier, self.itemRunner.getState(), self.itemRunner.getResponses(), params).then(results => {\n if (results.itemSession) {\n currentItem.answered = results.itemSession.itemAnswered;\n if (results.displayFeedbacks === true && results.feedbacks) {\n self.itemRunner.renderFeedbacks(results.feedbacks, results.itemSession, function (queue) {\n self.trigger('modalFeedbacks', queue, resolve);\n });\n return;\n }\n }\n return resolve();\n }).catch(submitError);\n } else {\n if (action === 'skip') {\n currentItem.answered = false;\n } else {\n // when the test part is linear, the item is always answered as we cannot come back to it\n const testPart = self.getCurrentPart();\n const isLinear = testPart && testPart.isLinear;\n currentItem.answered = isLinear || currentItemHelper.isAnswered(self, partiallyAnsweredIsAnswered);\n }\n resolve();\n }\n });\n feedbackPromise.then(function () {\n return self.toolStateBridge.getStates();\n }).then(function (toolStates) {\n if (toolStates && _.size(toolStates) > 0) {\n params.toolStates = toolStates;\n }\n\n // ensure the answered state of the current item is correctly set and the stats are aligned\n self.setTestMap(self.dataUpdater.updateStats());\n\n //to be sure load start after unload...\n //we add an intermediate ns event on unload\n self.on(`unloaditem.${action}`, function () {\n self.off(`.${action}`);\n self.getProxy().callItemAction(context.itemIdentifier, action, params).then(function (results) {\n loadPromise = loadPromise || Promise.resolve();\n return loadPromise.then(function () {\n return results;\n });\n }).then(function (results) {\n //update testData, testContext and build testMap\n self.dataUpdater.update(results);\n load();\n }).catch(submitError);\n });\n self.unloadItem(context.itemIdentifier);\n }).catch(submitError);\n }\n\n /**\n * Load the next action: load the current item or call finish based the test state\n */\n function load() {\n var context = self.getTestContext();\n if (context.state <= states.testSession.interacting) {\n self.loadItem(context.itemIdentifier);\n } else if (context.state === states.testSession.closed) {\n self.finish();\n }\n }\n areaBroker.setComponent('toolbox', toolboxFactory());\n areaBroker.getToolbox().init();\n const stopwatch = stopwatchFactory({});\n stopwatch.init();\n stopwatch.spread(this, 'tick');\n const isTimerClientMode = () => config.options.timer && config.options.timer.restoreTimerFromClient;\n\n /*\n * Install behavior on events\n */\n this.on('ready', function () {\n //load the 1st item\n load();\n }).on('move', function (direction, scope, position) {\n // get the item results/state before disabling the tools\n // otherwise the state could be partially lost for tools that clean up when disabling\n var itemResults = getItemResults();\n this.trigger('disablenav disabletools');\n computeNext('move', _.merge(itemResults, {\n direction: direction,\n scope: scope || 'item',\n ref: position\n }));\n }).on('skip', function (scope) {\n this.trigger('disablenav disabletools');\n computeNext('skip', {\n scope: scope || 'item'\n });\n }).on('exit', function (reason) {\n var context = self.getTestContext();\n this.disableItem(context.itemIdentifier);\n this.getProxy().callTestAction('exitTest', _.merge(getItemResults(), {\n itemDefinition: context.itemIdentifier,\n reason: reason\n })).then(function () {\n return self.finish();\n }).catch(function (err) {\n self.trigger('error', err);\n });\n }).on('timeout', function (scope, ref, timer) {\n const context = self.getTestContext();\n const noAlertTimeout = mapHelper.hasItemCategory(self.getTestMap(), context.itemIdentifier, 'noAlertTimeout', true);\n context.isTimeout = true;\n this.setTestContext(context);\n if (timer && timer.allowLateSubmission) {\n self.trigger('alert.timeout', __('Time limit reached, this part of the test has ended. However you are allowed to finish the current item.'));\n self.before('move.latetimeout', function () {\n self.off('move.latetimeout');\n computeNext('timeout', _.merge(getItemResults(), {\n scope: scope,\n ref: ref,\n late: true\n }));\n return Promise.reject({\n cancel: true\n });\n });\n } else {\n this.disableItem(context.itemIdentifier);\n computeNext('timeout', _.merge(getItemResults(), {\n scope: scope,\n ref: ref\n }), new Promise(function (resolve) {\n if (noAlertTimeout) {\n resolve();\n } else {\n self.trigger('alert.timeout', __('The time limit has been reached for this part of the test.'), () => {\n self.trigger('timeoutAccepted');\n resolve();\n });\n }\n }));\n }\n }).on('pause', function (data) {\n const testContext = self.getTestContext();\n const options = self.getOptions();\n const skipPausedAssessmentDialog = !!options.skipPausedAssessmentDialog;\n this.setState('closedOrSuspended', true);\n const params = {\n itemDefinition: testContext.itemIdentifier,\n reason: {\n reasons: data && data.reasons,\n comment: data && (data.originalMessage || data.message)\n }\n };\n const itemState = self.itemRunner.getState();\n if (Object.keys(itemState).length) {\n params.itemState = itemState;\n }\n this.getProxy().callTestAction('pause', params).then(function () {\n self.trigger('leave', {\n code: states.testSession.suspended,\n message: data && data.message,\n skipExitMessage: skipPausedAssessmentDialog\n });\n }).catch(function (err) {\n self.trigger('error', err);\n });\n }).on('move skip exit timeout pause', function () {\n stopwatch.stop();\n }).on('loaditem', function () {\n var context = this.getTestContext();\n var warning = false;\n\n /**\n * Get the label of the current item\n * @returns {String} the label (fallback to the item identifier);\n */\n var getItemLabel = function getItemLabel() {\n const item = self.getCurrentItem();\n return item && item.label ? item.label : context.itemIdentifier;\n };\n\n //The item is rendered but in a state that prevents us from interacting\n if (context.isTimeout) {\n warning = __('Time limit reached for item \"%s\".', getItemLabel());\n } else if (context.itemSessionState > states.itemSession.interacting) {\n if (context.remainingAttempts === 0) {\n warning = __('No more attempts allowed for item \"%s\".', getItemLabel());\n } else {\n warning = __('Item \"%s\" is completed.', getItemLabel());\n }\n }\n\n //we disable the item and warn the user\n if (warning) {\n self.disableItem(context.itemIdentifier);\n self.trigger('warning', warning);\n }\n }).on('renderitem', function () {\n var context = this.getTestContext();\n if (!this.getItemState(context.itemIdentifier, 'disabled')) {\n this.trigger('enabletools');\n }\n this.trigger('enablenav');\n }).after('renderitem', function () {\n stopwatch.start();\n }).on('resumeitem', function () {\n this.trigger('enableitem enablenav');\n }).on('disableitem', function () {\n if (isTimerClientMode()) {\n stopwatch.stop();\n }\n this.trigger('disabletools');\n }).on('enableitem', function () {\n if (isTimerClientMode()) {\n stopwatch.start();\n }\n this.trigger('enabletools');\n }).on('error', function () {\n stopwatch.stop();\n this.trigger('disabletools enablenav');\n }).on('finish', function () {\n this.flush();\n }).on('leave', function () {\n this.trigger('endsession');\n this.flush();\n }).on('flush', function () {\n this.destroy();\n stopwatch.destroy();\n });\n\n //starts the event collection\n if (this.getProbeOverseer()) {\n this.getProbeOverseer().start();\n }\n\n //get the current store identifier to send it along with the init call\n return this.getTestStore().getStorageIdentifier().then(function (storeId) {\n //load data and current context in parallel at initialization\n return self.getProxy().init({\n storeId: storeId\n }).then(function (response) {\n //handle backward compatibility with testData\n if (response.testData) {\n Object.assign(config.options, response.testData.config);\n }\n\n //fill the dataHolder, build the jump table, etc.\n self.dataUpdater.update(response);\n\n //set the plugin config\n self.dataUpdater.updatePluginsConfig(self.getPlugins(), self.getPluginsConfig());\n\n //this checks the received storeId and clear the volatiles stores\n return self.getTestStore().clearVolatileIfStoreChange(response.lastStoreId).then(function () {\n return response;\n });\n }).then(function (response) {\n var isNewStore = !response.lastStoreId || response.lastStoreId !== storeId;\n if (response.toolStates && isNewStore) {\n return self.toolStateBridge.setTools(_.keys(response.toolStates)).restoreStates(response.toolStates);\n }\n });\n });\n },\n /**\n * Rendering phase of the test runner\n *\n * Attach the test runner to the DOM\n *\n * @this {runner} the runner context, not the provider\n */\n render: function render() {\n var config = this.getConfig();\n var areaBroker = this.getAreaBroker();\n config.renderTo.append(areaBroker.getContainer());\n areaBroker.getToolbox().render(areaBroker.getToolboxArea());\n },\n /**\n * LoadItem phase of the test runner\n *\n * We call the proxy in order to get the item data\n *\n * @this {runner} the runner context, not the provider\n * @param {String} itemIdentifier - The identifier of the item to update\n * @returns {Promise} that calls in parallel the state and the item data\n */\n loadItem: function loadItem(itemIdentifier) {\n return this.getProxy().getItem(itemIdentifier).then(_ref => {\n let {\n itemData,\n baseUrl,\n itemState,\n portableElements,\n flags\n } = _ref;\n return {\n content: itemData,\n baseUrl,\n state: itemState,\n portableElements,\n flags\n };\n });\n },\n /**\n * RenderItem phase of the test runner\n *\n * Here we initialize the item runner and wrap it's call to the test runner\n *\n * @this {runner} the runner context, not the provider\n * @param {String} itemIdentifier - The identifier of the item to update\n * @param {Object} itemData - The definition data of the item\n * @returns {Promise} resolves when the item is ready\n */\n renderItem: function renderItem(itemIdentifier, itemData) {\n var self = this;\n var config = this.getConfig();\n var assetManager = getAssetManager(config.serviceCallId);\n var changeState = function changeState() {\n self.setItemState(itemIdentifier, 'changed', true);\n };\n return new Promise(function (resolve, reject) {\n assetManager.setData('baseUrl', itemData.baseUrl);\n assetManager.setData('itemIdentifier', itemIdentifier);\n assetManager.setData('assets', itemData.content.assets);\n itemData.content = itemData.content || {};\n self.itemRunner = qtiItemRunner(itemData.content.type, itemData.content.data, {\n assetManager: assetManager\n }).on('error', function (err) {\n if (err && err.unrecoverable) {\n self.trigger('pause', {\n message: err.message\n });\n } else {\n self.trigger('enablenav');\n reject(err);\n }\n }).on('init', function () {\n var itemContainer = self.getAreaBroker().getContentArea();\n var itemRenderingOptions = _.pick(itemData, ['state', 'portableElements']);\n this.render(itemContainer, itemRenderingOptions);\n }).on('render', function () {\n this.on('responsechange', changeState);\n this.on('statechange', changeState);\n resolve();\n }).after('render', function () {\n //iOS only fix: sometimes the wrapper is not scrollable because of some bugs in Safari iOS\n //we have to force it to reconsider if the scroll needs to apply\n if (browser.isIOs()) {\n const wrapperElt = self.getAreaBroker().getContainer().find('.content-wrapper').get(0);\n if (wrapperElt) {\n wrapperElt.style.overflow = 'hidden';\n setTimeout(() => wrapperElt.style.overflow = 'auto', 0);\n }\n }\n }).on('warning', function (err) {\n self.trigger('warning', err);\n }).init();\n });\n },\n /**\n * UnloadItem phase of the test runner\n *\n * Item clean up\n *\n * @this {runner} the runner context, not the provider\n * @returns {Promise} resolves when the item is cleared\n */\n unloadItem: function unloadItem() {\n var self = this;\n self.trigger('beforeunloaditem disablenav disabletools');\n return new Promise(function (resolve) {\n if (self.itemRunner) {\n self.itemRunner.on('clear', resolve).clear();\n return;\n }\n resolve();\n });\n },\n /**\n * Finish phase of the test runner\n *\n * Calls proxy.finish to close the test\n *\n * @this {runner} the runner context, not the provider\n * @returns {Promise} proxy.finish\n */\n finish: function finish() {\n if (!this.getState('finish')) {\n this.trigger('disablenav disabletools');\n if (this.stateStorage) {\n return this.stateStorage.removeStore();\n }\n }\n },\n /**\n * Flushes the test variables before leaving the runner\n *\n * Clean up\n *\n * @this {runner} the runner context, not the provider\n * @returns {Promise}\n */\n flush: function flush() {\n var self = this;\n var probeOverseer = this.getProbeOverseer();\n var proxy = this.getProxy();\n var flushPromise;\n\n //if there is trace data collected by the probes\n if (probeOverseer && !this.getState('disconnected')) {\n flushPromise = probeOverseer.flush().then(function (data) {\n var traceData = {};\n\n //we reformat the time set into a trace variables\n if (data && data.length) {\n _.forEach(data, function (entry) {\n var id = `${entry.type}-${entry.id}`;\n if (entry.marker) {\n id = `${entry.marker}-${id}`;\n }\n traceData[id] = entry;\n });\n //and send them\n return self.getProxy().sendVariables(traceData);\n }\n }).then(function () {\n probeOverseer.stop();\n }).catch(function () {\n probeOverseer.stop();\n });\n } else {\n flushPromise = Promise.resolve();\n }\n return flushPromise.then(function () {\n // safely stop the communicator to prevent inconsistent communication while leaving\n if (proxy.hasCommunicator()) {\n proxy.getCommunicator().then(function (communicator) {\n return communicator.close();\n })\n // Silently catch the potential errors to avoid polluting the console.\n // The code above is present to close an already open communicator in order to avoid later\n // communication while the test is destroying. So if any error occurs here it is not very important,\n // the most time it will be a missing communicator error, due to disabled config.\n .catch(_.noop);\n }\n });\n },\n /**\n * Destroy phase of the test runner\n *\n * Clean up\n *\n * @this {runner} the runner context, not the provider\n * @returns void\n */\n destroy: function destroy() {\n var areaBroker = this.getAreaBroker();\n\n // prevent the item to be displayed while test runner is destroying\n if (this.itemRunner) {\n this.itemRunner.clear();\n }\n this.itemRunner = null;\n if (areaBroker) {\n areaBroker.getToolbox().destroy();\n }\n\n //we remove the store(s) only if the finish step was reached\n if (this.getState('finish')) {\n return this.getTestStore().remove();\n }\n }\n };\n\n return qtiProvider;\n\n});\n\n","define('taoQtiTest/runner/proxy/cache/actionStore',['lodash', 'taoTests/runner/testStore'], function (_, testStore) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n testStore = testStore && Object.prototype.hasOwnProperty.call(testStore, 'default') ? testStore['default'] : testStore;\n\n /*\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017 Open Assessment Technologies SA\n */\n var storeName = 'actions';\n var storeKey = 'queue';\n\n /**\n * Create an action store\n *\n * @param {String} id - the store id, to identify a test\n * @returns {actionStore}\n */\n function actionStoreFatory(id) {\n var actionQueue = [];\n\n /**\n * Load the store from the testStore\n * @returns {Promise} the storage instance\n */\n var loadStore = function loadStore() {\n return testStore(id).getStore(storeName);\n };\n if (_.isEmpty(id)) {\n throw new TypeError('Please specify the action store id');\n }\n\n /**\n * @typedef {actionStore}\n */\n return {\n /**\n * Push an action to the store\n * @param {String} action - the action name\n * @param {Object} params - the action parameters\n * @returns {Promise} resolves when the action is stored\n */\n push: function push(action, params, timestamp) {\n actionQueue.push({\n action: action,\n timestamp: timestamp || Date.now(),\n parameters: params\n });\n return loadStore().then(function (actionStore) {\n return actionStore.setItem(storeKey, actionQueue);\n });\n },\n /**\n * Flush the action store and retrieve the data\n * @returns {Promise} resolves with the flushed data\n */\n flush: function flush() {\n return loadStore().then(function (actionStore) {\n return actionStore.getItem(storeKey).then(function (queue) {\n actionQueue = [];\n return actionStore.setItem(storeKey, actionQueue).then(function () {\n return queue;\n });\n });\n });\n },\n /**\n * Update action parameters. Action to update will be defined by params.actionId parameter value.\n * @param {Object} params - the action parameters\n * @returns {Promise} resolves when the action is stored\n */\n update: function update(params) {\n _.forEach(actionQueue, function (action) {\n if (action.parameters.actionId === params.actionId) {\n action.parameters = params;\n }\n });\n return loadStore().then(function (actionStore) {\n return actionStore.setItem(storeKey, actionQueue);\n });\n }\n };\n }\n\n return actionStoreFatory;\n\n});\n\n","define('taoQtiTest/runner/proxy/cache/preloaders/assets/audio',['lodash'], function (_) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n\n /*\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017-2021 Open Assessment Technologies SA\n */\n\n /**\n * (Pre)load audio content.\n *\n * @author Bertrand Chevrier \n */\n var audio = {\n /**\n * The name of the preloader\n * @type {string}\n */\n name: 'audio',\n /**\n * Manages the preloading of audio files\n * @param assetManager - A reference to the assetManager\n * @returns {assetPreloader}\n */\n init(assetManager) {\n //keep references to preloaded audio blobs\n const audioBlobs = {};\n\n //prepend a strategy to resolves cached assets\n assetManager.prependStrategy({\n name: 'precaching-audio',\n handle(url, data) {\n const sourceUrl = url.toString();\n\n //resolves precached audio files\n if (data.itemIdentifier && audioBlobs[data.itemIdentifier] && 'undefined' !== typeof audioBlobs[data.itemIdentifier][sourceUrl]) {\n //creates an internal URL to link the audio blob\n return URL.createObjectURL(audioBlobs[data.itemIdentifier][sourceUrl]);\n }\n }\n });\n return {\n /**\n * Tells whether an audio file was preloaded or not\n * @param {string} url - the url of the audio file to preload\n * @param {string} sourceUrl - the unresolved URL (used to index)\n * @param {string} itemIdentifier - the id of the item the asset belongs to\n * @returns {boolean}\n */\n loaded(url, sourceUrl, itemIdentifier) {\n return !!(audioBlobs[itemIdentifier] && audioBlobs[itemIdentifier][sourceUrl]);\n },\n /**\n * Preloads audio files : save the blobs for later use in the asset manager\n * @param {string} url - the url of the audio file to preload\n * @param {string} sourceUrl - the unresolved URL (used to index)\n * @param {string} itemIdentifier - the id of the item the asset belongs to\n * @returns {Promise}\n */\n load(url, sourceUrl, itemIdentifier) {\n return new Promise(resolve => {\n audioBlobs[itemIdentifier] = audioBlobs[itemIdentifier] || {};\n if ('undefined' === typeof audioBlobs[itemIdentifier][sourceUrl]) {\n //direct XHR to benefit from the \"blob\" response type\n const request = new XMLHttpRequest();\n request.open('GET', url, true);\n request.responseType = 'blob';\n request.onerror = resolve;\n request.onabort = resolve;\n request.onload = () => {\n if (request.status === 200) {\n //save the blob, directly\n audioBlobs[itemIdentifier][sourceUrl] = request.response;\n }\n resolve();\n };\n //ignore failed requests, best effort only\n request.send();\n } else {\n resolve();\n }\n });\n },\n /**\n * Removes loaded audio files\n * @param {string} url - the url of the audio file to unload\n * @param {string} sourceUrl - the unresolved URL\n * @param {string} itemIdentifier - the id of the item the asset belongs to\n * @returns {Promise}\n */\n unload(url, sourceUrl, itemIdentifier) {\n if (audioBlobs[itemIdentifier]) {\n audioBlobs[itemIdentifier] = _.omit(audioBlobs[itemIdentifier], sourceUrl);\n }\n return Promise.resolve();\n }\n };\n }\n };\n\n return audio;\n\n});\n\n","define('taoQtiTest/runner/proxy/cache/preloaders/assets/image',['lodash'], function (_) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n\n /*\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017-2021 Open Assessment Technologies SA\n */\n\n /**\n * (Pre)load images.\n *\n * @author Bertrand Chevrier \n */\n var image = {\n /**\n * The name of the preloader\n * @type {string}\n */\n name: 'img',\n /**\n * Manages the preloading of images\n * @returns {assetPreloader}\n */\n init() {\n //keep references to preloaded images attached\n //in order to prevent garbage collection of cached images\n const images = {};\n return {\n /**\n * Tells whether an image was preloaded or not\n * @param {string} url - the url of the image to preload\n * @param {string} sourceUrl - the unresolved URL (used to index)\n * @param {string} itemIdentifier - the id of the item the asset belongs to\n * @returns {boolean}\n */\n loaded(url, sourceUrl, itemIdentifier) {\n return !!(images[itemIdentifier] && images[itemIdentifier][sourceUrl]);\n },\n /**\n * Preloads an image, using the in memory Image object\n * @param {string} url - the url of the image to preload\n * @param {string} sourceUrl - the unresolved URL (used to index)\n * @param {string} itemIdentifier - the id of the item the asset belongs to\n * @returns {Promise}\n */\n load(url, sourceUrl, itemIdentifier) {\n images[itemIdentifier] = images[itemIdentifier] || {};\n if ('Image' in window && !images[itemIdentifier][sourceUrl]) {\n images[itemIdentifier][sourceUrl] = new Image();\n images[itemIdentifier][sourceUrl].src = url;\n }\n return Promise.resolve();\n },\n /**\n * Removes images ref so they can be garbage collected\n * @param {string} url - the url of the image to unload\n * @param {string} sourceUrl - the unresolved URL (used to index)\n * @param {string} itemIdentifier - the id of the item the asset belongs to\n * @returns {Promise}\n */\n unload(url, sourceUrl, itemIdentifier) {\n if (images[itemIdentifier]) {\n images[itemIdentifier] = _.omit(images[itemIdentifier], sourceUrl);\n }\n return Promise.resolve();\n }\n };\n }\n };\n\n return image;\n\n});\n\n","define('taoQtiTest/runner/proxy/cache/preloaders/assets/stylesheet',['lodash'], function (_) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n\n /*\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017-2021 Open Assessment Technologies SA\n */\n\n /**\n * Test the support of possible `` values.\n * @param {string} feature - the value to test\n * @returns {boolean}\n * @private\n */\n const relSupport = feature => {\n const fakeLink = document.createElement('link');\n try {\n if (fakeLink.relList && 'function' === typeof fakeLink.relList.supports) {\n return fakeLink.relList.supports(feature);\n }\n } catch (err) {\n return false;\n }\n };\n\n /**\n * Does the current env supports ``\n * @type {boolean}\n * @private\n */\n const supportPreload = relSupport('preload');\n\n /**\n * Does the current env supports ``\n * @type {boolean}\n * @private\n */\n const supportPrefetch = relSupport('prefetch');\n\n /**\n * (Pre)load stylesheets.\n *\n * @author Bertrand Chevrier \n */\n var stylesheet = {\n /**\n * The name of the preloader\n * @type {string}\n */\n name: 'css',\n /**\n * Manages the preloading of stylesheets\n * @returns {assetPreloader}\n */\n init() {\n //keep references to preloaded CSS files\n const stylesheets = {};\n return {\n /**\n * Tells whether a stylesheet was preloaded or not\n * @param {string} url - the url of the stylesheet to preload\n * @param {string} sourceUrl - the unresolved URL (used to index)\n * @param {string} itemIdentifier - the id of the item the asset belongs to\n * @returns {boolean}\n */\n loaded(url, sourceUrl, itemIdentifier) {\n return !!(stylesheets[itemIdentifier] && stylesheets[itemIdentifier][sourceUrl]);\n },\n /**\n * Preloads a stylesheet\n * @param {string} url - the url of the stylesheet to preload\n * @param {string} sourceUrl - the unresolved URL (used to index)\n * @param {string} itemIdentifier - the id of the item the asset belongs to\n * @returns {Promise}\n */\n load(url, sourceUrl, itemIdentifier) {\n stylesheets[itemIdentifier] = stylesheets[itemIdentifier] || {};\n if (!stylesheets[itemIdentifier][sourceUrl]) {\n const link = document.createElement('link');\n if (supportPreload) {\n link.setAttribute('rel', 'preload');\n link.setAttribute('as', 'style');\n } else if (supportPrefetch) {\n link.setAttribute('rel', 'prefetch');\n link.setAttribute('as', 'style');\n } else {\n link.disabled = true;\n link.setAttribute('rel', 'stylesheet');\n link.setAttribute('type', 'text/css');\n }\n link.setAttribute('data-preload', true);\n link.setAttribute('href', url);\n document.querySelector('head').appendChild(link);\n stylesheets[itemIdentifier][sourceUrl] = link;\n }\n return Promise.resolve();\n },\n /**\n * Removes the prefetched stylesheet\n * @param {string} url - the url of the stylesheet to unload\n * * @param {string} sourceUrl - the unresolved URL (used to index)\n * @param {string} itemIdentifier - the id of the item the asset belongs to\n * @returns {Promise}\n */\n unload(url, sourceUrl, itemIdentifier) {\n if (stylesheets[itemIdentifier]) {\n const link = stylesheets[itemIdentifier][sourceUrl] || document.querySelector(`head link[data-preload][href=\"${url}\"]`);\n if (link) {\n document.querySelector('head').removeChild(link);\n }\n stylesheets[itemIdentifier] = _.omit(stylesheets[itemIdentifier], sourceUrl);\n }\n return Promise.resolve();\n }\n };\n }\n };\n\n return stylesheet;\n\n});\n\n","define('taoQtiTest/runner/proxy/cache/preloaders/assets/preloaders',['taoQtiTest/runner/proxy/cache/preloaders/assets/audio', 'taoQtiTest/runner/proxy/cache/preloaders/assets/image', 'taoQtiTest/runner/proxy/cache/preloaders/assets/stylesheet'], function (audioPreloader, imagePreloader, stylesheetPreloader) { 'use strict';\n\n\taudioPreloader = audioPreloader && Object.prototype.hasOwnProperty.call(audioPreloader, 'default') ? audioPreloader['default'] : audioPreloader;\n\timagePreloader = imagePreloader && Object.prototype.hasOwnProperty.call(imagePreloader, 'default') ? imagePreloader['default'] : imagePreloader;\n\tstylesheetPreloader = stylesheetPreloader && Object.prototype.hasOwnProperty.call(stylesheetPreloader, 'default') ? stylesheetPreloader['default'] : stylesheetPreloader;\n\n\t/*\n\t * This program is free software; you can redistribute it and/or\n\t * modify it under the terms of the GNU General Public License\n\t * as published by the Free Software Foundation; under version 2\n\t * of the License (non-upgradable).\n\t *\n\t * This program is distributed in the hope that it will be useful,\n\t * but WITHOUT ANY WARRANTY; without even the implied warranty of\n\t * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\t * GNU General Public License for more details.\n\t *\n\t * You should have received a copy of the GNU General Public License\n\t * along with this program; if not, write to the Free Software\n\t * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n\t *\n\t * Copyright (c) 2021 Open Assessment Technologies SA\n\t */\n\n\t/**\n\t * The list of asset loader factories\n\t * @type {Function[]}\n\t */\n\tvar preloaders = [audioPreloader, imagePreloader, stylesheetPreloader];\n\n\treturn preloaders;\n\n});\n\n","define('taoQtiTest/runner/proxy/cache/preloaderManager',['core/providerRegistry'], function (providerRegistry) { 'use strict';\n\n providerRegistry = providerRegistry && Object.prototype.hasOwnProperty.call(providerRegistry, 'default') ? providerRegistry['default'] : providerRegistry;\n\n /*\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2021 Open Assessment Technologies SA\n */\n\n /**\n * @typedef {object} preloaderManager\n * @property {Function} has - Tells whether an asset is loaded or not\n * @property {preloaderManagerAction} loaded - Tells whether an asset is loaded or not\n * @property {preloaderManagerAction} load - Preload an asset\n * @property {preloaderManagerAction} unload - Unload an asset\n */\n\n /**\n * @callback preloaderManagerAction\n * @param {string} name - The type of asset to preload\n * @param {...any} args - The list of args related to the preloader.\n * @returns {any}\n */\n\n /**\n * Creates a preloader manager.\n * @return {Function}\n */\n function preloaderManagerFactory() {\n /**\n * Manages the preloading of assets\n * @param assetManager - A reference to the assetManager\n * @return {preloaderManager}\n */\n function preloaderFactory(assetManager) {\n const preloaders = {};\n preloaderFactory.getAvailableProviders().forEach(name => {\n preloaders[name] = preloaderFactory.getProvider(name).init(assetManager);\n });\n\n /**\n * @typedef preloaderManager\n */\n return {\n /**\n * Checks whether or not an asset preloader exists for a particular type\n * @param {string} name\n * @returns {boolean}\n */\n has(name) {\n return !!preloaders[name];\n },\n /**\n * Tells whether an asset was preloaded or not\n * @param {string} name - The type of asset to preload\n * @param {...any} args - The list of args related to the preloader.\n * @returns {boolean}\n */\n loaded(name) {\n const preloader = preloaders[name];\n if (preloader && 'function' === typeof preloader.loaded) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return !!preloader.loaded(...args);\n }\n return false;\n },\n /**\n * Preloads an asset with respect to it type\n * @param {string} name - The type of asset to preload\n * @param {...any} args - The list of args related to the preloader.\n * @returns {Promise}\n */\n load(name) {\n const preloader = preloaders[name];\n if (preloader && 'function' === typeof preloader.load) {\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n return Promise.resolve(preloader.load(...args));\n }\n return Promise.resolve();\n },\n /**\n * Unloads an asset with respect to it type\n * @param {string} name - The type of asset to unload\n * @param {...any} args - The list of args related to the preloader.\n * @returns {Promise}\n */\n unload(name) {\n const preloader = preloaders[name];\n if (preloader && 'function' === typeof preloader.unload) {\n for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {\n args[_key3 - 1] = arguments[_key3];\n }\n return Promise.resolve(preloader.unload(...args));\n }\n return Promise.resolve();\n }\n };\n }\n return providerRegistry(preloaderFactory);\n }\n\n return preloaderManagerFactory;\n\n});\n\n","define('taoQtiTest/runner/proxy/cache/assetPreloader',['taoQtiTest/runner/proxy/cache/preloaders/assets/preloaders', 'taoQtiTest/runner/proxy/cache/preloaderManager'], function (preloaders, preloaderManagerFactory) { 'use strict';\n\n\tpreloaders = preloaders && Object.prototype.hasOwnProperty.call(preloaders, 'default') ? preloaders['default'] : preloaders;\n\tpreloaderManagerFactory = preloaderManagerFactory && Object.prototype.hasOwnProperty.call(preloaderManagerFactory, 'default') ? preloaderManagerFactory['default'] : preloaderManagerFactory;\n\n\t/*\n\t * This program is free software; you can redistribute it and/or\n\t * modify it under the terms of the GNU General Public License\n\t * as published by the Free Software Foundation; under version 2\n\t * of the License (non-upgradable).\n\t *\n\t * This program is distributed in the hope that it will be useful,\n\t * but WITHOUT ANY WARRANTY; without even the implied warranty of\n\t * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\t * GNU General Public License for more details.\n\t *\n\t * You should have received a copy of the GNU General Public License\n\t * along with this program; if not, write to the Free Software\n\t * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n\t *\n\t * Copyright (c) 2021 Open Assessment Technologies SA\n\t */\n\n\t/**\n\t * @callback assetPreloaderManagerAction\n\t * @param {string} type - The type of asset to preload\n\t * @param {string} url - the url of the asset to load/unload\n\t * @param {string} [sourceUrl] - the unresolved URL (used to index)\n\t * @param {string} [itemIdentifier] - the id of the item the asset belongs to\n\t */\n\n\t/**\n\t * @callback assetPreloaderAction\n\t * @param {string} url - the url of the asset to load/unload\n\t * @param {string} [sourceUrl] - the unresolved URL (used to index)\n\t * @param {string} [itemIdentifier] - the id of the item the asset belongs to\n\t */\n\n\t/**\n\t * @typedef {object} assetPreloaderManager\n\t * @property {string} name - The name of the preloader\n\t * @property {assetPreloaderManagerAction} loaded - Tells whether an asset is loaded or not\n\t * @property {assetPreloaderManagerAction} load - Preload an asset\n\t * @property {assetPreloaderManagerAction} unload - Unload an asset\n\t */\n\n\t/**\n\t * @typedef {object} assetPreloader\n\t * @property {string} name - The name of the preloader\n\t * @property {assetPreloaderAction} loaded - Tells whether an asset is loaded or not\n\t * @property {assetPreloaderAction} load - Preload an asset\n\t * @property {assetPreloaderAction} unload - Unload an asset\n\t */\n\n\t/**\n\t * Manages the preloading of assets\n\t * @function assetPreloaderFactory\n\t * @param assetManager - A reference to the assetManager\n\t * @return {assetPreloaderManager}\n\t */\n\tconst assetPreloaderFactory = preloaderManagerFactory();\n\tpreloaders.forEach(preloader => assetPreloaderFactory.registerProvider(preloader.name, preloader));\n\n\treturn assetPreloaderFactory;\n\n});\n\n","define('taoQtiTest/runner/proxy/cache/preloaders/interactions/extendedText',['ckeditor', 'taoQtiItem/qtiCommonRenderer/helpers/ckConfigurator'], function (ckEditor, ckConfigurator) { 'use strict';\n\n ckEditor = ckEditor && Object.prototype.hasOwnProperty.call(ckEditor, 'default') ? ckEditor['default'] : ckEditor;\n ckConfigurator = ckConfigurator && Object.prototype.hasOwnProperty.call(ckConfigurator, 'default') ? ckConfigurator['default'] : ckConfigurator;\n\n /*\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2021 Open Assessment Technologies SA\n */\n\n /**\n * Preloads CKEditor runtimes for a particular language\n * @param {string} language\n * @returns {Promise}\n */\n function preloadCKEditor(language) {\n return new Promise(resolve => {\n const placeholder = document.createElement('div');\n const ckOptions = {\n resize_enabled: true,\n secure: location.protocol === 'https:',\n forceCustomDomain: true,\n language\n };\n const editor = ckEditor.inline(placeholder, ckOptions);\n editor.on('instanceReady', () => {\n resolve(editor);\n });\n editor.on('configLoaded', () => {\n editor.config = ckConfigurator.getConfig(editor, 'extendedText', ckOptions);\n });\n if (editor.status === 'ready' || editor.status === 'loaded') {\n resolve(editor);\n }\n }).then(editor => {\n editor.destroy();\n });\n }\n\n /**\n * The default item language\n * @type {string}\n * @private\n */\n const defaultLang = 'en';\n\n /**\n * Gets the item's language\n * @param {object} itemData - The item data\n * @returns {string}\n * @private\n */\n const getItemLanguage = itemData => {\n let lang = itemData && itemData.data && itemData.data.attributes && itemData.data.attributes['xml:lang'];\n if (!lang) {\n lang = window.document.documentElement.getAttribute('lang');\n }\n return lang && lang.split('-')[0] || defaultLang;\n };\n\n /**\n * Preloads the runtimes for an extendedText interaction\n */\n var extendedText = {\n /**\n * The name of the preloader\n * @type {string}\n */\n name: 'extendedTextInteraction',\n /**\n * Manages the preloading of the extendedText interaction runtimes\n * @returns {interactionPreloader}\n */\n init() {\n const preloadedLanguages = {};\n return {\n /**\n * Tells whether the runtimes has been preloaded or not\n * @param {object} interaction - The interaction\n * @param {object} itemData - The item data\n * @param {string} itemIdentifier - the id of the item the interaction belongs to\n * @returns {boolean}\n */\n // eslint-disable-next-line no-unused-vars\n loaded(interaction, itemData, itemIdentifier) {\n if (interaction.attributes && interaction.attributes.format === 'xhtml') {\n const lang = getItemLanguage(itemData);\n return preloadedLanguages[lang];\n }\n return true;\n },\n /**\n * Preloads runtimes for an extendedText interaction\n * @param {object} interaction - The interaction\n * @param {object} itemData - The item data\n * @param {string} itemIdentifier - the id of the item the interaction belongs to\n * @returns {Promise}\n */\n // eslint-disable-next-line no-unused-vars\n load(interaction, itemData, itemIdentifier) {\n if (interaction.attributes && interaction.attributes.format === 'xhtml') {\n const lang = getItemLanguage(itemData);\n if (!preloadedLanguages[lang]) {\n preloadedLanguages[lang] = true;\n return preloadCKEditor(lang);\n }\n }\n return Promise.resolve();\n },\n /**\n * Unloads runtimes for an extendedText interaction\n * @param {object} interaction - The interaction\n * @param {object} itemData - The item data\n * @param {string} itemIdentifier - the id of the item the interaction belongs to\n * @returns {Promise}\n */\n // eslint-disable-next-line no-unused-vars\n unload(interaction, itemData, itemIdentifier) {\n // nothing to do actually\n return Promise.resolve();\n }\n };\n }\n };\n\n return extendedText;\n\n});\n\n","define('taoQtiTest/runner/proxy/cache/preloaders/interactions/preloaders',['taoQtiTest/runner/proxy/cache/preloaders/interactions/extendedText'], function (extendedTextPreloader) { 'use strict';\n\n\textendedTextPreloader = extendedTextPreloader && Object.prototype.hasOwnProperty.call(extendedTextPreloader, 'default') ? extendedTextPreloader['default'] : extendedTextPreloader;\n\n\t/*\n\t * This program is free software; you can redistribute it and/or\n\t * modify it under the terms of the GNU General Public License\n\t * as published by the Free Software Foundation; under version 2\n\t * of the License (non-upgradable).\n\t *\n\t * This program is distributed in the hope that it will be useful,\n\t * but WITHOUT ANY WARRANTY; without even the implied warranty of\n\t * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\t * GNU General Public License for more details.\n\t *\n\t * You should have received a copy of the GNU General Public License\n\t * along with this program; if not, write to the Free Software\n\t * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n\t *\n\t * Copyright (c) 2021 Open Assessment Technologies SA\n\t */\n\n\t/**\n\t * The list of asset loader factories\n\t * @type {Function[]}\n\t */\n\tvar preloaders = [extendedTextPreloader];\n\n\treturn preloaders;\n\n});\n\n","define('taoQtiTest/runner/proxy/cache/interactionPreloader',['taoQtiTest/runner/proxy/cache/preloaders/interactions/preloaders', 'taoQtiTest/runner/proxy/cache/preloaderManager'], function (preloaders, preloaderManagerFactory) { 'use strict';\n\n\tpreloaders = preloaders && Object.prototype.hasOwnProperty.call(preloaders, 'default') ? preloaders['default'] : preloaders;\n\tpreloaderManagerFactory = preloaderManagerFactory && Object.prototype.hasOwnProperty.call(preloaderManagerFactory, 'default') ? preloaderManagerFactory['default'] : preloaderManagerFactory;\n\n\t/*\n\t * This program is free software; you can redistribute it and/or\n\t * modify it under the terms of the GNU General Public License\n\t * as published by the Free Software Foundation; under version 2\n\t * of the License (non-upgradable).\n\t *\n\t * This program is distributed in the hope that it will be useful,\n\t * but WITHOUT ANY WARRANTY; without even the implied warranty of\n\t * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\t * GNU General Public License for more details.\n\t *\n\t * You should have received a copy of the GNU General Public License\n\t * along with this program; if not, write to the Free Software\n\t * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n\t *\n\t * Copyright (c) 2021 Open Assessment Technologies SA\n\t */\n\n\t/**\n\t * @callback interactionPreloaderManagerAction\n\t * @param {string} type - The type of asset to preload\n\t * @param {object} interaction - The interaction\n\t * @param {object} itemData - The item data\n\t * @param {string} itemIdentifier - the id of the item the interaction belongs to\n\t */\n\n\t/**\n\t * @callback interactionPreloaderAction\n\t * @param {object} interaction - The interaction\n\t * @param {object} itemData - The item data\n\t * @param {string} itemIdentifier - the id of the item the interaction belongs to\n\t */\n\n\t/**\n\t * @typedef {object} interactionPreloaderManager\n\t * @property {string} name - The name of the preloader\n\t * @property {interactionPreloaderManagerAction} loaded - Tells whether an interaction is loaded or not\n\t * @property {interactionPreloaderManagerAction} load - Preload an interaction\n\t * @property {interactionPreloaderManagerAction} unload - Unload an interaction\n\t */\n\n\t/**\n\t * @typedef {object} interactionPreloader\n\t * @property {string} name - The name of the preloader\n\t * @property {interactionPreloaderAction} loaded - Tells whether an interaction is loaded or not\n\t * @property {interactionPreloaderAction} load - Preload an interaction\n\t * @property {interactionPreloaderAction} unload - Unload an interaction\n\t */\n\n\t/**\n\t * Manages the preloading of assets\n\t * @function assetPreloaderFactory\n\t * @param assetManager - A reference to the assetManager\n\t * @return {assetPreloaderManager}\n\t */\n\tconst interactionPreloaderFactory = preloaderManagerFactory();\n\tpreloaders.forEach(preloader => interactionPreloaderFactory.registerProvider(preloader.name, preloader));\n\n\treturn interactionPreloaderFactory;\n\n});\n\n","define('taoQtiTest/runner/proxy/cache/itemPreloader',['lodash', 'core/logger', 'taoQtiItem/runner/qtiItemRunner', 'taoQtiTest/runner/config/assetManager', 'taoQtiTest/runner/proxy/cache/assetPreloader', 'taoQtiTest/runner/proxy/cache/interactionPreloader', 'util/url'], function (_, loggerFactory, qtiItemRunner, getAssetManager, assetPreloaderFactory, interactionPreloaderFactory, urlUtil) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n loggerFactory = loggerFactory && Object.prototype.hasOwnProperty.call(loggerFactory, 'default') ? loggerFactory['default'] : loggerFactory;\n qtiItemRunner = qtiItemRunner && Object.prototype.hasOwnProperty.call(qtiItemRunner, 'default') ? qtiItemRunner['default'] : qtiItemRunner;\n getAssetManager = getAssetManager && Object.prototype.hasOwnProperty.call(getAssetManager, 'default') ? getAssetManager['default'] : getAssetManager;\n assetPreloaderFactory = assetPreloaderFactory && Object.prototype.hasOwnProperty.call(assetPreloaderFactory, 'default') ? assetPreloaderFactory['default'] : assetPreloaderFactory;\n interactionPreloaderFactory = interactionPreloaderFactory && Object.prototype.hasOwnProperty.call(interactionPreloaderFactory, 'default') ? interactionPreloaderFactory['default'] : interactionPreloaderFactory;\n urlUtil = urlUtil && Object.prototype.hasOwnProperty.call(urlUtil, 'default') ? urlUtil['default'] : urlUtil;\n\n /*\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017-2021 Open Assessment Technologies SA\n */\n\n /**\n * @type {logger}\n * @private\n */\n const logger = loggerFactory('taoQtiTest/runner/proxy/cache/itemPreloader');\n\n /**\n * Check if the given item object matches the expectations\n * @param {object} item\n * @param {string} item.itemIdentifier - the item identifier\n * @param {string} item.baseUrl - item baseUrl\n * @param {object} item.itemData.assets - assets per types : img : ['url1', 'url2' ]\n * @returns {boolean}\n * @private\n */\n const isItemObjectValid = item => {\n return _.isPlainObject(item) && _.isString(item.baseUrl) && _.isString(item.itemIdentifier) && !_.isEmpty(item.itemIdentifier) && _.isPlainObject(item.itemData);\n };\n\n /**\n * Sets a flag onto an item\n * @param {object} item - The item to flag\n * @param {string} flag - The flag name to set\n */\n const setItemFlag = (item, flag) => {\n item.flags = item.flags || {};\n item.flags[flag] = true;\n };\n\n /**\n * Extracts the list of interactions from the item\n * @param {object} itemData\n * @returns {object[]}\n */\n const getItemInteractions = itemData => {\n const interactions = [];\n if (itemData.data && itemData.data.body && itemData.data.body.elements) {\n _.forEach(itemData.data.body.elements, elements => interactions.push(elements));\n }\n return interactions;\n };\n\n /**\n * Create an instance of an item preloader\n * @param {object} options\n * @param {string} options.testId - the unique identifier of the test instance, required to get the asset manager\n * @returns {itemPreloader}\n * @throws {TypeError} if the testId is not defined\n */\n function itemPreloaderFactory(options) {\n //we also have a specific instance of the asset manager to\n //resolve assets of a next item (we can't use the test asset manager).\n const preloadAssetManager = getAssetManager('item-preloader');\n\n /**\n * Resolves assets URLS using the assetManager\n * @param {object} item\n * @param {string} item.itemIdentifier - the item identifier\n * @param {string} item.baseUrl - item baseUrl\n * @param {string} item.itemData.type - type of item\n * @param {object} item.itemData.data - item data\n * @param {object} item.itemData.assets - assets per types : img : ['url1', 'url2' ]\n * @returns {Promise} assets with URLs resolved\n * @private\n */\n const resolveAssets = item => {\n return new Promise(resolve => {\n const {\n assets\n } = item.itemData;\n preloadAssetManager.setData('baseUrl', item.baseUrl);\n preloadAssetManager.setData('assets', assets);\n return resolve(_.reduce(assets, (acc, assetList, type) => {\n const resolved = {};\n _.forEach(assetList, url => {\n //filter base64 (also it seems sometimes we just have base64 data, without the protocol...)\n if (!urlUtil.isBase64(url)) {\n resolved[url] = preloadAssetManager.resolve(url);\n }\n });\n if (_.size(resolved) > 0) {\n acc[type] = resolved;\n }\n return acc;\n }, {}));\n });\n };\n if (!options || !options.testId) {\n throw new TypeError('The test identifier is mandatory to start the item preloader');\n }\n\n //this is the test asset manager, referenced under options.testId\n const testAssetManager = getAssetManager(options.testId);\n\n //mechanisms to preload assets and runtimes\n const assetPreloader = assetPreloaderFactory(testAssetManager);\n const interactionPreloader = interactionPreloaderFactory();\n\n /**\n * Preload the item runner\n * @param {object} item\n * @param {string} item.itemIdentifier - the item identifier\n * @param {string} item.baseUrl - item baseUrl\n * @param {string} item.itemData.type - type of item\n * @param {object} item.itemData.data - item data\n * @param {object} item.itemData.assets - assets per types : img : ['url1', 'url2' ]\n * @returns {Promise}\n * @private\n */\n const itemLoad = item => {\n logger.debug(`Start preloading of item ${item.itemIdentifier}`);\n return new Promise((resolve, reject) => {\n qtiItemRunner(item.itemData.type, item.itemData.data, {\n assetManager: preloadAssetManager,\n preload: true\n }).on('init', () => {\n logger.debug(`Preloading of item ${item.itemIdentifier} done`);\n resolve(true);\n }).on('error', reject).init();\n });\n };\n\n /**\n * Preload the interactions\n * @param {object} item\n * @param {string} item.itemIdentifier - the item identifier\n * @param {object} item.itemData.data - item data\n * @returns {Promise}\n * @private\n */\n const interactionLoad = item => {\n return Promise.all(getItemInteractions(item.itemData).map(interaction => {\n if (interactionPreloader.has(interaction.qtiClass)) {\n logger.debug(`Loading interaction ${interaction.serial}(${interaction.qtiClass}) for item ${item.itemIdentifier}`);\n return interactionPreloader.load(interaction.qtiClass, interaction, item.itemData, item.itemIdentifier);\n }\n return Promise.resolve();\n }));\n };\n\n /**\n * Unload the interactions\n * @param {object} item\n * @param {string} item.itemIdentifier - the item identifier\n * @param {object} item.itemData.data - item data\n * @returns {Promise}\n * @private\n */\n const interactionUnload = item => {\n return Promise.all(getItemInteractions(item.itemData).map(interaction => {\n if (interactionPreloader.has(interaction.qtiClass)) {\n logger.debug(`Unloading interaction ${interaction.serial}(${interaction.qtiClass}) for item ${item.itemIdentifier}`);\n return interactionPreloader.unload(interaction.qtiClass, interaction, item.itemData, item.itemIdentifier);\n }\n return Promise.resolve();\n }));\n };\n\n /**\n * Preload the item assets\n * @param {object} item\n * @param {string} item.itemIdentifier - the item identifier\n * @param {string} item.baseUrl - item baseUrl\n * @param {string} item.itemData.type - type of item\n * @param {object} item.itemData.data - item data\n * @param {object} item.itemData.assets - assets per types : img : ['url1', 'url2' ]\n * @returns {Promise}\n * @private\n */\n const assetLoad = item => {\n return resolveAssets(item).then(resolved => {\n _.forEach(resolved, (assets, type) => {\n if (assetPreloader.has(type)) {\n _.forEach(assets, (url, sourceUrl) => {\n logger.debug(`Loading asset ${sourceUrl}(${type}) for item ${item.itemIdentifier}`);\n assetPreloader.load(type, url, sourceUrl, item.itemIdentifier);\n });\n } else {\n setItemFlag(item, 'containsNonPreloadedAssets');\n }\n });\n return true;\n });\n };\n\n /**\n * Unload the item assets\n * @param {object} item\n * @param {string} item.itemIdentifier - the item identifier\n * @param {string} item.baseUrl - item baseUrl\n * @param {string} item.itemData.type - type of item\n * @param {object} item.itemData.data - item data\n * @param {object} item.itemData.assets - assets per types : img : ['url1', 'url2' ]\n * @returns {Promise}\n * @private\n */\n const assetUnload = item => {\n return resolveAssets(item).then(resolved => {\n _.forEach(resolved, (assets, type) => {\n if (assetPreloader.has(type)) {\n _.forEach(assets, (url, sourceUrl) => {\n logger.debug(`Unloading asset ${sourceUrl}(${type}) for item ${item.itemIdentifier}`);\n assetPreloader.unload(type, url, sourceUrl, item.itemIdentifier);\n });\n }\n });\n return true;\n });\n };\n\n /**\n * @typedef {object} itemPreloader\n */\n return {\n /**\n * Preload the given item (runtime and assets)\n *\n * @param {object} item\n * @param {string} item.itemIdentifier - the item identifier\n * @param {string} item.baseUrl - item baseUrl\n * @param {string} item.itemData.type - type of item\n * @param {object} item.itemData.data - item data\n * @param {object} item.itemData.assets - assets per types : img : ['url1', 'url2' ]\n * @returns {Promise} resolves with true if the item is loaded\n */\n preload(item) {\n const loading = [];\n if (isItemObjectValid(item)) {\n loading.push(itemLoad(item));\n loading.push(interactionLoad(item));\n if (_.size(item.itemData.data && item.itemData.data.feedbacks)) {\n setItemFlag(item, 'hasFeedbacks');\n }\n if (_.size(item.portableElements && item.portableElements.pci)) {\n setItemFlag(item, 'hasPci');\n }\n if (_.size(item.itemData.assets) > 0) {\n loading.push(assetLoad(item));\n }\n }\n return Promise.all(loading).then(results => results.length > 0 && results.every(Boolean));\n },\n /**\n * Unload the assets for the given item\n *\n * @param {object} item\n * @param {string} item.itemIdentifier - the item identifier\n * @param {string} item.baseUrl - item baseUrl\n * @param {string} item.itemData.type - type of item\n * @param {object} item.itemData.data - item data\n * @param {object} item.itemData.assets - assets per types : img : ['url1', 'url2' ]\n * @returns {Promise}\n */\n unload(item) {\n const loading = [];\n if (isItemObjectValid(item)) {\n loading.push(interactionUnload(item));\n if (_.size(item.itemData.assets) > 0) {\n loading.push(assetUnload(item));\n }\n }\n return Promise.all(loading).then(results => results.length > 0 && results.every(Boolean));\n }\n };\n }\n\n return itemPreloaderFactory;\n\n});\n\n","define('taoQtiTest/runner/proxy/cache/itemStore',['lodash', 'core/store', 'taoQtiTest/runner/proxy/cache/itemPreloader'], function (_, store, itemPreloaderFactory) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n store = store && Object.prototype.hasOwnProperty.call(store, 'default') ? store['default'] : store;\n itemPreloaderFactory = itemPreloaderFactory && Object.prototype.hasOwnProperty.call(itemPreloaderFactory, 'default') ? itemPreloaderFactory['default'] : itemPreloaderFactory;\n\n /*\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017-2021 Open Assessment Technologies SA\n */\n\n /**\n * The default number of items to store\n */\n const defaultConfig = {\n itemTTL: 0,\n maxSize: 10,\n preload: false\n };\n\n /**\n * Create an item store\n * @param {object} [options]\n * @param {number} [options.itemTTL = 0] - The TTL for each item in the store, in milliseconds. 0 means no TTL.\n * @param {number} [options.maxSize = 10] - the store limit\n * @param {boolean} [options.preload] - do we preload items when storing them\n * @param {string} [options.testId] - the unique identifier of the test instance, required if preload is true\n *\n * @returns {itemStore}\n */\n function itemStoreFactory(options) {\n const config = _.defaults(options || {}, defaultConfig);\n\n // in memory storage\n const getStore = () => store('item-cache', store.backends.memory);\n\n // maintain an index to resolve existence synchronously\n const index = new Map();\n let lastIndexedPosition = 0;\n\n // check if a key has expired\n const isExpired = key => {\n const meta = index.get(key);\n if (meta) {\n return config.itemTTL && Date.now() - meta.timestamp >= config.itemTTL;\n }\n return false;\n };\n\n // retrieve the first item by position from the index\n const findFirstIndexedItem = () => {\n let first = null;\n let lowest = Number.POSITIVE_INFINITY;\n index.forEach((item, key) => {\n if (item.position < lowest) {\n lowest = item.position;\n first = key;\n }\n });\n return first;\n };\n\n // retrieve all expired items from the index\n const findExpiredItems = () => {\n const expired = [];\n index.forEach((item, key) => {\n if (isExpired(key)) {\n expired.push(key);\n }\n });\n return expired;\n };\n let itemPreloader;\n if (config.preload) {\n itemPreloader = itemPreloaderFactory(_.pick(config, ['testId']));\n }\n\n /**\n * @typedef itemStore\n */\n return {\n /**\n * Setter to override the cache size\n *\n * @param {number} cacheSize\n */\n setCacheSize(cacheSize) {\n config.maxSize = cacheSize;\n },\n /**\n * Sets the item store TTL.\n * @param {number} ttl\n */\n setItemTTL(ttl) {\n config.itemTTL = ttl;\n },\n /**\n * Get the item form the given key/id/uri\n * @param {string} key - something identifier\n * @returns {Promise} the item\n */\n get(key) {\n if (!this.has(key)) {\n return Promise.resolve();\n }\n return getStore().then(itemStorage => itemStorage.getItem(key));\n },\n /**\n * Check whether the given item is in the store\n * @param {string} key - something identifier\n * @returns {boolean}\n */\n has(key) {\n return index.has(key) && !isExpired(key);\n },\n /**\n * Add/Set an item into the store, under the given key\n * @param {string} key - something identifier\n * @param {object} item - the item\n * @returns {Promise} chains\n */\n set(key, item) {\n return getStore().then(itemStorage => {\n return itemStorage.setItem(key, item).then(updated => {\n if (updated) {\n if (!index.has(key)) {\n index.set(key, {\n position: lastIndexedPosition++,\n timestamp: Date.now()\n });\n }\n if (config.preload) {\n _.defer(() => itemPreloader.preload(item));\n }\n }\n\n //do we reach the limit ? then remove one\n if (index.size > 1 && index.size > config.maxSize) {\n return this.remove(findFirstIndexedItem()).then(removed => updated && removed);\n }\n return updated;\n });\n });\n },\n /**\n * Update some data of a store item\n * @param {string} key - something identifier\n * @param {string} updateKey - key to update\n * @param {*} updateValue - new data for the updateKey\n * @returns {Promise} resolves with the update status\n */\n update(key, updateKey, updateValue) {\n if (index.has(key) && _.isString(updateKey)) {\n return getStore().then(itemStorage => {\n return itemStorage.getItem(key).then(itemData => {\n if (_.isPlainObject(itemData)) {\n itemData[updateKey] = updateValue;\n return itemStorage.setItem(key, itemData);\n }\n });\n });\n }\n return Promise.resolve(false);\n },\n /**\n * Remove the item from the store\n * @param {string} key - something identifier\n * @returns {Promise} resolves once removed\n */\n remove(key) {\n if (index.has(key)) {\n return getStore().then(itemStorage => {\n index.delete(key);\n return itemStorage.getItem(key).then(item => {\n if (config.preload) {\n _.defer(() => itemPreloader.unload(item));\n }\n }).then(() => itemStorage.removeItem(key));\n });\n }\n return Promise.resolve(false);\n },\n /**\n * Prune the store from expired content.\n * @returns {Promise}\n */\n prune() {\n return Promise.all(findExpiredItems().map(this.remove));\n },\n /**\n * Clear the store\n * @returns {Promise}\n */\n clear() {\n return getStore().then(itemStorage => {\n index.clear();\n return itemStorage.clear();\n });\n }\n };\n }\n\n return itemStoreFactory;\n\n});\n\n","define('taoQtiTest/runner/proxy/qtiServiceProxy',['lodash', 'core/promiseQueue', 'core/communicator', 'taoQtiTest/runner/config/qtiServiceConfig', 'core/request'], function (_, promiseQueue, communicatorFactory, configFactory, coreRequest) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n promiseQueue = promiseQueue && Object.prototype.hasOwnProperty.call(promiseQueue, 'default') ? promiseQueue['default'] : promiseQueue;\n communicatorFactory = communicatorFactory && Object.prototype.hasOwnProperty.call(communicatorFactory, 'default') ? communicatorFactory['default'] : communicatorFactory;\n configFactory = configFactory && Object.prototype.hasOwnProperty.call(configFactory, 'default') ? configFactory['default'] : configFactory;\n coreRequest = coreRequest && Object.prototype.hasOwnProperty.call(coreRequest, 'default') ? coreRequest['default'] : coreRequest;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * QTI proxy definition\n * Related to remote services calls\n * @type {Object}\n */\n var qtiServiceProxy = {\n name: 'qtiServiceProxy',\n /**\n * Installs the proxy\n */\n install: function install() {\n var self = this;\n\n /**\n * A promise queue to ensure requests run sequentially\n */\n this.queue = promiseQueue();\n\n /**\n * Some parameters needs special handling...\n * @param {Object} actionParams - the input parameters\n * @returns {Object} output parameters\n */\n this.prepareParams = function prepareParams(actionParams) {\n //some parameters need to be JSON.stringified\n var stringifyParams = ['itemState', 'itemResponse', 'toolStates'];\n if (_.isPlainObject(actionParams)) {\n return _.mapValues(actionParams, function (value, key) {\n if (stringifyParams.includes(key)) {\n return JSON.stringify(value);\n }\n return value;\n });\n }\n return actionParams;\n };\n\n /**\n * Proxy request function. Returns a promise\n * Applied options: asynchronous call, JSON data, no cache\n * @param {String} url\n * @param {Object} [reqParams]\n * @param {String} [contentType] - to force the content type\n * @param {Boolean} [noToken] - to disable the token\n * @returns {Promise}\n */\n this.request = function request(url, reqParams, contentType, noToken) {\n return coreRequest({\n url: url,\n data: self.prepareParams(reqParams),\n method: reqParams ? 'POST' : 'GET',\n contentType: contentType,\n noToken: noToken,\n background: false,\n sequential: true,\n timeout: self.configStorage.getTimeout()\n }).then(function (response) {\n self.setOnline();\n if (response && response.success) {\n return Promise.resolve(response);\n } else {\n return Promise.reject(response);\n }\n }).catch(function (error) {\n if (self.isConnectivityError(error)) {\n self.setOffline('request');\n }\n return Promise.reject(error);\n });\n };\n },\n /**\n * Initializes the proxy\n * @param {Object} config - The config provided to the proxy factory\n * @param {String} config.testDefinition - The URI of the test\n * @param {String} config.testCompilation - The URI of the compiled delivery\n * @param {String} config.serviceCallId - The URI of the service call\n * @param {Object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The proxy will be fully initialized on resolve.\n * Any error will be provided if rejected.\n */\n init: function init(config, params) {\n // store config in a dedicated configStorage\n this.configStorage = configFactory(config || {});\n\n // request for initialization\n return this.request(this.configStorage.getTestActionUrl('init'), params);\n },\n /**\n * Uninstalls the proxy\n * @returns {Promise} - Returns a promise. The proxy will be fully uninstalled on resolve.\n * Any error will be provided if rejected.\n */\n destroy: function destroy() {\n // no request, just a resources cleaning\n this.configStorage = null;\n this.queue = null;\n\n // the method must return a promise\n return Promise.resolve();\n },\n /**\n * Gets the test definition data\n * @returns {Promise} - Returns a promise. The test definition data will be provided on resolve.\n * Any error will be provided if rejected.\n */\n getTestData: function getTestData() {\n return this.request(this.configStorage.getTestActionUrl('getTestData'));\n },\n /**\n * Gets the test context\n * @returns {Promise} - Returns a promise. The context object will be provided on resolve.\n * Any error will be provided if rejected.\n */\n getTestContext: function getTestContext() {\n return this.request(this.configStorage.getTestActionUrl('getTestContext'));\n },\n /**\n * Gets the test map\n * @returns {Promise} - Returns a promise. The test map object will be provided on resolve.\n * Any error will be provided if rejected.\n */\n getTestMap: function getTestMap() {\n return this.request(this.configStorage.getTestActionUrl('getTestMap'));\n },\n /**\n * Sends the test variables\n * @param {Object} variables\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n * @fires sendVariables\n */\n sendVariables: function sendVariables(variables) {\n return this.request(this.configStorage.getTestActionUrl('storeTraceData'), {\n traceData: JSON.stringify(variables)\n });\n },\n /**\n * Calls an action related to the test\n * @param {String} action - The name of the action to call\n * @param {Object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n */\n callTestAction: function callTestAction(action, params) {\n return this.request(this.configStorage.getTestActionUrl(action), params);\n },\n /**\n * Gets an item definition by its identifier, also gets its current state\n * @param {String} itemIdentifier - The identifier of the item to get\n * @param {Object} [params] - additional parameters\n * @returns {Promise} - Returns a promise. The item data will be provided on resolve.\n * Any error will be provided if rejected.\n */\n getItem: function getItem(itemIdentifier, params) {\n return this.request(this.configStorage.getItemActionUrl(itemIdentifier, 'getItem'), params, void 0, true);\n },\n /**\n * Submits the state and the response of a particular item\n * @param {String} itemIdentifier - The identifier of the item to update\n * @param {Object} state - The state to submit\n * @param {Object} response - The response object to submit\n * @param {Object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n */\n submitItem: function submitItem(itemIdentifier, state, response, params) {\n var body = _.merge({\n itemState: state,\n itemResponse: response\n }, params || {});\n return this.request(this.configStorage.getItemActionUrl(itemIdentifier, 'submitItem'), body);\n },\n /**\n * Calls an action related to a particular item\n * @param {String} itemIdentifier - The identifier of the item for which call the action\n * @param {String} action - The name of the action to call\n * @param {Object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n */\n callItemAction: function callItemAction(itemIdentifier, action, params) {\n return this.request(this.configStorage.getItemActionUrl(itemIdentifier, action), params);\n },\n /**\n * Sends a telemetry signal\n * @param {String} itemIdentifier - The identifier of the item for which sends the telemetry signal\n * @param {String} signal - The name of the signal to send\n * @param {Object} [params] - Some optional parameters to join to the signal\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n * @fires telemetry\n */\n telemetry: function telemetry(itemIdentifier, signal, params) {\n return this.request(this.configStorage.getTelemetryUrl(itemIdentifier, signal), params, null, true);\n },\n /**\n * Builds the communication channel\n * @returns {communicator|null} the communication channel\n */\n loadCommunicator: function loadCommunicator() {\n var config = this.configStorage.getCommunicationConfig();\n if (config.enabled) {\n return communicatorFactory(config.type, config.params);\n }\n return null;\n }\n };\n\n return qtiServiceProxy;\n\n});\n\n","define('taoQtiTest/runner/proxy/cache/proxy',['lodash', 'taoQtiTest/runner/navigator/navigator', 'taoQtiTest/runner/helpers/map', 'taoQtiTest/runner/helpers/navigation', 'taoQtiTest/runner/provider/dataUpdater', 'taoQtiTest/runner/proxy/qtiServiceProxy', 'taoQtiTest/runner/proxy/cache/itemStore', 'taoQtiTest/runner/proxy/cache/actionStore', 'taoQtiTest/runner/helpers/offlineErrorHelper'], function (_, testNavigatorFactory, mapHelper, navigationHelper, dataUpdater, qtiServiceProxy, itemStoreFactory, actionStoreFactory, offlineErrorHelper) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n testNavigatorFactory = testNavigatorFactory && Object.prototype.hasOwnProperty.call(testNavigatorFactory, 'default') ? testNavigatorFactory['default'] : testNavigatorFactory;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n navigationHelper = navigationHelper && Object.prototype.hasOwnProperty.call(navigationHelper, 'default') ? navigationHelper['default'] : navigationHelper;\n dataUpdater = dataUpdater && Object.prototype.hasOwnProperty.call(dataUpdater, 'default') ? dataUpdater['default'] : dataUpdater;\n qtiServiceProxy = qtiServiceProxy && Object.prototype.hasOwnProperty.call(qtiServiceProxy, 'default') ? qtiServiceProxy['default'] : qtiServiceProxy;\n itemStoreFactory = itemStoreFactory && Object.prototype.hasOwnProperty.call(itemStoreFactory, 'default') ? itemStoreFactory['default'] : itemStoreFactory;\n actionStoreFactory = actionStoreFactory && Object.prototype.hasOwnProperty.call(actionStoreFactory, 'default') ? actionStoreFactory['default'] : actionStoreFactory;\n offlineErrorHelper = offlineErrorHelper && Object.prototype.hasOwnProperty.call(offlineErrorHelper, 'default') ? offlineErrorHelper['default'] : offlineErrorHelper;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017-2021 Open Assessment Technologies SA\n */\n\n /**\n * The number of items to keep in the cache\n * @type {number}\n * @private\n */\n const cacheSize = 20;\n\n /**\n * The number of ms to wait after an item is loaded\n * to start loading the next.\n * This value is more or less the time needed to render an item.\n * @type {number}\n * @private\n */\n const loadNextDelay = 450;\n\n /**\n * The default TimeToLive for assets resolving, in seconds.\n * Each item comes with a baseUrl that may have a TTL bound to it.\n * Once this TTL is expired, the assets won't be reachable.\n * For this reason, we need to remove from the cache items having an expired TTL.\n * @type {number}\n * @private\n */\n const defaultItemTTL = 15 * 60;\n\n /**\n * Overrides the qtiServiceProxy with the precaching behavior\n * @extends taoQtiTest/runner/proxy/qtiServiceProxy\n */\n var proxy = _.defaults({\n name: 'precaching',\n /**\n * Installs the proxy\n * @param {object} config\n */\n install(config) {\n //install the parent proxy\n qtiServiceProxy.install.call(this);\n\n /**\n * Gets the value of an item caching option. All values are numeric only.\n * @param {string} name\n * @param {number} defaultValue\n * @returns {number}\n */\n const getItemCachingOption = (name, defaultValue) => {\n if (config && config.options && config.options.itemCaching) {\n return parseInt(config.options.itemCaching[name], 10) || defaultValue;\n }\n return defaultValue;\n };\n\n //we keep items here\n this.itemStore = itemStoreFactory({\n itemTTL: defaultItemTTL * 1000,\n maxSize: cacheSize,\n preload: true,\n testId: config.serviceCallId\n });\n\n //where we keep actions\n this.actiontStore = null;\n\n //can we load the next item from the cache/store ?\n this.getItemFromStore = false;\n\n //configuration params, that comes on every request/params\n this.requestConfig = {};\n\n //scheduled action promises which supposed to be resolved after action synchronization.\n this.actionPromises = {};\n\n //scheduled action reject promises which supposed to be rejected in case of failed synchronization.\n this.actionRejectPromises = {};\n\n //let's you update test data (testContext and testMap)\n this.dataUpdater = dataUpdater(this.getDataHolder());\n\n /**\n * Get the item cache size from the test data\n * @returns {number} the cache size\n */\n this.getCacheAmount = () => getItemCachingOption('amount', 1);\n\n /**\n * Get the item store TimeToLive\n * @returns {number} the item store TTL\n */\n this.getItemTTL = () => getItemCachingOption('itemStoreTTL', defaultItemTTL) * 1000;\n\n /**\n * Check whether we have the item in the store\n * @param {string} itemIdentifier - the item identifier\n * @returns {boolean}\n */\n this.hasItem = itemIdentifier => itemIdentifier && this.itemStore.has(itemIdentifier);\n\n /**\n * Check whether we have the next item in the store\n * @param {string} itemIdentifier - the CURRENT item identifier\n * @returns {boolean}\n */\n this.hasNextItem = itemIdentifier => {\n const sibling = navigationHelper.getNextItem(this.getDataHolder().get('testMap'), itemIdentifier);\n return sibling && this.hasItem(sibling.id);\n };\n\n /**\n * Check whether we have the previous item in the store\n * @param {string} itemIdentifier - the CURRENT item identifier\n * @returns {boolean}\n */\n this.hasPreviousItem = itemIdentifier => {\n const sibling = navigationHelper.getPreviousItem(this.getDataHolder().get('testMap'), itemIdentifier);\n return sibling && this.hasItem(sibling.id);\n };\n\n /**\n * Offline ? We try to navigate offline, or just say 'ok'\n *\n * @param {string} action - the action name (ie. move, skip, timeout)\n * @param {object} actionParams - the parameters sent along the action\n * @returns {object} action result\n */\n this.offlineAction = (action, actionParams) => {\n const result = {\n success: true\n };\n const blockingActions = ['exitTest', 'timeout'];\n const testContext = this.getDataHolder().get('testContext');\n const testMap = this.getDataHolder().get('testMap');\n if (action === 'pause') {\n throw offlineErrorHelper.buildErrorFromContext(offlineErrorHelper.getOfflinePauseError(), {\n reason: actionParams.reason\n });\n }\n\n //we just block those actions and the end of the test\n if (blockingActions.includes(action) || actionParams.direction === 'next' && navigationHelper.isLast(testMap, testContext.itemIdentifier)) {\n throw offlineErrorHelper.buildErrorFromContext(offlineErrorHelper.getOfflineExitError());\n }\n\n // try the navigation if the actionParams context meaningful data\n if (actionParams.direction && actionParams.scope) {\n const testNavigator = testNavigatorFactory(testContext, testMap);\n const newTestContext = testNavigator.navigate(actionParams.direction, actionParams.scope, actionParams.ref);\n\n //we are really not able to navigate\n if (!newTestContext || !newTestContext.itemIdentifier || !this.hasItem(newTestContext.itemIdentifier)) {\n throw offlineErrorHelper.buildErrorFromContext(offlineErrorHelper.getOfflineNavError());\n }\n result.testContext = newTestContext;\n }\n this.markActionAsOffline(actionParams);\n return result;\n };\n\n /**\n * Process action which should be sent using message channel.\n *\n * @param {string} action\n * @param {object} actionParams\n * @param {boolean} deferred\n *\n * @returns {Promise} resolves with the action result\n */\n this.processSyncAction = (action, actionParams, deferred) => {\n return new Promise((resolve, reject) => {\n this.scheduleAction(action, actionParams).then(actionData => {\n this.actionPromises[actionData.params.actionId] = resolve;\n this.actionRejectPromises[actionData.params.actionId] = reject;\n if (!deferred) {\n this.syncData().then(result => {\n if (this.isOnline()) {\n _.forEach(result, actionResult => {\n const actionId = actionResult.requestParameters && actionResult.requestParameters.actionId ? actionResult.requestParameters.actionId : null;\n if (!actionResult.success && this.actionRejectPromises[actionId]) {\n const error = new Error(actionResult.message);\n error.unrecoverable = true;\n return reject(error);\n }\n if (actionId && this.actionPromises[actionId]) {\n this.actionPromises[actionId](actionResult);\n }\n });\n }\n }).catch(reject);\n }\n }).catch(reject);\n });\n };\n\n /**\n * Schedule an action do be done with next call\n *\n * @param {string} action - the action name (ie. move, skip, timeout)\n * @param {object} params - the parameters sent along the action\n * @returns {Promise} resolves with the action data\n */\n this.scheduleAction = (action, params) => {\n params.actionId = `${action}_${new Date().getTime()}`;\n return this.actiontStore.push(action, this.prepareParams(_.defaults(params || {}, this.requestConfig))).then(() => ({\n action,\n params\n }));\n };\n\n /**\n * Request/Offline strategy :\n *\n * ├─ Online\n * │ └─ run the request\n * │ ├─ request ok\n * │ └─ request fails\n * │ └─ run the offline action\n * └── Offline\n * └─ send a telemetry request (connection could be back)\n * ├─ request ok\n * │ └─ sync data\n * │ └─ run the request (back to the tree root)\n * └─ request fails\n * └─ run the offline action\n *\n * @param {string} url\n * @param {string} action - the action name (ie. move, skip, timeout)\n * @param {object} actionParams - the parameters sent along the action\n * @param {boolean} deferred whether action can be scheduled (put into queue) to be sent in a bunch of actions later.\n * @param {boolean} noToken whether the request should be sent with a CSRF token or not\n *\n * @returns {Promise} resolves with the action result\n */\n this.requestNetworkThenOffline = (url, action, actionParams, deferred, noToken) => {\n const testContext = this.getDataHolder().get('testContext');\n const communicationConfig = this.configStorage.getCommunicationConfig();\n\n //perform the request, but fallback on offline if the request itself fails\n const runRequestThenOffline = () => {\n let request;\n if (communicationConfig.syncActions && communicationConfig.syncActions.indexOf(action) >= 0) {\n request = this.processSyncAction(action, actionParams, deferred);\n } else {\n //action is not synchronizable\n //fallback to direct request\n request = this.request(url, actionParams, void 0, noToken || false);\n request.then(result => {\n if (this.isOffline()) {\n return this.scheduleAction(action, actionParams);\n }\n return result;\n });\n }\n return request.then(result => {\n if (this.isOffline()) {\n return this.offlineAction(action, actionParams);\n }\n return result;\n }).catch(error => {\n if (this.isConnectivityError(error) && this.isOffline()) {\n return this.offlineAction(action, actionParams);\n }\n throw error;\n });\n };\n if (this.isOffline()) {\n //try the telemetry action, just in case\n return this.telemetry(testContext.itemIdentifier, 'up').then(() => {\n //if the up request succeed, we run the request\n if (this.isOnline()) {\n return runRequestThenOffline();\n }\n return this.scheduleAction(action, actionParams).then(() => {\n return this.offlineAction(action, actionParams);\n });\n }).catch(err => {\n if (this.isConnectivityError(err)) {\n return this.scheduleAction(action, actionParams).then(() => {\n return this.offlineAction(action, actionParams);\n });\n }\n throw err;\n });\n }\n\n //by default we try to run the request first\n return runRequestThenOffline();\n };\n\n /**\n * Flush and synchronize actions collected while offline\n * @returns {Promise} resolves with the action result\n */\n this.syncData = () => {\n let actions;\n return this.queue.serie(() => {\n return this.actiontStore.flush().then(data => {\n actions = data;\n if (data && data.length) {\n return this.send('sync', data);\n }\n }).catch(err => {\n if (this.isConnectivityError(err)) {\n this.setOffline('communicator');\n _.forEach(actions, action => {\n this.actiontStore.push(action.action, action.parameters);\n });\n }\n throw err;\n });\n });\n };\n\n /**\n * Flush the offline actions from the actionStore before reinserting them.\n * The exported copy can be used for file download.\n * The retained copy can still be synced as the test progresses.\n *\n * @returns {Promise} resolves with the store contents\n */\n this.exportActions = () => {\n return this.queue.serie(() => {\n return this.actiontStore.flush().then(data => {\n _.forEach(data, action => {\n this.actiontStore.push(action.action, action.parameters);\n });\n return data;\n });\n });\n };\n\n /**\n * Mark action as performed in offline mode\n * Action to mark as offline will be defined by actionParams.actionId parameter value.\n *\n * @param {object} actionParams - the action parameters\n * @returns {Promise}\n */\n this.markActionAsOffline = actionParams => {\n actionParams.offline = true;\n return this.queue.serie(() => {\n return this.actiontStore.update(this.prepareParams(_.defaults(actionParams || {}, this.requestConfig)));\n });\n };\n },\n /**\n * Initializes the proxy\n * @param {object} config - The config provided to the proxy factory\n * @param {string} config.testDefinition - The URI of the test\n * @param {string} config.testCompilation - The URI of the compiled delivery\n * @param {string} config.serviceCallId - The URI of the service call\n * @param {object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The proxy will be fully initialized on resolve.\n * Any error will be provided if rejected.\n */\n init(config, params) {\n if (!this.getDataHolder()) {\n throw new Error('Unable to retrieve test runners data holder');\n }\n\n //those needs to be in each request params.\n this.requestConfig = _.pick(config, ['testDefinition', 'testCompilation', 'serviceCallId']);\n\n //set up the action store for the current service call\n this.actiontStore = actionStoreFactory(config.serviceCallId);\n\n //we resynchronise as soon as the connection is back\n this.on('reconnect', function () {\n return this.syncData().then(responses => {\n this.dataUpdater.update(responses);\n }).catch(err => {\n this.trigger('error', err);\n });\n });\n\n //if some actions remains not synchronized\n this.syncData();\n\n //run the init\n return qtiServiceProxy.init.call(this, config, params);\n },\n /**\n * Uninstalls the proxy\n * @returns {Promise} - Returns a promise. The proxy will be fully uninstalled on resolve.\n * Any error will be provided if rejected.\n */\n destroy() {\n this.itemStore.clear();\n this.getItemFromStore = false;\n return qtiServiceProxy.destroy.call(this);\n },\n /**\n * Gets an item definition by its identifier, also gets its current state\n * @param {string} itemIdentifier - The identifier of the item to get\n * @param {object} [params] - additional parameters\n * @returns {Promise} - Returns a promise. The item data will be provided on resolve.\n * Any error will be provided if rejected.\n */\n getItem(itemIdentifier, params) {\n // remove the expired entries from the cache\n // prune anyway, if an issue occurs it should not prevent the remaining process to happen\n const pruneStore = () => this.itemStore.prune().catch(_.noop);\n\n /**\n * try to load the next items\n */\n const loadNextItem = () => {\n const testMap = this.getDataHolder().get('testMap');\n const siblings = navigationHelper.getSiblingItems(testMap, itemIdentifier, 'both', this.getCacheAmount());\n const missing = _.reduce(siblings, (list, sibling) => {\n if (!this.hasItem(sibling.id)) {\n list.push(sibling.id);\n }\n return list;\n }, []);\n\n //don't run a request if not needed\n if (this.isOnline() && missing.length) {\n _.delay(() => {\n this.requestNetworkThenOffline(this.configStorage.getTestActionUrl('getNextItemData'), 'getNextItemData', {\n itemDefinition: missing\n }, false, true).then(response => {\n if (response && response.items) {\n return pruneStore().then(() => {\n _.forEach(response.items, item => {\n if (item && item.itemIdentifier) {\n //store the response and start caching assets\n this.itemStore.set(item.itemIdentifier, item);\n }\n });\n });\n }\n }).catch(_.noop);\n }, loadNextDelay);\n }\n };\n\n // the additional proxy options are supplied after the 'init' phase as a result of the `init` action,\n // we need to apply them later\n this.itemStore.setItemTTL(this.getItemTTL());\n\n //resolve from the store\n if (this.getItemFromStore && this.itemStore.has(itemIdentifier)) {\n loadNextItem();\n return this.itemStore.get(itemIdentifier);\n }\n return this.request(this.configStorage.getItemActionUrl(itemIdentifier, 'getItem'), params, void 0, true).then(response => {\n if (response && response.success) {\n pruneStore().then(() => this.itemStore.set(itemIdentifier, response));\n }\n loadNextItem();\n return response;\n });\n },\n /**\n * Submits the state and the response of a particular item\n * @param {string} itemIdentifier - The identifier of the item to update\n * @param {object} state - The state to submit\n * @param {object} response - The response object to submit\n * @param {object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n */\n submitItem(itemIdentifier, state, response, params) {\n return this.itemStore.update(itemIdentifier, 'itemState', state).then(() => {\n return qtiServiceProxy.submitItem.call(this, itemIdentifier, state, response, params);\n });\n },\n /**\n * Sends the test variables\n * @param {object} variables\n * @param {boolean} deferred whether action can be scheduled (put into queue) to be sent in a bunch of actions later.\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n * @fires sendVariables\n */\n sendVariables(variables, deferred) {\n const action = 'storeTraceData';\n const actionParams = {\n traceData: JSON.stringify(variables)\n };\n return this.requestNetworkThenOffline(this.configStorage.getTestActionUrl(action), action, actionParams, deferred);\n },\n /**\n * Calls an action related to the test\n * @param {string} action - The name of the action to call\n * @param {object} [params] - Some optional parameters to join to the call\n * @param {boolean} deferred whether action can be scheduled (put into queue) to be sent in a bunch of actions later.\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n */\n callTestAction(action, params, deferred) {\n return this.requestNetworkThenOffline(this.configStorage.getTestActionUrl(action), action, params, deferred);\n },\n /**\n * Calls an action related to a particular item\n * @param {string} itemIdentifier - The identifier of the item for which call the action\n * @param {string} action - The name of the action to call\n * @param {object} [params] - Some optional parameters to join to the call\n * @param {boolean} deferred whether action can be scheduled (put into queue) to be sent in a bunch of actions later.\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n */\n callItemAction(itemIdentifier, action, params, deferred) {\n let updateStatePromise = Promise.resolve();\n const testMap = this.getDataHolder().get('testMap');\n\n //update the item state\n if (params.itemState) {\n updateStatePromise = this.itemStore.update(itemIdentifier, 'itemState', params.itemState);\n }\n\n //check if we have already the item for the action we are going to perform\n this.getItemFromStore = navigationHelper.isMovingToNextItem(action, params) && this.hasNextItem(itemIdentifier) || navigationHelper.isMovingToPreviousItem(action, params) && this.hasPreviousItem(itemIdentifier) || navigationHelper.isJumpingToItem(action, params) && this.hasItem(mapHelper.getItemIdentifier(testMap, params.ref));\n\n //If item action is move to another item ensure the next request will start the timer\n if (navigationHelper.isMovingToNextItem(action, params) || navigationHelper.isMovingToPreviousItem(action, params) || navigationHelper.isJumpingToItem(action, params)) {\n params.start = true;\n }\n return updateStatePromise.then(() => {\n return this.requestNetworkThenOffline(this.configStorage.getItemActionUrl(itemIdentifier, action), action, _.merge({\n itemDefinition: itemIdentifier\n }, params), deferred);\n });\n }\n }, qtiServiceProxy);\n\n return proxy;\n\n});\n\n","define('taoQtiTest/runner/proxy/loader',['lodash', 'module', 'taoTests/runner/proxy'], function (_, module, proxy) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n module = module && Object.prototype.hasOwnProperty.call(module, 'default') ? module['default'] : module;\n proxy = proxy && Object.prototype.hasOwnProperty.call(proxy, 'default') ? proxy['default'] : proxy;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017-2019 Open Assessment Technologies SA ;\n */\n\n /**\n * The configuration of the provider to use with it's AMD module\n */\n var config = _.defaults(module.config(), {\n providerName: 'qtiServiceProxy',\n module: 'taoQtiTest/runner/proxy/qtiServiceProxy'\n });\n\n /**\n * Load and register the configured providers\n * @returns {Promise} resolves with the regsitered provider name\n */\n function load() {\n return new Promise(function (resolve, reject) {\n require([config.module], function (proxyProvider) {\n proxy.registerProvider(config.providerName, proxyProvider);\n resolve(config.providerName);\n }, reject);\n });\n }\n\n return load;\n\n});\n\n","define('taoQtiTest/runner/services/responseStore',['lodash', 'core/store'], function (_, store) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n store = store && Object.prototype.hasOwnProperty.call(store, 'default') ? store['default'] : store;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n var defaultConfig = {\n responseStoreName: 'response',\n correctResponseStoreName: 'correct-response'\n };\n\n /**\n * @param {Object} options\n * @param {string} options.responseStoreName\n * @param {string} options.correctResponseStoreName\n */\n function responseStoreFactory(options) {\n var config = _.defaults(options || {}, defaultConfig);\n\n /**\n * @returns {Promise}\n */\n var getResponseStore = function getResponseStore() {\n return store(config.responseStoreName, store.backends.memory);\n };\n\n /**\n * @returns {Promise}\n */\n var getCorrectResponseStore = function getCorrectResponseStore() {\n return store(config.correctResponseStoreName, store.backends.memory);\n };\n return {\n /**\n * @returns {Promise}\n */\n getResponses: function getResponses() {\n return getResponseStore().then(function (storage) {\n return storage.getItems();\n });\n },\n /**\n * @returns {Promise}\n */\n getCorrectResponses: function getCorrectResponses() {\n return getCorrectResponseStore().then(function (storage) {\n return storage.getItems();\n });\n },\n /**\n * @param {string} key\n * @returns {Promise}\n */\n getResponse: function getResponse(key) {\n return getResponseStore().then(function (storage) {\n return storage.getItem(key);\n });\n },\n /**\n * @param {string} key\n * @returns {Promise}\n */\n getCorrectResponse: function getCorrectResponse(key) {\n return getCorrectResponseStore().then(function (storage) {\n return storage.getItem(key).then(function (result) {\n return new Promise(function (resolve) {\n if (typeof result === 'undefined') {\n return resolve([]);\n }\n return resolve(result);\n });\n });\n });\n },\n /**\n * @param {string} key\n * @param {string} value\n * @returns {Promise}\n */\n addResponse: function addResponse(key, value) {\n return getResponseStore().then(function (storage) {\n return storage.setItem(key, value).then(function (updated) {\n return updated;\n });\n });\n },\n /**\n * @param {string} key\n * @param {string[]} value\n * @returns {Promise}\n */\n addCorrectResponse: function addCorrectResponse(key, value) {\n return getCorrectResponseStore().then(function (storage) {\n return storage.setItem(key, value).then(function (updated) {\n return updated;\n });\n });\n },\n /**\n * @returns {Promise}\n */\n clearResponses: function clearResponses() {\n return getResponseStore().then(function (storage) {\n return storage.clear();\n });\n },\n /**\n * @returns {Promise}\n */\n clearCorrectResponses: function clearCorrectResponses() {\n return getCorrectResponseStore().then(function (storage) {\n return storage.clear();\n });\n }\n };\n }\n\n return responseStoreFactory;\n\n});\n\n","define('taoQtiTest/runner/proxy/offline/proxy',['lodash', 'taoQtiTest/runner/navigator/offlineNavigator', 'taoQtiTest/runner/helpers/navigation', 'taoQtiTest/runner/provider/dataUpdater', 'taoQtiTest/runner/proxy/qtiServiceProxy', 'taoQtiTest/runner/proxy/cache/itemStore', 'taoQtiTest/runner/proxy/cache/actionStore', 'taoQtiTest/runner/helpers/offlineErrorHelper', 'taoQtiTest/runner/helpers/offlineSyncModal', 'taoQtiTest/runner/services/responseStore', 'util/download', 'taoQtiTest/runner/config/states'], function (_, offlineNavigatorFactory, navigationHelper, dataUpdater, qtiServiceProxy, itemStoreFactory, actionStoreFactory, offlineErrorHelper, offlineSyncModal, responseStoreFactory, download, states) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n offlineNavigatorFactory = offlineNavigatorFactory && Object.prototype.hasOwnProperty.call(offlineNavigatorFactory, 'default') ? offlineNavigatorFactory['default'] : offlineNavigatorFactory;\n navigationHelper = navigationHelper && Object.prototype.hasOwnProperty.call(navigationHelper, 'default') ? navigationHelper['default'] : navigationHelper;\n dataUpdater = dataUpdater && Object.prototype.hasOwnProperty.call(dataUpdater, 'default') ? dataUpdater['default'] : dataUpdater;\n qtiServiceProxy = qtiServiceProxy && Object.prototype.hasOwnProperty.call(qtiServiceProxy, 'default') ? qtiServiceProxy['default'] : qtiServiceProxy;\n itemStoreFactory = itemStoreFactory && Object.prototype.hasOwnProperty.call(itemStoreFactory, 'default') ? itemStoreFactory['default'] : itemStoreFactory;\n actionStoreFactory = actionStoreFactory && Object.prototype.hasOwnProperty.call(actionStoreFactory, 'default') ? actionStoreFactory['default'] : actionStoreFactory;\n offlineErrorHelper = offlineErrorHelper && Object.prototype.hasOwnProperty.call(offlineErrorHelper, 'default') ? offlineErrorHelper['default'] : offlineErrorHelper;\n offlineSyncModal = offlineSyncModal && Object.prototype.hasOwnProperty.call(offlineSyncModal, 'default') ? offlineSyncModal['default'] : offlineSyncModal;\n responseStoreFactory = responseStoreFactory && Object.prototype.hasOwnProperty.call(responseStoreFactory, 'default') ? responseStoreFactory['default'] : responseStoreFactory;\n download = download && Object.prototype.hasOwnProperty.call(download, 'default') ? download['default'] : download;\n states = states && Object.prototype.hasOwnProperty.call(states, 'default') ? states['default'] : states;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Overrides the qtiServiceProxy with the offline behavior\n * @extends taoQtiTest/runner/proxy/qtiServiceProxy\n */\n var proxy = _.defaults({\n name: 'offline',\n /**\n * Installs the proxy\n * @param {object} config\n */\n install: function install(config) {\n var self = this;\n const maxSyncAttempts = 3;\n\n // install the parent proxy\n qtiServiceProxy.install.call(this);\n\n // we keep items here\n this.itemStore = itemStoreFactory({\n preload: true,\n testId: config.serviceCallId\n });\n this.responseStore = responseStoreFactory();\n this.offlineNavigator = offlineNavigatorFactory(this.itemStore, this.responseStore);\n\n // where we keep actions\n this.actionStore = null;\n\n // configuration params, that comes on every request/params\n this.requestConfig = {};\n\n // scheduled action promises which supposed to be resolved after action synchronization.\n this.actionPromises = {};\n this.syncInProgress = false; // is data synchronization in progress\n\n // let's you update test data (testContext and testMap)\n this.dataUpdater = dataUpdater(this.getDataHolder());\n\n /**\n * Check whether we have the item in the store\n *\n * @param {String} itemIdentifier - the item identifier\n * @returns {Boolean}\n */\n this.hasItem = function hasItem(itemIdentifier) {\n return itemIdentifier && self.itemStore.has(itemIdentifier);\n };\n\n /**\n * Check whether we have the next item in the store\n *\n * @param {String} itemIdentifier - the CURRENT item identifier\n * @returns {Boolean}\n */\n this.hasNextItem = function hasNextItem(itemIdentifier) {\n var sibling = navigationHelper.getNextItem(this.getDataHolder().get('testMap'), itemIdentifier);\n return sibling && self.hasItem(sibling.id);\n };\n\n /**\n * Check whether we have the previous item in the store\n *\n * @param {String} itemIdentifier - the CURRENT item identifier\n * @returns {Boolean}\n */\n this.hasPreviousItem = function hasPreviousItem(itemIdentifier) {\n var sibling = navigationHelper.getPreviousItem(this.getDataHolder().get('testMap'), itemIdentifier);\n return sibling && self.hasItem(sibling.id);\n };\n\n /**\n * Offline navigation\n *\n * @param {String} action - the action name (ie. move, skip, timeout)\n * @param {Object} actionParams - the parameters sent along the action\n * @returns {Object} action result\n */\n this.offlineAction = function offlineAction(action, actionParams) {\n return new Promise(function (resolve, reject) {\n var result = {\n success: true\n };\n var blockingActions = ['exitTest', 'timeout', 'pause'];\n var dataHolder = self.getDataHolder();\n var testContext = dataHolder.get('testContext');\n var testMap = dataHolder.get('testMap');\n var isLast = testContext && testMap ? navigationHelper.isLast(testMap, testContext.itemIdentifier) : false;\n var isOffline = self.isOffline();\n var isBlocked = blockingActions.includes(action);\n var isNavigationAction = actionParams.direction === 'next' || action === 'skip';\n var isDirectionDefined;\n var isMeaningfullScope = !!actionParams.scope;\n\n /***\n * performs navigation trough items of given test parameters according to action parameters\n * doesent need active internet connection\n * @param navigator - navigator helper used with this proxy\n * @param {Object} options - options to manage the navigation\n * @param {Object} options.testContext - current test testContext dataset\n * @param {Object} results - navigtion result output object\n */\n var navigate = function (navigator, options, results) {\n var newTestContext;\n navigator.setTestContext(options.testContext).setTestMap(options.testMap).navigate(actionParams.direction, actionParams.scope, actionParams.ref, actionParams).then(function (res) {\n newTestContext = res;\n if (!newTestContext || !newTestContext.itemIdentifier || !self.hasItem(newTestContext.itemIdentifier)) {\n throw offlineErrorHelper.buildErrorFromContext(offlineErrorHelper.getOfflineNavError());\n }\n results.testContext = newTestContext;\n resolve(results);\n }).catch(function (err) {\n reject(err);\n });\n };\n if (action === 'skip') {\n actionParams.direction = action;\n }\n isDirectionDefined = !!actionParams.direction;\n if (isBlocked || isNavigationAction && isLast) {\n // the last item of the test\n result.testContext = {\n state: states.testSession.closed\n };\n const offlineSync = function () {\n offlineSyncModal(self).on('proceed', function () {\n self.syncData().then(function () {\n // if is online resolve promise\n if (self.isOnline()) {\n return resolve(result);\n }\n }).catch(function () {\n return resolve({\n success: false\n });\n });\n }).on('secondaryaction', function () {\n self.initiateDownload().catch(function () {\n return resolve({\n success: false\n });\n });\n });\n };\n if (isOffline) {\n return offlineSync();\n } else {\n return self.syncData().then(function () {\n if (self.isOffline()) {\n // in case last request was failed and connection lost\n // show offlineWaitingDialog\n return offlineSync();\n }\n return resolve(result);\n }).catch(function () {\n return resolve({\n success: false\n });\n });\n }\n } else if (isDirectionDefined && isMeaningfullScope) {\n //navigation actions\n if (isOffline) {\n navigate(self.offlineNavigator, {\n testContext: testContext,\n testMap: testMap\n }, result);\n } else {\n return self.syncData().then(function () {\n navigate(self.offlineNavigator, {\n testContext: testContext,\n testMap: testMap\n }, result);\n }).catch(function () {\n return resolve({\n success: false\n });\n });\n }\n } else {\n //common behaviour\n resolve(result);\n }\n });\n };\n\n /**\n * Schedule an action do be done with next call\n *\n * @param {String} action - the action name (ie. move, skip, timeout)\n * @param {Object} actionParams - the parameters sent along the action\n * @returns {Promise} resolves with the action data\n */\n this.scheduleAction = function scheduleAction(action, actionParams) {\n actionParams = _.assign(actionParams, {\n actionId: `${action}_${new Date().getTime()}`,\n offline: true\n });\n return self.actionStore.push(action, self.prepareParams(_.defaults(actionParams || {}, self.requestConfig))).then(function () {\n return {\n action: action,\n params: actionParams\n };\n });\n };\n\n /**\n * Try to sync data until reached max attempts\n *\n * @param {Object} data - sync payload\n * @param {Number} attempt - current attempt\n * @returns {Promise} resolves with the action result\n */\n this.sendSyncData = function sendSyncData(data) {\n let attempt = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n return new Promise((resolve, reject) => self.send('sync', data).then(resolve).catch(err => {\n if (self.isConnectivityError(err) && attempt < maxSyncAttempts) {\n return self.sendSyncData(data, attempt + 1).then(resolve).catch(reject);\n }\n return reject(err);\n }));\n };\n\n /**\n * Flush and synchronize actions collected while offline\n *\n * @returns {Promise} resolves with the action result\n */\n this.syncData = function syncData() {\n var actions;\n this.syncInProgress = true;\n return this.queue.serie(function () {\n return self.actionStore.flush().then(function (data) {\n actions = data;\n if (data && data.length) {\n return self.sendSyncData(data);\n }\n }).catch(function (err) {\n if (self.isConnectivityError(err)) {\n self.setOffline('communicator');\n _.forEach(actions, function (action) {\n self.actionStore.push(action.action, action.parameters, action.timestamp);\n });\n return;\n }\n self.syncInProgress = false;\n self.trigger('error', err);\n throw err;\n }).then(data => {\n self.syncInProgress = false;\n return data;\n });\n });\n };\n this.prepareDownload = function prepareDownload(actions) {\n const timestamp = Date.now();\n const dateTime = new Date(timestamp).toISOString();\n\n //@deprecated\n const testData = self.getDataHolder().get('testData');\n const testMap = self.getDataHolder().get('testMap');\n const niceFilename = `Download of ${testMap.title} at ${dateTime}.json`;\n const isExitTest = actions.some(elem => elem.action === 'exitTest');\n return {\n filename: niceFilename,\n content: JSON.stringify({\n isExitTest: isExitTest,\n timestamp: timestamp,\n testData: testData,\n actionQueue: actions,\n testConfig: self.requestConfig\n })\n };\n };\n this.initiateDownload = function initiateDownload() {\n return this.queue.serie(function () {\n return self.actionStore.flush().then(function (actions) {\n _.forEach(actions, function (action) {\n self.actionStore.push(action.action, action.parameters, action.timestamp);\n });\n return actions;\n }).then(self.prepareDownload).then(function (data) {\n return download(data.filename, data.content);\n });\n });\n };\n },\n /**\n * Initializes the proxy\n *\n * @param {Object} config - The config provided to the proxy factory\n * @param {String} config.testDefinition - The URI of the test\n * @param {String} config.testCompilation - The URI of the compiled delivery\n * @param {String} config.serviceCallId - The URI of the service call\n * @param {Object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The proxy will be fully initialized on resolve.\n * Any error will be provided if rejected.\n */\n init: function init(config, params) {\n var self = this;\n\n // run the init\n var InitCallPromise = qtiServiceProxy.init.call(this, config, params);\n if (!this.getDataHolder()) {\n throw new Error('Unable to retrieve test runners data holder');\n }\n\n // those needs to be in each request params.\n this.requestConfig = _.pick(config, ['testDefinition', 'testCompilation', 'serviceCallId']);\n\n // set up the action store for the current service call\n this.actionStore = actionStoreFactory(config.serviceCallId);\n\n // stop error event propagation if sync is in progress\n this.before('error', (e, error) => {\n if (self.isConnectivityError(error) && self.syncInProgress) {\n return false;\n }\n return true;\n });\n return InitCallPromise.then(function (response) {\n var promises = [];\n if (!response.items) {\n response.items = {};\n }\n self.itemStore.setCacheSize(_.size(response.items));\n _.forEach(response.items, function (item, itemIdentifier) {\n promises.push(self.itemStore.set(itemIdentifier, item));\n });\n return Promise.all(promises).then(() => {\n return self.offlineNavigator.setTestContext(response.testContext).setTestMap(response.testMap).init();\n }).then(() => response);\n });\n },\n /**\n * Uninstalls the proxy\n *\n * @returns {Promise} - Returns a promise. The proxy will be fully uninstalled on resolve.\n * Any error will be provided if rejected.\n */\n destroy: function destroy() {\n var self = this;\n return this.itemStore.clear().then(function () {\n return qtiServiceProxy.destroy.call(self);\n });\n },\n /**\n * Gets an item definition by its identifier, also gets its current state\n *\n * @param {String} itemIdentifier\n * @returns {Promise} - Returns a promise. The item data will be provided on resolve.\n * Any error will be provided if rejected.\n */\n getItem: function getItem(itemIdentifier) {\n return this.itemStore.get(itemIdentifier);\n },\n /**\n * Submits the state and the response of a particular item\n *\n * @param {String} itemIdentifier - The identifier of the item to update\n * @param {Object} state - The state to submit\n * @param {Object} response - The response object to submit\n * @param {Object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n */\n submitItem: function submitItem(itemIdentifier, state, response, params) {\n var self = this;\n return this.itemStore.update(itemIdentifier, 'itemState', state).then(function () {\n return qtiServiceProxy.submitItem.call(self, itemIdentifier, state, response, params);\n });\n },\n /**\n * Sends the test variables\n *\n * @param {Object} variables\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n * @fires sendVariables\n */\n sendVariables: function sendVariables(variables) {\n var self = this,\n action = 'storeTraceData',\n actionParams = {\n traceData: JSON.stringify(variables)\n };\n return self.scheduleAction(action, actionParams).then(function () {\n return self.offlineAction(action, actionParams);\n }).catch(function (err) {\n return Promise.reject(err);\n });\n },\n /**\n * Calls an action related to the test\n *\n * @param {String} action - The name of the action to call\n * @param {Object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n */\n callTestAction: function callTestAction(action, params) {\n var self = this;\n return self.scheduleAction(action, params).then(function () {\n return self.offlineAction(action, params);\n }).catch(function (err) {\n return Promise.reject(err);\n });\n },\n /**\n * Calls an action related to a particular item\n *\n * @param {String} itemIdentifier - The identifier of the item for which call the action\n * @param {String} action - The name of the action to call\n * @param {Object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n */\n callItemAction: function callItemAction(itemIdentifier, action, params) {\n var self = this,\n updateStatePromise = Promise.resolve();\n\n //update the item state\n if (params.itemState) {\n updateStatePromise = this.itemStore.update(itemIdentifier, 'itemState', params.itemState);\n }\n\n // If item action is move to another item ensure the next request will start the timer\n if (navigationHelper.isMovingToNextItem(action, params) || navigationHelper.isMovingToPreviousItem(action, params) || navigationHelper.isJumpingToItem(action, params)) {\n params.start = true;\n }\n return updateStatePromise.then(function () {\n params = _.assign({\n itemDefinition: itemIdentifier\n }, params);\n return self.scheduleAction(action, params).then(function () {\n return self.offlineAction(action, params);\n }).catch(function (err) {\n return Promise.reject(err);\n });\n }).catch(function (err) {\n return Promise.reject(err);\n });\n }\n }, qtiServiceProxy);\n\n return proxy;\n\n});\n\n","\n(function(c){var d=document,a='appendChild',i='styleSheet',s=d.createElement('style');s.type='text/css';d.getElementsByTagName('head')[0][a](s);s[i]?s[i].cssText=c:s[a](d.createTextNode(c));})\n('.qti-navigator-default{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;-o-flex-direction:column;flex-direction:column;padding:0;cursor:default;min-width:calc(18rem - 8px);height:100%;position:relative}.qti-navigator-default span{display:inline-block}.qti-navigator-default .collapsed .collapsible-panel{display:none !important}.qti-navigator-default .collapsed .qti-navigator-label .icon-up{display:none}.qti-navigator-default .collapsed .qti-navigator-label .icon-down{display:inline-block}.qti-navigator-default .collapsible>.qti-navigator-label,.qti-navigator-default .qti-navigator-item>.qti-navigator-label{cursor:pointer}.qti-navigator-default.scope-test-section .qti-navigator-part>.qti-navigator-label{display:none !important}.qti-navigator-default .qti-navigator-label{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;min-width:calc(100% - 12px);padding:0 6px;line-height:3rem}.qti-navigator-default .qti-navigator-label .icon-up,.qti-navigator-default .qti-navigator-label .icon-down{line-height:3rem;margin-left:auto}.qti-navigator-default .qti-navigator-label .icon-down{display:none}.qti-navigator-default .qti-navigator-label .qti-navigator-number{display:none}.qti-navigator-default .qti-navigator-icon,.qti-navigator-default .icon{position:relative;top:1px;display:inline-block;line-height:2.8rem;margin-right:.5rem}.qti-navigator-default .unseen .qti-navigator-icon{cursor:default}.qti-navigator-default.prevents-unseen:not(.skipahead-enabled) .unseen .qti-navigator-icon,.qti-navigator-default.prevents-unseen:not(.skipahead-enabled) .unseen .qti-navigator-label{cursor:not-allowed !important}.qti-navigator-default .icon-answered:before{content:\\\"îšš\\\"}.qti-navigator-default .icon-viewed:before{content:\\\"\\\"}.qti-navigator-default .icon-flagged:before{content:\\\"\\\"}.qti-navigator-default .icon-unanswered:before,.qti-navigator-default .icon-unseen:before{content:\\\"\\\"}.qti-navigator-default .qti-navigator-counter{text-align:right;margin-left:auto;font-size:12px;font-size:1.2rem}.qti-navigator-default .qti-navigator-actions{text-align:center}.qti-navigator-default .qti-navigator-info.collapsed{height:calc(3rem + 1px)}.qti-navigator-default .qti-navigator-info{height:calc(5*(3rem + 1px));overflow:hidden}.qti-navigator-default .qti-navigator-info>.qti-navigator-label{min-width:calc(100% - 16px);padding:0 8px}.qti-navigator-default .qti-navigator-info ul{padding:0 4px}.qti-navigator-default .qti-navigator-info ul .qti-navigator-label span.qti-navigator-text{padding:0 6px;min-width:10rem}.qti-navigator-default .qti-navigator-info ul .qti-navigator-label span.qti-navigator-icon{min-width:1.5rem}.qti-navigator-default .qti-navigator-info ul .qti-navigator-label span.qti-navigator-counter{min-width:5rem}.qti-navigator-default .qti-navigator-filters{margin-top:1rem;text-align:center;width:15rem;height:calc(3rem + (2 * 1px))}.qti-navigator-default .qti-navigator-filters ul{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch}.qti-navigator-default .qti-navigator-filters li{display:block}.qti-navigator-default .qti-navigator-filters li .qti-navigator-tab{border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px;border-left:none;line-height:3rem;min-width:5rem;cursor:pointer;white-space:nowrap}.qti-navigator-default .qti-navigator-tree{-webkit-flex:1;-moz-flex:1;-ms-flex:1;-o-flex:1;flex:1;overflow-y:auto}.qti-navigator-default .qti-navigator-linear,.qti-navigator-default .qti-navigator-linear-part{padding:8px}.qti-navigator-default .qti-navigator-linear .icon,.qti-navigator-default .qti-navigator-linear-part .icon{display:none}.qti-navigator-default .qti-navigator-linear .qti-navigator-label,.qti-navigator-default .qti-navigator-linear-part .qti-navigator-label{font-size:14px;font-size:1.4rem}.qti-navigator-default .qti-navigator-linear .qti-navigator-title,.qti-navigator-default .qti-navigator-linear-part .qti-navigator-title{font-size:14px;font-size:1.4rem;margin:8px 0}.qti-navigator-default .qti-navigator-linear .qti-navigator-message,.qti-navigator-default .qti-navigator-linear-part .qti-navigator-message{font-size:14px;font-size:1.4rem}.qti-navigator-default .qti-navigator-part>.qti-navigator-label{padding:0 8px}.qti-navigator-default .qti-navigator-part:not(:first-child){margin-top:1px}.qti-navigator-default .qti-navigator-section>.qti-navigator-label{padding:0 8px}.qti-navigator-default .qti-navigator-item{margin:1px 0;padding-left:10px}.qti-navigator-default .qti-navigator-item:first-child{margin-top:0}.qti-navigator-default .qti-navigator-item.disabled>.qti-navigator-label{cursor:not-allowed}.qti-navigator-default .qti-navigator-collapsible{cursor:pointer;text-align:center;display:none;position:absolute;top:0;bottom:0;right:0;padding-top:50%}.qti-navigator-default .qti-navigator-collapsible .icon{font-size:20px;font-size:2rem;width:1rem !important;height:2rem !important}.qti-navigator-default .qti-navigator-collapsible .qti-navigator-expand{display:none}.qti-navigator-default.collapsible{padding-right:calc(1rem + 10px) !important}.qti-navigator-default.collapsible .qti-navigator-collapsible{display:block}.qti-navigator-default.collapsed{width:calc(8rem + 1rem + 10px);min-width:8rem}.qti-navigator-default.collapsed ul{padding:0 !important}.qti-navigator-default.collapsed .qti-navigator-text,.qti-navigator-default.collapsed .qti-navigator-info>.qti-navigator-label,.qti-navigator-default.collapsed .qti-navigator-part>.qti-navigator-label,.qti-navigator-default.collapsed .qti-navigator-section>.qti-navigator-label,.qti-navigator-default.collapsed .qti-navigator-message{display:none !important}.qti-navigator-default.collapsed .qti-navigator-label{padding:0 2px !important;width:calc(8rem - 4px);min-width:calc(8rem - 4px)}.qti-navigator-default.collapsed .qti-navigator-icon,.qti-navigator-default.collapsed .icon{width:auto}.qti-navigator-default.collapsed .qti-navigator-counter{margin-left:0;min-width:4rem !important}.qti-navigator-default.collapsed .qti-navigator-collapsible .qti-navigator-collapse{display:none}.qti-navigator-default.collapsed .qti-navigator-collapsible .qti-navigator-expand{display:block}.qti-navigator-default.collapsed .qti-navigator-info{height:calc(4*(3rem + 1px))}.qti-navigator-default.collapsed .qti-navigator-info.collapsed .collapsible-panel{display:block !important}.qti-navigator-default.collapsed .qti-navigator-filters{width:calc(8rem - 16px)}.qti-navigator-default.collapsed .qti-navigator-filter span{display:none}.qti-navigator-default.collapsed .qti-navigator-filter.active span{display:block;border:0 none;width:calc(8rem - 16px)}.qti-navigator-default.collapsed .qti-navigator-item,.qti-navigator-default.collapsed .qti-navigator-linear,.qti-navigator-default.collapsed .qti-navigator-linear-part{padding-left:2px;text-align:center}.qti-navigator-default.collapsed .qti-navigator-item{overflow:hidden}.qti-navigator-default.collapsed .qti-navigator-item .qti-navigator-icon{padding-left:6px;width:2rem}.qti-navigator-default.collapsed .qti-navigator-item .qti-navigator-number{display:inline-block;margin-left:6px;margin-right:8rem}.qti-navigator-default.collapsed .qti-navigator-linear,.qti-navigator-default.collapsed .qti-navigator-linear-part{padding:0 0 8px 0}.qti-navigator-default.collapsed .qti-navigator-linear .icon,.qti-navigator-default.collapsed .qti-navigator-linear-part .icon{display:block}.qti-navigator-default.collapsed .qti-navigator-actions button{padding:0 9px 0 5px}.qti-navigator-default .qti-navigator-info>.qti-navigator-label{background-color:#d4d5d7;color:#222;border-top:1px solid #d4d5d7}.qti-navigator-default .qti-navigator-info li{border-bottom:1px solid #fff}.qti-navigator-default .qti-navigator-filter .qti-navigator-tab{background-color:#fff}.qti-navigator-default .qti-navigator-filter .qti-navigator-tab:hover{background-color:#3e7da7;color:#fff}.qti-navigator-default .qti-navigator-filter.active .qti-navigator-tab{background-color:#a4a9b1;color:#fff}.qti-navigator-default .qti-navigator-linear,.qti-navigator-default .qti-navigator-linear-part{background:#fff}.qti-navigator-default .qti-navigator-part>.qti-navigator-label{background-color:#dddfe2}.qti-navigator-default .qti-navigator-part>.qti-navigator-label:hover{background-color:#c6cacf}.qti-navigator-default .qti-navigator-part.active>.qti-navigator-label{background-color:#c0c4ca}.qti-navigator-default .qti-navigator-section>.qti-navigator-label{border-bottom:1px solid #fff}.qti-navigator-default .qti-navigator-section>.qti-navigator-label:hover{background-color:#ebe8e4}.qti-navigator-default .qti-navigator-section.active>.qti-navigator-label{background-color:#ded9d4}.qti-navigator-default .qti-navigator-item{background:#fff}.qti-navigator-default .qti-navigator-item.active{background:#0e5d91;color:#fff}.qti-navigator-default .qti-navigator-item:hover{background:#0a3f62;color:#fff}.qti-navigator-default .qti-navigator-item.disabled{background-color:#e2deda !important}.qti-navigator-default .qti-navigator-collapsible{background-color:#dfe1e4;color:#222}.qti-navigator-default .qti-navigator-collapsible .icon{color:#fff}.qti-navigator-fizzy{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;-o-flex-direction:column;flex-direction:column;cursor:default;min-width:calc(18rem - 8px);height:100%;position:relative;background-color:#f2f2f2 !important;width:30rem}.qti-navigator-fizzy .qti-navigator-tree{overflow-y:auto;max-height:100%;display:block;background:none;margin:0 5px}.qti-navigator-fizzy .qti-navigator-linear{padding:8px;margin:0 5px;background:#fff}.qti-navigator-fizzy .qti-navigator-linear .qti-navigator-message{font-size:14px;font-size:1.4rem}.qti-navigator-fizzy .qti-navigator-section{display:block}.qti-navigator-fizzy .qti-navigator-section .qti-navigator-label{background-color:initial;border:none;padding:0;line-height:initial;margin:13px 0 10px 0;font-size:15px;font-size:1.5rem}.qti-navigator-fizzy .qti-navigator-header{display:flex;justify-content:space-between;border-bottom:1px solid #cec7bf;padding:15px 0 5px 0;margin:0 5px;line-height:initial}.qti-navigator-fizzy .qti-navigator-header .qti-navigator-text{font-size:20px;font-size:2rem;font-weight:bold}.qti-navigator-fizzy .qti-navigator-header .icon-close{font-size:28px;font-size:2.8rem;line-height:3rem;color:#1f1f1f}.qti-navigator-fizzy .qti-navigator-header .icon-close:hover{color:#1f1f1f;text-decoration:none;cursor:pointer}.document-viewer-plugin{position:relative}.document-viewer-plugin .viewer-overlay{position:fixed;top:0;left:0;bottom:0;right:0;z-index:10000;width:100%;opacity:.5;background-color:#e4ecef}.document-viewer-plugin .viewer-panel{position:fixed;top:10px;left:10px;bottom:10px;right:10px;z-index:100000;color:#222;background:#f3f1ef;font-size:14px;font-size:1.4rem;border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px}.document-viewer-plugin .viewer-header{position:relative;width:100%;height:30px;padding:5px 0;z-index:1}.document-viewer-plugin .viewer-header .viewer-title{font-size:15px;font-size:1.5rem;padding:0;margin:0 0 0 1.6rem}.document-viewer-plugin .viewer-header .icon{float:right;font-size:20px;font-size:2rem;color:#266d9c;margin:1px 6px;top:3px}.document-viewer-plugin .viewer-header .icon:hover{cursor:pointer;opacity:.75}.document-viewer-plugin .viewer-content{padding:0 20px;margin-top:4px;position:relative;height:calc(100% - 40px);overflow:auto}.qti-choiceInteraction.maskable .qti-choice .answer-mask{position:absolute;top:0;right:0;height:100%;padding:5px 10px 0 10px;z-index:10;color:#0e5d91;border:solid 1px #222;background-color:#c8d6dc;text-align:right;vertical-align:middle}.qti-choiceInteraction.maskable .qti-choice .answer-mask:hover{color:#568eb2}.qti-choiceInteraction.maskable .qti-choice .answer-mask .answer-mask-toggle:before{font-family:\\\"tao\\\" !important;speak:never;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:\\\"\\\"}.qti-choiceInteraction.maskable .qti-choice .label-content{padding-right:40px}.qti-choiceInteraction.maskable .qti-choice.masked .answer-mask{width:100%}.qti-choiceInteraction.maskable .qti-choice.masked .answer-mask .answer-mask-toggle:before{font-family:\\\"tao\\\" !important;speak:never;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:\\\"\\\"}.qti-choiceInteraction.maskable .qti-choice.masked .answer-mask:hover{background-color:#d2dde2}.mask-container.mask-container{background-color:rgba(0,0,0,0)}.mask-container.mask-container .dynamic-component-title-bar{border-top-left-radius:5px;border-top-right-radius:5px;background-color:rgba(0,0,0,0);border:none;position:absolute;width:100%;z-index:1}.mask-container.mask-container .dynamic-component-title-bar.moving{background:#f3f1ef;border-bottom:1px solid #8d949e}.mask-container.mask-container .dynamic-component-title-bar .closer{display:none}.mask-container.mask-container .dynamic-component-resize-container .dynamic-component-resize-wrapper{bottom:0}.mask-container.mask-container .dynamic-component-resize-container .dynamic-component-resize-wrapper:hover,.mask-container.mask-container .dynamic-component-resize-container .dynamic-component-resize-wrapper.resizing{bottom:20px}.mask-container.mask-container .dynamic-component-content .mask{position:absolute;width:100%;height:100%;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;background:rgba(0,0,0,0);opacity:1}.mask-container.mask-container .dynamic-component-content .mask .inner{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;position:relative;width:100%;height:100%;background-color:#fff;opacity:1;box-sizing:content-box;padding-bottom:30px}.mask-container.mask-container .dynamic-component-content .mask .controls{background:#f3f1ef;position:absolute;top:0;right:0;padding:0 5px 0 10px;border-radius:5px;border-top-left-radius:0;border-bottom-right-radius:0;border-bottom:1px solid #8d949e;border-left:1px solid #8d949e;height:30px;z-index:2}.mask-container.mask-container .dynamic-component-content .mask .controls a{text-decoration:none;margin-right:5px;vertical-align:middle}.mask-container.mask-container .dynamic-component-content .mask .controls a:hover{color:#0a4166}.mask-container.mask-container .dynamic-component-content .mask .controls .view{font-size:20px;font-size:2rem}.mask-container.mask-container .dynamic-component-content .mask .controls .close{font-size:20px;font-size:2rem}.mask-container.mask-container .dynamic-component-content.moving .mask .inner{border-color:rgba(14,93,145,.5);opacity:.55}.mask-container.mask-container .dynamic-component-content.moving .mask .controls{border-left:none;border-bottom-left-radius:0;z-index:2}.mask-container.mask-container .dynamic-component-content.sizing .mask{border-color:rgba(14,93,145,.5)}.mask-container.mask-container .dynamic-component-content.sizing .mask .inner{opacity:.55}.mask-container.mask-container .dynamic-component-content.sizing .mask .controls{background-color:rgba(0,0,0,0);border-bottom:none;border-left:none}.mask-container.mask-container.previewing .dynamic-component-content .mask .inner{opacity:.15;-webkit-transition:opacity, 600ms, ease, 0s;-moz-transition:opacity, 600ms, ease, 0s;-ms-transition:opacity, 600ms, ease, 0s;-o-transition:opacity, 600ms, ease, 0s;transition:opacity, 600ms, ease, 0s}.mask-container.mask-container.previewing .dynamic-component-content .mask .controls{background-color:rgba(0,0,0,0);border-bottom:none;border-left:none}.connectivity-box{display:none;width:40px;margin-left:40px}.connectivity-box.with-message{width:60px}.connectivity-box .icon-connect,.connectivity-box .icon-disconnect{display:none;line-height:2;font-size:16px;font-size:1.6rem;text-shadow:0 1px 0 rgba(0,0,0,.9)}.connectivity-box .message-connect,.connectivity-box .message-disconnected{display:none;font-size:14px;font-size:1.4rem;text-shadow:none;margin-right:3px}.connectivity-box.connected,.connectivity-box.disconnected{display:inline-block}.connectivity-box.connected .icon-connect,.connectivity-box.connected .message-connect{display:inline-block}.connectivity-box.disconnected .icon-disconnect,.connectivity-box.disconnected .message-disconnected{display:inline-block}.line-reader-mask{box-sizing:border-box;border:0 solid #0e5d91;background-color:#f3f7fa}.line-reader-mask.hidden{display:none}.line-reader-mask.resizing{background-color:rgba(243,247,250,.8);border-color:rgba(14,93,145,.5)}.line-reader-mask.resizer{z-index:99999 !important}.line-reader-mask.resizer.se .resize-control{border-right:2px solid #0e5d91;border-bottom:2px solid #0e5d91;width:40px;height:40px}.line-reader-mask.border-top{border-top-width:1px}.line-reader-mask.border-right{border-right-width:1px}.line-reader-mask.border-bottom{border-bottom-width:1px}.line-reader-mask.border-left{border-left-width:1px}.line-reader-mask.ne{-webkit-border-top-right-radius:5px;-moz-border-radius-topright:5px;border-top-right-radius:5px}.line-reader-mask.se{-webkit-border-bottom-right-radius:5px;-moz-border-radius-bottomright:5px;border-bottom-right-radius:5px}.line-reader-mask.sw{-webkit-border-bottom-left-radius:5px;-moz-border-radius-bottomleft:5px;border-bottom-left-radius:5px}.line-reader-mask.nw{-webkit-border-top-left-radius:5px;-moz-border-radius-topleft:5px;border-top-left-radius:5px}.line-reader-mask.se .resize-control{width:20px;height:20px;margin-bottom:10px;margin-right:10px;border-right:1px solid #0e5d91;border-bottom:1px solid #0e5d91;position:absolute;right:0;bottom:0;cursor:nwse-resize}.line-reader-mask.e .resize-control{position:absolute;width:20px;height:20px;bottom:-10px;left:-10px;border-right:1px solid #0e5d91;border-bottom:1px solid #0e5d91;cursor:nesw-resize}.line-reader-mask.s .resize-control{position:absolute;width:20px;height:10px;right:-10px;border-bottom:1px solid #0e5d91}.line-reader-overlay{box-sizing:border-box;opacity:0}.line-reader-overlay.hidden{display:none}.line-reader-overlay.moving{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.line-reader-overlay.moving.n{max-height:none}.line-reader-overlay.moving,.line-reader-overlay .inner-window{overflow:hidden;position:absolute;opacity:1;background-color:rgba(0,0,0,0);border:1px solid rgba(14,93,145,.5)}.line-reader-overlay .inner-window{box-sizing:content-box}.line-reader-overlay .mask-bg{box-sizing:border-box;border:0 solid rgba(243,247,250,.8);background-color:rgba(0,0,0,0);position:absolute}.line-reader-overlay.n{max-height:30px;opacity:1}.line-reader-overlay.n .icon-mobile-menu{font-size:22px;font-size:2.2rem;display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;-o-justify-content:center;justify-content:center;border-bottom:1px solid #0e5d91;color:#0e5d91;position:absolute;left:0;top:0;height:30px;width:100%;z-index:1}.line-reader-overlay.n .icon-mobile-menu:hover{color:#0a4166}.line-reader-overlay.n .icon-mobile-menu:before{position:relative;top:3px}.line-reader-overlay .icon-mobile-menu{display:none}.line-reader-inner-drag{-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;-o-justify-content:center;justify-content:center;text-align:center;padding-top:3px;color:#0e5d91}.line-reader-inner-drag.hidden{display:none}.line-reader-inner-drag:hover{background-color:#87aec8;color:#0a4166}.line-reader-inner-drag.moving{background-color:rgba(0,0,0,0);color:#9fbed3}.line-reader-inner-drag .icon{text-shadow:none !important;border-bottom-left-radius:110px;border-bottom-right-radius:110px;border:1px solid #0e5d91;border-top:0;width:50px;height:25px;position:relative;bottom:10px}.line-reader-inner-drag .icon:before{position:relative;top:5px;left:1px}.line-reader-closer{font-size:22px;font-size:2.2rem;cursor:pointer;color:#0e5d91;width:12px;height:12px}.line-reader-closer:hover{color:#0a4166}.line-reader-closer .icon{text-shadow:none !important}.magnifier-container.magnifier-container{background-color:rgba(0,0,0,0)}.magnifier-container.magnifier-container .dynamic-component-title-bar{border-top-left-radius:5px;border-top-right-radius:5px;background-color:rgba(0,0,0,0);border:none;position:absolute;width:100%;z-index:3}.magnifier-container.magnifier-container .dynamic-component-title-bar.moving{background:#f3f1ef;border-bottom:1px solid #8d949e}.magnifier-container.magnifier-container .dynamic-component-title-bar .closer{display:none}.magnifier-container.magnifier-container .dynamic-component-resize-container .dynamic-component-resize-wrapper{bottom:0}.magnifier-container.magnifier-container .dynamic-component-resize-container .dynamic-component-resize-wrapper:hover,.magnifier-container.magnifier-container .dynamic-component-resize-container .dynamic-component-resize-wrapper.resizing{bottom:20px}.magnifier-container.magnifier-container .dynamic-component-content .magnifier{position:absolute;width:100%;height:100%;overflow:hidden;background-color:#fff;opacity:1;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;box-sizing:content-box;padding-bottom:30px}@-o-keyframes fadeIn{0%{opacity:0;visibility:visible}100%{opacity:1;visibility:visible}}@-moz-keyframes fadeIn{0%{opacity:0;visibility:visible}100%{opacity:1;visibility:visible}}@-webkit-keyframes fadeIn{0%{opacity:0;visibility:visible}100%{opacity:1;visibility:visible}}@keyframes fadeIn{0%{opacity:0;visibility:visible}100%{opacity:1;visibility:visible}}@-o-keyframes fadeOut{0%{opacity:1;visibility:visible}100%{opacity:0;visibility:hidden}}@-moz-keyframes fadeOut{0%{opacity:1;visibility:visible}100%{opacity:0;visibility:hidden}}@-webkit-keyframes fadeOut{0%{opacity:1;visibility:visible}100%{opacity:0;visibility:hidden}}@keyframes fadeOut{0%{opacity:1;visibility:visible}100%{opacity:0;visibility:hidden}}@-o-keyframes pop{0%{opacity:0;visibility:visible}50%{opacity:.5;visibility:visible;transform:scale(2)}100%{opacity:0;visibility:hidden;transform:scale(3)}}@-moz-keyframes pop{0%{opacity:0;visibility:visible}50%{opacity:.5;visibility:visible;transform:scale(2)}100%{opacity:0;visibility:hidden;transform:scale(3)}}@-webkit-keyframes pop{0%{opacity:0;visibility:visible}50%{opacity:.5;visibility:visible;transform:scale(2)}100%{opacity:0;visibility:hidden;transform:scale(3)}}@keyframes pop{0%{opacity:0;visibility:visible}50%{opacity:.5;visibility:visible;transform:scale(2)}100%{opacity:0;visibility:hidden;transform:scale(3)}}.magnifier-container.magnifier-container .dynamic-component-content .magnifier .level{position:absolute;overflow:hidden;z-index:1;top:0;left:0;bottom:0;right:0;background:rgba(0,0,0,0);color:#3e7da7;opacity:1;font-size:50px;font-size:5rem;display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;-o-justify-content:center;justify-content:center;-webkit-animation:pop 400ms forwards;-moz-animation:pop 400ms forwards;-ms-animation:pop 400ms forwards;-o-animation:pop 400ms forwards;animation:pop 400ms forwards}.magnifier-container.magnifier-container .dynamic-component-content .magnifier .level:before{content:\\\"x\\\"}.magnifier-container.magnifier-container .dynamic-component-content .magnifier .overlay{position:absolute;overflow:hidden;z-index:2;top:0;left:0;bottom:0;right:0;background:rgba(0,0,0,0)}.magnifier-container.magnifier-container .dynamic-component-content .magnifier>.controls{position:absolute;background-color:#f3f1ef;border:0 solid #8d949e;min-height:29px;z-index:4}.magnifier-container.magnifier-container .dynamic-component-content .magnifier>.controls a{color:#222;text-decoration:none;font-size:20px;font-size:2rem;margin:0 2px}.magnifier-container.magnifier-container .dynamic-component-content .magnifier>.controls a:hover{color:#0a4166}.magnifier-container.magnifier-container .dynamic-component-content .magnifier>.controls.close{top:0;right:0;border-bottom-width:1px;border-left-width:1px;-webkit-border-bottom-left-radius:5px;-moz-border-radius-bottomleft:5px;border-bottom-left-radius:5px}.magnifier-container.magnifier-container .dynamic-component-content .magnifier .inner{position:absolute}.magnifier-container.magnifier-container .dynamic-component-content.moving .magnifier .controls{border-left:none;border-bottom-left-radius:0}.magnifier-container.magnifier-container .dynamic-component-content.sizing{border-color:rgba(14,93,145,.5)}.magnifier-container.magnifier-container .dynamic-component-content.sizing .inner,.magnifier-container.magnifier-container .dynamic-component-content.sizing .controls,.magnifier-container.magnifier-container .dynamic-component-content.sizing .level{opacity:.45 !important}.progress-box .progressbar .progressbar-points{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch}.progress-box .progressbar .progressbar-points>span.progressbar-point{flex:1;display:inline-block;border:1px solid #0e5d91;background-color:#f3f1ef;height:calc(1rem - 4px);margin:0 1px 0 0}.progress-box .progressbar .progressbar-points>span.progressbar-point:last-child{margin-right:0}.progress-box .progressbar .progressbar-points>span.progressbar-point.reached{background-color:#0e5d91}.progress-box .progressbar .progressbar-points>span.progressbar-point.current{background-color:#a4a9b1}.tts-container .tts-controls{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;background-color:#f3f1ef;-webkit-box-shadow:0 2px 3px 1px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 2px 3px 1px rgba(0, 0, 0, 0.2);-ms-box-shadow:0 2px 3px 1px rgba(0, 0, 0, 0.2);-o-box-shadow:0 2px 3px 1px rgba(0, 0, 0, 0.2);box-shadow:0 2px 3px 1px rgba(0, 0, 0, 0.2)}.tts-container .tts-controls .tts-control{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;-o-justify-content:center;justify-content:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;color:#222;height:100%;padding:6px 8.5px;text-decoration:none}.tts-container .tts-controls .tts-control .tts-control-label{padding-left:7.5px}.tts-container .tts-controls .tts-control .tts-icon{font-size:18px;text-align:center;width:18px}.tts-container .tts-controls .tts-control .icon-pause{display:none}.tts-container .tts-controls .tts-control.tts-control-drag{cursor:move}.tts-container .tts-controls .tts-control.tts-control-drag .tts-icon{color:#555}.tts-container .tts-controls .tts-control.tts-control-drag:hover{background-color:rgba(0,0,0,0)}.tts-container .tts-controls .tts-control:hover{background-color:#ddd8d2}.tts-container .tts-controls .tts-control-container{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch}.tts-container .tts-controls .tts-control-container .tts-slider-container{display:none}.tts-container .tts-controls .tts-control-container .tts-slider-container .tts-slider{margin:0 8.5px;width:80px}.tts-container.playing .tts-controls .tts-control .icon-pause{display:block}.tts-container.playing .tts-controls .tts-control .icon-play{display:none}.tts-container.sfhMode .tts-controls .tts-control.tts-control-mode{-webkit-box-shadow:inset 2px 2px 4px rgba(0, 0, 0, 0.2);-moz-box-shadow:inset 2px 2px 4px rgba(0, 0, 0, 0.2);-ms-box-shadow:inset 2px 2px 4px rgba(0, 0, 0, 0.2);-o-box-shadow:inset 2px 2px 4px rgba(0, 0, 0, 0.2);box-shadow:inset 2px 2px 4px rgba(0, 0, 0, 0.2);background-color:#ddd8d2}.tts-container.settings .tts-controls .tts-control-container .tts-slider-container{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center}.tts-container.settings .tts-controls .tts-control-container:last-child{-webkit-box-shadow:inset 2px 2px 4px rgba(0, 0, 0, 0.2);-moz-box-shadow:inset 2px 2px 4px rgba(0, 0, 0, 0.2);-ms-box-shadow:inset 2px 2px 4px rgba(0, 0, 0, 0.2);-o-box-shadow:inset 2px 2px 4px rgba(0, 0, 0, 0.2);box-shadow:inset 2px 2px 4px rgba(0, 0, 0, 0.2);background-color:#ddd8d2}.tts-container.settings .tts-controls .tts-control-container .tts-control-settings:hover{background-color:rgba(0,0,0,0)}.tts-content-node{outline:none}.tts-visible.tts-component-container .test-runner-sections .tts-content-node:hover,.tts-visible.tts-component-container .test-runner-sections .tts-content-node:focus{background-color:rgba(0,0,0,0) !important;color:#222 !important}.tts-visible.tts-component-container .test-runner-sections .tts-content-node .label-box,.tts-visible.tts-component-container .test-runner-sections .tts-content-node .qti-choice{cursor:default !important}.tts-sfhMode.tts-component-container .test-runner-sections{cursor:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxNHB4IiBoZWlnaHQ9IjE0cHgiIHZpZXdCb3g9IjAgMCAxNCAxNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT5Hcm91cCAyPC90aXRsZT4gICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+ICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9IkFydGJvYXJkIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjQuMDAwMDAwLCAtMTYuMDAwMDAwKSI+ICAgICAgICAgICAgPGcgaWQ9Ikdyb3VwLTIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIzLjAwMDAwMCwgMTUuMDAwMDAwKSI+ICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtQ29weS02IiB4PSIwIiB5PSIwIiB3aWR0aD0iMTYiIGhlaWdodD0iMTYiPjwvcmVjdD4gICAgICAgICAgICAgICAgPGcgaWQ9Imljb24tLy0xNi0vLWNoZXZyb24tYm90dG9tLWNvcHkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEuMDAwMDAwLCAyLjAwMDAwMCkiIGZpbGw9IiMyRDJEMkQiPiAgICAgICAgICAgICAgICAgICAgPHBvbHlnb24gaWQ9InN3YXAtaWNvbi1jb2xvciIgcG9pbnRzPSIwIDAgMCA4IDYgNCI+PC9wb2x5Z29uPiAgICAgICAgICAgICAgICA8L2c+ICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtQ29weSIgZmlsbD0iIzJEMkQyRCIgeD0iOSIgeT0iNSIgd2lkdGg9IjYiIGhlaWdodD0iMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLUNvcHktNCIgZmlsbD0iIzJEMkQyRCIgeD0iOSIgeT0iMSIgd2lkdGg9IjYiIGhlaWdodD0iMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLUNvcHktMiIgZmlsbD0iIzJEMkQyRCIgeD0iOSIgeT0iOSIgd2lkdGg9IjYiIGhlaWdodD0iMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLUNvcHktMyIgZmlsbD0iIzJEMkQyRCIgeD0iMSIgeT0iMTMiIHdpZHRoPSIxNCIgaGVpZ2h0PSIyIj48L3JlY3Q+ICAgICAgICAgICAgPC9nPiAgICAgICAgPC9nPiAgICA8L2c+PC9zdmc+) 0 32,auto !important}.tts-sfhMode.tts-component-container .test-runner-sections .tts-content-node.tts-active-content-node:hover{color:#222 !important;background-color:#ff0 !important}.tts-sfhMode.tts-component-container .test-runner-sections .tts-content-node:hover,.tts-sfhMode.tts-component-container .test-runner-sections .tts-content-node:focus{color:#222 !important;background-color:#f3f1ef !important}.tts-sfhMode.tts-component-container .test-runner-sections .tts-content-node .label-box,.tts-sfhMode.tts-component-container .test-runner-sections .tts-content-node .qti-choice{cursor:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxNHB4IiBoZWlnaHQ9IjE0cHgiIHZpZXdCb3g9IjAgMCAxNCAxNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT5Hcm91cCAyPC90aXRsZT4gICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+ICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9IkFydGJvYXJkIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjQuMDAwMDAwLCAtMTYuMDAwMDAwKSI+ICAgICAgICAgICAgPGcgaWQ9Ikdyb3VwLTIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIzLjAwMDAwMCwgMTUuMDAwMDAwKSI+ICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtQ29weS02IiB4PSIwIiB5PSIwIiB3aWR0aD0iMTYiIGhlaWdodD0iMTYiPjwvcmVjdD4gICAgICAgICAgICAgICAgPGcgaWQ9Imljb24tLy0xNi0vLWNoZXZyb24tYm90dG9tLWNvcHkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEuMDAwMDAwLCAyLjAwMDAwMCkiIGZpbGw9IiMyRDJEMkQiPiAgICAgICAgICAgICAgICAgICAgPHBvbHlnb24gaWQ9InN3YXAtaWNvbi1jb2xvciIgcG9pbnRzPSIwIDAgMCA4IDYgNCI+PC9wb2x5Z29uPiAgICAgICAgICAgICAgICA8L2c+ICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtQ29weSIgZmlsbD0iIzJEMkQyRCIgeD0iOSIgeT0iNSIgd2lkdGg9IjYiIGhlaWdodD0iMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLUNvcHktNCIgZmlsbD0iIzJEMkQyRCIgeD0iOSIgeT0iMSIgd2lkdGg9IjYiIGhlaWdodD0iMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLUNvcHktMiIgZmlsbD0iIzJEMkQyRCIgeD0iOSIgeT0iOSIgd2lkdGg9IjYiIGhlaWdodD0iMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLUNvcHktMyIgZmlsbD0iIzJEMkQyRCIgeD0iMSIgeT0iMTMiIHdpZHRoPSIxNCIgaGVpZ2h0PSIyIj48L3JlY3Q+ICAgICAgICAgICAgPC9nPiAgICAgICAgPC9nPiAgICA8L2c+PC9zdmc+) 0 32,auto !important}.tts-sfhMode.tts-component-container .test-runner-sections img.tts-content-node:hover,.tts-sfhMode.tts-component-container .test-runner-sections img.tts-content-node:focus{padding:5px}.tts-playing.tts-component-container .test-runner-sections .tts-content-node.tts-active-content-node,.tts-playing.tts-component-container .test-runner-sections .tts-content-node.tts-active-content-node *{color:#222 !important;background-color:#ff0 !important}.tts-playing.tts-component-container .test-runner-sections .tts-content-node.tts-active-content-node:hover,.tts-playing.tts-component-container .test-runner-sections .tts-content-node.tts-active-content-node *:hover{color:#222 !important;background-color:#ff0 !important}.tts-playing.tts-component-container .test-runner-sections img.tts-content-node.tts-active-content-node{padding:5px}body.delivery-scope{min-height:100vh;max-height:100vh;margin-bottom:0}.runner{position:relative}.qti-choiceInteraction .overlay-answer-eliminator{display:none}.test-runner-scope{position:relative;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:calc(100vh - 99px)}.test-runner-scope .landmark-title-hidden{width:1px;height:1px;overflow:hidden;position:absolute}.test-runner-scope .test-runner-sections{-webkit-flex:1 1 0%;-ms-flex:1 1 0%;flex:1 1 0%;overflow:hidden;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.test-runner-scope .test-sidebar{background:#f3f1ef;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;overflow-y:auto;max-width:350px}.test-runner-scope .test-sidebar>.qti-panel{max-width:350px;padding:10px}@media only screen and (max-device-width: 800px){.test-runner-scope .test-sidebar{max-width:200px}.test-runner-scope .test-sidebar>.qti-panel{max-width:200px}}@media only screen and (min-device-width: 800px)and (max-device-width: 1280px){.test-runner-scope .test-sidebar{max-width:250px}.test-runner-scope .test-sidebar>.qti-panel{max-width:250px}}@media only screen and (min-device-width: 1280px)and (max-device-width: 1440px){.test-runner-scope .test-sidebar{max-width:300px}.test-runner-scope .test-sidebar>.qti-panel{max-width:300px}}.test-runner-scope .test-sidebar-left{border-right:1px #ddd solid}.test-runner-scope .test-sidebar-right{border-left:1px #ddd solid}.test-runner-scope .content-wrapper{position:relative;-webkit-flex:1 1 0%;-ms-flex:1 1 0%;flex:1 1 0%;overflow:auto;padding:0}.test-runner-scope .content-wrapper .overlay{position:absolute;left:0;right:0;top:0;bottom:0;width:100%;opacity:.9}.test-runner-scope .content-wrapper .overlay-full{background-color:#fff;opacity:1}.test-runner-scope #qti-content{-webkit-overflow-scrolling:touch;max-width:1024px;width:100%;margin:auto}.test-runner-scope #qti-item{width:100%;min-width:100%;height:auto;overflow:visible}.test-runner-scope .qti-item{padding:30px}.test-runner-scope .size-wrapper{max-width:1280px;margin:auto;width:100%}.test-runner-scope #qti-rubrics{margin:auto;max-width:1024px;width:100%}.test-runner-scope #qti-rubrics .qti-rubricBlock{margin:20px 0}.test-runner-scope #qti-rubrics .hidden{display:none}.test-runner-scope .visible-hidden{position:absolute;overflow:hidden;height:1px;width:1px;word-wrap:normal}.no-controls .test-runner-scope{height:100vh}.test-runner-scope .action-bar.content-action-bar{padding:2px}.test-runner-scope .action-bar.content-action-bar li{margin:2px 0 0 10px;border:none}.test-runner-scope .action-bar.content-action-bar li.btn-info{padding-top:6px;height:36px;margin-top:0;border-bottom:solid 2px rgba(0,0,0,0);border-radius:0}.test-runner-scope .action-bar.content-action-bar li.btn-info.btn-group{border:none !important;overflow:hidden;padding:0}.test-runner-scope .action-bar.content-action-bar li.btn-info.btn-group a{float:left;margin:0 2px;padding:0 15px;border:1px solid rgba(255,255,255,.3);border-radius:0px;display:inline-block;height:inherit}.test-runner-scope .action-bar.content-action-bar li.btn-info.btn-group a:first-of-type{border-top-left-radius:3px;border-bottom-left-radius:3px;margin-left:0}.test-runner-scope .action-bar.content-action-bar li.btn-info.btn-group a:last-of-type{border-top-right-radius:3px;border-bottom-right-radius:3px;margin-right:0}.test-runner-scope .action-bar.content-action-bar li.btn-info.btn-group a:hover,.test-runner-scope .action-bar.content-action-bar li.btn-info.btn-group a.active{border-color:rgba(255,255,255,.8)}.test-runner-scope .action-bar.content-action-bar li.btn-info.btn-group a .no-label{padding-right:0}.test-runner-scope .action-bar.content-action-bar li.btn-info:hover,.test-runner-scope .action-bar.content-action-bar li.btn-info.active{border-bottom-color:rgba(255,255,255,.8)}.test-runner-scope .action-bar.content-action-bar li.btn-info:active,.test-runner-scope .action-bar.content-action-bar li.btn-info.active{background:#e7eff4;border-color:rgba(255,255,255,.8)}.test-runner-scope .action-bar.content-action-bar li.btn-info:active a,.test-runner-scope .action-bar.content-action-bar li.btn-info.active a{color:#266d9c;text-shadow:none}.test-runner-scope .action-bar.content-action-bar li.btn-info:active:hover,.test-runner-scope .action-bar.content-action-bar li.btn-info.active:hover{background:#fff}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar{opacity:1;height:40px;flex-basis:40px}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box{height:38px;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:space-between;-ms-flex-pack:space-between;justify-content:space-between;padding-left:10px;padding-right:10px}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box .title-box{font-size:14px;font-size:1.4rem;padding:4px 0 0;-ms-flex:0 1 auto;-webkit-flex:0 1 auto;flex:0 1 auto}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box .progress-box,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box .item-number-box{padding-top:4px;white-space:nowrap;-ms-flex:0 1 auto;-webkit-flex:0 1 auto;flex:0 1 auto}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box .progress-box .qti-controls,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box .item-number-box .qti-controls{display:inline-block;margin-left:20px;white-space:nowrap}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box .timer-box{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box .progressbar{margin-top:5px;min-width:150px;max-width:200px;height:.6em}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box{color:rgba(255,255,255,.9);text-shadow:1px 1px 0 #000}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .lft,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .rgt{padding-left:20px}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .lft:first-child,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .rgt:first-child{padding-left:0}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .lft:last-child ul,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .rgt:last-child ul{display:inline-block}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box [class^=btn-],.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box [class*=\\\" btn-\\\"]{white-space:nowrap}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .action{position:relative;overflow:visible}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu{color:#222;background:#f3f1ef;border:1px solid #aaa9a7;overflow:auto;list-style:none;min-width:150px;margin:0;padding:0;position:absolute;bottom:36px;left:-3px}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action{display:inline-block;text-align:left;width:100%;white-space:nowrap;overflow:hidden;color:#222;border-bottom:1px solid #c2c1bf;margin:0;-moz-border-radius:0px;-webkit-border-radius:0px;border-radius:0px;height:auto;padding:8px 15px 9px;line-height:1;border-left:solid 3px rgba(0,0,0,0)}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action .icon-checkbox-checked{display:none}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.active{background-color:#dbd9d7;font-weight:bold}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon-checkbox,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon-checkbox,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.active .icon-checkbox{display:none}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon-checkbox-checked,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon-checkbox-checked,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.active .icon-checkbox-checked{display:inline-block}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:focus,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover{background-color:#0e5d91;color:#fff;border-left-color:#313030 !important}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:focus .label,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:focus .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .label,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .label,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon{color:#fff}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:focus .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon{color:#e7eff4}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action .label,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action .icon{font-size:14px;font-size:1.4rem;text-shadow:none;color:#222}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar{overflow:visible;position:relative}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .action{line-height:1.6}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .icon.no-label{padding-right:0}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed .btn-info .text,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed-hover .btn-info:not(:hover) .text,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.no-tool-label .text,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed .text,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed-over:not(:hover) .text{display:none}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed .btn-info .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed-hover .btn-info:not(:hover) .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.no-tool-label .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed-over:not(:hover) .icon{padding:0}.test-runner-scope [data-control=exit]{margin-left:20px}.test-runner-scope [data-control=comment-toggle]{display:none}.test-runner-scope.non-lti-context .title-box{display:none}.test-runner-scope [data-control=qti-comment]{background-color:#f3f1ef;position:absolute;bottom:33px;left:8px;text-align:right;padding:5px;border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px;-webkit-box-shadow:0 0 15px 1px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 0 15px 1px rgba(0, 0, 0, 0.2);-ms-box-shadow:0 0 15px 1px rgba(0, 0, 0, 0.2);-o-box-shadow:0 0 15px 1px rgba(0, 0, 0, 0.2);box-shadow:0 0 15px 1px rgba(0, 0, 0, 0.2)}.test-runner-scope [data-control=qti-comment] textarea{display:block;height:100px;resize:none;width:350px;padding:3px;margin:0 0 10px 0;border:none;font-size:13px;font-size:1.3rem;border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px}.test-runner-scope .tools-box{position:relative;overflow:visible}.wait-content .wait-content_text--centered{text-align:center}.wait-content .wait-content_actions-list{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;-o-flex-direction:column;flex-direction:column}.wait-content .wait-content_actions-list .wait-content_text--centered{position:relative;right:15px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box>.lft{float:right;margin:2px 10px 0 0}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .rgt{float:left}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list>.action>.li-inner>.icon,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list>.action>.li-inner>.icon{display:inline-block}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list>.action .action,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list>.action .action{text-align:right}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list>.action .action.active .icon.icon-checkbox-checked,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list>.action .action.active .icon.icon-checkbox-checked{display:inline-block}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list>.action .action:not(.active) .icon.icon-checkbox,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list>.action .action:not(.active) .icon.icon-checkbox{display:inline-block}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list>.action .action:not(.active):hover .icon.icon-checkbox,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list>.action .action:not(.active):hover .icon.icon-checkbox{display:none}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list>.action .action:not(.active):hover .icon.icon-checkbox-checked,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list>.action .action:not(.active):hover .icon.icon-checkbox-checked{display:inline-block}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list>.action .menu,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list>.action .menu{left:auto;right:-3px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action{float:right}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon{padding:0 0 0 9px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-right:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-left:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-fast-forward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-step-forward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-forward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-fast-backward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-step-backward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-external:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-backward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-right:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-left:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-fast-forward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-step-forward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-forward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-fast-backward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-step-backward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-external:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-backward:before{display:inline-block;transform:scaleX(-1)}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .action,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .action{text-align:right}body.delivery-scope[dir=rtl] .qti-navigator .icon-up,body.delivery-scope[dir=rtl] .qti-navigator .icon-down{margin-left:0;margin-right:auto}body.delivery-scope[dir=rtl] .qti-navigator .qti-navigator-counter{margin-left:0;margin-right:auto;text-align:left}body.delivery-scope[dir=rtl] .qti-item [class^=feedback-].small,body.delivery-scope[dir=rtl] .qti-item [class*=\\\" feedback-\\\"].small{padding:8px 45px 8px 20px;text-align:right}body.delivery-scope[dir=rtl] .qti-item [class^=feedback-].small>[class^=icon-],body.delivery-scope[dir=rtl] .qti-item [class^=feedback-].small>[class*=\\\" icon-\\\"],body.delivery-scope[dir=rtl] .qti-item [class*=\\\" feedback-\\\"].small>[class^=icon-],body.delivery-scope[dir=rtl] .qti-item [class*=\\\" feedback-\\\"].small>[class*=\\\" icon-\\\"]{left:auto;right:10px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar .control-box>.connectivity-box{margin-left:0px;margin-right:40px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar .control-box>.connectivity-box.with-message .message-connect{margin-left:3px;margin-right:0px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar .control-box>.progress-box>.qti-controls{margin-left:0px;margin-right:20px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar .control-box>.timer-box .timer-toggler{right:20px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar .control-box>.timer-box .timer-wrapper .countdown:first-child::before{content:\\\" \\\"}body.delivery-scope[dir=rtl] .runner .test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar .control-box>.timer-box .timer-wrapper .countdown:last-child::before{content:none}.action-bar .shortcuts-list-wrapper{width:100%;height:100%;position:fixed;top:0;left:0;display:flex;align-items:center;align-content:center;justify-content:center;overflow:auto;background:rgba(0,0,0,.5);z-index:10001}.action-bar .shortcuts-list-wrapper .shortcuts-list{width:auto;min-width:400px;height:auto;min-height:300px;padding:30px !important;color:#222 !important;text-shadow:none !important;position:relative;background-color:#fff;border:1px solid #ddd}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-list-description{width:450px}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-list-title{font-size:24px;margin-top:0}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-group-title{font-size:18px;margin-top:20px}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-group-title:focus{outline:3px solid #276d9b;outline-offset:3px}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-group-list{list-style:none;margin:0;padding:0}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-group-list .shortcut-item{display:-ms-flexbox;display:-webkit-flex;display:flex;float:none;margin:0}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-group-list .shortcut-item .shortcut-item-action,.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-group-list .shortcut-item .shortcut-item-shortcut{-ms-flex:0 1 50%;-webkit-flex:0 1 50%;flex:0 1 50%;margin:0;text-align:center}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-group-list .shortcut-item .shortcut-item-action{text-align:left}.action-bar .shortcuts-list-wrapper .shortcuts-list .btn-close{background-color:rgba(0,0,0,0);box-shadow:none;height:20px;padding:0;position:absolute;right:12px;top:10px;width:20px}.action-bar .shortcuts-list-wrapper .shortcuts-list .btn-close .icon-close{color:#222;font-size:20px;padding:0}.action-bar .shortcuts-list-wrapper .shortcuts-list .btn-close:focus{outline:3px solid #276d9b;outline-offset:3px}.jump-links-container .jump-links-box{display:block;width:0;height:0;position:absolute}.jump-links-container .jump-links-box .jump-link-item{position:fixed;display:block;z-index:1001}.jump-links-container .jump-links-box .jump-link{z-index:1002;position:fixed;display:block;overflow:hidden;top:10px;left:10px;width:0;padding:0 !important;font-size:2.4rem !important}.jump-links-container .jump-links-box .jump-link:focus{width:auto;height:auto;padding:30px !important;background:#f3f1ef;color:#222 !important;border:3px solid #222;outline:none;text-shadow:none !important}.jump-links-container .jump-links-box .jump-link:focus:hover{background:#f3f1ef;text-decoration:underline}\\n\\n/*# sourceMappingURL=../../../taoQtiTest/views/css/new-test-runner.css.map */');\n","\ndefine(\"taoQtiTest/loader/taoQtiTestRunner.bundle\", function(){});\n","window.bundles = (window.bundles || []).concat([\"taoItems/loader/taoItemsRunner.min\",\"taoTests/loader/taoTestsRunner.min\",\"taoQtiItem/loader/taoQtiItemRunner.min\"]);\n"],"mappings":"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"} \ No newline at end of file diff --git a/views/js/loader/testPlugins.min.js b/views/js/loader/testPlugins.min.js index 51ddf2d08..119e1ff3e 100644 --- a/views/js/loader/testPlugins.min.js +++ b/views/js/loader/testPlugins.min.js @@ -1,2 +1,2 @@ -define("taoQtiTest/runner/plugins/content/accessibility/focusOnFirstField",["lodash","taoTests/runner/plugin","ckeditor"],function(_,pluginFactory,ckEditor){"use strict";function isIOSDevice(){return /(iPhone|iPad)/i.test(navigator.userAgent)}_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,ckEditor=ckEditor&&Object.prototype.hasOwnProperty.call(ckEditor,"default")?ckEditor["default"]:ckEditor;var focusOnFirstField=pluginFactory({name:"focusOnFirstField",init:function init(){var self=this;isIOSDevice()||this.getTestRunner().after("renderitem",function(){var $input=self.getAreaBroker().getContentArea().find(".qti-itemBody").find("input, textarea, select").not(":input[type=button], :input[type=submit], :input[type=reset]").first(),$cke=$input.closest(".qti-interaction").find(".cke");$cke.length?_.delay(function(){ckEditor.instances[$cke.attr("id").replace(/^cke_/,"")].focus()},100):$input.focus()})}});return focusOnFirstField}),define("taoQtiTest/runner/plugins/content/accessibility/jumplinks/helpers",["exports","i18n"],function(exports,__){"use strict";__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__;const getJumpElementFactory=broker=>({get container(){return broker.getContainer()},get question(){return broker.getContainer().find(".content-wrapper").first()},get navigation(){return broker.getNavigationArea().find(":not(.hidden)[tabindex]").first()},get toolbox(){return broker.getToolboxArea().find(":not(.hidden)[tabindex]").first()},get teststatus(){return broker.getPanelArea().find(":not(.hidden)[tabindex]").first()}}),getItemStatus=item=>item.flagged?__("Flagged for review"):item.answered?__("Answered"):item.viewed?__("Not answered"):__("Not seen"),isReviewPanelHidden=testRunner=>testRunner.getAreaBroker().getPanelArea().find(".qti-navigator").is(".hidden");exports.getItemStatus=getItemStatus,exports.getJumpElementFactory=getJumpElementFactory,exports.isReviewPanelHidden=isReviewPanelHidden,Object.defineProperty(exports,"__esModule",{value:!0})}),define("taoQtiTest/runner/plugins/content/accessibility/jumplinks/jumplinks",["lodash","ui/component","handlebars","lib/handlebars/helpers"],function(_,component,Handlebars,Helpers0){"use strict";function jumplinksTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}function jumplinksFactory(config){const jumplinksBox=component({},defaults).on("render",function(){const behavior=[{selector:"[data-jump=question] ",eventName:"jump",eventParam:"question"},{selector:"[data-jump=navigation]",eventName:"jump",eventParam:"navigation"},{selector:"[data-jump=toolbox]",eventName:"jump",eventParam:"toolbox"},{selector:"[data-jump=teststatus]",eventName:"jump",eventParam:"teststatus"},{selector:"[data-jump=shortcuts]",eventName:"shortcuts",eventParam:"shortcuts"}];_.forEach(behavior,linkDescription=>{const $link=this.getElement().find(linkDescription.selector),handleLink=()=>{this.trigger(linkDescription.eventName,linkDescription.eventParam),this.getElement().find(":focus").blur()};$link&&($link.on("click",handleLink),$link.on("keyup",event=>{const activationKeys=[32,13];activationKeys.includes(event.keyCode)&&handleLink()}))})});return jumplinksBox.setTemplate(jumplinksTpl),_.defer(()=>{jumplinksBox.init(config)}),jumplinksBox}_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,component=component&&Object.prototype.hasOwnProperty.call(component,"default")?component["default"]:component,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){return"hidden"}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",helperMissing=helpers.helperMissing,escapeExpression=this.escapeExpression,functionType="function",self=this,stack1,helper,options;return buffer+="\n",buffer});const defaults={};return jumplinksFactory}),define("taoQtiTest/runner/helpers/map",["lodash"],function(_){"use strict";function getEmptyStats(){return{questions:0,answered:0,flagged:0,viewed:0,total:0,questionsViewed:0}}_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_;var map={getJumps:function getJumps(map){return map&&map.jumps},getParts:function getParts(map){return map&&map.parts},getSections:function getSections(map){var parts=this.getParts(map),result={};return _.forEach(parts,function(part){var sections=part.sections;sections&&_.forEach(sections,function(section){result[section.id]=section})}),result},getActiveItem:function getActiveItem(mapWithActive){var parts=this.getParts(mapWithActive),result={};return _.forEach(parts,function(part){var sections=part.sections;sections&&_.forEach(sections,function(section){if(section.active){const items=section.items;_.forEach(items,function(item){item.active&&(result=item)})}})}),result},getNextSections:function getNextSections(map,sectionId){var sections=this.getSections(map),result={},canList=!1;return _.forEach(sections,function(section){canList&&(result[section.id]=section),section.id===sectionId&&(canList=!0)}),result},getJump:function getJump(map,position){var jumps=this.getJumps(map);return jumps&&jumps[position]},getPart:function getPart(map,partName){var parts=this.getParts(map);return parts&&parts[partName]},getSection:function getSection(map,sectionName){var parts=this.getParts(map),section=null;return _.forEach(parts,function(part){var sections=part.sections;if(sections&§ions[sectionName])return section=sections[sectionName],!1}),section},getItem(map,itemIdentifier){const jump=_.find(this.getJumps(map),{identifier:itemIdentifier});return this.getItemAt(map,jump&&jump.position)},getItemCategories(map,itemIdentifier){const item=this.getItem(map,itemIdentifier);return item&&Array.isArray(item.categories)?item.categories:[]},hasItemCategory(map,itemIdentifier,category){let fuzzyMatch=!!(3elt.replace(taoPrefix,"").replace(/[-_\s]/g,"").toLowerCase();return categories.some(itemCategory=>normalize(itemCategory)===normalize(category))}return!1},getTestStats:function getTestStats(map){return map&&map.stats},getPartStats:function getPartStats(map,partName){var part=this.getPart(map,partName);return part&&part.stats},getSectionStats:function getSectionStats(map,sectionName){var section=this.getSection(map,sectionName);return section&§ion.stats},getScopeStats:function getScopeStats(map,position,scope){var jump=this.getJump(map,position);switch(scope){case"section":case"testSection":return this.getSectionStats(map,jump&&jump.section);case"part":case"testPart":return this.getPartStats(map,jump&&jump.part);case"testWithoutInaccessibleItems":{const testStats=this.getTestStats(map),{position:currentPartPosition,isLinear:isCurrentPartLinear}=this.getPart(map,jump&&jump.part),parts=Object.values(this.getParts(map)).filter(_ref=>{let{position:partPosition}=_ref;return partPositionb-a),linearPartIndex=isCurrentPartLinear?0:parts.findIndex(_ref2=>{let{isLinear}=_ref2;return isLinear});if(-1===linearPartIndex)return testStats;const inaccessibleParts=parts.slice(linearPartIndex),countOfInaccessibleUnasweredQestions=inaccessibleParts.reduce((acc,_ref3)=>{let{stats:{questions,answered}}=_ref3;return acc+(questions-answered)},0),countOfInaccessibleFlaggedQestions=inaccessibleParts.reduce((acc,_ref4)=>{let{stats:{flagged}}=_ref4;return acc+flagged},0);return Object.assign({},testStats,{answered:testStats.answered+countOfInaccessibleUnasweredQestions,flagged:testStats.flagged-countOfInaccessibleFlaggedQestions})}default:case"test":return this.getTestStats(map)}},getScopeMap:function getScopeMap(map,position,scope){var scopeMap=_.cloneDeep(map||{}),jump=this.getJump(scopeMap,position),part=this.getPart(scopeMap,jump&&jump.part),section=this.getSection(scopeMap,jump&&jump.section);return scope&&"test"!==scope&&(scopeMap.parts={},part&&(scopeMap.parts[jump.part]=part)),part&&("section"===scope||"testSection"===scope)&&(part.sections={},section&&(part.sections[jump.section]=section)),section&&(section.stats=this.computeItemStats(section.items)),part&&(part.stats=this.computeStats(part.sections)),scopeMap.stats=this.computeStats(scopeMap.parts),scopeMap},getScopeMapFromContext:function getScopeMapFromContext(map,context,scope){var scopeMap=_.cloneDeep(map||{}),part,section;return context&&context.testPartId&&(part=this.getPart(scopeMap,context.testPartId)),context&&context.sectionId&&(section=this.getSection(scopeMap,context.sectionId)),scope&&"test"!==scope&&(scopeMap.parts={},part&&(scopeMap.parts[context.testPartId]=part)),part&&("section"===scope||"testSection"===scope)&&(part.sections={},section&&(part.sections[context.sectionId]=section)),section&&(section.stats=this.computeItemStats(section.items)),part&&(part.stats=this.computeStats(part.sections)),scopeMap.stats=this.computeStats(scopeMap.parts),scopeMap},getItemPart:function getItemPart(map,position){var jump=this.getJump(map,position);return this.getPart(map,jump&&jump.part)},getItemSection:function getItemSection(map,position){var jump=this.getJump(map,position),part=this.getPart(map,jump&&jump.part),sections=part&&part.sections;return sections&§ions[jump&&jump.section]},getItemAt:function getItemAt(map,position){var jump=this.getJump(map,position),part=this.getPart(map,jump&&jump.part),sections=part&&part.sections,section=sections&§ions[jump&&jump.section],items=section&§ion.items;return items&&items[jump&&jump.identifier]},getItemIdentifier:function getItemIdentifier(map,position){var item;return item=_.isFinite(position)?this.getItemAt(map,position):this.getItem(map,position),item&&item.id},each:function each(map,callback){return _.isFunction(callback)&&_.forEach(map&&map.parts,function(part){_.forEach(part&&part.sections,function(section){_.forEach(section&§ion.items,function(item){callback(item,section,part,map)})})}),map},updateItemStats:function updateItemStats(map,position){var jump=this.getJump(map,position),part=this.getPart(map,jump&&jump.part),sections=part&&part.sections,section=sections&§ions[jump&&jump.section];return section&&(section.stats=this.computeItemStats(section.items)),part&&(part.stats=this.computeStats(part.sections)),map&&(map.stats=this.computeStats(map.parts)),map},computeItemStats:function computeItemStats(items){return _.reduce(items,function accStats(acc,item){return item.informational||(acc.questions++,item.answered&&acc.answered++,item.viewed&&acc.questionsViewed++),item.flagged&&acc.flagged++,item.viewed&&acc.viewed++,acc.total++,acc},getEmptyStats())},computeStats:function computeStats(collection){return _.reduce(collection,function accStats(acc,item){return acc.questions+=item.stats.questions,acc.answered+=item.stats.answered,acc.flagged+=item.stats.flagged,acc.viewed+=item.stats.viewed,acc.total+=item.stats.total,acc.questionsViewed+=item.stats.questionsViewed,acc},getEmptyStats())},patch:function patch(currentMap,partialMap){var self=this,targetMap;if(!_.isPlainObject(partialMap)||!partialMap.parts)throw new TypeError("Invalid test map format");return currentMap&&"test"!==partialMap.scope?(targetMap=_.cloneDeep(currentMap),_.forEach(partialMap.parts,function(partialPart,targetPartId){"part"===partialMap.scope&&(targetMap.parts[targetPartId]=_.cloneDeep(partialPart)),"section"===partialMap.scope&&_.forEach(partialPart.sections,function(partialSection,targetSectionId){targetMap.parts[targetPartId].sections[targetSectionId]=_.cloneDeep(partialSection),targetMap.parts[targetPartId].sections[targetSectionId].stats=self.computeItemStats(targetMap.parts[targetPartId].sections[targetSectionId].items)}),targetMap.parts[targetPartId].stats=self.computeStats(targetMap.parts[targetPartId].sections)}),targetMap.stats=this.computeStats(targetMap.parts)):targetMap=_.cloneDeep(partialMap),targetMap=this.reindex(targetMap),targetMap},reindex:function reindex(map){var offset=0,offsetPart=0,offsetSection=0,lastPartId,lastSectionId;if(!_.isPlainObject(map)||!map.parts)throw new TypeError("Invalid test map format");return map.jumps=[],_.sortBy(map&&map.parts,"position").forEach(function(part){_.sortBy(part&&part.sections,"position").forEach(function(section){_.sortBy(section&§ion.items,"position").forEach(function(item){lastPartId!==part.id&&(offsetPart=0,lastPartId=part.id,part.position=offset),lastSectionId!==section.id&&(offsetSection=0,lastSectionId=section.id,section.position=offset),item.position=offset,item.index=offsetSection+1,item.positionInPart=offsetPart,item.positionInSection=offsetSection,map.jumps[offset]={identifier:item.id,section:section.id,part:part.id,position:offset},offset++,offsetSection++,offsetPart++})})}),map},createJumpTable:function createJumpTable(map){if(!_.isPlainObject(map)||!map.parts)throw new TypeError("Invalid test map format");return map.jumps=[],this.each(map,function(item,section,part){var offset=item.position;map.jumps[offset]={identifier:item.id,section:section.id,part:part.id,position:offset}}),map}};return map}),define("taoQtiTest/runner/helpers/isReviewPanelEnabled",["taoQtiTest/runner/helpers/map"],function(mapHelper){"use strict";function isReviewPanelEnabled(runner){const reviewEnabled=mapHelper.hasItemCategory(runner.getTestMap(),runner.getTestContext().itemIdentifier,"reviewScreen",!0),itemReviewEnabled=runner.getOptions().review.enabled;return reviewEnabled&&itemReviewEnabled}return mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper,isReviewPanelEnabled}),define("taoQtiTest/runner/plugins/content/accessibility/jumplinks/shortcuts",["i18n","lodash","ui/component","ui/keyNavigation/navigator","ui/keyNavigation/navigableDomElement","handlebars","lib/handlebars/helpers"],function(__,_,component,keyNavigator,navigableDomElement,Handlebars,Helpers0){"use strict";function shortcutsTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}function shortcutsBoxFactory(config){const ESK_KEY_CODE=27,shortcutsBox=component({},defaults).on("render",function(){const $element=this.getElement(),$closeBtn=$element.find(".btn-close"),$keyNavigationItems=this.getElement().find(".shortcuts-list, .btn-close");$closeBtn.on("click",()=>this.trigger("close")),$element.on("click",e=>{$element.is(e.target)&&this.trigger("close")}),$element.on("keyup",e=>{e.keyCode===ESK_KEY_CODE&&this.trigger("close")}),this.navigator=keyNavigator({elements:navigableDomElement.createFromDoms($keyNavigationItems),propagateTab:!1}).on("tab",function(){this.setCursorAt(1)}).on("shift+tab",function(){this.setCursorAt(1)}).on("blur",()=>{_.defer(()=>{this.navigator.isFocused()||this.navigator.focus()})}).on("activate",function(cursor){cursor.navigable.getElement().click()}),this.navigator.first()}).on("destroy",function(){this.navigator.destroy(),this.getElement().remove()});return shortcutsBox.setTemplate(shortcutsTpl),shortcutsBox.init(config),shortcutsBox}__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,component=component&&Object.prototype.hasOwnProperty.call(component,"default")?component["default"]:component,keyNavigator=keyNavigator&&Object.prototype.hasOwnProperty.call(keyNavigator,"default")?keyNavigator["default"]:keyNavigator,navigableDomElement=navigableDomElement&&Object.prototype.hasOwnProperty.call(navigableDomElement,"default")?navigableDomElement["default"]:navigableDomElement,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var buffer="",stack1,helper;return buffer+="\n
          \n

          ",(helper=helpers.label)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.label,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"

          \n
            \n ",stack1=helpers.each.call(depth0,depth0&&depth0.shortcuts,{hash:{},inverse:self.noop,fn:self.program(2,program2,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n
          \n
          \n ",buffer}function program2(depth0,data){var buffer="",stack1,helper;return buffer+="\n
        • \n \n ",(helper=helpers.shortcut)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.shortcut,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\n \n \n ",(helper=helpers.label)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.label,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\n \n
        • \n ",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",functionType="function",escapeExpression=this.escapeExpression,self=this,helperMissing=helpers.helperMissing,stack1,helper,options;return buffer+="
          \n
          \n

          \n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Keyboard Navigation",options):helperMissing.call(depth0,"__","Keyboard Navigation",options)))+"\n

          \n
          \n

          \n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Keyboard shortcuts for the Accessibility Tools are available to the Test-taker.",options):helperMissing.call(depth0,"__","Keyboard shortcuts for the Accessibility Tools are available to the Test-taker.",options)))+"\n

          \n

          \n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"You can magnify the content by up to 200%. Check your browser settings to find out how to do it.",options):helperMissing.call(depth0,"__","You can magnify the content by up to 200%. Check your browser settings to find out how to do it.",options)))+"\n

          \n
          \n \n ",stack1=helpers.each.call(depth0,depth0&&depth0.shortcutsGroups,{hash:{},inverse:self.noop,fn:self.program(1,program1,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n
          \n
          \n",buffer});const defaults={shortcutsGroups:[{id:"navigation-shortcuts",label:__("Navigation shortcuts"),shortcuts:[{id:"next",shortcut:"ALT + Shift + N",label:__("Go to the next question")},{id:"previous",shortcut:"ALT + Shift + P",label:__("Go to the previous question")},{id:"current",shortcut:"ALT + Shift + Q",label:__("Go to the current question")},{id:"top",shortcut:"ALT + Shift + T",label:__("Go to the top of the page")}]}]};return shortcutsBoxFactory}),define("taoQtiTest/runner/plugins/content/accessibility/jumplinks/plugin",["i18n","jquery","taoTests/runner/plugin","taoQtiTest/runner/helpers/isReviewPanelEnabled","taoQtiTest/runner/plugins/content/accessibility/jumplinks/helpers","taoQtiTest/runner/plugins/content/accessibility/jumplinks/jumplinks","taoQtiTest/runner/plugins/content/accessibility/jumplinks/shortcuts","util/shortcut","util/namespace","handlebars","lib/handlebars/helpers"],function(__,$$1,pluginFactory,isReviewPanelEnabled,helpers,jumplinksFactory,shortcutsFactory,shortcut,namespaceHelper,Handlebars,Helpers0){"use strict";function containerTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,$$1=$$1&&Object.prototype.hasOwnProperty.call($$1,"default")?$$1["default"]:$$1,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,isReviewPanelEnabled=isReviewPanelEnabled&&Object.prototype.hasOwnProperty.call(isReviewPanelEnabled,"default")?isReviewPanelEnabled["default"]:isReviewPanelEnabled,jumplinksFactory=jumplinksFactory&&Object.prototype.hasOwnProperty.call(jumplinksFactory,"default")?jumplinksFactory["default"]:jumplinksFactory,shortcutsFactory=shortcutsFactory&&Object.prototype.hasOwnProperty.call(shortcutsFactory,"default")?shortcutsFactory["default"]:shortcutsFactory,shortcut=shortcut&&Object.prototype.hasOwnProperty.call(shortcut,"default")?shortcut["default"]:shortcut,namespaceHelper=namespaceHelper&&Object.prototype.hasOwnProperty.call(namespaceHelper,"default")?namespaceHelper["default"]:namespaceHelper,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){return this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),"\n"}),plugin=pluginFactory({name:"jumplinks",init(){const testRunner=this.getTestRunner(),item=testRunner.getCurrentItem(),config={isReviewPanelEnabled:isReviewPanelEnabled(testRunner),questionStatus:helpers.getItemStatus(item)},testRunnerOptions=testRunner.getOptions(),pluginShortcuts=(testRunnerOptions.shortcuts||{})[this.getName()]||{},areaBroker=this.getAreaBroker(),getJumpElement=helpers.getJumpElementFactory(areaBroker),shortcutsConfig=-1===navigator.appVersion.indexOf("Mac")?{}:{shortcutsGroups:[{id:"navigation-shortcuts",label:__("Navigation shortcuts"),shortcuts:[{id:"next",shortcut:"OPTION + Shift + N",label:__("Go to the next question")},{id:"previous",shortcut:"OPTION + Shift + P",label:__("Go to the previous question")},{id:"current",shortcut:"OPTION + Shift + Q",label:__("Go to the current question")},{id:"top",shortcut:"OPTION + Shift + T",label:__("Go to the top of the page")}]}]};testRunnerOptions.allowShortcuts&&(pluginShortcuts.goToTop&&shortcut.add(namespaceHelper.namespaceAll(pluginShortcuts.goToTop,this.getName(),!0),function(){$$1("[tabindex]").first().focus()},{avoidInput:!0,prevent:!0}),pluginShortcuts.goToQuestion&&shortcut.add(namespaceHelper.namespaceAll(pluginShortcuts.goToQuestion,this.getName(),!0),function(){getJumpElement.question.focus()},{avoidInput:!0,prevent:!0})),this.jumplinks=jumplinksFactory(config).on("render",()=>{this.jumplinks.on("jump",jumpTo=>{const $element=getJumpElement[jumpTo];$element.focus()}),this.jumplinks.on("shortcuts",()=>{this.shortcuts||(this.shortcuts=shortcutsFactory(shortcutsConfig),this.shortcuts.render(this.getAreaBroker().getControlArea()),this.shortcuts.on("close",()=>{this.shortcuts.destroy(),this.shortcuts=null}))})}).on("update",function update(params){this.trigger("changeReviewPanel",params.isReviewPanelEnabled),this.trigger("changeQuesitionStatus",params.questionStatus)}).on("changeReviewPanel",function changeReviewPanel(enabled){const elem=this.getElement(),panelJumplink=elem.find("[data-jump=\"teststatus\"]").parent();enabled?panelJumplink.removeClass("hidden"):panelJumplink.addClass("hidden")}).on("changeQuesitionStatus",function changeQuesitionStatus(questionStatus){const elem=this.getElement(),text=`${__("Question")} - ${questionStatus}`;elem.find("[data-jump=\"question\"] > b").text(text)}),testRunner.on("renderitem",()=>{const currentItem=testRunner.getCurrentItem(),updatedConfig={isReviewPanelEnabled:!helpers.isReviewPanelHidden(testRunner)&&isReviewPanelEnabled(testRunner),questionStatus:helpers.getItemStatus(currentItem)},announcedText=__("Item %s loaded",currentItem.position);let $announce=$$1("[aria-live=polite][role=alert]").first();1!==$announce.length&&($announce=$$1("
          "),$$1("main").first().append($announce)),$announce.text(announcedText),this.jumplinks.trigger("update",updatedConfig)}).on("tool-flagitem",()=>{const currentItem=testRunner.getCurrentItem(),questionStatus=helpers.getItemStatus(Object.assign({},currentItem,{flagged:!currentItem.flagged}));this.jumplinks.trigger("changeQuesitionStatus",questionStatus)}).on("tool-reviewpanel",()=>{const wasHidden=helpers.isReviewPanelHidden(testRunner);this.jumplinks.trigger("changeReviewPanel",wasHidden)}).after("renderitem",()=>{getJumpElement.question.attr("tabindex","-1").focus()})},render:function render(){const jumplinksContainer=$$1(containerTpl());$$1(".content-wrap").prepend(jumplinksContainer),this.jumplinks.render(jumplinksContainer)}});return plugin}),define("taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/headerNavigation",["jquery","ui/keyNavigation/navigator","ui/keyNavigation/navigableDomElement","taoQtiTest/runner/plugins/content/accessibility/keyNavigation/helpers"],function($,keyNavigator,navigableDomElement,helpers){"use strict";$=$&&Object.prototype.hasOwnProperty.call($,"default")?$["default"]:$,keyNavigator=keyNavigator&&Object.prototype.hasOwnProperty.call(keyNavigator,"default")?keyNavigator["default"]:keyNavigator,navigableDomElement=navigableDomElement&&Object.prototype.hasOwnProperty.call(navigableDomElement,"default")?navigableDomElement["default"]:navigableDomElement;const groupId="header-toolbar";var headerNavigation={name:"header",init(){const config=this.getConfig(),$headerBar=$("header"),$headerElements=$headerBar.find("a:visible"),registerHeaderNavigator=(id,group,$elements)=>{const elements=navigableDomElement.createFromDoms($elements);if(elements.length){const navigator=keyNavigator({id,group,elements,propagateTab:!1,defaultPosition:0});helpers.setupItemsNavigator(navigator,config),helpers.setupClickableNavigator(navigator),this.keyNavigators.push(navigator)}};return this.keyNavigators=[],config.flatNavigation?$headerElements.each((index,element)=>registerHeaderNavigator(`${groupId}-${index}`,$headerBar,$(element))):registerHeaderNavigator(groupId,$headerBar,$headerElements),this},getNavigators(){return this.keyNavigators},destroy(){return this.keyNavigators.forEach(navigator=>navigator.destroy()),this.keyNavigators=[],this}};return headerNavigation}),define("taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/toolbarNavigation",["lodash","jquery","ui/keyNavigation/navigator","ui/keyNavigation/navigableDomElement","taoQtiTest/runner/plugins/content/accessibility/keyNavigation/helpers"],function(_,$,keyNavigator,navigableDomElement,helpers){"use strict";_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,$=$&&Object.prototype.hasOwnProperty.call($,"default")?$["default"]:$,keyNavigator=keyNavigator&&Object.prototype.hasOwnProperty.call(keyNavigator,"default")?keyNavigator["default"]:keyNavigator,navigableDomElement=navigableDomElement&&Object.prototype.hasOwnProperty.call(navigableDomElement,"default")?navigableDomElement["default"]:navigableDomElement;const groupId="bottom-toolbar";var toolbarNavigation={name:"toolbar",init(){const config=this.getConfig(),$navigationBar=this.getTestRunner().getAreaBroker().getContainer().find(".bottom-action-bar");let $toolbarElements=$navigationBar.find(".action:not(.btn-group):visible, .action.btn-group .li-inner:visible");config.reverseBottomToolbar&&($toolbarElements=$($toolbarElements.get().reverse()));const registerToolbarNavigator=(id,group,$elements)=>{const elements=navigableDomElement.createFromDoms($elements);if(elements.length){const navigator=keyNavigator({id,group,elements,propagateTab:!1,defaultPosition(navigableElements){let pos=0;return config.autoFocus&&(pos=navigableElements.length-1,_.forEach(navigableElements,(navigable,i)=>{const $element=navigable.getElement();("move-forward"===$element.data("control")||"move-end"===$element.data("control"))&&(pos=i)})),pos}});helpers.setupItemsNavigator(navigator,config),helpers.setupClickableNavigator(navigator),this.keyNavigators.push(navigator)}};return this.keyNavigators=[],config.flatNavigation?$toolbarElements.each((index,element)=>registerToolbarNavigator(`${groupId}-${index}`,$navigationBar,$(element))):registerToolbarNavigator(groupId,$navigationBar,$toolbarElements),this},getNavigators(){return this.keyNavigators},destroy(){return this.keyNavigators.forEach(navigator=>navigator.destroy()),this.keyNavigators=[],this}};return toolbarNavigation}),define("taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/topToolbarNavigation",["jquery","ui/keyNavigation/navigator","ui/keyNavigation/navigableDomElement","taoQtiTest/runner/plugins/content/accessibility/keyNavigation/helpers"],function($,keyNavigator,navigableDomElement,helpers){"use strict";$=$&&Object.prototype.hasOwnProperty.call($,"default")?$["default"]:$,keyNavigator=keyNavigator&&Object.prototype.hasOwnProperty.call(keyNavigator,"default")?keyNavigator["default"]:keyNavigator,navigableDomElement=navigableDomElement&&Object.prototype.hasOwnProperty.call(navigableDomElement,"default")?navigableDomElement["default"]:navigableDomElement;const groupId="top-toolbar";var topToolbarNavigation={name:"top-toolbar",init(){const config=this.getConfig(),$topToolbar=this.getTestRunner().getAreaBroker().getContainer().find(".top-action-bar"),$toolbarElements=$topToolbar.find(".timer-toggler"),registerTopToolbarNavigator=(id,group,$elements)=>{const elements=navigableDomElement.createFromDoms($elements);if(elements.length){const navigator=keyNavigator({id,group,elements,propagateTab:!1});helpers.setupItemsNavigator(navigator,config),helpers.setupClickableNavigator(navigator),this.keyNavigators.push(navigator)}};return this.keyNavigators=[],$toolbarElements.each((index,element)=>registerTopToolbarNavigator(`${groupId}-${index}`,$topToolbar,$(element))),this},getNavigators(){return this.keyNavigators},destroy(){return this.keyNavigators.forEach(navigator=>navigator.destroy()),this.keyNavigators=[],this}};return topToolbarNavigation}),define("taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/navigatorNavigation",["lodash","ui/keyNavigation/navigator","ui/keyNavigation/navigableDomElement","taoQtiTest/runner/plugins/content/accessibility/keyNavigation/helpers"],function(_,keyNavigator,navigableDomElement,helpers){"use strict";function initFizzy(config,$panel,$navigator,keyNavigators,managedNavigators){let itemsNavigator;const $navigatorTree=$panel.find(".qti-navigator-tree"),$enabledItems=$navigator.find(".qti-navigator-tree .buttonlist-item:not(.disabled) .buttonlist-btn"),navigableItems=navigableDomElement.createFromDoms($enabledItems),getItemFromNavigable=navigable=>navigable.getElement().parent();navigableItems.length&&(itemsNavigator=keyNavigator({id:"navigator-items",elements:navigableItems,group:$navigatorTree,loop:!0,defaultPosition(navigableElements){let pos=_.findIndex(navigableElements,navigable=>{const $parent=getItemFromNavigable(navigable);if($parent.hasClass("buttonlist-item-active")&&$parent.is(":visible"))return!0});return 0<=pos?pos:0}}).on("focus",cursor=>{getItemFromNavigable(cursor.navigable).addClass("key-navigation-highlight")}).on("blur",cursor=>{getItemFromNavigable(cursor.navigable).removeClass("key-navigation-highlight")}),helpers.setupItemsNavigator(itemsNavigator,{keyNextItem:config.keyNextItem,keyPrevItem:config.keyPrevItem}),helpers.setupClickableNavigator(itemsNavigator),keyNavigators.push(itemsNavigator),managedNavigators.push(itemsNavigator))}_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,keyNavigator=keyNavigator&&Object.prototype.hasOwnProperty.call(keyNavigator,"default")?keyNavigator["default"]:keyNavigator,navigableDomElement=navigableDomElement&&Object.prototype.hasOwnProperty.call(navigableDomElement,"default")?navigableDomElement["default"]:navigableDomElement;const selectors={filters:".qti-navigator-filters .qti-navigator-filter",enabledItems:".qti-navigator-tree .qti-navigator-item:not(.disabled) .qti-navigator-label"};var navigatorNavigation={name:"navigator",init(){const config=this.getConfig(),$panel=this.getTestRunner().getAreaBroker().getPanelArea(),$navigator=$panel.find(".qti-navigator"),isFizzyLayout=$navigator.hasClass("qti-navigator-fizzy");if(this.managedNavigators=[],this.keyNavigators=[],$navigator.length&&!$navigator.hasClass("disabled"))if(isFizzyLayout)initFizzy(config,$panel,$navigator,this.keyNavigators,this.managedNavigators);else{const $testStatusHeader=$navigator.find(".qti-navigator-info.collapsible > .qti-navigator-label"),navigableTestStatus=navigableDomElement.createFromDoms($testStatusHeader);if($testStatusHeader.addClass("key-navigation-actionable"),navigableTestStatus.length){const testStatusNavigation=keyNavigator({keepState:config.keepState,id:"navigator-test-status",propagateTab:!1,elements:navigableTestStatus,group:$testStatusHeader});helpers.setupItemsNavigator(testStatusNavigation,{keyNextItem:config.keyNextTab||config.keyNextItem,keyPrevItem:config.keyPrevTab||config.keyPrevItem}),this.keyNavigators.push(testStatusNavigation),this.managedNavigators.push(testStatusNavigation)}let itemListingVisited=!1,filtersNavigator,itemsNavigator,currentFilter;const $filters=$navigator.find(selectors.filters),navigableFilters=navigableDomElement.createFromDoms($filters);navigableFilters.length&&(filtersNavigator=keyNavigator({keepState:config.keepState,id:"navigator-filters",propagateTab:!1,elements:navigableFilters,group:$navigator.find(".qti-navigator-filters")}),helpers.setupItemsNavigator(filtersNavigator,{keyNextItem:config.keyNextTab||config.keyNextItem,keyPrevItem:config.keyPrevTab||config.keyPrevItem}),helpers.setupClickableNavigator(filtersNavigator),config.keepState&&filtersNavigator.on("focus",cursor=>{if(config.keepState){const $element=cursor.navigable.getElement(),filter=$element.data("mode");$element.click(),currentFilter!==filter&&(itemListingVisited=!1),currentFilter=filter}}),config.keyNextContent&&filtersNavigator.on(config.keyNextContent,elem=>{helpers.allowedToNavigateFrom(elem)&&itemsNavigator&&_.defer(()=>{itemListingVisited?itemsNavigator.first():itemsNavigator.focus()})}),config.keyPrevContent&&filtersNavigator.on(config.keyPrevContent,elem=>{helpers.allowedToNavigateFrom(elem)&&itemsNavigator&&_.defer(()=>{itemsNavigator.last()})}),this.keyNavigators.push(filtersNavigator),this.managedNavigators.push(filtersNavigator));const $navigatorTree=$panel.find(".qti-navigator-tree"),$trees=$navigator.find(selectors.enabledItems),navigableTrees=navigableDomElement.createFromDoms($trees);$trees.first().addClass("key-navigation-scrollable-up"),$trees.last().addClass("key-navigation-scrollable-down"),navigableTrees.length&&(itemsNavigator=keyNavigator({id:"navigator-items",elements:navigableTrees,group:$navigatorTree,defaultPosition(navigableElements){let pos=0;return(config.flatNavigation||"flagged"!==currentFilter)&&(pos=_.findIndex(navigableElements,navigable=>{const $parent=navigable.getElement().parent(".qti-navigator-item");if($parent.hasClass("active")&&$parent.is(":visible"))return!0})),pos}}).on("focus",cursor=>{itemListingVisited=!0,cursor.navigable.getElement().parent().addClass("key-navigation-highlight")}).on("blur",cursor=>{cursor.navigable.getElement().parent().removeClass("key-navigation-highlight")}),helpers.setupItemsNavigator(itemsNavigator,{keyNextItem:config.keyNextContent||config.keyNextItem,keyPrevItem:config.keyPrevContent||config.keyPrevItem}),helpers.setupClickableNavigator(itemsNavigator),config.keepState&&itemsNavigator.on("lowerbound upperbound",()=>{filtersNavigator&&filtersNavigator.focus()}),config.keyNextTab&&config.keyPrevTab?(itemsNavigator.on(config.keyNextTab,function(elem){helpers.allowedToNavigateFrom(elem)&&filtersNavigator&&filtersNavigator.focus().next()}),itemsNavigator.on(config.keyPrevTab,function(elem){helpers.allowedToNavigateFrom(elem)&&filtersNavigator&&filtersNavigator.focus().previous()})):this.keyNavigators.push(itemsNavigator),this.managedNavigators.push(itemsNavigator))}return this},getNavigators(){return this.keyNavigators},destroy(){return this.managedNavigators.forEach(navigator=>navigator.destroy()),this.managedNavigators=[],this.keyNavigators=[],this}};return navigatorNavigation}),define("taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/pageNavigation",["jquery","ui/keyNavigation/navigator","ui/keyNavigation/navigableDomElement","taoQtiTest/runner/plugins/content/accessibility/keyNavigation/helpers"],function($,keyNavigator,navigableDomElement,helpers){"use strict";$=$&&Object.prototype.hasOwnProperty.call($,"default")?$["default"]:$,keyNavigator=keyNavigator&&Object.prototype.hasOwnProperty.call(keyNavigator,"default")?keyNavigator["default"]:keyNavigator,navigableDomElement=navigableDomElement&&Object.prototype.hasOwnProperty.call(navigableDomElement,"default")?navigableDomElement["default"]:navigableDomElement;const groupId="item-content-wrapper";var pageNavigation={name:"page",init(){const config=this.getConfig();return this.keyNavigators=[],this.getTestRunner().getAreaBroker().getContainer().find(".content-wrapper").addClass("key-navigation-scrollable").each((i,el)=>{const $element=$(el),navigator=keyNavigator({id:`${groupId}-${this.keyNavigators.length}`,elements:navigableDomElement.createFromDoms($element),group:$element,propagateTab:!1});helpers.setupItemsNavigator(navigator,config),this.keyNavigators.push(navigator)}),this},getNavigators(){return this.keyNavigators},destroy(){return this.keyNavigators.forEach(navigator=>navigator.destroy()),this.keyNavigators=[],this}};return pageNavigation}),define("taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/rubricsNavigation",["jquery","ui/keyNavigation/navigator","ui/keyNavigation/navigableDomElement","taoQtiTest/runner/plugins/content/accessibility/keyNavigation/helpers"],function($,keyNavigator,navigableDomElement,helpers){"use strict";$=$&&Object.prototype.hasOwnProperty.call($,"default")?$["default"]:$,keyNavigator=keyNavigator&&Object.prototype.hasOwnProperty.call(keyNavigator,"default")?keyNavigator["default"]:keyNavigator,navigableDomElement=navigableDomElement&&Object.prototype.hasOwnProperty.call(navigableDomElement,"default")?navigableDomElement["default"]:navigableDomElement;const groupId="rubric-element-navigation-group";var rubricsNavigation={name:"rubrics",init(){const config=this.getConfig();return this.keyNavigators=[],this.getTestRunner().getAreaBroker().getContainer().find(".qti-rubricBlock").addClass("key-navigation-scrollable").each((i,el)=>{const $element=$(el),navigator=keyNavigator({id:`${groupId}-${this.keyNavigators.length}`,elements:navigableDomElement.createFromDoms($element),group:$element,propagateTab:!1});helpers.setupItemsNavigator(navigator,config),this.keyNavigators.push(navigator)}),this},getNavigators(){return this.keyNavigators},destroy(){return this.keyNavigators.forEach(navigator=>navigator.destroy()),this.keyNavigators=[],this}};return rubricsNavigation}),define("taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/itemNavigation",["jquery","ui/scroller","ui/keyNavigation/navigator","ui/keyNavigation/navigableDomElement","taoQtiTest/runner/plugins/content/accessibility/keyNavigation/helpers"],function($,scrollHelper,keyNavigator,navigableDomElement,helpers){"use strict";$=$&&Object.prototype.hasOwnProperty.call($,"default")?$["default"]:$,scrollHelper=scrollHelper&&Object.prototype.hasOwnProperty.call(scrollHelper,"default")?scrollHelper["default"]:scrollHelper,keyNavigator=keyNavigator&&Object.prototype.hasOwnProperty.call(keyNavigator,"default")?keyNavigator["default"]:keyNavigator,navigableDomElement=navigableDomElement&&Object.prototype.hasOwnProperty.call(navigableDomElement,"default")?navigableDomElement["default"]:navigableDomElement;const addLabelledByAttribute=cursor=>{const $element=cursor.navigable.getElement(),value=$element.attr("value"),name=$element.attr("name");name&&$element.attr("aria-labelledby",`${name.replace("response-","choice-")}-${value}`)},removeLabelledByAttribute=cursor=>{const $element=cursor.navigable.getElement();$element.removeAttr("aria-labelledby","")},manageLabelledByAttribute=navigator=>{navigator&&(navigator.on("focus",addLabelledByAttribute),navigator.on("blur",removeLabelledByAttribute))};var itemNavigation={name:"item",init(){var _this=this;this.keyNavigators=[];const config=this.getConfig(),$content=this.getTestRunner().getAreaBroker().getContentArea(),getQtiChoice=function(cursor){return cursor&&cursor.navigable.getElement().closest(".qti-choice")},addNavigator=function($elements,group){let loop=!!(2scrollHelper.scrollTo(getQtiChoice(cursor).addClass("key-navigation-highlight"),$content.closest(".content-wrapper"))).on("blur",cursor=>getQtiChoice(cursor).removeClass("key-navigation-highlight"))),navigator},$qtiInteractions=$content.find(".key-navigation-focusable,.qti-interaction").filter((i,node)=>!$(node).parents(".qti-interaction").length);return $content.find(".key-navigation-focusable").addClass("key-navigation-scrollable"),$qtiInteractions.each((itemPos,itemElement)=>{const $itemElement=$(itemElement),$choiceInput=$itemElement.find(".qti-choice input"),choiceType=$choiceInput.attr("type");if($itemElement.hasClass("qti-interaction")){$itemElement.find(".key-navigation-focusable").each((navPos,nav)=>{const $nav=$(nav);$nav.closest(".qti-choice").length||addNavigator($nav,$nav)}),$itemElement.off(".keyNavigation");const $inputs=$itemElement.is(":input")?$itemElement:$itemElement.find(":input");if(config.flatNavigation&&(config.flatRadioNavigation||"radio"!==choiceType))$inputs.each((i,input)=>{const navigator=addInputsNavigator($(input),$itemElement);manageLabelledByAttribute(navigator)});else{const navigator=addInputsNavigator($inputs,$itemElement,!0,()=>{let position=-1;return $inputs.each((index,input)=>{input.checked&&(position=index)}),position});manageLabelledByAttribute(navigator),navigator&&config.wcagBehavior&&navigator.on("focus",cursor=>{const $element=cursor.navigable.getElement();$element.is(":checked")||$element.click()})}}else addNavigator($itemElement,$itemElement)}),this},getNavigators(){return this.keyNavigators},destroy(){return this.keyNavigators.forEach(navigator=>navigator.destroy()),this.keyNavigators=[],this}};return itemNavigation}),define("taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/linearItemNavigation",["jquery","ui/keyNavigation/navigator","ui/keyNavigation/navigableDomElement","taoQtiTest/runner/plugins/content/accessibility/keyNavigation/helpers"],function($,keyNavigator,navigableDomElement,helpers){"use strict";$=$&&Object.prototype.hasOwnProperty.call($,"default")?$["default"]:$,keyNavigator=keyNavigator&&Object.prototype.hasOwnProperty.call(keyNavigator,"default")?keyNavigator["default"]:keyNavigator,navigableDomElement=navigableDomElement&&Object.prototype.hasOwnProperty.call(navigableDomElement,"default")?navigableDomElement["default"]:navigableDomElement;var linearItemNavigation={name:"linearItem",init(){const config=this.getConfig(),$content=this.getTestRunner().getAreaBroker().getContentArea(),$qtiInteractions=$content.find(".key-navigation-focusable,.qti-interaction").filter((i,node)=>!$(node).parents(".qti-interaction").length),$qtiChoices=$qtiInteractions.find(".qti-choice");let $lastParent=null,list=[];const setupListNavigator=()=>{const navigator=keyNavigator({elements:list,propagateTab:!1});helpers.setupItemsNavigator(navigator,config),this.choicesNavigators.push(navigator)};return this.keyNavigators=[],this.choicesNavigators=[],$content.find(".key-navigation-focusable").addClass("key-navigation-scrollable"),$qtiChoices.each((i,el)=>{const $itemElement=$(el),$parent=$itemElement.parent(),choiceNavigator=keyNavigator({elements:navigableDomElement.createFromDoms($itemElement),group:$itemElement,propagateTab:!1});helpers.setupClickableNavigator(choiceNavigator),$lastParent&&!$parent.is($lastParent)&&(setupListNavigator(),list=[]),this.keyNavigators.push(choiceNavigator),list.push(choiceNavigator),$lastParent=$parent}),list.length&&(setupListNavigator(),list=[]),this},getNavigators(){return this.keyNavigators},destroy(){return this.keyNavigators.forEach(navigator=>navigator.destroy()),this.choicesNavigators.forEach(navigator=>navigator.destroy()),this.choicesNavigators=[],this.keyNavigators=[],this}};return linearItemNavigation}),define("taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/stimulusNavigation",["jquery","i18n","ui/keyNavigation/navigator","ui/keyNavigation/navigableDomElement","taoQtiTest/runner/plugins/content/accessibility/keyNavigation/helpers"],function($,__,keyNavigator,navigableDomElement,helpers){"use strict";$=$&&Object.prototype.hasOwnProperty.call($,"default")?$["default"]:$,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,keyNavigator=keyNavigator&&Object.prototype.hasOwnProperty.call(keyNavigator,"default")?keyNavigator["default"]:keyNavigator,navigableDomElement=navigableDomElement&&Object.prototype.hasOwnProperty.call(navigableDomElement,"default")?navigableDomElement["default"]:navigableDomElement;const groupId="stimulus-element-navigation-group";var stimulusNavigation={name:"stimulus",init(){const config=this.getConfig(),$content=this.getTestRunner().getAreaBroker().getContentArea();this.keyNavigators=[];const isEnabledDecorator=element=>{const originalIsEnabled=element.isEnabled;return element.isEnabled=function isEnabled(){if(originalIsEnabled.call(this)){const node=this.getElement().get(0);return node.scrollHeight>node.clientHeight}return!1},element};return $content.find(".stimulus-container").addClass("key-navigation-scrollable").each((i,el)=>{const $element=$(el),elements=navigableDomElement.createFromDoms($element).map(isEnabledDecorator);$element.attr("aria-label",__("Passage"));const navigator=keyNavigator({id:`${groupId}-${i}`,elements,group:$element,propagateTab:!1});helpers.setupItemsNavigator(navigator,config),this.keyNavigators.push(navigator)}),this},getNavigators(){return this.keyNavigators},destroy(){return this.keyNavigators.forEach(navigator=>navigator.destroy()),this.keyNavigators=[],this}};return stimulusNavigation}),define("taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/jumpLinks",["jquery","ui/keyNavigation/navigator","ui/keyNavigation/navigableDomElement","taoQtiTest/runner/plugins/content/accessibility/keyNavigation/helpers"],function($,keyNavigator,navigableDomElement,helpers){"use strict";$=$&&Object.prototype.hasOwnProperty.call($,"default")?$["default"]:$,keyNavigator=keyNavigator&&Object.prototype.hasOwnProperty.call(keyNavigator,"default")?keyNavigator["default"]:keyNavigator,navigableDomElement=navigableDomElement&&Object.prototype.hasOwnProperty.call(navigableDomElement,"default")?navigableDomElement["default"]:navigableDomElement;const groupId="jump-links";var jumpLinks={name:"jump-links",init(){const config=this.getConfig(),$jumpLinksBox=$(".content-wrap"),$links=$jumpLinksBox.find(".jump-link");this.keyNavigators=[];const registerTopToolbarNavigator=(id,group,$elements)=>{const elements=navigableDomElement.createFromDoms($elements);if(elements.length){const navigator=keyNavigator({id,group,elements,propagateTab:!1});helpers.setupItemsNavigator(navigator,config),helpers.setupClickableNavigator(navigator),this.keyNavigators.push(navigator)}};return $links.each((index,element)=>registerTopToolbarNavigator(`${groupId}-${index}`,$jumpLinksBox,$(element))),this},getNavigators(){return this.keyNavigators},destroy(){return this.keyNavigators.forEach(navigator=>navigator.destroy()),this.keyNavigators=[],this}};return jumpLinks}),define("taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/index",["exports","taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/headerNavigation","taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/toolbarNavigation","taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/topToolbarNavigation","taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/navigatorNavigation","taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/pageNavigation","taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/rubricsNavigation","taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/itemNavigation","taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/linearItemNavigation","taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/stimulusNavigation","taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/jumpLinks"],function(exports,headerNavigation,toolbarNavigation,topToolbarNavigation,navigatorNavigation,pageNavigation,rubricsNavigation,itemNavigation,linearItemNavigation,stimulusNavigation,jumpLinks){"use strict";headerNavigation=headerNavigation&&Object.prototype.hasOwnProperty.call(headerNavigation,"default")?headerNavigation["default"]:headerNavigation,toolbarNavigation=toolbarNavigation&&Object.prototype.hasOwnProperty.call(toolbarNavigation,"default")?toolbarNavigation["default"]:toolbarNavigation,topToolbarNavigation=topToolbarNavigation&&Object.prototype.hasOwnProperty.call(topToolbarNavigation,"default")?topToolbarNavigation["default"]:topToolbarNavigation,navigatorNavigation=navigatorNavigation&&Object.prototype.hasOwnProperty.call(navigatorNavigation,"default")?navigatorNavigation["default"]:navigatorNavigation,pageNavigation=pageNavigation&&Object.prototype.hasOwnProperty.call(pageNavigation,"default")?pageNavigation["default"]:pageNavigation,rubricsNavigation=rubricsNavigation&&Object.prototype.hasOwnProperty.call(rubricsNavigation,"default")?rubricsNavigation["default"]:rubricsNavigation,itemNavigation=itemNavigation&&Object.prototype.hasOwnProperty.call(itemNavigation,"default")?itemNavigation["default"]:itemNavigation,linearItemNavigation=linearItemNavigation&&Object.prototype.hasOwnProperty.call(linearItemNavigation,"default")?linearItemNavigation["default"]:linearItemNavigation,stimulusNavigation=stimulusNavigation&&Object.prototype.hasOwnProperty.call(stimulusNavigation,"default")?stimulusNavigation["default"]:stimulusNavigation,jumpLinks=jumpLinks&&Object.prototype.hasOwnProperty.call(jumpLinks,"default")?jumpLinks["default"]:jumpLinks,exports.headerNavigationStrategy=headerNavigation,exports.toolbarNavigationStrategy=toolbarNavigation,exports.topToolbarNavigationStrategy=topToolbarNavigation,exports.navigatorNavigationStrategy=navigatorNavigation,exports.pageNavigationStrategy=pageNavigation,exports.rubricsNavigationStrategy=rubricsNavigation,exports.itemNavigationStrategy=itemNavigation,exports.linearItemNavigationStrategy=linearItemNavigation,exports.stimulusNavigationStrategy=stimulusNavigation,exports.jumpLinksNavigationStrategy=jumpLinks,Object.defineProperty(exports,"__esModule",{value:!0})}),define("taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategiesManager",["core/providerRegistry","taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/index"],function(providerRegistry,strategies){"use strict";function strategyFactory(name,testRunner,config){const strategy=strategyFactory.getProvider(name);return{init(){return strategy.init.call(this),this},getName(){return name},getConfig(){return config},getTestRunner(){return testRunner},getNavigators(){return"function"==typeof strategy.getNavigators?strategy.getNavigators.call(this):[]},destroy(){return"function"==typeof strategy.destroy&&strategy.destroy.call(this),this}}}return providerRegistry=providerRegistry&&Object.prototype.hasOwnProperty.call(providerRegistry,"default")?providerRegistry["default"]:providerRegistry,providerRegistry(strategyFactory),Object.values(strategies).forEach(strategy=>strategyFactory.registerProvider(strategy.name,strategy)),strategyFactory}),define("taoQtiTest/runner/plugins/content/accessibility/keyNavigation/helpers",["exports","jquery","lodash","taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategiesManager"],function(exports,$,_,strategyFactory){"use strict";function allowedToNavigateFrom(from){let element=from;if(element&&"function"==typeof element.getCursor){const{navigable}=element.getCursor();element=navigable}element&&"function"==typeof element.getElement&&(element=element.getElement());const $element=$(element);return!($element.hasClass(ignoredClass)||0<$element.parents(`.${ignoredClass}`).length)}function setupItemsNavigator(navigator,config){return navigator.on(config.keyNextItem,function navigateToNextItem(elem){allowedToNavigateFrom(elem)&&this.next()}).on(config.keyPrevItem,function navigateToPrevItem(elem){allowedToNavigateFrom(elem)&&this.previous()})}function setupClickableNavigator(navigator){return navigator.on("activate",function activateItem(cursor){const $elt=cursor.navigable.getElement();$elt.is(":checkbox")?$elt.each(function(){this.click()}):$elt.click().mousedown()})}function getStrategies(navigationMode,testRunner){return navigationMode.strategies.map(area=>strategyFactory(area,testRunner,navigationMode.config).init())}function getNavigators(strategies){return _.flatten(strategies.map(strategy=>strategy.getNavigators()))}$=$&&Object.prototype.hasOwnProperty.call($,"default")?$["default"]:$,_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,strategyFactory=strategyFactory&&Object.prototype.hasOwnProperty.call(strategyFactory,"default")?strategyFactory["default"]:strategyFactory;const ignoredClass="no-key-navigation";exports.allowedToNavigateFrom=allowedToNavigateFrom,exports.getNavigators=getNavigators,exports.getStrategies=getStrategies,exports.setupClickableNavigator=setupClickableNavigator,exports.setupItemsNavigator=setupItemsNavigator,Object.defineProperty(exports,"__esModule",{value:!0})}),define("taoQtiTest/runner/plugins/content/accessibility/keyNavigation/modes/defaultMode",[],function(){"use strict";var defaultMode={name:"default",init(){let config=0modeFactory.registerProvider(mode.name,mode)),modeFactory}),define("taoQtiTest/runner/plugins/content/accessibility/keyNavigation/keyNavigation",["ui/keyNavigation/navigator","taoQtiTest/runner/plugins/content/accessibility/keyNavigation/helpers","taoQtiTest/runner/plugins/content/accessibility/keyNavigation/modesManager","util/shortcut"],function(keyNavigator,helpers,modeFactory,shortcut){"use strict";function keyNavigationFactory(testRunner){let config=1strategy.destroy()),groupNavigator&&groupNavigator.destroy(),groupNavigator=null,strategies=[],this}}}keyNavigator=keyNavigator&&Object.prototype.hasOwnProperty.call(keyNavigator,"default")?keyNavigator["default"]:keyNavigator,modeFactory=modeFactory&&Object.prototype.hasOwnProperty.call(modeFactory,"default")?modeFactory["default"]:modeFactory,shortcut=shortcut&&Object.prototype.hasOwnProperty.call(shortcut,"default")?shortcut["default"]:shortcut;const eventNS=".keyNavigation";return keyNavigationFactory}),define("css!taoQtiTest/runner/plugins/content/accessibility/css/key-navigation",[],function(){}),define("taoQtiTest/runner/plugins/content/accessibility/keyNavigation/plugin",["lodash","taoQtiTest/runner/plugins/content/accessibility/keyNavigation/keyNavigation","taoTests/runner/plugin","css!taoQtiTest/runner/plugins/content/accessibility/css/key-navigation.css"],function(_,keyNavigatorFactory,pluginFactory,keyNavigation_css){"use strict";_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,keyNavigatorFactory=keyNavigatorFactory&&Object.prototype.hasOwnProperty.call(keyNavigatorFactory,"default")?keyNavigatorFactory["default"]:keyNavigatorFactory,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory;const defaultPluginConfig={contentNavigatorType:"default"};var plugin=pluginFactory({name:"keyNavigation",init(){const testRunner=this.getTestRunner(),pluginConfig=_.defaults(this.getConfig(),defaultPluginConfig),keyNavigator=keyNavigatorFactory(testRunner,pluginConfig);testRunner.after("renderitem",()=>{keyNavigator.isActive()&&keyNavigator.destroy(),keyNavigator.init()}).on("unloaditem",()=>{keyNavigator.destroy()}).on("setcontenttabtype",type=>{keyNavigator.setMode(type),pluginConfig.contentNavigatorType=type})}});return plugin}),define("taoQtiTest/runner/plugins/content/accessibility/mainLandmark/header",["jquery","i18n","taoTests/runner/plugin","handlebars","lib/handlebars/helpers"],function($$1,__,pluginFactory,Handlebars,Helpers0){"use strict";function headerTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}function getState(item){let state=__("Unseen");return item.flagged?state=__("Flagged"):item.answered?state=__("Answered"):item.viewed&&(state=__("Viewed")),state}$$1=$$1&&Object.prototype.hasOwnProperty.call($$1,"default")?$$1["default"]:$$1,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){return this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),"\n\n"}),header=pluginFactory({name:"mainLandmark",init(){const testRunner=this.getTestRunner(),updateTitle=item=>{this.$title.text(`${item.label}`).show()},updateState=item=>{this.$state.text(`${getState(item)}`).show()};testRunner.after("renderitem",()=>{const item=testRunner.getCurrentItem();updateTitle(item),updateState(item)}).on("tool-flagitem",()=>{let item=testRunner.getCurrentItem();item=Object.assign({},item,{flagged:!item.flagged}),updateState(item)})},render(){const $container=this.getAreaBroker().getArea("mainLandmark");this.$element=$$1(headerTpl()),$container.append(this.$element),this.$title=$container.find(`[data-control="qti-test-item-title"]`),this.$state=$container.find(`[data-control="qti-test-item-state"]`)}});return header}),define("taoQtiTest/runner/plugins/content/dialog/dialog",["jquery","lodash","taoTests/runner/plugin","ui/dialog/alert","ui/dialog/confirm","util/shortcut/registry","util/shortcut","util/namespace"],function($,_,pluginFactory,dialogAlert,dialogConfirm,shortcutRegistry,globalShortcut,namespaceHelper){"use strict";$=$&&Object.prototype.hasOwnProperty.call($,"default")?$["default"]:$,_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,dialogAlert=dialogAlert&&Object.prototype.hasOwnProperty.call(dialogAlert,"default")?dialogAlert["default"]:dialogAlert,dialogConfirm=dialogConfirm&&Object.prototype.hasOwnProperty.call(dialogConfirm,"default")?dialogConfirm["default"]:dialogConfirm,shortcutRegistry=shortcutRegistry&&Object.prototype.hasOwnProperty.call(shortcutRegistry,"default")?shortcutRegistry["default"]:shortcutRegistry,globalShortcut=globalShortcut&&Object.prototype.hasOwnProperty.call(globalShortcut,"default")?globalShortcut["default"]:globalShortcut,namespaceHelper=namespaceHelper&&Object.prototype.hasOwnProperty.call(namespaceHelper,"default")?namespaceHelper["default"]:namespaceHelper;var pluginName="dialog",actionPrefix=`tool-${"dialog"}-`,defaultOptions={alert:{focus:"ok"},confirm:{focus:"ok"}},dialog=pluginFactory({name:"dialog",init:function init(){function closeAccept(dialog){dialog.trigger("okbtn.modal").hide()}function closeReject(dialog){dialog.hide()}function closeLast(accept,shortcut){var handle=opened.length&&opened[opened.length-1];handle&&(handle.shortcut=shortcut,accept?closeAccept(handle.dialog):closeReject(handle.dialog))}function addHandle(namespace,stack,dialog,message,accept,reject,options){function doAccept(e,reason){_.isFunction(accept)&&accept(handle.shortcut||reason)}function doReject(e,reason){_.isFunction(reject)&&reject(handle.shortcut||reason)}var handle={context:namespace,dialog:dialog(message,doAccept,doReject,options)};globalShortcut.disable(),dialogShortcut.enable(),stack.push(handle),opened.push(handle),handle.dialog.focus(options.focus),handle.dialog.on("closed.modal",function(){removeHandle(stack,handle.dialog),removeHandle(opened,handle.dialog),opened.length||(globalShortcut.enable(),dialogShortcut.disable())})}function removeHandle(stack,dialog){dialog&&_.remove(stack,function(handle){if(handle&&dialog===handle.dialog)return!0})}function closeDialogs(namespace,accept,stack){stack?_.forEach(stack,function(handle){handle&&("@"===namespace||namespace===handle.context)&&(accept?closeAccept(handle.dialog):closeReject(handle.dialog))}):(closeDialogs(namespace,accept,alerts),closeDialogs(namespace,accept,confirms))}var testRunner=this.getTestRunner(),testOptions=testRunner.getOptions(),pluginConfig=Object.assign({},defaultOptions,this.getConfig()),pluginShortcuts=(testOptions.shortcuts||{}).dialog||{},alerts=[],confirms=[],opened=[],dialogShortcut=shortcutRegistry($("body"),{propagate:!1,prevent:!0});dialogShortcut.disable().set("Tab Shift+Tab"),testOptions.allowShortcuts&&_.forEach(pluginShortcuts,function(command,key){dialogShortcut.add(namespaceHelper.namespaceAll(command,"dialog",!0),function(e,shortcut){testRunner.trigger(actionPrefix+key,shortcut)})}),testRunner.before("alert.*",function(e,msg,accept,options){addHandle(e.namespace,alerts,dialogAlert,msg,accept,accept,_.merge({},pluginConfig.alert,options))}).before("confirm.*",function(e,msg,accept,reject,options){addHandle(e.namespace,confirms,dialogConfirm,msg,accept,reject,_.merge({},pluginConfig.confirm,options))}).before("closedialog.*",function(e,accept){closeDialogs(e.namespace,accept)}).on(`${actionPrefix}accept`,function(shortcut){closeLast(!0,shortcut)}).on(`${actionPrefix}reject`,function(shortcut){closeLast(!1,shortcut)}).on("destroy",function(){closeDialogs(".@"),dialogShortcut.clear(),dialogShortcut=null})}});return dialog}),define("taoQtiTest/runner/plugins/content/dialog/exitMessages",["lodash","taoTests/runner/plugin"],function(_,pluginFactory){"use strict";_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory;var exitMessages=pluginFactory({name:"exitMessages",init:function init(){},install:function install(){var testRunner=this.getTestRunner();testRunner.before("leave",function leave(e,data){const dataIsObject=_.isObject(data);return dataIsObject&&data.skipExitMessage?void 0:dataIsObject&&data.message?new Promise(function(resolve){var context=testRunner.getTestContext();context&&context.itemIdentifier&&testRunner.disableItem(context.itemIdentifier),testRunner.trigger("disablefeedbackalerts").trigger("alert.leave",data.message,function(){testRunner.trigger("enablefeedbackalerts"),resolve()})}):void 0})}});return exitMessages}),define("taoQtiTest/runner/plugins/content/dialog/itemAlertMessage",["jquery","ui/hider","taoTests/runner/plugin"],function($,hider,pluginFactory){"use strict";$=$&&Object.prototype.hasOwnProperty.call($,"default")?$["default"]:$,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory;var itemAlertMessage=pluginFactory({name:"itemAlertMessage",init:function init(){var self=this;this.$element=$(this.getContent().dom),this.$element.on("closed.modal",function(){$(this).modal("destroy")}).on("destroyed.modal",function(){self.$element=null,self.trigger("resume",self)})},render:function render(){var testRunner=this.getTestRunner(),itemRunner=testRunner.itemRunner,$modalsContainer=this.getContent().$container;$modalsContainer||($modalsContainer=$("#modalFeedbacks",itemRunner._item.container)),$modalsContainer.append(this.$element),this.$element.modal({startClosed:!1,top:200})},destroy:function destroy(){this.$element&&this.$element.length&&this.$element.modal("close")}});return itemAlertMessage}),define("taoQtiTest/runner/helpers/navigation",["lodash","taoQtiTest/runner/helpers/map"],function(_,mapHelper){"use strict";_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper;var navigationHelper={isLeavingSection:function isLeavingSection(testContext,testMap,direction,scope,position){var section,sectionStats,nbItems,item;if(_.isPlainObject(testContext)&&_.isPlainObject(testMap)&&!_.isEmpty(testContext.sectionId)&&!_.isEmpty(testContext.itemIdentifier))return section=mapHelper.getSection(testMap,testContext.sectionId),sectionStats=mapHelper.getSectionStats(testMap,testContext.sectionId),nbItems=sectionStats&§ionStats.total,item=mapHelper.getItem(testMap,testContext.itemIdentifier),"section"===scope||"testPart"===scope||"next"===direction&&item.positionInSection+1===nbItems||"previous"===direction&&0===item.positionInSection||"jump"===direction&&0=section.position+nbItems);throw new TypeError("Invalid test context and test map")},isLeavingTestPart:function isLeavingTestPart(testContext,testMap,direction,scope,position){var testPart,testPartStats,nbItems,item,section,sectionStats;if(_.isPlainObject(testContext)&&_.isPlainObject(testMap)&&!_.isEmpty(testContext.testPartId)&&!_.isEmpty(testContext.sectionId)&&!_.isEmpty(testContext.itemIdentifier))return testPart=mapHelper.getPart(testMap,testContext.testPartId),testPartStats=mapHelper.getPartStats(testMap,testContext.testPartId),nbItems=testPartStats&&testPartStats.total,item=mapHelper.getItem(testMap,testContext.itemIdentifier),"section"===scope&&(section=mapHelper.getSection(testMap,testContext.sectionId),sectionStats=mapHelper.getSectionStats(testMap,testContext.sectionId)),"testPart"===scope||"next"===direction&&"item"===scope&&item.positionInPart+1===nbItems||"next"===direction&&"section"===scope&§ion.position+sectionStats.total>=nbItems||"previous"===direction&&"item"===scope&&0===item.positionInPart||"previous"===direction&&"section"===scope&§ion.position===testPart.position||"jump"===direction&&0=testPart.position+nbItems);throw new TypeError("Invalid test context and test map")},isLast:function isLast(testMap,itemIdentifier){return this.isLastOf(testMap,itemIdentifier,"test")},isFirst:function isFirst(testMap,itemIdentifier){return this.isFirstOf(testMap,itemIdentifier,"test")},isLastOf:function isLastOf(testMap,itemIdentifier,scope){var item,stats;if(!_.isPlainObject(testMap))throw new TypeError("Invalid test map");if(_.isEmpty(itemIdentifier))throw new TypeError("Invalid item identifier");if(scope=scope||"test",item=mapHelper.getItem(testMap,itemIdentifier),stats=mapHelper.getScopeStats(testMap,item.position,scope),stats&&_.isNumber(stats.total)){if("test"===scope)return item.position+1===stats.total;if("section"===scope||"assessmentSection"===scope||"testSection"===scope)return item.positionInSection+1===stats.total;if("part"===scope||"testPart"===scope)return item.positionInPart+1===stats.total}return!1},isFirstOf:function isFirstOf(testMap,itemIdentifier,scope){var item;if(!_.isPlainObject(testMap))throw new TypeError("Invalid test map");if(_.isEmpty(itemIdentifier))throw new TypeError("Invalid item identifier");return scope=scope||"test",item=mapHelper.getItem(testMap,itemIdentifier),"test"===scope?0===item.position:"section"===scope||"assessmentSection"===scope||"testSection"===scope?0===item.positionInSection:("part"===scope||"testPart"===scope)&&0===item.positionInPart},getSiblingItems:function getSiblingItems(testMap,itemPosition,direction,size){var itemId=mapHelper.getItemIdentifier(testMap,itemPosition),previous=null,siblings=[],itemChain=_.reduce(testMap&&testMap.jumps,function(map,jump){var ref=jump.identifier;return previous&&(map[previous].next=ref),map[ref]={identifier:ref,previous:previous,next:null},previous=ref,map},{}),directions;return size=_.isFinite(size)?parseInt(size,10):3,directions=direction&&"both"!==direction?[direction]:["previous","next"],_.forEach(directions,function walkDirection(link){var id=itemId;_.times(size,function getNeighbor(){return id=itemChain[id]&&itemChain[id][link],!!id&&void siblings.push(mapHelper.getItem(testMap,id))})}),siblings},getNextItem:function getNextItem(testMap,itemPosition){var siblings=navigationHelper.getSiblingItems(testMap,itemPosition,"next",1);return siblings.length?siblings[0]:null},getPreviousItem:function getPreviousItem(testMap,itemPosition){var siblings=navigationHelper.getSiblingItems(testMap,itemPosition,"previous",1);return siblings.length?siblings[0]:null},isMovingToNextItem:function isMovingToNextItem(action,params){return params=params||{},"timeout"===action||"skip"===action||"move"===action&&"next"===params.direction&&"item"===params.scope},isMovingToPreviousItem:function isMovingToPreviousItem(action,params){return params=params||{},"move"===action&&"previous"===params.direction&&"item"===params.scope},isJumpingToItem:function isJumpingToItem(action,params){return params=params||{},"move"===action&&"jump"===params.direction&&"item"===params.scope}};return navigationHelper}),define("taoQtiTest/runner/plugins/content/dialog/itemInlineMessage",["jquery","i18n","ui/hider","taoTests/runner/plugin","handlebars","lib/handlebars/helpers","taoQtiTest/runner/helpers/navigation"],function($$1,__,hider,pluginFactory,Handlebars,Helpers0,navigationHelper){"use strict";function buttonTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}$$1=$$1&&Object.prototype.hasOwnProperty.call($$1,"default")?$$1["default"]:$$1,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,navigationHelper=navigationHelper&&Object.prototype.hasOwnProperty.call(navigationHelper,"default")?navigationHelper["default"]:navigationHelper,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var buffer="",stack1,helper;return buffer+=" ",(helper=helpers.className)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.className,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1),buffer}function program3(depth0,data){var buffer="",stack1;return buffer+="\n aria-"+escapeExpression((stack1=null==data||!1===data?data:data.key,"function"===typeof stack1?stack1.apply(depth0):stack1))+"=\""+escapeExpression("function"===typeof depth0?depth0.apply(depth0):depth0)+"\"\n ",buffer}function program5(depth0,data){var buffer="",stack1,helper;return buffer+="",buffer}function program6(depth0,data){return" no-label"}function program8(depth0,data){var buffer="",stack1,helper;return buffer+="",(helper=helpers.text)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.text,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",functionType="function",escapeExpression=this.escapeExpression,self=this,stack1,helper;return buffer+="\n \n ",stack1=helpers["if"].call(depth0,depth0&&depth0.icon,{hash:{},inverse:self.noop,fn:self.program(5,program5,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.text,{hash:{},inverse:self.noop,fn:self.program(8,program8,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n \n\n",buffer}),buttonData={next:{control:"move-forward",title:__("Submit and go to the next item"),icon:"forward",text:__("OK")},end:{control:"move-end",title:__("Submit and go to the end of the test"),icon:"fast-forward",text:__("OK & End test")}},itemInlineMessage=pluginFactory({name:"itemInlineMessage",init:function init(){var self=this,testRunner=this.getTestRunner(),createOkButton=function createElement(){const testContext=testRunner.getTestContext(),testMap=testRunner.getTestMap(),dataType=navigationHelper.isLast(testMap,testContext.itemIdentifier)?"end":"next",$btn=$$1(buttonTpl(buttonData[dataType]));return $btn.addClass("modalFeedback-button"),$btn.on("click",function(e){e.preventDefault(),self.disable(),"move-end"===$$1(this).data("control")&&self.trigger("end"),$btn.remove(),self.$element.remove(),self.trigger("resume",self)}),$btn};this.$button=createOkButton(),this.$element=$$1(this.getContent().dom)},render:function render(){var $navigationContainer=this.getAreaBroker().getNavigationArea(),testRunner=this.getTestRunner(),itemRunner=testRunner.itemRunner,$inlineContainer=this.getContent().$container;!$inlineContainer&&itemRunner._item.container&&($inlineContainer=$$1(".qti-itemBody",itemRunner._item.container)),$inlineContainer.append(this.$element),$$1(".modalFeedback-button",$navigationContainer).length||$navigationContainer.append(this.$button)},enable:function enable(){this.$button.removeProp("disabled").removeClass("disabled")},disable:function disable(){this.$button.prop("disabled",!0).addClass("disabled")},destroy:function destroy(){this.$button.click()}});return itemInlineMessage}),define("taoQtiTest/runner/plugins/content/feedback/feedback",["i18n","taoTests/runner/plugin","ui/feedback"],function(__,pluginFactory,feedback$1){"use strict";__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,feedback$1=feedback$1&&Object.prototype.hasOwnProperty.call(feedback$1,"default")?feedback$1["default"]:feedback$1;var feedback=pluginFactory({name:"feedback",init:function init(){var self=this,testRunner=this.getTestRunner(),closeCurrent=function closeCurrent(){currentFeedback&¤tFeedback.close()},currentFeedback;this.setState("enabled",!0),testRunner.on("error",function(err){var message=err,type="error";self.getState("enabled")&&("object"==typeof err&&(message=err.message,type=err.type),message||(message="TestState"===type?__("The test has been closed/suspended!"):"FileNotFound"===type?__("File not found!"):__("An error occurred!")),currentFeedback=feedback$1().error(message))}).on("danger",function(message){self.getState("enabled")&&(currentFeedback=feedback$1().danger(message))}).on("warning",function(message){self.getState("enabled")&&(currentFeedback=feedback$1().warning(message))}).on("info",function(message){self.getState("enabled")&&(currentFeedback=feedback$1().info(message))}).on("alert.* confirm.* unloaditem",closeCurrent).on("disablefeedbackalerts",function(){closeCurrent(),self.setState("enabled",!1)}).on("enablefeedbackalerts",function(){self.setState("enabled",!0)})}});return feedback}),define("taoQtiTest/runner/plugins/content/itemScrolling/itemScrolling",["jquery","util/typeCaster","taoTests/runner/plugin"],function($,typeCaster,pluginFactory){"use strict";$=$&&Object.prototype.hasOwnProperty.call($,"default")?$["default"]:$,typeCaster=typeCaster&&Object.prototype.hasOwnProperty.call(typeCaster,"default")?typeCaster["default"]:typeCaster,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory;var itemScrolling=pluginFactory({name:"itemScrolling",init:function init(){function adaptItemHeight(){const $itemContainer=$contentArea.find("[data-scrolling=\"true\"]"),contentHeight=getItemRunnerHeight()-getExtraGridRowHeight()-getSpaceAboveQtiContent()-gridRowBottomMargin-qtiItemPadding;$itemContainer.each(function(){const $item=$(this),isScrollable=typeCaster.strToBool($item.attr("data-scrolling")||"false"),selectedHeight=parseFloat($item.attr("data-scrolling-height"))||100,containerParent=$item.parent().closest("[data-scrolling=\"true\"]");$item.length&&isScrollable&&($item.data("scrollable",!0),$item.css({"overflow-y":"scroll"}),0 .grid-row"),extraHeight=0;return $gridRows.each(function(){var $gridRow=$(this),$itemContainer=$gridRow.find("[data-scrolling=\"true\"]");$itemContainer.length||(extraHeight+=$gridRow.outerHeight(!0))}),extraHeight}function getSpaceAboveQtiContent(){var $testRunnerSections=$(".test-runner-sections"),$qtiContent=$("#qti-content");return $testRunnerSections.length&&$qtiContent.length?$qtiContent.get(0).getBoundingClientRect().top-$testRunnerSections.get(0).getBoundingClientRect().top:0}const testRunner=this.getTestRunner(),$contentArea=testRunner.getAreaBroker().getContentArea(),gridRowBottomMargin=12,qtiItemPadding=60;testRunner.on("renderitem",function(){adaptItemHeight(),$(window).off("resize.adaptItemHeight"),$(window).on("resize.adaptItemHeight",adaptItemHeight)})}});return itemScrolling}),define("taoQtiTest/runner/plugins/content/loading/loading",["layout/loading-bar","taoTests/runner/plugin"],function(loadingBar,pluginFactory){"use strict";loadingBar=loadingBar&&Object.prototype.hasOwnProperty.call(loadingBar,"default")?loadingBar["default"]:loadingBar,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory;var loading=pluginFactory({name:"loading",init:function init(){var testRunner=this.getTestRunner();testRunner.on("unloaditem",function(){loadingBar.start()}).on("renderitem",function(){loadingBar.stop()})}});return loading}),define("taoQtiTest/runner/plugins/content/modalFeedback/modalFeedback",["jquery","lodash","module","taoTests/runner/plugin","taoQtiTest/runner/plugins/content/dialog/itemInlineMessage","taoQtiTest/runner/plugins/content/dialog/itemAlertMessage","ui/autoscroll"],function($,_,module,pluginFactory,inlineMessage,alertMessage,autoscroll){"use strict";function destroyFeedback(feedback){var removed=!1;_.remove(renderedFeedbacks,function(storedFeedback){var found=storedFeedback===feedback;return found&&(removed=!0),found}),removed&&(feedback.destroy(),!renderedFeedbacks.length&&nextStep())}function defineMode(inline){inlineMode=inline,messagePlugin=inlineMode?inlineMessage:alertMessage}$=$&&Object.prototype.hasOwnProperty.call($,"default")?$["default"]:$,_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,module=module&&Object.prototype.hasOwnProperty.call(module,"default")?module["default"]:module,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,inlineMessage=inlineMessage&&Object.prototype.hasOwnProperty.call(inlineMessage,"default")?inlineMessage["default"]:inlineMessage,alertMessage=alertMessage&&Object.prototype.hasOwnProperty.call(alertMessage,"default")?alertMessage["default"]:alertMessage,autoscroll=autoscroll&&Object.prototype.hasOwnProperty.call(autoscroll,"default")?autoscroll["default"]:autoscroll;var modalFeedback=pluginFactory({name:"QtiModalFeedback",init:function init(){nextStep=function(){},defineMode(!!module.config().inlineModalFeedback)},render:function render(){var self=this,testRunner=this.getTestRunner(),createMessages=function createMessages(renderingQueue,inline){var bInlineMode=inlineMode;isDestroyed=!1,renderedFeedbacks=[],_.isBoolean(inline)&&defineMode(inline),renderingQueue.length?(_.forEach(renderingQueue,function(renderingToken){var feedback=messagePlugin(testRunner,testRunner.getAreaBroker());feedback.init({dom:renderingToken.feedback.render({inline:inlineMode}),$container:inlineMode?renderingToken.$container:null}),feedback.render(),renderedFeedbacks.push(feedback)}),inlineMode&&renderedFeedbacks&&autoscroll($(".qti-modalFeedback",testRunner.getAreaBroker().getContentArea()).first(),testRunner.getAreaBroker().getContentArea().parents(".content-wrapper"))):nextStep(),defineMode(bInlineMode)};inlineMode?testRunner.off("plugin-resume.itemInlineMessage").on("plugin-resume.itemInlineMessage",function(){self.destroy()}):testRunner.off("plugin-resume.itemAlertMessage").on("plugin-resume.itemAlertMessage",function(feedback){destroyFeedback(feedback)}),testRunner.on("modalFeedbacks",function(renderingQueue,done,inline){nextStep=done,createMessages(renderingQueue,inline)})},destroy:function destroy(){var tFeedbacks,i;if(!isDestroyed)if(isDestroyed=!0,!renderedFeedbacks)nextStep();else for(i in tFeedbacks=renderedFeedbacks.slice(0),tFeedbacks)destroyFeedback(tFeedbacks[i])}}),inlineMode,messagePlugin,renderedFeedbacks,isDestroyed,nextStep;return modalFeedback}),define("taoQtiTest/runner/plugins/content/overlay/overlay",["jquery","taoTests/runner/plugin"],function($,pluginFactory){"use strict";$=$&&Object.prototype.hasOwnProperty.call($,"default")?$["default"]:$,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory;var overlay=pluginFactory({name:"overlay",init:function init(){var self=this,testRunner=this.getTestRunner();this.$element=$("
          "),this.$element.on("click mousedown mouseup touchstart touchend keyup keydow keypress scroll drop",function(e){e.stopImmediatePropagation(),e.stopPropagation()});const shield=function shield(){self.enable()},unshield=function unshield(){self.disable()};testRunner.on("disableitem",shield).on("enableitem unloaditem modalFeedbacks",unshield)},render:function render(){var $contentArea=this.getTestRunner().getAreaBroker().getContentArea();$contentArea.after(this.$element)},destroy:function destroy(){this.$element.remove()},enable(){const overlayConfig=this.getConfig();this.$element.addClass("overlay"),overlayConfig.full&&this.$element.addClass("overlay-full")},disable:function disable(){this.$element.removeClass("overlay overlay-full")},show:function show(){this.enable()},hide:function hide(){this.disable()}});return overlay}),define("taoQtiTest/runner/plugins/content/responsiveness/collapser",["lodash","jquery","taoTests/runner/plugin"],function(_,$,pluginFactory){"use strict";_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,$=$&&Object.prototype.hasOwnProperty.call($,"default")?$["default"]:$,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory;var ns=".collapser",noLabelCls="tool-label-collapsed",noLabelHoverCls="tool-label-collapsed-hover",labelHiddenCls="no-tool-label",separatorCls="separator",defaults={collapseTools:!0,collapseNavigation:!1,collapseInOrder:!1,hover:!1,collapseOrder:[]},$window=$(window),collapser=pluginFactory({name:"collapser",init:function init(){function buildCollapsiblesList(){allCollapsibles=config.collapseInOrder&&config.collapseOrder.length?getCollapsiblesFromConfig():config.collapseInOrder?getSortedCollapsiblesFromDom():getUnsortedCollapsiblesFromDom()}function getExtraWidth($element){var expandedWidth,collapsedWidth;return $element.removeClass(collapseCls),expandedWidth=$element.outerWidth(!0),$element.addClass(collapseCls),collapsedWidth=$element.outerWidth(!0),$element.removeClass(collapseCls),expandedWidth-collapsedWidth}function toggleCollapsibles(){availableWidth=getAvailableWidth(),availableWidthgetAvailableWidth()}function expandInOrder(){_.forEachRight(allCollapsibles,function(toExpand){if(toExpand.$elements.hasClass(collapseCls))if(expandPossible(toExpand.extraWidth))toExpand.$elements.removeClass(collapseCls);else return!1})}function expandPossible(extraWidth){return getToolbarWidth()+extraWidthul>[data-control]";return config.collapseTools&&($controls=$controls.add($toolbox.find(">ul>[data-control]").not(`.${labelHiddenCls}`).not(`.${separatorCls}`))),config.collapseNavigation&&($controls=$controls.add($navigation.find(">ul>[data-control]").not(`.${labelHiddenCls}`).not(`.${separatorCls}`))),$controls}function getCollapsiblesFromConfig(){return _.compact(config.collapseOrder.map(function(selector){var $elements=$(selector).not(`.${labelHiddenCls}`).not(`.${separatorCls}`),extraWidth=0;return!!$elements.length&&($elements.each(function(){extraWidth+=getExtraWidth($(this))}),{$elements:$elements,extraWidth:extraWidth})}))}function getSortedCollapsiblesFromDom(){var $controlElements=getControlsFromDom(),_allCollapsibles=[],order={};return $controlElements.each(function(){var ctrl=this.dataset.control,key=ctrl.substring(0,ctrl.search(/[A-Z-_]/))||ctrl;order[key]=order[key]||$(),order[key]=order[key].add($(this))}),_.forOwn(order,function($elements){var extraWidth=0;$elements.each(function(){extraWidth+=getExtraWidth($(this))}),_allCollapsibles.push({$elements:$elements,extraWidth:extraWidth})}),_.compact(_allCollapsibles)}function getUnsortedCollapsiblesFromDom(){var $elements=getControlsFromDom(),_allCollapsibles=[],extraWidth=0;return $elements.each(function(){extraWidth+=getExtraWidth($(this))}),_allCollapsibles.push({$elements:$elements,extraWidth:extraWidth}),_.compact(_allCollapsibles)}const testRunner=this.getTestRunner(),config=Object.assign({},defaults,this.getConfig()),collapseCls=config.hover?noLabelHoverCls:noLabelCls;var areaBroker=testRunner.getAreaBroker(),$actionsBar=areaBroker.getArea("actionsBar"),$toolbox=areaBroker.getToolboxArea(),$navigation=areaBroker.getNavigationArea(),allCollapsibles,availableWidth,previousAvailableWidth;$window.on(`resize${".collapser"}`,_.throttle(function(){testRunner.trigger("collapseTools")},40)),testRunner.after("renderitem loaditem",function(){previousAvailableWidth=1/0,buildCollapsiblesList(),testRunner.trigger("collapseTools")}).on(`collapseTools${".collapser"}`,function(){toggleCollapsibles()})},destroy:function destroy(){$window.off(".collapser")}});return collapser}),define("taoQtiTest/runner/plugins/content/rubricBlock/rubricBlock",["jquery","ui/hider","taoTests/runner/plugin","handlebars","lib/handlebars/helpers"],function($$1,hider,pluginFactory,Handlebars,Helpers0){"use strict";function containerTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}$$1=$$1&&Object.prototype.hasOwnProperty.call($$1,"default")?$$1["default"]:$$1,hider=hider&&Object.prototype.hasOwnProperty.call(hider,"default")?hider["default"]:hider,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){return this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),"
          \n"}),blankifyLinks=function blankifyLinks($container){$$1("a",$container).attr("target","_blank")},mathify=function mathify($container){return new Promise(function(resolve){0<$$1("math",$container).length?require(["mathJax"],function(MathJax){MathJax?(MathJax.Hub.Queue(["Typeset",MathJax.Hub],$container[0]),MathJax.Hub.Queue(resolve)):resolve()},resolve):resolve()})},rubricBlock=pluginFactory({name:"rubricBlock",init:function init(){var self=this,testRunner=this.getTestRunner();this.$element=$$1(containerTpl()),this.hide(),testRunner.on("ready",function(){self.hide()}).on("loaditem",function(){var context=testRunner.getTestContext();context.rubrics&&(self.$element.html(context.rubrics),blankifyLinks(self.$element),mathify(self.$element).then(function(){testRunner.trigger("rubricblock")}))}).on("renderitem",function(){self.show()}).on("unloaditem",function(){self.hide(),self.$element.empty()})},render:function render(){var $container=this.getAreaBroker().getContentArea();$container.before(this.$element)},destroy:function destroy(){this.$element.remove()},enable:function enable(){this.$element.removeProp("disabled").removeClass("disabled")},disable:function disable(){this.$element.prop("disabled",!0).addClass("disabled")},show:function show(){hider.show(this.$element)},hide:function hide(){hider.hide(this.$element)}});return rubricBlock}),define("taoQtiTest/runner/plugins/controls/connectivity/connectivity",["jquery","lodash","i18n","core/polling","ui/waitingDialog/waitingDialog","taoTests/runner/plugin","handlebars","lib/handlebars/helpers","util/namespace"],function($$1,_,__,pollingFactory,waitingDialog,pluginFactory,Handlebars,Helpers0,namespaceHelper){"use strict";function connectivityTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}$$1=$$1&&Object.prototype.hasOwnProperty.call($$1,"default")?$$1["default"]:$$1,_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,pollingFactory=pollingFactory&&Object.prototype.hasOwnProperty.call(pollingFactory,"default")?pollingFactory["default"]:pollingFactory,waitingDialog=waitingDialog&&Object.prototype.hasOwnProperty.call(waitingDialog,"default")?waitingDialog["default"]:waitingDialog,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,namespaceHelper=namespaceHelper&&Object.prototype.hasOwnProperty.call(namespaceHelper,"default")?namespaceHelper["default"]:namespaceHelper,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){return" with-message"}function program3(depth0,data){var buffer="",helper,options;return buffer+=""+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Online",options):helperMissing.call(depth0,"__","Online",options)))+"",buffer}function program5(depth0,data){var buffer="",helper,options;return buffer+=""+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Offline",options):helperMissing.call(depth0,"__","Offline",options)))+"",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",helperMissing=helpers.helperMissing,escapeExpression=this.escapeExpression,functionType="function",self=this,stack1,helper,options;return buffer+="
          \n ",stack1=helpers["if"].call(depth0,depth0&&depth0.message,{hash:{},inverse:self.noop,fn:self.program(3,program3,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.message,{hash:{},inverse:self.noop,fn:self.program(5,program5,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n
          \n",buffer}),defaultConfig={checkInterval:30000,indicator:!0,message:!1},connectivity=pluginFactory({name:"connectivity",init:function init(){var self=this,testRunner=this.getTestRunner(),proxy=testRunner.getProxy(),config=Object.assign({},defaultConfig,this.getConfig());config&&config.indicator&&(this.$element=$$1(connectivityTpl({state:proxy.isOnline()?"connected":"disconnected",message:config.message})),testRunner.on("disconnect",function(){self.$element.removeClass("connected").addClass("disconnected")}).on("reconnect",function(){self.$element.removeClass("disconnected").addClass("connected")})),this.polling&&_.isNumber(config.checkInterval)&&this.polling.setInterval(config.checkInterval)},install:function install(){var self=this,waiting=!1,testRunner=this.getTestRunner(),proxy=testRunner.getProxy();this.displayWaitingDialog=function displayWaitingDialog(){let message=0{testRunner.loadItem(itemRef)}),!1):void 0)}),testRunner.before(namespaceHelper.namespaceAll("move skip timeout","connectivity"),function(e){for(var _len=arguments.length,args=Array(1<_len?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];var testContext=testRunner.getTestContext(),currentItem=testRunner.getCurrentItem();if(proxy.isOffline()&&(currentItem.hasFeedbacks||testContext.hasFeedbacks))return testRunner.trigger("disableitem"),self.displayWaitingDialog().then(function(){testRunner.trigger("enableitem").trigger(e.name,...args)}),!1})},destroy(){this.getTestRunner().off(".connectivity")},render:function render(){var $container=this.getAreaBroker().getControlArea();this.$element&&$container.append(this.$element)}});return connectivity}),define("taoQtiTest/runner/plugins/controls/connectivity/pauseOnError",["i18n","taoTests/runner/plugin","handlebars","lib/handlebars/helpers"],function(__,pluginFactory,Handlebars,Helpers0){"use strict";function dialogTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",functionType="function",escapeExpression=this.escapeExpression,stack1,helper;return buffer+="",(helper=helpers.title)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.title,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"

          \n",(helper=helpers.message)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.message,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1),buffer});const name="pauseOnError",dialogMessage={title:__("Something unexpected happened."),message:__("Please try reloading the page or pause the test. If you pause, you will be able to resume the test from this page.")},dialogConfig={focus:"cancel",buttons:{labels:{ok:__("Pause the test"),cancel:__("Reload the page")}}},pauseContext={reasons:{category:"technical",subCategory:"error"},originalMessage:"Due to an unexpected issue the test has been suspended."};var pauseOnError=pluginFactory({name:"pauseOnError",init(){const testRunner=this.getTestRunner(),returnToHome=()=>testRunner.trigger("pause",pauseContext),reloadPage=()=>testRunner.trigger("reloadpage"),processError=error=>{testRunner.on("reloadpage",()=>window.location.reload()).trigger("disablenav disabletools hidenav").trigger(`confirm.${name}`,dialogTpl(dialogMessage),returnToHome,reloadPage,dialogConfig),500===error.code&&(error.originalCode=error.code,delete error.code,testRunner.trigger(`disablefeedbackalerts`),testRunner.after("error.pauseOnError",()=>{testRunner.off("error.pauseOnError"),testRunner.trigger(`enablefeedbackalerts`)}))};testRunner.before("error",(e,error)=>processError(error))}});return pauseOnError}),define("taoQtiTest/runner/plugins/controls/duration/duration",["lodash","taoTests/runner/plugin","core/logger"],function(_,pluginFactory,loggerFactory){"use strict";_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,loggerFactory=loggerFactory&&Object.prototype.hasOwnProperty.call(loggerFactory,"default")?loggerFactory["default"]:loggerFactory;const logger=loggerFactory("taoQtiTest/runner/plugins/controls/duration/duration");var duration=pluginFactory({name:"duration",install(){this.getTestRunner().getTestStore().setVolatile(this.getName())},init(){const testRunner=this.getTestRunner();let currentUpdatePromise=Promise.resolve();const getItemAttempt=()=>{const context=testRunner.getTestContext();return`${context.itemIdentifier}#${context.attempt}`},getPositiveNumber=value=>!_.isNumber(value)||0>value?0:value;return testRunner.getPluginStore(this.getName()).then(durationStore=>{const getItemDuration=attemptId=>/^(.*)+#+\d+$/.test(attemptId)?durationStore.getItem(attemptId):Promise.reject(new Error("Is it really an attempt id, like \"itemid#attempt\"")),updateDuration=elapsed=>{const itemAttemptId=getItemAttempt();return currentUpdatePromise=currentUpdatePromise.then(()=>getItemDuration(itemAttemptId)).then(duration=>durationStore.setItem(itemAttemptId,getPositiveNumber(duration)+getPositiveNumber(elapsed)/1e3)).catch(err=>{logger.warn(`Error updating item duration! ${err&&err.message}`)}),currentUpdatePromise},addDurationToCallActionParams=()=>{const itemAttemptId=getItemAttempt();return currentUpdatePromise.then(()=>getItemDuration(itemAttemptId)).then(duration=>testRunner.getProxy().addCallActionParams({itemDuration:getPositiveNumber(duration)})).catch(err=>{logger.warn(`Error retrieving item duration! ${err&&err.message}`)})};testRunner.on("tick",updateDuration).before("move skip exit timeout pause",addDurationToCallActionParams).on("plugin-get.duration",(attemptId,getDuration)=>{_.isFunction(getDuration)&&getDuration(getItemDuration(attemptId))})})}});return duration}),define("taoQtiTest/runner/plugins/controls/progressbar/progress",["lodash","i18n","core/format","taoQtiTest/runner/helpers/map"],function(_,__,format,mapHelper){"use strict";function getFixedMap(testMap,testContext){const currentTestPart=mapHelper.getPart(testMap,testContext.testPartId),currentItem=mapHelper.getItemAt(testMap,testContext.itemPosition);if(currentItem.answered&¤tTestPart.isLinear){const fixedTestMap=_.cloneDeep(testMap),fixedCurrentItem=mapHelper.getItemAt(fixedTestMap,testContext.itemPosition);return fixedCurrentItem.answered=!1,fixedTestMap}return testMap}function getEmptyStats(){return{position:0,reached:0,viewed:0,completed:0,total:0}}function updateStats(stats,element,position){element.position<=position&&stats.position++,element.stats.viewed&&(stats.reached++,element.stats.viewed===element.stats.total&&stats.viewed++),element.stats.answered&&element.stats.answered===element.stats.questions&&stats.completed++,stats.total++}function updateItemStats(stats,element,position){element.position<=position&&stats.position++,element.viewed&&(stats.reached++,stats.viewed++),element.answered&&stats.completed++,stats.total++}function getCategoriesToMatch(categories){var matchSize=categories&&categories.length;return matchSize&&_.reduce(categories,function(map,category){return map[category]=!0,map},{})}function getProgressStats(testMap,testContext,config,scope){var fixedMap=getFixedMap(testMap,testContext),scopedMap=mapHelper.getScopeMap(fixedMap,testContext.itemPosition,scope),stats=_.clone(scopedMap.stats),categoriesToMatch,matchSize;return"categories"===config.indicator&&(categoriesToMatch=getCategoriesToMatch(config.categories),matchSize=config.categories&&config.categories.length,stats.matchedCategories=getEmptyStats()),stats.parts=getEmptyStats(),stats.sections=getEmptyStats(),stats.answerableParts=getEmptyStats(),stats.answerableSections=getEmptyStats(),_.forEach(scopedMap.parts,function(part){updateStats(stats.parts,part,testContext.itemPosition),0=minWanted))return!1}),matched===minWanted}function getRatio(position,total){var _Mathfloor=Math.floor;return position&&0= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),"
          \n
          \n
          \n
          \n"}),defaults={showLabel:!0};return percentageIndicatorRenderer}),define("taoQtiTest/runner/plugins/controls/progressbar/renderer/position",["lodash","ui/component","handlebars","lib/handlebars/helpers"],function(_,component,Handlebars,Helpers0){"use strict";function positionTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}function pointTpl(data,options,asString){var html=Template$1(data,options);return asString||!0?html:$(html)}function positionIndicatorRenderer(config,progressData){var count=0,rendererApi={update:function update(data){progressData=data,this.is("rendered")&&this.controls&&(count!==progressData.total&&(count=progressData.total,this.controls.$bar.empty().append(pointTpl(_.range(count)))),this.controls.$label.text(progressData.label),this.controls.$bar.children().removeClass("reached current").slice(0,progressData.position).addClass("reached").slice(-1).addClass("current")),this.trigger("update",data)}};return component(rendererApi,defaults).setTemplate(positionTpl).on("render",function(){this.controls={$label:this.getElement().find("[data-control=\"progress-label\"]"),$bar:this.getElement().find("[data-control=\"progress-bar\"] .progressbar-points")},this.config.showLabel||this.controls.$label.hide(),progressData&&this.update(progressData),this.is("hidden")&&this.hide()}).on("destroy",function(){this.controls=null}).init(config)}_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,component=component&&Object.prototype.hasOwnProperty.call(component,"default")?component["default"]:component,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){return this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),"
          \n
          \n
          \n
          \n
          \n
          \n"});Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template$1=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var buffer="";return buffer+="\n\n",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var functionType="function",escapeExpression=this.escapeExpression,self=this,stack1;return stack1=helpers.each.call(depth0,depth0,{hash:{},inverse:self.noop,fn:self.program(1,program1,data),data:data}),stack1||0===stack1?stack1:""}),defaults={showLabel:!0};return positionIndicatorRenderer}),define("taoQtiTest/runner/plugins/controls/progressbar/progressbar",["taoTests/runner/plugin","taoQtiTest/runner/helpers/map","taoQtiTest/runner/plugins/controls/progressbar/progress","taoQtiTest/runner/plugins/controls/progressbar/renderer/percentage","taoQtiTest/runner/plugins/controls/progressbar/renderer/position"],function(pluginFactory,mapHelper,progressHelper,percentageRendererFactory,positionRendererFactory){"use strict";pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper,progressHelper=progressHelper&&Object.prototype.hasOwnProperty.call(progressHelper,"default")?progressHelper["default"]:progressHelper,percentageRendererFactory=percentageRendererFactory&&Object.prototype.hasOwnProperty.call(percentageRendererFactory,"default")?percentageRendererFactory["default"]:percentageRendererFactory,positionRendererFactory=positionRendererFactory&&Object.prototype.hasOwnProperty.call(positionRendererFactory,"default")?positionRendererFactory["default"]:positionRendererFactory;var renderers={percentage:percentageRendererFactory,position:positionRendererFactory},progressbar=pluginFactory({name:"progressBar",init:function init(){const testRunner=this.getTestRunner(),testRunnerConfig=testRunner.getOptions(),config=Object.assign({},testRunnerConfig.progressIndicator||{},this.getConfig()),self=this;var rendererFactory=renderers[config.renderer]||renderers.percentage,progressConfig={indicator:config.type||"percentage",scope:config.scope||"test",showLabel:config.showLabel,showTotal:config.showTotal,categories:config.categories},hiddenByQuestions=function hiddenByQuestions(item){return item&&item.informational&&"questions"===progressConfig.indicator},hiddenByCategories=function(item){return item&&"categories"===progressConfig.indicator&&!progressHelper.isMatchedCategories(item.categories,progressConfig.categories)},isProgressbarHidden=function isProgressbarHidden(item){return hiddenByQuestions(item)||hiddenByCategories(item)},update=function update(){var testContext=testRunner.getTestContext(),testMap=testRunner.getTestMap(),item=mapHelper.getItemAt(testMap,testContext.itemPosition);isProgressbarHidden(item)?self.renderer.hide():(self.renderer.show(),self.renderer.update(progressHelper.computeProgress(testMap,testContext,progressConfig)))};this.renderer=rendererFactory(progressConfig),update(),testRunner.on("ready loaditem",update)},render:function render(){var $container=this.getAreaBroker().getControlArea();this.renderer.render($container)},destroy:function destroy(){this.renderer&&this.renderer.destroy(),this.renderer=null},show:function show(){this.renderer&&this.renderer.show()},hide:function hide(){this.renderer&&this.renderer.hide()}});return progressbar}),define("taoQtiTest/runner/plugins/controls/testState/testState",["lodash","taoTests/runner/plugin"],function(_,pluginFactory){"use strict";_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory;var testState=pluginFactory({name:"testState",install:function install(){var testRunner=this.getTestRunner();testRunner.getProxy().use(function qtiFilter(req,res,next){var data=res&&res.data;return data&&data.type&&"TestState"===data.type&&!testRunner.getState("closedOrSuspended")?(testRunner.setState("closedOrSuspended",!0),void(testRunner.getState("ready")?(_.isEmpty(data.messages)||!_.find(data.messages,{channel:"teststate"}))&&testRunner.trigger("leave",data):testRunner.trigger("destroy"))):void next()})},init:function init(){var testRunner=this.getTestRunner(),isLeaving=!1;testRunner.getProxy().channel("teststate",function(data){isLeaving||!data||"close"!==data.type&&"pause"!==data.type||testRunner.getState("closedOrSuspended")||(isLeaving=!0,"pause"===data.type?testRunner.trigger("pause",data):(testRunner.setState("closedOrSuspended",!0),testRunner.trigger("leave",data)))})}});return testState}),define("taoQtiTest/runner/helpers/getTimerMessage",["i18n"],function(__){"use strict";function getTimerMessage(hours,minutes,seconds,unansweredQuestions,scope){let timerMessage;const timeArr=[hours,minutes,seconds],timeArgArr=[];[__("hours"),__("minutes"),__("seconds")].forEach((unit,idx)=>{0=remainingTime?0:parseInt(remainingTime,10),this.is("rendered")&&this.is("running")){if(encodedTime=timeEncoder.encode(this.remainingTime/1000),encodedTime!==this.encodedTime){this.encodedTime=encodedTime;const time=moment.duration(this.remainingTime/1000,"seconds"),hours=time.get("hours"),minutes=time.get("minutes"),seconds=time.get("seconds");$time.text(this.encodedTime),$timeScreenreader.text(getTimerMessage(hours,minutes,seconds,unansweredQuestions,this.config.scope))}if(this.warnings&&(warningId=_.findLastKey(this.warnings,function(warning){return warning&&!warning.shown&&0=self.remainingTime}),warningId&&(this.warnings[warningId].shown=!0,warningMessage=_.isFunction(this.warnings[warningId].message)?this.warnings[warningId].message(this.remainingTime):this.warnings[warningId].message,this.trigger("warn",warningMessage,this.warnings[warningId].level))),this.warningsForScreenreader){const screenreaderWarningId=_.findLastKey(this.warningsForScreenreader,warning=>warning&&!warning.shown&&0=self.remainingTime);screenreaderWarningId&&(this.warningsForScreenreader[screenreaderWarningId].shown=!0,this.trigger("warnscreenreader",this.warningsForScreenreader[screenreaderWarningId].message,self.remainingTime,this.warningsForScreenreader[screenreaderWarningId].scope))}this.trigger("change",this.remainingTime,encodedTime)}0===this.remainingTime&&this.complete()}return this},start:function start(){return!this.is("rendered")||this.is("running")||this.is("completed")||(this.enable(),this.setState("running",!0),this.trigger("start")),this},stop:function stop(){return this.is("rendered")&&this.is("running")&&(this.setState("running",!1),this.trigger("stop")),this},complete:function complete(){return this.is("rendered")&&this.is("running")&&!this.is("completed")&&(this.stop(),this.setState("completed",!0),this.trigger("complete end")),this}},defaults).on("init",function(){this.remainingTime=this.config.remainingTime,this.unansweredQuestions=this.config.unansweredQuestions,this.config.warnings&&(this.warnings=_.sortBy(this.config.warnings,"threshold")),this.config.warningsForScreenreader&&(this.warningsForScreenreader=_.sortBy(this.config.warningsForScreenreader,"threshold")),this.render($container)}).on("render",function(){$time=$$1(".time",this.getElement()),$timeScreenreader=$$1(".time--screenreader",this.getElement()),!0===this.config.showBeforeStart&&$time.text(timeEncoder.encode(this.remainingTime/1000))}).on("warn",function(message,level){var countdownTooltip;level=level||"warning",this.is("rendered")&&this.is("running")&&_.isString(message)&&!_.isEmpty(message)&&($time.removeClass("txt-success txt-info txt-warning txt-danger txt-error").addClass(`txt-${level}`),!0===this.config.displayWarning&&(countdownTooltip=tooltip.create(this.getElement(),message,{trigger:"manual",theme:level,placement:"bottom"}),countdownTooltip.show(),setTimeout(function(){countdownTooltip.hide(),countdownTooltip.dispose()},warningTimeout[level]||2e3)))});return countdown.setTemplate(countdownTpl),_.defer(function(){countdown.init(config)}),countdown}$$1=$$1&&Object.prototype.hasOwnProperty.call($$1,"default")?$$1["default"]:$$1,_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,timeEncoder=timeEncoder&&Object.prototype.hasOwnProperty.call(timeEncoder,"default")?timeEncoder["default"]:timeEncoder,component=component&&Object.prototype.hasOwnProperty.call(component,"default")?component["default"]:component,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,getTimerMessage=getTimerMessage&&Object.prototype.hasOwnProperty.call(getTimerMessage,"default")?getTimerMessage["default"]:getTimerMessage,tooltip=tooltip&&Object.prototype.hasOwnProperty.call(tooltip,"default")?tooltip["default"]:tooltip,moment=moment&&Object.prototype.hasOwnProperty.call(moment,"default")?moment["default"]:moment,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",functionType="function",escapeExpression=this.escapeExpression,stack1,helper;return buffer+="
          \n ",(helper=helpers.label)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.label,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\n \n
          \n
          \n",buffer}),precision=1e3,defaults={showBeforeStart:!0,displayWarning:!0},warningTimeout={info:2e3,success:2e3,warning:4e3,danger:4e3,error:8e3};return countdownFactory}),define("css!taoQtiTest/runner/plugins/controls/timer/component/css/timerbox",[],function(){}),define("taoQtiTest/runner/plugins/controls/timer/component/timerbox",["jquery","lodash","i18n","ui/component","ui/hider","taoQtiTest/runner/plugins/controls/timer/component/countdown","handlebars","lib/handlebars/helpers","css!taoQtiTest/runner/plugins/controls/timer/component/css/timerbox.css"],function($$1,_,__,component,hider,countdownFactory,Handlebars,Helpers0,timerbox_css){"use strict";function timerboxTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}function timerboxFactory(config){var timerbox=component({update:function update(timers){var self=this,updating=[],timerIdsToRemove=_.difference(_.keys(this.timers),_.keys(timers));return timerIdsToRemove.length&&_.forEach(timerIdsToRemove,function(timerId){updating.push(self.removeTimer(timerId))}),_.forEach(timers,function(timer,id){"undefined"==typeof self.timers[id]?updating.push(self.addTimer(id,timer)):updating.push(self.updateTimer(id,timer))}),Promise.all(updating).then(function(results){return 0<_.size(self.timers)?hider.show($zenModeToggler):hider.hide($zenModeToggler),self.trigger("update",results),results})},getTimers:function getTimers(){return this.timers},addTimer:function addTimer(id,timer){var self=this;return this.is("rendered")&&"undefined"==typeof this.timers[id]?new Promise(function(resolve){var countdown=countdownFactory($countdownContainer,_.defaults(timer,{displayWarning:self.config.displayWarning})).on("render",function(){self.timers[id]=_.clone(timer),self.timers[id].countdown=this,self.trigger("timerchange","add",self.timers[id]),self.trigger("timeradd",self.timers[id]),resolve(self.timers[id])}).on("start",function(){self.trigger("timerstart",self.timers[id])}).on("stop",function(){self.trigger("timerstop",self.timers[id])}).on("end",function(){self.trigger("timerend",self.timers[id])}).on("change",function(value){self.timers[id]&&(self.trigger("timertick",this.remainingTime,self.timers[id].scope,self.timers[id].unansweredQuestions),self.timers[id].remainingTime=value)});countdown.spread(self,["error","change","warn","warnscreenreader"])}):Promise.resolve(!1)},updateTimer:function updateTimer(id,timer){return this.is("rendered")&&"undefined"!=typeof this.timers[id]?(this.timers[id].remainingTime=timer.remainingTime,this.timers[id].unansweredQuestions=timer.unansweredQuestions,this.timers[id].extraTime=timer.extraTime,_.isNumber(timer.remainingWithoutExtraTime)&&(this.timers[id].remainingWithoutExtraTime=timer.remainingWithoutExtraTime),this.timers[id].countdown&&this.timers[id].countdown.update(timer.remainingTime,timer.unansweredQuestions),this.trigger("timerchange","update",this.timers[id]),this.trigger("timerupdate",this.timers[id]),Promise.resolve(this.timers[id])):Promise.resolve(!1)},removeTimer:function removeTimer(id){var self=this;return this.is("rendered")&&"undefined"!=typeof this.timers[id]?new Promise(function(resolve){var deindex=function deindex(){var removed=_.omit(self.timers[id],"countdown");self.timers=_.omit(self.timers,id),self.trigger("timerchange","remove",removed),self.trigger("timerremove",removed),resolve(removed)};self.timers[id].countdown?self.timers[id].countdown.on("destroy",deindex).destroy():deindex()}):Promise.resolve()},start:function start(){return _.forEach(this.timers,function(timer){timer.countdown&&timer.countdown.start()}),this},stop:function stop(){return _.forEach(this.timers,function(timer){timer.countdown&&timer.countdown.stop()}),this},toggleZenMode:function toggleZenMode(){return this.is("rendered")&&this.config.zenMode.enabled&&(this.is("zen")?(this.setState("zen",!1),$zenModeToggler.attr("title",__("Hide timers"))):(this.setState("zen",!0),$zenModeToggler.attr("title",__("Show timers"))),this.trigger("zenchange",this.is("zen"))),this}},defaults).on("init",function(){this.timers={}}).on("render",function(){var self=this,$element=this.getElement();$countdownContainer=$$1(".timer-wrapper",$element),this.config.zenMode.enabled&&($zenModeToggler=$$1(".timer-toggler",$element),self.setState("zen",!!self.config.zenMode.startHidden),$zenModeToggler.on("click",function(e){e.preventDefault(),self.toggleZenMode()})),this.config.timers&&this.update(this.config.timers)}),$zenModeToggler,$countdownContainer;return timerbox.setTemplate(timerboxTpl),_.defer(function(){timerbox.init(config)}),timerbox}$$1=$$1&&Object.prototype.hasOwnProperty.call($$1,"default")?$$1["default"]:$$1,_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,component=component&&Object.prototype.hasOwnProperty.call(component,"default")?component["default"]:component,hider=hider&&Object.prototype.hasOwnProperty.call(hider,"default")?hider["default"]:hider,countdownFactory=countdownFactory&&Object.prototype.hasOwnProperty.call(countdownFactory,"default")?countdownFactory["default"]:countdownFactory,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var buffer="",helper,options;return buffer+="\n \n ",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",helperMissing=helpers.helperMissing,escapeExpression=this.escapeExpression,self=this,functionType="function",stack1,helper;return buffer+="
          \n ",stack1=helpers["if"].call(depth0,(stack1=depth0&&depth0.zenMode,null==stack1||!1===stack1?stack1:stack1.enabled),{hash:{},inverse:self.noop,fn:self.program(1,program1,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n
          \n\n
          \n
          \n",buffer}),defaults={zenMode:{enabled:!0,startHidden:!1}};return timerboxFactory}),define("taoQtiTest/runner/plugins/controls/timer/strategy/enforcedStay",[],function(){"use strict";function enforcedStayStrategy(testRunner,timer){const testPart=testRunner.getCurrentPart();return!!(timer&&"min"===timer.type&&"item"===timer.scope&&testPart&&testPart.isLinear)&&{name:"enforcedStay",setUp:function setUp(){testRunner.on("enablenav.enforcestay",function(){testRunner.trigger("disablenav")}),testRunner.trigger("disablenav")},complete:function complete(){this.tearDown(),testRunner.trigger("enablenav")},tearDown:function tearDown(){testRunner.off("enablenav.enforcestay")}}}return enforcedStayStrategy}),define("taoQtiTest/runner/plugins/controls/timer/strategy/extraTime",["lodash"],function(_){"use strict";var _Mathmax=Math.max;function extraTimeStrategy(testRunner,timer){var applyExtraTime=function applyExtraTime(){_.isNumber(timer.extraTime)&&0v;return"boolean"===baseType?transform=v=>!0===v||"true"===v:"integer"===baseType?transform=v=>"number"==typeof v?v:parseInt(v):"float"===baseType?transform=v=>"number"==typeof v?v:parseFloat(v):("directedPair"==baseType||"pair"==baseType)&&(transform=v=>_.isString(v)?v.split(" "):v),value=_.map(value||[],transform),mappedCardinality&&("base"===mappedCardinality?0===value.length?response.base=null:(response.base={},response.base[baseType]=value[0]):(response[mappedCardinality]={},response[mappedCardinality][baseType]=value)),response},isQtiValueNull:function isQtiValueNull(value,baseType,cardinality){var mappedCardinality=responseCardinalities[cardinality];_.isObject(value)&&null===value[mappedCardinality]&&(value=null),_.isObject(value)&&value[mappedCardinality]&&"undefined"!=typeof value[mappedCardinality][baseType]&&(value=value[mappedCardinality][baseType]);const stringyValue="string"===baseType||"integer"===baseType||"float"===baseType;return null===value||stringyValue&&""===value||"single"!==cardinality&&_.isEmpty(value)},isQuestionAnswered:function isQuestionAnswered(response,baseType,cardinality,defaultValue,constraintValue){var fullyAnswered=!0,answered,currentCardinality,responses;return defaultValue=_.isUndefined(defaultValue)?null:defaultValue,constraintValue=constraintValue||0,currentItemHelper.isQtiValueNull(response,baseType,cardinality)?answered=!1:(answered=!_.isEqual(response,currentItemHelper.toResponse(defaultValue,baseType,cardinality)),0!==constraintValue&&(currentCardinality=responseCardinalities[cardinality],responses=response[currentCardinality][baseType]||[],fullyAnswered=responses&&responses.length>=constraintValue),answered=answered&&fullyAnswered),answered},guessInteractionConstraintValues:function guessInteractionConstraintValues(runner){var itemRunner=runner.itemRunner,itemBody=itemRunner._item&&itemRunner._item.bdy||{},interactions=itemBody.elements||{},constraintValues={};return _.forEach(interactions,function(interaction){var attributes=interaction.attributes||{},qtiClass=interaction.__proto__.qtiClass,constraintProperty;Object.prototype.hasOwnProperty.call(interactionMinConstraintProperties,qtiClass)&&(constraintProperty=interactionMinConstraintProperties[qtiClass],constraintValues[attributes.responseIdentifier]=attributes[constraintProperty])}),constraintValues},isAnswered:function isAnswered(runner,partially){var itemRunner=runner.itemRunner,responses=itemRunner&&itemRunner.getResponses(),count=0,empty=0,declarations,constraintValues;return itemRunner&&(declarations=currentItemHelper.getDeclarations(runner),constraintValues=currentItemHelper.guessInteractionConstraintValues(runner),_.forEach(declarations,function(declaration){var attributes=declaration.attributes||{},response=responses[attributes.identifier],baseType=attributes.baseType,cardinality=attributes.cardinality;count++,currentItemHelper.isQuestionAnswered(response,baseType,cardinality,declaration.defaultValue,constraintValues[attributes.identifier])||empty++})),!1===partially?0

          ",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var functionType="function",escapeExpression=this.escapeExpression,self=this,stack1;return stack1=helpers["if"].call(depth0,depth0&&depth0.header,{hash:{},inverse:self.noop,fn:self.program(1,program1,data),data:data}),stack1||0===stack1?stack1:""}),messages={getExitMessage:getExitMessage};return messages}),define("taoQtiTest/runner/config/states",[],function(){"use strict";var states={testSession:Object.freeze({initial:0,interacting:1,modalFeedback:2,suspended:3,closed:4}),itemSession:Object.freeze({initial:0,interacting:1,modalFeedback:2,suspended:3,closed:4,solution:5,notSelected:255})};return states}),define("taoQtiTest/runner/plugins/controls/timer/strategy/warnSectionLeaving",["lodash","i18n","taoQtiTest/runner/helpers/messages","taoQtiTest/runner/helpers/navigation","taoQtiTest/runner/config/states","taoQtiTest/runner/helpers/map"],function(_,__,messages,navigationHelper,states,mapHelper){"use strict";function warnSectionLeavingStrategy(testRunner,timer){var leaveTimedSection=function leaveTimedSection(direction,scope,position){var context=testRunner.getTestContext(),map=testRunner.getTestMap();return!(context.isTimeout||context.itemSessionState===states.itemSession.closed||context.sectionId!==timer.source)&&navigationHelper.isLeavingSection(context,map,direction,scope,position)};return!!(timer&&"section"===timer.scope&&"max"===timer.type)&&{name:"warnSectionLeaving",setUp:function setUp(){testRunner.off("move.warntimedsection skip.warntimedsection").before("move.warntimedsection skip.warntimedsection",function(e,type,scope,position){const testContext=testRunner.getTestContext(),testMap=testRunner.getTestMap(),testRunnerOptions=testRunner.getOptions(),timerConfig=testRunnerOptions.timer||{},itemIdentifier=testContext.itemIdentifier,isLast=navigationHelper.isLast(testMap,itemIdentifier),endTestWarning=mapHelper.hasItemCategory(testMap,itemIdentifier,"endTestWarning",!0),noExitTimedSectionWarning=mapHelper.hasItemCategory(testMap,itemIdentifier,"noExitTimedSectionWarning",!0);var movePromise=new Promise(function(resolve,reject){if(isLast&&endTestWarning)resolve();else if(leaveTimedSection(type||"next",scope,position)&&!noExitTimedSectionWarning&&!timerConfig.keepUpToTimeout){const submitButtonLabel=__("Close this Section");testRunner.trigger("confirm.exittimed",messages.getExitMessage("section",testRunner,exitMessage,!1,submitButtonLabel),resolve,reject,{buttons:{labels:{ok:submitButtonLabel,cancel:__("Review my Answers")}}})}else resolve()});return movePromise.catch(function cancelMove(){_.defer(function(){testRunner.trigger("enableitem enablenav")})}),movePromise})},complete:function complete(){return this.tearDown()},tearDown:function tearDown(){testRunner.off("move.warntimedsection skip.warntimedsection")}}}_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,messages=messages&&Object.prototype.hasOwnProperty.call(messages,"default")?messages["default"]:messages,navigationHelper=navigationHelper&&Object.prototype.hasOwnProperty.call(navigationHelper,"default")?navigationHelper["default"]:navigationHelper,states=states&&Object.prototype.hasOwnProperty.call(states,"default")?states["default"]:states,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper;var exitMessage=__("Once you close this section, you cannot return to it or change your answers.");return warnSectionLeavingStrategy}),define("taoQtiTest/runner/plugins/controls/timer/strategy/strategyHandler",["lodash","taoQtiTest/runner/plugins/controls/timer/strategy/enforcedStay","taoQtiTest/runner/plugins/controls/timer/strategy/extraTime","taoQtiTest/runner/plugins/controls/timer/strategy/guidedNavigation","taoQtiTest/runner/plugins/controls/timer/strategy/timeout","taoQtiTest/runner/plugins/controls/timer/strategy/warnSectionLeaving"],function(_,extraTimeStrategy,enforcedStayStrategy,guidedNavigationStrategy,timeoutStrategy,warnSectionLeavingStrategy){"use strict";function getStrategyHandler(testRunner,strategies){var actives={},applyToStrategies=function applyToStrategies(timerId,action){var api=_.keys(strategyHandler);if(_.isEmpty(timerId)||_.isEmpty(action)||!_.contains(api,action))throw new TypeError("Invalid timer id or unauthorized action");return _.isArray(actives[timerId])?Promise.all(_.map(actives[timerId],function(strategy){if(_.isFunction(strategy[action]))return strategy[action]()})):Promise.resolve()},availableStrategies=strategies||defaultAvailableStrategies,strategyHandler;if(!testRunner||!_.isFunction(testRunner.on)||!_.isFunction(testRunner.getTestContext))throw new TypeError("The strategy handler needs a valid test runner.");return strategyHandler={setUp:function setUp(timer){return _.forEach(availableStrategies,function(availableStrategy){var strategy=availableStrategy(testRunner,timer);!1!==strategy&&(actives[timer.id]=actives[timer.id]||[],actives[timer.id].push(strategy))}),applyToStrategies(timer.id,"setUp")},getActives:function getActives(timer){return timer&&timer.id&&_.isArray(actives[timer.id])?actives[timer.id]:[]},start:function start(timer){return applyToStrategies(timer.id,"start")},stop:function stop(timer){return applyToStrategies(timer.id,"stop")},complete:function complete(timer){return applyToStrategies(timer.id,"complete")},tearDown:function tearDown(timer){return applyToStrategies(timer.id,"tearDown").then(function(){actives=_.omit(actives,timer.id)})}},strategyHandler}_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,extraTimeStrategy=extraTimeStrategy&&Object.prototype.hasOwnProperty.call(extraTimeStrategy,"default")?extraTimeStrategy["default"]:extraTimeStrategy,enforcedStayStrategy=enforcedStayStrategy&&Object.prototype.hasOwnProperty.call(enforcedStayStrategy,"default")?enforcedStayStrategy["default"]:enforcedStayStrategy,guidedNavigationStrategy=guidedNavigationStrategy&&Object.prototype.hasOwnProperty.call(guidedNavigationStrategy,"default")?guidedNavigationStrategy["default"]:guidedNavigationStrategy,timeoutStrategy=timeoutStrategy&&Object.prototype.hasOwnProperty.call(timeoutStrategy,"default")?timeoutStrategy["default"]:timeoutStrategy,warnSectionLeavingStrategy=warnSectionLeavingStrategy&&Object.prototype.hasOwnProperty.call(warnSectionLeavingStrategy,"default")?warnSectionLeavingStrategy["default"]:warnSectionLeavingStrategy;var defaultAvailableStrategies=[extraTimeStrategy,enforcedStayStrategy,guidedNavigationStrategy,timeoutStrategy,warnSectionLeavingStrategy];return getStrategyHandler}),define("taoQtiTest/runner/plugins/controls/timer/timers",["lodash","i18n","moment","core/format","core/logger"],function(_,__,moment,format,loggerFactory){"use strict";function getTimers(timeConstraints,isLinear,config){var timers={},constraintsWarnings=_.reduce(config.warnings,function(acc,warnings,qtiScope){var scope=getScope(qtiScope);return acc[scope]=_.map(warnings,function(value,key){return{threshold:1000*parseInt(key,10),message:function applyMessage(remainingTime){var displayRemaining=moment.duration(remainingTime/1000,"seconds").humanize();return format(warningMessages[scope],displayRemaining)},level:value,shown:!1}}),acc},{});const constraintsWarningsForScreenreader=_.reduce(config.warningsForScreenreader,(acc,warnings,qtiScope)=>{const scope=getScope(qtiScope);return acc[scope]=_.map(warnings,value=>({threshold:1000*parseInt(value,10),message:function applyMessage(remainingTime,unansweredQuestions){const displayRemaining=moment.duration(remainingTime/1000,"seconds").humanize();return format(warningMessagesForScreenraeder[scope],displayRemaining,unansweredQuestions)},scope,shown:!1})),acc},{});var buildTimer=function buildTimer(type,constraintData){var timer=_.pick(constraintData,["label","scope","source","extraTime","qtiClassName"]);timer.type=type,timer.allowLateSubmission=constraintData.allowLateSubmission,"min"===type?(timer.id=`${type}-${constraintData.scope}-${constraintData.source}`,timer.originalTime=1000*constraintData.minTime,timer.remainingTime=1000*constraintData.minTimeRemaining):(timer.id=constraintData.source,timer.originalTime=1000*constraintData.maxTime,timer.remainingTime=1000*constraintData.maxTimeRemaining),timer.remainingWithoutExtraTime=timer.remainingTime,timer.extraTime&&"min"!==timer.type&&(timer.extraTime.consumed*=1000,timer.extraTime.remaining*=1000,timer.extraTime.total*=1000,timer.total=timer.originalTime+timer.extraTime.total,timer.remainingTime+=timer.extraTime.remaining),"max"===type&&_.isArray(constraintsWarnings[timer.scope])&&(timer.warnings=constraintsWarnings[timer.scope]),_.isArray(constraintsWarningsForScreenreader[timer.scope])&&(timer.warningsForScreenreader=constraintsWarningsForScreenreader[timer.scope]);const stats=config.questionsStats[timer.scope];return timer.unansweredQuestions=stats&&stats.questions-stats.answered,timer};return _.forEach(timeConstraints,function(timeConstraint){var constraintData=_.clone(timeConstraint),newTimer;constraintData.scope=getScope(timeConstraint.scope||timeConstraint.qtiClassName),constraintData.scope?!1===constraintData.minTime&&!1===constraintData.maxTime?logger.warn("Time constraint defined with no time, skipping"):config.guidedNavigation&&isLinear&&constraintData.maxTime&&constraintData.minTime&&constraintData.minTime===constraintData.maxTime&&0= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),"
          \n"});const screenreaderNotificationTimeout=2e4;var plugin=pluginFactory({name:"timer",install(){const testRunner=this.getTestRunner();this.loadTimers=function loadTimers(timeStore,config){const testContext=testRunner.getTestContext(),testPart=testRunner.getCurrentPart(),isLinear=testPart&&testPart.isLinear,timeConstraints=testContext.timeConstraints,timers=timersFactory(timeConstraints,isLinear,config);return Promise.all(_.map(timers,function(timer){return timeStore.getItem(`consumed_${timer.id}`).then(function(savedConsumedTime){_.isNumber(savedConsumedTime)&&0<=savedConsumedTime&&config.restoreTimerFromClient&&(timer.remainingTime=timer.originalTime+timer.extraTime.total-savedConsumedTime)})})).then(function(){return timers})},this.saveTimers=function saveTimers(timeStore,timers){return Promise.all(_.map(timers,function(timer){return timeStore.setItem(`consumed_${timer.id}`,timer.originalTime+timer.extraTime.total-timer.remainingTime)}))},testRunner.getTestStore().setVolatile(this.getName())},init:function init(){function loadSavedTimers(timeStore){const testContext=testRunner.getTestContext();if(self.timerbox&&testContext.timeConstraints)return self.loadTimers(timeStore,config).then(function(timers){return self.timerbox.update(timers)}).catch(handleError)}const self=this,testRunner=this.getTestRunner(),testRunnerOptions=testRunner.getOptions();let screenreaderNotifcationTimeoutId;const stats={};["test","testPart","section","item"].forEach(scope=>Object.assign(stats,{[scope]:statsHelper.getInstantStats(scope,testRunner)}));const config=Object.assign({contextualWarnings:!1,warnings:testRunnerOptions.timerWarning||{},warningsForScreenreader:testRunnerOptions.timerWarningForScreenreader||{},guidedNavigation:testRunnerOptions.guidedNavigation,restoreTimerFromClient:testRunnerOptions.timer&&testRunnerOptions.timer.restoreTimerFromClient,questionsStats:stats},this.getConfig()),strategyHandler=getStrategyHandler(testRunner),handleError=err=>{testRunner.trigger("error",err)};return new Promise(function(resolve){return testRunner.getPluginStore(self.getName()).then(function(timeStore){testRunner.before("renderitem",function(){return loadSavedTimers(timeStore)}).before("enableitem",function(){if(config.restoreTimerFromClient)return loadSavedTimers(timeStore)}).on("tick",function(elapsed){if(self.timerbox){const timers=self.timerbox.getTimers(),updatedTimers=Object.keys(timers).reduce((acc,timerName)=>{const statsScope=statsHelper.getInstantStats(timers[timerName].scope,testRunner),unansweredQuestions=statsScope&&statsScope.questions-statsScope.answered;return acc[timerName]=Object.assign({},timers[timerName],{remainingTime:timers[timerName].remainingTime-elapsed,unansweredQuestions}),acc},{});self.timerbox.update(updatedTimers).catch(handleError)}}).after("renderitem",function(){self.timerbox&&($$1(self.timerbox.getElement()).find(".timer-wrapper").attr("aria-hidden",isReviewPanelEnabled(testRunner)),self.timerbox.start()),self.$screenreaderWarningContainer.text("")}).after("enableitem",function(){self.timerbox&&config.restoreTimerFromClient&&self.timerbox.start()}).on("move skip",function(){self.timerbox&&self.timerbox.stop()}).on("disableitem",function(){self.timerbox&&config.restoreTimerFromClient&&self.timerbox.stop()}),timeStore.getItem("zen-mode").then(function(startZen){self.timerbox=timerboxFactory({ariaHidden:isReviewPanelEnabled(testRunner),zenMode:{enabled:!0,startHidden:!!startZen},displayWarning:config.contextualWarnings}).on("change",_.throttle(function(){self.saveTimers(timeStore,this.getTimers())},1e3)).on("timeradd",function(timer){strategyHandler.setUp(timer).catch(handleError)}).on("timerremove",function(timer){strategyHandler.tearDown(timer).catch(handleError)}).on("timerstart",function(timer){strategyHandler.start(timer).catch(handleError)}).on("timerstop",function(timer){strategyHandler.stop(timer).catch(handleError)}).on("timerend",function(timer){strategyHandler.complete(timer).catch(handleError)}).on("timerchange",function(action,timer){self.trigger(`${action}timer`,timer.qtiClassName,timer)}).on("zenchange",function(isZen){timeStore.setItem("zen-mode",!!isZen)}).on("init",resolve).on("error",handleError),self.timerbox.spread(testRunner,"timertick"),config.contextualWarnings||(self.timerbox.on("warn",function(message,level){level&&message&&testRunner.trigger(level,message)}),self.timerbox.on("warnscreenreader",_.debounce((message,remainingTime,scope)=>{const statsScope=statsHelper.getInstantStats(scope,testRunner),unansweredQuestions=statsScope&&statsScope.questions-statsScope.answered;screenreaderNotifcationTimeoutId&&clearTimeout(screenreaderNotifcationTimeoutId),self.$screenreaderWarningContainer.text(message(remainingTime,unansweredQuestions)),screenreaderNotifcationTimeoutId=setTimeout(()=>self.$screenreaderWarningContainer.text(""),screenreaderNotificationTimeout)},1e3,{leading:!0,trailing:!1})))}).catch(handleError)})})},render:function render(){const $container=this.getAreaBroker().getControlArea();this.$screenreaderWarningContainer=$$1(screenreaderNotificationTpl()),this.timerbox.render($container),$container.append(this.$screenreaderWarningContainer)},destroy:function destroy(){this.timerbox&&this.timerbox.stop().destroy()},show:function show(){this.timerbox&&this.timerbox.show()},hide:function hide(){this.timerbox&&this.timerbox.hide()}});return plugin}),define("taoQtiTest/runner/plugins/controls/title/title",["jquery","lodash","taoTests/runner/plugin","handlebars","lib/handlebars/helpers","taoQtiTest/runner/helpers/map","taoQtiTest/runner/helpers/getTimerMessage","moment","taoQtiTest/runner/helpers/stats"],function($$1,_,pluginFactory,Handlebars,Helpers0,mapHelper,getTimerMessage,moment,statsHelper){"use strict";function titleTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}$$1=$$1&&Object.prototype.hasOwnProperty.call($$1,"default")?$$1["default"]:$$1,_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper,getTimerMessage=getTimerMessage&&Object.prototype.hasOwnProperty.call(getTimerMessage,"default")?getTimerMessage["default"]:getTimerMessage,moment=moment&&Object.prototype.hasOwnProperty.call(moment,"default")?moment["default"]:moment,statsHelper=statsHelper&&Object.prototype.hasOwnProperty.call(statsHelper,"default")?statsHelper["default"]:statsHelper,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var buffer="",stack1,helper;return buffer+="\n \n
          \n ",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",functionType="function",escapeExpression=this.escapeExpression,self=this,stack1;return buffer+="
          \n ",stack1=helpers.each.call(depth0,depth0&&depth0.titles,{hash:{},inverse:self.noop,fn:self.program(1,program1,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n
          \n",buffer});const precision=1e3;var title=pluginFactory({name:"title",init:function init(){const testRunner=this.getTestRunner(),testMap=testRunner.getTestMap(),updateTitles=()=>{const testContext=testRunner.getTestContext(),currentPart=mapHelper.getItemPart(testMap,testContext.itemPosition),currentItem=mapHelper.getItem(testMap,testContext.itemIdentifier);if(testMap.title&&this.titles.test.$title.text(testMap.title).show(),currentPart&¤tPart.label&&this.titles.testPart.$title.text(` - ${currentPart.label}`).show(),testContext.isDeepestSectionVisible){const section=mapHelper.getItemSection(testMap,testContext.itemPosition);this.titles.section.$title.text(` - ${section.label||testContext.sectionTitle}`).show()}currentItem.label&&this.titles.item.$title.text(` - ${currentItem.label}`).show()};testRunner.after("renderitem",()=>{_.forOwn(this.titles,(options,scope)=>{this.titles[scope].$title.text(""),this.titles[scope].$timer.text(""),"item"!==scope&&(this.titles[scope].stats=statsHelper.getInstantStats(scope,testRunner))}),updateTitles()}).on("timertick",(remainingTime,scope)=>{const title=this.titles[scope];if(!title)return;const{$timer,stats}=this.titles[scope],time=moment.duration(remainingTime/precision,"seconds"),hours=time.get("hours"),minutes=time.get("minutes"),seconds=time.get("seconds"),unansweredQuestions=stats&&stats.questions-stats.answered;$timer&&$timer.text(getTimerMessage(hours,minutes,seconds,unansweredQuestions))}).on("unloaditem",()=>{$$1(".qti-controls",this.$element).hide()})},render:function render(){const $container=this.getAreaBroker().getControlArea();this.titles={test:{attribute:"qti-test-title",className:""},testPart:{attribute:"qti-test-part-title",className:"visible-hidden"},section:{attribute:"qti-test-position",className:""},item:{attribute:"qti-test-item-title",className:"visible-hidden"}},this.$element=$$1(titleTpl({titles:_.values(this.titles)})),$$1(".qti-controls",this.$element).hide(),$container.append(this.$element),_.forOwn(this.titles,(_ref,scope)=>{let{attribute}=_ref;this.titles[scope].$title=$container.find(`[data-control="${attribute}"]`),this.titles[scope].$timer=$container.find(`[data-control="${attribute}-timer"]`)})}});return title}),define("taoQtiTest/runner/plugins/controls/trace/itemTraceVariables",["lodash","moment","taoTests/runner/plugin"],function(_,moment,pluginFactory){"use strict";function timestamp(){return Date.now()/1000}_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,moment=moment&&Object.prototype.hasOwnProperty.call(moment,"default")?moment["default"]:moment,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory;var precision=1e3,itemTraceVariables=pluginFactory({name:"itemTraceVariables",install:function install(){this.getTestRunner().getTestStore().setVolatile("trace")},init:function init(){function onError(err){testRunner.trigger("error",err)}var testRunner=this.getTestRunner(),variables={};return testRunner.getPluginStore("trace").then(function(tracesStore){testRunner.after("renderitem enableitem",function(){var context=testRunner.getTestContext();variables={ITEM_START_TIME_CLIENT:timestamp()},tracesStore.getItem(context.itemIdentifier).then(function(data){return data&&_.merge(variables,data),tracesStore.setItem(context.itemIdentifier,variables)}).catch(onError)}).before("move skip exit timeout",function(){var context=testRunner.getTestContext();return variables.ITEM_END_TIME_CLIENT=timestamp(),variables.ITEM_TIMEZONE=moment().utcOffset(moment().utcOffset()).format("Z"),tracesStore.setItem(context.itemIdentifier,variables).catch(onError)}).before("unloaditem",function(){var context=testRunner.getTestContext();return testRunner.getProxy().callItemAction(context.itemIdentifier,"storeTraceData",{traceData:JSON.stringify(variables)},!0)})})}});return itemTraceVariables}),define("taoQtiTest/runner/plugins/navigation/allowSkipping",["lodash","i18n","taoTests/runner/plugin","taoQtiTest/runner/helpers/currentItem"],function(_,__,pluginFactory,currentItemHelper){"use strict";_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,currentItemHelper=currentItemHelper&&Object.prototype.hasOwnProperty.call(currentItemHelper,"default")?currentItemHelper["default"]:currentItemHelper;var defaults={allowPartial:!0},allowSkipping=pluginFactory({name:"allowSkipping",init(){const testRunner=this.getTestRunner(),testRunnerOptions=testRunner.getOptions(),pluginConfig=Object.assign({},defaults,this.getConfig());testRunner.before("nav-next move",()=>{const testContext=testRunner.getTestContext(),isInteracting=!testRunner.getItemState(testContext.itemIdentifier,"disabled"),warning=pluginConfig.allowPartial?__("A response to this item is required."):__("A response to every question in this item is required.");if(isInteracting&&testRunnerOptions.enableAllowSkipping){const currenItem=testRunner.getCurrentItem(),allowSkipping="boolean"==typeof currenItem.allowSkipping?currenItem.allowSkipping:testContext.allowSkipping;if(!allowSkipping)return new Promise((resolve,reject)=>0===_.size(currentItemHelper.getDeclarations(testRunner))?resolve():currentItemHelper.isAnswered(testRunner,pluginConfig.allowPartial)?resolve():void(!testRunner.getState("alerted.notallowed")&&(testRunner.setState("alerted.notallowed",!0),testRunner.trigger("alert.notallowed",warning,()=>{testRunner.trigger("resumeitem"),reject(),testRunner.setState("alerted.notallowed",!1)}))))}})}});return allowSkipping}),define("taoQtiTest/runner/plugins/navigation/next/nextWarningHelper",[],function(){"use strict";var toBoolean=function toBoolean(value,defaultValue){return"undefined"==typeof value?defaultValue:!0===value||"true"===value},nextWarningHelper=function nextWarningHelper(options){function shouldWarnBeforeNext(){return nextItemWarning&&!itemCanBeTriedAtWill()}function itemCanBeTriedAtWill(){return!1===isLast&&!1===isLinear&&-1===remainingAttempts&&!isNextItemInLinearPart()}function isNextItemInLinearPart(){return nextPart&&"undefined"!=typeof nextPart.isLinear&&isLastOfPart()&&!0===nextPart.isLinear}function shouldWarnBeforeEnd(){return shouldWarnOnTestEnd()}function shouldWarnBeforeEndPart(){return shouldWarnOnPartChange()}function shouldWarnOnTestEnd(){return isLast&&(endTestWarning||warnBeforeNext)&&shouldWarnForUnansweredItems()}function shouldWarnForUnansweredItems(){var hasUnanswered=stats&&0!=stats.questions-stats.answered,hasFlagged=stats&&0!==stats.flagged;return!unansweredOnly||hasUnanswered||hasFlagged}function shouldWarnOnPartChange(){return nextPartWarning&&isLastOfPart()&&shouldWarnForUnansweredItems()}function isLastOfPart(){return nextPart&&nextPart.id&&testPartId!==nextPart.id}var endTestWarning=toBoolean(options.endTestWarning,!1),isLast=toBoolean(options.isLast,!1),isLinear=toBoolean(options.isLinear,!1),nextItemWarning=toBoolean(options.nextItemWarning,!1),nextPartWarning=toBoolean(options.nextPartWarning,!1),stats=options.stats,nextPart=options.nextPart||{},remainingAttempts="undefined"==typeof options.remainingAttempts?-1:options.remainingAttempts,testPartId=options.testPartId||"",unansweredOnly=toBoolean(options.unansweredOnly,!1),warnBeforeNext=shouldWarnBeforeNext(),warnBeforeEnd=shouldWarnBeforeEnd(),warnBeforeEndPart=shouldWarnBeforeEndPart();return{shouldWarnBeforeEndPart:function(){return warnBeforeEndPart},shouldWarnBeforeEnd:function(){return warnBeforeEnd},shouldWarnBeforeNext:function(){return warnBeforeNext}}};return nextWarningHelper}),define("taoQtiTest/runner/plugins/navigation/next",["jquery","i18n","ui/hider","taoTests/runner/plugin","taoQtiTest/runner/plugins/navigation/next/nextWarningHelper","taoQtiTest/runner/helpers/messages","taoQtiTest/runner/helpers/map","taoQtiTest/runner/helpers/navigation","taoQtiTest/runner/helpers/stats","util/shortcut","util/namespace","handlebars","lib/handlebars/helpers"],function($$1,__,hider,pluginFactory,nextWarningHelper,messages,mapHelper,navigationHelper,statsHelper,shortcut,namespaceHelper,Handlebars,Helpers0){"use strict";function buttonTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}$$1=$$1&&Object.prototype.hasOwnProperty.call($$1,"default")?$$1["default"]:$$1,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,hider=hider&&Object.prototype.hasOwnProperty.call(hider,"default")?hider["default"]:hider,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,nextWarningHelper=nextWarningHelper&&Object.prototype.hasOwnProperty.call(nextWarningHelper,"default")?nextWarningHelper["default"]:nextWarningHelper,messages=messages&&Object.prototype.hasOwnProperty.call(messages,"default")?messages["default"]:messages,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper,navigationHelper=navigationHelper&&Object.prototype.hasOwnProperty.call(navigationHelper,"default")?navigationHelper["default"]:navigationHelper,statsHelper=statsHelper&&Object.prototype.hasOwnProperty.call(statsHelper,"default")?statsHelper["default"]:statsHelper,shortcut=shortcut&&Object.prototype.hasOwnProperty.call(shortcut,"default")?shortcut["default"]:shortcut,namespaceHelper=namespaceHelper&&Object.prototype.hasOwnProperty.call(namespaceHelper,"default")?namespaceHelper["default"]:namespaceHelper,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var buffer="",stack1,helper;return buffer+=" ",(helper=helpers.className)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.className,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1),buffer}function program3(depth0,data){var buffer="",stack1;return buffer+="\n aria-"+escapeExpression((stack1=null==data||!1===data?data:data.key,"function"===typeof stack1?stack1.apply(depth0):stack1))+"=\""+escapeExpression("function"===typeof depth0?depth0.apply(depth0):depth0)+"\"\n ",buffer}function program5(depth0,data){var buffer="",stack1,helper;return buffer+="",buffer}function program6(depth0,data){return" no-label"}function program8(depth0,data){var buffer="",stack1,helper;return buffer+="",(helper=helpers.text)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.text,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",functionType="function",escapeExpression=this.escapeExpression,self=this,stack1,helper;return buffer+="\n \n ",stack1=helpers["if"].call(depth0,depth0&&depth0.icon,{hash:{},inverse:self.noop,fn:self.program(5,program5,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.text,{hash:{},inverse:self.noop,fn:self.program(8,program8,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n \n\n",buffer});const buttonData={next:{control:"move-forward",title:__("Submit and go to the next item"),specificTitle:__("Submit and go to the item %s"),icon:"forward",text:__("Next")},end:{control:"move-end",title:__("Submit and go to the end of the test"),icon:"fast-forward",text:__("End test")}},createElement=function(){let isLast=!!(0$element.removeProp("disabled").removeClass("disabled"),disableElement=$element=>$element.prop("disabled",!0).addClass("disabled"),updateElement=function($element,testRunner){let isLast=!!(2{const testContext=testRunner.getTestContext(),testMap=testRunner.getTestMap(),itemIdentifier=testContext.itemIdentifier;return navigationHelper.isLast(testMap,itemIdentifier)},doNext=nextItemWarning=>{const testContext=testRunner.getTestContext(),testMap=testRunner.getTestMap(),testPart=testRunner.getCurrentPart(),nextItemPosition=testContext.itemPosition+1,itemIdentifier=testContext.itemIdentifier,unansweredWarning=mapHelper.hasItemCategory(testMap,itemIdentifier,"unansweredWarning",!0),nextPartWarning=mapHelper.hasItemCategory(testMap,itemIdentifier,"nextPartWarning",!0)||unansweredWarning,endTestWarning=mapHelper.hasItemCategory(testMap,itemIdentifier,"endTestWarning",!0),unansweredOnly=!endTestWarning&&unansweredWarning,warningScope=nextPartWarning?"part":"test",enableNav=()=>testRunner.trigger("enablenav"),triggerNextAction=()=>{isLastItem()&&this.trigger("end"),testRunner.next()};if(testRunner.trigger("disablenav"),!1!==this.getState("enabled")){const warningHelper=nextWarningHelper({endTestWarning:endTestWarning,isLast:isLastItem(),isLinear:testPart.isLinear,nextItemWarning:nextItemWarning,nextPartWarning:nextPartWarning,nextPart:mapHelper.getItemPart(testMap,nextItemPosition),remainingAttempts:testContext.remainingAttempts,testPartId:testContext.testPartId,unansweredWarning:unansweredWarning,stats:statsHelper.getInstantStats(warningScope,testRunner),unansweredOnly:unansweredOnly});if(warningHelper.shouldWarnBeforeEndPart()){const submitButtonLabel=__("SUBMIT THIS PART");testRunner.trigger("confirm.endTestPart",messages.getExitMessage(warningScope,testRunner,"",!1,submitButtonLabel),triggerNextAction,enableNav,{buttons:{labels:{ok:submitButtonLabel,cancel:__("CANCEL")}}})}else if(warningHelper.shouldWarnBeforeEnd()){const submitButtonLabel=__("SUBMIT THE TEST");testRunner.trigger("confirm.endTest",messages.getExitMessage(warningScope,testRunner,"",!1,submitButtonLabel),triggerNextAction,enableNav,{buttons:{labels:{ok:submitButtonLabel,cancel:__("CANCEL")}}})}else warningHelper.shouldWarnBeforeNext()?testRunner.trigger("confirm.next",__("You are about to go to the next item. Click OK to continue and go to the next item."),triggerNextAction,enableNav):triggerNextAction()}};this.$element=createElement(isLastItem()),this.$element.on("click",e=>{e.preventDefault(),disableElement(this.$element),testRunner.trigger("nav-next")});const registerShortcut=kbdShortcut=>{testRunnerOptions.allowShortcuts&&kbdShortcut&&shortcut.add(namespaceHelper.namespaceAll(kbdShortcut,this.getName(),!0),()=>{!0===this.getState("enabled")&&testRunner.trigger("nav-next",!0)},{avoidInput:!0,prevent:!0})};registerShortcut(pluginShortcuts.trigger),this.disable(),testRunner.on("loaditem",()=>{updateElement(this.$element,testRunner,isLastItem())}).on("enablenav",()=>this.enable()).on("disablenav",()=>this.disable()).on("hidenav",()=>this.hide()).on("shownav",()=>this.show()).on("nav-next",nextItemWarning=>doNext(nextItemWarning)).on("enableaccessibilitymode",()=>{const kbdShortcut=pluginShortcuts.triggerAccessibility;kbdShortcut&&!this.getState("eaccessibilitymode")&&(shortcut.remove(`.${this.getName()}`),registerShortcut(kbdShortcut),this.setState("eaccessibilitymode"))})},render(){const $container=this.getAreaBroker().getNavigationArea();$container.append(this.$element)},destroy(){shortcut.remove(`.${this.getName()}`),this.$element.remove()},enable(){enableElement(this.$element)},disable(){disableElement(this.$element)},show(){hider.show(this.$element)},hide(){hider.hide(this.$element)}});return next}),define("taoQtiTest/runner/plugins/navigation/next/dialogConfirmNext",["jquery","lodash","i18n","ui/dialog","handlebars","lib/handlebars/helpers"],function($$1,_,__,dialog,Handlebars,Helpers0){"use strict";function checkboxTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}function dialogConfirmNext(heading,message,accept,refuse,checkboxParams,dialogOptions){var accepted=!1,content=null,dlg;return checkboxParams&&!0!==checkboxParams.checked&&(content=checkboxTpl({checked:!1,text:"Don't show this again next time",id:"dont-show-again"})),dialogOptions=_.defaults({heading:heading,message:message,content:content,autoRender:!0,autoDestroy:!0,buttons:[{id:"cancel",type:"regular",label:__("Cancel"),close:!0},{id:"ok",type:"info",label:__("Go to next item"),close:!0}],onOkBtn:function onOkBtn(){var $checkbox;accepted=!0,_.isFunction(accept)&&(accept.call(this),checkboxParams&&($checkbox=$$1("input[name=\"dont-show-again\"]",this),$checkbox.prop("checked")&&_.isFunction(checkboxParams.submitChecked)?checkboxParams.submitChecked():!$checkbox.prop("checked")&&_.isFunction(checkboxParams.submitUnchecked)&&checkboxParams.submitUnchecked()))}},dialogOptions),dlg=dialog(dialogOptions),_.isFunction(refuse)&&dlg.on("closed.modal",function(){accepted||refuse.call(this)}),dlg}$$1=$$1&&Object.prototype.hasOwnProperty.call($$1,"default")?$$1["default"]:$$1,_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,dialog=dialog&&Object.prototype.hasOwnProperty.call(dialog,"default")?dialog["default"]:dialog,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){return"checked"}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",functionType="function",escapeExpression=this.escapeExpression,self=this,stack1,helper;return buffer+="",buffer});return dialogConfirmNext}),define("taoQtiTest/runner/plugins/navigation/next/linearNextItemWarning",["i18n","taoTests/runner/plugin","taoQtiTest/runner/helpers/map","taoQtiTest/runner/helpers/currentItem","taoQtiTest/runner/plugins/navigation/next/dialogConfirmNext","taoQtiTest/runner/helpers/navigation"],function(__,pluginFactory,mapHelper,currentItemHelper,dialogConfirmNext,navigationHelper){"use strict";__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper,currentItemHelper=currentItemHelper&&Object.prototype.hasOwnProperty.call(currentItemHelper,"default")?currentItemHelper["default"]:currentItemHelper,dialogConfirmNext=dialogConfirmNext&&Object.prototype.hasOwnProperty.call(dialogConfirmNext,"default")?dialogConfirmNext["default"]:dialogConfirmNext,navigationHelper=navigationHelper&&Object.prototype.hasOwnProperty.call(navigationHelper,"default")?navigationHelper["default"]:navigationHelper;var linearNextItemWarning=pluginFactory({name:"linearNextItemWarning",init(){function getNextItemCategories(){const testContext=testRunner.getTestContext(),testMap=testRunner.getTestMap();return{nextPartWarning:mapHelper.hasItemCategory(testMap,testContext.itemIdentifier,"nextPartWarning",!0),nextSectionWarning:mapHelper.hasItemCategory(testMap,testContext.itemIdentifier,"nextSectionWarning",!0)}}function getCustomNextMessage(action){var itemPartiallyAnswered=currentItemHelper.isAnswered(testRunner,!0),customNextMessage;return customNextMessage=itemPartiallyAnswered?"next"===action?__("Are you sure you want to go to the next item? You will not be able to go back and change your answer."):"skip"===action?__("Are you sure you want to clear your answer and go to the next item? You will not be able to go back and provide an answer."):__("Are you sure you want to go to the next item? You will not be able to go back."):__("Are you sure you want to go to the next item? You will not be able to go back and provide an answer."),customNextMessage}function doNextWarning(action){return testRunner.trigger("disablenav"),testStore.getStore(self.getName()).then(function(store){return store.getItem("dontShowLinearNextItemWarning").then(function(checkboxValue){var checkboxParams=null;if(!0!==checkboxValue)return testRunnerOptions.enableLinearNextItemWarningCheckbox&&(checkboxParams={checked:checkboxValue,submitChecked:function(){store.setItem("dontShowLinearNextItemWarning",!0)},submitUnchecked:function(){store.setItem("dontShowLinearNextItemWarning",!1)}}),new Promise(function(resolve,reject){dialogConfirmNext(__("Go to the next item?"),getCustomNextMessage(action),resolve,function cancel(){reject({cancel:!0})},checkboxParams)})})}).catch(function(err){if(err&&err instanceof Error)throw err;return err&&!0===err.cancel?(testRunner.trigger("enablenav"),Promise.reject()):void 0})}const self=this,testRunner=this.getTestRunner(),testRunnerOptions=testRunner.getOptions(),testStore=testRunner.getTestStore();testStore.setVolatile(self.getName()),testRunner.on("init",function(){testStore.getStore(self.getName()).then(function(store){store.setItem("dontShowLinearNextItemWarning",null)})}).before("move skip",function(e,type,scope){const context=testRunner.getTestContext(),map=testRunner.getTestMap(),item=testRunner.getCurrentItem(),currentPart=testRunner.getCurrentPart(),categories=getNextItemCategories(),isLast=navigationHelper.isLast(map,context.itemIdentifier);if(currentPart&¤tPart.isLinear){if("section"===scope&&categories.nextSectionWarning)return;if(categories.nextPartWarning)return;if(item.informational)return;if("next"===type&&!isLast&&testRunnerOptions.forceEnableLinearNextItemWarning)return doNextWarning("next");if("skip"===e.name&&!isLast&&testRunnerOptions.forceEnableLinearNextItemWarning)return doNextWarning("skip")}})}});return linearNextItemWarning}),define("taoQtiTest/runner/plugins/navigation/nextSection",["jquery","lodash","i18n","ui/hider","taoTests/runner/plugin","taoQtiTest/runner/helpers/messages","handlebars","lib/handlebars/helpers","taoQtiTest/runner/helpers/map"],function($$1,_,__,hider,pluginFactory,messages,Handlebars,Helpers0,mapHelper){"use strict";function buttonTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}$$1=$$1&&Object.prototype.hasOwnProperty.call($$1,"default")?$$1["default"]:$$1,_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,hider=hider&&Object.prototype.hasOwnProperty.call(hider,"default")?hider["default"]:hider,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,messages=messages&&Object.prototype.hasOwnProperty.call(messages,"default")?messages["default"]:messages,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var buffer="",stack1,helper;return buffer+=" ",(helper=helpers.className)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.className,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1),buffer}function program3(depth0,data){var buffer="",stack1;return buffer+="\n aria-"+escapeExpression((stack1=null==data||!1===data?data:data.key,"function"===typeof stack1?stack1.apply(depth0):stack1))+"=\""+escapeExpression("function"===typeof depth0?depth0.apply(depth0):depth0)+"\"\n ",buffer}function program5(depth0,data){var buffer="",stack1,helper;return buffer+="",buffer}function program6(depth0,data){return" no-label"}function program8(depth0,data){var buffer="",stack1,helper;return buffer+="",(helper=helpers.text)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.text,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",functionType="function",escapeExpression=this.escapeExpression,self=this,stack1,helper;return buffer+="\n \n ",stack1=helpers["if"].call(depth0,depth0&&depth0.icon,{hash:{},inverse:self.noop,fn:self.program(5,program5,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.text,{hash:{},inverse:self.noop,fn:self.program(8,program8,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n \n\n",buffer}),nextSection=pluginFactory({name:"nextsection",init(){function getNextSectionCategories(){const testContext=testRunner.getTestContext(),testMap=testRunner.getTestMap();return{nextSection:mapHelper.hasItemCategory(testMap,testContext.itemIdentifier,"nextSection",!0),nextSectionWarning:mapHelper.hasItemCategory(testMap,testContext.itemIdentifier,"nextSectionWarning",!0),noExitTimedSectionWarning:mapHelper.hasItemCategory(testMap,testContext.itemIdentifier,"noExitTimedSectionWarning",!0)}}function toggle(){const categories=getNextSectionCategories();testRunnerOptions.nextSection&&(categories.nextSection||categories.nextSectionWarning)?self.show():self.hide()}function nextSection(){testRunner.next("section")}const self=this,testRunner=this.getTestRunner(),testRunnerOptions=testRunner.getOptions(),isWarnSectionLeavingEabled=()=>{const testContext=testRunner.getTestContext(),categories=getNextSectionCategories(),timeConstraints=testContext.timeConstraints||[];return timeConstraints.some(_ref=>{let{source}=_ref;return source===testContext.sectionId})&&!categories.noExitTimedSectionWarning&&!(testRunnerOptions.timer||{}).keepUpToTimeout};this.$element=$$1(buttonTpl({control:"next-section",title:__("Skip to the next section"),icon:"fast-forward",text:__("Next Section")})),this.$element.on("click",function(e){const enable=_.bind(self.enable,self),categories=getNextSectionCategories();if(e.preventDefault(),!1!==self.getState("enabled"))if(self.disable(),categories.nextSectionWarning&&!isWarnSectionLeavingEabled()){const submitButtonLabel=__("CONTINUE TO THE NEXT SECTION");testRunner.trigger("confirm.nextsection",messages.getExitMessage("section",testRunner,"",!1,submitButtonLabel),nextSection,enable,{buttons:{labels:{ok:submitButtonLabel,cancel:__("CANCEL")}}})}else nextSection()}),this.disable(),toggle(),testRunner.on("loaditem",toggle).on("enablenav",function(){self.enable()}).on("disablenav",function(){self.disable()}).on("hidenav",function(){self.hide()}).on("shownav",function(){self.show()})},render:function render(){var $container=this.getAreaBroker().getNavigationArea();$container.append(this.$element)},destroy:function destroy(){this.$element.remove()},enable:function enable(){this.$element.removeProp("disabled").removeClass("disabled")},disable:function disable(){this.$element.prop("disabled",!0).addClass("disabled")},show:function show(){hider.show(this.$element)},hide:function hide(){hider.hide(this.$element)}});return nextSection}),define("taoQtiTest/runner/plugins/navigation/previous",["jquery","lodash","i18n","ui/hider","taoTests/runner/plugin","util/shortcut","util/namespace","taoQtiTest/runner/helpers/navigation","taoQtiTest/runner/helpers/map","handlebars","lib/handlebars/helpers"],function($$1,_,__,hider,pluginFactory,shortcut,namespaceHelper,navigationHelper,mapHelper,Handlebars,Helpers0){"use strict";function buttonTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}$$1=$$1&&Object.prototype.hasOwnProperty.call($$1,"default")?$$1["default"]:$$1,_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,hider=hider&&Object.prototype.hasOwnProperty.call(hider,"default")?hider["default"]:hider,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,shortcut=shortcut&&Object.prototype.hasOwnProperty.call(shortcut,"default")?shortcut["default"]:shortcut,namespaceHelper=namespaceHelper&&Object.prototype.hasOwnProperty.call(namespaceHelper,"default")?namespaceHelper["default"]:namespaceHelper,navigationHelper=navigationHelper&&Object.prototype.hasOwnProperty.call(navigationHelper,"default")?navigationHelper["default"]:navigationHelper,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var buffer="",stack1,helper;return buffer+=" ",(helper=helpers.className)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.className,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1),buffer}function program3(depth0,data){var buffer="",stack1;return buffer+="\n aria-"+escapeExpression((stack1=null==data||!1===data?data:data.key,"function"===typeof stack1?stack1.apply(depth0):stack1))+"=\""+escapeExpression("function"===typeof depth0?depth0.apply(depth0):depth0)+"\"\n ",buffer}function program5(depth0,data){var buffer="",stack1,helper;return buffer+="",buffer}function program6(depth0,data){return" no-label"}function program8(depth0,data){var buffer="",stack1,helper;return buffer+="",(helper=helpers.text)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.text,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",functionType="function",escapeExpression=this.escapeExpression,self=this,stack1,helper;return buffer+="\n \n ",stack1=helpers["if"].call(depth0,depth0&&depth0.icon,{hash:{},inverse:self.noop,fn:self.program(5,program5,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.text,{hash:{},inverse:self.noop,fn:self.program(8,program8,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n \n\n",buffer}),previous=pluginFactory({name:"previous",init(){function doPrevious(previousItemWarning){function enableNav(){testRunner.trigger("enablenav")}function triggerAction(){testRunner.previous()}var context=testRunner.getTestContext();testRunner.trigger("disablenav"),!1!==self.getState("enabled")&&(previousItemWarning&&-1!==context.remainingAttempts?testRunner.trigger("confirm.previous",__("You are about to go to the previous item. Click OK to continue and go to the previous item."),triggerAction,enableNav):triggerAction())}const self=this,testRunner=this.getTestRunner(),testRunnerOptions=testRunner.getOptions(),pluginShortcuts=(testRunnerOptions.shortcuts||{})[this.getName()]||{};var canDoPrevious=function canDoPrevious(){const testMap=testRunner.getTestMap(),context=testRunner.getTestContext(),currentSection=testRunner.getCurrentSection(),noExitTimedSectionWarning=mapHelper.hasItemCategory(testMap,context.itemIdentifier,"noExitTimedSectionWarning",!0),currentPart=testRunner.getCurrentPart();let previousSection,previousPart;if(_.isPlainObject(testMap)&&0===_.size(testMap))return!1;if(navigationHelper.isFirst(testMap,context.itemIdentifier))return!1;if(navigationHelper.isFirstOf(testMap,context.itemIdentifier,"section")){if(currentSection.isCatAdaptive)return!1;if(previousSection=mapHelper.getItemSection(testMap,context.itemPosition-1),previousSection.isCatAdaptive||previousSection.timeConstraint&&!noExitTimedSectionWarning)return!1}return!(navigationHelper.isFirstOf(testMap,context.itemIdentifier,"part")&&(previousPart=mapHelper.getItemPart(testMap,context.itemPosition-1),previousPart.isLinear))&&!1===currentPart.isLinear&&!0===context.canMoveBackward},toggle=function toggle(){canDoPrevious()?self.show():self.hide()};this.$element=$$1(buttonTpl({control:"move-backward",title:__("Submit and go to the previous item"),icon:"backward",text:__("Previous")})),this.$element.on("click",function(e){e.preventDefault(),testRunner.trigger("nav-previous")});const registerShortcut=kbdShortcut=>{testRunnerOptions.allowShortcuts&&kbdShortcut&&shortcut.add(namespaceHelper.namespaceAll(kbdShortcut,this.getName(),!0),function(){canDoPrevious()&&!0===self.getState("enabled")&&testRunner.trigger("nav-previous",[!0])},{avoidInput:!0,prevent:!0})};registerShortcut(pluginShortcuts.trigger),toggle(),self.disable(),testRunner.on("loaditem",toggle).on("enablenav",function(){self.enable()}).on("disablenav",function(){self.disable()}).on("hidenav",function(){self.hide()}).on("shownav",function(){self.show()}).on("nav-previous",function(previousItemWarning){doPrevious(previousItemWarning)}).on("enableaccessibilitymode",()=>{const kbdShortcut=pluginShortcuts.triggerAccessibility;kbdShortcut&&!this.getState("eaccessibilitymode")&&(shortcut.remove(`.${this.getName()}`),registerShortcut(kbdShortcut),this.setState("eaccessibilitymode"))})},render:function render(){var $container=this.getAreaBroker().getNavigationArea();$container.append(this.$element)},destroy:function destroy(){shortcut.remove(`.${this.getName()}`),this.$element.remove()},enable:function enable(){this.$element.removeProp("disabled").removeClass("disabled")},disable:function disable(){this.$element.prop("disabled",!0).addClass("disabled")},show:function show(){hider.show(this.$element)},hide:function hide(){hider.hide(this.$element)}});return previous}),define("taoQtiTest/runner/plugins/navigation/review/navigator",["jquery","lodash","ui/component","ui/autoscroll","taoQtiTest/runner/helpers/map","handlebars","lib/handlebars/helpers"],function($$1,_,component,autoscroll,mapHelper,Handlebars,Helpers0){"use strict";function navigatorTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}function navigatorTreeTpl(data,options,asString){var html=Template$1(data,options);return asString||!0?html:$(html)}function navigatorFactory(config){function flagItem($item){var position=$item.data("position"),flagged=!$item.hasClass(_cssCls.flagged);navigator.setItemFlag(position,flagged),navigator.trigger("flag",position,flagged)}function jump($item){var position=$item.data("position");navigator.trigger("jump",position)}var navigator;return navigator=component(navigatorApi,_defaults).setTemplate(navigatorTpl).on("destroy",function(){this.controls=null}).on("show",function(){this.autoScroll()}).on("render",function(){var self=this,$component=this.getElement(),$filterBar=$component.find(_selectors.filterBar),$filters=$filterBar.find("li"),$tree=$component.find(_selectors.tree);this.controls={$infoAnswered:$component.find(_selectors.infoAnswered),$infoViewed:$component.find(_selectors.infoViewed),$infoAll:$component.find(_selectors.tabInfoAll),$infoUnanswered:this.config.showLegend?$component.find(_selectors.infoUnanswered):$component.find(_selectors.tabInfoUnanswered),$infoFlagged:this.config.showLegend?$component.find(_selectors.infoFlagged):$component.find(_selectors.tabInfoFlagged),$filterBar:$filterBar,$filters:$filters,$tree:$tree,$linearState:$component.find(_selectors.linearState)},this.updateConfig(),$component.on(`click${_selectors.component}`,_selectors.collapseHandle,function(){self.is("disabled")||($component.toggleClass(_cssCls.collapsed),$component.hasClass(_cssCls.collapsed)&&self.openSelected())}),$component.on(`click${_selectors.component}`,_selectors.infoPanelLabels,function(){self.is("disabled")||self.togglePanel($$1(this).closest(_selectors.infoPanel),_selectors.infoPanel)}),$tree.on(`click${_selectors.component}`,_selectors.partLabels,function(){var $panel;self.is("disabled")||($panel=$$1(this).closest(_selectors.parts),self.togglePanel($panel,_selectors.parts)&&($panel.hasClass(_cssCls.active)?self.openSelected():self.openOnly($panel.find(_selectors.sections).first(),$panel)))}),$tree.on(`click${_selectors.component}`,_selectors.sectionLabels,function(){self.is("disabled")||self.togglePanel($$1(this).closest(_selectors.sections),_selectors.sections)}),$tree.on(`click${_selectors.component}`,_selectors.itemLabels,function(event){var $item,$target;self.is("disabled")||($item=$$1(this).closest(_selectors.items),!$item.hasClass(_cssCls.disabled)&&($target=$$1(event.target),self.config.canFlag&&$target.is(_selectors.icons)&&!$component.hasClass(_cssCls.collapsed)?!$item.hasClass(_cssCls.unseen)&&!$item.hasClass(_cssCls.info)&&flagItem($item):!$item.hasClass(_cssCls.active)&&(self.select($item),jump($item))))}),$tree.on(`click${_selectors.component}`,_selectors.linearStart,function(){var $btn;self.is("disabled")||($btn=$$1(this),!$btn.hasClass(_cssCls.disabled)&&($btn.addClass(_cssCls.disabled),jump($btn)))}),$filterBar.on(`click${_selectors.component}`,_selectors.filter,function(){var $btn,mode;self.is("disabled")||($btn=$$1(this),mode=$btn.data("mode"),$filters.removeClass(_cssCls.active),$filters.attr("aria-selected",!1),$component.removeClass(_cssCls.collapsed),$btn.addClass(_cssCls.active),$btn.attr("aria-selected",!0),self.filter(mode),self.autoScroll())})}),navigator.currentFilter="all",navigator.init(config)}$$1=$$1&&Object.prototype.hasOwnProperty.call($$1,"default")?$$1["default"]:$$1,_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,component=component&&Object.prototype.hasOwnProperty.call(component,"default")?component["default"]:component,autoscroll=autoscroll&&Object.prototype.hasOwnProperty.call(autoscroll,"default")?autoscroll["default"]:autoscroll,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){return" hidden"}function program3(depth0,data){var buffer="",helper,options;return buffer+="\n
          \n \n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Test status",options):helperMissing.call(depth0,"__","Test status",options)))+"\n \n \n \n
            \n
          • \n \n \n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Viewed",options):helperMissing.call(depth0,"__","Viewed",options)))+"\n -/-\n \n
          • \n
          • \n \n \n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Answered",options):helperMissing.call(depth0,"__","Answered",options)))+"\n -/-\n \n
          • \n
          • \n \n \n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Unanswered",options):helperMissing.call(depth0,"__","Unanswered",options)))+"\n -/-\n \n
          • \n
          • \n \n \n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Flagged",options):helperMissing.call(depth0,"__","Flagged",options)))+"\n -/-\n \n
          • \n
          \n
          \n ",buffer}function program5(depth0,data){return"(0)"}function program7(depth0,data){return"icon-unanswered "}function program9(depth0,data){var buffer="",helper,options;return buffer+=escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Unanswered",options):helperMissing.call(depth0,"__","Unanswered",options)))+" (0)",buffer}function program11(depth0,data){return"icon-flagged "}function program13(depth0,data){var buffer="",helper,options;return buffer+=escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Flagged",options):helperMissing.call(depth0,"__","Flagged",options)))+" (0)",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",helperMissing=helpers.helperMissing,escapeExpression=this.escapeExpression,self=this,stack1,helper,options;return buffer+="
          \n
          \n \n \n
          \n ",stack1=helpers["if"].call(depth0,depth0&&depth0.showLegend,{hash:{},inverse:self.noop,fn:self.program(3,program3,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n\n\n
          \n
            \n
          • \n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"All",options):helperMissing.call(depth0,"__","All",options)))+"\n ",stack1=helpers.unless.call(depth0,depth0&&depth0.showLegend,{hash:{},inverse:self.noop,fn:self.program(5,program5,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n \n
          • \n\n
          • \n \n ",stack1=helpers.unless.call(depth0,depth0&&depth0.showLegend,{hash:{},inverse:self.noop,fn:self.program(9,program9,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n \n
          • \n\n
          • \n \n ",stack1=helpers.unless.call(depth0,depth0&&depth0.showLegend,{hash:{},inverse:self.noop,fn:self.program(13,program13,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n \n
          • \n
          \n
          \n\n \n\n
          \n \n

          \n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"In this part of the test navigation is not allowed.",options):helperMissing.call(depth0,"__","In this part of the test navigation is not allowed.",options)))+"\n

          \n
          \n
          \n",buffer});Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template$1=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var buffer="",stack1,helper;return buffer+="\n
        • \n \n ",(helper=helpers.label)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.label,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\n \n \n \n ",stack1=helpers["if"].call(depth0,depth0&&depth0.isLinear,{hash:{},inverse:self.program(8,program8,data),fn:self.program(6,program6,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n
        • \n ",buffer}function program2(depth0,data){return"active"}function program4(depth0,data){return"collapsed"}function program6(depth0,data){var buffer="",stack1,helper,options;return buffer+="\n
          \n \n

          \n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"In this part of the test navigation is not allowed.",options):helperMissing.call(depth0,"__","In this part of the test navigation is not allowed.",options)))+"\n

          \n

          \n \n

          \n
          \n ",buffer}function program8(depth0,data){var buffer="",stack1,helper;return buffer+="\n
            \n ",stack1=helpers.each.call(depth0,depth0&&depth0.sections,{hash:{},inverse:self.noop,fn:self.program(9,program9,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n
          \n ",buffer}function program9(depth0,data){var buffer="",stack1,helper;return buffer+="\n
        • \n \n ",(helper=helpers.label)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.label,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\n "+escapeExpression((stack1=(stack1=depth0&&depth0.stats,null==stack1||!1===stack1?stack1:stack1.answered),"function"===typeof stack1?stack1.apply(depth0):stack1))+"/"+escapeExpression((stack1=(stack1=depth0&&depth0.stats,null==stack1||!1===stack1?stack1:stack1.total),"function"===typeof stack1?stack1.apply(depth0):stack1))+"\n \n
            \n ",stack1=helpers.each.call(depth0,depth0&&depth0.items,{hash:{},inverse:self.noop,fn:self.programWithDepth(10,program10,data,depth0),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n
          \n
        • \n ",buffer}function program10(depth0,data,depth1){var buffer="",stack1,helper;return buffer+="\n
        • \n \n \n ",(helper=helpers.index)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.index,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\n ",(helper=helpers.label)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.label,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\n \n
        • \n ",buffer}function program11(depth0,data){return"false"}function program13(depth0,data){return"true"}function program15(depth0,data){return"aria-current=\"page\""}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",helperMissing=helpers.helperMissing,escapeExpression=this.escapeExpression,functionType="function",self=this,stack1;return buffer+="
            \n ",stack1=helpers.each.call(depth0,depth0&&depth0.parts,{hash:{},inverse:self.noop,fn:self.program(1,program1,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n
          \n",buffer}),_defaults={scope:"test",canCollapse:!1,preventsUnseen:!0,hidden:!1},_cssCls={active:"active",collapsed:"collapsed",collapsible:"collapsible",hidden:"hidden",disabled:"disabled",flagged:"flagged",answered:"answered",viewed:"viewed",unseen:"unseen",info:"info",icon:"qti-navigator-icon",scope:{test:"scope-test",testPart:"scope-test-part",testSection:"scope-test-section"}},_iconCls=[_cssCls.info,_cssCls.flagged,_cssCls.answered,_cssCls.viewed],_selectors={component:".qti-navigator",filterBar:".qti-navigator-filters",filter:".qti-navigator-filter",tree:".qti-navigator-tree",collapseHandle:".qti-navigator-collapsible",linearState:".qti-navigator-linear",infoAnswered:".qti-navigator-answered .qti-navigator-counter",infoViewed:".qti-navigator-viewed .qti-navigator-counter",infoUnanswered:".qti-navigator-unanswered .qti-navigator-counter",infoFlagged:".qti-navigator-flagged .qti-navigator-counter",infoPanel:".qti-navigator-info",infoPanelLabels:".qti-navigator-info > .qti-navigator-label",tabInfoAll:"[data-mode=\"all\"] .qti-navigator-counter",tabInfoUnanswered:"[data-mode=\"unanswered\"] .qti-navigator-counter",tabInfoFlagged:"[data-mode=\"flagged\"] .qti-navigator-counter",parts:".qti-navigator-part",partLabels:".qti-navigator-part > .qti-navigator-label",sections:".qti-navigator-section",sectionLabels:".qti-navigator-section > .qti-navigator-label",items:".qti-navigator-item",itemLabels:".qti-navigator-item > .qti-navigator-label",itemIcons:".qti-navigator-item > .qti-navigator-icon",activeItem:".qti-navigator-item.active",icons:".qti-navigator-icon",linearStart:".qti-navigator-linear-part button",counters:".qti-navigator-counter",actives:".active",collapsible:".collapsible",collapsiblePanels:".collapsible-panel",unseen:".unseen",answered:".answered",flagged:".flagged",notFlagged:":not(.flagged)",notAnswered:":not(.answered)",notInformational:":not(.info)",informational:".info",hidden:".hidden",disabled:".disabled"},_filterMap={all:"",unanswered:[_selectors.answered,_selectors.informational].join(","),flagged:_selectors.notFlagged,answered:_selectors.notAnswered,filtered:_selectors.hidden},navigatorApi={updateStats:function updateStats(position,flag){var map=this.map,item;map&&(item=mapHelper.getItemAt(map,position),item&&(item.flagged=flag,mapHelper.updateItemStats(map,position)))},getProgressionTotal:function getProgressionTotal(progression,target){var total;return total="questions"===target?progression.questions:progression.total,total},setItemFlag:function setItemFlag(position,flag){var $item=position&&position.jquery?position:this.controls.$tree.find(`[data-position=${position}]`),progression=this.progression,icon;this.updateStats(position,flag),$item.toggleClass(_cssCls.flagged,flag),icon=_.find(_iconCls,_.bind($item.hasClass,$item))||_cssCls.unseen,$item.find(_selectors.icons).attr("class",`${_cssCls.icon} icon-${icon}`),progression.flagged=this.controls.$tree.find(_selectors.flagged).length,this.writeCount(this.controls.$infoFlagged,progression.flagged,this.getProgressionTotal(progression,"questions")),this.filter(this.currentFilter)},filter:function filter(criteria){var self=this,$items=this.controls.$tree.find(_selectors.items).removeClass(_cssCls.hidden),filterCb=_filterMap[criteria];filterCb&&$items.filter(filterCb).addClass(_cssCls.hidden),this.controls.$tree.find(_selectors.sections).each(function(){var $section=$$1(this),$itemsFound=$section.find(_selectors.items).not(_selectors.hidden),$filtered=$itemsFound.not(_selectors.disabled);self.writeCount($section.find(_selectors.counters),$filtered.length,$itemsFound.length)}),this.currentFilter=criteria},updateConfig:function updateConfig(config){var $component=this.getElement(),scopeClass=_cssCls.scope[this.config.scope||_defaults.scope];return config=_.merge(this.config,config||{}),$component.toggleClass(_cssCls.collapsible,config.canCollapse),$component.removeClass(scopeClass),scopeClass=_cssCls.scope[this.config.scope||_defaults.scope],$component.addClass(scopeClass),this},autoScroll:function autoScroll(){autoscroll(this.controls.$tree.find(_selectors.activeItem),this.controls.$tree)},update(map,context){const scopedMap=this.getScopedMap(map,context),testPart=mapHelper.getPart(map,context.testPartId),progression=scopedMap.stats||{questions:0,answered:0,flagged:0,viewed:0,total:0},totalQuestions=this.getProgressionTotal(progression,"questions");if(this.map=map,this.progression=progression,this.writeCount(this.controls.$infoAnswered,progression.answered,totalQuestions),this.writeCount(this.controls.$infoUnanswered,totalQuestions-progression.answered,totalQuestions),this.writeCount(this.controls.$infoViewed,progression.viewed,this.getProgressionTotal(progression,"total")),this.writeCount(this.controls.$infoFlagged,progression.flagged,totalQuestions),this.writeCount(this.controls.$infoAll,totalQuestions,null),!testPart.isLinear){this.controls.$filterBar.show(),this.controls.$linearState.hide(),this.controls.$tree.html(navigatorTreeTpl(scopedMap)),this.autoScroll();const activeItem=mapHelper.getActiveItem(scopedMap);this.setState("prevents-unseen",this.config.preventsUnseen);const isSkipaheadEnabled=activeItem&&activeItem.categories&&0<=_.indexOf(activeItem.categories,"x-tao-option-review-skipahead");this.setState("skipahead-enabled",isSkipaheadEnabled),this.config.preventsUnseen&&!isSkipaheadEnabled&&this.controls.$tree.find(_selectors.unseen).addClass(_cssCls.disabled)}else this.controls.$filterBar.hide(),this.controls.$linearState.show(),this.controls.$tree.empty();return this.filter(this.controls.$filters.filter(_selectors.actives).data("mode")),this.trigger("update"),this},getScopedMap:function getScopedMap(map,context){var scopedMap=mapHelper.getScopeMapFromContext(map,context,this.config.scope),testPart=mapHelper.getPart(scopedMap,context.testPartId)||{},section=mapHelper.getSection(scopedMap,context.sectionId)||{},item=mapHelper.getItem(scopedMap,context.itemIdentifier)||{};testPart.active=!0,section.active=!0,item.active=!0;let counter=0;return mapHelper.each(scopedMap,function(itm){var cls=[],icon="";itm.active&&cls.push("active"),itm.informational&&(cls.push("info"),icon=icon||"info"),itm.flagged&&(cls.push("flagged"),icon=icon||"flagged"),itm.answered&&(cls.push("answered"),icon=icon||"answered"),itm.viewed?(cls.push("viewed"),icon=icon||"viewed"):(cls.push("unseen"),icon=icon||"unseen"),itm.informational||(counter+=1,itm.numberTest=counter),itm.cls=cls.join(" "),itm.icon=icon})},writeCount:function writeCount($place,count,total){var display=0;$place.parent().hasClass("qti-navigator-tab")?display=Math.max(count,0):0c.destroy()),component.itemButtonListComponents=[],component.controls.$tree.find(_selectors.itemButtonListContainer).each((index,itemButtonListContainerElem)=>{const itemButtonListComponent=itemButtonListFactory({items:fizzyItemButtonMap.sections[index].items,scrollContainer:component.controls.$tree}).render(itemButtonListContainerElem).on("click",_ref=>{let{id}=_ref;return onItemClick(id)});component.itemButtonListComponents.push(itemButtonListComponent)}),component.itemButtonListComponents.forEach(c=>c.setActiveItem(activeItemId))}function getFizzyItemButtonMap(scopedMap,disableUnseenItems){const{displaySectionTitles,displayItemTooltip}=component.getConfig();let nonInformationalCount=0;const fizzyMap={sections:[]};return _.forEach(scopedMap.parts,function(part){_.forEach(part.sections,function(dataSection){let fizzySection;displaySectionTitles?(fizzySection={label:dataSection.label,items:[]},fizzyMap.sections.push(fizzySection)):fizzyMap.sections.length?fizzySection=fizzyMap.sections[0]:(fizzySection={items:[]},fizzyMap.sections.push(fizzySection)),_.forEach(dataSection.items,function(dataItem){dataItem.informational||nonInformationalCount++;const fizzyItem={id:dataItem.id,position:dataItem.position};fizzySection.items.push(fizzyItem),fizzyItem.numericLabel=dataItem.informational?"":`${nonInformationalCount}`,dataItem.informational?(fizzyItem.icon="info",fizzyItem.ariaLabel=__("Informational item")):dataItem.flagged?(fizzyItem.icon="flagged",fizzyItem.ariaLabel=__("Bookmarked question %s",nonInformationalCount)):(fizzyItem.icon=null,fizzyItem.ariaLabel=__("Question %s",nonInformationalCount)),fizzyItem.status=dataItem.answered?"answered":dataItem.viewed?"viewed":"unseen",disableUnseenItems&&!dataItem.viewed?fizzyItem.disabled=!0:displayItemTooltip&&(fizzyItem.title=dataItem.label)})})}),fizzyMap}let component;const navigatorApi={setItemFlag(position,flag){const updatedMap=_.cloneDeep(this.map),updatedItem=mapHelper.getItemAt(updatedMap,position);if(updatedItem&&updatedItem.id){updatedItem.flagged=flag;const updatedScopeMap=mapHelper.getScopeMapFromContext(updatedMap,this.testContext,this.config.scope),updatedFizzyMap=getFizzyItemButtonMap(updatedScopeMap,this.disableUnseenItems);let updatedItemData;_.forEach(updatedFizzyMap.sections,fizzySection=>{if(updatedItemData=_.find(fizzySection.items,fizzyItem=>fizzyItem.id===updatedItem.id),updatedItemData)return!1}),this.itemButtonListComponents.forEach(c=>c.updateItem(updatedItem.id,updatedItemData))}},updateConfig(){return this},update(map,context){const scopedMap=mapHelper.getScopeMapFromContext(map,context,this.config.scope);scopedMap.displaySectionTitles=this.getConfig().displaySectionTitles;const activeItemId=context.itemIdentifier,isSkipaheadEnabled=mapHelper.hasItemCategory(map,activeItemId,"x-tao-option-review-skipahead");this.map=map,this.testContext=context,this.disableUnseenItems=this.config.preventsUnseen&&!isSkipaheadEnabled;const testPart=mapHelper.getPart(map,context.testPartId);if(!testPart.isLinear){this.setState("skipahead-enabled",isSkipaheadEnabled),this.setState("prevents-unseen",this.config.preventsUnseen),this.controls.$linearState.hide(),this.controls.$tree.html(navigatorTreeTpl(scopedMap));const fizzyItemButtonMap=getFizzyItemButtonMap(scopedMap,this.disableUnseenItems);renderItemButtonListComponents(fizzyItemButtonMap,activeItemId)}else this.controls.$linearState.show(),this.controls.$tree.empty();return this.trigger("update"),this},select(position){let previousPosition=0;const previousItem=mapHelper.getItem(this.map,this.testContext.itemIdentifier);previousItem&&previousItem.id&&(previousPosition=previousItem.position);const item=mapHelper.getItemAt(this.map,parseInt(position));item&&item.id&&this.itemButtonListComponents.forEach(c=>c.setActiveItem(item.id)),this.trigger("selected",position,previousPosition)}};return component=componentFactory(navigatorApi,_defaults).setTemplate(navigatorTpl).on("init",function(){this.itemButtonListComponents=[]}).on("destroy",function(){this.controls=null,this.itemButtonListComponents.forEach(c=>c.destroy()),this.itemButtonListComponents=[]}).on("render",function(){const $component=this.getElement();this.controls={$tree:$component.find(_selectors.tree),$linearState:$component.find(_selectors.linearState),$closeButton:$component.find(_selectors.closeButton)},this.controls.$closeButton.on("click",function(e){e.preventDefault(),component.trigger("close")})}).on("enable",function(){this.itemButtonListComponents.forEach(c=>c.enable())}).on("disable",function(){this.itemButtonListComponents.forEach(c=>c.disable())}),component.init(config)}_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,componentFactory=componentFactory&&Object.prototype.hasOwnProperty.call(componentFactory,"default")?componentFactory["default"]:componentFactory,itemButtonListFactory=itemButtonListFactory&&Object.prototype.hasOwnProperty.call(itemButtonListFactory,"default")?itemButtonListFactory["default"]:itemButtonListFactory,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){return" hidden"}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",self=this,helperMissing=helpers.helperMissing,escapeExpression=this.escapeExpression,stack1,helper,options;return buffer+="
          \n
          \n
          "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Test overview",options):helperMissing.call(depth0,"__","Test overview",options)))+"
          \n \n
          \n \n
          \n

          \n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"In this part of the test navigation is not allowed.",options):helperMissing.call(depth0,"__","In this part of the test navigation is not allowed.",options)))+"\n

          \n
          \n
          \n",buffer});Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template$1=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var buffer="",stack1;return buffer+="\n ",stack1=helpers.each.call(depth0,depth0&&depth0.parts,{hash:{},inverse:self.noop,fn:self.program(2,program2,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n",buffer}function program2(depth0,data){var buffer="",stack1;return buffer+="\n ",stack1=helpers.each.call(depth0,depth0&&depth0.sections,{hash:{},inverse:self.noop,fn:self.program(3,program3,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",buffer}function program3(depth0,data){var buffer="",stack1,helper;return buffer+="\n
        • \n
          \n ",(helper=helpers.label)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.label,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\n
          \n
          \n
        • \n ",buffer}function program5(depth0,data){return"\n
        • \n
          \n
        • \n"}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",functionType="function",escapeExpression=this.escapeExpression,self=this,stack1;return buffer+="
            \n",stack1=helpers["if"].call(depth0,depth0&&depth0.displaySectionTitles,{hash:{},inverse:self.program(5,program5,data),fn:self.program(1,program1,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n
          \n",buffer});const _defaults={scope:"test",preventsUnseen:!0},_selectors={component:".qti-navigator",tree:".qti-navigator-tree",linearState:".qti-navigator-linear",closeButton:".icon-close",itemButtonListContainer:".qti-navigator-items"};return navigatorFactory}),define("taoQtiTest/runner/plugins/navigation/review/review",["lodash","i18n","ui/hider","util/shortcut","util/namespace","taoTests/runner/plugin","taoQtiTest/runner/helpers/map","taoQtiTest/runner/plugins/navigation/review/navigator","taoQtiTest/runner/plugins/navigation/review/navigatorFizzy"],function(_,__,hider,shortcut,namespaceHelper,pluginFactory,mapHelper,defaultNavigatorFactory,fizzyNavigatorFactory){"use strict";function isItemFlagged(testMap,position){const item=mapHelper.getItemAt(testMap,position);return!!item.flagged}function updateButton(button,data){var $button=button.getElement();button.is("rendered")&&$button.data("control")!==data.control&&($button.data("control",data.control).attr("title",data.title),$button.find(".icon").attr("class",`icon icon-${data.icon}`),$button.find(".text").text(data.text),(data.control.includes("flag")||data.control.includes("overview"))&&(button.is("active")?button.turnOff():button.turnOn()))}function canFlag(testRunner){const testContext=testRunner.getTestContext(),testMap=testRunner.getTestMap(),item=testRunner.getCurrentItem(),testPart=testRunner.getCurrentPart(),markReviewCategory=mapHelper.hasItemCategory(testMap,testContext.itemIdentifier,"markReview",!0);return!(testPart.isLinear||!markReviewCategory||item&&item.informational)}_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,shortcut=shortcut&&Object.prototype.hasOwnProperty.call(shortcut,"default")?shortcut["default"]:shortcut,namespaceHelper=namespaceHelper&&Object.prototype.hasOwnProperty.call(namespaceHelper,"default")?namespaceHelper["default"]:namespaceHelper,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper,defaultNavigatorFactory=defaultNavigatorFactory&&Object.prototype.hasOwnProperty.call(defaultNavigatorFactory,"default")?defaultNavigatorFactory["default"]:defaultNavigatorFactory,fizzyNavigatorFactory=fizzyNavigatorFactory&&Object.prototype.hasOwnProperty.call(fizzyNavigatorFactory,"default")?fizzyNavigatorFactory["default"]:fizzyNavigatorFactory;var buttonData={setFlag:{control:"set-item-flag",title:__("Flag the current item for later review"),icon:"anchor",text:__("Flag for Review")},unsetFlag:{control:"unset-item-flag",title:__("Do not flag the current item for later review"),icon:"anchor",text:__("Unflag for Review")},setFlagBookmarked:{control:"set-item-flag",title:__("Bookmark the current question for later review"),icon:"bookmark",text:__("Bookmark question")},unsetFlagBookmarked:{control:"unset-item-flag",title:__("Do not bookmark the current question for later review"),icon:"bookmark-outline",text:__("Bookmark question")},showReview:{control:"show-review",title:__("Show the review screen"),icon:"right",text:__("Show Review")},hideReview:{control:"hide-review",title:__("Hide the review screen"),icon:"left",text:__("Hide Review")},showTestOverview:{control:"show-test-overview",title:__("Show test overview panel"),icon:"desktop-preview",text:__("Test overview")},hideTestOverview:{control:"hide-test-overview",title:__("Hide test overview panel"),icon:"desktop-preview",text:__("Test overview")}},review=pluginFactory({name:"review",init:function init(){function getFlagItemButtonData(flag){let dataType=flag?"unsetFlag":"setFlag";return self.isFizzyLayout&&(dataType=flag?"unsetFlagBookmarked":"setFlagBookmarked"),buttonData[dataType]}function getToggleButtonData(navigator){let dataType=navigator.is("hidden")?"showReview":"hideReview";return self.isFizzyLayout&&(dataType=navigator.is("hidden")?"showTestOverview":"hideTestOverview"),buttonData[dataType]}function getReviewCategories(){const currentContext=testRunner.getTestContext(),currentMap=testRunner.getTestMap();return{reviewScreen:mapHelper.hasItemCategory(currentMap,currentContext.itemIdentifier,"reviewScreen",!0),markReview:mapHelper.hasItemCategory(currentMap,currentContext.itemIdentifier,"markReview",!0)}}function isPluginAllowed(){const categories=getReviewCategories();return navigatorConfig.enabled&&categories.reviewScreen}function flagItem(position,flag){return self.disable(),testRunner.getProxy().callTestAction("flagItem",{position,flag}).then(function(){const item=mapHelper.getItemAt(testRunner.getTestMap(),position);item.flagged=flag,updateButton(self.flagItemButton,getFlagItemButtonData(flag)),self.navigator.setItemFlag(position,flag),self.enable()}).catch(function(){self.navigator.setItemFlag(position,!flag),self.enable()})}function flagCurrentItem(){if(!1!==self.getState("enabled")){const itemPosition=testRunner.getTestContext().itemPosition,flagStatus=isItemFlagged(testRunner.getTestMap(),itemPosition);flagItem(itemPosition,!flagStatus)}}function togglePanel(forcedState){var isHidden=_.isUndefined(forcedState)?self.navigator.is("hidden"):forcedState;isHidden?(self.explicitlyHidden=!1,self.navigator.show()):(self.explicitlyHidden=!0,self.navigator.hide()),updateButton(self.toggleButton,getToggleButtonData(self.navigator))}const self=this,testRunner=this.getTestRunner(),testContext=testRunner.getTestContext(),testMap=testRunner.getTestMap(),testRunnerOptions=testRunner.getOptions(),pluginShortcuts=(testRunnerOptions.shortcuts||{})[this.getName()]||{},pluginConfig=this.getConfig();let navigatorConfig=testRunnerOptions.review||{defaultOpen:!1};navigatorConfig=Object.assign({},navigatorConfig,pluginConfig),this.isFizzyLayout=navigatorConfig&&"fizzy"===navigatorConfig.reviewLayout;let previousItemPosition;const navigatorFactory=this.isFizzyLayout?fizzyNavigatorFactory:defaultNavigatorFactory;this.navigator=navigatorFactory(navigatorConfig).on("selected",function(position,previousPosition){previousItemPosition=previousPosition}).on("jump",function(position){!1!==self.getState("enabled")&&(self.disable(),testRunner.jump(position,"item"))}).on("flag",function(position,flag){!1!==self.getState("enabled")&&flagItem(position,flag)}).on("close",function(){testRunner.trigger("tool-reviewpanel")}).render(),testRunner.on("alert.notallowed",function(){self.navigator.select(previousItemPosition)}),this.explicitlyHidden=!1,this.toggleButton=this.getAreaBroker().getToolbox().createEntry(getToggleButtonData(this.navigator)),this.toggleButton.on("click",function(e){e.preventDefault(),testRunner.trigger("tool-reviewpanel")}),this.flagItemButton=this.getAreaBroker().getToolbox().createEntry(getFlagItemButtonData(isItemFlagged(testMap,testContext.itemPosition))),this.flagItemButton.on("click",function(e){e.preventDefault(),testRunner.trigger("tool-flagitem")}),testRunnerOptions.allowShortcuts&&(pluginShortcuts.flag&&shortcut.add(namespaceHelper.namespaceAll(pluginShortcuts.flag,this.getName(),!0),function(){testRunner.trigger("tool-flagitem")},{avoidInput:!0}),pluginShortcuts.toggle&&shortcut.add(namespaceHelper.namespaceAll(pluginShortcuts.toggle,this.getName(),!0),function(){testRunner.trigger("tool-reviewpanel")},{avoidInput:!0})),isPluginAllowed()||this.hide(),this.disable(),togglePanel(navigatorConfig.defaultOpen),testRunner.on("render",function(){isPluginAllowed()?(self.show(),updateButton(self.toggleButton,getToggleButtonData(self.navigator))):self.hide()}).on("loaditem",function(){const context=testRunner.getTestContext(),map=testRunner.getTestMap(),testPart=testRunner.getCurrentPart(),categories=getReviewCategories();isPluginAllowed()?(updateButton(self.flagItemButton,getFlagItemButtonData(isItemFlagged(map,context.itemPosition))),self.navigator.update(map,context).updateConfig({canFlag:!testPart.isLinear&&categories.markReview}),self.show(),updateButton(self.toggleButton,getToggleButtonData(self.navigator))):self.hide()}).on("enabletools enablenav",function(){isPluginAllowed()&&self.enable()}).on("disabletools disablenav",function(){isPluginAllowed()&&self.disable()}).on("hidenav",function(){self.hide()}).on("shownav",function(){isPluginAllowed()&&self.show()}).on("tool-flagitem",function(){isPluginAllowed()&&canFlag(testRunner)&&flagCurrentItem()}).on("tool-reviewpanel",function(){isPluginAllowed()&&self.getState("enabled")&&togglePanel()})},render:function render(){var areaBroker=this.getAreaBroker(),$panelContainer=areaBroker.getPanelArea();$panelContainer.append(this.navigator.getElement())},destroy:function destroy(){shortcut.remove(`.${this.getName()}`),this.navigator.destroy()},enable:function enable(){const testRunner=this.getTestRunner(),testContext=testRunner.getTestContext(),testMap=testRunner.getTestMap();this.flagItemButton.enable(),this.toggleButton.enable(),this.navigator.enable(),isItemFlagged(testMap,testContext.itemPosition)?this.flagItemButton.turnOn():this.flagItemButton.turnOff(),this.isFizzyLayout&&(this.explicitlyHidden?this.toggleButton.turnOff():this.toggleButton.turnOn())},disable:function disable(){this.flagItemButton.disable(),this.flagItemButton.turnOff(),this.toggleButton.disable(),this.isFizzyLayout&&this.toggleButton.turnOff(),this.navigator.disable()},show:function show(){var testRunner=this.getTestRunner();canFlag(testRunner)?this.flagItemButton.show():this.flagItemButton.hide(),this.toggleButton.show(),this.explicitlyHidden?this.navigator.hide():this.navigator.show()},hide:function hide(){this.flagItemButton.hide(),this.toggleButton.hide(),this.navigator.hide()}});return review}),define("taoQtiTest/runner/plugins/navigation/skip",["jquery","i18n","ui/hider","taoTests/runner/plugin","taoQtiTest/runner/helpers/messages","handlebars","lib/handlebars/helpers","taoQtiTest/runner/helpers/navigation","taoQtiTest/runner/helpers/map"],function($$1,__,hider,pluginFactory,messages,Handlebars,Helpers0,navigationHelper,mapHelper){"use strict";function buttonTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}$$1=$$1&&Object.prototype.hasOwnProperty.call($$1,"default")?$$1["default"]:$$1,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,hider=hider&&Object.prototype.hasOwnProperty.call(hider,"default")?hider["default"]:hider,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,messages=messages&&Object.prototype.hasOwnProperty.call(messages,"default")?messages["default"]:messages,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,navigationHelper=navigationHelper&&Object.prototype.hasOwnProperty.call(navigationHelper,"default")?navigationHelper["default"]:navigationHelper,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var buffer="",stack1,helper;return buffer+=" ",(helper=helpers.className)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.className,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1),buffer}function program3(depth0,data){var buffer="",stack1;return buffer+="\n aria-"+escapeExpression((stack1=null==data||!1===data?data:data.key,"function"===typeof stack1?stack1.apply(depth0):stack1))+"=\""+escapeExpression("function"===typeof depth0?depth0.apply(depth0):depth0)+"\"\n ",buffer}function program5(depth0,data){var buffer="",stack1,helper;return buffer+="",buffer}function program6(depth0,data){return" no-label"}function program8(depth0,data){var buffer="",stack1,helper;return buffer+="",(helper=helpers.text)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.text,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",functionType="function",escapeExpression=this.escapeExpression,self=this,stack1,helper;return buffer+="\n \n ",stack1=helpers["if"].call(depth0,depth0&&depth0.icon,{hash:{},inverse:self.noop,fn:self.program(5,program5,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.text,{hash:{},inverse:self.noop,fn:self.program(8,program8,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n \n\n",buffer}),buttonData={skip:{control:"skip",title:__("Skip and go to the next item"),icon:"external",text:__("Skip")},end:{control:"skip-end",title:__("Skip and go to the end of the test"),icon:"external",text:__("Skip and end test")}},createElement=function createElement(testRunner){const testContext=testRunner.getTestContext(),testMap=testRunner.getTestMap(),isLast=navigationHelper.isLast(testMap,testContext.itemIdentifier),dataType=isLast?"end":"skip";return $$1(buttonTpl(buttonData[dataType]))};const updateElement=function updateElement($element){let isLast=!!(1{const testContext=testRunner.getTestContext();return!0===testContext.allowSkipping?(this.show(),!0):(this.hide(),!1)};this.$element=createElement(testRunner),this.$element.on("click",e=>{const enable=this.enable.bind(this),testContext=testRunner.getTestContext(),testMap=testRunner.getTestMap(),isLast=navigationHelper.isLast(testMap,testContext.itemIdentifier),endTestWarning=mapHelper.hasItemCategory(testMap,testContext.itemIdentifier,"endTestWarning",!0);e.preventDefault(),!1!==this.getState("enabled")&&(this.disable(),endTestWarning&&isLast?testRunner.trigger("confirm.endTest",messages.getExitMessage("test",testRunner),doSkip,enable):doSkip())}),toggle(),this.disable(),testRunner.on("loaditem",()=>{if(toggle()){const testContext=testRunner.getTestContext(),testMap=testRunner.getTestMap(),isLast=navigationHelper.isLast(testMap,testContext.itemIdentifier);updateElement(this.$element,isLast)}}).on("enablenav",()=>this.enable()).on("disablenav",()=>this.disable()).on("hidenav",()=>this.hide()).on("shownav",()=>this.show())},render:function render(){var $container=this.getAreaBroker().getNavigationArea();$container.append(this.$element)},destroy:function destroy(){this.$element.remove()},enable:function enable(){this.$element.removeProp("disabled").removeClass("disabled")},disable:function disable(){this.$element.prop("disabled",!0).addClass("disabled")},show:function show(){hider.show(this.$element)},hide:function hide(){hider.hide(this.$element)}});return skip}),define("taoQtiTest/runner/plugins/navigation/validateResponses",["lodash","i18n","taoTests/runner/plugin","taoQtiTest/runner/helpers/currentItem"],function(_,__,pluginFactory,currentItemHelper){"use strict";_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,currentItemHelper=currentItemHelper&&Object.prototype.hasOwnProperty.call(currentItemHelper,"default")?currentItemHelper["default"]:currentItemHelper;var pluginName="validateResponses",validateResponses=pluginFactory({name:"validateResponses",init(){const testRunner=this.getTestRunner(),testRunnerOptions=testRunner.getOptions(),pluginConfig=this.getConfig();return testRunner.before("move",(e,direction)=>{const testContext=testRunner.getTestContext(),isInteracting=!testRunner.getItemState(testContext.itemIdentifier,"disabled");if(!pluginConfig.validateOnPreviousMove&&"previous"===direction)return Promise.resolve();if(isInteracting&&testRunnerOptions.enableValidateResponses){const currenItem=testRunner.getCurrentItem(),validateResponses="boolean"==typeof currenItem.validateResponses?currenItem.validateResponses:testContext.validateResponses;if(validateResponses)return new Promise((resolve,reject)=>0===_.size(currentItemHelper.getDeclarations(testRunner))?resolve():currentItemHelper.isAnswered(testRunner,!1)?resolve():void(!testRunner.getState("alerted.notallowed")&&(testRunner.setState("alerted.notallowed",!0),testRunner.trigger("alert.notallowed",__("A valid response to this item is required."),()=>{testRunner.trigger("resumeitem"),reject(),testRunner.setState("alerted.notallowed",!1)}))))}}),this}});return validateResponses}),define("taoQtiTest/runner/plugins/navigation/warnBeforeLeaving",["i18n","taoTests/runner/plugin"],function(__,pluginFactory){"use strict";__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory;var warnMessage=__("Please confirm you want to leave the test."),warnListener=function warnListener(e){return e.returnValue=warnMessage,warnMessage},warnBeforeLeaving=pluginFactory({name:"warnBeforeLeaving",init:function init(){this.enable()},destroy:function destroy(){this.disable()},enable:function enable(){window.addEventListener("beforeunload",warnListener)},disable:function disable(){window.removeEventListener("beforeunload",warnListener)}});return warnBeforeLeaving}),define("taoQtiTest/runner/plugins/security/disableRightClick",["taoTests/runner/plugin"],function(pluginFactory){"use strict";pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory;var disableRightClick=pluginFactory({name:"disableRightClick",init:function init(){var rightClickEvents=["contextmenu","mousedown","mouseup"];rightClickEvents.forEach(function(eventName){window.document.addEventListener(eventName,function disableRightClick(event){2===event.button&&event.preventDefault()})})}});return disableRightClick}),define("taoQtiTest/runner/plugins/tools/answerElimination/eliminator",["lodash","i18n","ui/hider","util/shortcut","util/namespace","taoQtiTest/runner/helpers/map","taoTests/runner/plugin"],function(_,__,hider,shortcut,namespaceHelper,mapHelper,pluginFactory){"use strict";_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,shortcut=shortcut&&Object.prototype.hasOwnProperty.call(shortcut,"default")?shortcut["default"]:shortcut,namespaceHelper=namespaceHelper&&Object.prototype.hasOwnProperty.call(namespaceHelper,"default")?namespaceHelper["default"]:namespaceHelper,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory;var pluginName="eliminator",actionPrefix=`tool-${"eliminator"}-`,defaultConfig={removeEliminationsOnClose:!1,restoreEliminationsOnOpen:!1},eliminator=pluginFactory({name:"eliminator",init(){function isPluginEnabled(){return mapHelper.hasItemCategory(testRunner.getTestMap(),testRunner.getTestContext().itemIdentifier,"eliminator",!0)}function togglePluginButton(){isPluginEnabled()?self.show():self.hide()}function togglePlugin(){self.$choiceInteractions&&(self.$choiceInteractions.toggleClass("eliminable"),isEliminable()?enableEliminator():disableEliminator())}function isEliminable(){return self.$choiceInteractions?self.$choiceInteractions.hasClass("eliminable"):void 0}function enableEliminator(){var $choices;self.$choiceInteractions&&($choices=self.$choiceInteractions.find(".qti-choice"),self.button.turnOn(),self.trigger("start"),config.restoreEliminationsOnOpen&&$choices.each(function(){var input=this.querySelector(".real-label input");this.dataset.wasEliminated&&(this.dataset.wasEliminated=null,this.classList.add("eliminated"),input.setAttribute("disabled","disabled"),input.checked=!1)}))}function disableEliminator(){var $choices;self.$choiceInteractions&&($choices=self.$choiceInteractions.find(".qti-choice"),self.$choiceInteractions.removeClass("eliminable"),self.button.turnOff(),self.trigger("end"),$choices.each(function(){this.classList.contains("eliminated")&&(this.dataset.wasEliminated=!0,this.classList.remove("eliminated"),this.querySelector(".real-label input").removeAttribute("disabled"))}))}const self=this,testRunner=this.getTestRunner(),$container=testRunner.getAreaBroker().getContentArea().parent(),testRunnerOptions=testRunner.getOptions(),pluginShortcuts=(testRunnerOptions.shortcuts||{}).eliminator||{},config=Object.assign({},defaultConfig,this.getConfig());this.button=this.getAreaBroker().getToolbox().createEntry({control:"eliminator",title:__("Eliminate choices"),icon:"eliminate",text:__("Answer Eliminator")}),this.button.on("click",function(e){e.preventDefault(),testRunner.trigger(`${actionPrefix}toggle`)}),testRunnerOptions.allowShortcuts&&_.forEach(pluginShortcuts,function(command,key){shortcut.add(namespaceHelper.namespaceAll(command,"eliminator",!0),function(){testRunner.trigger(actionPrefix+key)},{avoidInput:!0})}),this.disable(),testRunner.on("loaditem",togglePluginButton).on("renderitem",function conditionalInit(){return self.$choiceInteractions=$container.find(".qti-choiceInteraction"),self.$choiceInteractions.length?void(isPluginEnabled()&&self.show()):void self.hide()}).on("enabletools renderitem",function(){self.enable()}).on("disabletools unloaditem",function(){self.disable(),disableEliminator()}).on(`${actionPrefix}toggle`,function(){isPluginEnabled()&&togglePlugin()}).on("tool-answer-masking-toggle",function(){isEliminable()&&disableEliminator()})},destroy:function destroy(){shortcut.remove(`.${"eliminator"}`)},enable:function enable(){this.button.enable()},disable:function disable(){this.button.disable()},show:function show(){this.button.show()},hide:function hide(){this.button.hide()}});return eliminator}),define("taoQtiTest/runner/plugins/tools/answerMasking/answerMasking",["lodash","jquery","core/statifier","ui/component","handlebars","lib/handlebars/helpers"],function(_,$$1,statifier,componentFactory,Handlebars,Helpers0){"use strict";function maskTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}function answerMaskingFactory($contentArea){function createMask($container){return componentFactory(maskApi).setTemplate(maskTpl).on("render",function(){var self=this,$component=this.getElement();$component.on(`click${".answerMasking"}`,function(e){e.stopPropagation(),e.preventDefault(),self.toggle()})}).on("destroy",function(){var $component=this.getElement();$component.off(".answerMasking")}).init().render($container).mask()}var allMasks=[],maskApi={toggle:function toggle(){return this.is("masked")?this.reveal():this.mask()},reveal:function reveal(){var $container=this.getContainer();return $container.removeClass("masked"),$container.find("input").removeAttr("disabled"),this.setState("masked",!1),this},mask:function mask(){var $container=this.getContainer();return $container.addClass("masked"),$container.find("input").attr("disabled","disabled"),this.setState("masked",!0),this}},answerMasking;return answerMasking={enable:function enable(){var $choiceInteractions=$contentArea.find(".qti-choiceInteraction"),$qtiChoices=$contentArea.find(".qti-choice");allMasks=[],$choiceInteractions.addClass("maskable"),$qtiChoices.each(function(){var $choice=$$1(this);allMasks.push(createMask($choice))}),this.setState("enabled",!0)},disable:function disable(){var $choiceInteractions=$contentArea.find(".qti-choiceInteraction");$choiceInteractions.removeClass("maskable"),allMasks.forEach(function(mask){mask.reveal(),mask.destroy()}),allMasks=[],this.setState("enabled",!1)},getMasksState:function getMasksState(){var state=allMasks.map(function(mask){return mask.is("masked")});return state},setMasksState:function setMasksState(state){state=state||[],state.forEach(function(masked,index){var mask=allMasks[index];_.isObject(mask)&&_.isFunction(mask.reveal)&&!masked&&mask.reveal()})}},statifier(answerMasking),answerMasking}_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,$$1=$$1&&Object.prototype.hasOwnProperty.call($$1,"default")?$$1["default"]:$$1,statifier=statifier&&Object.prototype.hasOwnProperty.call(statifier,"default")?statifier["default"]:statifier,componentFactory=componentFactory&&Object.prototype.hasOwnProperty.call(componentFactory,"default")?componentFactory["default"]:componentFactory,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){return this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),"
          \n \n
          "}),ns=".answerMasking";return answerMaskingFactory}),define("taoQtiTest/runner/plugins/tools/answerMasking/plugin",["i18n","taoTests/runner/plugin","ui/hider","util/shortcut","util/namespace","taoQtiTest/runner/helpers/map","taoQtiTest/runner/plugins/tools/answerMasking/answerMasking"],function(__,pluginFactory,hider,shortcut,namespaceHelper,mapHelper,answerMaskingFactory){"use strict";__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,shortcut=shortcut&&Object.prototype.hasOwnProperty.call(shortcut,"default")?shortcut["default"]:shortcut,namespaceHelper=namespaceHelper&&Object.prototype.hasOwnProperty.call(namespaceHelper,"default")?namespaceHelper["default"]:namespaceHelper,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper,answerMaskingFactory=answerMaskingFactory&&Object.prototype.hasOwnProperty.call(answerMaskingFactory,"default")?answerMaskingFactory["default"]:answerMaskingFactory;var pluginName="answer-masking",actionPrefix=`tool-${"answer-masking"}-`,itemStates={},defaultConfig={restoreStateOnToggle:!0,restoreStateOnMove:!0},plugin=pluginFactory({name:"answer-masking",init:function init(){function isPluginEnabled(){const answerMaskingCategory=mapHelper.hasItemCategory(testRunner.getTestMap(),testRunner.getTestContext().itemIdentifier,"answerMasking",!0);return answerMaskingCategory&&itemContainsChoiceInteraction()}function itemContainsChoiceInteraction(){var $container=self.getAreaBroker().getContentArea().parent();return $container.find(".qti-choiceInteraction").length}function togglePluginButton(){isPluginEnabled()?self.show():self.hide()}function togglePlugin(){answerMasking.getState("enabled")?disableMasking():enableMasking()}function enableMasking(){var testContext=testRunner.getTestContext(),itemId=testContext.itemIdentifier;answerMasking.enable(),pluginConfig.restoreStateOnToggle&&answerMasking.setMasksState(itemStates[itemId]),self.button.turnOn(),self.trigger("start")}function disableMasking(){var testContext=testRunner.getTestContext(),itemId=testContext.itemIdentifier;answerMasking.getState("enabled")&&(itemStates[itemId]=answerMasking.getMasksState()),answerMasking.disable(),self.button.turnOff(),self.trigger("end")}const self=this,testRunner=this.getTestRunner(),testRunnerOptions=testRunner.getOptions(),pluginConfig=Object.assign({},defaultConfig,this.getConfig()),pluginShortcuts=(testRunnerOptions.shortcuts||{})["answer-masking"]||{},$contentArea=this.getAreaBroker().getContentArea();var answerMasking=answerMaskingFactory($contentArea);this.button=this.getAreaBroker().getToolbox().createEntry({title:__("Answer Masking"),icon:"result-nok",control:"answer-masking",text:__("Answer Masking")}),this.button.on("click",function(e){e.preventDefault(),testRunner.trigger(`${actionPrefix}toggle`)}),testRunnerOptions.allowShortcuts&&pluginShortcuts.toggle&&shortcut.add(namespaceHelper.namespaceAll(pluginShortcuts.toggle,this.getName(),!0),function(){testRunner.trigger(`${actionPrefix}toggle`)},{avoidInput:!0,prevent:!0}),this.disable(),testRunner.on("loaditem",function(){var testContext=testRunner.getTestContext(),itemId=testContext.itemIdentifier;pluginConfig.restoreStateOnMove||(itemStates[itemId]=[]),togglePluginButton()}).on("enabletools renderitem",function(){togglePluginButton(),self.enable()}).on("beforeunloaditem",function(){disableMasking()}).on("disabletools unloaditem",function(){self.disable(),disableMasking()}).on(`${actionPrefix}toggle`,function(){isPluginEnabled()&&togglePlugin()}).on("tool-eliminator-toggle",function(){disableMasking()})},destroy:function destroy(){shortcut.remove(`.${this.getName()}`)},enable:function enable(){this.button.enable()},disable:function disable(){this.button.disable()},show:function show(){this.button.show()},hide:function hide(){this.button.hide()}});return plugin}),define("taoQtiTest/runner/plugins/tools/apipTextToSpeech/textToSpeech",["jquery","i18n","handlebars","lib/handlebars/helpers","ui/component","interact","ui/component/stackable","ui/component/placeable","ui/feedback","nouislider"],function($$1,__,Handlebars,Helpers0,component,interact,makeStackable,makePlaceable,feedback,nouislider){"use strict";function ttsTemplate(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}function maskingComponentFactory(container,config){const audio=new Audio;let currentPlayback=[],mediaContentData=[],currentItem,playbackRate;const selection=window.getSelection&&window.getSelection(),spec={clearAPIPElements(){const{elementClass}=this.config,$contentNodes=$$1(mediaContentData.map(_ref=>{let{selector}=_ref;return selector}).join(", "),container);$contentNodes.removeClass(elementClass),$contentNodes.off("click",this.handleContentNodeClick)},close(){this.setTTSStateOnContainer("playing",!1),this.setTTSStateOnContainer("sfhMode",!1),this.setState("settings",!1),this.stop(),this.trigger("close")},getCurrentItem(){return currentItem},handleContentNodeClick(e){const $target=$$1(e.target);if($target.hasClass("icon-checkbox")||$target.hasClass("icon-radio")||$target.is("input"))return;if(e.stopPropagation(),e.preventDefault(),!this.is("sfhMode"))return;const $currentTarget=$$1(e.currentTarget),selectedItemIndex=mediaContentData.findIndex(_ref2=>{let{selector}=_ref2;return $currentTarget.is(selector)});currentPlayback=mediaContentData.slice(selectedItemIndex),this.stop(),this.initNextItem(),this.togglePlayback()},initDefaultModeItem(){this.initItemWithTextSelection(),currentItem||this.initDefaultModePlayback()},initItemWithTextSelection(){if(this.is("sfhMode")||!selection||!selection.toString())return;const currentSelection=selection.getRangeAt(0),{commonAncestorContainer}=currentSelection,selectedItem=mediaContentData.find(_ref3=>{let{selector}=_ref3;const $item=$$1(selector,container);return $item.is(commonAncestorContainer)||$$1.contains($item[0],commonAncestorContainer)});selectedItem&&selectedItem!==currentItem&&(currentPlayback=[selectedItem],this.initNextItem())},initNextItem(){const{activeElementClass}=this.config;if(currentItem&&$$1(currentItem.selector,container).removeClass(activeElementClass),currentItem=currentPlayback.shift(),currentItem){const{selector,url}=currentItem;return $$1(selector,container).addClass(activeElementClass),audio.setAttribute("src",url),audio.load(),audio.playbackRate=playbackRate,this.is("playing")&&audio.play(),void this.trigger("next")}this.trigger("finish"),this.stop()},initDefaultModePlayback(){currentPlayback=[...mediaContentData],this.initNextItem()},setMediaContentData(data){this.clearAPIPElements();const{elementClass}=this.config;mediaContentData=data;const $contentNodes=$$1(mediaContentData.map(_ref4=>{let{selector}=_ref4;return selector}).join(", "),container);$contentNodes.addClass(elementClass),$contentNodes.on("click",this.handleContentNodeClick),this.stop()},setPlaybackRate(e,value){playbackRate=value,audio.playbackRate=value},setTTSStateOnContainer(name,value){this.setState(name,value),$$1(container).toggleClass(`tts-${name}`,value)},stop(){const{activeElementClass}=this.config;audio.pause(),audio.currentTime=0,currentItem&&$$1(currentItem.selector,container).removeClass(activeElementClass),currentItem=null,this.setTTSStateOnContainer("playing",!1)},togglePlayback(e){e&&e.preventDefault();const isPlaying=this.is("playing");this.initDefaultModeItem(),!isPlaying&¤tItem?(audio.play(),this.setTTSStateOnContainer("playing",!0)):(audio.pause(),this.setTTSStateOnContainer("playing",!1))},toggleSFHMode(){const isSFHMode=this.is("sfhMode");this.setTTSStateOnContainer("sfhMode",!isSFHMode),this.stop()},toggleSettings(){const isSettings=this.is("settings");this.setState("settings",!isSettings),isSettings||this.handleResize()},handleResize(){const offsetFromRight=10,{x,y}=this.getPosition(),maxXPosition=window.innerWidth-this.getElement().width()-10;this.moveTo(x>maxXPosition?maxXPosition:x,y)}},ttsComponent=component(spec,defaultConfig);return makePlaceable(ttsComponent),makeStackable(ttsComponent,stackingOptions),ttsComponent.setTemplate(ttsTemplate).on("init",function(){if(container.hasClass("tts-component-container"))throw new Error("Container already has assigned text to speech component");container.addClass("tts-component-container"),this.render(container)}).on("render",function(){let{left,maxPlaybackRate,minPlaybackRate,playbackRate:defaultPlaybackRate,top}=this.getConfig();0>left&&(left=window.innerWidth-this.getElement().width()+left);const $element=this.getElement(),$closeElement=$$1(".tts-control-close",$element),$dragElement=$$1(".tts-control-drag",$element),$playbackElement=$$1(".tts-control-playback",$element),$sfhModeElement=$$1(".tts-control-mode",$element),$sliderElement=$$1(".tts-slider",$element),$settingsElement=$$1(".tts-control-settings",$element);playbackRate=defaultPlaybackRate,$element.css("touch-action","none");const interactElement=interact($element).draggable({autoScroll:!0,manualStart:!0,restrict:{restriction:container[0],elementRect:{left:0,right:1,top:0,bottom:1}},onmove:event=>{var _Mathround=Math.round;const xOffset=_Mathround(event.dx),yOffset=_Mathround(event.dy);this.moveBy(xOffset,yOffset)}});interact($dragElement[0]).on("down",event=>{const interaction=event.interaction;interaction.start({name:"drag"},interactElement,$element[0])}),$sliderElement.noUiSlider({animate:!0,connected:!0,range:{min:minPlaybackRate,max:maxPlaybackRate},start:defaultPlaybackRate,step:.1}).on("change",this.setPlaybackRate),$closeElement.on("click",this.close),$playbackElement.on("mousedown touchstart",this.togglePlayback),$sfhModeElement.on("click",this.toggleSFHMode),$settingsElement.on("click",this.toggleSettings),audio.addEventListener("ended",this.initNextItem),audio.addEventListener("error",()=>{feedback().error(__("Can not playback media file!")),this.initNextItem()}),window.addEventListener("resize",this.handleResize),this.moveTo(left,top)}).on("hide",function(){this.setTTSStateOnContainer("visible",!1)}).on("show",function(){this.setTTSStateOnContainer("visible",!0)}).on("destroy",function(){container.removeClass("tts-component-container"),this.clearAPIPElements(),this.stop(),window.removeEventListener("resize",this.handleResize)}),ttsComponent.init(config),ttsComponent}$$1=$$1&&Object.prototype.hasOwnProperty.call($$1,"default")?$$1["default"]:$$1,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,component=component&&Object.prototype.hasOwnProperty.call(component,"default")?component["default"]:component,interact=interact&&Object.prototype.hasOwnProperty.call(interact,"default")?interact["default"]:interact,makeStackable=makeStackable&&Object.prototype.hasOwnProperty.call(makeStackable,"default")?makeStackable["default"]:makeStackable,makePlaceable=makePlaceable&&Object.prototype.hasOwnProperty.call(makePlaceable,"default")?makePlaceable["default"]:makePlaceable,feedback=feedback&&Object.prototype.hasOwnProperty.call(feedback,"default")?feedback["default"]:feedback,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",helperMissing=helpers.helperMissing,escapeExpression=this.escapeExpression,helper,options;return buffer+="
          \n
          \n
          \n \n \n \n
          \n \n
          \n \n \n \n \n
          \n
          \n \n \n \n
          \n
          \n \n \n \n
          \n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Speed",options):helperMissing.call(depth0,"__","Speed",options)))+"
          \n
          \n
          \n
          \n
          \n",buffer});const defaultConfig={activeElementClass:"tts-active-content-node",elementClass:"tts-content-node",left:-10,maxPlaybackRate:2,minPlaybackRate:.5,playbackRate:1,top:50},stackingOptions={stackingScope:"test-runner"};return maskingComponentFactory}),define("taoQtiTest/runner/plugins/tools/apipTextToSpeech/ttsApipDataProvider",[],function(){"use strict";const getTTSItemData=apipElement=>{const{identifier}=apipElement["@attributes"],{contentLinkInfo={"@attributes":{}},relatedElementInfo:{spoken:{audioFileInfo=[]}={}}={}}=apipElement,{fileHref=""}=audioFileInfo.find(audioFile=>"audio/mpeg"===audioFile["@attributes"].mimeType)||{},elementId=contentLinkInfo["@attributes"].qtiLinkIdentifierRef;return{identifier,selector:elementId&&`#${elementId}`,url:fileHref.replace("assets/","")}},getTTSItemOrder=(identifier,elementOrder)=>{const{order}=elementOrder.find(apipElementOrder=>apipElementOrder["@attributes"].identifierRef===identifier)||{};return parseInt(order)||Number.POSITIVE_INFINITY};var ttsApipDataProvider=apipData=>{const{accessibilityInfo:{accessElement=[]}={},inclusionOrder:{textGraphicsDefaultOrder:{elementOrder=[]}={}}={}}=apipData;return accessElement.map(getTTSItemData).filter(_ref=>{let{url}=_ref;return!!url}).sort((a,b)=>getTTSItemOrder(a.identifier,elementOrder)-getTTSItemOrder(b.identifier,elementOrder))};return ttsApipDataProvider}),define("taoQtiTest/runner/plugins/tools/apipTextToSpeech/plugin",["lodash","i18n","ui/hider","util/shortcut","util/namespace","taoTests/runner/plugin","taoQtiTest/runner/helpers/map","ui/keyNavigation/navigator","ui/keyNavigation/navigableDomElement","taoQtiTest/runner/plugins/tools/apipTextToSpeech/textToSpeech","taoQtiTest/runner/plugins/tools/apipTextToSpeech/ttsApipDataProvider"],function(_,__,hider,shortcut,namespaceHelper,pluginFactory,mapHelper,keyNavigator,navigableDomElement,ttsComponentFactory,ttsApipDataProvider){"use strict";_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,shortcut=shortcut&&Object.prototype.hasOwnProperty.call(shortcut,"default")?shortcut["default"]:shortcut,namespaceHelper=namespaceHelper&&Object.prototype.hasOwnProperty.call(namespaceHelper,"default")?namespaceHelper["default"]:namespaceHelper,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper,keyNavigator=keyNavigator&&Object.prototype.hasOwnProperty.call(keyNavigator,"default")?keyNavigator["default"]:keyNavigator,navigableDomElement=navigableDomElement&&Object.prototype.hasOwnProperty.call(navigableDomElement,"default")?navigableDomElement["default"]:navigableDomElement,ttsComponentFactory=ttsComponentFactory&&Object.prototype.hasOwnProperty.call(ttsComponentFactory,"default")?ttsComponentFactory["default"]:ttsComponentFactory,ttsApipDataProvider=ttsApipDataProvider&&Object.prototype.hasOwnProperty.call(ttsApipDataProvider,"default")?ttsApipDataProvider["default"]:ttsApipDataProvider;const pluginName="apiptts",actionPrefix=`tool-${"apiptts"}-`;var plugin=pluginFactory({name:"apiptts",init(){const testRunner=this.getTestRunner(),testRunnerOptions=testRunner.getOptions(),pluginShortcuts=(testRunnerOptions.shortcuts||{})[this.getName()]||{};let ttsComponent,ttsApipData;const createNavigationGroup=()=>{const $container=testRunner.getAreaBroker().getContainer(),$navigationGroupElement=this.button.getElement(),groupNavigationId=`${pluginName}_navigation_group`,$navigationElements=$container.find(ttsApipData.map(_ref=>{let{selector}=_ref;return selector}).join(", "));this.navigationGroup=keyNavigator({id:groupNavigationId,group:$navigationGroupElement,elements:navigableDomElement.createFromDoms($navigationElements.add($navigationGroupElement)),propagateTab:!1,loop:!0,keepState:!0}).on("tab",()=>{ttsComponent.is("sfhMode")&&(this.navigationGroup.next(),testRunner.trigger(`${actionPrefix}next`))}).on("shift+tab",()=>{ttsComponent.is("sfhMode")&&(this.navigationGroup.previous(),testRunner.trigger(`${actionPrefix}previous`))}).on("activate",()=>{ttsComponent.is("sfhMode")&&testRunner.trigger(`${actionPrefix}togglePlayback`)}).on("blur",()=>{setTimeout(()=>{this.navigationGroup.isFocused()||this.navigationGroup.focus()},0)}).setCursorAt($navigationElements.length),ttsComponent.on("next finish",()=>{if(ttsComponent.is("sfhMode")){const $currentElement=this.navigationGroup.getCursor().navigable.getElement(),{selector}=ttsComponent.getCurrentItem()||{};selector&&$currentElement.is(selector)||this.navigationGroup.next()}})},getTTSComponent=()=>{if(!ttsComponent){const $container=testRunner.getAreaBroker().getContainer();ttsComponent=ttsComponentFactory($container,{}).on("close",()=>{this.getState("active")&&testRunner.trigger(`${actionPrefix}toggle`)}).hide()}return ttsComponent},isConfigured=()=>mapHelper.hasItemCategory(testRunner.getTestMap(),testRunner.getTestContext().itemIdentifier,"apiptts",!0),togglePlugin=()=>{isConfigured()?this.show():this.hide()},enablePlugin=()=>{createNavigationGroup(),this.button.turnOn(),this.setState("active",!0),this.trigger("open"),ttsComponent.is("hidden")&&ttsComponent.show()},disablePlugin=()=>{this.getState("active")&&(this.navigationGroup.blur(),this.navigationGroup.destroy(),this.setState("active",!1),this.button.turnOff(),this.trigger("close"),ttsComponent&&!ttsComponent.is("hidden")&&(ttsComponent.close(),ttsComponent.hide()))},toggleTool=()=>{this.getState("enabled")&&(this.getState("active")?(disablePlugin(),this.setState("sleep",!0)):(enablePlugin(),this.setState("sleep",!1)))};this.button=this.getAreaBroker().getToolbox().createEntry({className:`${this.getName()}-plugin`,control:this.getName(),icon:"headphones",text:__("Text To Speech"),title:__("Enable text to speech")}),this.button.on("click",e=>{e.preventDefault(),testRunner.trigger(`${actionPrefix}toggle`)}),testRunnerOptions.allowShortcuts&&_.forEach(pluginShortcuts,(command,key)=>{shortcut.add(namespaceHelper.namespaceAll(command,pluginName,!0),()=>{if(!("spaceTogglePlayback"===key&&ttsComponent&&ttsComponent.is("sfhMode"))){const eventKey=key.endsWith("TogglePlayback")?"togglePlayback":key;testRunner.trigger(actionPrefix+eventKey)}},{avoidInput:!0})}),togglePlugin(),this.disable(),this.hide(),testRunner.on("loaditem",()=>{togglePlugin(),this.disable()}).on("enabletools renderitem",()=>{this.enable()}).on("disabletools unloaditem",()=>{disablePlugin(),this.disable()}).on(`${actionPrefix}toggle`,()=>{isConfigured()&&toggleTool()}).on(`${actionPrefix}togglePlayback`,()=>{if(this.getState("enabled")&&this.getState("active")){if(ttsComponent.is("sfhMode")){const $currentElement=this.navigationGroup.getCursor().navigable.getElement(),{selector}=ttsComponent.getCurrentItem()||{};if(!$currentElement.is(selector))return void(this.button.getElement()[0]!==$currentElement[0]&&$currentElement.trigger("click"))}ttsComponent.togglePlayback()}}).on("renderitem",()=>{if(isConfigured())return ttsApipData=ttsApipDataProvider(testRunner.itemRunner.getData().apipAccessibility||{}).map(apipItemData=>Object.assign({},apipItemData,{url:testRunner.itemRunner.assetManager.resolve(apipItemData.url)})),ttsApipData.length?void(getTTSComponent().setMediaContentData(ttsApipData),this.show(),!this.getState("sleep")&&(this.setState("enabled",!0),toggleTool())):(disablePlugin(),void this.hide())})},destroy(){shortcut.remove(`.${this.getName()}`)},enable(){this.button.enable()},disable(){this.button.disable()},show(){this.button.show()},hide(){this.button.hide()}});return plugin}),define("taoQtiTest/runner/plugins/tools/areaMasking/mask",["lodash","handlebars","lib/handlebars/helpers","ui/dynamicComponent"],function(_,Handlebars,Helpers0,dynamicComponent){"use strict";function areaMaskingTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}function maskingComponentFactory(){var dynamicComponentInstance;return dynamicComponentInstance=dynamicComponent({preview:function preview(){var self=this,delay=this.config.previewDelay||1e3;return!this.is("rendered")||this.is("disabled")||this.is("previewing")||(this.setState("previewing",!0),this.trigger("preview"),_.delay(function(){self.setState("previewing",!1)},delay)),this}},defaultConfig).on("rendercontent",function($content){var self=this,$element=this.getElement();$content.append(areaMaskingTpl({})),$element.addClass("mask-container"),$element.on("click touchstart",".view",function(e){e.preventDefault(),self.preview()}).on("click touchend",".close",function(e){e.preventDefault(),self.destroy()})}).init(),dynamicComponentInstance}_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,dynamicComponent=dynamicComponent&&Object.prototype.hasOwnProperty.call(dynamicComponent,"default")?dynamicComponent["default"]:dynamicComponent,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",helperMissing=helpers.helperMissing,escapeExpression=this.escapeExpression,helper,options;return buffer+="
          \n
          \n
          \n \n \n
          \n
          \n",buffer}),defaultConfig={draggable:!0,resizable:!0,preserveAspectRatio:!1,width:250,minWidth:160,maxWidth:1e3,minHeight:60,height:100,stackingScope:"test-runner",top:50,left:10,previewDelay:3e3};return maskingComponentFactory}),define("taoQtiTest/runner/plugins/tools/areaMasking/areaMasking",["lodash","i18n","ui/hider","util/shortcut","util/namespace","taoTests/runner/plugin","taoQtiTest/runner/plugins/tools/areaMasking/mask","taoQtiTest/runner/helpers/map"],function(_,__,hider,shortcut,namespaceHelper,pluginFactory,maskComponent,mapHelper){"use strict";_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,shortcut=shortcut&&Object.prototype.hasOwnProperty.call(shortcut,"default")?shortcut["default"]:shortcut,namespaceHelper=namespaceHelper&&Object.prototype.hasOwnProperty.call(namespaceHelper,"default")?namespaceHelper["default"]:namespaceHelper,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,maskComponent=maskComponent&&Object.prototype.hasOwnProperty.call(maskComponent,"default")?maskComponent["default"]:maskComponent,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper;var pluginName="area-masking",actionPrefix=`tool-${"area-masking"}-`,defaultConfig={max:5,foo:!0},areaMasking=pluginFactory({name:"area-masking",init(){function addMask(){maskComponent().on("render",function(){self.masks.push(this),self.button.turnOn(),self.trigger("maskadd")}).on("destroy",function(){self.masks=_.without(self.masks,this),self.masks.length= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),"
          "}),defaultCalcConfig={height:380,width:280,top:50,left:10,stackingScope:"test-runner",proportionalResize:!0},bodmasCalcConfig=_.defaults({height:380,width:280},defaultCalcConfig),scientificCalcConfig=_.defaults({width:490,height:420,calculator:{maths:{degree:!0}}},defaultCalcConfig),calculator=pluginFactory({name:"calculator",init:function init(){function getCalculatorCategories(){const testContext=testRunner.getTestContext(),itemIdentifier=testContext.itemIdentifier,testMap=testRunner.getTestMap();return{calculator:mapHelper.hasItemCategory(testMap,itemIdentifier,"calculator",!0),bodmas:mapHelper.hasItemCategory(testMap,itemIdentifier,"calculator-bodmas",!0),scientific:mapHelper.hasItemCategory(testMap,itemIdentifier,"calculator-scientific",!0)}}function isEnabled(){const categories=getCalculatorCategories();return categories.calculator||categories.bodmas||categories.scientific}function togglePlugin(){isEnabled()?self.show():self.hide()}function buildCalculator(calcTpl){const categories=getCalculatorCategories();let factory,calcConfig;categories.scientific?(factory=scientificCalculatorFactory,calcConfig=scientificCalcConfig,calcConfig.calculator.maths.degree=_.isUndefined(config.degree)?scientificCalcConfig.calculator.maths.degree:config.degree):categories.bodmas?(factory=basicCalculatorFactory,calcConfig=bodmasCalcConfig):(factory=calculatorFactory,calcConfig=defaultCalcConfig),self.calculator=factory(_.defaults({renderTo:self.$calculatorContainer,replace:!0,draggableContainer:areaBroker.getContainer(),alternativeTemplate:calcTpl||null},calcConfig)).on("show",function(){self.trigger("open"),self.button.turnOn()}).on("hide",function(){self.trigger("close"),self.button.turnOff()}).after("render",function(){this.show()})}function toggleCalculator(){!1!==self.getState("enabled")&&(self.calculator?self.calculator.is("hidden")?self.calculator.show():self.calculator.hide():config.template?require([`tpl!${config.template.replace(/\.tpl$/,"")}`],function(calcTpl){buildCalculator(calcTpl)},function(){buildCalculator()}):buildCalculator())}const self=this,testRunner=this.getTestRunner(),areaBroker=this.getAreaBroker(),testRunnerOptions=testRunner.getOptions(),config=this.getConfig(),pluginShortcuts=(testRunnerOptions.shortcuts||{})[this.getName()]||{};this.button=this.getAreaBroker().getToolbox().createEntry({control:"calculator",title:__("Open Calculator"),icon:"table",text:__("Calculator")}),this.$calculatorContainer=$$1(calculatorTpl()),this.calculator=null,this.button.on("click",function(e){$$1(e.target).closest(".widget-calculator").length||(e.preventDefault(),testRunner.trigger("tool-calculator"))}),testRunnerOptions.allowShortcuts&&pluginShortcuts.toggle&&shortcut.add(namespaceHelper.namespaceAll(pluginShortcuts.toggle,this.getName(),!0),function(){testRunner.trigger("tool-calculator")},{avoidInput:!0,allowIn:".widget-calculator"}),togglePlugin(),this.disable(),testRunner.on("loaditem",togglePlugin).on("enabletools renderitem",function(){self.enable()}).on("disabletools unloaditem",function(){self.disable(),self.calculator&&(self.calculator.destroy(),self.calculator=null)}).on("tool-calculator",function(){isEnabled()&&toggleCalculator()})},render:function render(){var areaBroker=this.getAreaBroker();areaBroker.getContainer().append(this.$calculatorContainer)},destroy:function destroy(){shortcut.remove(`.${this.getName()}`),this.$calculatorContainer.remove(),this.calculator&&this.calculator.destroy()},enable:function enable(){this.button.enable()},disable:function disable(){this.button.disable(),this.calculator&&this.calculator.hide()},show:function show(){this.button.show()},hide:function hide(){this.button.hide(),this.calculator&&this.calculator.hide()}});return calculator}),define("taoQtiTest/runner/plugins/tools/comment/comment",["jquery","i18n","taoTests/runner/plugin","ui/hider","ui/stacker","util/shortcut","util/namespace","handlebars","lib/handlebars/helpers"],function($$1,__,pluginFactory,hider,stackerFactory,shortcut,namespaceHelper,Handlebars,Helpers0){"use strict";function commentTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}$$1=$$1&&Object.prototype.hasOwnProperty.call($$1,"default")?$$1["default"]:$$1,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,hider=hider&&Object.prototype.hasOwnProperty.call(hider,"default")?hider["default"]:hider,stackerFactory=stackerFactory&&Object.prototype.hasOwnProperty.call(stackerFactory,"default")?stackerFactory["default"]:stackerFactory,shortcut=shortcut&&Object.prototype.hasOwnProperty.call(shortcut,"default")?shortcut["default"]:shortcut,namespaceHelper=namespaceHelper&&Object.prototype.hasOwnProperty.call(namespaceHelper,"default")?namespaceHelper["default"]:namespaceHelper,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",helperMissing=helpers.helperMissing,escapeExpression=this.escapeExpression,helper,options;return buffer+="
          \n \n \n \n
          \n",buffer}),comment=pluginFactory({name:"comment",init(){function isEnabled(){const currentItem=testRunner.getCurrentItem();if("boolean"==typeof currentItem.allowComment)return currentItem.allowComment;const testContext=testRunner.getTestContext(),contextOptions=testContext.options||{};return!!contextOptions.allowComment}function togglePlugin(){isEnabled()?self.show():self.hide()}function toggleComment(){!1!==self.getState("enabled")&&(hider.toggle(self.$form),hider.isHidden(self.$form)?self.button.turnOff():(self.$input.val("").focus(),self.button.turnOn(),stacker.bringToFront(self.$form)))}const self=this,testRunner=this.getTestRunner(),testRunnerOptions=testRunner.getOptions(),pluginShortcuts=(testRunnerOptions.shortcuts||{})[this.getName()]||{},stacker=stackerFactory("test-runner");this.button=this.getAreaBroker().getToolbox().createEntry({control:"comment",title:__("Leave a comment"),icon:"tag",text:__("Comment")}),this.button.on("render",function(){self.$button=self.button.getElement(),self.$form=$$1(commentTpl()).appendTo(self.$button),self.$input=self.$button.find("[data-control=\"qti-comment-text\"]"),self.$cancel=self.$button.find("[data-control=\"qti-comment-cancel\"]"),self.$submit=self.$button.find("[data-control=\"qti-comment-send\"]"),stacker.autoBringToFront(self.$form),self.$cancel.on("click",function(){hider.hide(self.$form),self.button.turnOff()}),self.$submit.on("click",function(){var comment=self.$input.val();comment&&(self.disable(),self.button.turnOff(),testRunner.getProxy().callTestAction("comment",{comment:comment}).then(function(){hider.hide(self.$form),self.enable()}).catch(function(){hider.hide(self.$form),self.enable()}))})}),this.button.on("click",function(e){$$1(e.target).closest("[data-control=\"qti-comment\"]").length||(e.preventDefault(),testRunner.trigger("tool-comment"))}),testRunnerOptions.allowShortcuts&&pluginShortcuts.toggle&&shortcut.add(namespaceHelper.namespaceAll(pluginShortcuts.toggle,this.getName(),!0),function(){testRunner.trigger("tool-comment")},{avoidInput:!0}),togglePlugin(),this.disable(),testRunner.on("loaditem",togglePlugin).on("renderitem enabletools",function(){self.enable()}).on("unloaditem disabletools",function(){self.disable()}).on("tool-comment",function(){isEnabled()&&toggleComment()})},destroy:function destroy(){shortcut.remove(`.${this.getName()}`)},enable:function enable(){this.button.enable()},disable:function disable(){this.$form&&hider.hide(this.$form),this.button.disable(),this.button.turnOff()},show:function show(){this.button.show()},hide:function hide(){this.$form&&hider.hide(this.$form),this.button.hide()}});return comment}),define("taoQtiTest/runner/plugins/tools/documentViewer/documentViewer",["jquery","lodash","ui/hider","ui/documentViewer","ui/documentViewer/providers/pdfViewer","taoTests/runner/plugin","handlebars","lib/handlebars/helpers"],function($$1,_,hider,viewerFactory,pdfViewer,pluginFactory,Handlebars,Helpers0){"use strict";function panelTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}function showPanel(plugin){hider.show(plugin.controls.$panel),plugin.trigger("panelshow"),$$1(window).on(`resize.${plugin.getName()}`,_.debounce(_.partial(resizeViewer,plugin),50))}function hidePanel(plugin){hider.hide(plugin.controls.$panel),plugin.trigger("panelhide"),$$1(window).off(`resize.${plugin.getName()}`)}function hideIfVisible(plugin){var isVisible=!hider.isHidden(plugin.controls.$panel,!0);return isVisible&&hidePanel(plugin),isVisible}function initPanelEvents(plugin){function stopPropagation(e){e.stopImmediatePropagation(),e.stopPropagation()}var namespace=`.${plugin.getName()}`,stopEvents=["click","mousedown","mouseup","touchstart","touchend","keyup","keydow","keypress","scroll","drop"].join(`${namespace} `)+namespace,hideViewer=_.partial(hidePanel,plugin);plugin.controls.$overlay.off(namespace).on(`click${namespace}`,hideViewer).on(stopEvents,stopPropagation),plugin.controls.$panel.off(namespace).on(`click${namespace}`,".icon-close",hideViewer).on(stopEvents,stopPropagation)}function resizeViewer(plugin){var $content=plugin.controls.$content;plugin.viewer.setSize($content.width(),$content.height())}$$1=$$1&&Object.prototype.hasOwnProperty.call($$1,"default")?$$1["default"]:$$1,_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,hider=hider&&Object.prototype.hasOwnProperty.call(hider,"default")?hider["default"]:hider,viewerFactory=viewerFactory&&Object.prototype.hasOwnProperty.call(viewerFactory,"default")?viewerFactory["default"]:viewerFactory,pdfViewer=pdfViewer&&Object.prototype.hasOwnProperty.call(pdfViewer,"default")?pdfViewer["default"]:pdfViewer,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",functionType="function",escapeExpression=this.escapeExpression,stack1,helper;return buffer+="
          \n
          \n
          \n
          \n ",(helper=helpers.title)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.title,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\n \n
          \n
          ",(helper=helpers.content)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.content,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),(stack1||0===stack1)&&(buffer+=stack1),buffer+="
          \n
          \n
          \n
          \n",buffer}),pluginName="documentViewer";viewerFactory.registerProvider("pdf",pdfViewer);var documentViewer=pluginFactory({name:pluginName,init:function init(){function displayViewer(data){!1!==self.getState("enabled")&&(showPanel(self),self.controls.$title.text(data.label),resizeViewer(self),self.viewer.load(data.document,"pdf"))}var self=this,testRunner=this.getTestRunner(),$panel=$$1(panelTpl());this.controls={$panel:$panel,$overlay:$panel.find(".viewer-overlay"),$title:$panel.find(".viewer-title"),$content:$panel.find(".viewer-content")},this.viewer=viewerFactory({renderTo:this.controls.$content,replace:!0,fitToWidth:!0,allowSearch:!0}),testRunner.on("renderitem enabletools",function(){self.enable()}).on("renderitem",function(){self.getAreaBroker().getContentArea().append(self.controls.$panel).off(`.${self.getName()}`).on(`viewDocument.${self.getName()}`,function(event){var data=event.originalEvent.detail;displayViewer(data)}),initPanelEvents(self)}).on("move",function(){hideIfVisible(self)}).on("skip",function(){hideIfVisible(self)}).on("unloaditem disabletools",function(){self.disable()}).on("tool-documentViewer",function(data){displayViewer(data)})},render:function render(){},destroy:function destroy(){this.getAreaBroker().getContentArea().off(`.${this.getName()}`),this.viewer&&this.viewer.destroy(),this.controls.$panel&&this.controls.$panel.remove(),this.viewer=null,this.controls={}},enable:function enable(){},disable:function disable(){hideIfVisible(this)},show:function show(){},hide:function hide(){hideIfVisible(this)}});return documentViewer}),define("taoQtiTest/runner/plugins/tools/highlighter/highlighter",["lodash","jquery","core/eventifier","ui/highlighter"],function(_,$,eventifier,highlighterFactory){"use strict";function getAllRanges(){var allRanges=[],i;for(i=0;i{isPluginAllowed()||self.hide()}).on("click",function(e){e.preventDefault(),testRunner.trigger("tool-themeswitcher-toggle")}).on("openmenu",function(){testRunner.trigger(`plugin-open.${pluginName}`,state.selectedTheme)}).on("closemenu",function(){testRunner.trigger(`plugin-close.${pluginName}`,state.selectedTheme)}),state.availableThemes.forEach(function(theme){var themeEntry=self.getAreaBroker().getToolbox().createEntry({role:"option",control:theme.id,title:theme.label,icon:"preview",text:__(theme.label)});themeEntry.setMenuId("color-contrast"),themeEntry.on("click",function(e){var themeId=this.config.control;e.preventDefault(),self.menuButton.turnOffAll(),this.turnOn(),changeTheme(themeId)}),state.defaultTheme===theme.id&&themeEntry.on("render",function(){this.turnOn()}),allMenuEntries.push(themeEntry)}),testRunnerOptions.allowShortcuts&&pluginShortcuts.toggle&&shortcut.add(namespaceHelper.namespaceAll(pluginShortcuts.toggle,this.getName(),!0),function(){testRunner.trigger("tool-themeswitcher-toggle")},{avoidInput:!0}),isPluginAllowed()||this.hide(),this.disable(),testRunner.on("loaditem",function(){isPluginAllowed()?self.show():self.hide()}).on("renderitem",function(){self.enable(),changeTheme(state.selectedTheme)}).on("enabletools",function(){self.enable()}).on("disabletools unloaditem",function(){self.disable()}).on("tool-themeswitcher-toggle",function(){!1!==self.getState("enabled")&&self.menuButton.toggleMenu()}).on("tool-themeswitcher-setnavtype",function(type){self.menuButton.setNavigationType(type)}),testRunner.getPluginStore(this.getName()).then(function(itemThemesStore){self.storage=itemThemesStore,self.storage.getItem("itemThemeId").then(function(itemThemeId){itemThemeId&&state.selectedTheme!==itemThemeId&&changeTheme(itemThemeId)})})},destroy:function destroy(){return themeHandler.setActiveNamespace(this.oldNamespace),shortcut.remove(`.${this.getName()}`),this.getTestRunner().getPluginStore(this.getName()).then(function(itemThemesStore){return itemThemesStore.removeItem("itemThemeId")})},enable:function enable(){this.menuButton.enable()},disable:function disable(){this.menuButton.disable()},show:function show(){this.menuButton.show()},hide:function hide(){this.menuButton.hide()}});return itemThemeSwitcher}),define("taoQtiTest/runner/plugins/tools/lineReader/compoundMask",["jquery","lodash","core/statifier","core/eventifier","ui/component","ui/component/placeable","ui/component/draggable","ui/component/resizable","ui/component/stackable"],function($,_,statifier,eventifier,componentFactory,makePlaceable,makeDraggable,makeResizable,makeStackable){"use strict";function compoundMaskFactory(options,dimensions,position){function createMask(maskConfig){var maskAPI={place:maskConfig.place,placeOverlay:maskConfig.placeOverlay,styleResizableEdges:function styleResizableEdges(){var $element=this.getElement();_.forOwn(this.config.edgesBorders,function(isResizable,edgeId){isResizable&&$element.addClass(`border-${edgeId}`)})},addResizeControll:function addResizeControll(){var $element=this.getElement(),$resizeControll=$("
          ",{class:"resize-control"});$element.append($resizeControll)}},mask;return mask=componentFactory(maskAPI,maskConfig),makeResizable(mask),makeStackable(mask,stackingOptions),mask.on("render",function(){var $element=this.getElement();this.styleResizableEdges(),this.config.resizeControll&&this.addResizeControll(),$element.addClass(`line-reader-mask ${maskConfig.id}`).on("mousedown touchstart",function(){bringAllToFront()})}).on("resizestart",function(){innerDrag.hide(),closer.hide(),invokeOnOverlays("hide"),invokeOnMasks("setState",["resizing",!0]),this.setState("resizer",!0)}).on("beforeresize",maskConfig.beforeResize||_.noop).on("resize",maskConfig.onResize||_.noop).on("resizeend",function(){applyTransformsToOverlays(),applyTransformsToInnerDrag(),applyTransformsToCloser(),invokeOnMasks("setState",["resizing",!1]),invokeOnOverlays("show"),innerDrag.show(),closer.show(),this.setState("resizer",!1)}).init()}function createOverlay(overlayConfig){var overlayAPI={transformOverlay:function transformOverlay(){var $element=this.getElement();this._sizeBackup=this.getSize(),this._posBackup=this.getPosition(),this.setSize(dimensions.outerWidth,dimensions.outerHeight).moveTo(position.outerX,position.outerY),$element.addClass("moving"),this.setState("transformed",!0)},restoreOverlay:function restoreOverlay(){var $element=this.getElement();this.is("transformed")&&(this.setSize(this._sizeBackup.width,this._sizeBackup.height).moveTo(this._posBackup.x,this._posBackup.y),$element.removeClass("moving"),this._sizeBackup=null,this._posBackup=null,this.setState("transformed",!1))},appendVisualGuides:function appendVisualGuides(){var $element=this.getElement(),borderWidth=1,borderOffset=2;$element.append(visualGuides.$maskBg),$element.append(visualGuides.$innerWindow),visualGuides.$maskBg.css({width:dimensions.outerWidth-2,height:dimensions.outerHeight-2,"border-top-width":dimensions.topHeight-2,"border-right-width":dimensions.rightWidth-2,"border-bottom-width":dimensions.bottomHeight-2,"border-left-width":dimensions.leftWidth-2}),visualGuides.$innerWindow.css({width:dimensions.innerWidth,height:dimensions.innerHeight,left:dimensions.leftWidth-2,top:dimensions.topHeight-2})},removeVisualGuides:function removeVisualGuides(){visualGuides.$maskBg.remove(),visualGuides.$innerWindow.remove()}},overlay;return overlay=componentFactory(overlayAPI,overlayConfig),makeDraggable(overlay),makeStackable(overlay,stackingOptions),overlay.on("render",function(){var self=this,$element=this.getElement(),pointerEventsPrefix=window.PointerEvent?"pointer":"mouse",$moveIcon=$("
          ",{class:"icon icon-mobile-menu"});$element.addClass(`line-reader-overlay ${overlayConfig.id}`).on(`${pointerEventsPrefix}down`+` touchstart`,function(){bringAllToFront(),self.transformOverlay()}).on(`${pointerEventsPrefix}up`+` touchend`,function(){self.restoreOverlay()}).prepend($moveIcon)}).on("dragstart",function(){innerDrag.hide(),closer.hide(),invokeOnMasks("hide"),this.appendVisualGuides()}).on("dragmove",function moveAllPartsTogether(xOffsetRelative,yOffsetRelative){position.outerX+=xOffsetRelative,position.outerY+=yOffsetRelative,position.innerX+=xOffsetRelative,position.innerY+=yOffsetRelative}).on("dragend",function(){this.removeVisualGuides(),invokeOnAll("show"),innerDrag.show(),closer.show(),applyTransforms()}).init()}function createInnerDragHandle(){innerDrag=componentFactory(),makeStackable(innerDrag,stackingOptions),makeDraggable(innerDrag,{dragRestriction:function dragRestriction(){var fixedXY=allParts.nw.mask.getElement().offset(),rect;return rect={x:fixedXY.left+constrains.minWidth,y:fixedXY.top+(constrains.minTopHeight+dimensions.innerHeight+options.resizeHandleSize),width:dimensions.outerWidth-2*constrains.minWidth,height:dimensions.outerHeight-(dimensions.innerHeight+constrains.minTopHeight+constrains.minBottomHeight-options.innerDragHeight)},rect}}).on("render",function(){var $element=this.getElement(),$dragIcon=$("
          ",{class:"icon icon-move"});$element.css("touch-action","none"),$element.addClass("line-reader-inner-drag"),$element.css({background:"none"}),$element.append($dragIcon)}).on("dragstart",function(){closer.hide(),bringAllToFront(),invokeOnMasks("setState",["resizing",!0])}).on("dragmove",function(xOffsetRelative,yOffsetRelative){position.innerX+=xOffsetRelative,position.innerY+=yOffsetRelative,dimensions.leftWidth+=xOffsetRelative,dimensions.topHeight+=yOffsetRelative,dimensions.rightWidth-=xOffsetRelative,dimensions.bottomHeight-=yOffsetRelative,applyTransformsToMasks()}).on("dragend",function(){innerDrag.bringToFront(),closer.show(),invokeOnMasks("setState",["resizing",!1]),applyTransformsToOverlays()}).init()}function createCloser(){closer=componentFactory(),makeStackable(closer,stackingOptions),makePlaceable(closer).on("render",function(){var self=this,$element=this.getElement(),$closeIcon=$("
          ",{class:"icon icon-result-nok"});$element.append($closeIcon),$element.addClass("line-reader-closer"),$element.on("mousedown touchstart",function(){bringAllToFront()}),$element.on("click",function(e){e.stopPropagation(),self.trigger("click")})}).init()}function bringAllToFront(){invokeOnAll("bringToFront"),innerDrag.bringToFront(),closer.bringToFront()}function invokeOnAll(fn,args){invokeOnMasks(fn,args),invokeOnOverlays(fn,args)}function invokeOnMasks(fn,args){invokeOn("mask",fn,args)}function invokeOnOverlays(fn,args){invokeOn("overlay",fn,args)}function invokeOn(target,fn,args){_.forOwn(allParts,function(part){_.isObject(part[target])&&_.isFunction(part[target][fn])&&part[target][fn](...(args||[]))})}function applyTransforms(){applyTransformsToMasks(),applyTransformsToOverlays(),applyTransformsToInnerDrag(),applyTransformsToCloser()}function applyTransformsToMasks(){invokeOnMasks("place")}function applyTransformsToOverlays(){_.forOwn(allParts,function(part){part.overlay&&part.mask.placeOverlay(part.overlay)})}function applyTransformsToInnerDrag(){innerDrag&&innerDrag.setSize(dimensions.innerWidth-20,options.innerDragHeight).moveTo(position.innerX+10,position.innerY+dimensions.innerHeight+options.resizeHandleSize)}function applyTransformsToCloser(){closer&&closer.setSize(constrains.minWidth-options.resizeHandleSize,constrains.minHeight-options.resizeHandleSize).moveTo(position.outerX+dimensions.outerWidth-constrains.minWidth-5,position.outerY+options.resizeHandleSize-4)}function correctTransforms(){dimensions.topHeight",{class:"mask-bg"}),visualGuides.$innerWindow=$("
          ",{class:"inner-window"})}var allParts={},visualGuides={},compoundMask,innerDrag,closer;const setInnerHeight=newHeight=>{dimensions.innerHeight=newHeight,dimensions.bottomHeight=dimensions.outerHeight-dimensions.innerHeight-dimensions.topHeight};return dimensions=_.defaults(dimensions||{},defaultDimensions),position=_.defaults(position||{},defaultPosition),options=_.defaults(options||{},defaultOptions),constrains={minWidth:2*options.resizeHandleSize+options.dragMinWidth,minHeight:2*options.resizeHandleSize+options.dragMinHeight,minBottomHeight:2*options.resizeHandleSize+options.innerDragHeight,minTopHeight:2*options.resizeHandleSize+18},compoundMask={init:function init(){var self=this;return this.setTransforms(dimensions,position),createCompoundMask(),createVisualGuides(),createInnerDragHandle(),createCloser(),closer.on("click",function(){self.hide(),self.trigger("close")}),this},render:function render($container){return invokeOnAll("render",[$container]),innerDrag.render($container),closer.render($container),applyTransforms(),this},destroy:function destroy(){return invokeOnAll("destroy"),visualGuides=null,innerDrag=null,closer=null,this},show:function show(){return invokeOnAll("show"),innerDrag.show(),closer.show(),this.setState("hidden",!1),this},hide:function hide(){return invokeOnAll("hide"),innerDrag.hide(),closer.hide(),this.setState("hidden",!0),this},setTransforms:function setTransforms(dim,pos){dimensions=_.defaults(dim||{},dimensions),position=_.defaults(pos||{},position),dimensions.topHeight=pos.innerY-pos.outerY,dimensions.rightWidth=dim.outerWidth-(pos.innerX-pos.outerX)-dim.innerWidth,dimensions.bottomHeight=dim.outerHeight-(pos.innerY-pos.outerY)-dim.innerHeight,dimensions.leftWidth=pos.innerX-pos.outerX,correctTransforms(),applyTransforms()},getDimensions:function getDimensions(){return dimensions},getPosition:function getPosition(){return position},getParts:function getParts(){return allParts}},statifier(compoundMask),eventifier(compoundMask),compoundMask}$=$&&Object.prototype.hasOwnProperty.call($,"default")?$["default"]:$,_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,statifier=statifier&&Object.prototype.hasOwnProperty.call(statifier,"default")?statifier["default"]:statifier,eventifier=eventifier&&Object.prototype.hasOwnProperty.call(eventifier,"default")?eventifier["default"]:eventifier,componentFactory=componentFactory&&Object.prototype.hasOwnProperty.call(componentFactory,"default")?componentFactory["default"]:componentFactory,makePlaceable=makePlaceable&&Object.prototype.hasOwnProperty.call(makePlaceable,"default")?makePlaceable["default"]:makePlaceable,makeDraggable=makeDraggable&&Object.prototype.hasOwnProperty.call(makeDraggable,"default")?makeDraggable["default"]:makeDraggable,makeResizable=makeResizable&&Object.prototype.hasOwnProperty.call(makeResizable,"default")?makeResizable["default"]:makeResizable,makeStackable=makeStackable&&Object.prototype.hasOwnProperty.call(makeStackable,"default")?makeStackable["default"]:makeStackable;var defaultDimensions={outerWidth:600,outerHeight:400,innerWidth:500,innerHeight:20},defaultPosition={outerX:0,outerY:0,innerX:50,innerY:50},defaultOptions={dragMinWidth:10,dragMinHeight:10,resizeHandleSize:10,innerDragHeight:20},stackingOptions={stackingScope:"test-runner"},constrains;return compoundMaskFactory}),define("taoQtiTest/runner/plugins/tools/lineReader/plugin",["lodash","i18n","taoTests/runner/plugin","ui/hider","util/shortcut","util/namespace","taoQtiTest/runner/helpers/map","taoQtiTest/runner/plugins/tools/lineReader/compoundMask"],function(_,__,pluginFactory,hider,shortcut,namespaceHelper,mapHelper,compoundMaskFactory){"use strict";function getDimensions($container){var $qtiContent=$container.find("#qti-content"),$qtiItem=$qtiContent.find(".qti-item"),lineHeight=Math.ceil(parseFloat($qtiContent.css("line-height")))||20;return{outerWidth:$qtiItem.width()+4*maskOptions.resizeHandleSize+2*maskOptions.dragMinWidth,outerHeight:175,innerWidth:$qtiItem.width(),innerHeight:lineHeight}}function getPosition($container){var $qtiContent=$container.find("#qti-content"),$qtiItem=$qtiContent.find(".qti-item"),itemPosition=$qtiItem.position()||{},paddingLeft=parseInt($qtiItem.css("padding-left"),10),paddingTop=parseInt($qtiItem.css("padding-top"),10),textPadding=3,innerX=parseInt(itemPosition.left,10)+paddingLeft-3,innerY=parseInt(itemPosition.top,10)+paddingTop-3;return{outerX:innerX-2*maskOptions.resizeHandleSize-maskOptions.dragMinWidth,outerY:0,innerX:innerX,innerY:innerY}}function containerWidthHasChanged($container){var newDimensions=getDimensions($container);return newDimensions.outerWidth!==dimensions.outerWidth}_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,shortcut=shortcut&&Object.prototype.hasOwnProperty.call(shortcut,"default")?shortcut["default"]:shortcut,namespaceHelper=namespaceHelper&&Object.prototype.hasOwnProperty.call(namespaceHelper,"default")?namespaceHelper["default"]:namespaceHelper,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper,compoundMaskFactory=compoundMaskFactory&&Object.prototype.hasOwnProperty.call(compoundMaskFactory,"default")?compoundMaskFactory["default"]:compoundMaskFactory;var pluginName="line-reader",actionPrefix=`tool-${"line-reader"}-`,maskOptions={dragMinWidth:17,dragMinHeight:7,resizeHandleSize:7,innerDragHeight:20},plugin=pluginFactory({name:"line-reader",init:function init(){function isEnabled(){return mapHelper.hasItemCategory(testRunner.getTestMap(),testRunner.getTestContext().itemIdentifier,"lineReader",!0)}function toggleButton(){isEnabled()?self.show():self.hide()}function toggleMask(){self.compoundMask.getState("hidden")?(containerWidthHasChanged($container)&&transformMask($container),openMask()):closeMask()}function openMask(){self.compoundMask.show(),self.trigger("start"),self.button.turnOn()}function closeMask(){self.compoundMask.getState("hidden")||self.compoundMask.hide(),self.trigger("end"),self.button.turnOff()}function transformMask($maskContainer){dimensions=getDimensions($maskContainer),position=getPosition($maskContainer),self.compoundMask.setTransforms(_.clone(dimensions),_.clone(position))}const self=this,testRunner=this.getTestRunner(),testRunnerOptions=testRunner.getOptions(),pluginShortcuts=(testRunnerOptions.shortcuts||{})["line-reader"]||{},$container=testRunner.getAreaBroker().getContentArea().parent();this.compoundMask=compoundMaskFactory(maskOptions).init().render($container).on("close",function(){closeMask()}).hide(),this.button=this.getAreaBroker().getToolbox().createEntry({title:__("Line Reader"),icon:"insert-horizontal-line",control:"line-reader",text:__("Line Reader")}),this.button.on("click",function(e){e.preventDefault(),testRunner.trigger(`${actionPrefix}toggle`)}),testRunnerOptions.allowShortcuts&&pluginShortcuts.toggle&&shortcut.add(namespaceHelper.namespaceAll(pluginShortcuts.toggle,this.getName(),!0),function(){testRunner.trigger(`${actionPrefix}toggle`)},{avoidInput:!0,prevent:!0}),this.disable(),testRunner.on("loaditem",toggleButton).on("renderitem",function(){transformMask($container)}).on("enabletools renderitem",function(){self.enable()}).on("disabletools unloaditem",function(){self.disable(),closeMask()}).on(`${actionPrefix}toggle`,function(){isEnabled()&&toggleMask()})},destroy:function destroy(){this.compoundMask.destroy(),shortcut.remove(`.${this.getName()}`)},enable:function enable(){this.button.enable()},disable:function disable(){this.button.disable()},show:function show(){this.button.show()},hide:function hide(){this.button.hide()}}),dimensions,position;return plugin}),define("taoQtiTest/runner/plugins/tools/magnifier/magnifierPanel",["jquery","lodash","ui/component","handlebars","lib/handlebars/helpers","ui/dynamicComponent"],function($$1,_,component,Handlebars,Helpers0,dynamicComponent){"use strict";var _Mathmin=Math.min,_Mathmax2=Math.max;function magnifierPanelTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}function magnifierPanelFactory(config){function scrollInClone(scrollData){var $clonedTarget;controls&&controls.$clone&&scrollData&&scrollData.id&&($clonedTarget=controls.$clone.find(`[data-magnifier-scroll=${scrollData.id}]`),$clonedTarget.length&&(_.isNumber(scrollData.scrollTop)&&($clonedTarget[0].scrollTop=scrollData.scrollTop),_.isNumber(scrollData.scrollLeft)&&($clonedTarget[0].scrollLeft=scrollData.scrollLeft)))}function updateScrollPositions(){if(!controls||!controls.$target)return;const elements=[controls.$target];let scrollOffsetsChanged=!1;for(;elements.length;){const $currentElement=$$1(elements.shift()),scrollLeft=$currentElement.scrollLeft(),scrollTop=$currentElement.scrollTop();let scrollId=$currentElement.data("magnifier-scroll");if(elements.push(...Array.from($currentElement.children())),0= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",functionType="function",escapeExpression=this.escapeExpression,helperMissing=helpers.helperMissing,stack1,helper,options;return buffer+="
          \n
          ",(helper=helpers.level)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.level,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"
          \n
          \n
          \n
          \n \n \n \n
          \n
          \n",buffer}),screenRatio=window.screen.width/window.screen.height,debounceDelay=50,scrollingDelay=20,defaultBaseSize=116,defaultLevelMin=2,defaultLevelMax=8,defaultLevel=defaultLevelMin,defaultConfig={level:defaultLevel,levelMin:defaultLevelMin,levelMax:defaultLevelMax,levelStep:.5,baseSize:defaultBaseSize,maxRatio:.5},dynamicComponentDefaultConfig={draggable:!0,resizable:!0,preserveAspectRatio:!1,width:defaultBaseSize*defaultLevel,height:defaultBaseSize*defaultLevel/screenRatio,minWidth:defaultBaseSize*defaultLevelMin,minHeight:defaultBaseSize*defaultLevelMin/screenRatio,stackingScope:"test-runner",top:50,left:10};return magnifierPanelFactory}),define("taoQtiTest/runner/plugins/tools/magnifier/magnifier",["lodash","i18n","taoTests/runner/plugin","ui/hider","util/shortcut","util/namespace","taoQtiTest/runner/plugins/tools/magnifier/magnifierPanel","taoQtiTest/runner/helpers/map"],function(_,__,pluginFactory,hider,shortcut,namespaceHelper,magnifierPanelFactory,mapHelper){"use strict";_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,shortcut=shortcut&&Object.prototype.hasOwnProperty.call(shortcut,"default")?shortcut["default"]:shortcut,namespaceHelper=namespaceHelper&&Object.prototype.hasOwnProperty.call(namespaceHelper,"default")?namespaceHelper["default"]:namespaceHelper,magnifierPanelFactory=magnifierPanelFactory&&Object.prototype.hasOwnProperty.call(magnifierPanelFactory,"default")?magnifierPanelFactory["default"]:magnifierPanelFactory,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper;var pluginName="magnifier",actionPrefix=`tool-${"magnifier"}-`,defaultOptions={zoomMin:2,zoomMax:8,zoomStep:.5},magnifier=pluginFactory({name:"magnifier",init:function init(){function getMagnifierPanel(){var $container;return magnifierPanel||($container=testRunner.getAreaBroker().getContainer(),magnifierPanel=magnifierPanelFactory({levelMin:pluginConfig.zoomMin,levelMax:pluginConfig.zoomMax,levelStep:pluginConfig.zoomStep,component:{renderTo:$container.parent(),draggableContainer:$container.parent()}}).on("show",function(){self.trigger("magnifier-show")}).on("hide",function(){self.trigger("magnifier-hide")}).on("zoom",function(level){self.trigger("magnifier-zoom",level)}).on("close",function(){hideMagnifier()}).setTarget($container),self.trigger("magnifier-create")),magnifierPanel}function isEnabled(){return mapHelper.hasItemCategory(testRunner.getTestMap(),testRunner.getTestContext().itemIdentifier,"magnifier",!0)}function togglePlugin(){isEnabled()?self.show():self.hide()}function toggleMagnifier(){self.getState("enabled")&&(self.getState("active")?hideMagnifier():showMagnifier())}function showMagnifier(){getMagnifierPanel(),magnifierPanel.is("hidden")&&magnifierPanel.show(),self.button.turnOn(),testRunner.trigger(`plugin-open.${"magnifier"}`),self.setState("active",!0)}function hideMagnifier(){self.setState("active",!1),self.button.turnOff(),testRunner.trigger(`plugin-close.${"magnifier"}`),magnifierPanel&&!magnifierPanel.is("hidden")&&magnifierPanel.hide()}const self=this,testRunner=this.getTestRunner(),testRunnerOptions=testRunner.getOptions(),pluginConfig=Object.assign({},defaultOptions,this.getConfig()),pluginShortcuts=(testRunnerOptions.shortcuts||{}).magnifier||{};let magnifierPanel=null;this.button=this.getAreaBroker().getToolbox().createEntry({control:"magnify",title:__("Displays a customisable magnifier"),text:__("Magnifying Glass"),icon:"find"}),this.button.on("click",function(event){event.preventDefault(),testRunner.trigger(`${actionPrefix}toggle`)}),testRunnerOptions.allowShortcuts&&_.forEach(pluginShortcuts,function(command,key){shortcut.add(namespaceHelper.namespaceAll(command,"magnifier",!0),function(){testRunner.trigger(actionPrefix+key)},{avoidInput:!0})}),togglePlugin(),this.disable(),testRunner.on("loaditem",function(){togglePlugin(),self.disable()}).on("renderitem",function(){magnifierPanel&&magnifierPanel.update().zoomTo(pluginConfig.zoomMin)}).on("enabletools renderitem",function(){self.enable()}).on("disabletools unloaditem",function(){self.getState("active")&&hideMagnifier(),self.disable()}).on("destroy",function(){magnifierPanel&&magnifierPanel.destroy(),magnifierPanel=null}).on(`${actionPrefix}toggle`,function(){isEnabled()&&toggleMagnifier()}).on(`${actionPrefix}in`,function(){isEnabled()&&self.getState("enabled")&&self.getState("active")&&getMagnifierPanel().zoomIn()}).on(`${actionPrefix}out`,function(){isEnabled()&&self.getState("enabled")&&self.getState("active")&&getMagnifierPanel().zoomOut()}).on(`${actionPrefix}close`,function(){self.getState("active")&&hideMagnifier()})},destroy:function destroy(){shortcut.remove(`.${"magnifier"}`)},enable:function enable(){this.button.enable()},disable:function disable(){this.button.disable()},show:function show(){this.button.show()},hide:function hide(){this.button.hide()}});return magnifier}),define("taoQtiTest/runner/plugins/tools/zoom",["jquery","i18n","ui/hider","ui/transformer","util/shortcut","util/namespace","taoTests/runner/plugin","taoQtiTest/runner/helpers/map"],function($,__,hider,transformer,shortcut,namespaceHelper,pluginFactory,mapHelper){"use strict";var _Mathmax3=Math.max;$=$&&Object.prototype.hasOwnProperty.call($,"default")?$["default"]:$,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,transformer=transformer&&Object.prototype.hasOwnProperty.call(transformer,"default")?transformer["default"]:transformer,shortcut=shortcut&&Object.prototype.hasOwnProperty.call(shortcut,"default")?shortcut["default"]:shortcut,namespaceHelper=namespaceHelper&&Object.prototype.hasOwnProperty.call(namespaceHelper,"default")?namespaceHelper["default"]:namespaceHelper,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper;const standard=100,increment=10,threshold={lower:10,upper:200},_setZoomLevel=($target,level)=>{const $parent=$target.parent(),newScale=level/standard,isOverZoom=$parent.outerWidth(!0)<$target.width()*newScale;isOverZoom?(transformer.setTransformOrigin($target,"0 0"),$parent.css("margin-left","0")):(transformer.setTransformOrigin($target,"50% 0"),$parent.css("margin-left","")),transformer.scale($target,newScale)},_resetZoom=$target=>{transformer.reset($target)},forceRepaint=$target=>{const sel=$target[0];sel&&(sel.style.display="none",sel.offsetHeight,sel.style.display="")};var zoom=pluginFactory({name:"zoom",init(){const testRunner=this.getTestRunner(),testRunnerOptions=testRunner.getOptions(),pluginShortcuts=(testRunnerOptions.shortcuts||{})[this.getName()]||{},testRunnerContainer=this.getAreaBroker().getContainer().get(0),isConfigured=()=>mapHelper.hasItemCategory(testRunner.getTestMap(),testRunner.getTestContext().itemIdentifier,"zoom",!0),togglePlugin=()=>{isConfigured()?this.show():this.hide()},zoomAction=dir=>{const inc=increment*dir;if(this.$zoomTarget){const el=this.$zoomTarget[0],before=el.getBoundingClientRect();let sx=this.$container.scrollLeft(),sy=this.$container.scrollTop();this.zoom=_Mathmax3(threshold.lower,Math.min(threshold.upper,this.zoom+inc)),this.zoom===standard?_resetZoom(this.$zoomTarget):_setZoomLevel(this.$zoomTarget,this.zoom),testRunnerContainer.style.setProperty("--tool-zoom-level",this.zoom/standard),forceRepaint(this.$zoomTarget);const after=el.getBoundingClientRect();sx=_Mathmax3(0,sx+(after.width-before.width)/2),sy=_Mathmax3(0,sy+(after.height-before.height)/2),this.$container.scrollLeft(sx).scrollTop(sy)}},zoomIn=()=>{!1!==this.getState("enabled")&&zoomAction(1)},zoomOut=()=>{!1!==this.getState("enabled")&&zoomAction(-1)},zoomReApply=()=>{this.zoom!==standard&&_setZoomLevel(this.$zoomTarget,this.zoom)};this.buttonZoomOut=this.getAreaBroker().getToolbox().createEntry({control:"zoomOut",title:__("Zoom out"),icon:"remove"}),this.buttonZoomIn=this.getAreaBroker().getToolbox().createEntry({control:"zoomIn",title:__("Zoom in"),icon:"add"}),this.buttonZoomIn.on("click",e=>{e.preventDefault(),testRunner.trigger("tool-zoomin")}),this.buttonZoomOut.on("click",e=>{e.preventDefault(),testRunner.trigger("tool-zoomout")}),testRunnerOptions.allowShortcuts&&(pluginShortcuts.in&&shortcut.add(namespaceHelper.namespaceAll(pluginShortcuts.in,this.getName(),!0),()=>{testRunner.trigger("tool-zoomin")},{avoidInput:!0}),pluginShortcuts.out&&shortcut.add(namespaceHelper.namespaceAll(pluginShortcuts.out,this.getName(),!0),()=>{testRunner.trigger("tool-zoomout")},{avoidInput:!0})),togglePlugin(),this.disable(),testRunner.on("loaditem",()=>{this.zoom=standard,togglePlugin(),this.disable()}).on("renderitem",()=>{this.$container=$("#qti-content"),this.$zoomTarget=$(".qti-item"),this.enable()}).on("enabletools",()=>{this.enable()}).on("disabletools unloaditem",()=>{this.disable()}).on("tool-zoomin",zoomIn).on("tool-zoomout",zoomOut).on("tool-zoomreapply",zoomReApply)},destroy(){shortcut.remove(`.${this.getName()}`)},enable(){this.buttonZoomIn.enable(),this.buttonZoomOut.enable()},disable(){this.buttonZoomIn.disable(),this.buttonZoomOut.disable()},show(){this.buttonZoomIn.show(),this.buttonZoomOut.show()},hide(){this.buttonZoomIn.hide(),this.buttonZoomOut.hide()}});return zoom}),function(c){var d=document,a="appendChild",i="styleSheet",s=d.createElement("style");s.type="text/css",d.getElementsByTagName("head")[0].appendChild(s),s.styleSheet?s.styleSheet.cssText=c:s.appendChild(d.createTextNode(c))}("/*\nUsage:\n- linear-gradient((color1, color2, color3)) - returns linear-gradient with evenly distributed colors,\n if 3 colors used then the position of each will be 33,33%\n- linear-gradient((color1 0%, color2 30%, color3 80%)) - returns linear-gradient with manually distributed colors,\n first param - color, second - position. Also you can use px or other valid units for set position.\n*/\n/* based on \"visually-hidden\" mixin in LDS for accessibility goals */\n/* Do not edit */\n.test-runner-scope .content-wrapper p.key-navigation-group, .test-runner-scope .content-wrapper div.key-navigation-group:not(.select2-container) {\n padding: 5px !important;\n}\n.test-runner-scope .content-wrapper .key-navigation-group:not(.qti-extendedTextInteraction):not(.qti-textEntryInteraction):not(.qti-customInteraction) {\n border-width: 1px !important;\n border-style: solid;\n border-color: transparent;\n}\n.test-runner-scope .content-wrapper .key-navigation-group:not(.qti-extendedTextInteraction):not(.qti-textEntryInteraction):not(.qti-customInteraction).focusin {\n border-color: rgb(14, 93, 145) !important;\n outline: none;\n}\n.test-runner-scope .content-wrapper .key-navigation-group:not(.qti-extendedTextInteraction):not(.qti-textEntryInteraction):not(.qti-customInteraction).qti-interaction .qti-choice.key-navigation-highlight:not(.tts-content-node) {\n background: #e7eff4 !important;\n}\n.test-runner-scope .content-wrapper span.key-navigation-group {\n border: none !important;\n}\n.test-runner-scope .content-wrapper span.key-navigation-group.focusin {\n outline: solid rgb(14, 93, 145) 1px !important;\n outline-offset: 1px;\n}\n.test-runner-scope .test-sidebar .key-navigation-group.focusin {\n background: #e7eff4;\n}\n.test-runner-scope .test-sidebar .key-navigation-group .qti-navigator-filters .key-navigation-highlight .qti-navigator-tab {\n border-width: 2px;\n}\n.test-runner-scope .test-sidebar .key-navigation-group .qti-navigator-filters .key-navigation-highlight:focus {\n outline: none;\n}\n.test-runner-scope .test-sidebar .key-navigation-group .qti-navigator-filters .key-navigation-highlight:focus .qti-navigator-tab {\n border-top-color: #222 !important;\n border-left-color: #222 !important;\n border-right-color: #222 !important;\n}\n.test-runner-scope .test-sidebar .key-navigation-group li.qti-navigator-item.key-navigation-highlight {\n padding-left: 8px;\n border-left: solid 2px #222;\n}\n.test-runner-scope .test-sidebar .key-navigation-group li.qti-navigator-item.key-navigation-highlight .key-navigation-highlight:focus {\n outline: none;\n}\n.test-runner-scope .test-sidebar .qti-navigator-fizzy .key-navigation-group.focusin {\n background: #f2f2f2;\n}\n.test-runner-scope .bottom-action-bar.content-action-bar.key-navigation-group.focusin {\n -ms-box-shadow: 0 0 6px 2px #3e7da7;\n -o-box-shadow: 0 0 6px 2px #3e7da7;\n box-shadow: 0 0 6px 2px #3e7da7;\n}\n.test-runner-scope .bottom-action-bar.content-action-bar.key-navigation-group .key-navigation-highlight:focus {\n margin-bottom: 0;\n border-bottom-color: #e7eff4 !important;\n outline: none;\n}\n.test-runner-scope .bottom-action-bar.content-action-bar.key-navigation-group .key-navigation-highlight:focus.active {\n border-bottom-color: transparent !important;\n background: #e7eff4 !important;\n}\n.test-runner-scope .bottom-action-bar.content-action-bar.key-navigation-group .key-navigation-highlight:focus:not(.active):not(:active) .li-inner {\n color: #e7eff4;\n}\n\nheader .settings-menu .key-navigation-group {\n padding-right: 5px;\n}\nheader .settings-menu .key-navigation-group.focusin {\n background-color: rgba(14, 93, 145, 0.5);\n padding-bottom: 10px;\n}\nheader .settings-menu .key-navigation-highlight:focus {\n height: 54px;\n color: white !important;\n border-bottom: solid 2px white !important;\n}\n/*# sourceMappingURL=../../../taoQtiTest/views/node_modules/@oat-sa/tao-test-runner-qti/dist/plugins/content/accessibility/css/key-navigation.css.map *//*\nUsage:\n- linear-gradient((color1, color2, color3)) - returns linear-gradient with evenly distributed colors,\n if 3 colors used then the position of each will be 33,33%\n- linear-gradient((color1 0%, color2 30%, color3 80%)) - returns linear-gradient with manually distributed colors,\n first param - color, second - position. Also you can use px or other valid units for set position.\n*/\n/* based on \"visually-hidden\" mixin in LDS for accessibility goals */\n/* Do not edit */\n.countdown {\n opacity: 0;\n position: relative;\n display: inline-block;\n overflow: hidden;\n text-align: center;\n vertical-align: top;\n line-height: 1.2;\n padding: 0 20px;\n margin-top: -1px;\n height: 100%;\n}\n.countdown.rendered {\n opacity: 1;\n transition: opacity, 300ms, linear, 0s;\n}\n.countdown .label {\n max-width: 130px;\n display: block;\n font-size: 12px;\n font-size: 1.2rem;\n}\n/*# sourceMappingURL=../../../taoQtiTest/views/node_modules/@oat-sa/tao-test-runner-qti/dist/plugins/controls/timer/component/css/countdown.css.map *//*\nUsage:\n- linear-gradient((color1, color2, color3)) - returns linear-gradient with evenly distributed colors,\n if 3 colors used then the position of each will be 33,33%\n- linear-gradient((color1 0%, color2 30%, color3 80%)) - returns linear-gradient with manually distributed colors,\n first param - color, second - position. Also you can use px or other valid units for set position.\n*/\n/* based on \"visually-hidden\" mixin in LDS for accessibility goals */\n/* Do not edit */\n.timer-box {\n opacity: 0;\n padding-top: 0;\n white-space: nowrap;\n /*flex item of control-box */\n flex: 1 0 auto;\n /* is also a flex container for .qti-timer */\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n}\n.timer-box.rendered {\n opacity: 1;\n transition: opacity, 300ms, linear, 0s;\n}\n.timer-box .timer-toggler {\n text-decoration: none;\n color: white;\n line-height: 1.3;\n opacity: 0.68;\n padding: 8px 20px;\n position: relative;\n top: -1px;\n left: 20px;\n z-index: 2;\n transition: opacity, 0.5s, ease-out, 0s;\n}\n.timer-box .timer-toggler:hover, .timer-box .timer-toggler:active, .timer-box .timer-toggler:focus {\n outline: unset;\n}\n.timer-box .timer-toggler:active, .timer-box .timer-toggler:focus {\n border: 2px solid white;\n}\n.timer-box .timer-toggler:hover {\n opacity: 0.93;\n transition: opacity, 0.5s, ease-out, 0s;\n}\n.timer-box.zen .timer-toggler {\n opacity: 0.93;\n transition: opacity, 0.5s, ease-out, 0s;\n}\n.timer-box.zen .countdown .time {\n opacity: 0;\n transition: opacity, 1s, ease-out, 0s;\n}\n.timer-box .countdown::before {\n content: \" \";\n background: rgba(255, 255, 255, 0.3);\n width: 1px;\n height: 20px;\n position: absolute;\n left: 0;\n top: 5px;\n}\n.timer-box .countdown:first-child::before {\n content: none;\n}\n.timer-box .countdown[data-scope=test][data-type=min] {\n order: 5;\n}\n.timer-box .countdown[data-scope=test] {\n order: 10;\n}\n.timer-box .countdown[data-scope=testPart][data-type=min] {\n order: 15;\n}\n.timer-box .countdown[data-scope=testPart] {\n order: 20;\n}\n.timer-box .countdown[data-scope=section][data-type=min] {\n order: 25;\n}\n.timer-box .countdown[data-scope=section] {\n order: 30;\n}\n.timer-box .countdown[data-scope=item][data-type=min] {\n order: 35;\n}\n.timer-box .countdown[data-scope=item] {\n order: 40;\n}\n/*# sourceMappingURL=../../../taoQtiTest/views/node_modules/@oat-sa/tao-test-runner-qti/dist/plugins/controls/timer/component/css/timerbox.css.map */"),define("taoQtiTest/loader/testPlugins.bundle",function(){}); +define("taoQtiTest/runner/plugins/content/accessibility/focusOnFirstField",["lodash","taoTests/runner/plugin","ckeditor"],function(_,pluginFactory,ckEditor){"use strict";function isIOSDevice(){return /(iPhone|iPad)/i.test(navigator.userAgent)}_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,ckEditor=ckEditor&&Object.prototype.hasOwnProperty.call(ckEditor,"default")?ckEditor["default"]:ckEditor;var focusOnFirstField=pluginFactory({name:"focusOnFirstField",init:function init(){var self=this;isIOSDevice()||this.getTestRunner().after("renderitem",function(){var $input=self.getAreaBroker().getContentArea().find(".qti-itemBody").find("input, textarea, select").not(":input[type=button], :input[type=submit], :input[type=reset]").first(),$cke=$input.closest(".qti-interaction").find(".cke");$cke.length?_.delay(function(){ckEditor.instances[$cke.attr("id").replace(/^cke_/,"")].focus()},100):$input.focus()})}});return focusOnFirstField}),define("taoQtiTest/runner/plugins/content/accessibility/jumplinks/helpers",["exports","i18n"],function(exports,__){"use strict";__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__;const getJumpElementFactory=broker=>({get container(){return broker.getContainer()},get question(){return broker.getContainer().find(".content-wrapper").first()},get navigation(){return broker.getNavigationArea().find(":not(.hidden)[tabindex]").first()},get toolbox(){return broker.getToolboxArea().find(":not(.hidden)[tabindex]").first()},get teststatus(){return broker.getPanelArea().find(":not(.hidden)[tabindex]").first()}}),getItemStatus=item=>item.flagged?__("Flagged for review"):item.answered?__("Answered"):item.viewed?__("Not answered"):__("Not seen"),isReviewPanelHidden=testRunner=>testRunner.getAreaBroker().getPanelArea().find(".qti-navigator").is(".hidden");exports.getItemStatus=getItemStatus,exports.getJumpElementFactory=getJumpElementFactory,exports.isReviewPanelHidden=isReviewPanelHidden,Object.defineProperty(exports,"__esModule",{value:!0})}),define("taoQtiTest/runner/plugins/content/accessibility/jumplinks/jumplinks",["lodash","ui/component","handlebars","lib/handlebars/helpers"],function(_,component,Handlebars,Helpers0){"use strict";function jumplinksTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}function jumplinksFactory(config){const jumplinksBox=component({},defaults).on("render",function(){const behavior=[{selector:"[data-jump=question] ",eventName:"jump",eventParam:"question"},{selector:"[data-jump=navigation]",eventName:"jump",eventParam:"navigation"},{selector:"[data-jump=toolbox]",eventName:"jump",eventParam:"toolbox"},{selector:"[data-jump=teststatus]",eventName:"jump",eventParam:"teststatus"},{selector:"[data-jump=shortcuts]",eventName:"shortcuts",eventParam:"shortcuts"}];_.forEach(behavior,linkDescription=>{const $link=this.getElement().find(linkDescription.selector),handleLink=()=>{this.trigger(linkDescription.eventName,linkDescription.eventParam),this.getElement().find(":focus").blur()};$link&&($link.on("click",handleLink),$link.on("keyup",event=>{const activationKeys=[32,13];activationKeys.includes(event.keyCode)&&handleLink()}))})});return jumplinksBox.setTemplate(jumplinksTpl),_.defer(()=>{jumplinksBox.init(config)}),jumplinksBox}_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,component=component&&Object.prototype.hasOwnProperty.call(component,"default")?component["default"]:component,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){return"hidden"}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",helperMissing=helpers.helperMissing,escapeExpression=this.escapeExpression,functionType="function",self=this,stack1,helper,options;return buffer+="\n",buffer});const defaults={};return jumplinksFactory}),define("taoQtiTest/runner/helpers/map",["lodash"],function(_){"use strict";function getEmptyStats(){return{questions:0,answered:0,flagged:0,viewed:0,total:0,questionsViewed:0}}_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_;var map={getJumps:function getJumps(map){return map&&map.jumps},getParts:function getParts(map){return map&&map.parts},getSections:function getSections(map){var parts=this.getParts(map),result={};return _.forEach(parts,function(part){var sections=part.sections;sections&&_.forEach(sections,function(section){result[section.id]=section})}),result},getActiveItem:function getActiveItem(mapWithActive){var parts=this.getParts(mapWithActive),result={};return _.forEach(parts,function(part){var sections=part.sections;sections&&_.forEach(sections,function(section){if(section.active){const items=section.items;_.forEach(items,function(item){item.active&&(result=item)})}})}),result},getNextSections:function getNextSections(map,sectionId){var sections=this.getSections(map),result={},canList=!1;return _.forEach(sections,function(section){canList&&(result[section.id]=section),section.id===sectionId&&(canList=!0)}),result},getJump:function getJump(map,position){var jumps=this.getJumps(map);return jumps&&jumps[position]},getPart:function getPart(map,partName){var parts=this.getParts(map);return parts&&parts[partName]},getSection:function getSection(map,sectionName){var parts=this.getParts(map),section=null;return _.forEach(parts,function(part){var sections=part.sections;if(sections&§ions[sectionName])return section=sections[sectionName],!1}),section},getItem(map,itemIdentifier){const jump=_.find(this.getJumps(map),{identifier:itemIdentifier});return this.getItemAt(map,jump&&jump.position)},getItemCategories(map,itemIdentifier){const item=this.getItem(map,itemIdentifier);return item&&Array.isArray(item.categories)?item.categories:[]},hasItemCategory(map,itemIdentifier,category){let fuzzyMatch=!!(3elt.replace(taoPrefix,"").replace(/[-_\s]/g,"").toLowerCase();return categories.some(itemCategory=>normalize(itemCategory)===normalize(category))}return!1},getTestStats:function getTestStats(map){return map&&map.stats},getPartStats:function getPartStats(map,partName){var part=this.getPart(map,partName);return part&&part.stats},getSectionStats:function getSectionStats(map,sectionName){var section=this.getSection(map,sectionName);return section&§ion.stats},getScopeStats:function getScopeStats(map,position,scope){var jump=this.getJump(map,position);switch(scope){case"section":case"testSection":return this.getSectionStats(map,jump&&jump.section);case"part":case"testPart":return this.getPartStats(map,jump&&jump.part);case"testWithoutInaccessibleItems":{const testStats=this.getTestStats(map),{position:currentPartPosition,isLinear:isCurrentPartLinear}=this.getPart(map,jump&&jump.part),parts=Object.values(this.getParts(map)).filter(_ref=>{let{position:partPosition}=_ref;return partPositionb-a),linearPartIndex=isCurrentPartLinear?0:parts.findIndex(_ref2=>{let{isLinear}=_ref2;return isLinear});if(-1===linearPartIndex)return testStats;const inaccessibleParts=parts.slice(linearPartIndex),countOfInaccessibleUnasweredQestions=inaccessibleParts.reduce((acc,_ref3)=>{let{stats:{questions,answered}}=_ref3;return acc+(questions-answered)},0),countOfInaccessibleFlaggedQestions=inaccessibleParts.reduce((acc,_ref4)=>{let{stats:{flagged}}=_ref4;return acc+flagged},0);return Object.assign({},testStats,{answered:testStats.answered+countOfInaccessibleUnasweredQestions,flagged:testStats.flagged-countOfInaccessibleFlaggedQestions})}default:case"test":return this.getTestStats(map)}},getScopeMap:function getScopeMap(map,position,scope){var scopeMap=_.cloneDeep(map||{}),jump=this.getJump(scopeMap,position),part=this.getPart(scopeMap,jump&&jump.part),section=this.getSection(scopeMap,jump&&jump.section);return scope&&"test"!==scope&&(scopeMap.parts={},part&&(scopeMap.parts[jump.part]=part)),part&&("section"===scope||"testSection"===scope)&&(part.sections={},section&&(part.sections[jump.section]=section)),section&&(section.stats=this.computeItemStats(section.items)),part&&(part.stats=this.computeStats(part.sections)),scopeMap.stats=this.computeStats(scopeMap.parts),scopeMap},getScopeMapFromContext:function getScopeMapFromContext(map,context,scope){var scopeMap=_.cloneDeep(map||{}),part,section;return context&&context.testPartId&&(part=this.getPart(scopeMap,context.testPartId)),context&&context.sectionId&&(section=this.getSection(scopeMap,context.sectionId)),scope&&"test"!==scope&&(scopeMap.parts={},part&&(scopeMap.parts[context.testPartId]=part)),part&&("section"===scope||"testSection"===scope)&&(part.sections={},section&&(part.sections[context.sectionId]=section)),section&&(section.stats=this.computeItemStats(section.items)),part&&(part.stats=this.computeStats(part.sections)),scopeMap.stats=this.computeStats(scopeMap.parts),scopeMap},getItemPart:function getItemPart(map,position){var jump=this.getJump(map,position);return this.getPart(map,jump&&jump.part)},getItemSection:function getItemSection(map,position){var jump=this.getJump(map,position),part=this.getPart(map,jump&&jump.part),sections=part&&part.sections;return sections&§ions[jump&&jump.section]},getItemAt:function getItemAt(map,position){var jump=this.getJump(map,position),part=this.getPart(map,jump&&jump.part),sections=part&&part.sections,section=sections&§ions[jump&&jump.section],items=section&§ion.items;return items&&items[jump&&jump.identifier]},getItemIdentifier:function getItemIdentifier(map,position){var item;return item=_.isFinite(position)?this.getItemAt(map,position):this.getItem(map,position),item&&item.id},each:function each(map,callback){return _.isFunction(callback)&&_.forEach(map&&map.parts,function(part){_.forEach(part&&part.sections,function(section){_.forEach(section&§ion.items,function(item){callback(item,section,part,map)})})}),map},updateItemStats:function updateItemStats(map,position){var jump=this.getJump(map,position),part=this.getPart(map,jump&&jump.part),sections=part&&part.sections,section=sections&§ions[jump&&jump.section];return section&&(section.stats=this.computeItemStats(section.items)),part&&(part.stats=this.computeStats(part.sections)),map&&(map.stats=this.computeStats(map.parts)),map},computeItemStats:function computeItemStats(items){return _.reduce(items,function accStats(acc,item){return item.informational||(acc.questions++,item.answered&&acc.answered++,item.viewed&&acc.questionsViewed++),item.flagged&&acc.flagged++,item.viewed&&acc.viewed++,acc.total++,acc},getEmptyStats())},computeStats:function computeStats(collection){return _.reduce(collection,function accStats(acc,item){return acc.questions+=item.stats.questions,acc.answered+=item.stats.answered,acc.flagged+=item.stats.flagged,acc.viewed+=item.stats.viewed,acc.total+=item.stats.total,acc.questionsViewed+=item.stats.questionsViewed,acc},getEmptyStats())},patch:function patch(currentMap,partialMap){var self=this,targetMap;if(!_.isPlainObject(partialMap)||!partialMap.parts)throw new TypeError("Invalid test map format");return currentMap&&"test"!==partialMap.scope?(targetMap=_.cloneDeep(currentMap),_.forEach(partialMap.parts,function(partialPart,targetPartId){"part"===partialMap.scope&&(targetMap.parts[targetPartId]=_.cloneDeep(partialPart)),"section"===partialMap.scope&&_.forEach(partialPart.sections,function(partialSection,targetSectionId){targetMap.parts[targetPartId].sections[targetSectionId]=_.cloneDeep(partialSection),targetMap.parts[targetPartId].sections[targetSectionId].stats=self.computeItemStats(targetMap.parts[targetPartId].sections[targetSectionId].items)}),targetMap.parts[targetPartId].stats=self.computeStats(targetMap.parts[targetPartId].sections)}),targetMap.stats=this.computeStats(targetMap.parts)):targetMap=_.cloneDeep(partialMap),targetMap=this.reindex(targetMap),targetMap},reindex:function reindex(map){var offset=0,offsetPart=0,offsetSection=0,lastPartId,lastSectionId;if(!_.isPlainObject(map)||!map.parts)throw new TypeError("Invalid test map format");return map.jumps=[],_.sortBy(map&&map.parts,"position").forEach(function(part){_.sortBy(part&&part.sections,"position").forEach(function(section){_.sortBy(section&§ion.items,"position").forEach(function(item){lastPartId!==part.id&&(offsetPart=0,lastPartId=part.id,part.position=offset),lastSectionId!==section.id&&(offsetSection=0,lastSectionId=section.id,section.position=offset),item.position=offset,item.index=offsetSection+1,item.positionInPart=offsetPart,item.positionInSection=offsetSection,map.jumps[offset]={identifier:item.id,section:section.id,part:part.id,position:offset},offset++,offsetSection++,offsetPart++})})}),map},createJumpTable:function createJumpTable(map){if(!_.isPlainObject(map)||!map.parts)throw new TypeError("Invalid test map format");return map.jumps=[],this.each(map,function(item,section,part){var offset=item.position;map.jumps[offset]={identifier:item.id,section:section.id,part:part.id,position:offset}}),map}};return map}),define("taoQtiTest/runner/helpers/isReviewPanelEnabled",["taoQtiTest/runner/helpers/map"],function(mapHelper){"use strict";function isReviewPanelEnabled(runner){const reviewEnabled=mapHelper.hasItemCategory(runner.getTestMap(),runner.getTestContext().itemIdentifier,"reviewScreen",!0),itemReviewEnabled=runner.getOptions().review.enabled;return reviewEnabled&&itemReviewEnabled}return mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper,isReviewPanelEnabled}),define("taoQtiTest/runner/plugins/content/accessibility/jumplinks/shortcuts",["i18n","lodash","ui/component","ui/keyNavigation/navigator","ui/keyNavigation/navigableDomElement","handlebars","lib/handlebars/helpers"],function(__,_,component,keyNavigator,navigableDomElement,Handlebars,Helpers0){"use strict";function shortcutsTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}function shortcutsBoxFactory(config){const ESK_KEY_CODE=27,shortcutsBox=component({},defaults).on("render",function(){const $element=this.getElement(),$closeBtn=$element.find(".btn-close"),$keyNavigationItems=this.getElement().find(".shortcuts-list, .btn-close");$closeBtn.on("click",()=>this.trigger("close")),$element.on("click",e=>{$element.is(e.target)&&this.trigger("close")}),$element.on("keyup",e=>{e.keyCode===ESK_KEY_CODE&&this.trigger("close")}),this.navigator=keyNavigator({elements:navigableDomElement.createFromDoms($keyNavigationItems),propagateTab:!1}).on("tab",function(){this.setCursorAt(1)}).on("shift+tab",function(){this.setCursorAt(1)}).on("blur",()=>{_.defer(()=>{this.navigator.isFocused()||this.navigator.focus()})}).on("activate",function(cursor){cursor.navigable.getElement().click()}),this.navigator.first()}).on("destroy",function(){this.navigator.destroy(),this.getElement().remove()});return shortcutsBox.setTemplate(shortcutsTpl),shortcutsBox.init(config),shortcutsBox}__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,component=component&&Object.prototype.hasOwnProperty.call(component,"default")?component["default"]:component,keyNavigator=keyNavigator&&Object.prototype.hasOwnProperty.call(keyNavigator,"default")?keyNavigator["default"]:keyNavigator,navigableDomElement=navigableDomElement&&Object.prototype.hasOwnProperty.call(navigableDomElement,"default")?navigableDomElement["default"]:navigableDomElement,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var buffer="",stack1,helper;return buffer+="\n
          \n

          ",(helper=helpers.label)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.label,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"

          \n
            \n ",stack1=helpers.each.call(depth0,depth0&&depth0.shortcuts,{hash:{},inverse:self.noop,fn:self.program(2,program2,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n
          \n
          \n ",buffer}function program2(depth0,data){var buffer="",stack1,helper;return buffer+="\n
        • \n \n ",(helper=helpers.shortcut)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.shortcut,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\n \n \n ",(helper=helpers.label)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.label,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\n \n
        • \n ",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",functionType="function",escapeExpression=this.escapeExpression,self=this,helperMissing=helpers.helperMissing,stack1,helper,options;return buffer+="
          \n
          \n

          \n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Keyboard Navigation",options):helperMissing.call(depth0,"__","Keyboard Navigation",options)))+"\n

          \n
          \n

          \n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Keyboard shortcuts for the Accessibility Tools are available to the Test-taker.",options):helperMissing.call(depth0,"__","Keyboard shortcuts for the Accessibility Tools are available to the Test-taker.",options)))+"\n

          \n

          \n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"You can magnify the content by up to 200%. Check your browser settings to find out how to do it.",options):helperMissing.call(depth0,"__","You can magnify the content by up to 200%. Check your browser settings to find out how to do it.",options)))+"\n

          \n
          \n \n ",stack1=helpers.each.call(depth0,depth0&&depth0.shortcutsGroups,{hash:{},inverse:self.noop,fn:self.program(1,program1,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n
          \n
          \n",buffer});const defaults={shortcutsGroups:[{id:"navigation-shortcuts",label:__("Navigation shortcuts"),shortcuts:[{id:"next",shortcut:"ALT + Shift + N",label:__("Go to the next question")},{id:"previous",shortcut:"ALT + Shift + P",label:__("Go to the previous question")},{id:"current",shortcut:"ALT + Shift + Q",label:__("Go to the current question")},{id:"top",shortcut:"ALT + Shift + T",label:__("Go to the top of the page")}]}]};return shortcutsBoxFactory}),define("taoQtiTest/runner/plugins/content/accessibility/jumplinks/plugin",["i18n","jquery","taoTests/runner/plugin","taoQtiTest/runner/helpers/isReviewPanelEnabled","taoQtiTest/runner/plugins/content/accessibility/jumplinks/helpers","taoQtiTest/runner/plugins/content/accessibility/jumplinks/jumplinks","taoQtiTest/runner/plugins/content/accessibility/jumplinks/shortcuts","util/shortcut","util/namespace","handlebars","lib/handlebars/helpers"],function(__,$$1,pluginFactory,isReviewPanelEnabled,helpers,jumplinksFactory,shortcutsFactory,shortcut,namespaceHelper,Handlebars,Helpers0){"use strict";function containerTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,$$1=$$1&&Object.prototype.hasOwnProperty.call($$1,"default")?$$1["default"]:$$1,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,isReviewPanelEnabled=isReviewPanelEnabled&&Object.prototype.hasOwnProperty.call(isReviewPanelEnabled,"default")?isReviewPanelEnabled["default"]:isReviewPanelEnabled,jumplinksFactory=jumplinksFactory&&Object.prototype.hasOwnProperty.call(jumplinksFactory,"default")?jumplinksFactory["default"]:jumplinksFactory,shortcutsFactory=shortcutsFactory&&Object.prototype.hasOwnProperty.call(shortcutsFactory,"default")?shortcutsFactory["default"]:shortcutsFactory,shortcut=shortcut&&Object.prototype.hasOwnProperty.call(shortcut,"default")?shortcut["default"]:shortcut,namespaceHelper=namespaceHelper&&Object.prototype.hasOwnProperty.call(namespaceHelper,"default")?namespaceHelper["default"]:namespaceHelper,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){return this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),"\n"}),plugin=pluginFactory({name:"jumplinks",init(){const testRunner=this.getTestRunner(),item=testRunner.getCurrentItem(),config={isReviewPanelEnabled:isReviewPanelEnabled(testRunner),questionStatus:helpers.getItemStatus(item)},testRunnerOptions=testRunner.getOptions(),pluginShortcuts=(testRunnerOptions.shortcuts||{})[this.getName()]||{},areaBroker=this.getAreaBroker(),getJumpElement=helpers.getJumpElementFactory(areaBroker),shortcutsConfig=-1===navigator.appVersion.indexOf("Mac")?{}:{shortcutsGroups:[{id:"navigation-shortcuts",label:__("Navigation shortcuts"),shortcuts:[{id:"next",shortcut:"OPTION + Shift + N",label:__("Go to the next question")},{id:"previous",shortcut:"OPTION + Shift + P",label:__("Go to the previous question")},{id:"current",shortcut:"OPTION + Shift + Q",label:__("Go to the current question")},{id:"top",shortcut:"OPTION + Shift + T",label:__("Go to the top of the page")}]}]};testRunnerOptions.allowShortcuts&&(pluginShortcuts.goToTop&&shortcut.add(namespaceHelper.namespaceAll(pluginShortcuts.goToTop,this.getName(),!0),function(){$$1("[tabindex]").first().focus()},{avoidInput:!0,prevent:!0}),pluginShortcuts.goToQuestion&&shortcut.add(namespaceHelper.namespaceAll(pluginShortcuts.goToQuestion,this.getName(),!0),function(){getJumpElement.question.focus()},{avoidInput:!0,prevent:!0})),this.jumplinks=jumplinksFactory(config).on("render",()=>{this.jumplinks.on("jump",jumpTo=>{const $element=getJumpElement[jumpTo];$element.focus()}),this.jumplinks.on("shortcuts",()=>{this.shortcuts||(this.shortcuts=shortcutsFactory(shortcutsConfig),this.shortcuts.render(this.getAreaBroker().getControlArea()),this.shortcuts.on("close",()=>{this.shortcuts.destroy(),this.shortcuts=null}))})}).on("update",function update(params){this.trigger("changeReviewPanel",params.isReviewPanelEnabled),this.trigger("changeQuesitionStatus",params.questionStatus)}).on("changeReviewPanel",function changeReviewPanel(enabled){const elem=this.getElement(),panelJumplink=elem.find("[data-jump=\"teststatus\"]").parent();enabled?panelJumplink.removeClass("hidden"):panelJumplink.addClass("hidden")}).on("changeQuesitionStatus",function changeQuesitionStatus(questionStatus){const elem=this.getElement(),text=`${__("Question")} - ${questionStatus}`;elem.find("[data-jump=\"question\"] > b").text(text)}),testRunner.on("renderitem",()=>{const currentItem=testRunner.getCurrentItem(),updatedConfig={isReviewPanelEnabled:!helpers.isReviewPanelHidden(testRunner)&&isReviewPanelEnabled(testRunner),questionStatus:helpers.getItemStatus(currentItem)},announcedText=__("Item %s loaded",currentItem.position);let $announce=$$1("[aria-live=polite][role=alert]").first();1!==$announce.length&&($announce=$$1("
          "),$$1("main").first().append($announce)),$announce.text(announcedText),this.jumplinks.trigger("update",updatedConfig)}).on("tool-flagitem",()=>{const currentItem=testRunner.getCurrentItem(),questionStatus=helpers.getItemStatus(Object.assign({},currentItem,{flagged:!currentItem.flagged}));this.jumplinks.trigger("changeQuesitionStatus",questionStatus)}).on("tool-reviewpanel",()=>{const wasHidden=helpers.isReviewPanelHidden(testRunner);this.jumplinks.trigger("changeReviewPanel",wasHidden)}).after("renderitem",()=>{getJumpElement.question.attr("tabindex","-1").focus()})},render:function render(){const jumplinksContainer=$$1(containerTpl());$$1(".content-wrap").prepend(jumplinksContainer),this.jumplinks.render(jumplinksContainer)}});return plugin}),define("taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/headerNavigation",["jquery","ui/keyNavigation/navigator","ui/keyNavigation/navigableDomElement","taoQtiTest/runner/plugins/content/accessibility/keyNavigation/helpers"],function($,keyNavigator,navigableDomElement,helpers){"use strict";$=$&&Object.prototype.hasOwnProperty.call($,"default")?$["default"]:$,keyNavigator=keyNavigator&&Object.prototype.hasOwnProperty.call(keyNavigator,"default")?keyNavigator["default"]:keyNavigator,navigableDomElement=navigableDomElement&&Object.prototype.hasOwnProperty.call(navigableDomElement,"default")?navigableDomElement["default"]:navigableDomElement;const groupId="header-toolbar";var headerNavigation={name:"header",init(){const config=this.getConfig(),$headerBar=$("header"),$headerElements=$headerBar.find("a:visible"),registerHeaderNavigator=(id,group,$elements)=>{const elements=navigableDomElement.createFromDoms($elements);if(elements.length){const navigator=keyNavigator({id,group,elements,propagateTab:!1,defaultPosition:0});helpers.setupItemsNavigator(navigator,config),helpers.setupClickableNavigator(navigator),this.keyNavigators.push(navigator)}};return this.keyNavigators=[],config.flatNavigation?$headerElements.each((index,element)=>registerHeaderNavigator(`${groupId}-${index}`,$headerBar,$(element))):registerHeaderNavigator(groupId,$headerBar,$headerElements),this},getNavigators(){return this.keyNavigators},destroy(){return this.keyNavigators.forEach(navigator=>navigator.destroy()),this.keyNavigators=[],this}};return headerNavigation}),define("taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/toolbarNavigation",["lodash","jquery","ui/keyNavigation/navigator","ui/keyNavigation/navigableDomElement","taoQtiTest/runner/plugins/content/accessibility/keyNavigation/helpers"],function(_,$,keyNavigator,navigableDomElement,helpers){"use strict";_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,$=$&&Object.prototype.hasOwnProperty.call($,"default")?$["default"]:$,keyNavigator=keyNavigator&&Object.prototype.hasOwnProperty.call(keyNavigator,"default")?keyNavigator["default"]:keyNavigator,navigableDomElement=navigableDomElement&&Object.prototype.hasOwnProperty.call(navigableDomElement,"default")?navigableDomElement["default"]:navigableDomElement;const groupId="bottom-toolbar";var toolbarNavigation={name:"toolbar",init(){const config=this.getConfig(),$navigationBar=this.getTestRunner().getAreaBroker().getContainer().find(".bottom-action-bar");let $toolbarElements=$navigationBar.find(".action:not(.btn-group):visible, .action.btn-group .li-inner:visible");config.reverseBottomToolbar&&($toolbarElements=$($toolbarElements.get().reverse()));const registerToolbarNavigator=(id,group,$elements)=>{const elements=navigableDomElement.createFromDoms($elements);if(elements.length){const navigator=keyNavigator({id,group,elements,propagateTab:!1,defaultPosition(navigableElements){let pos=0;return config.autoFocus&&(pos=navigableElements.length-1,_.forEach(navigableElements,(navigable,i)=>{const $element=navigable.getElement();("move-forward"===$element.data("control")||"move-end"===$element.data("control"))&&(pos=i)})),pos}});helpers.setupItemsNavigator(navigator,config),helpers.setupClickableNavigator(navigator),this.keyNavigators.push(navigator)}};return this.keyNavigators=[],config.flatNavigation?$toolbarElements.each((index,element)=>registerToolbarNavigator(`${groupId}-${index}`,$navigationBar,$(element))):registerToolbarNavigator(groupId,$navigationBar,$toolbarElements),this},getNavigators(){return this.keyNavigators},destroy(){return this.keyNavigators.forEach(navigator=>navigator.destroy()),this.keyNavigators=[],this}};return toolbarNavigation}),define("taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/topToolbarNavigation",["jquery","ui/keyNavigation/navigator","ui/keyNavigation/navigableDomElement","taoQtiTest/runner/plugins/content/accessibility/keyNavigation/helpers"],function($,keyNavigator,navigableDomElement,helpers){"use strict";$=$&&Object.prototype.hasOwnProperty.call($,"default")?$["default"]:$,keyNavigator=keyNavigator&&Object.prototype.hasOwnProperty.call(keyNavigator,"default")?keyNavigator["default"]:keyNavigator,navigableDomElement=navigableDomElement&&Object.prototype.hasOwnProperty.call(navigableDomElement,"default")?navigableDomElement["default"]:navigableDomElement;const groupId="top-toolbar";var topToolbarNavigation={name:"top-toolbar",init(){const config=this.getConfig(),$topToolbar=this.getTestRunner().getAreaBroker().getContainer().find(".top-action-bar"),$toolbarElements=$topToolbar.find(".timer-toggler"),registerTopToolbarNavigator=(id,group,$elements)=>{const elements=navigableDomElement.createFromDoms($elements);if(elements.length){const navigator=keyNavigator({id,group,elements,propagateTab:!1});helpers.setupItemsNavigator(navigator,config),helpers.setupClickableNavigator(navigator),this.keyNavigators.push(navigator)}};return this.keyNavigators=[],$toolbarElements.each((index,element)=>registerTopToolbarNavigator(`${groupId}-${index}`,$topToolbar,$(element))),this},getNavigators(){return this.keyNavigators},destroy(){return this.keyNavigators.forEach(navigator=>navigator.destroy()),this.keyNavigators=[],this}};return topToolbarNavigation}),define("taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/navigatorNavigation",["lodash","ui/keyNavigation/navigator","ui/keyNavigation/navigableDomElement","taoQtiTest/runner/plugins/content/accessibility/keyNavigation/helpers"],function(_,keyNavigator,navigableDomElement,helpers){"use strict";function initFizzy(config,$panel,$navigator,keyNavigators,managedNavigators){let itemsNavigator;const $navigatorTree=$panel.find(".qti-navigator-tree"),$enabledItems=$navigator.find(".qti-navigator-tree .buttonlist-item:not(.disabled) .buttonlist-btn"),navigableItems=navigableDomElement.createFromDoms($enabledItems),getItemFromNavigable=navigable=>navigable.getElement().parent();navigableItems.length&&(itemsNavigator=keyNavigator({id:"navigator-items",elements:navigableItems,group:$navigatorTree,loop:!0,defaultPosition(navigableElements){let pos=_.findIndex(navigableElements,navigable=>{const $parent=getItemFromNavigable(navigable);if($parent.hasClass("buttonlist-item-active")&&$parent.is(":visible"))return!0});return 0<=pos?pos:0}}).on("focus",cursor=>{getItemFromNavigable(cursor.navigable).addClass("key-navigation-highlight")}).on("blur",cursor=>{getItemFromNavigable(cursor.navigable).removeClass("key-navigation-highlight")}),helpers.setupItemsNavigator(itemsNavigator,{keyNextItem:config.keyNextItem,keyPrevItem:config.keyPrevItem}),helpers.setupClickableNavigator(itemsNavigator),keyNavigators.push(itemsNavigator),managedNavigators.push(itemsNavigator))}_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,keyNavigator=keyNavigator&&Object.prototype.hasOwnProperty.call(keyNavigator,"default")?keyNavigator["default"]:keyNavigator,navigableDomElement=navigableDomElement&&Object.prototype.hasOwnProperty.call(navigableDomElement,"default")?navigableDomElement["default"]:navigableDomElement;const selectors={filters:".qti-navigator-filters .qti-navigator-filter",enabledItems:".qti-navigator-tree .qti-navigator-item:not(.disabled) .qti-navigator-label"};var navigatorNavigation={name:"navigator",init(){const config=this.getConfig(),$panel=this.getTestRunner().getAreaBroker().getPanelArea(),$navigator=$panel.find(".qti-navigator"),isFizzyLayout=$navigator.hasClass("qti-navigator-fizzy");if(this.managedNavigators=[],this.keyNavigators=[],$navigator.length&&!$navigator.hasClass("disabled"))if(isFizzyLayout)initFizzy(config,$panel,$navigator,this.keyNavigators,this.managedNavigators);else{const $testStatusHeader=$navigator.find(".qti-navigator-info.collapsible > .qti-navigator-label"),navigableTestStatus=navigableDomElement.createFromDoms($testStatusHeader);if($testStatusHeader.addClass("key-navigation-actionable"),navigableTestStatus.length){const testStatusNavigation=keyNavigator({keepState:config.keepState,id:"navigator-test-status",propagateTab:!1,elements:navigableTestStatus,group:$testStatusHeader});helpers.setupItemsNavigator(testStatusNavigation,{keyNextItem:config.keyNextTab||config.keyNextItem,keyPrevItem:config.keyPrevTab||config.keyPrevItem}),this.keyNavigators.push(testStatusNavigation),this.managedNavigators.push(testStatusNavigation)}let itemListingVisited=!1,filtersNavigator,itemsNavigator,currentFilter;const $filters=$navigator.find(selectors.filters),navigableFilters=navigableDomElement.createFromDoms($filters);navigableFilters.length&&(filtersNavigator=keyNavigator({keepState:config.keepState,id:"navigator-filters",propagateTab:!1,elements:navigableFilters,group:$navigator.find(".qti-navigator-filters")}),helpers.setupItemsNavigator(filtersNavigator,{keyNextItem:config.keyNextTab||config.keyNextItem,keyPrevItem:config.keyPrevTab||config.keyPrevItem}),helpers.setupClickableNavigator(filtersNavigator),config.keepState&&filtersNavigator.on("focus",cursor=>{if(config.keepState){const $element=cursor.navigable.getElement(),filter=$element.data("mode");$element.click(),currentFilter!==filter&&(itemListingVisited=!1),currentFilter=filter}}),config.keyNextContent&&filtersNavigator.on(config.keyNextContent,elem=>{helpers.allowedToNavigateFrom(elem)&&itemsNavigator&&_.defer(()=>{itemListingVisited?itemsNavigator.first():itemsNavigator.focus()})}),config.keyPrevContent&&filtersNavigator.on(config.keyPrevContent,elem=>{helpers.allowedToNavigateFrom(elem)&&itemsNavigator&&_.defer(()=>{itemsNavigator.last()})}),this.keyNavigators.push(filtersNavigator),this.managedNavigators.push(filtersNavigator));const $navigatorTree=$panel.find(".qti-navigator-tree"),$trees=$navigator.find(selectors.enabledItems),navigableTrees=navigableDomElement.createFromDoms($trees);$trees.first().addClass("key-navigation-scrollable-up"),$trees.last().addClass("key-navigation-scrollable-down"),navigableTrees.length&&(itemsNavigator=keyNavigator({id:"navigator-items",elements:navigableTrees,group:$navigatorTree,defaultPosition(navigableElements){let pos=0;return(config.flatNavigation||"flagged"!==currentFilter)&&(pos=_.findIndex(navigableElements,navigable=>{const $parent=navigable.getElement().parent(".qti-navigator-item");if($parent.hasClass("active")&&$parent.is(":visible"))return!0})),pos}}).on("focus",cursor=>{itemListingVisited=!0,cursor.navigable.getElement().parent().addClass("key-navigation-highlight")}).on("blur",cursor=>{cursor.navigable.getElement().parent().removeClass("key-navigation-highlight")}),helpers.setupItemsNavigator(itemsNavigator,{keyNextItem:config.keyNextContent||config.keyNextItem,keyPrevItem:config.keyPrevContent||config.keyPrevItem}),helpers.setupClickableNavigator(itemsNavigator),config.keepState&&itemsNavigator.on("lowerbound upperbound",()=>{filtersNavigator&&filtersNavigator.focus()}),config.keyNextTab&&config.keyPrevTab?(itemsNavigator.on(config.keyNextTab,function(elem){helpers.allowedToNavigateFrom(elem)&&filtersNavigator&&filtersNavigator.focus().next()}),itemsNavigator.on(config.keyPrevTab,function(elem){helpers.allowedToNavigateFrom(elem)&&filtersNavigator&&filtersNavigator.focus().previous()})):this.keyNavigators.push(itemsNavigator),this.managedNavigators.push(itemsNavigator))}return this},getNavigators(){return this.keyNavigators},destroy(){return this.managedNavigators.forEach(navigator=>navigator.destroy()),this.managedNavigators=[],this.keyNavigators=[],this}};return navigatorNavigation}),define("taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/pageNavigation",["jquery","ui/keyNavigation/navigator","ui/keyNavigation/navigableDomElement","taoQtiTest/runner/plugins/content/accessibility/keyNavigation/helpers"],function($,keyNavigator,navigableDomElement,helpers){"use strict";$=$&&Object.prototype.hasOwnProperty.call($,"default")?$["default"]:$,keyNavigator=keyNavigator&&Object.prototype.hasOwnProperty.call(keyNavigator,"default")?keyNavigator["default"]:keyNavigator,navigableDomElement=navigableDomElement&&Object.prototype.hasOwnProperty.call(navigableDomElement,"default")?navigableDomElement["default"]:navigableDomElement;const groupId="item-content-wrapper";var pageNavigation={name:"page",init(){const config=this.getConfig();return this.keyNavigators=[],this.getTestRunner().getAreaBroker().getContainer().find(".content-wrapper").addClass("key-navigation-scrollable").each((i,el)=>{const $element=$(el),navigator=keyNavigator({id:`${groupId}-${this.keyNavigators.length}`,elements:navigableDomElement.createFromDoms($element),group:$element,propagateTab:!1});helpers.setupItemsNavigator(navigator,config),this.keyNavigators.push(navigator)}),this},getNavigators(){return this.keyNavigators},destroy(){return this.keyNavigators.forEach(navigator=>navigator.destroy()),this.keyNavigators=[],this}};return pageNavigation}),define("taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/rubricsNavigation",["jquery","ui/keyNavigation/navigator","ui/keyNavigation/navigableDomElement","taoQtiTest/runner/plugins/content/accessibility/keyNavigation/helpers"],function($,keyNavigator,navigableDomElement,helpers){"use strict";$=$&&Object.prototype.hasOwnProperty.call($,"default")?$["default"]:$,keyNavigator=keyNavigator&&Object.prototype.hasOwnProperty.call(keyNavigator,"default")?keyNavigator["default"]:keyNavigator,navigableDomElement=navigableDomElement&&Object.prototype.hasOwnProperty.call(navigableDomElement,"default")?navigableDomElement["default"]:navigableDomElement;const groupId="rubric-element-navigation-group";var rubricsNavigation={name:"rubrics",init(){const config=this.getConfig();return this.keyNavigators=[],this.getTestRunner().getAreaBroker().getContainer().find(".qti-rubricBlock").addClass("key-navigation-scrollable").each((i,el)=>{const $element=$(el),navigator=keyNavigator({id:`${groupId}-${this.keyNavigators.length}`,elements:navigableDomElement.createFromDoms($element),group:$element,propagateTab:!1});helpers.setupItemsNavigator(navigator,config),this.keyNavigators.push(navigator)}),this},getNavigators(){return this.keyNavigators},destroy(){return this.keyNavigators.forEach(navigator=>navigator.destroy()),this.keyNavigators=[],this}};return rubricsNavigation}),define("taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/itemNavigation",["jquery","ui/scroller","ui/keyNavigation/navigator","ui/keyNavigation/navigableDomElement","taoQtiTest/runner/plugins/content/accessibility/keyNavigation/helpers"],function($,scrollHelper,keyNavigator,navigableDomElement,helpers){"use strict";$=$&&Object.prototype.hasOwnProperty.call($,"default")?$["default"]:$,scrollHelper=scrollHelper&&Object.prototype.hasOwnProperty.call(scrollHelper,"default")?scrollHelper["default"]:scrollHelper,keyNavigator=keyNavigator&&Object.prototype.hasOwnProperty.call(keyNavigator,"default")?keyNavigator["default"]:keyNavigator,navigableDomElement=navigableDomElement&&Object.prototype.hasOwnProperty.call(navigableDomElement,"default")?navigableDomElement["default"]:navigableDomElement;const addLabelledByAttribute=cursor=>{const $element=cursor.navigable.getElement(),value=$element.attr("value"),name=$element.attr("name");name&&$element.attr("aria-labelledby",`${name.replace("response-","choice-")}-${value}`)},removeLabelledByAttribute=cursor=>{const $element=cursor.navigable.getElement();$element.removeAttr("aria-labelledby","")},manageLabelledByAttribute=navigator=>{navigator&&(navigator.on("focus",addLabelledByAttribute),navigator.on("blur",removeLabelledByAttribute))};var itemNavigation={name:"item",init(){var _this=this;this.keyNavigators=[];const config=this.getConfig(),$content=this.getTestRunner().getAreaBroker().getContentArea(),getQtiChoice=function(cursor){return cursor&&cursor.navigable.getElement().closest(".qti-choice")},addNavigator=function($elements,group){let loop=!!(2scrollHelper.scrollTo(getQtiChoice(cursor).addClass("key-navigation-highlight"),$content.closest(".content-wrapper"))).on("blur",cursor=>getQtiChoice(cursor).removeClass("key-navigation-highlight"))),navigator},$qtiInteractions=$content.find(".key-navigation-focusable,.qti-interaction").filter((i,node)=>!$(node).parents(".qti-interaction").length);return $content.find(".key-navigation-focusable").addClass("key-navigation-scrollable"),$qtiInteractions.each((itemPos,itemElement)=>{const $itemElement=$(itemElement),$choiceInput=$itemElement.find(".qti-choice input"),choiceType=$choiceInput.attr("type");if($itemElement.hasClass("qti-interaction")){$itemElement.find(".key-navigation-focusable").each((navPos,nav)=>{const $nav=$(nav);$nav.closest(".qti-choice").length||addNavigator($nav,$nav)}),$itemElement.off(".keyNavigation");const $inputs=$itemElement.is(":input")?$itemElement:$itemElement.find(":input");if(config.flatNavigation&&(config.flatRadioNavigation||"radio"!==choiceType))$inputs.each((i,input)=>{const navigator=addInputsNavigator($(input),$itemElement);manageLabelledByAttribute(navigator)});else{const navigator=addInputsNavigator($inputs,$itemElement,!0,()=>{let position=-1;return $inputs.each((index,input)=>{input.checked&&(position=index)}),position});manageLabelledByAttribute(navigator),navigator&&config.wcagBehavior&&navigator.on("focus",cursor=>{const $element=cursor.navigable.getElement();$element.is(":checked")||$element.click()})}}else addNavigator($itemElement,$itemElement)}),this},getNavigators(){return this.keyNavigators},destroy(){return this.keyNavigators.forEach(navigator=>navigator.destroy()),this.keyNavigators=[],this}};return itemNavigation}),define("taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/linearItemNavigation",["jquery","ui/keyNavigation/navigator","ui/keyNavigation/navigableDomElement","taoQtiTest/runner/plugins/content/accessibility/keyNavigation/helpers"],function($,keyNavigator,navigableDomElement,helpers){"use strict";$=$&&Object.prototype.hasOwnProperty.call($,"default")?$["default"]:$,keyNavigator=keyNavigator&&Object.prototype.hasOwnProperty.call(keyNavigator,"default")?keyNavigator["default"]:keyNavigator,navigableDomElement=navigableDomElement&&Object.prototype.hasOwnProperty.call(navigableDomElement,"default")?navigableDomElement["default"]:navigableDomElement;var linearItemNavigation={name:"linearItem",init(){const config=this.getConfig(),$content=this.getTestRunner().getAreaBroker().getContentArea(),$qtiInteractions=$content.find(".key-navigation-focusable,.qti-interaction").filter((i,node)=>!$(node).parents(".qti-interaction").length),$qtiChoices=$qtiInteractions.find(".qti-choice");let $lastParent=null,list=[];const setupListNavigator=()=>{const navigator=keyNavigator({elements:list,propagateTab:!1});helpers.setupItemsNavigator(navigator,config),this.choicesNavigators.push(navigator)};return this.keyNavigators=[],this.choicesNavigators=[],$content.find(".key-navigation-focusable").addClass("key-navigation-scrollable"),$qtiChoices.each((i,el)=>{const $itemElement=$(el),$parent=$itemElement.parent(),choiceNavigator=keyNavigator({elements:navigableDomElement.createFromDoms($itemElement),group:$itemElement,propagateTab:!1});helpers.setupClickableNavigator(choiceNavigator),$lastParent&&!$parent.is($lastParent)&&(setupListNavigator(),list=[]),this.keyNavigators.push(choiceNavigator),list.push(choiceNavigator),$lastParent=$parent}),list.length&&(setupListNavigator(),list=[]),this},getNavigators(){return this.keyNavigators},destroy(){return this.keyNavigators.forEach(navigator=>navigator.destroy()),this.choicesNavigators.forEach(navigator=>navigator.destroy()),this.choicesNavigators=[],this.keyNavigators=[],this}};return linearItemNavigation}),define("taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/stimulusNavigation",["jquery","i18n","ui/keyNavigation/navigator","ui/keyNavigation/navigableDomElement","taoQtiTest/runner/plugins/content/accessibility/keyNavigation/helpers"],function($,__,keyNavigator,navigableDomElement,helpers){"use strict";$=$&&Object.prototype.hasOwnProperty.call($,"default")?$["default"]:$,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,keyNavigator=keyNavigator&&Object.prototype.hasOwnProperty.call(keyNavigator,"default")?keyNavigator["default"]:keyNavigator,navigableDomElement=navigableDomElement&&Object.prototype.hasOwnProperty.call(navigableDomElement,"default")?navigableDomElement["default"]:navigableDomElement;const groupId="stimulus-element-navigation-group";var stimulusNavigation={name:"stimulus",init(){const config=this.getConfig(),$content=this.getTestRunner().getAreaBroker().getContentArea();this.keyNavigators=[];const isEnabledDecorator=element=>{const originalIsEnabled=element.isEnabled;return element.isEnabled=function isEnabled(){if(originalIsEnabled.call(this)){const node=this.getElement().get(0);return node.scrollHeight>node.clientHeight}return!1},element};return $content.find(".stimulus-container").addClass("key-navigation-scrollable").each((i,el)=>{const $element=$(el),elements=navigableDomElement.createFromDoms($element).map(isEnabledDecorator);$element.attr("aria-label",__("Passage"));const navigator=keyNavigator({id:`${groupId}-${i}`,elements,group:$element,propagateTab:!1});helpers.setupItemsNavigator(navigator,config),this.keyNavigators.push(navigator)}),this},getNavigators(){return this.keyNavigators},destroy(){return this.keyNavigators.forEach(navigator=>navigator.destroy()),this.keyNavigators=[],this}};return stimulusNavigation}),define("taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/jumpLinks",["jquery","ui/keyNavigation/navigator","ui/keyNavigation/navigableDomElement","taoQtiTest/runner/plugins/content/accessibility/keyNavigation/helpers"],function($,keyNavigator,navigableDomElement,helpers){"use strict";$=$&&Object.prototype.hasOwnProperty.call($,"default")?$["default"]:$,keyNavigator=keyNavigator&&Object.prototype.hasOwnProperty.call(keyNavigator,"default")?keyNavigator["default"]:keyNavigator,navigableDomElement=navigableDomElement&&Object.prototype.hasOwnProperty.call(navigableDomElement,"default")?navigableDomElement["default"]:navigableDomElement;const groupId="jump-links";var jumpLinks={name:"jump-links",init(){const config=this.getConfig(),$jumpLinksBox=$(".content-wrap"),$links=$jumpLinksBox.find(".jump-link");this.keyNavigators=[];const registerTopToolbarNavigator=(id,group,$elements)=>{const elements=navigableDomElement.createFromDoms($elements);if(elements.length){const navigator=keyNavigator({id,group,elements,propagateTab:!1});helpers.setupItemsNavigator(navigator,config),helpers.setupClickableNavigator(navigator),this.keyNavigators.push(navigator)}};return $links.each((index,element)=>registerTopToolbarNavigator(`${groupId}-${index}`,$jumpLinksBox,$(element))),this},getNavigators(){return this.keyNavigators},destroy(){return this.keyNavigators.forEach(navigator=>navigator.destroy()),this.keyNavigators=[],this}};return jumpLinks}),define("taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/index",["exports","taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/headerNavigation","taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/toolbarNavigation","taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/topToolbarNavigation","taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/navigatorNavigation","taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/pageNavigation","taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/rubricsNavigation","taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/itemNavigation","taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/linearItemNavigation","taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/stimulusNavigation","taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/jumpLinks"],function(exports,headerNavigation,toolbarNavigation,topToolbarNavigation,navigatorNavigation,pageNavigation,rubricsNavigation,itemNavigation,linearItemNavigation,stimulusNavigation,jumpLinks){"use strict";headerNavigation=headerNavigation&&Object.prototype.hasOwnProperty.call(headerNavigation,"default")?headerNavigation["default"]:headerNavigation,toolbarNavigation=toolbarNavigation&&Object.prototype.hasOwnProperty.call(toolbarNavigation,"default")?toolbarNavigation["default"]:toolbarNavigation,topToolbarNavigation=topToolbarNavigation&&Object.prototype.hasOwnProperty.call(topToolbarNavigation,"default")?topToolbarNavigation["default"]:topToolbarNavigation,navigatorNavigation=navigatorNavigation&&Object.prototype.hasOwnProperty.call(navigatorNavigation,"default")?navigatorNavigation["default"]:navigatorNavigation,pageNavigation=pageNavigation&&Object.prototype.hasOwnProperty.call(pageNavigation,"default")?pageNavigation["default"]:pageNavigation,rubricsNavigation=rubricsNavigation&&Object.prototype.hasOwnProperty.call(rubricsNavigation,"default")?rubricsNavigation["default"]:rubricsNavigation,itemNavigation=itemNavigation&&Object.prototype.hasOwnProperty.call(itemNavigation,"default")?itemNavigation["default"]:itemNavigation,linearItemNavigation=linearItemNavigation&&Object.prototype.hasOwnProperty.call(linearItemNavigation,"default")?linearItemNavigation["default"]:linearItemNavigation,stimulusNavigation=stimulusNavigation&&Object.prototype.hasOwnProperty.call(stimulusNavigation,"default")?stimulusNavigation["default"]:stimulusNavigation,jumpLinks=jumpLinks&&Object.prototype.hasOwnProperty.call(jumpLinks,"default")?jumpLinks["default"]:jumpLinks,exports.headerNavigationStrategy=headerNavigation,exports.toolbarNavigationStrategy=toolbarNavigation,exports.topToolbarNavigationStrategy=topToolbarNavigation,exports.navigatorNavigationStrategy=navigatorNavigation,exports.pageNavigationStrategy=pageNavigation,exports.rubricsNavigationStrategy=rubricsNavigation,exports.itemNavigationStrategy=itemNavigation,exports.linearItemNavigationStrategy=linearItemNavigation,exports.stimulusNavigationStrategy=stimulusNavigation,exports.jumpLinksNavigationStrategy=jumpLinks,Object.defineProperty(exports,"__esModule",{value:!0})}),define("taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategiesManager",["core/providerRegistry","taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/index"],function(providerRegistry,strategies){"use strict";function strategyFactory(name,testRunner,config){const strategy=strategyFactory.getProvider(name);return{init(){return strategy.init.call(this),this},getName(){return name},getConfig(){return config},getTestRunner(){return testRunner},getNavigators(){return"function"==typeof strategy.getNavigators?strategy.getNavigators.call(this):[]},destroy(){return"function"==typeof strategy.destroy&&strategy.destroy.call(this),this}}}return providerRegistry=providerRegistry&&Object.prototype.hasOwnProperty.call(providerRegistry,"default")?providerRegistry["default"]:providerRegistry,providerRegistry(strategyFactory),Object.values(strategies).forEach(strategy=>strategyFactory.registerProvider(strategy.name,strategy)),strategyFactory}),define("taoQtiTest/runner/plugins/content/accessibility/keyNavigation/helpers",["exports","jquery","lodash","taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategiesManager"],function(exports,$,_,strategyFactory){"use strict";function allowedToNavigateFrom(from){let element=from;if(element&&"function"==typeof element.getCursor){const{navigable}=element.getCursor();element=navigable}element&&"function"==typeof element.getElement&&(element=element.getElement());const $element=$(element);return!($element.hasClass(ignoredClass)||0<$element.parents(`.${ignoredClass}`).length)}function setupItemsNavigator(navigator,config){return navigator.on(config.keyNextItem,function navigateToNextItem(elem){allowedToNavigateFrom(elem)&&this.next()}).on(config.keyPrevItem,function navigateToPrevItem(elem){allowedToNavigateFrom(elem)&&this.previous()})}function setupClickableNavigator(navigator){return navigator.on("activate",function activateItem(cursor){const $elt=cursor.navigable.getElement();$elt.is(":checkbox")?$elt.each(function(){this.click()}):$elt.click().mousedown()})}function getStrategies(navigationMode,testRunner){return navigationMode.strategies.map(area=>strategyFactory(area,testRunner,navigationMode.config).init())}function getNavigators(strategies){return _.flatten(strategies.map(strategy=>strategy.getNavigators()))}$=$&&Object.prototype.hasOwnProperty.call($,"default")?$["default"]:$,_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,strategyFactory=strategyFactory&&Object.prototype.hasOwnProperty.call(strategyFactory,"default")?strategyFactory["default"]:strategyFactory;const ignoredClass="no-key-navigation";exports.allowedToNavigateFrom=allowedToNavigateFrom,exports.getNavigators=getNavigators,exports.getStrategies=getStrategies,exports.setupClickableNavigator=setupClickableNavigator,exports.setupItemsNavigator=setupItemsNavigator,Object.defineProperty(exports,"__esModule",{value:!0})}),define("taoQtiTest/runner/plugins/content/accessibility/keyNavigation/modes/defaultMode",[],function(){"use strict";var defaultMode={name:"default",init(){let config=0modeFactory.registerProvider(mode.name,mode)),modeFactory}),define("taoQtiTest/runner/plugins/content/accessibility/keyNavigation/keyNavigation",["ui/keyNavigation/navigator","taoQtiTest/runner/plugins/content/accessibility/keyNavigation/helpers","taoQtiTest/runner/plugins/content/accessibility/keyNavigation/modesManager","util/shortcut"],function(keyNavigator,helpers,modeFactory,shortcut){"use strict";function keyNavigationFactory(testRunner){let config=1strategy.destroy()),groupNavigator&&groupNavigator.destroy(),groupNavigator=null,strategies=[],this}}}keyNavigator=keyNavigator&&Object.prototype.hasOwnProperty.call(keyNavigator,"default")?keyNavigator["default"]:keyNavigator,modeFactory=modeFactory&&Object.prototype.hasOwnProperty.call(modeFactory,"default")?modeFactory["default"]:modeFactory,shortcut=shortcut&&Object.prototype.hasOwnProperty.call(shortcut,"default")?shortcut["default"]:shortcut;const eventNS=".keyNavigation";return keyNavigationFactory}),define("css!taoQtiTest/runner/plugins/content/accessibility/css/key-navigation",[],function(){}),define("taoQtiTest/runner/plugins/content/accessibility/keyNavigation/plugin",["lodash","taoQtiTest/runner/plugins/content/accessibility/keyNavigation/keyNavigation","taoTests/runner/plugin","css!taoQtiTest/runner/plugins/content/accessibility/css/key-navigation.css"],function(_,keyNavigatorFactory,pluginFactory,keyNavigation_css){"use strict";_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,keyNavigatorFactory=keyNavigatorFactory&&Object.prototype.hasOwnProperty.call(keyNavigatorFactory,"default")?keyNavigatorFactory["default"]:keyNavigatorFactory,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory;const defaultPluginConfig={contentNavigatorType:"default"};var plugin=pluginFactory({name:"keyNavigation",init(){const testRunner=this.getTestRunner(),pluginConfig=_.defaults(this.getConfig(),defaultPluginConfig),keyNavigator=keyNavigatorFactory(testRunner,pluginConfig);testRunner.after("renderitem",()=>{keyNavigator.isActive()&&keyNavigator.destroy(),keyNavigator.init()}).on("unloaditem",()=>{keyNavigator.destroy()}).on("setcontenttabtype",type=>{keyNavigator.setMode(type),pluginConfig.contentNavigatorType=type})}});return plugin}),define("taoQtiTest/runner/plugins/content/accessibility/mainLandmark/header",["jquery","i18n","taoTests/runner/plugin","handlebars","lib/handlebars/helpers"],function($$1,__,pluginFactory,Handlebars,Helpers0){"use strict";function headerTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}function getState(item){let state=__("Unseen");return item.flagged?state=__("Flagged"):item.answered?state=__("Answered"):item.viewed&&(state=__("Viewed")),state}$$1=$$1&&Object.prototype.hasOwnProperty.call($$1,"default")?$$1["default"]:$$1,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){return this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),"\n\n"}),header=pluginFactory({name:"mainLandmark",init(){const testRunner=this.getTestRunner(),updateTitle=item=>{this.$title.text(`${item.label}`).show()},updateState=item=>{this.$state.text(`${getState(item)}`).show()};testRunner.after("renderitem",()=>{const item=testRunner.getCurrentItem();updateTitle(item),updateState(item)}).on("tool-flagitem",()=>{let item=testRunner.getCurrentItem();item=Object.assign({},item,{flagged:!item.flagged}),updateState(item)})},render(){const $container=this.getAreaBroker().getArea("mainLandmark");this.$element=$$1(headerTpl()),$container.append(this.$element),this.$title=$container.find(`[data-control="qti-test-item-title"]`),this.$state=$container.find(`[data-control="qti-test-item-state"]`)}});return header}),define("taoQtiTest/runner/plugins/content/dialog/dialog",["jquery","lodash","taoTests/runner/plugin","ui/dialog/alert","ui/dialog/confirm","util/shortcut/registry","util/shortcut","util/namespace"],function($,_,pluginFactory,dialogAlert,dialogConfirm,shortcutRegistry,globalShortcut,namespaceHelper){"use strict";$=$&&Object.prototype.hasOwnProperty.call($,"default")?$["default"]:$,_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,dialogAlert=dialogAlert&&Object.prototype.hasOwnProperty.call(dialogAlert,"default")?dialogAlert["default"]:dialogAlert,dialogConfirm=dialogConfirm&&Object.prototype.hasOwnProperty.call(dialogConfirm,"default")?dialogConfirm["default"]:dialogConfirm,shortcutRegistry=shortcutRegistry&&Object.prototype.hasOwnProperty.call(shortcutRegistry,"default")?shortcutRegistry["default"]:shortcutRegistry,globalShortcut=globalShortcut&&Object.prototype.hasOwnProperty.call(globalShortcut,"default")?globalShortcut["default"]:globalShortcut,namespaceHelper=namespaceHelper&&Object.prototype.hasOwnProperty.call(namespaceHelper,"default")?namespaceHelper["default"]:namespaceHelper;var pluginName="dialog",actionPrefix=`tool-${"dialog"}-`,defaultOptions={alert:{focus:"ok"},confirm:{focus:"ok"}},dialog=pluginFactory({name:"dialog",init:function init(){function closeAccept(dialog){dialog.trigger("okbtn.modal").hide()}function closeReject(dialog){dialog.hide()}function closeLast(accept,shortcut){var handle=opened.length&&opened[opened.length-1];handle&&(handle.shortcut=shortcut,accept?closeAccept(handle.dialog):closeReject(handle.dialog))}function addHandle(namespace,stack,dialog,message,accept,reject,options){function doAccept(e,reason){_.isFunction(accept)&&accept(handle.shortcut||reason)}function doReject(e,reason){_.isFunction(reject)&&reject(handle.shortcut||reason)}var handle={context:namespace,dialog:dialog(message,doAccept,doReject,options)};globalShortcut.disable(),dialogShortcut.enable(),stack.push(handle),opened.push(handle),handle.dialog.focus(options.focus),handle.dialog.on("closed.modal",function(){removeHandle(stack,handle.dialog),removeHandle(opened,handle.dialog),opened.length||(globalShortcut.enable(),dialogShortcut.disable())})}function removeHandle(stack,dialog){dialog&&_.remove(stack,function(handle){if(handle&&dialog===handle.dialog)return!0})}function closeDialogs(namespace,accept,stack){stack?_.forEach(stack,function(handle){handle&&("@"===namespace||namespace===handle.context)&&(accept?closeAccept(handle.dialog):closeReject(handle.dialog))}):(closeDialogs(namespace,accept,alerts),closeDialogs(namespace,accept,confirms))}var testRunner=this.getTestRunner(),testOptions=testRunner.getOptions(),pluginConfig=Object.assign({},defaultOptions,this.getConfig()),pluginShortcuts=(testOptions.shortcuts||{}).dialog||{},alerts=[],confirms=[],opened=[],dialogShortcut=shortcutRegistry($("body"),{propagate:!1,prevent:!0});dialogShortcut.disable().set("Tab Shift+Tab"),testOptions.allowShortcuts&&_.forEach(pluginShortcuts,function(command,key){dialogShortcut.add(namespaceHelper.namespaceAll(command,"dialog",!0),function(e,shortcut){testRunner.trigger(actionPrefix+key,shortcut)})}),testRunner.before("alert.*",function(e,msg,accept,options){addHandle(e.namespace,alerts,dialogAlert,msg,accept,accept,_.merge({},pluginConfig.alert,options))}).before("confirm.*",function(e,msg,accept,reject,options){addHandle(e.namespace,confirms,dialogConfirm,msg,accept,reject,_.merge({},pluginConfig.confirm,options))}).before("closedialog.*",function(e,accept){closeDialogs(e.namespace,accept)}).on(`${actionPrefix}accept`,function(shortcut){closeLast(!0,shortcut)}).on(`${actionPrefix}reject`,function(shortcut){closeLast(!1,shortcut)}).on("destroy",function(){closeDialogs(".@"),dialogShortcut.clear(),dialogShortcut=null})}});return dialog}),define("taoQtiTest/runner/plugins/content/dialog/exitMessages",["lodash","taoTests/runner/plugin"],function(_,pluginFactory){"use strict";_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory;var exitMessages=pluginFactory({name:"exitMessages",init:function init(){},install:function install(){var testRunner=this.getTestRunner();testRunner.before("leave",function leave(e,data){const dataIsObject=_.isObject(data);return dataIsObject&&data.skipExitMessage?void 0:dataIsObject&&data.message?new Promise(function(resolve){var context=testRunner.getTestContext();context&&context.itemIdentifier&&testRunner.disableItem(context.itemIdentifier),testRunner.trigger("disablefeedbackalerts").trigger("alert.leave",data.message,function(){testRunner.trigger("enablefeedbackalerts"),resolve()})}):void 0})}});return exitMessages}),define("taoQtiTest/runner/plugins/content/dialog/itemAlertMessage",["jquery","ui/hider","taoTests/runner/plugin"],function($,hider,pluginFactory){"use strict";$=$&&Object.prototype.hasOwnProperty.call($,"default")?$["default"]:$,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory;var itemAlertMessage=pluginFactory({name:"itemAlertMessage",init:function init(){var self=this;this.$element=$(this.getContent().dom),this.$element.on("closed.modal",function(){$(this).modal("destroy")}).on("destroyed.modal",function(){self.$element=null,self.trigger("resume",self)})},render:function render(){var testRunner=this.getTestRunner(),itemRunner=testRunner.itemRunner,$modalsContainer=this.getContent().$container;$modalsContainer||($modalsContainer=$("#modalFeedbacks",itemRunner._item.container)),$modalsContainer.append(this.$element),this.$element.modal({startClosed:!1,top:200})},destroy:function destroy(){this.$element&&this.$element.length&&this.$element.modal("close")}});return itemAlertMessage}),define("taoQtiTest/runner/helpers/navigation",["lodash","taoQtiTest/runner/helpers/map"],function(_,mapHelper){"use strict";_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper;var navigationHelper={isLeavingSection:function isLeavingSection(testContext,testMap,direction,scope,position){var section,sectionStats,nbItems,item;if(_.isPlainObject(testContext)&&_.isPlainObject(testMap)&&!_.isEmpty(testContext.sectionId)&&!_.isEmpty(testContext.itemIdentifier))return section=mapHelper.getSection(testMap,testContext.sectionId),sectionStats=mapHelper.getSectionStats(testMap,testContext.sectionId),nbItems=sectionStats&§ionStats.total,item=mapHelper.getItem(testMap,testContext.itemIdentifier),"section"===scope||"testPart"===scope||"next"===direction&&item.positionInSection+1===nbItems||"previous"===direction&&0===item.positionInSection||"jump"===direction&&0=section.position+nbItems);throw new TypeError("Invalid test context and test map")},isLeavingTestPart:function isLeavingTestPart(testContext,testMap,direction,scope,position){var testPart,testPartStats,nbItems,item,section,sectionStats;if(_.isPlainObject(testContext)&&_.isPlainObject(testMap)&&!_.isEmpty(testContext.testPartId)&&!_.isEmpty(testContext.sectionId)&&!_.isEmpty(testContext.itemIdentifier))return testPart=mapHelper.getPart(testMap,testContext.testPartId),testPartStats=mapHelper.getPartStats(testMap,testContext.testPartId),nbItems=testPartStats&&testPartStats.total,item=mapHelper.getItem(testMap,testContext.itemIdentifier),"section"===scope&&(section=mapHelper.getSection(testMap,testContext.sectionId),sectionStats=mapHelper.getSectionStats(testMap,testContext.sectionId)),"testPart"===scope||"next"===direction&&"item"===scope&&item.positionInPart+1===nbItems||"next"===direction&&"section"===scope&§ion.position+sectionStats.total>=nbItems||"previous"===direction&&"item"===scope&&0===item.positionInPart||"previous"===direction&&"section"===scope&§ion.position===testPart.position||"jump"===direction&&0=testPart.position+nbItems);throw new TypeError("Invalid test context and test map")},isLast:function isLast(testMap,itemIdentifier){return this.isLastOf(testMap,itemIdentifier,"test")},isFirst:function isFirst(testMap,itemIdentifier){return this.isFirstOf(testMap,itemIdentifier,"test")},isLastOf:function isLastOf(testMap,itemIdentifier,scope){var item,stats;if(!_.isPlainObject(testMap))throw new TypeError("Invalid test map");if(_.isEmpty(itemIdentifier))throw new TypeError("Invalid item identifier");if(scope=scope||"test",item=mapHelper.getItem(testMap,itemIdentifier),stats=mapHelper.getScopeStats(testMap,item.position,scope),stats&&_.isNumber(stats.total)){if("test"===scope)return item.position+1===stats.total;if("section"===scope||"assessmentSection"===scope||"testSection"===scope)return item.positionInSection+1===stats.total;if("part"===scope||"testPart"===scope)return item.positionInPart+1===stats.total}return!1},isFirstOf:function isFirstOf(testMap,itemIdentifier,scope){var item;if(!_.isPlainObject(testMap))throw new TypeError("Invalid test map");if(_.isEmpty(itemIdentifier))throw new TypeError("Invalid item identifier");return scope=scope||"test",item=mapHelper.getItem(testMap,itemIdentifier),"test"===scope?0===item.position:"section"===scope||"assessmentSection"===scope||"testSection"===scope?0===item.positionInSection:("part"===scope||"testPart"===scope)&&0===item.positionInPart},getSiblingItems:function getSiblingItems(testMap,itemPosition,direction,size){var itemId=mapHelper.getItemIdentifier(testMap,itemPosition),previous=null,siblings=[],itemChain=_.reduce(testMap&&testMap.jumps,function(map,jump){var ref=jump.identifier;return previous&&(map[previous].next=ref),map[ref]={identifier:ref,previous:previous,next:null},previous=ref,map},{}),directions;return size=_.isFinite(size)?parseInt(size,10):3,directions=direction&&"both"!==direction?[direction]:["previous","next"],_.forEach(directions,function walkDirection(link){var id=itemId;_.times(size,function getNeighbor(){return id=itemChain[id]&&itemChain[id][link],!!id&&void siblings.push(mapHelper.getItem(testMap,id))})}),siblings},getNextItem:function getNextItem(testMap,itemPosition){var siblings=navigationHelper.getSiblingItems(testMap,itemPosition,"next",1);return siblings.length?siblings[0]:null},getPreviousItem:function getPreviousItem(testMap,itemPosition){var siblings=navigationHelper.getSiblingItems(testMap,itemPosition,"previous",1);return siblings.length?siblings[0]:null},isMovingToNextItem:function isMovingToNextItem(action,params){return params=params||{},"timeout"===action||"skip"===action||"move"===action&&"next"===params.direction&&"item"===params.scope},isMovingToPreviousItem:function isMovingToPreviousItem(action,params){return params=params||{},"move"===action&&"previous"===params.direction&&"item"===params.scope},isJumpingToItem:function isJumpingToItem(action,params){return params=params||{},"move"===action&&"jump"===params.direction&&"item"===params.scope}};return navigationHelper}),define("taoQtiTest/runner/plugins/content/dialog/itemInlineMessage",["jquery","i18n","ui/hider","taoTests/runner/plugin","handlebars","lib/handlebars/helpers","taoQtiTest/runner/helpers/navigation"],function($$1,__,hider,pluginFactory,Handlebars,Helpers0,navigationHelper){"use strict";function buttonTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}$$1=$$1&&Object.prototype.hasOwnProperty.call($$1,"default")?$$1["default"]:$$1,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,navigationHelper=navigationHelper&&Object.prototype.hasOwnProperty.call(navigationHelper,"default")?navigationHelper["default"]:navigationHelper,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var buffer="",stack1,helper;return buffer+=" ",(helper=helpers.className)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.className,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1),buffer}function program3(depth0,data){var buffer="",stack1;return buffer+="\n aria-"+escapeExpression((stack1=null==data||!1===data?data:data.key,"function"===typeof stack1?stack1.apply(depth0):stack1))+"=\""+escapeExpression("function"===typeof depth0?depth0.apply(depth0):depth0)+"\"\n ",buffer}function program5(depth0,data){var buffer="",stack1,helper;return buffer+="",buffer}function program6(depth0,data){return" no-label"}function program8(depth0,data){var buffer="",stack1,helper;return buffer+="",(helper=helpers.text)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.text,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",functionType="function",escapeExpression=this.escapeExpression,self=this,stack1,helper;return buffer+="\n \n ",stack1=helpers["if"].call(depth0,depth0&&depth0.icon,{hash:{},inverse:self.noop,fn:self.program(5,program5,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.text,{hash:{},inverse:self.noop,fn:self.program(8,program8,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n \n\n",buffer}),buttonData={next:{control:"move-forward",title:__("Submit and go to the next item"),icon:"forward",text:__("OK")},end:{control:"move-end",title:__("Submit and go to the end of the test"),icon:"fast-forward",text:__("OK & End test")}},itemInlineMessage=pluginFactory({name:"itemInlineMessage",init:function init(){var self=this,testRunner=this.getTestRunner(),createOkButton=function createElement(){const testContext=testRunner.getTestContext(),testMap=testRunner.getTestMap(),dataType=navigationHelper.isLast(testMap,testContext.itemIdentifier)?"end":"next",$btn=$$1(buttonTpl(buttonData[dataType]));return $btn.addClass("modalFeedback-button"),$btn.on("click",function(e){e.preventDefault(),self.disable(),"move-end"===$$1(this).data("control")&&self.trigger("end"),$btn.remove(),self.$element.remove(),self.trigger("resume",self)}),$btn};this.$button=createOkButton(),this.$element=$$1(this.getContent().dom)},render:function render(){var $navigationContainer=this.getAreaBroker().getNavigationArea(),testRunner=this.getTestRunner(),itemRunner=testRunner.itemRunner,$inlineContainer=this.getContent().$container;!$inlineContainer&&itemRunner._item.container&&($inlineContainer=$$1(".qti-itemBody",itemRunner._item.container)),$inlineContainer.append(this.$element),$$1(".modalFeedback-button",$navigationContainer).length||$navigationContainer.append(this.$button)},enable:function enable(){this.$button.removeProp("disabled").removeClass("disabled")},disable:function disable(){this.$button.prop("disabled",!0).addClass("disabled")},destroy:function destroy(){this.$button.click()}});return itemInlineMessage}),define("taoQtiTest/runner/plugins/content/feedback/feedback",["i18n","taoTests/runner/plugin","ui/feedback"],function(__,pluginFactory,feedback$1){"use strict";__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,feedback$1=feedback$1&&Object.prototype.hasOwnProperty.call(feedback$1,"default")?feedback$1["default"]:feedback$1;var feedback=pluginFactory({name:"feedback",init:function init(){var self=this,testRunner=this.getTestRunner(),closeCurrent=function closeCurrent(){currentFeedback&¤tFeedback.close()},currentFeedback;this.setState("enabled",!0),testRunner.on("error",function(err){var message=err,type="error";self.getState("enabled")&&("object"==typeof err&&(message=err.message,type=err.type),message||(message="TestState"===type?__("The test has been closed/suspended!"):"FileNotFound"===type?__("File not found!"):__("An error occurred!")),currentFeedback=feedback$1().error(message))}).on("danger",function(message){self.getState("enabled")&&(currentFeedback=feedback$1().danger(message))}).on("warning",function(message){self.getState("enabled")&&(currentFeedback=feedback$1().warning(message))}).on("info",function(message){self.getState("enabled")&&(currentFeedback=feedback$1().info(message))}).on("alert.* confirm.* unloaditem",closeCurrent).on("disablefeedbackalerts",function(){closeCurrent(),self.setState("enabled",!1)}).on("enablefeedbackalerts",function(){self.setState("enabled",!0)})}});return feedback}),define("taoQtiTest/runner/plugins/content/itemScrolling/itemScrolling",["jquery","util/typeCaster","taoTests/runner/plugin"],function($,typeCaster,pluginFactory){"use strict";$=$&&Object.prototype.hasOwnProperty.call($,"default")?$["default"]:$,typeCaster=typeCaster&&Object.prototype.hasOwnProperty.call(typeCaster,"default")?typeCaster["default"]:typeCaster,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory;var itemScrolling=pluginFactory({name:"itemScrolling",init:function init(){function adaptItemHeight(){const $itemContainer=$contentArea.find("[data-scrolling=\"true\"]"),contentHeight=getItemRunnerHeight()-getExtraGridRowHeight()-getSpaceAboveQtiContent()-gridRowBottomMargin-qtiItemPadding;$itemContainer.each(function(){const $item=$(this),isScrollable=typeCaster.strToBool($item.attr("data-scrolling")||"false"),selectedHeight=parseFloat($item.attr("data-scrolling-height"))||100,containerParent=$item.parent().closest("[data-scrolling=\"true\"]");$item.length&&isScrollable&&($item.data("scrollable",!0),$item.css({"overflow-y":"scroll"}),0 .grid-row"),extraHeight=0;return $gridRows.each(function(){var $gridRow=$(this),$itemContainer=$gridRow.find("[data-scrolling=\"true\"]");$itemContainer.length||(extraHeight+=$gridRow.outerHeight(!0))}),extraHeight}function getSpaceAboveQtiContent(){var $testRunnerSections=$(".test-runner-sections"),$qtiContent=$("#qti-content");return $testRunnerSections.length&&$qtiContent.length?$qtiContent.get(0).getBoundingClientRect().top-$testRunnerSections.get(0).getBoundingClientRect().top:0}const testRunner=this.getTestRunner(),$contentArea=testRunner.getAreaBroker().getContentArea(),gridRowBottomMargin=12,qtiItemPadding=60;testRunner.on("renderitem",function(){adaptItemHeight(),$(window).off("resize.adaptItemHeight"),$(window).on("resize.adaptItemHeight",adaptItemHeight)})}});return itemScrolling}),define("taoQtiTest/runner/plugins/content/loading/loading",["layout/loading-bar","taoTests/runner/plugin"],function(loadingBar,pluginFactory){"use strict";loadingBar=loadingBar&&Object.prototype.hasOwnProperty.call(loadingBar,"default")?loadingBar["default"]:loadingBar,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory;var loading=pluginFactory({name:"loading",init:function init(){var testRunner=this.getTestRunner();testRunner.on("unloaditem",function(){loadingBar.start()}).on("renderitem",function(){loadingBar.stop()})}});return loading}),define("taoQtiTest/runner/plugins/content/modalFeedback/modalFeedback",["jquery","lodash","module","taoTests/runner/plugin","taoQtiTest/runner/plugins/content/dialog/itemInlineMessage","taoQtiTest/runner/plugins/content/dialog/itemAlertMessage","ui/autoscroll"],function($,_,module,pluginFactory,inlineMessage,alertMessage,autoscroll){"use strict";function destroyFeedback(feedback){var removed=!1;_.remove(renderedFeedbacks,function(storedFeedback){var found=storedFeedback===feedback;return found&&(removed=!0),found}),removed&&(feedback.destroy(),!renderedFeedbacks.length&&nextStep())}function defineMode(inline){inlineMode=inline,messagePlugin=inlineMode?inlineMessage:alertMessage}$=$&&Object.prototype.hasOwnProperty.call($,"default")?$["default"]:$,_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,module=module&&Object.prototype.hasOwnProperty.call(module,"default")?module["default"]:module,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,inlineMessage=inlineMessage&&Object.prototype.hasOwnProperty.call(inlineMessage,"default")?inlineMessage["default"]:inlineMessage,alertMessage=alertMessage&&Object.prototype.hasOwnProperty.call(alertMessage,"default")?alertMessage["default"]:alertMessage,autoscroll=autoscroll&&Object.prototype.hasOwnProperty.call(autoscroll,"default")?autoscroll["default"]:autoscroll;var modalFeedback=pluginFactory({name:"QtiModalFeedback",init:function init(){nextStep=function(){},defineMode(!!module.config().inlineModalFeedback)},render:function render(){var self=this,testRunner=this.getTestRunner(),createMessages=function createMessages(renderingQueue,inline){var bInlineMode=inlineMode;isDestroyed=!1,renderedFeedbacks=[],_.isBoolean(inline)&&defineMode(inline),renderingQueue.length?(_.forEach(renderingQueue,function(renderingToken){var feedback=messagePlugin(testRunner,testRunner.getAreaBroker());feedback.init({dom:renderingToken.feedback.render({inline:inlineMode}),$container:inlineMode?renderingToken.$container:null}),feedback.render(),renderedFeedbacks.push(feedback)}),inlineMode&&renderedFeedbacks&&autoscroll($(".qti-modalFeedback",testRunner.getAreaBroker().getContentArea()).first(),testRunner.getAreaBroker().getContentArea().parents(".content-wrapper"))):nextStep(),defineMode(bInlineMode)};inlineMode?testRunner.off("plugin-resume.itemInlineMessage").on("plugin-resume.itemInlineMessage",function(){self.destroy()}):testRunner.off("plugin-resume.itemAlertMessage").on("plugin-resume.itemAlertMessage",function(feedback){destroyFeedback(feedback)}),testRunner.on("modalFeedbacks",function(renderingQueue,done,inline){nextStep=done,createMessages(renderingQueue,inline)})},destroy:function destroy(){var tFeedbacks,i;if(!isDestroyed)if(isDestroyed=!0,!renderedFeedbacks)nextStep();else for(i in tFeedbacks=renderedFeedbacks.slice(0),tFeedbacks)destroyFeedback(tFeedbacks[i])}}),inlineMode,messagePlugin,renderedFeedbacks,isDestroyed,nextStep;return modalFeedback}),define("taoQtiTest/runner/plugins/content/overlay/overlay",["jquery","taoTests/runner/plugin"],function($,pluginFactory){"use strict";$=$&&Object.prototype.hasOwnProperty.call($,"default")?$["default"]:$,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory;var overlay=pluginFactory({name:"overlay",init:function init(){var self=this,testRunner=this.getTestRunner();this.$element=$("
          "),this.$element.on("click mousedown mouseup touchstart touchend keyup keydow keypress scroll drop",function(e){e.stopImmediatePropagation(),e.stopPropagation()});const shield=function shield(){self.enable()},unshield=function unshield(){self.disable()};testRunner.on("disableitem",shield).on("enableitem unloaditem modalFeedbacks",unshield)},render:function render(){var $contentArea=this.getTestRunner().getAreaBroker().getContentArea();$contentArea.after(this.$element)},destroy:function destroy(){this.$element.remove()},enable(){const overlayConfig=this.getConfig();this.$element.addClass("overlay"),overlayConfig.full&&this.$element.addClass("overlay-full")},disable:function disable(){this.$element.removeClass("overlay overlay-full")},show:function show(){this.enable()},hide:function hide(){this.disable()}});return overlay}),define("taoQtiTest/runner/plugins/content/responsiveness/collapser",["lodash","jquery","taoTests/runner/plugin"],function(_,$,pluginFactory){"use strict";_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,$=$&&Object.prototype.hasOwnProperty.call($,"default")?$["default"]:$,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory;var ns=".collapser",noLabelCls="tool-label-collapsed",noLabelHoverCls="tool-label-collapsed-hover",labelHiddenCls="no-tool-label",separatorCls="separator",defaults={collapseTools:!0,collapseNavigation:!1,collapseInOrder:!1,hover:!1,collapseOrder:[]},$window=$(window),collapser=pluginFactory({name:"collapser",init:function init(){function buildCollapsiblesList(){allCollapsibles=config.collapseInOrder&&config.collapseOrder.length?getCollapsiblesFromConfig():config.collapseInOrder?getSortedCollapsiblesFromDom():getUnsortedCollapsiblesFromDom()}function getExtraWidth($element){var expandedWidth,collapsedWidth;return $element.removeClass(collapseCls),expandedWidth=$element.outerWidth(!0),$element.addClass(collapseCls),collapsedWidth=$element.outerWidth(!0),$element.removeClass(collapseCls),expandedWidth-collapsedWidth}function toggleCollapsibles(){availableWidth=getAvailableWidth(),availableWidthgetAvailableWidth()}function expandInOrder(){_.forEachRight(allCollapsibles,function(toExpand){if(toExpand.$elements.hasClass(collapseCls))if(expandPossible(toExpand.extraWidth))toExpand.$elements.removeClass(collapseCls);else return!1})}function expandPossible(extraWidth){return getToolbarWidth()+extraWidthul>[data-control]";return config.collapseTools&&($controls=$controls.add($toolbox.find(">ul>[data-control]").not(`.${labelHiddenCls}`).not(`.${separatorCls}`))),config.collapseNavigation&&($controls=$controls.add($navigation.find(">ul>[data-control]").not(`.${labelHiddenCls}`).not(`.${separatorCls}`))),$controls}function getCollapsiblesFromConfig(){return _.compact(config.collapseOrder.map(function(selector){var $elements=$(selector).not(`.${labelHiddenCls}`).not(`.${separatorCls}`),extraWidth=0;return!!$elements.length&&($elements.each(function(){extraWidth+=getExtraWidth($(this))}),{$elements:$elements,extraWidth:extraWidth})}))}function getSortedCollapsiblesFromDom(){var $controlElements=getControlsFromDom(),_allCollapsibles=[],order={};return $controlElements.each(function(){var ctrl=this.dataset.control,key=ctrl.substring(0,ctrl.search(/[A-Z-_]/))||ctrl;order[key]=order[key]||$(),order[key]=order[key].add($(this))}),_.forOwn(order,function($elements){var extraWidth=0;$elements.each(function(){extraWidth+=getExtraWidth($(this))}),_allCollapsibles.push({$elements:$elements,extraWidth:extraWidth})}),_.compact(_allCollapsibles)}function getUnsortedCollapsiblesFromDom(){var $elements=getControlsFromDom(),_allCollapsibles=[],extraWidth=0;return $elements.each(function(){extraWidth+=getExtraWidth($(this))}),_allCollapsibles.push({$elements:$elements,extraWidth:extraWidth}),_.compact(_allCollapsibles)}const testRunner=this.getTestRunner(),config=Object.assign({},defaults,this.getConfig()),collapseCls=config.hover?noLabelHoverCls:noLabelCls;var areaBroker=testRunner.getAreaBroker(),$actionsBar=areaBroker.getArea("actionsBar"),$toolbox=areaBroker.getToolboxArea(),$navigation=areaBroker.getNavigationArea(),allCollapsibles,availableWidth,previousAvailableWidth;$window.on(`resize${".collapser"}`,_.throttle(function(){testRunner.trigger("collapseTools")},40)),testRunner.after("renderitem loaditem",function(){previousAvailableWidth=1/0,buildCollapsiblesList(),testRunner.trigger("collapseTools")}).on(`collapseTools${".collapser"}`,function(){toggleCollapsibles()})},destroy:function destroy(){$window.off(".collapser")}});return collapser}),define("taoQtiTest/runner/plugins/content/rubricBlock/rubricBlock",["jquery","ui/hider","taoTests/runner/plugin","handlebars","lib/handlebars/helpers"],function($$1,hider,pluginFactory,Handlebars,Helpers0){"use strict";function containerTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}$$1=$$1&&Object.prototype.hasOwnProperty.call($$1,"default")?$$1["default"]:$$1,hider=hider&&Object.prototype.hasOwnProperty.call(hider,"default")?hider["default"]:hider,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){return this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),"
          \n"}),blankifyLinks=function blankifyLinks($container){$$1("a",$container).attr("target","_blank")},mathify=function mathify($container){return new Promise(function(resolve){0<$$1("math",$container).length?require(["mathJax"],function(MathJax){MathJax?(MathJax.Hub.Queue(["Typeset",MathJax.Hub],$container[0]),MathJax.Hub.Queue(resolve)):resolve()},resolve):resolve()})},rubricBlock=pluginFactory({name:"rubricBlock",init:function init(){var self=this,testRunner=this.getTestRunner();this.$element=$$1(containerTpl()),this.hide(),testRunner.on("ready",function(){self.hide()}).on("loaditem",function(){var context=testRunner.getTestContext();context.rubrics&&(self.$element.html(context.rubrics),blankifyLinks(self.$element),mathify(self.$element).then(function(){testRunner.trigger("rubricblock")}))}).on("renderitem",function(){self.show()}).on("unloaditem",function(){self.hide(),self.$element.empty()})},render:function render(){var $container=this.getAreaBroker().getContentArea();$container.before(this.$element)},destroy:function destroy(){this.$element.remove()},enable:function enable(){this.$element.removeProp("disabled").removeClass("disabled")},disable:function disable(){this.$element.prop("disabled",!0).addClass("disabled")},show:function show(){hider.show(this.$element)},hide:function hide(){hider.hide(this.$element)}});return rubricBlock}),define("taoQtiTest/runner/plugins/controls/connectivity/connectivity",["jquery","lodash","i18n","core/polling","ui/waitingDialog/waitingDialog","taoTests/runner/plugin","handlebars","lib/handlebars/helpers","util/namespace"],function($$1,_,__,pollingFactory,waitingDialog,pluginFactory,Handlebars,Helpers0,namespaceHelper){"use strict";function connectivityTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}$$1=$$1&&Object.prototype.hasOwnProperty.call($$1,"default")?$$1["default"]:$$1,_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,pollingFactory=pollingFactory&&Object.prototype.hasOwnProperty.call(pollingFactory,"default")?pollingFactory["default"]:pollingFactory,waitingDialog=waitingDialog&&Object.prototype.hasOwnProperty.call(waitingDialog,"default")?waitingDialog["default"]:waitingDialog,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,namespaceHelper=namespaceHelper&&Object.prototype.hasOwnProperty.call(namespaceHelper,"default")?namespaceHelper["default"]:namespaceHelper,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){return" with-message"}function program3(depth0,data){var buffer="",helper,options;return buffer+=""+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Online",options):helperMissing.call(depth0,"__","Online",options)))+"",buffer}function program5(depth0,data){var buffer="",helper,options;return buffer+=""+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Offline",options):helperMissing.call(depth0,"__","Offline",options)))+"",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",helperMissing=helpers.helperMissing,escapeExpression=this.escapeExpression,functionType="function",self=this,stack1,helper,options;return buffer+="
          \n ",stack1=helpers["if"].call(depth0,depth0&&depth0.message,{hash:{},inverse:self.noop,fn:self.program(3,program3,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.message,{hash:{},inverse:self.noop,fn:self.program(5,program5,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n
          \n",buffer}),defaultConfig={checkInterval:30000,indicator:!0,message:!1},connectivity=pluginFactory({name:"connectivity",init:function init(){var self=this,testRunner=this.getTestRunner(),proxy=testRunner.getProxy(),config=Object.assign({},defaultConfig,this.getConfig());config&&config.indicator&&(this.$element=$$1(connectivityTpl({state:proxy.isOnline()?"connected":"disconnected",message:config.message})),testRunner.on("disconnect",function(){self.$element.removeClass("connected").addClass("disconnected")}).on("reconnect",function(){self.$element.removeClass("disconnected").addClass("connected")})),this.polling&&_.isNumber(config.checkInterval)&&this.polling.setInterval(config.checkInterval)},install:function install(){var self=this,waiting=!1,testRunner=this.getTestRunner(),proxy=testRunner.getProxy();this.displayWaitingDialog=function displayWaitingDialog(){let message=0{testRunner.loadItem(itemRef)}),!1):void 0)}),testRunner.before(namespaceHelper.namespaceAll("move skip timeout","connectivity"),function(e){for(var _len=arguments.length,args=Array(1<_len?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];var testContext=testRunner.getTestContext(),currentItem=testRunner.getCurrentItem();if(proxy.isOffline()&&(currentItem.hasFeedbacks||testContext.hasFeedbacks))return testRunner.trigger("disableitem"),self.displayWaitingDialog().then(function(){testRunner.trigger("enableitem").trigger(e.name,...args)}),!1})},destroy(){this.getTestRunner().off(".connectivity")},render:function render(){var $container=this.getAreaBroker().getControlArea();this.$element&&$container.append(this.$element)}});return connectivity}),define("taoQtiTest/runner/plugins/controls/connectivity/pauseOnError",["i18n","taoTests/runner/plugin","handlebars","lib/handlebars/helpers"],function(__,pluginFactory,Handlebars,Helpers0){"use strict";function dialogTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",functionType="function",escapeExpression=this.escapeExpression,stack1,helper;return buffer+="",(helper=helpers.title)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.title,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"

          \n",(helper=helpers.message)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.message,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1),buffer});const name="pauseOnError",dialogMessage={title:__("Something unexpected happened."),message:__("Please try reloading the page or pause the test. If you pause, you will be able to resume the test from this page.")},dialogConfig={focus:"cancel",buttons:{labels:{ok:__("Pause the test"),cancel:__("Reload the page")}}},pauseContext={reasons:{category:"technical",subCategory:"error"},originalMessage:"Due to an unexpected issue the test has been suspended."};var pauseOnError=pluginFactory({name:"pauseOnError",init(){const testRunner=this.getTestRunner(),returnToHome=()=>testRunner.trigger("pause",pauseContext),reloadPage=()=>testRunner.trigger("reloadpage"),processError=error=>{testRunner.on("reloadpage",()=>window.location.reload()).trigger("disablenav disabletools hidenav").trigger(`confirm.${name}`,dialogTpl(dialogMessage),returnToHome,reloadPage,dialogConfig),500===error.code&&(error.originalCode=error.code,delete error.code,testRunner.trigger(`disablefeedbackalerts`),testRunner.after("error.pauseOnError",()=>{testRunner.off("error.pauseOnError"),testRunner.trigger(`enablefeedbackalerts`)}))};testRunner.before("error",(e,error)=>processError(error))}});return pauseOnError}),define("taoQtiTest/runner/plugins/controls/duration/duration",["lodash","taoTests/runner/plugin","core/logger"],function(_,pluginFactory,loggerFactory){"use strict";_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,loggerFactory=loggerFactory&&Object.prototype.hasOwnProperty.call(loggerFactory,"default")?loggerFactory["default"]:loggerFactory;const logger=loggerFactory("taoQtiTest/runner/plugins/controls/duration/duration");var duration=pluginFactory({name:"duration",install(){this.getTestRunner().getTestStore().setVolatile(this.getName())},init(){const testRunner=this.getTestRunner();let currentUpdatePromise=Promise.resolve();const getItemAttempt=()=>{const context=testRunner.getTestContext();return`${context.itemIdentifier}#${context.attempt}`},getPositiveNumber=value=>!_.isNumber(value)||0>value?0:value;return testRunner.getPluginStore(this.getName()).then(durationStore=>{const getItemDuration=attemptId=>/^(.*)+#+\d+$/.test(attemptId)?durationStore.getItem(attemptId):Promise.reject(new Error("Is it really an attempt id, like \"itemid#attempt\"")),updateDuration=elapsed=>{const itemAttemptId=getItemAttempt();return currentUpdatePromise=currentUpdatePromise.then(()=>getItemDuration(itemAttemptId)).then(duration=>durationStore.setItem(itemAttemptId,getPositiveNumber(duration)+getPositiveNumber(elapsed)/1e3)).catch(err=>{logger.warn(`Error updating item duration! ${err&&err.message}`)}),currentUpdatePromise},addDurationToCallActionParams=()=>{const itemAttemptId=getItemAttempt();return currentUpdatePromise.then(()=>getItemDuration(itemAttemptId)).then(duration=>testRunner.getProxy().addCallActionParams({itemDuration:getPositiveNumber(duration)})).catch(err=>{logger.warn(`Error retrieving item duration! ${err&&err.message}`)})};testRunner.on("tick",updateDuration).before("move skip exit timeout pause",addDurationToCallActionParams).on("plugin-get.duration",(attemptId,getDuration)=>{_.isFunction(getDuration)&&getDuration(getItemDuration(attemptId))})})}});return duration}),define("taoQtiTest/runner/plugins/controls/progressbar/progress",["lodash","i18n","core/format","taoQtiTest/runner/helpers/map"],function(_,__,format,mapHelper){"use strict";function getFixedMap(testMap,testContext){const currentTestPart=mapHelper.getPart(testMap,testContext.testPartId),currentItem=mapHelper.getItemAt(testMap,testContext.itemPosition);if(currentItem.answered&¤tTestPart.isLinear){const fixedTestMap=_.cloneDeep(testMap),fixedCurrentItem=mapHelper.getItemAt(fixedTestMap,testContext.itemPosition);return fixedCurrentItem.answered=!1,fixedTestMap}return testMap}function getEmptyStats(){return{position:0,reached:0,viewed:0,completed:0,total:0}}function updateStats(stats,element,position){element.position<=position&&stats.position++,element.stats.viewed&&(stats.reached++,element.stats.viewed===element.stats.total&&stats.viewed++),element.stats.answered&&element.stats.answered===element.stats.questions&&stats.completed++,stats.total++}function updateItemStats(stats,element,position){element.position<=position&&stats.position++,element.viewed&&(stats.reached++,stats.viewed++),element.answered&&stats.completed++,stats.total++}function getCategoriesToMatch(categories){var matchSize=categories&&categories.length;return matchSize&&_.reduce(categories,function(map,category){return map[category]=!0,map},{})}function getProgressStats(testMap,testContext,config,scope){var fixedMap=getFixedMap(testMap,testContext),scopedMap=mapHelper.getScopeMap(fixedMap,testContext.itemPosition,scope),stats=_.clone(scopedMap.stats),categoriesToMatch,matchSize;return"categories"===config.indicator&&(categoriesToMatch=getCategoriesToMatch(config.categories),matchSize=config.categories&&config.categories.length,stats.matchedCategories=getEmptyStats()),stats.parts=getEmptyStats(),stats.sections=getEmptyStats(),stats.answerableParts=getEmptyStats(),stats.answerableSections=getEmptyStats(),_.forEach(scopedMap.parts,function(part){updateStats(stats.parts,part,testContext.itemPosition),0=minWanted))return!1}),matched===minWanted}function getRatio(position,total){var _Mathfloor=Math.floor;return position&&0= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),"
          \n
          \n
          \n
          \n"}),defaults={showLabel:!0};return percentageIndicatorRenderer}),define("taoQtiTest/runner/plugins/controls/progressbar/renderer/position",["lodash","ui/component","handlebars","lib/handlebars/helpers"],function(_,component,Handlebars,Helpers0){"use strict";function positionTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}function pointTpl(data,options,asString){var html=Template$1(data,options);return asString||!0?html:$(html)}function positionIndicatorRenderer(config,progressData){var count=0,rendererApi={update:function update(data){progressData=data,this.is("rendered")&&this.controls&&(count!==progressData.total&&(count=progressData.total,this.controls.$bar.empty().append(pointTpl(_.range(count)))),this.controls.$label.text(progressData.label),this.controls.$bar.children().removeClass("reached current").slice(0,progressData.position).addClass("reached").slice(-1).addClass("current")),this.trigger("update",data)}};return component(rendererApi,defaults).setTemplate(positionTpl).on("render",function(){this.controls={$label:this.getElement().find("[data-control=\"progress-label\"]"),$bar:this.getElement().find("[data-control=\"progress-bar\"] .progressbar-points")},this.config.showLabel||this.controls.$label.hide(),progressData&&this.update(progressData),this.is("hidden")&&this.hide()}).on("destroy",function(){this.controls=null}).init(config)}_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,component=component&&Object.prototype.hasOwnProperty.call(component,"default")?component["default"]:component,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){return this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),"
          \n
          \n
          \n
          \n
          \n
          \n"});Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template$1=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var buffer="";return buffer+="\n\n",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var functionType="function",escapeExpression=this.escapeExpression,self=this,stack1;return stack1=helpers.each.call(depth0,depth0,{hash:{},inverse:self.noop,fn:self.program(1,program1,data),data:data}),stack1||0===stack1?stack1:""}),defaults={showLabel:!0};return positionIndicatorRenderer}),define("taoQtiTest/runner/plugins/controls/progressbar/progressbar",["taoTests/runner/plugin","taoQtiTest/runner/helpers/map","taoQtiTest/runner/plugins/controls/progressbar/progress","taoQtiTest/runner/plugins/controls/progressbar/renderer/percentage","taoQtiTest/runner/plugins/controls/progressbar/renderer/position"],function(pluginFactory,mapHelper,progressHelper,percentageRendererFactory,positionRendererFactory){"use strict";pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper,progressHelper=progressHelper&&Object.prototype.hasOwnProperty.call(progressHelper,"default")?progressHelper["default"]:progressHelper,percentageRendererFactory=percentageRendererFactory&&Object.prototype.hasOwnProperty.call(percentageRendererFactory,"default")?percentageRendererFactory["default"]:percentageRendererFactory,positionRendererFactory=positionRendererFactory&&Object.prototype.hasOwnProperty.call(positionRendererFactory,"default")?positionRendererFactory["default"]:positionRendererFactory;var renderers={percentage:percentageRendererFactory,position:positionRendererFactory},progressbar=pluginFactory({name:"progressBar",init:function init(){const testRunner=this.getTestRunner(),testRunnerConfig=testRunner.getOptions(),config=Object.assign({},testRunnerConfig.progressIndicator||{},this.getConfig()),self=this;var rendererFactory=renderers[config.renderer]||renderers.percentage,progressConfig={indicator:config.type||"percentage",scope:config.scope||"test",showLabel:config.showLabel,showTotal:config.showTotal,categories:config.categories},hiddenByQuestions=function hiddenByQuestions(item){return item&&item.informational&&"questions"===progressConfig.indicator},hiddenByCategories=function(item){return item&&"categories"===progressConfig.indicator&&!progressHelper.isMatchedCategories(item.categories,progressConfig.categories)},isProgressbarHidden=function isProgressbarHidden(item){return hiddenByQuestions(item)||hiddenByCategories(item)},update=function update(){var testContext=testRunner.getTestContext(),testMap=testRunner.getTestMap(),item=mapHelper.getItemAt(testMap,testContext.itemPosition);isProgressbarHidden(item)?self.renderer.hide():(self.renderer.show(),self.renderer.update(progressHelper.computeProgress(testMap,testContext,progressConfig)))};this.renderer=rendererFactory(progressConfig),update(),testRunner.on("ready loaditem",update)},render:function render(){var $container=this.getAreaBroker().getControlArea();this.renderer.render($container)},destroy:function destroy(){this.renderer&&this.renderer.destroy(),this.renderer=null},show:function show(){this.renderer&&this.renderer.show()},hide:function hide(){this.renderer&&this.renderer.hide()}});return progressbar}),define("taoQtiTest/runner/plugins/controls/testState/testState",["lodash","taoTests/runner/plugin"],function(_,pluginFactory){"use strict";_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory;var testState=pluginFactory({name:"testState",install:function install(){var testRunner=this.getTestRunner();testRunner.getProxy().use(function qtiFilter(req,res,next){var data=res&&res.data;return data&&data.type&&"TestState"===data.type&&!testRunner.getState("closedOrSuspended")?(testRunner.setState("closedOrSuspended",!0),void(testRunner.getState("ready")?(_.isEmpty(data.messages)||!_.find(data.messages,{channel:"teststate"}))&&testRunner.trigger("leave",data):testRunner.trigger("destroy"))):void next()})},init:function init(){var testRunner=this.getTestRunner(),isLeaving=!1;testRunner.getProxy().channel("teststate",function(data){isLeaving||!data||"close"!==data.type&&"pause"!==data.type||testRunner.getState("closedOrSuspended")||(isLeaving=!0,"pause"===data.type?testRunner.trigger("pause",data):(testRunner.setState("closedOrSuspended",!0),testRunner.trigger("leave",data)))})}});return testState}),define("taoQtiTest/runner/helpers/getTimerMessage",["i18n"],function(__){"use strict";function getTimerMessage(hours,minutes,seconds,unansweredQuestions,scope){let timerMessage;const timeArr=[hours,minutes,seconds],timeArgArr=[];[__("hours"),__("minutes"),__("seconds")].forEach((unit,idx)=>{0=remainingTime?0:parseInt(remainingTime,10),this.is("rendered")&&this.is("running")){if(encodedTime=timeEncoder.encode(this.remainingTime/1000),encodedTime!==this.encodedTime){this.encodedTime=encodedTime;const time=moment.duration(this.remainingTime/1000,"seconds"),hours=time.get("hours"),minutes=time.get("minutes"),seconds=time.get("seconds");$time.text(this.encodedTime),$timeScreenreader.text(getTimerMessage(hours,minutes,seconds,unansweredQuestions,this.config.scope))}if(this.warnings&&(warningId=_.findLastKey(this.warnings,function(warning){return warning&&!warning.shown&&0=self.remainingTime}),warningId&&(this.warnings[warningId].shown=!0,warningMessage=_.isFunction(this.warnings[warningId].message)?this.warnings[warningId].message(this.remainingTime):this.warnings[warningId].message,this.trigger("warn",warningMessage,this.warnings[warningId].level))),this.warningsForScreenreader){const screenreaderWarningId=_.findLastKey(this.warningsForScreenreader,warning=>warning&&!warning.shown&&0=self.remainingTime);screenreaderWarningId&&(this.warningsForScreenreader[screenreaderWarningId].shown=!0,this.trigger("warnscreenreader",this.warningsForScreenreader[screenreaderWarningId].message,self.remainingTime,this.warningsForScreenreader[screenreaderWarningId].scope))}this.trigger("change",this.remainingTime,encodedTime)}0===this.remainingTime&&this.complete()}return this},start:function start(){return!this.is("rendered")||this.is("running")||this.is("completed")||(this.enable(),this.setState("running",!0),this.trigger("start")),this},stop:function stop(){return this.is("rendered")&&this.is("running")&&(this.setState("running",!1),this.trigger("stop")),this},complete:function complete(){return this.is("rendered")&&this.is("running")&&!this.is("completed")&&(this.stop(),this.setState("completed",!0),this.trigger("complete end")),this}},defaults).on("init",function(){this.remainingTime=this.config.remainingTime,this.unansweredQuestions=this.config.unansweredQuestions,this.config.warnings&&(this.warnings=_.sortBy(this.config.warnings,"threshold")),this.config.warningsForScreenreader&&(this.warningsForScreenreader=_.sortBy(this.config.warningsForScreenreader,"threshold")),this.render($container)}).on("render",function(){$time=$$1(".time",this.getElement()),$timeScreenreader=$$1(".time--screenreader",this.getElement()),!0===this.config.showBeforeStart&&$time.text(timeEncoder.encode(this.remainingTime/1000))}).on("warn",function(message,level){var countdownTooltip;level=level||"warning",this.is("rendered")&&this.is("running")&&_.isString(message)&&!_.isEmpty(message)&&($time.removeClass("txt-success txt-info txt-warning txt-danger txt-error").addClass(`txt-${level}`),!0===this.config.displayWarning&&(countdownTooltip=tooltip.create(this.getElement(),message,{trigger:"manual",theme:level,placement:"bottom"}),countdownTooltip.show(),setTimeout(function(){countdownTooltip.hide(),countdownTooltip.dispose()},warningTimeout[level]||2e3)))});return countdown.setTemplate(countdownTpl),_.defer(function(){countdown.init(config)}),countdown}$$1=$$1&&Object.prototype.hasOwnProperty.call($$1,"default")?$$1["default"]:$$1,_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,timeEncoder=timeEncoder&&Object.prototype.hasOwnProperty.call(timeEncoder,"default")?timeEncoder["default"]:timeEncoder,component=component&&Object.prototype.hasOwnProperty.call(component,"default")?component["default"]:component,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,getTimerMessage=getTimerMessage&&Object.prototype.hasOwnProperty.call(getTimerMessage,"default")?getTimerMessage["default"]:getTimerMessage,tooltip=tooltip&&Object.prototype.hasOwnProperty.call(tooltip,"default")?tooltip["default"]:tooltip,moment=moment&&Object.prototype.hasOwnProperty.call(moment,"default")?moment["default"]:moment,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",functionType="function",escapeExpression=this.escapeExpression,stack1,helper;return buffer+="
          \n ",(helper=helpers.label)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.label,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\n \n
          \n
          \n",buffer}),precision=1e3,defaults={showBeforeStart:!0,displayWarning:!0},warningTimeout={info:2e3,success:2e3,warning:4e3,danger:4e3,error:8e3};return countdownFactory}),define("css!taoQtiTest/runner/plugins/controls/timer/component/css/timerbox",[],function(){}),define("taoQtiTest/runner/plugins/controls/timer/component/timerbox",["jquery","lodash","i18n","ui/component","ui/hider","taoQtiTest/runner/plugins/controls/timer/component/countdown","handlebars","lib/handlebars/helpers","css!taoQtiTest/runner/plugins/controls/timer/component/css/timerbox.css"],function($$1,_,__,component,hider,countdownFactory,Handlebars,Helpers0,timerbox_css){"use strict";function timerboxTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}function timerboxFactory(config){var timerbox=component({update:function update(timers){var self=this,updating=[],timerIdsToRemove=_.difference(_.keys(this.timers),_.keys(timers));return timerIdsToRemove.length&&_.forEach(timerIdsToRemove,function(timerId){updating.push(self.removeTimer(timerId))}),_.forEach(timers,function(timer,id){"undefined"==typeof self.timers[id]?updating.push(self.addTimer(id,timer)):updating.push(self.updateTimer(id,timer))}),Promise.all(updating).then(function(results){return 0<_.size(self.timers)?hider.show($zenModeToggler):hider.hide($zenModeToggler),self.trigger("update",results),results})},getTimers:function getTimers(){return this.timers},addTimer:function addTimer(id,timer){var self=this;return this.is("rendered")&&"undefined"==typeof this.timers[id]?new Promise(function(resolve){var countdown=countdownFactory($countdownContainer,_.defaults(timer,{displayWarning:self.config.displayWarning})).on("render",function(){self.timers[id]=_.clone(timer),self.timers[id].countdown=this,self.trigger("timerchange","add",self.timers[id]),self.trigger("timeradd",self.timers[id]),resolve(self.timers[id])}).on("start",function(){self.trigger("timerstart",self.timers[id])}).on("stop",function(){self.trigger("timerstop",self.timers[id])}).on("end",function(){self.trigger("timerend",self.timers[id])}).on("change",function(value){self.timers[id]&&(self.trigger("timertick",this.remainingTime,self.timers[id].scope,self.timers[id].unansweredQuestions),self.timers[id].remainingTime=value)});countdown.spread(self,["error","change","warn","warnscreenreader"])}):Promise.resolve(!1)},updateTimer:function updateTimer(id,timer){return this.is("rendered")&&"undefined"!=typeof this.timers[id]?(this.timers[id].remainingTime=timer.remainingTime,this.timers[id].unansweredQuestions=timer.unansweredQuestions,this.timers[id].extraTime=timer.extraTime,_.isNumber(timer.remainingWithoutExtraTime)&&(this.timers[id].remainingWithoutExtraTime=timer.remainingWithoutExtraTime),this.timers[id].countdown&&this.timers[id].countdown.update(timer.remainingTime,timer.unansweredQuestions),this.trigger("timerchange","update",this.timers[id]),this.trigger("timerupdate",this.timers[id]),Promise.resolve(this.timers[id])):Promise.resolve(!1)},removeTimer:function removeTimer(id){var self=this;return this.is("rendered")&&"undefined"!=typeof this.timers[id]?new Promise(function(resolve){var deindex=function deindex(){var removed=_.omit(self.timers[id],"countdown");self.timers=_.omit(self.timers,id),self.trigger("timerchange","remove",removed),self.trigger("timerremove",removed),resolve(removed)};self.timers[id].countdown?self.timers[id].countdown.on("destroy",deindex).destroy():deindex()}):Promise.resolve()},start:function start(){return _.forEach(this.timers,function(timer){timer.countdown&&timer.countdown.start()}),this},stop:function stop(){return _.forEach(this.timers,function(timer){timer.countdown&&timer.countdown.stop()}),this},toggleZenMode:function toggleZenMode(){return this.is("rendered")&&this.config.zenMode.enabled&&(this.is("zen")?(this.setState("zen",!1),$zenModeToggler.attr("title",__("Hide timers"))):(this.setState("zen",!0),$zenModeToggler.attr("title",__("Show timers"))),this.trigger("zenchange",this.is("zen"))),this}},defaults).on("init",function(){this.timers={}}).on("render",function(){var self=this,$element=this.getElement();$countdownContainer=$$1(".timer-wrapper",$element),this.config.zenMode.enabled&&($zenModeToggler=$$1(".timer-toggler",$element),self.setState("zen",!!self.config.zenMode.startHidden),$zenModeToggler.on("click",function(e){e.preventDefault(),self.toggleZenMode()})),this.config.timers&&this.update(this.config.timers)}),$zenModeToggler,$countdownContainer;return timerbox.setTemplate(timerboxTpl),_.defer(function(){timerbox.init(config)}),timerbox}$$1=$$1&&Object.prototype.hasOwnProperty.call($$1,"default")?$$1["default"]:$$1,_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,component=component&&Object.prototype.hasOwnProperty.call(component,"default")?component["default"]:component,hider=hider&&Object.prototype.hasOwnProperty.call(hider,"default")?hider["default"]:hider,countdownFactory=countdownFactory&&Object.prototype.hasOwnProperty.call(countdownFactory,"default")?countdownFactory["default"]:countdownFactory,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var buffer="",helper,options;return buffer+="\n \n ",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",helperMissing=helpers.helperMissing,escapeExpression=this.escapeExpression,self=this,functionType="function",stack1,helper;return buffer+="
          \n ",stack1=helpers["if"].call(depth0,(stack1=depth0&&depth0.zenMode,null==stack1||!1===stack1?stack1:stack1.enabled),{hash:{},inverse:self.noop,fn:self.program(1,program1,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n
          \n\n
          \n
          \n",buffer}),defaults={zenMode:{enabled:!0,startHidden:!1}};return timerboxFactory}),define("taoQtiTest/runner/plugins/controls/timer/strategy/enforcedStay",[],function(){"use strict";function enforcedStayStrategy(testRunner,timer){const testPart=testRunner.getCurrentPart();return!!(timer&&"min"===timer.type&&"item"===timer.scope&&testPart&&testPart.isLinear)&&{name:"enforcedStay",setUp:function setUp(){testRunner.on("enablenav.enforcestay",function(){testRunner.trigger("disablenav")}),testRunner.trigger("disablenav")},complete:function complete(){this.tearDown(),testRunner.trigger("enablenav")},tearDown:function tearDown(){testRunner.off("enablenav.enforcestay")}}}return enforcedStayStrategy}),define("taoQtiTest/runner/plugins/controls/timer/strategy/extraTime",["lodash"],function(_){"use strict";var _Mathmax=Math.max;function extraTimeStrategy(testRunner,timer){var applyExtraTime=function applyExtraTime(){_.isNumber(timer.extraTime)&&0v;return"boolean"===baseType?transform=v=>!0===v||"true"===v:"integer"===baseType?transform=v=>"number"==typeof v?v:parseInt(v):"float"===baseType?transform=v=>"number"==typeof v?v:parseFloat(v):("directedPair"==baseType||"pair"==baseType)&&(transform=v=>_.isString(v)?v.split(" "):v),value=_.map(value||[],transform),mappedCardinality&&("base"===mappedCardinality?0===value.length?response.base=null:(response.base={},response.base[baseType]=value[0]):(response[mappedCardinality]={},response[mappedCardinality][baseType]=value)),response},isQtiValueNull:function isQtiValueNull(value,baseType,cardinality){var mappedCardinality=responseCardinalities[cardinality];_.isObject(value)&&null===value[mappedCardinality]&&(value=null),_.isObject(value)&&value[mappedCardinality]&&"undefined"!=typeof value[mappedCardinality][baseType]&&(value=value[mappedCardinality][baseType]);const stringyValue="string"===baseType||"integer"===baseType||"float"===baseType;return null===value||stringyValue&&""===value||"single"!==cardinality&&_.isEmpty(value)},isQuestionAnswered:function isQuestionAnswered(response,baseType,cardinality,defaultValue,constraintValue){var fullyAnswered=!0,answered,currentCardinality,responses;return defaultValue=_.isUndefined(defaultValue)?null:defaultValue,constraintValue=constraintValue||0,currentItemHelper.isQtiValueNull(response,baseType,cardinality)?answered=!1:(answered=!_.isEqual(response,currentItemHelper.toResponse(defaultValue,baseType,cardinality)),0!==constraintValue&&(currentCardinality=responseCardinalities[cardinality],responses=response[currentCardinality][baseType]||[],fullyAnswered=responses&&responses.length>=constraintValue),answered=answered&&fullyAnswered),answered},guessInteractionConstraintValues:function guessInteractionConstraintValues(runner){var itemRunner=runner.itemRunner,itemBody=itemRunner._item&&itemRunner._item.bdy||{},interactions=itemBody.elements||{},constraintValues={};return _.forEach(interactions,function(interaction){var attributes=interaction.attributes||{},qtiClass=interaction.__proto__.qtiClass,constraintProperty;Object.prototype.hasOwnProperty.call(interactionMinConstraintProperties,qtiClass)&&(constraintProperty=interactionMinConstraintProperties[qtiClass],constraintValues[attributes.responseIdentifier]=attributes[constraintProperty])}),constraintValues},isAnswered:function isAnswered(runner,partially){var itemRunner=runner.itemRunner,responses=itemRunner&&itemRunner.getResponses(),count=0,empty=0,declarations,constraintValues;return itemRunner&&(declarations=currentItemHelper.getDeclarations(runner),constraintValues=currentItemHelper.guessInteractionConstraintValues(runner),_.forEach(declarations,function(declaration){var attributes=declaration.attributes||{},response=responses[attributes.identifier],baseType=attributes.baseType,cardinality=attributes.cardinality;count++,currentItemHelper.isQuestionAnswered(response,baseType,cardinality,declaration.defaultValue,constraintValues[attributes.identifier])||empty++})),!1===partially?0val.attributes?val.attributes.href:null)},getTextStimuliHrefs:function getTextStimuliHrefs(runner){var stimuli=this.getStimuliHrefs(runner),textStimuli;return 0

          ",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var functionType="function",escapeExpression=this.escapeExpression,self=this,stack1;return stack1=helpers["if"].call(depth0,depth0&&depth0.header,{hash:{},inverse:self.noop,fn:self.program(1,program1,data),data:data}),stack1||0===stack1?stack1:""}),messages={getExitMessage:getExitMessage};return messages}),define("taoQtiTest/runner/config/states",[],function(){"use strict";var states={testSession:Object.freeze({initial:0,interacting:1,modalFeedback:2,suspended:3,closed:4}),itemSession:Object.freeze({initial:0,interacting:1,modalFeedback:2,suspended:3,closed:4,solution:5,notSelected:255})};return states}),define("taoQtiTest/runner/plugins/controls/timer/strategy/warnSectionLeaving",["lodash","i18n","taoQtiTest/runner/helpers/messages","taoQtiTest/runner/helpers/navigation","taoQtiTest/runner/config/states","taoQtiTest/runner/helpers/map"],function(_,__,messages,navigationHelper,states,mapHelper){"use strict";function warnSectionLeavingStrategy(testRunner,timer){var leaveTimedSection=function leaveTimedSection(direction,scope,position){var context=testRunner.getTestContext(),map=testRunner.getTestMap();return!(context.isTimeout||context.itemSessionState===states.itemSession.closed||context.sectionId!==timer.source)&&navigationHelper.isLeavingSection(context,map,direction,scope,position)};return!!(timer&&"section"===timer.scope&&"max"===timer.type)&&{name:"warnSectionLeaving",setUp:function setUp(){testRunner.off("move.warntimedsection skip.warntimedsection").before("move.warntimedsection skip.warntimedsection",function(e,type,scope,position){const testContext=testRunner.getTestContext(),testMap=testRunner.getTestMap(),testRunnerOptions=testRunner.getOptions(),timerConfig=testRunnerOptions.timer||{},itemIdentifier=testContext.itemIdentifier,isLast=navigationHelper.isLast(testMap,itemIdentifier),endTestWarning=mapHelper.hasItemCategory(testMap,itemIdentifier,"endTestWarning",!0),noExitTimedSectionWarning=mapHelper.hasItemCategory(testMap,itemIdentifier,"noExitTimedSectionWarning",!0);var movePromise=new Promise(function(resolve,reject){if(isLast&&endTestWarning)resolve();else if(leaveTimedSection(type||"next",scope,position)&&!noExitTimedSectionWarning&&!timerConfig.keepUpToTimeout){const submitButtonLabel=__("Close this Section");testRunner.trigger("confirm.exittimed",messages.getExitMessage("section",testRunner,exitMessage,!1,submitButtonLabel),resolve,reject,{buttons:{labels:{ok:submitButtonLabel,cancel:__("Review my Answers")}}})}else resolve()});return movePromise.catch(function cancelMove(){_.defer(function(){testRunner.trigger("enableitem enablenav")})}),movePromise})},complete:function complete(){return this.tearDown()},tearDown:function tearDown(){testRunner.off("move.warntimedsection skip.warntimedsection")}}}_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,messages=messages&&Object.prototype.hasOwnProperty.call(messages,"default")?messages["default"]:messages,navigationHelper=navigationHelper&&Object.prototype.hasOwnProperty.call(navigationHelper,"default")?navigationHelper["default"]:navigationHelper,states=states&&Object.prototype.hasOwnProperty.call(states,"default")?states["default"]:states,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper;var exitMessage=__("Once you close this section, you cannot return to it or change your answers.");return warnSectionLeavingStrategy}),define("taoQtiTest/runner/plugins/controls/timer/strategy/strategyHandler",["lodash","taoQtiTest/runner/plugins/controls/timer/strategy/enforcedStay","taoQtiTest/runner/plugins/controls/timer/strategy/extraTime","taoQtiTest/runner/plugins/controls/timer/strategy/guidedNavigation","taoQtiTest/runner/plugins/controls/timer/strategy/timeout","taoQtiTest/runner/plugins/controls/timer/strategy/warnSectionLeaving"],function(_,extraTimeStrategy,enforcedStayStrategy,guidedNavigationStrategy,timeoutStrategy,warnSectionLeavingStrategy){"use strict";function getStrategyHandler(testRunner,strategies){var actives={},applyToStrategies=function applyToStrategies(timerId,action){var api=_.keys(strategyHandler);if(_.isEmpty(timerId)||_.isEmpty(action)||!api.includes(action))throw new TypeError("Invalid timer id or unauthorized action");return _.isArray(actives[timerId])?Promise.all(_.map(actives[timerId],function(strategy){if(_.isFunction(strategy[action]))return strategy[action]()})):Promise.resolve()},availableStrategies=strategies||defaultAvailableStrategies,strategyHandler;if(!testRunner||!_.isFunction(testRunner.on)||!_.isFunction(testRunner.getTestContext))throw new TypeError("The strategy handler needs a valid test runner.");return strategyHandler={setUp:function setUp(timer){return _.forEach(availableStrategies,function(availableStrategy){var strategy=availableStrategy(testRunner,timer);!1!==strategy&&(actives[timer.id]=actives[timer.id]||[],actives[timer.id].push(strategy))}),applyToStrategies(timer.id,"setUp")},getActives:function getActives(timer){return timer&&timer.id&&_.isArray(actives[timer.id])?actives[timer.id]:[]},start:function start(timer){return applyToStrategies(timer.id,"start")},stop:function stop(timer){return applyToStrategies(timer.id,"stop")},complete:function complete(timer){return applyToStrategies(timer.id,"complete")},tearDown:function tearDown(timer){return applyToStrategies(timer.id,"tearDown").then(function(){actives=_.omit(actives,timer.id)})}},strategyHandler}_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,extraTimeStrategy=extraTimeStrategy&&Object.prototype.hasOwnProperty.call(extraTimeStrategy,"default")?extraTimeStrategy["default"]:extraTimeStrategy,enforcedStayStrategy=enforcedStayStrategy&&Object.prototype.hasOwnProperty.call(enforcedStayStrategy,"default")?enforcedStayStrategy["default"]:enforcedStayStrategy,guidedNavigationStrategy=guidedNavigationStrategy&&Object.prototype.hasOwnProperty.call(guidedNavigationStrategy,"default")?guidedNavigationStrategy["default"]:guidedNavigationStrategy,timeoutStrategy=timeoutStrategy&&Object.prototype.hasOwnProperty.call(timeoutStrategy,"default")?timeoutStrategy["default"]:timeoutStrategy,warnSectionLeavingStrategy=warnSectionLeavingStrategy&&Object.prototype.hasOwnProperty.call(warnSectionLeavingStrategy,"default")?warnSectionLeavingStrategy["default"]:warnSectionLeavingStrategy;var defaultAvailableStrategies=[extraTimeStrategy,enforcedStayStrategy,guidedNavigationStrategy,timeoutStrategy,warnSectionLeavingStrategy];return getStrategyHandler}),define("taoQtiTest/runner/plugins/controls/timer/timers",["lodash","i18n","moment","core/format","core/logger"],function(_,__,moment,format,loggerFactory){"use strict";function getTimers(timeConstraints,isLinear,config){var timers={},constraintsWarnings=_.reduce(config.warnings,function(acc,warnings,qtiScope){var scope=getScope(qtiScope);return acc[scope]=_.map(warnings,function(value,key){return{threshold:1000*parseInt(key,10),message:function applyMessage(remainingTime){var displayRemaining=moment.duration(remainingTime/1000,"seconds").humanize();return format(warningMessages[scope],displayRemaining)},level:value,shown:!1}}),acc},{});const constraintsWarningsForScreenreader=_.reduce(config.warningsForScreenreader,(acc,warnings,qtiScope)=>{const scope=getScope(qtiScope);return acc[scope]=_.map(warnings,value=>({threshold:1000*parseInt(value,10),message:function applyMessage(remainingTime,unansweredQuestions){const displayRemaining=moment.duration(remainingTime/1000,"seconds").humanize();return format(warningMessagesForScreenraeder[scope],displayRemaining,unansweredQuestions)},scope,shown:!1})),acc},{});var buildTimer=function buildTimer(type,constraintData){var timer=_.pick(constraintData,["label","scope","source","extraTime","qtiClassName"]);timer.type=type,timer.allowLateSubmission=constraintData.allowLateSubmission,"min"===type?(timer.id=`${type}-${constraintData.scope}-${constraintData.source}`,timer.originalTime=1000*constraintData.minTime,timer.remainingTime=1000*constraintData.minTimeRemaining):(timer.id=constraintData.source,timer.originalTime=1000*constraintData.maxTime,timer.remainingTime=1000*constraintData.maxTimeRemaining),timer.remainingWithoutExtraTime=timer.remainingTime,timer.extraTime&&"min"!==timer.type&&(timer.extraTime.consumed*=1000,timer.extraTime.remaining*=1000,timer.extraTime.total*=1000,timer.total=timer.originalTime+timer.extraTime.total,timer.remainingTime+=timer.extraTime.remaining),"max"===type&&_.isArray(constraintsWarnings[timer.scope])&&(timer.warnings=constraintsWarnings[timer.scope]),_.isArray(constraintsWarningsForScreenreader[timer.scope])&&(timer.warningsForScreenreader=constraintsWarningsForScreenreader[timer.scope]);const stats=config.questionsStats[timer.scope];return timer.unansweredQuestions=stats&&stats.questions-stats.answered,timer};return _.forEach(timeConstraints,function(timeConstraint){var constraintData=_.clone(timeConstraint),newTimer;constraintData.scope=getScope(timeConstraint.scope||timeConstraint.qtiClassName),constraintData.scope?!1===constraintData.minTime&&!1===constraintData.maxTime?logger.warn("Time constraint defined with no time, skipping"):config.guidedNavigation&&isLinear&&constraintData.maxTime&&constraintData.minTime&&constraintData.minTime===constraintData.maxTime&&0= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),"
          \n"});const screenreaderNotificationTimeout=2e4;var plugin=pluginFactory({name:"timer",install(){const testRunner=this.getTestRunner();this.loadTimers=function loadTimers(timeStore,config){const testContext=testRunner.getTestContext(),testPart=testRunner.getCurrentPart(),isLinear=testPart&&testPart.isLinear,timeConstraints=testContext.timeConstraints,timers=timersFactory(timeConstraints,isLinear,config);return Promise.all(_.map(timers,function(timer){return timeStore.getItem(`consumed_${timer.id}`).then(function(savedConsumedTime){_.isNumber(savedConsumedTime)&&0<=savedConsumedTime&&config.restoreTimerFromClient&&(timer.remainingTime=timer.originalTime+timer.extraTime.total-savedConsumedTime)})})).then(function(){return timers})},this.saveTimers=function saveTimers(timeStore,timers){return Promise.all(_.map(timers,function(timer){return timeStore.setItem(`consumed_${timer.id}`,timer.originalTime+timer.extraTime.total-timer.remainingTime)}))},testRunner.getTestStore().setVolatile(this.getName())},init:function init(){function loadSavedTimers(timeStore){const testContext=testRunner.getTestContext();if(self.timerbox&&testContext.timeConstraints)return self.loadTimers(timeStore,config).then(function(timers){return self.timerbox.update(timers)}).catch(handleError)}const self=this,testRunner=this.getTestRunner(),testRunnerOptions=testRunner.getOptions();let screenreaderNotifcationTimeoutId;const stats={};["test","testPart","section","item"].forEach(scope=>Object.assign(stats,{[scope]:statsHelper.getInstantStats(scope,testRunner)}));const config=Object.assign({contextualWarnings:!1,warnings:testRunnerOptions.timerWarning||{},warningsForScreenreader:testRunnerOptions.timerWarningForScreenreader||{},guidedNavigation:testRunnerOptions.guidedNavigation,restoreTimerFromClient:testRunnerOptions.timer&&testRunnerOptions.timer.restoreTimerFromClient,questionsStats:stats},this.getConfig()),strategyHandler=getStrategyHandler(testRunner),handleError=err=>{testRunner.trigger("error",err)};return new Promise(function(resolve){return testRunner.getPluginStore(self.getName()).then(function(timeStore){testRunner.before("renderitem",function(){return loadSavedTimers(timeStore)}).before("enableitem",function(){if(config.restoreTimerFromClient)return loadSavedTimers(timeStore)}).on("tick",function(elapsed){if(self.timerbox){const timers=self.timerbox.getTimers(),updatedTimers=Object.keys(timers).reduce((acc,timerName)=>{const statsScope=statsHelper.getInstantStats(timers[timerName].scope,testRunner),unansweredQuestions=statsScope&&statsScope.questions-statsScope.answered;return acc[timerName]=Object.assign({},timers[timerName],{remainingTime:timers[timerName].remainingTime-elapsed,unansweredQuestions}),acc},{});self.timerbox.update(updatedTimers).catch(handleError)}}).after("renderitem",function(){self.timerbox&&($$1(self.timerbox.getElement()).find(".timer-wrapper").attr("aria-hidden",isReviewPanelEnabled(testRunner)),self.timerbox.start()),self.$screenreaderWarningContainer.text("")}).after("enableitem",function(){self.timerbox&&config.restoreTimerFromClient&&self.timerbox.start()}).on("move skip",function(){self.timerbox&&self.timerbox.stop()}).on("disableitem",function(){self.timerbox&&config.restoreTimerFromClient&&self.timerbox.stop()}),timeStore.getItem("zen-mode").then(function(startZen){self.timerbox=timerboxFactory({ariaHidden:isReviewPanelEnabled(testRunner),zenMode:{enabled:!0,startHidden:!!startZen},displayWarning:config.contextualWarnings}).on("change",_.throttle(function(){self.saveTimers(timeStore,this.getTimers())},1e3)).on("timeradd",function(timer){strategyHandler.setUp(timer).catch(handleError)}).on("timerremove",function(timer){strategyHandler.tearDown(timer).catch(handleError)}).on("timerstart",function(timer){strategyHandler.start(timer).catch(handleError)}).on("timerstop",function(timer){strategyHandler.stop(timer).catch(handleError)}).on("timerend",function(timer){strategyHandler.complete(timer).catch(handleError)}).on("timerchange",function(action,timer){self.trigger(`${action}timer`,timer.qtiClassName,timer)}).on("zenchange",function(isZen){timeStore.setItem("zen-mode",!!isZen)}).on("init",resolve).on("error",handleError),self.timerbox.spread(testRunner,"timertick"),config.contextualWarnings||(self.timerbox.on("warn",function(message,level){level&&message&&testRunner.trigger(level,message)}),self.timerbox.on("warnscreenreader",_.debounce((message,remainingTime,scope)=>{const statsScope=statsHelper.getInstantStats(scope,testRunner),unansweredQuestions=statsScope&&statsScope.questions-statsScope.answered;screenreaderNotifcationTimeoutId&&clearTimeout(screenreaderNotifcationTimeoutId),self.$screenreaderWarningContainer.text(message(remainingTime,unansweredQuestions)),screenreaderNotifcationTimeoutId=setTimeout(()=>self.$screenreaderWarningContainer.text(""),screenreaderNotificationTimeout)},1e3,{leading:!0,trailing:!1})))}).catch(handleError)})})},render:function render(){const $container=this.getAreaBroker().getControlArea();this.$screenreaderWarningContainer=$$1(screenreaderNotificationTpl()),this.timerbox.render($container),$container.append(this.$screenreaderWarningContainer)},destroy:function destroy(){this.timerbox&&this.timerbox.stop().destroy()},show:function show(){this.timerbox&&this.timerbox.show()},hide:function hide(){this.timerbox&&this.timerbox.hide()}});return plugin}),define("taoQtiTest/runner/plugins/controls/title/title",["jquery","lodash","taoTests/runner/plugin","handlebars","lib/handlebars/helpers","taoQtiTest/runner/helpers/map","taoQtiTest/runner/helpers/getTimerMessage","moment","taoQtiTest/runner/helpers/stats"],function($$1,_,pluginFactory,Handlebars,Helpers0,mapHelper,getTimerMessage,moment,statsHelper){"use strict";function titleTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}$$1=$$1&&Object.prototype.hasOwnProperty.call($$1,"default")?$$1["default"]:$$1,_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper,getTimerMessage=getTimerMessage&&Object.prototype.hasOwnProperty.call(getTimerMessage,"default")?getTimerMessage["default"]:getTimerMessage,moment=moment&&Object.prototype.hasOwnProperty.call(moment,"default")?moment["default"]:moment,statsHelper=statsHelper&&Object.prototype.hasOwnProperty.call(statsHelper,"default")?statsHelper["default"]:statsHelper,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var buffer="",stack1,helper;return buffer+="\n \n
          \n ",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",functionType="function",escapeExpression=this.escapeExpression,self=this,stack1;return buffer+="
          \n ",stack1=helpers.each.call(depth0,depth0&&depth0.titles,{hash:{},inverse:self.noop,fn:self.program(1,program1,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n
          \n",buffer});const precision=1e3;var title=pluginFactory({name:"title",init:function init(){const testRunner=this.getTestRunner(),testMap=testRunner.getTestMap(),updateTitles=()=>{const testContext=testRunner.getTestContext(),currentPart=mapHelper.getItemPart(testMap,testContext.itemPosition),currentItem=mapHelper.getItem(testMap,testContext.itemIdentifier);if(testMap.title&&this.titles.test.$title.text(testMap.title).show(),currentPart&¤tPart.label&&this.titles.testPart.$title.text(` - ${currentPart.label}`).show(),testContext.isDeepestSectionVisible){const section=mapHelper.getItemSection(testMap,testContext.itemPosition);this.titles.section.$title.text(` - ${section.label||testContext.sectionTitle}`).show()}currentItem.label&&this.titles.item.$title.text(` - ${currentItem.label}`).show()};testRunner.after("renderitem",()=>{_.forOwn(this.titles,(options,scope)=>{this.titles[scope].$title.text(""),this.titles[scope].$timer.text(""),"item"!==scope&&(this.titles[scope].stats=statsHelper.getInstantStats(scope,testRunner))}),updateTitles()}).on("timertick",(remainingTime,scope)=>{const title=this.titles[scope];if(!title)return;const{$timer,stats}=this.titles[scope],time=moment.duration(remainingTime/precision,"seconds"),hours=time.get("hours"),minutes=time.get("minutes"),seconds=time.get("seconds"),unansweredQuestions=stats&&stats.questions-stats.answered;$timer&&$timer.text(getTimerMessage(hours,minutes,seconds,unansweredQuestions))}).on("unloaditem",()=>{$$1(".qti-controls",this.$element).hide()})},render:function render(){const $container=this.getAreaBroker().getControlArea();this.titles={test:{attribute:"qti-test-title",className:""},testPart:{attribute:"qti-test-part-title",className:"visible-hidden"},section:{attribute:"qti-test-position",className:""},item:{attribute:"qti-test-item-title",className:"visible-hidden"}},this.$element=$$1(titleTpl({titles:_.values(this.titles)})),$$1(".qti-controls",this.$element).hide(),$container.append(this.$element),_.forOwn(this.titles,(_ref,scope)=>{let{attribute}=_ref;this.titles[scope].$title=$container.find(`[data-control="${attribute}"]`),this.titles[scope].$timer=$container.find(`[data-control="${attribute}-timer"]`)})}});return title}),define("taoQtiTest/runner/plugins/controls/trace/itemTraceVariables",["lodash","moment","taoTests/runner/plugin"],function(_,moment,pluginFactory){"use strict";function timestamp(){return Date.now()/1000}_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,moment=moment&&Object.prototype.hasOwnProperty.call(moment,"default")?moment["default"]:moment,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory;var precision=1e3,itemTraceVariables=pluginFactory({name:"itemTraceVariables",install:function install(){this.getTestRunner().getTestStore().setVolatile("trace")},init:function init(){function onError(err){testRunner.trigger("error",err)}var testRunner=this.getTestRunner(),variables={};return testRunner.getPluginStore("trace").then(function(tracesStore){testRunner.after("renderitem enableitem",function(){var context=testRunner.getTestContext();variables={ITEM_START_TIME_CLIENT:timestamp()},tracesStore.getItem(context.itemIdentifier).then(function(data){return data&&_.merge(variables,data),tracesStore.setItem(context.itemIdentifier,variables)}).catch(onError)}).before("move skip exit timeout",function(){var context=testRunner.getTestContext();return variables.ITEM_END_TIME_CLIENT=timestamp(),variables.ITEM_TIMEZONE=moment().utcOffset(moment().utcOffset()).format("Z"),tracesStore.setItem(context.itemIdentifier,variables).catch(onError)}).before("unloaditem",function(){var context=testRunner.getTestContext();return testRunner.getProxy().callItemAction(context.itemIdentifier,"storeTraceData",{traceData:JSON.stringify(variables)},!0)})})}});return itemTraceVariables}),define("taoQtiTest/runner/plugins/navigation/allowSkipping",["lodash","i18n","taoTests/runner/plugin","taoQtiTest/runner/helpers/currentItem"],function(_,__,pluginFactory,currentItemHelper){"use strict";_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,currentItemHelper=currentItemHelper&&Object.prototype.hasOwnProperty.call(currentItemHelper,"default")?currentItemHelper["default"]:currentItemHelper;var defaults={allowPartial:!0},allowSkipping=pluginFactory({name:"allowSkipping",init(){const testRunner=this.getTestRunner(),testRunnerOptions=testRunner.getOptions(),pluginConfig=Object.assign({},defaults,this.getConfig());testRunner.before("nav-next move",()=>{const testContext=testRunner.getTestContext(),isInteracting=!testRunner.getItemState(testContext.itemIdentifier,"disabled"),warning=pluginConfig.allowPartial?__("A response to this item is required."):__("A response to every question in this item is required.");if(isInteracting&&testRunnerOptions.enableAllowSkipping){const currenItem=testRunner.getCurrentItem(),allowSkipping="boolean"==typeof currenItem.allowSkipping?currenItem.allowSkipping:testContext.allowSkipping;if(!allowSkipping)return new Promise((resolve,reject)=>0===_.size(currentItemHelper.getDeclarations(testRunner))?resolve():currentItemHelper.isAnswered(testRunner,pluginConfig.allowPartial)?resolve():void(!testRunner.getState("alerted.notallowed")&&(testRunner.setState("alerted.notallowed",!0),testRunner.trigger("alert.notallowed",warning,()=>{testRunner.trigger("resumeitem"),reject(),testRunner.setState("alerted.notallowed",!1)}))))}})}});return allowSkipping}),define("taoQtiTest/runner/plugins/navigation/next/nextWarningHelper",[],function(){"use strict";var toBoolean=function toBoolean(value,defaultValue){return"undefined"==typeof value?defaultValue:!0===value||"true"===value},nextWarningHelper=function nextWarningHelper(options){function shouldWarnBeforeNext(){return nextItemWarning&&!itemCanBeTriedAtWill()}function itemCanBeTriedAtWill(){return!1===isLast&&!1===isLinear&&-1===remainingAttempts&&!isNextItemInLinearPart()}function isNextItemInLinearPart(){return nextPart&&"undefined"!=typeof nextPart.isLinear&&isLastOfPart()&&!0===nextPart.isLinear}function shouldWarnBeforeEnd(){return shouldWarnOnTestEnd()}function shouldWarnBeforeEndPart(){return shouldWarnOnPartChange()}function shouldWarnOnTestEnd(){return isLast&&(endTestWarning||warnBeforeNext)&&shouldWarnForUnansweredItems()}function shouldWarnForUnansweredItems(){var hasUnanswered=stats&&0!=stats.questions-stats.answered,hasFlagged=stats&&0!==stats.flagged;return!unansweredOnly||hasUnanswered||hasFlagged}function shouldWarnOnPartChange(){return nextPartWarning&&isLastOfPart()&&shouldWarnForUnansweredItems()}function isLastOfPart(){return nextPart&&nextPart.id&&testPartId!==nextPart.id}var endTestWarning=toBoolean(options.endTestWarning,!1),isLast=toBoolean(options.isLast,!1),isLinear=toBoolean(options.isLinear,!1),nextItemWarning=toBoolean(options.nextItemWarning,!1),nextPartWarning=toBoolean(options.nextPartWarning,!1),stats=options.stats,nextPart=options.nextPart||{},remainingAttempts="undefined"==typeof options.remainingAttempts?-1:options.remainingAttempts,testPartId=options.testPartId||"",unansweredOnly=toBoolean(options.unansweredOnly,!1),warnBeforeNext=shouldWarnBeforeNext(),warnBeforeEnd=shouldWarnBeforeEnd(),warnBeforeEndPart=shouldWarnBeforeEndPart();return{shouldWarnBeforeEndPart:function(){return warnBeforeEndPart},shouldWarnBeforeEnd:function(){return warnBeforeEnd},shouldWarnBeforeNext:function(){return warnBeforeNext}}};return nextWarningHelper}),define("taoQtiTest/runner/plugins/navigation/next",["jquery","i18n","ui/hider","taoTests/runner/plugin","taoQtiTest/runner/plugins/navigation/next/nextWarningHelper","taoQtiTest/runner/helpers/messages","taoQtiTest/runner/helpers/map","taoQtiTest/runner/helpers/navigation","taoQtiTest/runner/helpers/stats","util/shortcut","util/namespace","handlebars","lib/handlebars/helpers"],function($$1,__,hider,pluginFactory,nextWarningHelper,messages,mapHelper,navigationHelper,statsHelper,shortcut,namespaceHelper,Handlebars,Helpers0){"use strict";function buttonTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}$$1=$$1&&Object.prototype.hasOwnProperty.call($$1,"default")?$$1["default"]:$$1,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,hider=hider&&Object.prototype.hasOwnProperty.call(hider,"default")?hider["default"]:hider,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,nextWarningHelper=nextWarningHelper&&Object.prototype.hasOwnProperty.call(nextWarningHelper,"default")?nextWarningHelper["default"]:nextWarningHelper,messages=messages&&Object.prototype.hasOwnProperty.call(messages,"default")?messages["default"]:messages,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper,navigationHelper=navigationHelper&&Object.prototype.hasOwnProperty.call(navigationHelper,"default")?navigationHelper["default"]:navigationHelper,statsHelper=statsHelper&&Object.prototype.hasOwnProperty.call(statsHelper,"default")?statsHelper["default"]:statsHelper,shortcut=shortcut&&Object.prototype.hasOwnProperty.call(shortcut,"default")?shortcut["default"]:shortcut,namespaceHelper=namespaceHelper&&Object.prototype.hasOwnProperty.call(namespaceHelper,"default")?namespaceHelper["default"]:namespaceHelper,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var buffer="",stack1,helper;return buffer+=" ",(helper=helpers.className)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.className,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1),buffer}function program3(depth0,data){var buffer="",stack1;return buffer+="\n aria-"+escapeExpression((stack1=null==data||!1===data?data:data.key,"function"===typeof stack1?stack1.apply(depth0):stack1))+"=\""+escapeExpression("function"===typeof depth0?depth0.apply(depth0):depth0)+"\"\n ",buffer}function program5(depth0,data){var buffer="",stack1,helper;return buffer+="",buffer}function program6(depth0,data){return" no-label"}function program8(depth0,data){var buffer="",stack1,helper;return buffer+="",(helper=helpers.text)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.text,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",functionType="function",escapeExpression=this.escapeExpression,self=this,stack1,helper;return buffer+="\n \n ",stack1=helpers["if"].call(depth0,depth0&&depth0.icon,{hash:{},inverse:self.noop,fn:self.program(5,program5,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.text,{hash:{},inverse:self.noop,fn:self.program(8,program8,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n \n\n",buffer});const buttonData={next:{control:"move-forward",title:__("Submit and go to the next item"),specificTitle:__("Submit and go to the item %s"),icon:"forward",text:__("Next")},end:{control:"move-end",title:__("Submit and go to the end of the test"),icon:"fast-forward",text:__("End test")}},createElement=function(){let isLast=!!(0$element.removeProp("disabled").removeClass("disabled"),disableElement=$element=>$element.prop("disabled",!0).addClass("disabled"),updateElement=function($element,testRunner){let isLast=!!(2{const testContext=testRunner.getTestContext(),testMap=testRunner.getTestMap(),itemIdentifier=testContext.itemIdentifier;return navigationHelper.isLast(testMap,itemIdentifier)},doNext=nextItemWarning=>{const testContext=testRunner.getTestContext(),testMap=testRunner.getTestMap(),testPart=testRunner.getCurrentPart(),nextItemPosition=testContext.itemPosition+1,itemIdentifier=testContext.itemIdentifier,unansweredWarning=mapHelper.hasItemCategory(testMap,itemIdentifier,"unansweredWarning",!0),nextPartWarning=mapHelper.hasItemCategory(testMap,itemIdentifier,"nextPartWarning",!0)||unansweredWarning,endTestWarning=mapHelper.hasItemCategory(testMap,itemIdentifier,"endTestWarning",!0),unansweredOnly=!endTestWarning&&unansweredWarning,warningScope=nextPartWarning?"part":"test",enableNav=()=>testRunner.trigger("enablenav"),triggerNextAction=()=>{isLastItem()&&this.trigger("end"),testRunner.next()};if(testRunner.trigger("disablenav"),!1!==this.getState("enabled")){const warningHelper=nextWarningHelper({endTestWarning:endTestWarning,isLast:isLastItem(),isLinear:testPart.isLinear,nextItemWarning:nextItemWarning,nextPartWarning:nextPartWarning,nextPart:mapHelper.getItemPart(testMap,nextItemPosition),remainingAttempts:testContext.remainingAttempts,testPartId:testContext.testPartId,unansweredWarning:unansweredWarning,stats:statsHelper.getInstantStats(warningScope,testRunner),unansweredOnly:unansweredOnly});if(warningHelper.shouldWarnBeforeEndPart()){const submitButtonLabel=__("SUBMIT THIS PART");testRunner.trigger("confirm.endTestPart",messages.getExitMessage(warningScope,testRunner,"",!1,submitButtonLabel),triggerNextAction,enableNav,{buttons:{labels:{ok:submitButtonLabel,cancel:__("CANCEL")}}})}else if(warningHelper.shouldWarnBeforeEnd()){const submitButtonLabel=__("SUBMIT THE TEST");testRunner.trigger("confirm.endTest",messages.getExitMessage(warningScope,testRunner,"",!1,submitButtonLabel),triggerNextAction,enableNav,{buttons:{labels:{ok:submitButtonLabel,cancel:__("CANCEL")}}})}else warningHelper.shouldWarnBeforeNext()?testRunner.trigger("confirm.next",__("You are about to go to the next item. Click OK to continue and go to the next item."),triggerNextAction,enableNav):triggerNextAction()}};this.$element=createElement(isLastItem()),this.$element.on("click",e=>{e.preventDefault(),disableElement(this.$element),testRunner.trigger("nav-next")});const registerShortcut=kbdShortcut=>{testRunnerOptions.allowShortcuts&&kbdShortcut&&shortcut.add(namespaceHelper.namespaceAll(kbdShortcut,this.getName(),!0),()=>{!0===this.getState("enabled")&&testRunner.trigger("nav-next",!0)},{avoidInput:!0,prevent:!0})};registerShortcut(pluginShortcuts.trigger),this.disable(),testRunner.on("loaditem",()=>{updateElement(this.$element,testRunner,isLastItem())}).on("enablenav",()=>this.enable()).on("disablenav",()=>this.disable()).on("hidenav",()=>this.hide()).on("shownav",()=>this.show()).on("nav-next",nextItemWarning=>doNext(nextItemWarning)).on("enableaccessibilitymode",()=>{const kbdShortcut=pluginShortcuts.triggerAccessibility;kbdShortcut&&!this.getState("eaccessibilitymode")&&(shortcut.remove(`.${this.getName()}`),registerShortcut(kbdShortcut),this.setState("eaccessibilitymode"))})},render(){const $container=this.getAreaBroker().getNavigationArea();$container.append(this.$element)},destroy(){shortcut.remove(`.${this.getName()}`),this.$element.remove()},enable(){enableElement(this.$element)},disable(){disableElement(this.$element)},show(){hider.show(this.$element)},hide(){hider.hide(this.$element)}});return next}),define("taoQtiTest/runner/plugins/navigation/next/dialogConfirmNext",["jquery","lodash","i18n","ui/dialog","handlebars","lib/handlebars/helpers"],function($$1,_,__,dialog,Handlebars,Helpers0){"use strict";function checkboxTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}function dialogConfirmNext(heading,message,accept,refuse,checkboxParams,dialogOptions){var accepted=!1,content=null,dlg;return checkboxParams&&!0!==checkboxParams.checked&&(content=checkboxTpl({checked:!1,text:"Don't show this again next time",id:"dont-show-again"})),dialogOptions=_.defaults({heading:heading,message:message,content:content,autoRender:!0,autoDestroy:!0,buttons:[{id:"cancel",type:"regular",label:__("Cancel"),close:!0},{id:"ok",type:"info",label:__("Go to next item"),close:!0}],onOkBtn:function onOkBtn(){var $checkbox;accepted=!0,_.isFunction(accept)&&(accept.call(this),checkboxParams&&($checkbox=$$1("input[name=\"dont-show-again\"]",this),$checkbox.prop("checked")&&_.isFunction(checkboxParams.submitChecked)?checkboxParams.submitChecked():!$checkbox.prop("checked")&&_.isFunction(checkboxParams.submitUnchecked)&&checkboxParams.submitUnchecked()))}},dialogOptions),dlg=dialog(dialogOptions),_.isFunction(refuse)&&dlg.on("closed.modal",function(){accepted||refuse.call(this)}),dlg}$$1=$$1&&Object.prototype.hasOwnProperty.call($$1,"default")?$$1["default"]:$$1,_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,dialog=dialog&&Object.prototype.hasOwnProperty.call(dialog,"default")?dialog["default"]:dialog,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){return"checked"}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",functionType="function",escapeExpression=this.escapeExpression,self=this,stack1,helper;return buffer+="",buffer});return dialogConfirmNext}),define("taoQtiTest/runner/plugins/navigation/next/linearNextItemWarning",["i18n","taoTests/runner/plugin","taoQtiTest/runner/helpers/map","taoQtiTest/runner/helpers/currentItem","taoQtiTest/runner/plugins/navigation/next/dialogConfirmNext","taoQtiTest/runner/helpers/navigation"],function(__,pluginFactory,mapHelper,currentItemHelper,dialogConfirmNext,navigationHelper){"use strict";__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper,currentItemHelper=currentItemHelper&&Object.prototype.hasOwnProperty.call(currentItemHelper,"default")?currentItemHelper["default"]:currentItemHelper,dialogConfirmNext=dialogConfirmNext&&Object.prototype.hasOwnProperty.call(dialogConfirmNext,"default")?dialogConfirmNext["default"]:dialogConfirmNext,navigationHelper=navigationHelper&&Object.prototype.hasOwnProperty.call(navigationHelper,"default")?navigationHelper["default"]:navigationHelper;var linearNextItemWarning=pluginFactory({name:"linearNextItemWarning",init(){function getNextItemCategories(){const testContext=testRunner.getTestContext(),testMap=testRunner.getTestMap();return{nextPartWarning:mapHelper.hasItemCategory(testMap,testContext.itemIdentifier,"nextPartWarning",!0),nextSectionWarning:mapHelper.hasItemCategory(testMap,testContext.itemIdentifier,"nextSectionWarning",!0)}}function getCustomNextMessage(action){var itemPartiallyAnswered=currentItemHelper.isAnswered(testRunner,!0),customNextMessage;return customNextMessage=itemPartiallyAnswered?"next"===action?__("Are you sure you want to go to the next item? You will not be able to go back and change your answer."):"skip"===action?__("Are you sure you want to clear your answer and go to the next item? You will not be able to go back and provide an answer."):__("Are you sure you want to go to the next item? You will not be able to go back."):__("Are you sure you want to go to the next item? You will not be able to go back and provide an answer."),customNextMessage}function doNextWarning(action){return testRunner.trigger("disablenav"),testStore.getStore(self.getName()).then(function(store){return store.getItem("dontShowLinearNextItemWarning").then(function(checkboxValue){var checkboxParams=null;if(!0!==checkboxValue)return testRunnerOptions.enableLinearNextItemWarningCheckbox&&(checkboxParams={checked:checkboxValue,submitChecked:function(){store.setItem("dontShowLinearNextItemWarning",!0)},submitUnchecked:function(){store.setItem("dontShowLinearNextItemWarning",!1)}}),new Promise(function(resolve,reject){dialogConfirmNext(__("Go to the next item?"),getCustomNextMessage(action),resolve,function cancel(){reject({cancel:!0})},checkboxParams)})})}).catch(function(err){if(err&&err instanceof Error)throw err;return err&&!0===err.cancel?(testRunner.trigger("enablenav"),Promise.reject()):void 0})}const self=this,testRunner=this.getTestRunner(),testRunnerOptions=testRunner.getOptions(),testStore=testRunner.getTestStore();testStore.setVolatile(self.getName()),testRunner.on("init",function(){testStore.getStore(self.getName()).then(function(store){store.setItem("dontShowLinearNextItemWarning",null)})}).before("move skip",function(e,type,scope){const context=testRunner.getTestContext(),map=testRunner.getTestMap(),item=testRunner.getCurrentItem(),currentPart=testRunner.getCurrentPart(),categories=getNextItemCategories(),isLast=navigationHelper.isLast(map,context.itemIdentifier);if(currentPart&¤tPart.isLinear){if("section"===scope&&categories.nextSectionWarning)return;if(categories.nextPartWarning)return;if(item.informational)return;if("next"===type&&!isLast&&testRunnerOptions.forceEnableLinearNextItemWarning)return doNextWarning("next");if("skip"===e.name&&!isLast&&testRunnerOptions.forceEnableLinearNextItemWarning)return doNextWarning("skip")}})}});return linearNextItemWarning}),define("taoQtiTest/runner/plugins/navigation/nextSection",["jquery","lodash","i18n","ui/hider","taoTests/runner/plugin","taoQtiTest/runner/helpers/messages","handlebars","lib/handlebars/helpers","taoQtiTest/runner/helpers/map"],function($$1,_,__,hider,pluginFactory,messages,Handlebars,Helpers0,mapHelper){"use strict";function buttonTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}$$1=$$1&&Object.prototype.hasOwnProperty.call($$1,"default")?$$1["default"]:$$1,_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,hider=hider&&Object.prototype.hasOwnProperty.call(hider,"default")?hider["default"]:hider,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,messages=messages&&Object.prototype.hasOwnProperty.call(messages,"default")?messages["default"]:messages,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var buffer="",stack1,helper;return buffer+=" ",(helper=helpers.className)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.className,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1),buffer}function program3(depth0,data){var buffer="",stack1;return buffer+="\n aria-"+escapeExpression((stack1=null==data||!1===data?data:data.key,"function"===typeof stack1?stack1.apply(depth0):stack1))+"=\""+escapeExpression("function"===typeof depth0?depth0.apply(depth0):depth0)+"\"\n ",buffer}function program5(depth0,data){var buffer="",stack1,helper;return buffer+="",buffer}function program6(depth0,data){return" no-label"}function program8(depth0,data){var buffer="",stack1,helper;return buffer+="",(helper=helpers.text)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.text,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",functionType="function",escapeExpression=this.escapeExpression,self=this,stack1,helper;return buffer+="\n \n ",stack1=helpers["if"].call(depth0,depth0&&depth0.icon,{hash:{},inverse:self.noop,fn:self.program(5,program5,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.text,{hash:{},inverse:self.noop,fn:self.program(8,program8,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n \n\n",buffer}),nextSection=pluginFactory({name:"nextsection",init(){function getNextSectionCategories(){const testContext=testRunner.getTestContext(),testMap=testRunner.getTestMap();return{nextSection:mapHelper.hasItemCategory(testMap,testContext.itemIdentifier,"nextSection",!0),nextSectionWarning:mapHelper.hasItemCategory(testMap,testContext.itemIdentifier,"nextSectionWarning",!0),noExitTimedSectionWarning:mapHelper.hasItemCategory(testMap,testContext.itemIdentifier,"noExitTimedSectionWarning",!0)}}function toggle(){const categories=getNextSectionCategories();testRunnerOptions.nextSection&&(categories.nextSection||categories.nextSectionWarning)?self.show():self.hide()}function nextSection(){testRunner.next("section")}const self=this,testRunner=this.getTestRunner(),testRunnerOptions=testRunner.getOptions(),isWarnSectionLeavingEabled=()=>{const testContext=testRunner.getTestContext(),categories=getNextSectionCategories(),timeConstraints=testContext.timeConstraints||[];return timeConstraints.some(_ref=>{let{source}=_ref;return source===testContext.sectionId})&&!categories.noExitTimedSectionWarning&&!(testRunnerOptions.timer||{}).keepUpToTimeout};this.$element=$$1(buttonTpl({control:"next-section",title:__("Skip to the next section"),icon:"fast-forward",text:__("Next Section")})),this.$element.on("click",function(e){const enable=_.bind(self.enable,self),categories=getNextSectionCategories();if(e.preventDefault(),!1!==self.getState("enabled"))if(self.disable(),categories.nextSectionWarning&&!isWarnSectionLeavingEabled()){const submitButtonLabel=__("CONTINUE TO THE NEXT SECTION");testRunner.trigger("confirm.nextsection",messages.getExitMessage("section",testRunner,"",!1,submitButtonLabel),nextSection,enable,{buttons:{labels:{ok:submitButtonLabel,cancel:__("CANCEL")}}})}else nextSection()}),this.disable(),toggle(),testRunner.on("loaditem",toggle).on("enablenav",function(){self.enable()}).on("disablenav",function(){self.disable()}).on("hidenav",function(){self.hide()}).on("shownav",function(){self.show()})},render:function render(){var $container=this.getAreaBroker().getNavigationArea();$container.append(this.$element)},destroy:function destroy(){this.$element.remove()},enable:function enable(){this.$element.removeProp("disabled").removeClass("disabled")},disable:function disable(){this.$element.prop("disabled",!0).addClass("disabled")},show:function show(){hider.show(this.$element)},hide:function hide(){hider.hide(this.$element)}});return nextSection}),define("taoQtiTest/runner/plugins/navigation/previous",["jquery","lodash","i18n","ui/hider","taoTests/runner/plugin","util/shortcut","util/namespace","taoQtiTest/runner/helpers/navigation","taoQtiTest/runner/helpers/map","handlebars","lib/handlebars/helpers"],function($$1,_,__,hider,pluginFactory,shortcut,namespaceHelper,navigationHelper,mapHelper,Handlebars,Helpers0){"use strict";function buttonTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}$$1=$$1&&Object.prototype.hasOwnProperty.call($$1,"default")?$$1["default"]:$$1,_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,hider=hider&&Object.prototype.hasOwnProperty.call(hider,"default")?hider["default"]:hider,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,shortcut=shortcut&&Object.prototype.hasOwnProperty.call(shortcut,"default")?shortcut["default"]:shortcut,namespaceHelper=namespaceHelper&&Object.prototype.hasOwnProperty.call(namespaceHelper,"default")?namespaceHelper["default"]:namespaceHelper,navigationHelper=navigationHelper&&Object.prototype.hasOwnProperty.call(navigationHelper,"default")?navigationHelper["default"]:navigationHelper,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var buffer="",stack1,helper;return buffer+=" ",(helper=helpers.className)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.className,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1),buffer}function program3(depth0,data){var buffer="",stack1;return buffer+="\n aria-"+escapeExpression((stack1=null==data||!1===data?data:data.key,"function"===typeof stack1?stack1.apply(depth0):stack1))+"=\""+escapeExpression("function"===typeof depth0?depth0.apply(depth0):depth0)+"\"\n ",buffer}function program5(depth0,data){var buffer="",stack1,helper;return buffer+="",buffer}function program6(depth0,data){return" no-label"}function program8(depth0,data){var buffer="",stack1,helper;return buffer+="",(helper=helpers.text)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.text,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",functionType="function",escapeExpression=this.escapeExpression,self=this,stack1,helper;return buffer+="\n \n ",stack1=helpers["if"].call(depth0,depth0&&depth0.icon,{hash:{},inverse:self.noop,fn:self.program(5,program5,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.text,{hash:{},inverse:self.noop,fn:self.program(8,program8,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n \n\n",buffer}),previous=pluginFactory({name:"previous",init(){function doPrevious(previousItemWarning){function enableNav(){testRunner.trigger("enablenav")}function triggerAction(){testRunner.previous()}var context=testRunner.getTestContext();testRunner.trigger("disablenav"),!1!==self.getState("enabled")&&(previousItemWarning&&-1!==context.remainingAttempts?testRunner.trigger("confirm.previous",__("You are about to go to the previous item. Click OK to continue and go to the previous item."),triggerAction,enableNav):triggerAction())}const self=this,testRunner=this.getTestRunner(),testRunnerOptions=testRunner.getOptions(),pluginShortcuts=(testRunnerOptions.shortcuts||{})[this.getName()]||{};var canDoPrevious=function canDoPrevious(){const testMap=testRunner.getTestMap(),context=testRunner.getTestContext(),currentSection=testRunner.getCurrentSection(),noExitTimedSectionWarning=mapHelper.hasItemCategory(testMap,context.itemIdentifier,"noExitTimedSectionWarning",!0),currentPart=testRunner.getCurrentPart();let previousSection,previousPart;if(_.isPlainObject(testMap)&&0===_.size(testMap))return!1;if(navigationHelper.isFirst(testMap,context.itemIdentifier))return!1;if(navigationHelper.isFirstOf(testMap,context.itemIdentifier,"section")){if(currentSection.isCatAdaptive)return!1;if(previousSection=mapHelper.getItemSection(testMap,context.itemPosition-1),previousSection.isCatAdaptive||previousSection.timeConstraint&&!noExitTimedSectionWarning)return!1}return!(navigationHelper.isFirstOf(testMap,context.itemIdentifier,"part")&&(previousPart=mapHelper.getItemPart(testMap,context.itemPosition-1),previousPart.isLinear))&&!1===currentPart.isLinear&&!0===context.canMoveBackward},toggle=function toggle(){canDoPrevious()?self.show():self.hide()};this.$element=$$1(buttonTpl({control:"move-backward",title:__("Submit and go to the previous item"),icon:"backward",text:__("Previous")})),this.$element.on("click",function(e){e.preventDefault(),testRunner.trigger("nav-previous")});const registerShortcut=kbdShortcut=>{testRunnerOptions.allowShortcuts&&kbdShortcut&&shortcut.add(namespaceHelper.namespaceAll(kbdShortcut,this.getName(),!0),function(){canDoPrevious()&&!0===self.getState("enabled")&&testRunner.trigger("nav-previous",[!0])},{avoidInput:!0,prevent:!0})};registerShortcut(pluginShortcuts.trigger),toggle(),self.disable(),testRunner.on("loaditem",toggle).on("enablenav",function(){self.enable()}).on("disablenav",function(){self.disable()}).on("hidenav",function(){self.hide()}).on("shownav",function(){self.show()}).on("nav-previous",function(previousItemWarning){doPrevious(previousItemWarning)}).on("enableaccessibilitymode",()=>{const kbdShortcut=pluginShortcuts.triggerAccessibility;kbdShortcut&&!this.getState("eaccessibilitymode")&&(shortcut.remove(`.${this.getName()}`),registerShortcut(kbdShortcut),this.setState("eaccessibilitymode"))})},render:function render(){var $container=this.getAreaBroker().getNavigationArea();$container.append(this.$element)},destroy:function destroy(){shortcut.remove(`.${this.getName()}`),this.$element.remove()},enable:function enable(){this.$element.removeProp("disabled").removeClass("disabled")},disable:function disable(){this.$element.prop("disabled",!0).addClass("disabled")},show:function show(){hider.show(this.$element)},hide:function hide(){hider.hide(this.$element)}});return previous}),define("taoQtiTest/runner/plugins/navigation/review/navigator",["jquery","lodash","ui/component","ui/autoscroll","taoQtiTest/runner/helpers/map","handlebars","lib/handlebars/helpers"],function($$1,_,component,autoscroll,mapHelper,Handlebars,Helpers0){"use strict";function navigatorTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}function navigatorTreeTpl(data,options,asString){var html=Template$1(data,options);return asString||!0?html:$(html)}function navigatorFactory(config){function flagItem($item){var position=$item.data("position"),flagged=!$item.hasClass(_cssCls.flagged);navigator.setItemFlag(position,flagged),navigator.trigger("flag",position,flagged)}function jump($item){var position=$item.data("position");navigator.trigger("jump",position)}var navigator;return navigator=component(navigatorApi,_defaults).setTemplate(navigatorTpl).on("destroy",function(){this.controls=null}).on("show",function(){this.autoScroll()}).on("render",function(){var self=this,$component=this.getElement(),$filterBar=$component.find(_selectors.filterBar),$filters=$filterBar.find("li"),$tree=$component.find(_selectors.tree);this.controls={$infoAnswered:$component.find(_selectors.infoAnswered),$infoViewed:$component.find(_selectors.infoViewed),$infoAll:$component.find(_selectors.tabInfoAll),$infoUnanswered:this.config.showLegend?$component.find(_selectors.infoUnanswered):$component.find(_selectors.tabInfoUnanswered),$infoFlagged:this.config.showLegend?$component.find(_selectors.infoFlagged):$component.find(_selectors.tabInfoFlagged),$filterBar:$filterBar,$filters:$filters,$tree:$tree,$linearState:$component.find(_selectors.linearState)},this.updateConfig(),$component.on(`click${_selectors.component}`,_selectors.collapseHandle,function(){self.is("disabled")||($component.toggleClass(_cssCls.collapsed),$component.hasClass(_cssCls.collapsed)&&self.openSelected())}),$component.on(`click${_selectors.component}`,_selectors.infoPanelLabels,function(){self.is("disabled")||self.togglePanel($$1(this).closest(_selectors.infoPanel),_selectors.infoPanel)}),$tree.on(`click${_selectors.component}`,_selectors.partLabels,function(){var $panel;self.is("disabled")||($panel=$$1(this).closest(_selectors.parts),self.togglePanel($panel,_selectors.parts)&&($panel.hasClass(_cssCls.active)?self.openSelected():self.openOnly($panel.find(_selectors.sections).first(),$panel)))}),$tree.on(`click${_selectors.component}`,_selectors.sectionLabels,function(){self.is("disabled")||self.togglePanel($$1(this).closest(_selectors.sections),_selectors.sections)}),$tree.on(`click${_selectors.component}`,_selectors.itemLabels,function(event){var $item,$target;self.is("disabled")||($item=$$1(this).closest(_selectors.items),!$item.hasClass(_cssCls.disabled)&&($target=$$1(event.target),self.config.canFlag&&$target.is(_selectors.icons)&&!$component.hasClass(_cssCls.collapsed)?!$item.hasClass(_cssCls.unseen)&&!$item.hasClass(_cssCls.info)&&flagItem($item):!$item.hasClass(_cssCls.active)&&(self.select($item),jump($item))))}),$tree.on(`click${_selectors.component}`,_selectors.linearStart,function(){var $btn;self.is("disabled")||($btn=$$1(this),!$btn.hasClass(_cssCls.disabled)&&($btn.addClass(_cssCls.disabled),jump($btn)))}),$filterBar.on(`click${_selectors.component}`,_selectors.filter,function(){var $btn,mode;self.is("disabled")||($btn=$$1(this),mode=$btn.data("mode"),$filters.removeClass(_cssCls.active),$filters.attr("aria-selected",!1),$component.removeClass(_cssCls.collapsed),$btn.addClass(_cssCls.active),$btn.attr("aria-selected",!0),self.filter(mode),self.autoScroll())})}),navigator.currentFilter="all",navigator.init(config)}$$1=$$1&&Object.prototype.hasOwnProperty.call($$1,"default")?$$1["default"]:$$1,_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,component=component&&Object.prototype.hasOwnProperty.call(component,"default")?component["default"]:component,autoscroll=autoscroll&&Object.prototype.hasOwnProperty.call(autoscroll,"default")?autoscroll["default"]:autoscroll,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){return" hidden"}function program3(depth0,data){var buffer="",helper,options;return buffer+="\n
          \n \n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Test status",options):helperMissing.call(depth0,"__","Test status",options)))+"\n \n \n \n
            \n
          • \n \n \n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Viewed",options):helperMissing.call(depth0,"__","Viewed",options)))+"\n -/-\n \n
          • \n
          • \n \n \n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Answered",options):helperMissing.call(depth0,"__","Answered",options)))+"\n -/-\n \n
          • \n
          • \n \n \n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Unanswered",options):helperMissing.call(depth0,"__","Unanswered",options)))+"\n -/-\n \n
          • \n
          • \n \n \n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Flagged",options):helperMissing.call(depth0,"__","Flagged",options)))+"\n -/-\n \n
          • \n
          \n
          \n ",buffer}function program5(depth0,data){return"(0)"}function program7(depth0,data){return"icon-unanswered "}function program9(depth0,data){var buffer="",helper,options;return buffer+=escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Unanswered",options):helperMissing.call(depth0,"__","Unanswered",options)))+" (0)",buffer}function program11(depth0,data){return"icon-flagged "}function program13(depth0,data){var buffer="",helper,options;return buffer+=escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Flagged",options):helperMissing.call(depth0,"__","Flagged",options)))+" (0)",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",helperMissing=helpers.helperMissing,escapeExpression=this.escapeExpression,self=this,stack1,helper,options;return buffer+="
          \n
          \n \n \n
          \n ",stack1=helpers["if"].call(depth0,depth0&&depth0.showLegend,{hash:{},inverse:self.noop,fn:self.program(3,program3,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n\n\n
          \n
            \n
          • \n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"All",options):helperMissing.call(depth0,"__","All",options)))+"\n ",stack1=helpers.unless.call(depth0,depth0&&depth0.showLegend,{hash:{},inverse:self.noop,fn:self.program(5,program5,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n \n
          • \n\n
          • \n \n ",stack1=helpers.unless.call(depth0,depth0&&depth0.showLegend,{hash:{},inverse:self.noop,fn:self.program(9,program9,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n \n
          • \n\n
          • \n \n ",stack1=helpers.unless.call(depth0,depth0&&depth0.showLegend,{hash:{},inverse:self.noop,fn:self.program(13,program13,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n \n
          • \n
          \n
          \n\n \n\n
          \n \n

          \n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"In this part of the test navigation is not allowed.",options):helperMissing.call(depth0,"__","In this part of the test navigation is not allowed.",options)))+"\n

          \n
          \n
          \n",buffer});Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template$1=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var buffer="",stack1,helper;return buffer+="\n
        • \n \n ",(helper=helpers.label)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.label,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\n \n \n \n ",stack1=helpers["if"].call(depth0,depth0&&depth0.isLinear,{hash:{},inverse:self.program(8,program8,data),fn:self.program(6,program6,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n
        • \n ",buffer}function program2(depth0,data){return"active"}function program4(depth0,data){return"collapsed"}function program6(depth0,data){var buffer="",stack1,helper,options;return buffer+="\n
          \n \n

          \n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"In this part of the test navigation is not allowed.",options):helperMissing.call(depth0,"__","In this part of the test navigation is not allowed.",options)))+"\n

          \n

          \n \n

          \n
          \n ",buffer}function program8(depth0,data){var buffer="",stack1,helper;return buffer+="\n
            \n ",stack1=helpers.each.call(depth0,depth0&&depth0.sections,{hash:{},inverse:self.noop,fn:self.program(9,program9,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n
          \n ",buffer}function program9(depth0,data){var buffer="",stack1,helper;return buffer+="\n
        • \n \n ",(helper=helpers.label)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.label,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\n "+escapeExpression((stack1=(stack1=depth0&&depth0.stats,null==stack1||!1===stack1?stack1:stack1.answered),"function"===typeof stack1?stack1.apply(depth0):stack1))+"/"+escapeExpression((stack1=(stack1=depth0&&depth0.stats,null==stack1||!1===stack1?stack1:stack1.total),"function"===typeof stack1?stack1.apply(depth0):stack1))+"\n \n
            \n ",stack1=helpers.each.call(depth0,depth0&&depth0.items,{hash:{},inverse:self.noop,fn:self.programWithDepth(10,program10,data,depth0),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n
          \n
        • \n ",buffer}function program10(depth0,data,depth1){var buffer="",stack1,helper;return buffer+="\n
        • \n \n \n ",(helper=helpers.index)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.index,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\n ",(helper=helpers.label)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.label,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\n \n
        • \n ",buffer}function program11(depth0,data){return"false"}function program13(depth0,data){return"true"}function program15(depth0,data){return"aria-current=\"page\""}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",helperMissing=helpers.helperMissing,escapeExpression=this.escapeExpression,functionType="function",self=this,stack1;return buffer+="
            \n ",stack1=helpers.each.call(depth0,depth0&&depth0.parts,{hash:{},inverse:self.noop,fn:self.program(1,program1,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n
          \n",buffer}),_defaults={scope:"test",canCollapse:!1,preventsUnseen:!0,hidden:!1},_cssCls={active:"active",collapsed:"collapsed",collapsible:"collapsible",hidden:"hidden",disabled:"disabled",flagged:"flagged",answered:"answered",viewed:"viewed",unseen:"unseen",info:"info",icon:"qti-navigator-icon",scope:{test:"scope-test",testPart:"scope-test-part",testSection:"scope-test-section"}},_iconCls=[_cssCls.info,_cssCls.flagged,_cssCls.answered,_cssCls.viewed],_selectors={component:".qti-navigator",filterBar:".qti-navigator-filters",filter:".qti-navigator-filter",tree:".qti-navigator-tree",collapseHandle:".qti-navigator-collapsible",linearState:".qti-navigator-linear",infoAnswered:".qti-navigator-answered .qti-navigator-counter",infoViewed:".qti-navigator-viewed .qti-navigator-counter",infoUnanswered:".qti-navigator-unanswered .qti-navigator-counter",infoFlagged:".qti-navigator-flagged .qti-navigator-counter",infoPanel:".qti-navigator-info",infoPanelLabels:".qti-navigator-info > .qti-navigator-label",tabInfoAll:"[data-mode=\"all\"] .qti-navigator-counter",tabInfoUnanswered:"[data-mode=\"unanswered\"] .qti-navigator-counter",tabInfoFlagged:"[data-mode=\"flagged\"] .qti-navigator-counter",parts:".qti-navigator-part",partLabels:".qti-navigator-part > .qti-navigator-label",sections:".qti-navigator-section",sectionLabels:".qti-navigator-section > .qti-navigator-label",items:".qti-navigator-item",itemLabels:".qti-navigator-item > .qti-navigator-label",itemIcons:".qti-navigator-item > .qti-navigator-icon",activeItem:".qti-navigator-item.active",icons:".qti-navigator-icon",linearStart:".qti-navigator-linear-part button",counters:".qti-navigator-counter",actives:".active",collapsible:".collapsible",collapsiblePanels:".collapsible-panel",unseen:".unseen",answered:".answered",flagged:".flagged",notFlagged:":not(.flagged)",notAnswered:":not(.answered)",notInformational:":not(.info)",informational:".info",hidden:".hidden",disabled:".disabled"},_filterMap={all:"",unanswered:[_selectors.answered,_selectors.informational].join(","),flagged:_selectors.notFlagged,answered:_selectors.notAnswered,filtered:_selectors.hidden},navigatorApi={updateStats:function updateStats(position,flag){var map=this.map,item;map&&(item=mapHelper.getItemAt(map,position),item&&(item.flagged=flag,mapHelper.updateItemStats(map,position)))},getProgressionTotal:function getProgressionTotal(progression,target){var total;return total="questions"===target?progression.questions:progression.total,total},setItemFlag:function setItemFlag(position,flag){var $item=position&&position.jquery?position:this.controls.$tree.find(`[data-position=${position}]`),progression=this.progression,icon;this.updateStats(position,flag),$item.toggleClass(_cssCls.flagged,flag),icon=_.find(_iconCls,_.bind($item.hasClass,$item))||_cssCls.unseen,$item.find(_selectors.icons).attr("class",`${_cssCls.icon} icon-${icon}`),progression.flagged=this.controls.$tree.find(_selectors.flagged).length,this.writeCount(this.controls.$infoFlagged,progression.flagged,this.getProgressionTotal(progression,"questions")),this.filter(this.currentFilter)},filter:function filter(criteria){var self=this,$items=this.controls.$tree.find(_selectors.items).removeClass(_cssCls.hidden),filterCb=_filterMap[criteria];filterCb&&$items.filter(filterCb).addClass(_cssCls.hidden),this.controls.$tree.find(_selectors.sections).each(function(){var $section=$$1(this),$itemsFound=$section.find(_selectors.items).not(_selectors.hidden),$filtered=$itemsFound.not(_selectors.disabled);self.writeCount($section.find(_selectors.counters),$filtered.length,$itemsFound.length)}),this.currentFilter=criteria},updateConfig:function updateConfig(config){var $component=this.getElement(),scopeClass=_cssCls.scope[this.config.scope||_defaults.scope];return config=_.merge(this.config,config||{}),$component.toggleClass(_cssCls.collapsible,config.canCollapse),$component.removeClass(scopeClass),scopeClass=_cssCls.scope[this.config.scope||_defaults.scope],$component.addClass(scopeClass),this},autoScroll:function autoScroll(){autoscroll(this.controls.$tree.find(_selectors.activeItem),this.controls.$tree)},update(map,context){const scopedMap=this.getScopedMap(map,context),testPart=mapHelper.getPart(map,context.testPartId),progression=scopedMap.stats||{questions:0,answered:0,flagged:0,viewed:0,total:0},totalQuestions=this.getProgressionTotal(progression,"questions");if(this.map=map,this.progression=progression,this.writeCount(this.controls.$infoAnswered,progression.answered,totalQuestions),this.writeCount(this.controls.$infoUnanswered,totalQuestions-progression.answered,totalQuestions),this.writeCount(this.controls.$infoViewed,progression.viewed,this.getProgressionTotal(progression,"total")),this.writeCount(this.controls.$infoFlagged,progression.flagged,totalQuestions),this.writeCount(this.controls.$infoAll,totalQuestions,null),!testPart.isLinear){this.controls.$filterBar.show(),this.controls.$linearState.hide(),this.controls.$tree.html(navigatorTreeTpl(scopedMap)),this.autoScroll();const activeItem=mapHelper.getActiveItem(scopedMap);this.setState("prevents-unseen",this.config.preventsUnseen);const isSkipaheadEnabled=activeItem&&activeItem.categories&&0<=_.indexOf(activeItem.categories,"x-tao-option-review-skipahead");this.setState("skipahead-enabled",isSkipaheadEnabled),this.config.preventsUnseen&&!isSkipaheadEnabled&&this.controls.$tree.find(_selectors.unseen).addClass(_cssCls.disabled)}else this.controls.$filterBar.hide(),this.controls.$linearState.show(),this.controls.$tree.empty();return this.filter(this.controls.$filters.filter(_selectors.actives).data("mode")),this.trigger("update"),this},getScopedMap:function getScopedMap(map,context){var scopedMap=mapHelper.getScopeMapFromContext(map,context,this.config.scope),testPart=mapHelper.getPart(scopedMap,context.testPartId)||{},section=mapHelper.getSection(scopedMap,context.sectionId)||{},item=mapHelper.getItem(scopedMap,context.itemIdentifier)||{};testPart.active=!0,section.active=!0,item.active=!0;let counter=0;return mapHelper.each(scopedMap,function(itm){var cls=[],icon="";itm.active&&cls.push("active"),itm.informational&&(cls.push("info"),icon=icon||"info"),itm.flagged&&(cls.push("flagged"),icon=icon||"flagged"),itm.answered&&(cls.push("answered"),icon=icon||"answered"),itm.viewed?(cls.push("viewed"),icon=icon||"viewed"):(cls.push("unseen"),icon=icon||"unseen"),itm.informational||(counter+=1,itm.numberTest=counter),itm.cls=cls.join(" "),itm.icon=icon})},writeCount:function writeCount($place,count,total){var display=0;$place.parent().hasClass("qti-navigator-tab")?display=Math.max(count,0):0c.destroy()),component.itemButtonListComponents=[],component.controls.$tree.find(_selectors.itemButtonListContainer).each((index,itemButtonListContainerElem)=>{const itemButtonListComponent=itemButtonListFactory({items:fizzyItemButtonMap.sections[index].items,scrollContainer:component.controls.$tree}).render(itemButtonListContainerElem).on("click",_ref=>{let{id}=_ref;return onItemClick(id)});component.itemButtonListComponents.push(itemButtonListComponent)}),component.itemButtonListComponents.forEach(c=>c.setActiveItem(activeItemId))}function getFizzyItemButtonMap(scopedMap,disableUnseenItems){const{displaySectionTitles,displayItemTooltip}=component.getConfig();let nonInformationalCount=0;const fizzyMap={sections:[]};return _.forEach(scopedMap.parts,function(part){_.forEach(part.sections,function(dataSection){let fizzySection;displaySectionTitles?(fizzySection={label:dataSection.label,items:[]},fizzyMap.sections.push(fizzySection)):fizzyMap.sections.length?fizzySection=fizzyMap.sections[0]:(fizzySection={items:[]},fizzyMap.sections.push(fizzySection)),_.forEach(dataSection.items,function(dataItem){dataItem.informational||nonInformationalCount++;const fizzyItem={id:dataItem.id,position:dataItem.position};fizzySection.items.push(fizzyItem),fizzyItem.numericLabel=dataItem.informational?"":`${nonInformationalCount}`,dataItem.informational?(fizzyItem.icon="info",fizzyItem.ariaLabel=__("Informational item")):dataItem.flagged?(fizzyItem.icon="flagged",fizzyItem.ariaLabel=__("Bookmarked question %s",nonInformationalCount)):(fizzyItem.icon=null,fizzyItem.ariaLabel=__("Question %s",nonInformationalCount)),fizzyItem.status=dataItem.answered?"answered":dataItem.viewed?"viewed":"unseen",disableUnseenItems&&!dataItem.viewed?fizzyItem.disabled=!0:displayItemTooltip&&(fizzyItem.title=dataItem.label)})})}),fizzyMap}let component;const navigatorApi={setItemFlag(position,flag){const updatedMap=_.cloneDeep(this.map),updatedItem=mapHelper.getItemAt(updatedMap,position);if(updatedItem&&updatedItem.id){updatedItem.flagged=flag;const updatedScopeMap=mapHelper.getScopeMapFromContext(updatedMap,this.testContext,this.config.scope),updatedFizzyMap=getFizzyItemButtonMap(updatedScopeMap,this.disableUnseenItems);let updatedItemData;_.forEach(updatedFizzyMap.sections,fizzySection=>{if(updatedItemData=_.find(fizzySection.items,fizzyItem=>fizzyItem.id===updatedItem.id),updatedItemData)return!1}),this.itemButtonListComponents.forEach(c=>c.updateItem(updatedItem.id,updatedItemData))}},updateConfig(){return this},update(map,context){const scopedMap=mapHelper.getScopeMapFromContext(map,context,this.config.scope);scopedMap.displaySectionTitles=this.getConfig().displaySectionTitles;const activeItemId=context.itemIdentifier,isSkipaheadEnabled=mapHelper.hasItemCategory(map,activeItemId,"x-tao-option-review-skipahead");this.map=map,this.testContext=context,this.disableUnseenItems=this.config.preventsUnseen&&!isSkipaheadEnabled;const testPart=mapHelper.getPart(map,context.testPartId);if(!testPart.isLinear){this.setState("skipahead-enabled",isSkipaheadEnabled),this.setState("prevents-unseen",this.config.preventsUnseen),this.controls.$linearState.hide(),this.controls.$tree.html(navigatorTreeTpl(scopedMap));const fizzyItemButtonMap=getFizzyItemButtonMap(scopedMap,this.disableUnseenItems);renderItemButtonListComponents(fizzyItemButtonMap,activeItemId)}else this.controls.$linearState.show(),this.controls.$tree.empty();return this.trigger("update"),this},select(position){let previousPosition=0;const previousItem=mapHelper.getItem(this.map,this.testContext.itemIdentifier);previousItem&&previousItem.id&&(previousPosition=previousItem.position);const item=mapHelper.getItemAt(this.map,parseInt(position));item&&item.id&&this.itemButtonListComponents.forEach(c=>c.setActiveItem(item.id)),this.trigger("selected",position,previousPosition)}};return component=componentFactory(navigatorApi,_defaults).setTemplate(navigatorTpl).on("init",function(){this.itemButtonListComponents=[]}).on("destroy",function(){this.controls=null,this.itemButtonListComponents.forEach(c=>c.destroy()),this.itemButtonListComponents=[]}).on("render",function(){const $component=this.getElement();this.controls={$tree:$component.find(_selectors.tree),$linearState:$component.find(_selectors.linearState),$closeButton:$component.find(_selectors.closeButton)},this.controls.$closeButton.on("click",function(e){e.preventDefault(),component.trigger("close")})}).on("enable",function(){this.itemButtonListComponents.forEach(c=>c.enable())}).on("disable",function(){this.itemButtonListComponents.forEach(c=>c.disable())}),component.init(config)}_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,componentFactory=componentFactory&&Object.prototype.hasOwnProperty.call(componentFactory,"default")?componentFactory["default"]:componentFactory,itemButtonListFactory=itemButtonListFactory&&Object.prototype.hasOwnProperty.call(itemButtonListFactory,"default")?itemButtonListFactory["default"]:itemButtonListFactory,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){return" hidden"}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",self=this,helperMissing=helpers.helperMissing,escapeExpression=this.escapeExpression,stack1,helper,options;return buffer+="
          \n
          \n
          "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Test overview",options):helperMissing.call(depth0,"__","Test overview",options)))+"
          \n \n
          \n \n
          \n

          \n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"In this part of the test navigation is not allowed.",options):helperMissing.call(depth0,"__","In this part of the test navigation is not allowed.",options)))+"\n

          \n
          \n
          \n",buffer});Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template$1=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var buffer="",stack1;return buffer+="\n ",stack1=helpers.each.call(depth0,depth0&&depth0.parts,{hash:{},inverse:self.noop,fn:self.program(2,program2,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n",buffer}function program2(depth0,data){var buffer="",stack1;return buffer+="\n ",stack1=helpers.each.call(depth0,depth0&&depth0.sections,{hash:{},inverse:self.noop,fn:self.program(3,program3,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",buffer}function program3(depth0,data){var buffer="",stack1,helper;return buffer+="\n
        • \n
          \n ",(helper=helpers.label)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.label,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\n
          \n
          \n
        • \n ",buffer}function program5(depth0,data){return"\n
        • \n
          \n
        • \n"}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",functionType="function",escapeExpression=this.escapeExpression,self=this,stack1;return buffer+="
            \n",stack1=helpers["if"].call(depth0,depth0&&depth0.displaySectionTitles,{hash:{},inverse:self.program(5,program5,data),fn:self.program(1,program1,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n
          \n",buffer});const _defaults={scope:"test",preventsUnseen:!0},_selectors={component:".qti-navigator",tree:".qti-navigator-tree",linearState:".qti-navigator-linear",closeButton:".icon-close",itemButtonListContainer:".qti-navigator-items"};return navigatorFactory}),define("taoQtiTest/runner/plugins/navigation/review/review",["lodash","i18n","ui/hider","util/shortcut","util/namespace","taoTests/runner/plugin","taoQtiTest/runner/helpers/map","taoQtiTest/runner/plugins/navigation/review/navigator","taoQtiTest/runner/plugins/navigation/review/navigatorFizzy"],function(_,__,hider,shortcut,namespaceHelper,pluginFactory,mapHelper,defaultNavigatorFactory,fizzyNavigatorFactory){"use strict";function isItemFlagged(testMap,position){const item=mapHelper.getItemAt(testMap,position);return!!item.flagged}function updateButton(button,data){var $button=button.getElement();button.is("rendered")&&$button.data("control")!==data.control&&($button.data("control",data.control).attr("title",data.title),$button.find(".icon").attr("class",`icon icon-${data.icon}`),$button.find(".text").text(data.text),(data.control.includes("flag")||data.control.includes("overview"))&&(button.is("active")?button.turnOff():button.turnOn()))}function canFlag(testRunner){const testContext=testRunner.getTestContext(),testMap=testRunner.getTestMap(),item=testRunner.getCurrentItem(),testPart=testRunner.getCurrentPart(),markReviewCategory=mapHelper.hasItemCategory(testMap,testContext.itemIdentifier,"markReview",!0);return!(testPart.isLinear||!markReviewCategory||item&&item.informational)}_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,shortcut=shortcut&&Object.prototype.hasOwnProperty.call(shortcut,"default")?shortcut["default"]:shortcut,namespaceHelper=namespaceHelper&&Object.prototype.hasOwnProperty.call(namespaceHelper,"default")?namespaceHelper["default"]:namespaceHelper,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper,defaultNavigatorFactory=defaultNavigatorFactory&&Object.prototype.hasOwnProperty.call(defaultNavigatorFactory,"default")?defaultNavigatorFactory["default"]:defaultNavigatorFactory,fizzyNavigatorFactory=fizzyNavigatorFactory&&Object.prototype.hasOwnProperty.call(fizzyNavigatorFactory,"default")?fizzyNavigatorFactory["default"]:fizzyNavigatorFactory;var buttonData={setFlag:{control:"set-item-flag",title:__("Flag the current item for later review"),icon:"anchor",text:__("Flag for Review")},unsetFlag:{control:"unset-item-flag",title:__("Do not flag the current item for later review"),icon:"anchor",text:__("Unflag for Review")},setFlagBookmarked:{control:"set-item-flag",title:__("Bookmark the current question for later review"),icon:"bookmark",text:__("Bookmark question")},unsetFlagBookmarked:{control:"unset-item-flag",title:__("Do not bookmark the current question for later review"),icon:"bookmark-outline",text:__("Bookmark question")},showReview:{control:"show-review",title:__("Show the review screen"),icon:"right",text:__("Show Review")},hideReview:{control:"hide-review",title:__("Hide the review screen"),icon:"left",text:__("Hide Review")},showTestOverview:{control:"show-test-overview",title:__("Show test overview panel"),icon:"desktop-preview",text:__("Test overview")},hideTestOverview:{control:"hide-test-overview",title:__("Hide test overview panel"),icon:"desktop-preview",text:__("Test overview")}},review=pluginFactory({name:"review",init:function init(){function getFlagItemButtonData(flag){let dataType=flag?"unsetFlag":"setFlag";return self.isFizzyLayout&&(dataType=flag?"unsetFlagBookmarked":"setFlagBookmarked"),buttonData[dataType]}function getToggleButtonData(navigator){let dataType=navigator.is("hidden")?"showReview":"hideReview";return self.isFizzyLayout&&(dataType=navigator.is("hidden")?"showTestOverview":"hideTestOverview"),buttonData[dataType]}function getReviewCategories(){const currentContext=testRunner.getTestContext(),currentMap=testRunner.getTestMap();return{reviewScreen:mapHelper.hasItemCategory(currentMap,currentContext.itemIdentifier,"reviewScreen",!0),markReview:mapHelper.hasItemCategory(currentMap,currentContext.itemIdentifier,"markReview",!0)}}function isPluginAllowed(){const categories=getReviewCategories();return navigatorConfig.enabled&&categories.reviewScreen}function flagItem(position,flag){return self.disable(),testRunner.getProxy().callTestAction("flagItem",{position,flag}).then(function(){const item=mapHelper.getItemAt(testRunner.getTestMap(),position);item.flagged=flag,updateButton(self.flagItemButton,getFlagItemButtonData(flag)),self.navigator.setItemFlag(position,flag),self.enable()}).catch(function(){self.navigator.setItemFlag(position,!flag),self.enable()})}function flagCurrentItem(){if(!1!==self.getState("enabled")){const itemPosition=testRunner.getTestContext().itemPosition,flagStatus=isItemFlagged(testRunner.getTestMap(),itemPosition);flagItem(itemPosition,!flagStatus)}}function togglePanel(forcedState){var isHidden=_.isUndefined(forcedState)?self.navigator.is("hidden"):forcedState;isHidden?(self.explicitlyHidden=!1,self.navigator.show()):(self.explicitlyHidden=!0,self.navigator.hide()),updateButton(self.toggleButton,getToggleButtonData(self.navigator))}const self=this,testRunner=this.getTestRunner(),testContext=testRunner.getTestContext(),testMap=testRunner.getTestMap(),testRunnerOptions=testRunner.getOptions(),pluginShortcuts=(testRunnerOptions.shortcuts||{})[this.getName()]||{},pluginConfig=this.getConfig();let navigatorConfig=testRunnerOptions.review||{defaultOpen:!1};navigatorConfig=Object.assign({},navigatorConfig,pluginConfig),this.isFizzyLayout=navigatorConfig&&"fizzy"===navigatorConfig.reviewLayout;let previousItemPosition;const navigatorFactory=this.isFizzyLayout?fizzyNavigatorFactory:defaultNavigatorFactory;this.navigator=navigatorFactory(navigatorConfig).on("selected",function(position,previousPosition){previousItemPosition=previousPosition}).on("jump",function(position){!1!==self.getState("enabled")&&(self.disable(),testRunner.jump(position,"item"))}).on("flag",function(position,flag){!1!==self.getState("enabled")&&flagItem(position,flag)}).on("close",function(){testRunner.trigger("tool-reviewpanel")}).render(),testRunner.on("alert.notallowed",function(){self.navigator.select(previousItemPosition)}),this.explicitlyHidden=!1,this.toggleButton=this.getAreaBroker().getToolbox().createEntry(getToggleButtonData(this.navigator)),this.toggleButton.on("click",function(e){e.preventDefault(),testRunner.trigger("tool-reviewpanel")}),this.flagItemButton=this.getAreaBroker().getToolbox().createEntry(getFlagItemButtonData(isItemFlagged(testMap,testContext.itemPosition))),this.flagItemButton.on("click",function(e){e.preventDefault(),testRunner.trigger("tool-flagitem")}),testRunnerOptions.allowShortcuts&&(pluginShortcuts.flag&&shortcut.add(namespaceHelper.namespaceAll(pluginShortcuts.flag,this.getName(),!0),function(){testRunner.trigger("tool-flagitem")},{avoidInput:!0}),pluginShortcuts.toggle&&shortcut.add(namespaceHelper.namespaceAll(pluginShortcuts.toggle,this.getName(),!0),function(){testRunner.trigger("tool-reviewpanel")},{avoidInput:!0})),isPluginAllowed()||this.hide(),this.disable(),togglePanel(navigatorConfig.defaultOpen),testRunner.on("render",function(){isPluginAllowed()?(self.show(),updateButton(self.toggleButton,getToggleButtonData(self.navigator))):self.hide()}).on("loaditem",function(){const context=testRunner.getTestContext(),map=testRunner.getTestMap(),testPart=testRunner.getCurrentPart(),categories=getReviewCategories();isPluginAllowed()?(updateButton(self.flagItemButton,getFlagItemButtonData(isItemFlagged(map,context.itemPosition))),self.navigator.update(map,context).updateConfig({canFlag:!testPart.isLinear&&categories.markReview}),self.show(),updateButton(self.toggleButton,getToggleButtonData(self.navigator))):self.hide()}).on("enabletools enablenav",function(){isPluginAllowed()&&self.enable()}).on("disabletools disablenav",function(){isPluginAllowed()&&self.disable()}).on("hidenav",function(){self.hide()}).on("shownav",function(){isPluginAllowed()&&self.show()}).on("tool-flagitem",function(){isPluginAllowed()&&canFlag(testRunner)&&flagCurrentItem()}).on("tool-reviewpanel",function(){isPluginAllowed()&&self.getState("enabled")&&togglePanel()})},render:function render(){var areaBroker=this.getAreaBroker(),$panelContainer=areaBroker.getPanelArea();$panelContainer.append(this.navigator.getElement())},destroy:function destroy(){shortcut.remove(`.${this.getName()}`),this.navigator.destroy()},enable:function enable(){const testRunner=this.getTestRunner(),testContext=testRunner.getTestContext(),testMap=testRunner.getTestMap();this.flagItemButton.enable(),this.toggleButton.enable(),this.navigator.enable(),isItemFlagged(testMap,testContext.itemPosition)?this.flagItemButton.turnOn():this.flagItemButton.turnOff(),this.isFizzyLayout&&(this.explicitlyHidden?this.toggleButton.turnOff():this.toggleButton.turnOn())},disable:function disable(){this.flagItemButton.disable(),this.flagItemButton.turnOff(),this.toggleButton.disable(),this.isFizzyLayout&&this.toggleButton.turnOff(),this.navigator.disable()},show:function show(){var testRunner=this.getTestRunner();canFlag(testRunner)?this.flagItemButton.show():this.flagItemButton.hide(),this.toggleButton.show(),this.explicitlyHidden?this.navigator.hide():this.navigator.show()},hide:function hide(){this.flagItemButton.hide(),this.toggleButton.hide(),this.navigator.hide()}});return review}),define("taoQtiTest/runner/plugins/navigation/skip",["jquery","i18n","ui/hider","taoTests/runner/plugin","taoQtiTest/runner/helpers/messages","handlebars","lib/handlebars/helpers","taoQtiTest/runner/helpers/navigation","taoQtiTest/runner/helpers/map"],function($$1,__,hider,pluginFactory,messages,Handlebars,Helpers0,navigationHelper,mapHelper){"use strict";function buttonTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}$$1=$$1&&Object.prototype.hasOwnProperty.call($$1,"default")?$$1["default"]:$$1,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,hider=hider&&Object.prototype.hasOwnProperty.call(hider,"default")?hider["default"]:hider,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,messages=messages&&Object.prototype.hasOwnProperty.call(messages,"default")?messages["default"]:messages,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,navigationHelper=navigationHelper&&Object.prototype.hasOwnProperty.call(navigationHelper,"default")?navigationHelper["default"]:navigationHelper,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var buffer="",stack1,helper;return buffer+=" ",(helper=helpers.className)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.className,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1),buffer}function program3(depth0,data){var buffer="",stack1;return buffer+="\n aria-"+escapeExpression((stack1=null==data||!1===data?data:data.key,"function"===typeof stack1?stack1.apply(depth0):stack1))+"=\""+escapeExpression("function"===typeof depth0?depth0.apply(depth0):depth0)+"\"\n ",buffer}function program5(depth0,data){var buffer="",stack1,helper;return buffer+="",buffer}function program6(depth0,data){return" no-label"}function program8(depth0,data){var buffer="",stack1,helper;return buffer+="",(helper=helpers.text)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.text,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",functionType="function",escapeExpression=this.escapeExpression,self=this,stack1,helper;return buffer+="\n \n ",stack1=helpers["if"].call(depth0,depth0&&depth0.icon,{hash:{},inverse:self.noop,fn:self.program(5,program5,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.text,{hash:{},inverse:self.noop,fn:self.program(8,program8,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n \n\n",buffer}),buttonData={skip:{control:"skip",title:__("Skip and go to the next item"),icon:"external",text:__("Skip")},end:{control:"skip-end",title:__("Skip and go to the end of the test"),icon:"external",text:__("Skip and end test")}},createElement=function createElement(testRunner){const testContext=testRunner.getTestContext(),testMap=testRunner.getTestMap(),isLast=navigationHelper.isLast(testMap,testContext.itemIdentifier),dataType=isLast?"end":"skip";return $$1(buttonTpl(buttonData[dataType]))};const updateElement=function updateElement($element){let isLast=!!(1{const testContext=testRunner.getTestContext();return!0===testContext.allowSkipping?(this.show(),!0):(this.hide(),!1)};this.$element=createElement(testRunner),this.$element.on("click",e=>{const enable=this.enable.bind(this),testContext=testRunner.getTestContext(),testMap=testRunner.getTestMap(),isLast=navigationHelper.isLast(testMap,testContext.itemIdentifier),endTestWarning=mapHelper.hasItemCategory(testMap,testContext.itemIdentifier,"endTestWarning",!0);e.preventDefault(),!1!==this.getState("enabled")&&(this.disable(),endTestWarning&&isLast?testRunner.trigger("confirm.endTest",messages.getExitMessage("test",testRunner),doSkip,enable):doSkip())}),toggle(),this.disable(),testRunner.on("loaditem",()=>{if(toggle()){const testContext=testRunner.getTestContext(),testMap=testRunner.getTestMap(),isLast=navigationHelper.isLast(testMap,testContext.itemIdentifier);updateElement(this.$element,isLast)}}).on("enablenav",()=>this.enable()).on("disablenav",()=>this.disable()).on("hidenav",()=>this.hide()).on("shownav",()=>this.show())},render:function render(){var $container=this.getAreaBroker().getNavigationArea();$container.append(this.$element)},destroy:function destroy(){this.$element.remove()},enable:function enable(){this.$element.removeProp("disabled").removeClass("disabled")},disable:function disable(){this.$element.prop("disabled",!0).addClass("disabled")},show:function show(){hider.show(this.$element)},hide:function hide(){hider.hide(this.$element)}});return skip}),define("taoQtiTest/runner/plugins/navigation/validateResponses",["lodash","i18n","taoTests/runner/plugin","taoQtiTest/runner/helpers/currentItem"],function(_,__,pluginFactory,currentItemHelper){"use strict";_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,currentItemHelper=currentItemHelper&&Object.prototype.hasOwnProperty.call(currentItemHelper,"default")?currentItemHelper["default"]:currentItemHelper;var pluginName="validateResponses",validateResponses=pluginFactory({name:"validateResponses",init(){const testRunner=this.getTestRunner(),testRunnerOptions=testRunner.getOptions(),pluginConfig=this.getConfig();return testRunner.before("move",(e,direction)=>{const testContext=testRunner.getTestContext(),isInteracting=!testRunner.getItemState(testContext.itemIdentifier,"disabled");if(!pluginConfig.validateOnPreviousMove&&"previous"===direction)return Promise.resolve();if(isInteracting&&testRunnerOptions.enableValidateResponses){const currenItem=testRunner.getCurrentItem(),validateResponses="boolean"==typeof currenItem.validateResponses?currenItem.validateResponses:testContext.validateResponses;if(validateResponses)return new Promise((resolve,reject)=>0===_.size(currentItemHelper.getDeclarations(testRunner))?resolve():currentItemHelper.isAnswered(testRunner,!1)?resolve():void(!testRunner.getState("alerted.notallowed")&&(testRunner.setState("alerted.notallowed",!0),testRunner.trigger("alert.notallowed",__("A valid response to this item is required."),()=>{testRunner.trigger("resumeitem"),reject(),testRunner.setState("alerted.notallowed",!1)}))))}}),this}});return validateResponses}),define("taoQtiTest/runner/plugins/navigation/warnBeforeLeaving",["i18n","taoTests/runner/plugin"],function(__,pluginFactory){"use strict";__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory;var warnMessage=__("Please confirm you want to leave the test."),warnListener=function warnListener(e){return e.returnValue=warnMessage,warnMessage},warnBeforeLeaving=pluginFactory({name:"warnBeforeLeaving",init:function init(){this.enable()},destroy:function destroy(){this.disable()},enable:function enable(){window.addEventListener("beforeunload",warnListener)},disable:function disable(){window.removeEventListener("beforeunload",warnListener)}});return warnBeforeLeaving}),define("taoQtiTest/runner/plugins/security/disableRightClick",["taoTests/runner/plugin"],function(pluginFactory){"use strict";pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory;var disableRightClick=pluginFactory({name:"disableRightClick",init:function init(){var rightClickEvents=["contextmenu","mousedown","mouseup"];rightClickEvents.forEach(function(eventName){window.document.addEventListener(eventName,function disableRightClick(event){2===event.button&&event.preventDefault()})})}});return disableRightClick}),define("taoQtiTest/runner/plugins/tools/answerElimination/eliminator",["lodash","i18n","ui/hider","util/shortcut","util/namespace","taoQtiTest/runner/helpers/map","taoTests/runner/plugin"],function(_,__,hider,shortcut,namespaceHelper,mapHelper,pluginFactory){"use strict";_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,shortcut=shortcut&&Object.prototype.hasOwnProperty.call(shortcut,"default")?shortcut["default"]:shortcut,namespaceHelper=namespaceHelper&&Object.prototype.hasOwnProperty.call(namespaceHelper,"default")?namespaceHelper["default"]:namespaceHelper,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory;var pluginName="eliminator",actionPrefix=`tool-${"eliminator"}-`,defaultConfig={removeEliminationsOnClose:!1,restoreEliminationsOnOpen:!1},eliminator=pluginFactory({name:"eliminator",init(){function isPluginEnabled(){return mapHelper.hasItemCategory(testRunner.getTestMap(),testRunner.getTestContext().itemIdentifier,"eliminator",!0)}function togglePluginButton(){isPluginEnabled()?self.show():self.hide()}function togglePlugin(){self.$choiceInteractions&&(self.$choiceInteractions.toggleClass("eliminable"),isEliminable()?enableEliminator():disableEliminator())}function isEliminable(){return self.$choiceInteractions?self.$choiceInteractions.hasClass("eliminable"):void 0}function enableEliminator(){var $choices;self.$choiceInteractions&&($choices=self.$choiceInteractions.find(".qti-choice"),self.button.turnOn(),self.trigger("start"),config.restoreEliminationsOnOpen&&$choices.each(function(){var input=this.querySelector(".real-label input");this.dataset.wasEliminated&&(this.dataset.wasEliminated=null,this.classList.add("eliminated"),input.setAttribute("disabled","disabled"),input.checked=!1)}))}function disableEliminator(){var $choices;self.$choiceInteractions&&($choices=self.$choiceInteractions.find(".qti-choice"),self.$choiceInteractions.removeClass("eliminable"),self.button.turnOff(),self.trigger("end"),$choices.each(function(){this.classList.contains("eliminated")&&(this.dataset.wasEliminated=!0,this.classList.remove("eliminated"),this.querySelector(".real-label input").removeAttribute("disabled"))}))}const self=this,testRunner=this.getTestRunner(),$container=testRunner.getAreaBroker().getContentArea().parent(),testRunnerOptions=testRunner.getOptions(),pluginShortcuts=(testRunnerOptions.shortcuts||{}).eliminator||{},config=Object.assign({},defaultConfig,this.getConfig());this.button=this.getAreaBroker().getToolbox().createEntry({control:"eliminator",title:__("Eliminate choices"),icon:"eliminate",text:__("Answer Eliminator")}),this.button.on("click",function(e){e.preventDefault(),testRunner.trigger(`${actionPrefix}toggle`)}),testRunnerOptions.allowShortcuts&&_.forEach(pluginShortcuts,function(command,key){shortcut.add(namespaceHelper.namespaceAll(command,"eliminator",!0),function(){testRunner.trigger(actionPrefix+key)},{avoidInput:!0})}),this.disable(),testRunner.on("loaditem",togglePluginButton).on("renderitem",function conditionalInit(){return self.$choiceInteractions=$container.find(".qti-choiceInteraction"),self.$choiceInteractions.length?void(isPluginEnabled()&&self.show()):void self.hide()}).on("enabletools renderitem",function(){self.enable()}).on("disabletools unloaditem",function(){self.disable(),disableEliminator()}).on(`${actionPrefix}toggle`,function(){isPluginEnabled()&&togglePlugin()}).on("tool-answer-masking-toggle",function(){isEliminable()&&disableEliminator()})},destroy:function destroy(){shortcut.remove(`.${"eliminator"}`)},enable:function enable(){this.button.enable()},disable:function disable(){this.button.disable()},show:function show(){this.button.show()},hide:function hide(){this.button.hide()}});return eliminator}),define("taoQtiTest/runner/plugins/tools/answerMasking/answerMasking",["lodash","jquery","core/statifier","ui/component","handlebars","lib/handlebars/helpers"],function(_,$$1,statifier,componentFactory,Handlebars,Helpers0){"use strict";function maskTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}function answerMaskingFactory($contentArea){function createMask($container){return componentFactory(maskApi).setTemplate(maskTpl).on("render",function(){var self=this,$component=this.getElement();$component.on(`click${".answerMasking"}`,function(e){e.stopPropagation(),e.preventDefault(),self.toggle()})}).on("destroy",function(){var $component=this.getElement();$component.off(".answerMasking")}).init().render($container).mask()}var allMasks=[],maskApi={toggle:function toggle(){return this.is("masked")?this.reveal():this.mask()},reveal:function reveal(){var $container=this.getContainer();return $container.removeClass("masked"),$container.find("input").removeAttr("disabled"),this.setState("masked",!1),this},mask:function mask(){var $container=this.getContainer();return $container.addClass("masked"),$container.find("input").attr("disabled","disabled"),this.setState("masked",!0),this}},answerMasking;return answerMasking={enable:function enable(){var $choiceInteractions=$contentArea.find(".qti-choiceInteraction"),$qtiChoices=$contentArea.find(".qti-choice");allMasks=[],$choiceInteractions.addClass("maskable"),$qtiChoices.each(function(){var $choice=$$1(this);allMasks.push(createMask($choice))}),this.setState("enabled",!0)},disable:function disable(){var $choiceInteractions=$contentArea.find(".qti-choiceInteraction");$choiceInteractions.removeClass("maskable"),allMasks.forEach(function(mask){mask.reveal(),mask.destroy()}),allMasks=[],this.setState("enabled",!1)},getMasksState:function getMasksState(){var state=allMasks.map(function(mask){return mask.is("masked")});return state},setMasksState:function setMasksState(state){state=state||[],state.forEach(function(masked,index){var mask=allMasks[index];_.isObject(mask)&&_.isFunction(mask.reveal)&&!masked&&mask.reveal()})}},statifier(answerMasking),answerMasking}_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,$$1=$$1&&Object.prototype.hasOwnProperty.call($$1,"default")?$$1["default"]:$$1,statifier=statifier&&Object.prototype.hasOwnProperty.call(statifier,"default")?statifier["default"]:statifier,componentFactory=componentFactory&&Object.prototype.hasOwnProperty.call(componentFactory,"default")?componentFactory["default"]:componentFactory,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){return this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),"
          \n \n
          "}),ns=".answerMasking";return answerMaskingFactory}),define("taoQtiTest/runner/plugins/tools/answerMasking/plugin",["i18n","taoTests/runner/plugin","ui/hider","util/shortcut","util/namespace","taoQtiTest/runner/helpers/map","taoQtiTest/runner/plugins/tools/answerMasking/answerMasking"],function(__,pluginFactory,hider,shortcut,namespaceHelper,mapHelper,answerMaskingFactory){"use strict";__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,shortcut=shortcut&&Object.prototype.hasOwnProperty.call(shortcut,"default")?shortcut["default"]:shortcut,namespaceHelper=namespaceHelper&&Object.prototype.hasOwnProperty.call(namespaceHelper,"default")?namespaceHelper["default"]:namespaceHelper,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper,answerMaskingFactory=answerMaskingFactory&&Object.prototype.hasOwnProperty.call(answerMaskingFactory,"default")?answerMaskingFactory["default"]:answerMaskingFactory;var pluginName="answer-masking",actionPrefix=`tool-${"answer-masking"}-`,itemStates={},defaultConfig={restoreStateOnToggle:!0,restoreStateOnMove:!0},plugin=pluginFactory({name:"answer-masking",init:function init(){function isPluginEnabled(){const answerMaskingCategory=mapHelper.hasItemCategory(testRunner.getTestMap(),testRunner.getTestContext().itemIdentifier,"answerMasking",!0);return answerMaskingCategory&&itemContainsChoiceInteraction()}function itemContainsChoiceInteraction(){var $container=self.getAreaBroker().getContentArea().parent();return $container.find(".qti-choiceInteraction").length}function togglePluginButton(){isPluginEnabled()?self.show():self.hide()}function togglePlugin(){answerMasking.getState("enabled")?disableMasking():enableMasking()}function enableMasking(){var testContext=testRunner.getTestContext(),itemId=testContext.itemIdentifier;answerMasking.enable(),pluginConfig.restoreStateOnToggle&&answerMasking.setMasksState(itemStates[itemId]),self.button.turnOn(),self.trigger("start")}function disableMasking(){var testContext=testRunner.getTestContext(),itemId=testContext.itemIdentifier;answerMasking.getState("enabled")&&(itemStates[itemId]=answerMasking.getMasksState()),answerMasking.disable(),self.button.turnOff(),self.trigger("end")}const self=this,testRunner=this.getTestRunner(),testRunnerOptions=testRunner.getOptions(),pluginConfig=Object.assign({},defaultConfig,this.getConfig()),pluginShortcuts=(testRunnerOptions.shortcuts||{})["answer-masking"]||{},$contentArea=this.getAreaBroker().getContentArea();var answerMasking=answerMaskingFactory($contentArea);this.button=this.getAreaBroker().getToolbox().createEntry({title:__("Answer Masking"),icon:"result-nok",control:"answer-masking",text:__("Answer Masking")}),this.button.on("click",function(e){e.preventDefault(),testRunner.trigger(`${actionPrefix}toggle`)}),testRunnerOptions.allowShortcuts&&pluginShortcuts.toggle&&shortcut.add(namespaceHelper.namespaceAll(pluginShortcuts.toggle,this.getName(),!0),function(){testRunner.trigger(`${actionPrefix}toggle`)},{avoidInput:!0,prevent:!0}),this.disable(),testRunner.on("loaditem",function(){var testContext=testRunner.getTestContext(),itemId=testContext.itemIdentifier;pluginConfig.restoreStateOnMove||(itemStates[itemId]=[]),togglePluginButton()}).on("enabletools renderitem",function(){togglePluginButton(),self.enable()}).on("beforeunloaditem",function(){disableMasking()}).on("disabletools unloaditem",function(){self.disable(),disableMasking()}).on(`${actionPrefix}toggle`,function(){isPluginEnabled()&&togglePlugin()}).on("tool-eliminator-toggle",function(){disableMasking()})},destroy:function destroy(){shortcut.remove(`.${this.getName()}`)},enable:function enable(){this.button.enable()},disable:function disable(){this.button.disable()},show:function show(){this.button.show()},hide:function hide(){this.button.hide()}});return plugin}),define("taoQtiTest/runner/plugins/tools/apipTextToSpeech/textToSpeech",["jquery","i18n","handlebars","lib/handlebars/helpers","ui/component","interact","ui/component/stackable","ui/component/placeable","ui/feedback","nouislider"],function($$1,__,Handlebars,Helpers0,component,interact,makeStackable,makePlaceable,feedback,nouislider){"use strict";function ttsTemplate(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}function maskingComponentFactory(container,config){const audio=new Audio;let currentPlayback=[],mediaContentData=[],currentItem,playbackRate;const selection=window.getSelection&&window.getSelection(),spec={clearAPIPElements(){const{elementClass}=this.config,$contentNodes=$$1(mediaContentData.map(_ref=>{let{selector}=_ref;return selector}).join(", "),container);$contentNodes.removeClass(elementClass),$contentNodes.off("click",this.handleContentNodeClick)},close(){this.setTTSStateOnContainer("playing",!1),this.setTTSStateOnContainer("sfhMode",!1),this.setState("settings",!1),this.stop(),this.trigger("close")},getCurrentItem(){return currentItem},handleContentNodeClick(e){const $target=$$1(e.target);if($target.hasClass("icon-checkbox")||$target.hasClass("icon-radio")||$target.is("input"))return;if(e.stopPropagation(),e.preventDefault(),!this.is("sfhMode"))return;const $currentTarget=$$1(e.currentTarget),selectedItemIndex=mediaContentData.findIndex(_ref2=>{let{selector}=_ref2;return $currentTarget.is(selector)});currentPlayback=mediaContentData.slice(selectedItemIndex),this.stop(),this.initNextItem(),this.togglePlayback()},initDefaultModeItem(){this.initItemWithTextSelection(),currentItem||this.initDefaultModePlayback()},initItemWithTextSelection(){if(this.is("sfhMode")||!selection||!selection.toString())return;const currentSelection=selection.getRangeAt(0),{commonAncestorContainer}=currentSelection,selectedItem=mediaContentData.find(_ref3=>{let{selector}=_ref3;const $item=$$1(selector,container);return $item.is(commonAncestorContainer)||$$1.contains($item[0],commonAncestorContainer)});selectedItem&&selectedItem!==currentItem&&(currentPlayback=[selectedItem],this.initNextItem())},initNextItem(){const{activeElementClass}=this.config;if(currentItem&&$$1(currentItem.selector,container).removeClass(activeElementClass),currentItem=currentPlayback.shift(),currentItem){const{selector,url}=currentItem;return $$1(selector,container).addClass(activeElementClass),audio.setAttribute("src",url),audio.load(),audio.playbackRate=playbackRate,this.is("playing")&&audio.play(),void this.trigger("next")}this.trigger("finish"),this.stop()},initDefaultModePlayback(){currentPlayback=[...mediaContentData],this.initNextItem()},setMediaContentData(data){this.clearAPIPElements();const{elementClass}=this.config;mediaContentData=data;const $contentNodes=$$1(mediaContentData.map(_ref4=>{let{selector}=_ref4;return selector}).join(", "),container);$contentNodes.addClass(elementClass),$contentNodes.on("click",this.handleContentNodeClick),this.stop()},setPlaybackRate(e,value){playbackRate=value,audio.playbackRate=value},setTTSStateOnContainer(name,value){this.setState(name,value),$$1(container).toggleClass(`tts-${name}`,value)},stop(){const{activeElementClass}=this.config;audio.pause(),audio.currentTime=0,currentItem&&$$1(currentItem.selector,container).removeClass(activeElementClass),currentItem=null,this.setTTSStateOnContainer("playing",!1)},togglePlayback(e){e&&e.preventDefault();const isPlaying=this.is("playing");this.initDefaultModeItem(),!isPlaying&¤tItem?(audio.play(),this.setTTSStateOnContainer("playing",!0)):(audio.pause(),this.setTTSStateOnContainer("playing",!1))},toggleSFHMode(){const isSFHMode=this.is("sfhMode");this.setTTSStateOnContainer("sfhMode",!isSFHMode),this.stop()},toggleSettings(){const isSettings=this.is("settings");this.setState("settings",!isSettings),isSettings||this.handleResize()},handleResize(){const offsetFromRight=10,{x,y}=this.getPosition(),maxXPosition=window.innerWidth-this.getElement().width()-10;this.moveTo(x>maxXPosition?maxXPosition:x,y)}},ttsComponent=component(spec,defaultConfig);return makePlaceable(ttsComponent),makeStackable(ttsComponent,stackingOptions),ttsComponent.setTemplate(ttsTemplate).on("init",function(){if(container.hasClass("tts-component-container"))throw new Error("Container already has assigned text to speech component");container.addClass("tts-component-container"),this.render(container)}).on("render",function(){let{left,maxPlaybackRate,minPlaybackRate,playbackRate:defaultPlaybackRate,top}=this.getConfig();0>left&&(left=window.innerWidth-this.getElement().width()+left);const $element=this.getElement(),$closeElement=$$1(".tts-control-close",$element),$dragElement=$$1(".tts-control-drag",$element),$playbackElement=$$1(".tts-control-playback",$element),$sfhModeElement=$$1(".tts-control-mode",$element),$sliderElement=$$1(".tts-slider",$element),$settingsElement=$$1(".tts-control-settings",$element);playbackRate=defaultPlaybackRate,$element.css("touch-action","none");const interactElement=interact($element).draggable({autoScroll:!0,manualStart:!0,restrict:{restriction:container[0],elementRect:{left:0,right:1,top:0,bottom:1}},onmove:event=>{var _Mathround=Math.round;const xOffset=_Mathround(event.dx),yOffset=_Mathround(event.dy);this.moveBy(xOffset,yOffset)}});interact($dragElement[0]).on("down",event=>{const interaction=event.interaction;interaction.start({name:"drag"},interactElement,$element[0])}),$sliderElement.noUiSlider({animate:!0,connected:!0,range:{min:minPlaybackRate,max:maxPlaybackRate},start:defaultPlaybackRate,step:.1}).on("change",this.setPlaybackRate),$closeElement.on("click",this.close),$playbackElement.on("mousedown touchstart",this.togglePlayback),$sfhModeElement.on("click",this.toggleSFHMode),$settingsElement.on("click",this.toggleSettings),audio.addEventListener("ended",this.initNextItem),audio.addEventListener("error",()=>{feedback().error(__("Can not playback media file!")),this.initNextItem()}),window.addEventListener("resize",this.handleResize),this.moveTo(left,top)}).on("hide",function(){this.setTTSStateOnContainer("visible",!1)}).on("show",function(){this.setTTSStateOnContainer("visible",!0)}).on("destroy",function(){container.removeClass("tts-component-container"),this.clearAPIPElements(),this.stop(),window.removeEventListener("resize",this.handleResize)}),ttsComponent.init(config),ttsComponent}$$1=$$1&&Object.prototype.hasOwnProperty.call($$1,"default")?$$1["default"]:$$1,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,component=component&&Object.prototype.hasOwnProperty.call(component,"default")?component["default"]:component,interact=interact&&Object.prototype.hasOwnProperty.call(interact,"default")?interact["default"]:interact,makeStackable=makeStackable&&Object.prototype.hasOwnProperty.call(makeStackable,"default")?makeStackable["default"]:makeStackable,makePlaceable=makePlaceable&&Object.prototype.hasOwnProperty.call(makePlaceable,"default")?makePlaceable["default"]:makePlaceable,feedback=feedback&&Object.prototype.hasOwnProperty.call(feedback,"default")?feedback["default"]:feedback,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",helperMissing=helpers.helperMissing,escapeExpression=this.escapeExpression,helper,options;return buffer+="
          \n
          \n
          \n \n \n \n
          \n \n
          \n \n \n \n \n
          \n
          \n \n \n \n
          \n
          \n \n \n \n
          \n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Speed",options):helperMissing.call(depth0,"__","Speed",options)))+"
          \n
          \n
          \n
          \n
          \n",buffer});const defaultConfig={activeElementClass:"tts-active-content-node",elementClass:"tts-content-node",left:-10,maxPlaybackRate:2,minPlaybackRate:.5,playbackRate:1,top:50},stackingOptions={stackingScope:"test-runner"};return maskingComponentFactory}),define("taoQtiTest/runner/plugins/tools/apipTextToSpeech/ttsApipDataProvider",[],function(){"use strict";const getTTSItemData=apipElement=>{const{identifier}=apipElement["@attributes"],{contentLinkInfo={"@attributes":{}},relatedElementInfo:{spoken:{audioFileInfo=[]}={}}={}}=apipElement,{fileHref=""}=audioFileInfo.find(audioFile=>"audio/mpeg"===audioFile["@attributes"].mimeType)||{},elementId=contentLinkInfo["@attributes"].qtiLinkIdentifierRef;return{identifier,selector:elementId&&`#${elementId}`,url:fileHref.replace("assets/","")}},getTTSItemOrder=(identifier,elementOrder)=>{const{order}=elementOrder.find(apipElementOrder=>apipElementOrder["@attributes"].identifierRef===identifier)||{};return parseInt(order)||Number.POSITIVE_INFINITY};var ttsApipDataProvider=apipData=>{const{accessibilityInfo:{accessElement=[]}={},inclusionOrder:{textGraphicsDefaultOrder:{elementOrder=[]}={}}={}}=apipData;return accessElement.map(getTTSItemData).filter(_ref=>{let{url}=_ref;return!!url}).sort((a,b)=>getTTSItemOrder(a.identifier,elementOrder)-getTTSItemOrder(b.identifier,elementOrder))};return ttsApipDataProvider}),define("taoQtiTest/runner/plugins/tools/apipTextToSpeech/plugin",["lodash","i18n","ui/hider","util/shortcut","util/namespace","taoTests/runner/plugin","taoQtiTest/runner/helpers/map","ui/keyNavigation/navigator","ui/keyNavigation/navigableDomElement","taoQtiTest/runner/plugins/tools/apipTextToSpeech/textToSpeech","taoQtiTest/runner/plugins/tools/apipTextToSpeech/ttsApipDataProvider"],function(_,__,hider,shortcut,namespaceHelper,pluginFactory,mapHelper,keyNavigator,navigableDomElement,ttsComponentFactory,ttsApipDataProvider){"use strict";_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,shortcut=shortcut&&Object.prototype.hasOwnProperty.call(shortcut,"default")?shortcut["default"]:shortcut,namespaceHelper=namespaceHelper&&Object.prototype.hasOwnProperty.call(namespaceHelper,"default")?namespaceHelper["default"]:namespaceHelper,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper,keyNavigator=keyNavigator&&Object.prototype.hasOwnProperty.call(keyNavigator,"default")?keyNavigator["default"]:keyNavigator,navigableDomElement=navigableDomElement&&Object.prototype.hasOwnProperty.call(navigableDomElement,"default")?navigableDomElement["default"]:navigableDomElement,ttsComponentFactory=ttsComponentFactory&&Object.prototype.hasOwnProperty.call(ttsComponentFactory,"default")?ttsComponentFactory["default"]:ttsComponentFactory,ttsApipDataProvider=ttsApipDataProvider&&Object.prototype.hasOwnProperty.call(ttsApipDataProvider,"default")?ttsApipDataProvider["default"]:ttsApipDataProvider;const pluginName="apiptts",actionPrefix=`tool-${"apiptts"}-`;var plugin=pluginFactory({name:"apiptts",init(){const testRunner=this.getTestRunner(),testRunnerOptions=testRunner.getOptions(),pluginShortcuts=(testRunnerOptions.shortcuts||{})[this.getName()]||{};let ttsComponent,ttsApipData;const createNavigationGroup=()=>{const $container=testRunner.getAreaBroker().getContainer(),$navigationGroupElement=this.button.getElement(),groupNavigationId=`${pluginName}_navigation_group`,$navigationElements=$container.find(ttsApipData.map(_ref=>{let{selector}=_ref;return selector}).join(", "));this.navigationGroup=keyNavigator({id:groupNavigationId,group:$navigationGroupElement,elements:navigableDomElement.createFromDoms($navigationElements.add($navigationGroupElement)),propagateTab:!1,loop:!0,keepState:!0}).on("tab",()=>{ttsComponent.is("sfhMode")&&(this.navigationGroup.next(),testRunner.trigger(`${actionPrefix}next`))}).on("shift+tab",()=>{ttsComponent.is("sfhMode")&&(this.navigationGroup.previous(),testRunner.trigger(`${actionPrefix}previous`))}).on("activate",()=>{ttsComponent.is("sfhMode")&&testRunner.trigger(`${actionPrefix}togglePlayback`)}).on("blur",()=>{setTimeout(()=>{this.navigationGroup.isFocused()||this.navigationGroup.focus()},0)}).setCursorAt($navigationElements.length),ttsComponent.on("next finish",()=>{if(ttsComponent.is("sfhMode")){const $currentElement=this.navigationGroup.getCursor().navigable.getElement(),{selector}=ttsComponent.getCurrentItem()||{};selector&&$currentElement.is(selector)||this.navigationGroup.next()}})},getTTSComponent=()=>{if(!ttsComponent){const $container=testRunner.getAreaBroker().getContainer();ttsComponent=ttsComponentFactory($container,{}).on("close",()=>{this.getState("active")&&testRunner.trigger(`${actionPrefix}toggle`)}).hide()}return ttsComponent},isConfigured=()=>mapHelper.hasItemCategory(testRunner.getTestMap(),testRunner.getTestContext().itemIdentifier,"apiptts",!0),togglePlugin=()=>{isConfigured()?this.show():this.hide()},enablePlugin=()=>{createNavigationGroup(),this.button.turnOn(),this.setState("active",!0),this.trigger("open"),ttsComponent.is("hidden")&&ttsComponent.show()},disablePlugin=()=>{this.getState("active")&&(this.navigationGroup.blur(),this.navigationGroup.destroy(),this.setState("active",!1),this.button.turnOff(),this.trigger("close"),ttsComponent&&!ttsComponent.is("hidden")&&(ttsComponent.close(),ttsComponent.hide()))},toggleTool=()=>{this.getState("enabled")&&(this.getState("active")?(disablePlugin(),this.setState("sleep",!0)):(enablePlugin(),this.setState("sleep",!1)))};this.button=this.getAreaBroker().getToolbox().createEntry({className:`${this.getName()}-plugin`,control:this.getName(),icon:"headphones",text:__("Text To Speech"),title:__("Enable text to speech")}),this.button.on("click",e=>{e.preventDefault(),testRunner.trigger(`${actionPrefix}toggle`)}),testRunnerOptions.allowShortcuts&&_.forEach(pluginShortcuts,(command,key)=>{shortcut.add(namespaceHelper.namespaceAll(command,pluginName,!0),()=>{if(!("spaceTogglePlayback"===key&&ttsComponent&&ttsComponent.is("sfhMode"))){const eventKey=key.endsWith("TogglePlayback")?"togglePlayback":key;testRunner.trigger(actionPrefix+eventKey)}},{avoidInput:!0})}),togglePlugin(),this.disable(),this.hide(),testRunner.on("loaditem",()=>{togglePlugin(),this.disable()}).on("enabletools renderitem",()=>{this.enable()}).on("disabletools unloaditem",()=>{disablePlugin(),this.disable()}).on(`${actionPrefix}toggle`,()=>{isConfigured()&&toggleTool()}).on(`${actionPrefix}togglePlayback`,()=>{if(this.getState("enabled")&&this.getState("active")){if(ttsComponent.is("sfhMode")){const $currentElement=this.navigationGroup.getCursor().navigable.getElement(),{selector}=ttsComponent.getCurrentItem()||{};if(!$currentElement.is(selector))return void(this.button.getElement()[0]!==$currentElement[0]&&$currentElement.trigger("click"))}ttsComponent.togglePlayback()}}).on("renderitem",()=>{if(isConfigured())return ttsApipData=ttsApipDataProvider(testRunner.itemRunner.getData().apipAccessibility||{}).map(apipItemData=>Object.assign({},apipItemData,{url:testRunner.itemRunner.assetManager.resolve(apipItemData.url)})),ttsApipData.length?void(getTTSComponent().setMediaContentData(ttsApipData),this.show(),!this.getState("sleep")&&(this.setState("enabled",!0),toggleTool())):(disablePlugin(),void this.hide())})},destroy(){shortcut.remove(`.${this.getName()}`)},enable(){this.button.enable()},disable(){this.button.disable()},show(){this.button.show()},hide(){this.button.hide()}});return plugin}),define("taoQtiTest/runner/plugins/tools/areaMasking/mask",["lodash","handlebars","lib/handlebars/helpers","ui/dynamicComponent"],function(_,Handlebars,Helpers0,dynamicComponent){"use strict";function areaMaskingTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}function maskingComponentFactory(){var dynamicComponentInstance;return dynamicComponentInstance=dynamicComponent({preview:function preview(){var self=this,delay=this.config.previewDelay||1e3;return!this.is("rendered")||this.is("disabled")||this.is("previewing")||(this.setState("previewing",!0),this.trigger("preview"),_.delay(function(){self.setState("previewing",!1)},delay)),this}},defaultConfig).on("rendercontent",function($content){var self=this,$element=this.getElement();$content.append(areaMaskingTpl({})),$element.addClass("mask-container"),$element.on("click touchstart",".view",function(e){e.preventDefault(),self.preview()}).on("click touchend",".close",function(e){e.preventDefault(),self.destroy()})}).init(),dynamicComponentInstance}_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,dynamicComponent=dynamicComponent&&Object.prototype.hasOwnProperty.call(dynamicComponent,"default")?dynamicComponent["default"]:dynamicComponent,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",helperMissing=helpers.helperMissing,escapeExpression=this.escapeExpression,helper,options;return buffer+="
          \n
          \n
          \n \n \n
          \n
          \n",buffer}),defaultConfig={draggable:!0,resizable:!0,preserveAspectRatio:!1,width:250,minWidth:160,maxWidth:1e3,minHeight:60,height:100,stackingScope:"test-runner",top:50,left:10,previewDelay:3e3};return maskingComponentFactory}),define("taoQtiTest/runner/plugins/tools/areaMasking/areaMasking",["lodash","i18n","ui/hider","util/shortcut","util/namespace","taoTests/runner/plugin","taoQtiTest/runner/plugins/tools/areaMasking/mask","taoQtiTest/runner/helpers/map"],function(_,__,hider,shortcut,namespaceHelper,pluginFactory,maskComponent,mapHelper){"use strict";_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,shortcut=shortcut&&Object.prototype.hasOwnProperty.call(shortcut,"default")?shortcut["default"]:shortcut,namespaceHelper=namespaceHelper&&Object.prototype.hasOwnProperty.call(namespaceHelper,"default")?namespaceHelper["default"]:namespaceHelper,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,maskComponent=maskComponent&&Object.prototype.hasOwnProperty.call(maskComponent,"default")?maskComponent["default"]:maskComponent,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper;var pluginName="area-masking",actionPrefix=`tool-${"area-masking"}-`,defaultConfig={max:5,foo:!0},areaMasking=pluginFactory({name:"area-masking",init(){function addMask(){maskComponent().on("render",function(){self.masks.push(this),self.button.turnOn(),self.trigger("maskadd")}).on("destroy",function(){self.masks=_.without(self.masks,this),self.masks.lengthmask.destroy())}).on(`${actionPrefix}toggle`,function(){isEnabled()&&(0===self.masks.length&&self.trigger("open"),self.masks.lengthmask.destroy()))})},destroy:function destroy(){shortcut.remove(`.${"area-masking"}`)},enable:function enable(){this.button.enable()},disable:function disable(){this.button.disable()},show:function show(){this.button.show()},hide:function hide(){this.button.hide()}});return areaMasking}),define("taoQtiTest/runner/plugins/tools/calculator",["jquery","lodash","i18n","ui/hider","ui/calculator","ui/maths/calculator/basicCalculator","ui/maths/calculator/scientificCalculator","util/shortcut","util/namespace","taoTests/runner/plugin","taoQtiTest/runner/helpers/map","handlebars","lib/handlebars/helpers"],function($$1,_,__,hider,calculatorFactory,basicCalculatorFactory,scientificCalculatorFactory,shortcut,namespaceHelper,pluginFactory,mapHelper,Handlebars,Helpers0){"use strict";function calculatorTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}$$1=$$1&&Object.prototype.hasOwnProperty.call($$1,"default")?$$1["default"]:$$1,_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,calculatorFactory=calculatorFactory&&Object.prototype.hasOwnProperty.call(calculatorFactory,"default")?calculatorFactory["default"]:calculatorFactory,basicCalculatorFactory=basicCalculatorFactory&&Object.prototype.hasOwnProperty.call(basicCalculatorFactory,"default")?basicCalculatorFactory["default"]:basicCalculatorFactory,scientificCalculatorFactory=scientificCalculatorFactory&&Object.prototype.hasOwnProperty.call(scientificCalculatorFactory,"default")?scientificCalculatorFactory["default"]:scientificCalculatorFactory,shortcut=shortcut&&Object.prototype.hasOwnProperty.call(shortcut,"default")?shortcut["default"]:shortcut,namespaceHelper=namespaceHelper&&Object.prototype.hasOwnProperty.call(namespaceHelper,"default")?namespaceHelper["default"]:namespaceHelper,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){return this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),"
          "}),defaultCalcConfig={height:380,width:280,top:50,left:10,stackingScope:"test-runner",proportionalResize:!0},bodmasCalcConfig=_.defaults({height:380,width:280},defaultCalcConfig),scientificCalcConfig=_.defaults({width:490,height:420,calculator:{maths:{degree:!0}}},defaultCalcConfig),calculator=pluginFactory({name:"calculator",init:function init(){function getCalculatorCategories(){const testContext=testRunner.getTestContext(),itemIdentifier=testContext.itemIdentifier,testMap=testRunner.getTestMap();return{calculator:mapHelper.hasItemCategory(testMap,itemIdentifier,"calculator",!0),bodmas:mapHelper.hasItemCategory(testMap,itemIdentifier,"calculator-bodmas",!0),scientific:mapHelper.hasItemCategory(testMap,itemIdentifier,"calculator-scientific",!0)}}function isEnabled(){const categories=getCalculatorCategories();return categories.calculator||categories.bodmas||categories.scientific}function togglePlugin(){isEnabled()?self.show():self.hide()}function buildCalculator(calcTpl){const categories=getCalculatorCategories();let factory,calcConfig;categories.scientific?(factory=scientificCalculatorFactory,calcConfig=scientificCalcConfig,calcConfig.calculator.maths.degree=_.isUndefined(config.degree)?scientificCalcConfig.calculator.maths.degree:config.degree):categories.bodmas?(factory=basicCalculatorFactory,calcConfig=bodmasCalcConfig):(factory=calculatorFactory,calcConfig=defaultCalcConfig),self.calculator=factory(_.defaults({renderTo:self.$calculatorContainer,replace:!0,draggableContainer:areaBroker.getContainer(),alternativeTemplate:calcTpl||null},calcConfig)).on("show",function(){self.trigger("open"),self.button.turnOn()}).on("hide",function(){self.trigger("close"),self.button.turnOff()}).after("render",function(){this.show()})}function toggleCalculator(){!1!==self.getState("enabled")&&(self.calculator?self.calculator.is("hidden")?self.calculator.show():self.calculator.hide():config.template?require([`tpl!${config.template.replace(/\.tpl$/,"")}`],function(calcTpl){buildCalculator(calcTpl)},function(){buildCalculator()}):buildCalculator())}const self=this,testRunner=this.getTestRunner(),areaBroker=this.getAreaBroker(),testRunnerOptions=testRunner.getOptions(),config=this.getConfig(),pluginShortcuts=(testRunnerOptions.shortcuts||{})[this.getName()]||{};this.button=this.getAreaBroker().getToolbox().createEntry({control:"calculator",title:__("Open Calculator"),icon:"table",text:__("Calculator")}),this.$calculatorContainer=$$1(calculatorTpl()),this.calculator=null,this.button.on("click",function(e){$$1(e.target).closest(".widget-calculator").length||(e.preventDefault(),testRunner.trigger("tool-calculator"))}),testRunnerOptions.allowShortcuts&&pluginShortcuts.toggle&&shortcut.add(namespaceHelper.namespaceAll(pluginShortcuts.toggle,this.getName(),!0),function(){testRunner.trigger("tool-calculator")},{avoidInput:!0,allowIn:".widget-calculator"}),togglePlugin(),this.disable(),testRunner.on("loaditem",togglePlugin).on("enabletools renderitem",function(){self.enable()}).on("disabletools unloaditem",function(){self.disable(),self.calculator&&(self.calculator.destroy(),self.calculator=null)}).on("tool-calculator",function(){isEnabled()&&toggleCalculator()})},render:function render(){var areaBroker=this.getAreaBroker();areaBroker.getContainer().append(this.$calculatorContainer)},destroy:function destroy(){shortcut.remove(`.${this.getName()}`),this.$calculatorContainer.remove(),this.calculator&&this.calculator.destroy()},enable:function enable(){this.button.enable()},disable:function disable(){this.button.disable(),this.calculator&&this.calculator.hide()},show:function show(){this.button.show()},hide:function hide(){this.button.hide(),this.calculator&&this.calculator.hide()}});return calculator}),define("taoQtiTest/runner/plugins/tools/comment/comment",["jquery","i18n","taoTests/runner/plugin","ui/hider","ui/stacker","util/shortcut","util/namespace","handlebars","lib/handlebars/helpers"],function($$1,__,pluginFactory,hider,stackerFactory,shortcut,namespaceHelper,Handlebars,Helpers0){"use strict";function commentTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}$$1=$$1&&Object.prototype.hasOwnProperty.call($$1,"default")?$$1["default"]:$$1,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,hider=hider&&Object.prototype.hasOwnProperty.call(hider,"default")?hider["default"]:hider,stackerFactory=stackerFactory&&Object.prototype.hasOwnProperty.call(stackerFactory,"default")?stackerFactory["default"]:stackerFactory,shortcut=shortcut&&Object.prototype.hasOwnProperty.call(shortcut,"default")?shortcut["default"]:shortcut,namespaceHelper=namespaceHelper&&Object.prototype.hasOwnProperty.call(namespaceHelper,"default")?namespaceHelper["default"]:namespaceHelper,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",helperMissing=helpers.helperMissing,escapeExpression=this.escapeExpression,helper,options;return buffer+="
          \n \n \n \n
          \n",buffer}),comment=pluginFactory({name:"comment",init(){function isEnabled(){const currentItem=testRunner.getCurrentItem();if("boolean"==typeof currentItem.allowComment)return currentItem.allowComment;const testContext=testRunner.getTestContext(),contextOptions=testContext.options||{};return!!contextOptions.allowComment}function togglePlugin(){isEnabled()?self.show():self.hide()}function toggleComment(){!1!==self.getState("enabled")&&(hider.toggle(self.$form),hider.isHidden(self.$form)?self.button.turnOff():(self.$input.val("").focus(),self.button.turnOn(),stacker.bringToFront(self.$form)))}const self=this,testRunner=this.getTestRunner(),testRunnerOptions=testRunner.getOptions(),pluginShortcuts=(testRunnerOptions.shortcuts||{})[this.getName()]||{},stacker=stackerFactory("test-runner");this.button=this.getAreaBroker().getToolbox().createEntry({control:"comment",title:__("Leave a comment"),icon:"tag",text:__("Comment")}),this.button.on("render",function(){self.$button=self.button.getElement(),self.$form=$$1(commentTpl()).appendTo(self.$button),self.$input=self.$button.find("[data-control=\"qti-comment-text\"]"),self.$cancel=self.$button.find("[data-control=\"qti-comment-cancel\"]"),self.$submit=self.$button.find("[data-control=\"qti-comment-send\"]"),stacker.autoBringToFront(self.$form),self.$cancel.on("click",function(){hider.hide(self.$form),self.button.turnOff()}),self.$submit.on("click",function(){var comment=self.$input.val();comment&&(self.disable(),self.button.turnOff(),testRunner.getProxy().callTestAction("comment",{comment:comment}).then(function(){hider.hide(self.$form),self.enable()}).catch(function(){hider.hide(self.$form),self.enable()}))})}),this.button.on("click",function(e){$$1(e.target).closest("[data-control=\"qti-comment\"]").length||(e.preventDefault(),testRunner.trigger("tool-comment"))}),testRunnerOptions.allowShortcuts&&pluginShortcuts.toggle&&shortcut.add(namespaceHelper.namespaceAll(pluginShortcuts.toggle,this.getName(),!0),function(){testRunner.trigger("tool-comment")},{avoidInput:!0}),togglePlugin(),this.disable(),testRunner.on("loaditem",togglePlugin).on("renderitem enabletools",function(){self.enable()}).on("unloaditem disabletools",function(){self.disable()}).on("tool-comment",function(){isEnabled()&&toggleComment()})},destroy:function destroy(){shortcut.remove(`.${this.getName()}`)},enable:function enable(){this.button.enable()},disable:function disable(){this.$form&&hider.hide(this.$form),this.button.disable(),this.button.turnOff()},show:function show(){this.button.show()},hide:function hide(){this.$form&&hider.hide(this.$form),this.button.hide()}});return comment}),define("taoQtiTest/runner/plugins/tools/documentViewer/documentViewer",["jquery","lodash","ui/hider","ui/documentViewer","ui/documentViewer/providers/pdfViewer","taoTests/runner/plugin","handlebars","lib/handlebars/helpers"],function($$1,_,hider,viewerFactory,pdfViewer,pluginFactory,Handlebars,Helpers0){"use strict";function panelTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}function showPanel(plugin){hider.show(plugin.controls.$panel),plugin.trigger("panelshow"),$$1(window).on(`resize.${plugin.getName()}`,_.debounce(_.partial(resizeViewer,plugin),50))}function hidePanel(plugin){hider.hide(plugin.controls.$panel),plugin.trigger("panelhide"),$$1(window).off(`resize.${plugin.getName()}`)}function hideIfVisible(plugin){var isVisible=!hider.isHidden(plugin.controls.$panel,!0);return isVisible&&hidePanel(plugin),isVisible}function initPanelEvents(plugin){function stopPropagation(e){e.stopImmediatePropagation(),e.stopPropagation()}var namespace=`.${plugin.getName()}`,stopEvents=["click","mousedown","mouseup","touchstart","touchend","keyup","keydow","keypress","scroll","drop"].join(`${namespace} `)+namespace,hideViewer=_.partial(hidePanel,plugin);plugin.controls.$overlay.off(namespace).on(`click${namespace}`,hideViewer).on(stopEvents,stopPropagation),plugin.controls.$panel.off(namespace).on(`click${namespace}`,".icon-close",hideViewer).on(stopEvents,stopPropagation)}function resizeViewer(plugin){var $content=plugin.controls.$content;plugin.viewer.setSize($content.width(),$content.height())}$$1=$$1&&Object.prototype.hasOwnProperty.call($$1,"default")?$$1["default"]:$$1,_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,hider=hider&&Object.prototype.hasOwnProperty.call(hider,"default")?hider["default"]:hider,viewerFactory=viewerFactory&&Object.prototype.hasOwnProperty.call(viewerFactory,"default")?viewerFactory["default"]:viewerFactory,pdfViewer=pdfViewer&&Object.prototype.hasOwnProperty.call(pdfViewer,"default")?pdfViewer["default"]:pdfViewer,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,Handlebars=Handlebars&&Object.prototype.hasOwnProperty.call(Handlebars,"default")?Handlebars["default"]:Handlebars,Helpers0=Helpers0&&Object.prototype.hasOwnProperty.call(Helpers0,"default")?Helpers0["default"]:Helpers0,Helpers0.__initialized||(Helpers0(Handlebars),Helpers0.__initialized=!0);var Template=Handlebars.template(function(Handlebars,depth0,helpers,partials,data){this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",functionType="function",escapeExpression=this.escapeExpression,stack1,helper;return buffer+="
          \n
          \n
          \n
          \n ",(helper=helpers.title)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.title,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\n \n
          \n
          ",(helper=helpers.content)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.content,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),(stack1||0===stack1)&&(buffer+=stack1),buffer+="
          \n
          \n
          \n
          \n",buffer}),pluginName="documentViewer";viewerFactory.registerProvider("pdf",pdfViewer);var documentViewer=pluginFactory({name:pluginName,init:function init(){function displayViewer(data){!1!==self.getState("enabled")&&(showPanel(self),self.controls.$title.text(data.label),resizeViewer(self),self.viewer.load(data.document,"pdf"))}var self=this,testRunner=this.getTestRunner(),$panel=$$1(panelTpl());this.controls={$panel:$panel,$overlay:$panel.find(".viewer-overlay"),$title:$panel.find(".viewer-title"),$content:$panel.find(".viewer-content")},this.viewer=viewerFactory({renderTo:this.controls.$content,replace:!0,fitToWidth:!0,allowSearch:!0}),testRunner.on("renderitem enabletools",function(){self.enable()}).on("renderitem",function(){self.getAreaBroker().getContentArea().append(self.controls.$panel).off(`.${self.getName()}`).on(`viewDocument.${self.getName()}`,function(event){var data=event.originalEvent.detail;displayViewer(data)}),initPanelEvents(self)}).on("move",function(){hideIfVisible(self)}).on("skip",function(){hideIfVisible(self)}).on("unloaditem disabletools",function(){self.disable()}).on("tool-documentViewer",function(data){displayViewer(data)})},render:function render(){},destroy:function destroy(){this.getAreaBroker().getContentArea().off(`.${this.getName()}`),this.viewer&&this.viewer.destroy(),this.controls.$panel&&this.controls.$panel.remove(),this.viewer=null,this.controls={}},enable:function enable(){},disable:function disable(){hideIfVisible(this)},show:function show(){},hide:function hide(){hideIfVisible(this)}});return documentViewer}),define("taoQtiTest/runner/plugins/tools/highlighter/highlighter",["lodash","jquery","core/eventifier","ui/highlighter"],function(_,$,eventifier,highlighterFactory){"use strict";function getAllRanges(){var allRanges=[],i;for(i=0;i{isPluginAllowed()||self.hide()}).on("click",function(e){e.preventDefault(),testRunner.trigger("tool-themeswitcher-toggle")}).on("openmenu",function(){testRunner.trigger(`plugin-open.${pluginName}`,state.selectedTheme)}).on("closemenu",function(){testRunner.trigger(`plugin-close.${pluginName}`,state.selectedTheme)}),state.availableThemes.forEach(function(theme){var themeEntry=self.getAreaBroker().getToolbox().createEntry({role:"option",control:theme.id,title:theme.label,icon:"preview",text:__(theme.label)});themeEntry.setMenuId("color-contrast"),themeEntry.on("click",function(e){var themeId=this.config.control;e.preventDefault(),self.menuButton.turnOffAll(),this.turnOn(),changeTheme(themeId)}),state.defaultTheme===theme.id&&themeEntry.on("render",function(){this.turnOn()}),allMenuEntries.push(themeEntry)}),testRunnerOptions.allowShortcuts&&pluginShortcuts.toggle&&shortcut.add(namespaceHelper.namespaceAll(pluginShortcuts.toggle,this.getName(),!0),function(){testRunner.trigger("tool-themeswitcher-toggle")},{avoidInput:!0}),isPluginAllowed()||this.hide(),this.disable(),testRunner.on("loaditem",function(){isPluginAllowed()?self.show():self.hide()}).on("renderitem",function(){self.enable(),changeTheme(state.selectedTheme)}).on("enabletools",function(){self.enable()}).on("disabletools unloaditem",function(){self.disable()}).on("tool-themeswitcher-toggle",function(){!1!==self.getState("enabled")&&self.menuButton.toggleMenu()}).on("tool-themeswitcher-setnavtype",function(type){self.menuButton.setNavigationType(type)}),testRunner.getPluginStore(this.getName()).then(function(itemThemesStore){self.storage=itemThemesStore,self.storage.getItem("itemThemeId").then(function(itemThemeId){itemThemeId&&state.selectedTheme!==itemThemeId&&changeTheme(itemThemeId)})})},destroy:function destroy(){return themeHandler.setActiveNamespace(this.oldNamespace),shortcut.remove(`.${this.getName()}`),this.getTestRunner().getPluginStore(this.getName()).then(function(itemThemesStore){return itemThemesStore.removeItem("itemThemeId")})},enable:function enable(){this.menuButton.enable()},disable:function disable(){this.menuButton.disable()},show:function show(){this.menuButton.show()},hide:function hide(){this.menuButton.hide()}});return itemThemeSwitcher}),define("taoQtiTest/runner/plugins/tools/lineReader/compoundMask",["jquery","lodash","core/statifier","core/eventifier","ui/component","ui/component/placeable","ui/component/draggable","ui/component/resizable","ui/component/stackable"],function($,_,statifier,eventifier,componentFactory,makePlaceable,makeDraggable,makeResizable,makeStackable){"use strict";function compoundMaskFactory(options,dimensions,position){function createMask(maskConfig){var maskAPI={place:maskConfig.place,placeOverlay:maskConfig.placeOverlay,styleResizableEdges:function styleResizableEdges(){var $element=this.getElement();_.forOwn(this.config.edgesBorders,function(isResizable,edgeId){isResizable&&$element.addClass(`border-${edgeId}`)})},addResizeControll:function addResizeControll(){var $element=this.getElement(),$resizeControll=$("
          ",{class:"resize-control"});$element.append($resizeControll)}},mask;return mask=componentFactory(maskAPI,maskConfig),makeResizable(mask),makeStackable(mask,stackingOptions),mask.on("render",function(){var $element=this.getElement();this.styleResizableEdges(),this.config.resizeControll&&this.addResizeControll(),$element.addClass(`line-reader-mask ${maskConfig.id}`).on("mousedown touchstart",function(){bringAllToFront()})}).on("resizestart",function(){innerDrag.hide(),closer.hide(),invokeOnOverlays("hide"),invokeOnMasks("setState",["resizing",!0]),this.setState("resizer",!0)}).on("beforeresize",maskConfig.beforeResize||_.noop).on("resize",maskConfig.onResize||_.noop).on("resizeend",function(){applyTransformsToOverlays(),applyTransformsToInnerDrag(),applyTransformsToCloser(),invokeOnMasks("setState",["resizing",!1]),invokeOnOverlays("show"),innerDrag.show(),closer.show(),this.setState("resizer",!1)}).init()}function createOverlay(overlayConfig){var overlayAPI={transformOverlay:function transformOverlay(){var $element=this.getElement();this._sizeBackup=this.getSize(),this._posBackup=this.getPosition(),this.setSize(dimensions.outerWidth,dimensions.outerHeight).moveTo(position.outerX,position.outerY),$element.addClass("moving"),this.setState("transformed",!0)},restoreOverlay:function restoreOverlay(){var $element=this.getElement();this.is("transformed")&&(this.setSize(this._sizeBackup.width,this._sizeBackup.height).moveTo(this._posBackup.x,this._posBackup.y),$element.removeClass("moving"),this._sizeBackup=null,this._posBackup=null,this.setState("transformed",!1))},appendVisualGuides:function appendVisualGuides(){var $element=this.getElement(),borderWidth=1,borderOffset=2;$element.append(visualGuides.$maskBg),$element.append(visualGuides.$innerWindow),visualGuides.$maskBg.css({width:dimensions.outerWidth-2,height:dimensions.outerHeight-2,"border-top-width":dimensions.topHeight-2,"border-right-width":dimensions.rightWidth-2,"border-bottom-width":dimensions.bottomHeight-2,"border-left-width":dimensions.leftWidth-2}),visualGuides.$innerWindow.css({width:dimensions.innerWidth,height:dimensions.innerHeight,left:dimensions.leftWidth-2,top:dimensions.topHeight-2})},removeVisualGuides:function removeVisualGuides(){visualGuides.$maskBg.remove(),visualGuides.$innerWindow.remove()}},overlay;return overlay=componentFactory(overlayAPI,overlayConfig),makeDraggable(overlay),makeStackable(overlay,stackingOptions),overlay.on("render",function(){var self=this,$element=this.getElement(),pointerEventsPrefix=window.PointerEvent?"pointer":"mouse",$moveIcon=$("
          ",{class:"icon icon-mobile-menu"});$element.addClass(`line-reader-overlay ${overlayConfig.id}`).on(`${pointerEventsPrefix}down`+` touchstart`,function(){bringAllToFront(),self.transformOverlay()}).on(`${pointerEventsPrefix}up`+` touchend`,function(){self.restoreOverlay()}).prepend($moveIcon)}).on("dragstart",function(){innerDrag.hide(),closer.hide(),invokeOnMasks("hide"),this.appendVisualGuides()}).on("dragmove",function moveAllPartsTogether(xOffsetRelative,yOffsetRelative){position.outerX+=xOffsetRelative,position.outerY+=yOffsetRelative,position.innerX+=xOffsetRelative,position.innerY+=yOffsetRelative}).on("dragend",function(){this.removeVisualGuides(),invokeOnAll("show"),innerDrag.show(),closer.show(),applyTransforms()}).init()}function createInnerDragHandle(){innerDrag=componentFactory(),makeStackable(innerDrag,stackingOptions),makeDraggable(innerDrag,{dragRestriction:function dragRestriction(){var fixedXY=allParts.nw.mask.getElement().offset(),rect;return rect={x:fixedXY.left+constrains.minWidth,y:fixedXY.top+(constrains.minTopHeight+dimensions.innerHeight+options.resizeHandleSize),width:dimensions.outerWidth-2*constrains.minWidth,height:dimensions.outerHeight-(dimensions.innerHeight+constrains.minTopHeight+constrains.minBottomHeight-options.innerDragHeight)},rect}}).on("render",function(){var $element=this.getElement(),$dragIcon=$("
          ",{class:"icon icon-move"});$element.css("touch-action","none"),$element.addClass("line-reader-inner-drag"),$element.css({background:"none"}),$element.append($dragIcon)}).on("dragstart",function(){closer.hide(),bringAllToFront(),invokeOnMasks("setState",["resizing",!0])}).on("dragmove",function(xOffsetRelative,yOffsetRelative){position.innerX+=xOffsetRelative,position.innerY+=yOffsetRelative,dimensions.leftWidth+=xOffsetRelative,dimensions.topHeight+=yOffsetRelative,dimensions.rightWidth-=xOffsetRelative,dimensions.bottomHeight-=yOffsetRelative,applyTransformsToMasks()}).on("dragend",function(){innerDrag.bringToFront(),closer.show(),invokeOnMasks("setState",["resizing",!1]),applyTransformsToOverlays()}).init()}function createCloser(){closer=componentFactory(),makeStackable(closer,stackingOptions),makePlaceable(closer).on("render",function(){var self=this,$element=this.getElement(),$closeIcon=$("
          ",{class:"icon icon-result-nok"});$element.append($closeIcon),$element.addClass("line-reader-closer"),$element.on("mousedown touchstart",function(){bringAllToFront()}),$element.on("click",function(e){e.stopPropagation(),self.trigger("click")})}).init()}function bringAllToFront(){invokeOnAll("bringToFront"),innerDrag.bringToFront(),closer.bringToFront()}function invokeOnAll(fn,args){invokeOnMasks(fn,args),invokeOnOverlays(fn,args)}function invokeOnMasks(fn,args){invokeOn("mask",fn,args)}function invokeOnOverlays(fn,args){invokeOn("overlay",fn,args)}function invokeOn(target,fn,args){_.forOwn(allParts,function(part){_.isObject(part[target])&&_.isFunction(part[target][fn])&&part[target][fn](...(args||[]))})}function applyTransforms(){applyTransformsToMasks(),applyTransformsToOverlays(),applyTransformsToInnerDrag(),applyTransformsToCloser()}function applyTransformsToMasks(){invokeOnMasks("place")}function applyTransformsToOverlays(){_.forOwn(allParts,function(part){part.overlay&&part.mask.placeOverlay(part.overlay)})}function applyTransformsToInnerDrag(){innerDrag&&innerDrag.setSize(dimensions.innerWidth-20,options.innerDragHeight).moveTo(position.innerX+10,position.innerY+dimensions.innerHeight+options.resizeHandleSize)}function applyTransformsToCloser(){closer&&closer.setSize(constrains.minWidth-options.resizeHandleSize,constrains.minHeight-options.resizeHandleSize).moveTo(position.outerX+dimensions.outerWidth-constrains.minWidth-5,position.outerY+options.resizeHandleSize-4)}function correctTransforms(){dimensions.topHeight",{class:"mask-bg"}),visualGuides.$innerWindow=$("
          ",{class:"inner-window"})}var allParts={},visualGuides={},compoundMask,innerDrag,closer;const setInnerHeight=newHeight=>{dimensions.innerHeight=newHeight,dimensions.bottomHeight=dimensions.outerHeight-dimensions.innerHeight-dimensions.topHeight};return dimensions=_.defaults(dimensions||{},defaultDimensions),position=_.defaults(position||{},defaultPosition),options=_.defaults(options||{},defaultOptions),constrains={minWidth:2*options.resizeHandleSize+options.dragMinWidth,minHeight:2*options.resizeHandleSize+options.dragMinHeight,minBottomHeight:2*options.resizeHandleSize+options.innerDragHeight,minTopHeight:2*options.resizeHandleSize+18},compoundMask={init:function init(){var self=this;return this.setTransforms(dimensions,position),createCompoundMask(),createVisualGuides(),createInnerDragHandle(),createCloser(),closer.on("click",function(){self.hide(),self.trigger("close")}),this},render:function render($container){return invokeOnAll("render",[$container]),innerDrag.render($container),closer.render($container),applyTransforms(),this},destroy:function destroy(){return invokeOnAll("destroy"),visualGuides=null,innerDrag=null,closer=null,this},show:function show(){return invokeOnAll("show"),innerDrag.show(),closer.show(),this.setState("hidden",!1),this},hide:function hide(){return invokeOnAll("hide"),innerDrag.hide(),closer.hide(),this.setState("hidden",!0),this},setTransforms:function setTransforms(dim,pos){dimensions=_.defaults(dim||{},dimensions),position=_.defaults(pos||{},position),dimensions.topHeight=pos.innerY-pos.outerY,dimensions.rightWidth=dim.outerWidth-(pos.innerX-pos.outerX)-dim.innerWidth,dimensions.bottomHeight=dim.outerHeight-(pos.innerY-pos.outerY)-dim.innerHeight,dimensions.leftWidth=pos.innerX-pos.outerX,correctTransforms(),applyTransforms()},getDimensions:function getDimensions(){return dimensions},getPosition:function getPosition(){return position},getParts:function getParts(){return allParts}},statifier(compoundMask),eventifier(compoundMask),compoundMask}$=$&&Object.prototype.hasOwnProperty.call($,"default")?$["default"]:$,_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,statifier=statifier&&Object.prototype.hasOwnProperty.call(statifier,"default")?statifier["default"]:statifier,eventifier=eventifier&&Object.prototype.hasOwnProperty.call(eventifier,"default")?eventifier["default"]:eventifier,componentFactory=componentFactory&&Object.prototype.hasOwnProperty.call(componentFactory,"default")?componentFactory["default"]:componentFactory,makePlaceable=makePlaceable&&Object.prototype.hasOwnProperty.call(makePlaceable,"default")?makePlaceable["default"]:makePlaceable,makeDraggable=makeDraggable&&Object.prototype.hasOwnProperty.call(makeDraggable,"default")?makeDraggable["default"]:makeDraggable,makeResizable=makeResizable&&Object.prototype.hasOwnProperty.call(makeResizable,"default")?makeResizable["default"]:makeResizable,makeStackable=makeStackable&&Object.prototype.hasOwnProperty.call(makeStackable,"default")?makeStackable["default"]:makeStackable;var defaultDimensions={outerWidth:600,outerHeight:400,innerWidth:500,innerHeight:20},defaultPosition={outerX:0,outerY:0,innerX:50,innerY:50},defaultOptions={dragMinWidth:10,dragMinHeight:10,resizeHandleSize:10,innerDragHeight:20},stackingOptions={stackingScope:"test-runner"},constrains;return compoundMaskFactory}),define("taoQtiTest/runner/plugins/tools/lineReader/plugin",["lodash","i18n","taoTests/runner/plugin","ui/hider","util/shortcut","util/namespace","taoQtiTest/runner/helpers/map","taoQtiTest/runner/plugins/tools/lineReader/compoundMask"],function(_,__,pluginFactory,hider,shortcut,namespaceHelper,mapHelper,compoundMaskFactory){"use strict";function getDimensions($container){var $qtiContent=$container.find("#qti-content"),$qtiItem=$qtiContent.find(".qti-item"),lineHeight=Math.ceil(parseFloat($qtiContent.css("line-height")))||20;return{outerWidth:$qtiItem.width()+4*maskOptions.resizeHandleSize+2*maskOptions.dragMinWidth,outerHeight:175,innerWidth:$qtiItem.width(),innerHeight:lineHeight}}function getPosition($container){var $qtiContent=$container.find("#qti-content"),$qtiItem=$qtiContent.find(".qti-item"),itemPosition=$qtiItem.position()||{},paddingLeft=parseInt($qtiItem.css("padding-left"),10),paddingTop=parseInt($qtiItem.css("padding-top"),10),textPadding=3,innerX=parseInt(itemPosition.left,10)+paddingLeft-3,innerY=parseInt(itemPosition.top,10)+paddingTop-3;return{outerX:innerX-2*maskOptions.resizeHandleSize-maskOptions.dragMinWidth,outerY:0,innerX:innerX,innerY:innerY}}function containerWidthHasChanged($container){var newDimensions=getDimensions($container);return newDimensions.outerWidth!==dimensions.outerWidth}_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,shortcut=shortcut&&Object.prototype.hasOwnProperty.call(shortcut,"default")?shortcut["default"]:shortcut,namespaceHelper=namespaceHelper&&Object.prototype.hasOwnProperty.call(namespaceHelper,"default")?namespaceHelper["default"]:namespaceHelper,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper,compoundMaskFactory=compoundMaskFactory&&Object.prototype.hasOwnProperty.call(compoundMaskFactory,"default")?compoundMaskFactory["default"]:compoundMaskFactory;var pluginName="line-reader",actionPrefix=`tool-${"line-reader"}-`,maskOptions={dragMinWidth:17,dragMinHeight:7,resizeHandleSize:7,innerDragHeight:20},plugin=pluginFactory({name:"line-reader",init:function init(){function isEnabled(){return mapHelper.hasItemCategory(testRunner.getTestMap(),testRunner.getTestContext().itemIdentifier,"lineReader",!0)}function toggleButton(){isEnabled()?self.show():self.hide()}function toggleMask(){self.compoundMask.getState("hidden")?(containerWidthHasChanged($container)&&transformMask($container),openMask()):closeMask()}function openMask(){self.compoundMask.show(),self.trigger("start"),self.button.turnOn()}function closeMask(){self.compoundMask.getState("hidden")||self.compoundMask.hide(),self.trigger("end"),self.button.turnOff()}function transformMask($maskContainer){dimensions=getDimensions($maskContainer),position=getPosition($maskContainer),self.compoundMask.setTransforms(_.clone(dimensions),_.clone(position))}const self=this,testRunner=this.getTestRunner(),testRunnerOptions=testRunner.getOptions(),pluginShortcuts=(testRunnerOptions.shortcuts||{})["line-reader"]||{},$container=testRunner.getAreaBroker().getContentArea().parent();this.compoundMask=compoundMaskFactory(maskOptions).init().render($container).on("close",function(){closeMask()}).hide(),this.button=this.getAreaBroker().getToolbox().createEntry({title:__("Line Reader"),icon:"insert-horizontal-line",control:"line-reader",text:__("Line Reader")}),this.button.on("click",function(e){e.preventDefault(),testRunner.trigger(`${actionPrefix}toggle`)}),testRunnerOptions.allowShortcuts&&pluginShortcuts.toggle&&shortcut.add(namespaceHelper.namespaceAll(pluginShortcuts.toggle,this.getName(),!0),function(){testRunner.trigger(`${actionPrefix}toggle`)},{avoidInput:!0,prevent:!0}),this.disable(),testRunner.on("loaditem",toggleButton).on("renderitem",function(){transformMask($container)}).on("enabletools renderitem",function(){self.enable()}).on("disabletools unloaditem",function(){self.disable(),closeMask()}).on(`${actionPrefix}toggle`,function(){isEnabled()&&toggleMask()})},destroy:function destroy(){this.compoundMask.destroy(),shortcut.remove(`.${this.getName()}`)},enable:function enable(){this.button.enable()},disable:function disable(){this.button.disable()},show:function show(){this.button.show()},hide:function hide(){this.button.hide()}}),dimensions,position;return plugin}),define("taoQtiTest/runner/plugins/tools/magnifier/magnifierPanel",["jquery","lodash","ui/component","handlebars","lib/handlebars/helpers","ui/dynamicComponent"],function($$1,_,component,Handlebars,Helpers0,dynamicComponent){"use strict";var _Mathmin=Math.min,_Mathmax2=Math.max;function magnifierPanelTpl(data,options,asString){var html=Template(data,options);return asString||!0?html:$(html)}function magnifierPanelFactory(config){function scrollInClone(scrollData){var $clonedTarget;controls&&controls.$clone&&scrollData&&scrollData.id&&($clonedTarget=controls.$clone.find(`[data-magnifier-scroll=${scrollData.id}]`),$clonedTarget.length&&(_.isNumber(scrollData.scrollTop)&&($clonedTarget[0].scrollTop=scrollData.scrollTop),_.isNumber(scrollData.scrollLeft)&&($clonedTarget[0].scrollLeft=scrollData.scrollLeft)))}function updateScrollPositions(){if(!controls||!controls.$target)return;const elements=[controls.$target];let scrollOffsetsChanged=!1;for(;elements.length;){const $currentElement=$$1(elements.shift()),scrollLeft=$currentElement.scrollLeft(),scrollTop=$currentElement.scrollTop();let scrollId=$currentElement.data("magnifier-scroll");if(elements.push(...Array.from($currentElement.children())),0= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",functionType="function",escapeExpression=this.escapeExpression,helperMissing=helpers.helperMissing,stack1,helper,options;return buffer+="
          \n
          ",(helper=helpers.level)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.level,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"
          \n
          \n
          \n
          \n \n \n \n
          \n
          \n",buffer}),screenRatio=window.screen.width/window.screen.height,debounceDelay=50,scrollingDelay=20,defaultBaseSize=116,defaultLevelMin=2,defaultLevelMax=8,defaultLevel=defaultLevelMin,defaultConfig={level:defaultLevel,levelMin:defaultLevelMin,levelMax:defaultLevelMax,levelStep:.5,baseSize:defaultBaseSize,maxRatio:.5},dynamicComponentDefaultConfig={draggable:!0,resizable:!0,preserveAspectRatio:!1,width:defaultBaseSize*defaultLevel,height:defaultBaseSize*defaultLevel/screenRatio,minWidth:defaultBaseSize*defaultLevelMin,minHeight:defaultBaseSize*defaultLevelMin/screenRatio,stackingScope:"test-runner",top:50,left:10};return magnifierPanelFactory}),define("taoQtiTest/runner/plugins/tools/magnifier/magnifier",["lodash","i18n","taoTests/runner/plugin","ui/hider","util/shortcut","util/namespace","taoQtiTest/runner/plugins/tools/magnifier/magnifierPanel","taoQtiTest/runner/helpers/map"],function(_,__,pluginFactory,hider,shortcut,namespaceHelper,magnifierPanelFactory,mapHelper){"use strict";_=_&&Object.prototype.hasOwnProperty.call(_,"default")?_["default"]:_,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,shortcut=shortcut&&Object.prototype.hasOwnProperty.call(shortcut,"default")?shortcut["default"]:shortcut,namespaceHelper=namespaceHelper&&Object.prototype.hasOwnProperty.call(namespaceHelper,"default")?namespaceHelper["default"]:namespaceHelper,magnifierPanelFactory=magnifierPanelFactory&&Object.prototype.hasOwnProperty.call(magnifierPanelFactory,"default")?magnifierPanelFactory["default"]:magnifierPanelFactory,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper;var pluginName="magnifier",actionPrefix=`tool-${"magnifier"}-`,defaultOptions={zoomMin:2,zoomMax:8,zoomStep:.5},magnifier=pluginFactory({name:"magnifier",init:function init(){function getMagnifierPanel(){var $container;return magnifierPanel||($container=testRunner.getAreaBroker().getContainer(),magnifierPanel=magnifierPanelFactory({levelMin:pluginConfig.zoomMin,levelMax:pluginConfig.zoomMax,levelStep:pluginConfig.zoomStep,component:{renderTo:$container.parent(),draggableContainer:$container.parent()}}).on("show",function(){self.trigger("magnifier-show")}).on("hide",function(){self.trigger("magnifier-hide")}).on("zoom",function(level){self.trigger("magnifier-zoom",level)}).on("close",function(){hideMagnifier()}).setTarget($container),self.trigger("magnifier-create")),magnifierPanel}function isEnabled(){return mapHelper.hasItemCategory(testRunner.getTestMap(),testRunner.getTestContext().itemIdentifier,"magnifier",!0)}function togglePlugin(){isEnabled()?self.show():self.hide()}function toggleMagnifier(){self.getState("enabled")&&(self.getState("active")?hideMagnifier():showMagnifier())}function showMagnifier(){getMagnifierPanel(),magnifierPanel.is("hidden")&&magnifierPanel.show(),self.button.turnOn(),testRunner.trigger(`plugin-open.${"magnifier"}`),self.setState("active",!0)}function hideMagnifier(){self.setState("active",!1),self.button.turnOff(),testRunner.trigger(`plugin-close.${"magnifier"}`),magnifierPanel&&!magnifierPanel.is("hidden")&&magnifierPanel.hide()}const self=this,testRunner=this.getTestRunner(),testRunnerOptions=testRunner.getOptions(),pluginConfig=Object.assign({},defaultOptions,this.getConfig()),pluginShortcuts=(testRunnerOptions.shortcuts||{}).magnifier||{};let magnifierPanel=null;this.button=this.getAreaBroker().getToolbox().createEntry({control:"magnify",title:__("Displays a customisable magnifier"),text:__("Magnifying Glass"),icon:"find"}),this.button.on("click",function(event){event.preventDefault(),testRunner.trigger(`${actionPrefix}toggle`)}),testRunnerOptions.allowShortcuts&&_.forEach(pluginShortcuts,function(command,key){shortcut.add(namespaceHelper.namespaceAll(command,"magnifier",!0),function(){testRunner.trigger(actionPrefix+key)},{avoidInput:!0})}),togglePlugin(),this.disable(),testRunner.on("loaditem",function(){togglePlugin(),self.disable()}).on("renderitem",function(){magnifierPanel&&magnifierPanel.update().zoomTo(pluginConfig.zoomMin)}).on("enabletools renderitem",function(){self.enable()}).on("disabletools unloaditem",function(){self.getState("active")&&hideMagnifier(),self.disable()}).on("destroy",function(){magnifierPanel&&magnifierPanel.destroy(),magnifierPanel=null}).on(`${actionPrefix}toggle`,function(){isEnabled()&&toggleMagnifier()}).on(`${actionPrefix}in`,function(){isEnabled()&&self.getState("enabled")&&self.getState("active")&&getMagnifierPanel().zoomIn()}).on(`${actionPrefix}out`,function(){isEnabled()&&self.getState("enabled")&&self.getState("active")&&getMagnifierPanel().zoomOut()}).on(`${actionPrefix}close`,function(){self.getState("active")&&hideMagnifier()})},destroy:function destroy(){shortcut.remove(`.${"magnifier"}`)},enable:function enable(){this.button.enable()},disable:function disable(){this.button.disable()},show:function show(){this.button.show()},hide:function hide(){this.button.hide()}});return magnifier}),define("taoQtiTest/runner/plugins/tools/zoom",["jquery","i18n","ui/hider","ui/transformer","util/shortcut","util/namespace","taoTests/runner/plugin","taoQtiTest/runner/helpers/map"],function($,__,hider,transformer,shortcut,namespaceHelper,pluginFactory,mapHelper){"use strict";var _Mathmax3=Math.max;$=$&&Object.prototype.hasOwnProperty.call($,"default")?$["default"]:$,__=__&&Object.prototype.hasOwnProperty.call(__,"default")?__["default"]:__,transformer=transformer&&Object.prototype.hasOwnProperty.call(transformer,"default")?transformer["default"]:transformer,shortcut=shortcut&&Object.prototype.hasOwnProperty.call(shortcut,"default")?shortcut["default"]:shortcut,namespaceHelper=namespaceHelper&&Object.prototype.hasOwnProperty.call(namespaceHelper,"default")?namespaceHelper["default"]:namespaceHelper,pluginFactory=pluginFactory&&Object.prototype.hasOwnProperty.call(pluginFactory,"default")?pluginFactory["default"]:pluginFactory,mapHelper=mapHelper&&Object.prototype.hasOwnProperty.call(mapHelper,"default")?mapHelper["default"]:mapHelper;const standard=100,increment=10,threshold={lower:10,upper:200},_setZoomLevel=($target,level)=>{const $parent=$target.parent(),newScale=level/standard,isOverZoom=$parent.outerWidth(!0)<$target.width()*newScale;isOverZoom?(transformer.setTransformOrigin($target,"0 0"),$parent.css("margin-left","0")):(transformer.setTransformOrigin($target,"50% 0"),$parent.css("margin-left","")),transformer.scale($target,newScale)},_resetZoom=$target=>{transformer.reset($target)},forceRepaint=$target=>{const sel=$target[0];sel&&(sel.style.display="none",sel.offsetHeight,sel.style.display="")};var zoom=pluginFactory({name:"zoom",init(){const testRunner=this.getTestRunner(),testRunnerOptions=testRunner.getOptions(),pluginShortcuts=(testRunnerOptions.shortcuts||{})[this.getName()]||{},testRunnerContainer=this.getAreaBroker().getContainer().get(0),isConfigured=()=>mapHelper.hasItemCategory(testRunner.getTestMap(),testRunner.getTestContext().itemIdentifier,"zoom",!0),togglePlugin=()=>{isConfigured()?this.show():this.hide()},zoomAction=dir=>{const inc=increment*dir;if(this.$zoomTarget){const el=this.$zoomTarget[0],before=el.getBoundingClientRect();let sx=this.$container.scrollLeft(),sy=this.$container.scrollTop();this.zoom=_Mathmax3(threshold.lower,Math.min(threshold.upper,this.zoom+inc)),this.zoom===standard?_resetZoom(this.$zoomTarget):_setZoomLevel(this.$zoomTarget,this.zoom),testRunnerContainer.style.setProperty("--tool-zoom-level",this.zoom/standard),forceRepaint(this.$zoomTarget);const after=el.getBoundingClientRect();sx=_Mathmax3(0,sx+(after.width-before.width)/2),sy=_Mathmax3(0,sy+(after.height-before.height)/2),this.$container.scrollLeft(sx).scrollTop(sy)}},zoomIn=()=>{!1!==this.getState("enabled")&&zoomAction(1)},zoomOut=()=>{!1!==this.getState("enabled")&&zoomAction(-1)},zoomReApply=()=>{this.zoom!==standard&&_setZoomLevel(this.$zoomTarget,this.zoom)};this.buttonZoomOut=this.getAreaBroker().getToolbox().createEntry({control:"zoomOut",title:__("Zoom out"),icon:"remove"}),this.buttonZoomIn=this.getAreaBroker().getToolbox().createEntry({control:"zoomIn",title:__("Zoom in"),icon:"add"}),this.buttonZoomIn.on("click",e=>{e.preventDefault(),testRunner.trigger("tool-zoomin")}),this.buttonZoomOut.on("click",e=>{e.preventDefault(),testRunner.trigger("tool-zoomout")}),testRunnerOptions.allowShortcuts&&(pluginShortcuts.in&&shortcut.add(namespaceHelper.namespaceAll(pluginShortcuts.in,this.getName(),!0),()=>{testRunner.trigger("tool-zoomin")},{avoidInput:!0}),pluginShortcuts.out&&shortcut.add(namespaceHelper.namespaceAll(pluginShortcuts.out,this.getName(),!0),()=>{testRunner.trigger("tool-zoomout")},{avoidInput:!0})),togglePlugin(),this.disable(),testRunner.on("loaditem",()=>{this.zoom=standard,togglePlugin(),this.disable()}).on("renderitem",()=>{this.$container=$("#qti-content"),this.$zoomTarget=$(".qti-item"),this.enable()}).on("enabletools",()=>{this.enable()}).on("disabletools unloaditem",()=>{this.disable()}).on("tool-zoomin",zoomIn).on("tool-zoomout",zoomOut).on("tool-zoomreapply",zoomReApply)},destroy(){shortcut.remove(`.${this.getName()}`)},enable(){this.buttonZoomIn.enable(),this.buttonZoomOut.enable()},disable(){this.buttonZoomIn.disable(),this.buttonZoomOut.disable()},show(){this.buttonZoomIn.show(),this.buttonZoomOut.show()},hide(){this.buttonZoomIn.hide(),this.buttonZoomOut.hide()}});return zoom}),function(c){var d=document,a="appendChild",i="styleSheet",s=d.createElement("style");s.type="text/css",d.getElementsByTagName("head")[0].appendChild(s),s.styleSheet?s.styleSheet.cssText=c:s.appendChild(d.createTextNode(c))}("/*\nUsage:\n- linear-gradient((color1, color2, color3)) - returns linear-gradient with evenly distributed colors,\n if 3 colors used then the position of each will be 33,33%\n- linear-gradient((color1 0%, color2 30%, color3 80%)) - returns linear-gradient with manually distributed colors,\n first param - color, second - position. Also you can use px or other valid units for set position.\n*/\n/* based on \"visually-hidden\" mixin in LDS for accessibility goals */\n/* Do not edit */\n.test-runner-scope .content-wrapper p.key-navigation-group, .test-runner-scope .content-wrapper div.key-navigation-group:not(.select2-container) {\n padding: 5px !important;\n}\n.test-runner-scope .content-wrapper .key-navigation-group:not(.qti-extendedTextInteraction):not(.qti-textEntryInteraction):not(.qti-customInteraction) {\n border-width: 1px !important;\n border-style: solid;\n border-color: transparent;\n}\n.test-runner-scope .content-wrapper .key-navigation-group:not(.qti-extendedTextInteraction):not(.qti-textEntryInteraction):not(.qti-customInteraction).focusin {\n border-color: rgb(14, 93, 145) !important;\n outline: none;\n}\n.test-runner-scope .content-wrapper .key-navigation-group:not(.qti-extendedTextInteraction):not(.qti-textEntryInteraction):not(.qti-customInteraction).qti-interaction .qti-choice.key-navigation-highlight:not(.tts-content-node) {\n background: #e7eff4 !important;\n}\n.test-runner-scope .content-wrapper span.key-navigation-group {\n border: none !important;\n}\n.test-runner-scope .content-wrapper span.key-navigation-group.focusin {\n outline: solid rgb(14, 93, 145) 1px !important;\n outline-offset: 1px;\n}\n.test-runner-scope .test-sidebar .key-navigation-group.focusin {\n background: #e7eff4;\n}\n.test-runner-scope .test-sidebar .key-navigation-group .qti-navigator-filters .key-navigation-highlight .qti-navigator-tab {\n border-width: 2px;\n}\n.test-runner-scope .test-sidebar .key-navigation-group .qti-navigator-filters .key-navigation-highlight:focus {\n outline: none;\n}\n.test-runner-scope .test-sidebar .key-navigation-group .qti-navigator-filters .key-navigation-highlight:focus .qti-navigator-tab {\n border-top-color: #222 !important;\n border-left-color: #222 !important;\n border-right-color: #222 !important;\n}\n.test-runner-scope .test-sidebar .key-navigation-group li.qti-navigator-item.key-navigation-highlight {\n padding-left: 8px;\n border-left: solid 2px #222;\n}\n.test-runner-scope .test-sidebar .key-navigation-group li.qti-navigator-item.key-navigation-highlight .key-navigation-highlight:focus {\n outline: none;\n}\n.test-runner-scope .test-sidebar .qti-navigator-fizzy .key-navigation-group.focusin {\n background: #f2f2f2;\n}\n.test-runner-scope .bottom-action-bar.content-action-bar.key-navigation-group.focusin {\n -ms-box-shadow: 0 0 6px 2px #3e7da7;\n -o-box-shadow: 0 0 6px 2px #3e7da7;\n box-shadow: 0 0 6px 2px #3e7da7;\n}\n.test-runner-scope .bottom-action-bar.content-action-bar.key-navigation-group .key-navigation-highlight:focus {\n margin-bottom: 0;\n border-bottom-color: #e7eff4 !important;\n outline: none;\n}\n.test-runner-scope .bottom-action-bar.content-action-bar.key-navigation-group .key-navigation-highlight:focus.active {\n border-bottom-color: transparent !important;\n background: #e7eff4 !important;\n}\n.test-runner-scope .bottom-action-bar.content-action-bar.key-navigation-group .key-navigation-highlight:focus:not(.active):not(:active) .li-inner {\n color: #e7eff4;\n}\n\nheader .settings-menu .key-navigation-group {\n padding-right: 5px;\n}\nheader .settings-menu .key-navigation-group.focusin {\n background-color: rgba(14, 93, 145, 0.5);\n padding-bottom: 10px;\n}\nheader .settings-menu .key-navigation-highlight:focus {\n height: 54px;\n color: white !important;\n border-bottom: solid 2px white !important;\n}\n/*# sourceMappingURL=../../../taoQtiTest/views/node_modules/@oat-sa/tao-test-runner-qti/dist/plugins/content/accessibility/css/key-navigation.css.map *//*\nUsage:\n- linear-gradient((color1, color2, color3)) - returns linear-gradient with evenly distributed colors,\n if 3 colors used then the position of each will be 33,33%\n- linear-gradient((color1 0%, color2 30%, color3 80%)) - returns linear-gradient with manually distributed colors,\n first param - color, second - position. Also you can use px or other valid units for set position.\n*/\n/* based on \"visually-hidden\" mixin in LDS for accessibility goals */\n/* Do not edit */\n.countdown {\n opacity: 0;\n position: relative;\n display: inline-block;\n overflow: hidden;\n text-align: center;\n vertical-align: top;\n line-height: 1.2;\n padding: 0 20px;\n margin-top: -1px;\n height: 100%;\n}\n.countdown.rendered {\n opacity: 1;\n transition: opacity, 300ms, linear, 0s;\n}\n.countdown .label {\n max-width: 130px;\n display: block;\n font-size: 12px;\n font-size: 1.2rem;\n}\n/*# sourceMappingURL=../../../taoQtiTest/views/node_modules/@oat-sa/tao-test-runner-qti/dist/plugins/controls/timer/component/css/countdown.css.map *//*\nUsage:\n- linear-gradient((color1, color2, color3)) - returns linear-gradient with evenly distributed colors,\n if 3 colors used then the position of each will be 33,33%\n- linear-gradient((color1 0%, color2 30%, color3 80%)) - returns linear-gradient with manually distributed colors,\n first param - color, second - position. Also you can use px or other valid units for set position.\n*/\n/* based on \"visually-hidden\" mixin in LDS for accessibility goals */\n/* Do not edit */\n.timer-box {\n opacity: 0;\n padding-top: 0;\n white-space: nowrap;\n /*flex item of control-box */\n flex: 1 0 auto;\n /* is also a flex container for .qti-timer */\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n}\n.timer-box.rendered {\n opacity: 1;\n transition: opacity, 300ms, linear, 0s;\n}\n.timer-box .timer-toggler {\n text-decoration: none;\n color: white;\n line-height: 1.3;\n opacity: 0.68;\n padding: 8px 20px;\n position: relative;\n top: -1px;\n left: 20px;\n z-index: 2;\n transition: opacity, 0.5s, ease-out, 0s;\n}\n.timer-box .timer-toggler:hover, .timer-box .timer-toggler:active, .timer-box .timer-toggler:focus {\n outline: unset;\n}\n.timer-box .timer-toggler:active, .timer-box .timer-toggler:focus {\n border: 2px solid white;\n}\n.timer-box .timer-toggler:hover {\n opacity: 0.93;\n transition: opacity, 0.5s, ease-out, 0s;\n}\n.timer-box.zen .timer-toggler {\n opacity: 0.93;\n transition: opacity, 0.5s, ease-out, 0s;\n}\n.timer-box.zen .countdown .time {\n opacity: 0;\n transition: opacity, 1s, ease-out, 0s;\n}\n.timer-box .countdown::before {\n content: \" \";\n background: rgba(255, 255, 255, 0.3);\n width: 1px;\n height: 20px;\n position: absolute;\n left: 0;\n top: 5px;\n}\n.timer-box .countdown:first-child::before {\n content: none;\n}\n.timer-box .countdown[data-scope=test][data-type=min] {\n order: 5;\n}\n.timer-box .countdown[data-scope=test] {\n order: 10;\n}\n.timer-box .countdown[data-scope=testPart][data-type=min] {\n order: 15;\n}\n.timer-box .countdown[data-scope=testPart] {\n order: 20;\n}\n.timer-box .countdown[data-scope=section][data-type=min] {\n order: 25;\n}\n.timer-box .countdown[data-scope=section] {\n order: 30;\n}\n.timer-box .countdown[data-scope=item][data-type=min] {\n order: 35;\n}\n.timer-box .countdown[data-scope=item] {\n order: 40;\n}\n/*# sourceMappingURL=../../../taoQtiTest/views/node_modules/@oat-sa/tao-test-runner-qti/dist/plugins/controls/timer/component/css/timerbox.css.map */"),define("taoQtiTest/loader/testPlugins.bundle",function(){}); //# sourceMappingURL=testPlugins.min.js.map \ No newline at end of file diff --git a/views/js/loader/testPlugins.min.js.map b/views/js/loader/testPlugins.min.js.map index 49e67a420..730f7d133 100644 --- a/views/js/loader/testPlugins.min.js.map +++ b/views/js/loader/testPlugins.min.js.map @@ -1 +1 @@ -{"version":3,"names":["define","_","pluginFactory","ckEditor","isIOSDevice","test","navigator","userAgent","Object","prototype","hasOwnProperty","call","focusOnFirstField","name","init","self","getTestRunner","after","$input","getAreaBroker","getContentArea","find","not","first","$cke","closest","length","delay","instances","attr","replace","focus","exports","__","getJumpElementFactory","broker","container","getContainer","question","navigation","getNavigationArea","toolbox","getToolboxArea","teststatus","getPanelArea","getItemStatus","item","flagged","answered","viewed","isReviewPanelHidden","testRunner","is","defineProperty","value","component","Handlebars","Helpers0","jumplinksTpl","data","options","asString","html","Template","$","jumplinksFactory","config","jumplinksBox","defaults","on","behavior","selector","eventName","eventParam","forEach","linkDescription","$link","getElement","handleLink","trigger","blur","event","activationKeys","includes","keyCode","setTemplate","defer","__initialized","template","depth0","helpers","partials","program1","compilerInfo","merge","buffer","helperMissing","escapeExpression","functionType","stack1","helper","hash","questionStatus","unless","isReviewPanelEnabled","inverse","noop","fn","program","getEmptyStats","questions","total","questionsViewed","map","getJumps","jumps","getParts","parts","getSections","result","part","sections","section","id","getActiveItem","mapWithActive","active","items","getNextSections","sectionId","canList","getJump","position","getPart","partName","getSection","sectionName","getItem","itemIdentifier","jump","identifier","getItemAt","getItemCategories","Array","isArray","categories","hasItemCategory","category","fuzzyMatch","arguments","taoPrefix","exactMatch","startsWith","normalize","elt","toLowerCase","some","itemCategory","getTestStats","stats","getPartStats","getSectionStats","getScopeStats","scope","testStats","currentPartPosition","isLinear","isCurrentPartLinear","values","filter","_ref","partPosition","sort","a","b","linearPartIndex","findIndex","_ref2","inaccessibleParts","slice","countOfInaccessibleUnasweredQestions","reduce","acc","_ref3","countOfInaccessibleFlaggedQestions","_ref4","assign","getScopeMap","scopeMap","cloneDeep","computeItemStats","computeStats","getScopeMapFromContext","context","testPartId","getItemPart","getItemSection","getItemIdentifier","isFinite","each","callback","isFunction","updateItemStats","accStats","informational","collection","patch","currentMap","partialMap","targetMap","isPlainObject","TypeError","partialPart","targetPartId","partialSection","targetSectionId","reindex","offset","offsetPart","offsetSection","lastPartId","lastSectionId","sortBy","index","positionInPart","positionInSection","createJumpTable","mapHelper","runner","reviewEnabled","getTestMap","getTestContext","itemReviewEnabled","getOptions","review","enabled","keyNavigator","navigableDomElement","shortcutsTpl","shortcutsBoxFactory","ESK_KEY_CODE","shortcutsBox","$element","$closeBtn","$keyNavigationItems","e","target","elements","createFromDoms","propagateTab","setCursorAt","isFocused","cursor","navigable","click","destroy","remove","label","shortcuts","program2","shortcut","shortcutsGroups","$$1","shortcutsFactory","namespaceHelper","containerTpl","plugin","getCurrentItem","testRunnerOptions","pluginShortcuts","getName","areaBroker","getJumpElement","shortcutsConfig","appVersion","indexOf","allowShortcuts","goToTop","add","namespaceAll","avoidInput","prevent","goToQuestion","jumplinks","jumpTo","render","getControlArea","update","params","changeReviewPanel","elem","panelJumplink","parent","removeClass","addClass","changeQuesitionStatus","text","currentItem","updatedConfig","announcedText","$announce","append","wasHidden","jumplinksContainer","prepend","groupId","headerNavigation","getConfig","$headerBar","$headerElements","registerHeaderNavigator","group","$elements","defaultPosition","setupItemsNavigator","setupClickableNavigator","keyNavigators","push","flatNavigation","element","getNavigators","toolbarNavigation","$navigationBar","$toolbarElements","reverseBottomToolbar","get","reverse","registerToolbarNavigator","navigableElements","pos","autoFocus","i","topToolbarNavigation","$topToolbar","registerTopToolbarNavigator","initFizzy","$panel","$navigator","managedNavigators","itemsNavigator","$navigatorTree","$enabledItems","navigableItems","getItemFromNavigable","loop","$parent","hasClass","keyNextItem","keyPrevItem","selectors","filters","enabledItems","navigatorNavigation","isFizzyLayout","$testStatusHeader","navigableTestStatus","testStatusNavigation","keepState","keyNextTab","keyPrevTab","itemListingVisited","filtersNavigator","currentFilter","$filters","navigableFilters","keyNextContent","allowedToNavigateFrom","keyPrevContent","last","$trees","navigableTrees","next","previous","pageNavigation","el","rubricsNavigation","scrollHelper","addLabelledByAttribute","removeLabelledByAttribute","removeAttr","manageLabelledByAttribute","itemNavigation","_this","$content","getQtiChoice","addNavigator","addInputsNavigator","scrollTo","$qtiInteractions","node","parents","itemPos","itemElement","$itemElement","$choiceInput","choiceType","navPos","nav","$nav","off","$inputs","flatRadioNavigation","input","checked","wcagBehavior","linearItemNavigation","$qtiChoices","$lastParent","list","setupListNavigator","choicesNavigators","choiceNavigator","stimulusNavigation","isEnabledDecorator","originalIsEnabled","isEnabled","scrollHeight","clientHeight","jumpLinks","$jumpLinksBox","$links","headerNavigationStrategy","toolbarNavigationStrategy","topToolbarNavigationStrategy","navigatorNavigationStrategy","pageNavigationStrategy","rubricsNavigationStrategy","itemNavigationStrategy","linearItemNavigationStrategy","stimulusNavigationStrategy","jumpLinksNavigationStrategy","providerRegistry","strategies","strategyFactory","strategy","getProvider","registerProvider","from","getCursor","ignoredClass","navigateToNextItem","navigateToPrevItem","activateItem","$elt","mousedown","getStrategies","navigationMode","area","flatten","defaultMode","keyNextGroup","keyPrevGroup","linearMode","nativeMode","defaultModeProvider","linearModeProvider","nativeModeProvider","modes","modeFactory","mode","instance","keyNavigationFactory","contentNavigatorType","groupNavigator","navigationConfig","navigators","document","activeElement","eventNS","setMode","newMode","getMode","isActive","keyNavigatorFactory","keyNavigation_css","defaultPluginConfig","pluginConfig","type","headerTpl","getState","state","header","updateTitle","$title","show","updateState","$state","$container","getArea","dialogAlert","dialogConfirm","shortcutRegistry","globalShortcut","pluginName","actionPrefix","defaultOptions","alert","confirm","dialog","closeAccept","hide","closeReject","closeLast","accept","handle","opened","addHandle","namespace","stack","message","reject","doAccept","reason","doReject","disable","dialogShortcut","enable","removeHandle","closeDialogs","alerts","confirms","testOptions","propagate","set","command","key","before","msg","clear","exitMessages","install","leave","dataIsObject","isObject","skipExitMessage","Promise","resolve","disableItem","hider","itemAlertMessage","getContent","dom","modal","itemRunner","$modalsContainer","_item","startClosed","top","navigationHelper","isLeavingSection","testContext","testMap","direction","sectionStats","nbItems","isEmpty","isLeavingTestPart","testPart","testPartStats","isLast","isLastOf","isFirst","isFirstOf","isNumber","getSiblingItems","itemPosition","size","itemId","siblings","itemChain","ref","directions","parseInt","walkDirection","link","times","getNeighbor","getNextItem","getPreviousItem","isMovingToNextItem","action","isMovingToPreviousItem","isJumpingToItem","buttonTpl","className","program3","apply","program5","icon","program6","program8","control","title","aria","buttonData","end","itemInlineMessage","createOkButton","createElement","dataType","$btn","preventDefault","$button","$navigationContainer","$inlineContainer","removeProp","prop","feedback$1","feedback","closeCurrent","currentFeedback","close","setState","err","error","danger","warning","info","typeCaster","itemScrolling","adaptItemHeight","$itemContainer","$contentArea","contentHeight","getItemRunnerHeight","getExtraGridRowHeight","getSpaceAboveQtiContent","gridRowBottomMargin","qtiItemPadding","$item","isScrollable","strToBool","selectedHeight","parseFloat","containerParent","css","\"overflow-y\"","height","$testRunnerSections","getBoundingClientRect","window","$gridRows","extraHeight","$gridRow","outerHeight","$qtiContent","loadingBar","loading","start","stop","module","inlineMessage","alertMessage","autoscroll","destroyFeedback","removed","renderedFeedbacks","storedFeedback","found","nextStep","defineMode","inline","inlineMode","messagePlugin","modalFeedback","inlineModalFeedback","createMessages","renderingQueue","bInlineMode","isDestroyed","isBoolean","renderingToken","done","tFeedbacks","overlay","stopImmediatePropagation","stopPropagation","shield","unshield","overlayConfig","full","ns","noLabelCls","noLabelHoverCls","labelHiddenCls","separatorCls","collapseTools","collapseNavigation","collapseInOrder","hover","collapseOrder","$window","collapser","buildCollapsiblesList","allCollapsibles","getCollapsiblesFromConfig","getSortedCollapsiblesFromDom","getUnsortedCollapsiblesFromDom","getExtraWidth","expandedWidth","collapsedWidth","collapseCls","outerWidth","toggleCollapsibles","availableWidth","getAvailableWidth","previousAvailableWidth","expandInOrder","collapsiblesCopy","clone","toCollapse","collapseNeeded","shift","getToolbarWidth","forEachRight","toExpand","expandPossible","extraWidth","$actionsBar","width","$toolbox","$navigation","getControlsFromDom","$controls","compact","$controlElements","_allCollapsibles","order","ctrl","dataset","substring","search","forOwn","throttle","blankifyLinks","mathify","require","MathJax","Hub","Queue","rubricBlock","rubrics","then","empty","pollingFactory","waitingDialog","connectivityTpl","defaultConfig","checkInterval","indicator","connectivity","proxy","getProxy","isOnline","polling","setInterval","waiting","displayWaitingDialog","pauseResolve","waitContent","proceedContent","endWait","telemetry","catch","interval","autoStart","disconnect","source","reconnect","isOffline","generalErr","isConnectivityError","loadItem","finish","reasons","comment","itemRef","flags","hasFeedbacks","containsNonPreloadedAssets","hasPci","_len","args","_key","dialogTpl","dialogMessage","dialogConfig","buttons","labels","ok","cancel","pauseContext","subCategory","originalMessage","pauseOnError","returnToHome","reloadPage","processError","location","reload","code","originalCode","loggerFactory","logger","duration","getTestStore","setVolatile","currentUpdatePromise","getItemAttempt","attempt","getPositiveNumber","getPluginStore","durationStore","getItemDuration","attemptId","Error","updateDuration","elapsed","itemAttemptId","setItem","warn","addDurationToCallActionParams","addCallActionParams","itemDuration","getDuration","format","getFixedMap","currentTestPart","fixedTestMap","fixedCurrentItem","reached","completed","updateStats","getCategoriesToMatch","matchSize","getProgressStats","fixedMap","scopedMap","categoriesToMatch","matchedCategories","answerableParts","answerableSections","matchCategories","expectedCategories","minWanted","matched","getRatio","_Mathfloor","Math","floor","getProgressionLabel","patterns","pattern","showTotal","long","short","getPositionProgression","ratio","getRatioProgression","scopes","testSection","indicators","percentage","progress","isMatchedCategories","validCategories","statsComputer","overall","overallCompleted","computeIndicator","indicatorComputer","computeProgress","progressData","progressbar","percentageTpl","percentageIndicatorRenderer","rendererApi","controls","$label","$bar","showLabel","positionTpl","pointTpl","Template$1","positionIndicatorRenderer","count","range","children","progressHelper","percentageRendererFactory","positionRendererFactory","renderers","testRunnerConfig","progressIndicator","rendererFactory","renderer","progressConfig","hiddenByQuestions","hiddenByCategories","isProgressbarHidden","testState","use","qtiFilter","req","res","messages","channel","isLeaving","getTimerMessage","hours","minutes","seconds","unansweredQuestions","timerMessage","timeArr","timeArgArr","unit","idx","answeredMessage","questionsMessage","join","timeEncoder","tooltip","countdown_css","moment","countdownTpl","countdownFactory","$time","$timeScreenreader","countdown","udpate","remainingTime","encodedTime","warningId","warningMessage","encode","time","warnings","findLastKey","shown","threshold","level","warningsForScreenreader","screenreaderWarningId","complete","showBeforeStart","countdownTooltip","isString","displayWarning","create","theme","placement","setTimeout","dispose","warningTimeout","precision","success","timerbox_css","timerboxTpl","timerboxFactory","timerbox","timers","updating","timerIdsToRemove","difference","keys","timerId","removeTimer","timer","addTimer","updateTimer","all","results","$zenModeToggler","getTimers","$countdownContainer","spread","extraTime","remainingWithoutExtraTime","deindex","omit","toggleZenMode","zenMode","startHidden","ariaHidden","enforcedStayStrategy","getCurrentPart","setUp","tearDown","_Mathmax","max","extraTimeStrategy","applyExtraTime","extraTimeSetup","consumedExtraTime","lastConsumedExtraTime","consumed","guidedNavigationStrategy","guidedNavigation","timeoutStrategy","qtiClassName","timeout","responseCardinalities","single","multiple","ordered","record","interactionMinConstraintProperties","matchInteraction","choiceInteraction","orderInteraction","associateInteraction","hottextInteraction","hotspotInteraction","graphicOrderInteraction","graphicAssociateInteraction","selectPointInteraction","currentItemHelper","getDeclarations","responses","getResponseDeclaration","declaration","attributes","toResponse","baseType","cardinality","mappedCardinality","response","transform","v","split","base","isQtiValueNull","stringyValue","isQuestionAnswered","defaultValue","constraintValue","fullyAnswered","currentCardinality","isUndefined","isEqual","guessInteractionConstraintValues","itemBody","bdy","interactions","constraintValues","interaction","qtiClass","__proto__","constraintProperty","responseIdentifier","isAnswered","partially","getResponses","declarations","getStimuliHrefs","pluck","getTextStimuliHrefs","stimuli","textStimuli","stimulusHref","domNode","querySelector","childNodes","child","nodeType","TEXT_NODE","getInstantStats","sync","partiallyAnsweredIsAnswered","isItemCurrentlyAnswered","statsHelper","messageHeaderTpl","getExitMessage","submitButtonLabel","itemsCountMessage","messageEnabled","enableUnansweredItemsWarning","getUnansweredItemsWarning","trim","getHeader","getActionMessage","getFlaggedItemsWarning","flaggedCount","toString","unansweredCount","states","testSession","freeze","initial","interacting","suspended","closed","itemSession","solution","notSelected","warnSectionLeavingStrategy","leaveTimedSection","isTimeout","itemSessionState","timerConfig","endTestWarning","noExitTimedSectionWarning","movePromise","keepUpToTimeout","exitMessage","cancelMove","getStrategyHandler","actives","applyToStrategies","api","strategyHandler","contains","availableStrategies","defaultAvailableStrategies","availableStrategy","getActives","timeConstraints","constraintsWarnings","qtiScope","getScope","applyMessage","displayRemaining","humanize","warningMessages","constraintsWarningsForScreenreader","warningMessagesForScreenraeder","buildTimer","constraintData","pick","allowLateSubmission","originalTime","minTime","minTimeRemaining","maxTime","maxTimeRemaining","remaining","questionsStats","timeConstraint","newTimer","debug","scopeMapping","assessmentTest","assessmentSection","assessmentItemRef","timersFactory","screenreaderNotificationTpl","screenreaderNotificationTimeout","loadTimers","timeStore","savedConsumedTime","restoreTimerFromClient","saveTimers","loadSavedTimers","handleError","screenreaderNotifcationTimeoutId","contextualWarnings","timerWarning","timerWarningForScreenreader","updatedTimers","timerName","statsScope","$screenreaderWarningContainer","startZen","isZen","debounce","clearTimeout","leading","trailing","titleTpl","attribute","titles","updateTitles","currentPart","isDeepestSectionVisible","sectionTitle","$timer","timestamp","Date","now","itemTraceVariables","onError","variables","tracesStore","ITEM_START_TIME_CLIENT","ITEM_END_TIME_CLIENT","ITEM_TIMEZONE","utcOffset","callItemAction","traceData","JSON","stringify","allowPartial","allowSkipping","isInteracting","getItemState","enableAllowSkipping","currenItem","toBoolean","nextWarningHelper","shouldWarnBeforeNext","nextItemWarning","itemCanBeTriedAtWill","remainingAttempts","isNextItemInLinearPart","nextPart","isLastOfPart","shouldWarnBeforeEnd","shouldWarnOnTestEnd","shouldWarnBeforeEndPart","shouldWarnOnPartChange","warnBeforeNext","shouldWarnForUnansweredItems","hasUnanswered","hasFlagged","unansweredOnly","nextPartWarning","warnBeforeEnd","warnBeforeEndPart","specificTitle","enableElement","disableElement","updateElement","isAdaptive","isCatAdaptive","nextItem","isLastItem","doNext","nextItemPosition","unansweredWarning","warningScope","enableNav","triggerNextAction","warningHelper","registerShortcut","kbdShortcut","triggerAccessibility","checkboxTpl","dialogConfirmNext","heading","refuse","checkboxParams","dialogOptions","accepted","content","dlg","autoRender","autoDestroy","onOkBtn","$checkbox","submitChecked","submitUnchecked","linearNextItemWarning","getNextItemCategories","nextSectionWarning","getCustomNextMessage","itemPartiallyAnswered","customNextMessage","doNextWarning","testStore","getStore","store","checkboxValue","enableLinearNextItemWarningCheckbox","forceEnableLinearNextItemWarning","nextSection","getNextSectionCategories","toggle","isWarnSectionLeavingEabled","bind","doPrevious","previousItemWarning","triggerAction","canDoPrevious","currentSection","getCurrentSection","previousSection","previousPart","canMoveBackward","navigatorTpl","navigatorTreeTpl","navigatorFactory","flagItem","_cssCls","setItemFlag","navigatorApi","_defaults","autoScroll","$component","$filterBar","_selectors","filterBar","$tree","tree","$infoAnswered","infoAnswered","$infoViewed","infoViewed","$infoAll","tabInfoAll","$infoUnanswered","showLegend","infoUnanswered","tabInfoUnanswered","$infoFlagged","infoFlagged","tabInfoFlagged","$linearState","linearState","updateConfig","collapseHandle","toggleClass","collapsed","openSelected","infoPanelLabels","togglePanel","infoPanel","partLabels","openOnly","sectionLabels","itemLabels","$target","disabled","canFlag","icons","unseen","select","linearStart","program7","program9","program11","program13","hidden","program4","programWithDepth","program10","depth1","cls","program15","canCollapse","preventsUnseen","collapsible","_iconCls","itemIcons","activeItem","counters","collapsiblePanels","notFlagged","notAnswered","notInformational","_filterMap","unanswered","filtered","flag","getProgressionTotal","progression","jquery","writeCount","criteria","$items","filterCb","$section","$itemsFound","$filtered","scopeClass","getScopedMap","totalQuestions","isSkipaheadEnabled","counter","itm","numberTest","$place","display","min","open","selected","hierarchy","parentsUntil","previousPosition","$previous","root","panel","collapseSelector","componentFactory","itemButtonListFactory","onItemClick","disableUnseenItems","renderItemButtonListComponents","fizzyItemButtonMap","activeItemId","itemButtonListComponents","c","itemButtonListContainer","itemButtonListContainerElem","itemButtonListComponent","scrollContainer","setActiveItem","getFizzyItemButtonMap","displaySectionTitles","displayItemTooltip","nonInformationalCount","fizzyMap","dataSection","fizzySection","dataItem","fizzyItem","numericLabel","ariaLabel","status","updatedMap","updatedItem","updatedScopeMap","updatedFizzyMap","updatedItemData","updateItem","previousItem","$closeButton","closeButton","defaultNavigatorFactory","fizzyNavigatorFactory","isItemFlagged","updateButton","button","turnOff","turnOn","markReviewCategory","setFlag","unsetFlag","setFlagBookmarked","unsetFlagBookmarked","showReview","hideReview","showTestOverview","hideTestOverview","getFlagItemButtonData","getToggleButtonData","getReviewCategories","currentContext","reviewScreen","markReview","isPluginAllowed","navigatorConfig","callTestAction","flagItemButton","flagCurrentItem","flagStatus","forcedState","isHidden","explicitlyHidden","toggleButton","defaultOpen","reviewLayout","previousItemPosition","getToolbox","createEntry","$panelContainer","skip","doSkip","validateResponses","validateOnPreviousMove","enableValidateResponses","warnMessage","warnListener","returnValue","warnBeforeLeaving","addEventListener","removeEventListener","disableRightClick","rightClickEvents","removeEliminationsOnClose","restoreEliminationsOnOpen","eliminator","isPluginEnabled","togglePluginButton","togglePlugin","$choiceInteractions","isEliminable","enableEliminator","disableEliminator","$choices","wasEliminated","classList","setAttribute","removeAttribute","conditionalInit","statifier","maskTpl","answerMaskingFactory","createMask","maskApi","mask","allMasks","reveal","answerMasking","$choice","getMasksState","setMasksState","masked","itemStates","restoreStateOnToggle","restoreStateOnMove","answerMaskingCategory","itemContainsChoiceInteraction","disableMasking","enableMasking","interact","makeStackable","makePlaceable","nouislider","ttsTemplate","maskingComponentFactory","audio","Audio","currentPlayback","mediaContentData","playbackRate","selection","getSelection","spec","clearAPIPElements","elementClass","$contentNodes","handleContentNodeClick","setTTSStateOnContainer","$currentTarget","currentTarget","selectedItemIndex","initNextItem","togglePlayback","initDefaultModeItem","initItemWithTextSelection","initDefaultModePlayback","currentSelection","getRangeAt","commonAncestorContainer","selectedItem","activeElementClass","url","load","play","setMediaContentData","setPlaybackRate","pause","currentTime","isPlaying","toggleSFHMode","isSFHMode","toggleSettings","isSettings","handleResize","offsetFromRight","x","y","getPosition","maxXPosition","innerWidth","moveTo","ttsComponent","stackingOptions","left","maxPlaybackRate","minPlaybackRate","defaultPlaybackRate","$closeElement","$dragElement","$playbackElement","$sfhModeElement","$sliderElement","$settingsElement","interactElement","draggable","manualStart","restrict","restriction","elementRect","right","bottom","onmove","_Mathround","round","xOffset","dx","yOffset","dy","moveBy","noUiSlider","animate","connected","step","stackingScope","getTTSItemData","apipElement","contentLinkInfo","\"@attributes\"","relatedElementInfo","spoken","audioFileInfo","fileHref","audioFile","mimeType","elementId","qtiLinkIdentifierRef","getTTSItemOrder","elementOrder","apipElementOrder","identifierRef","Number","POSITIVE_INFINITY","ttsApipDataProvider","apipData","accessibilityInfo","accessElement","inclusionOrder","textGraphicsDefaultOrder","ttsComponentFactory","ttsApipData","createNavigationGroup","$navigationGroupElement","groupNavigationId","$navigationElements","navigationGroup","$currentElement","getTTSComponent","isConfigured","enablePlugin","disablePlugin","toggleTool","eventKey","endsWith","getData","apipAccessibility","apipItemData","assetManager","dynamicComponent","areaMaskingTpl","dynamicComponentInstance","preview","previewDelay","resizable","preserveAspectRatio","minWidth","maxWidth","minHeight","maskComponent","foo","areaMasking","addMask","masks","without","renderTo","draggableContainer","invoke","calculatorFactory","basicCalculatorFactory","scientificCalculatorFactory","calculatorTpl","defaultCalcConfig","proportionalResize","bodmasCalcConfig","scientificCalcConfig","calculator","maths","degree","getCalculatorCategories","bodmas","scientific","buildCalculator","calcTpl","factory","calcConfig","$calculatorContainer","alternativeTemplate","toggleCalculator","allowIn","stackerFactory","commentTpl","allowComment","contextOptions","toggleComment","$form","val","stacker","bringToFront","appendTo","$cancel","$submit","autoBringToFront","viewerFactory","pdfViewer","panelTpl","showPanel","partial","resizeViewer","hidePanel","hideIfVisible","isVisible","initPanelEvents","stopEvents","hideViewer","$overlay","viewer","setSize","documentViewer","displayViewer","fitToWidth","allowSearch","originalEvent","detail","eventifier","highlighterFactory","getAllRanges","allRanges","rangeCount","discardSelection","removeAllRanges","testHighlighterFactory","isHighlighting","highlightHelper","containerSelector","containersBlackList","clearOnClick","isCollapsed","highlightRanges","MSStream","prevSelection","toggleHighlighting","bool","highlight","restoreIndex","highlightFromIndex","getIndex","getHighlightIndex","clearHighlights","getId","highlighters","highlighterCollection","addHighlighter","hl","getHighlighterById","getAllHighlighters","getItemHighlighter","getNonItemHighlighters","getLength","itemHelper","hasHighlights","buttonMain","pressed","buttonRemove","highlighterStore","saveHighlight","highlightsIndex","saveAll","nonItemHighlighters","every","loadHighlight","textStimulusHref","stimHighlighter","themeHandler","themeLoader","itemThemeSwitcher","themesConfig","available","reloadThemes","themeConfig","selectedTheme","changeTheme","default","themeId","$qtiItem","previousTheme","storage","allMenuEntries","menuEntry","oldNamespace","getActiveNamespace","availableThemes","defaultTheme","activeNamespace","setActiveNamespace","menuButton","createMenu","themeEntry","role","setMenuId","turnOffAll","toggleMenu","setNavigationType","itemThemesStore","itemThemeId","removeItem","makeDraggable","makeResizable","compoundMaskFactory","dimensions","maskConfig","maskAPI","place","placeOverlay","styleResizableEdges","edgesBorders","isResizable","edgeId","addResizeControll","$resizeControll","class","resizeControll","bringAllToFront","innerDrag","closer","invokeOnOverlays","invokeOnMasks","beforeResize","onResize","applyTransformsToOverlays","applyTransformsToInnerDrag","applyTransformsToCloser","createOverlay","overlayAPI","transformOverlay","_sizeBackup","getSize","_posBackup","outerX","outerY","restoreOverlay","appendVisualGuides","borderWidth","borderOffset","visualGuides","$maskBg","$innerWindow","\"border-top-width\"","topHeight","\"border-right-width\"","rightWidth","\"border-bottom-width\"","bottomHeight","\"border-left-width\"","leftWidth","innerHeight","removeVisualGuides","pointerEventsPrefix","PointerEvent","$moveIcon","moveAllPartsTogether","xOffsetRelative","yOffsetRelative","innerX","innerY","invokeOnAll","applyTransforms","createInnerDragHandle","dragRestriction","fixedXY","allParts","nw","rect","constrains","minTopHeight","resizeHandleSize","minBottomHeight","innerDragHeight","$dragIcon","background","applyTransformsToMasks","createCloser","$closeIcon","invokeOn","correctTransforms","setTopHeight","newHeight","newY","fromTop","setRightWidth","newWidth","newX","fromLeft","setBottomHeight","setLeftWidth","createCompoundMask","createPart","edges","addOverlay","maxHeight","setInnerHeight","partConfig","createVisualGuides","compoundMask","defaultDimensions","dragMinWidth","dragMinHeight","setTransforms","dim","getDimensions","lineHeight","ceil","maskOptions","paddingLeft","paddingTop","textPadding","containerWidthHasChanged","newDimensions","toggleMask","transformMask","openMask","closeMask","$maskContainer","_Mathmin","_Mathmax2","magnifierPanelTpl","magnifierPanelFactory","scrollInClone","scrollData","$clonedTarget","$clone","scrollTop","scrollLeft","updateScrollPositions","scrollOffsetsChanged","scrollId","scrolling","uniqueId","magnifierPanel","setScrollingListener","scrollingListenerCallback","removeScrollingListener","applyScrolling","adjustZoomLevel","zoomLevelMin","zoomLevelMax","applyZoomLevel","$inner","zoomLevel","showZoomLevel","$newZoomLevel","$zoomLevel","updateMaxSize","maxRatio","applySize","targetWidth","targetHeight","updateZoom","zoomAt","createObserver","observer","MutationObserver","updateMagnifier","startObserver","observe","childList","characterData","subtree","stopObserver","translateMagnifier","coordinate","actualSize","magnifierSize","delta","getElementFromPoint","elementFromPoint","findSourceNode","$node","$root","indexes","$this","pop","eq","initConfig","levelMin","levelMax","zoomLevelStep","levelStep","$initTarget","dynamicComponentConfig","dynamicComponentDefaultConfig","getZoomLevel","getTarget","setTarget","$newTarget","$viewTarget","zoomTo","zoomBy","zoomIn","zoomOut","translate","scrollingTop","dynamicComponentContext","pageX","pageY","screenRatio","screen","debounceDelay","scrollingDelay","defaultBaseSize","defaultLevelMin","defaultLevelMax","defaultLevel","baseSize","zoomMin","zoomMax","zoomStep","magnifier","getMagnifierPanel","hideMagnifier","toggleMagnifier","showMagnifier","transformer","_Mathmax3","standard","increment","lower","upper","_setZoomLevel","newScale","isOverZoom","setTransformOrigin","scale","_resetZoom","reset","forceRepaint","sel","style","offsetHeight","zoom","testRunnerContainer","zoomAction","dir","inc","$zoomTarget","sx","sy","setProperty","zoomReApply","buttonZoomOut","buttonZoomIn","in","out","d","s","getElementsByTagName","appendChild","styleSheet","cssText","createTextNode"],"sources":["../runner/plugins/content/accessibility/focusOnFirstField.js","../runner/plugins/content/accessibility/jumplinks/helpers.js","../runner/plugins/content/accessibility/jumplinks/jumplinks.js","../runner/helpers/map.js","../runner/helpers/isReviewPanelEnabled.js","../runner/plugins/content/accessibility/jumplinks/shortcuts.js","../runner/plugins/content/accessibility/jumplinks/plugin.js","../runner/plugins/content/accessibility/keyNavigation/strategies/headerNavigation.js","../runner/plugins/content/accessibility/keyNavigation/strategies/toolbarNavigation.js","../runner/plugins/content/accessibility/keyNavigation/strategies/topToolbarNavigation.js","../runner/plugins/content/accessibility/keyNavigation/strategies/navigatorNavigation.js","../runner/plugins/content/accessibility/keyNavigation/strategies/pageNavigation.js","../runner/plugins/content/accessibility/keyNavigation/strategies/rubricsNavigation.js","../runner/plugins/content/accessibility/keyNavigation/strategies/itemNavigation.js","../runner/plugins/content/accessibility/keyNavigation/strategies/linearItemNavigation.js","../runner/plugins/content/accessibility/keyNavigation/strategies/stimulusNavigation.js","../runner/plugins/content/accessibility/keyNavigation/strategies/jumpLinks.js","../runner/plugins/content/accessibility/keyNavigation/strategies/index.js","../runner/plugins/content/accessibility/keyNavigation/strategiesManager.js","../runner/plugins/content/accessibility/keyNavigation/helpers.js","../runner/plugins/content/accessibility/keyNavigation/modes/defaultMode.js","../runner/plugins/content/accessibility/keyNavigation/modes/linearMode.js","../runner/plugins/content/accessibility/keyNavigation/modes/nativeMode.js","../runner/plugins/content/accessibility/keyNavigation/modes/index.js","../runner/plugins/content/accessibility/keyNavigation/modesManager.js","../runner/plugins/content/accessibility/keyNavigation/keyNavigation.js","css!taoQtiTest/runner/plugins/content/accessibility/css/key-navigation","../runner/plugins/content/accessibility/keyNavigation/plugin.js","../runner/plugins/content/accessibility/mainLandmark/header.js","../runner/plugins/content/dialog/dialog.js","../runner/plugins/content/dialog/exitMessages.js","../runner/plugins/content/dialog/itemAlertMessage.js","../runner/helpers/navigation.js","../runner/plugins/content/dialog/itemInlineMessage.js","../runner/plugins/content/feedback/feedback.js","../runner/plugins/content/itemScrolling/itemScrolling.js","../runner/plugins/content/loading/loading.js","../runner/plugins/content/modalFeedback/modalFeedback.js","../runner/plugins/content/overlay/overlay.js","../runner/plugins/content/responsiveness/collapser.js","../runner/plugins/content/rubricBlock/rubricBlock.js","../runner/plugins/controls/connectivity/connectivity.js","../runner/plugins/controls/connectivity/pauseOnError.js","../runner/plugins/controls/duration/duration.js","../runner/plugins/controls/progressbar/progress.js","../runner/plugins/controls/progressbar/renderer/percentage.js","../runner/plugins/controls/progressbar/renderer/position.js","../runner/plugins/controls/progressbar/progressbar.js","../runner/plugins/controls/testState/testState.js","../runner/helpers/getTimerMessage.js","../runner/plugins/controls/timer/component/css/countdown!css","../runner/plugins/controls/timer/component/countdown.js","../runner/plugins/controls/timer/component/css/timerbox!css","../runner/plugins/controls/timer/component/timerbox.js","../runner/plugins/controls/timer/strategy/enforcedStay.js","../runner/plugins/controls/timer/strategy/extraTime.js","../runner/plugins/controls/timer/strategy/guidedNavigation.js","../runner/plugins/controls/timer/strategy/timeout.js","../runner/helpers/currentItem.js","../runner/helpers/stats.js","../runner/helpers/messages.js","../runner/config/states.js","../runner/plugins/controls/timer/strategy/warnSectionLeaving.js","../runner/plugins/controls/timer/strategy/strategyHandler.js","../runner/plugins/controls/timer/timers.js","../runner/plugins/controls/timer/plugin.js","../runner/plugins/controls/title/title.js","../runner/plugins/controls/trace/itemTraceVariables.js","../runner/plugins/navigation/allowSkipping.js","../runner/plugins/navigation/next/nextWarningHelper.js","../runner/plugins/navigation/next.js","../runner/plugins/navigation/next/dialogConfirmNext.js","../runner/plugins/navigation/next/linearNextItemWarning.js","../runner/plugins/navigation/nextSection.js","../runner/plugins/navigation/previous.js","../runner/plugins/navigation/review/navigator.js","../runner/plugins/navigation/review/navigatorFizzy.js","../runner/plugins/navigation/review/review.js","../runner/plugins/navigation/skip.js","../runner/plugins/navigation/validateResponses.js","../runner/plugins/navigation/warnBeforeLeaving.js","../runner/plugins/security/disableRightClick.js","../runner/plugins/tools/answerElimination/eliminator.js","../runner/plugins/tools/answerMasking/answerMasking.js","../runner/plugins/tools/answerMasking/plugin.js","../runner/plugins/tools/apipTextToSpeech/textToSpeech.js","../runner/plugins/tools/apipTextToSpeech/ttsApipDataProvider.js","../runner/plugins/tools/apipTextToSpeech/plugin.js","../runner/plugins/tools/areaMasking/mask.js","../runner/plugins/tools/areaMasking/areaMasking.js","../runner/plugins/tools/calculator.js","../runner/plugins/tools/comment/comment.js","../runner/plugins/tools/documentViewer/documentViewer.js","../runner/plugins/tools/highlighter/highlighter.js","../runner/plugins/tools/highlighter/collection.js","../runner/plugins/tools/highlighter/plugin.js","../runner/plugins/tools/itemThemeSwitcher/itemThemeSwitcher.js","../runner/plugins/tools/lineReader/compoundMask.js","../runner/plugins/tools/lineReader/plugin.js","../runner/plugins/tools/magnifier/magnifierPanel.js","../runner/plugins/tools/magnifier/magnifier.js","../runner/plugins/tools/zoom.js","onLayerEnd0.js","module-create.js"],"sourcesContent":["define('taoQtiTest/runner/plugins/content/accessibility/focusOnFirstField',['lodash', 'taoTests/runner/plugin', 'ckeditor'], function (_, pluginFactory, ckEditor) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n ckEditor = ckEditor && Object.prototype.hasOwnProperty.call(ckEditor, 'default') ? ckEditor['default'] : ckEditor;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2018 (original work) Open Assessment Technologies SA;\n */\n\n /**\n * Check if client uses the iOS device.\n *\n * @returns {*|boolean}\n */\n function isIOSDevice() {\n return /(iPhone|iPad)/i.test(navigator.userAgent);\n }\n\n /**\n * Returns the configured plugin\n */\n var focusOnFirstField = pluginFactory({\n name: 'focusOnFirstField',\n /**\n * Initialize the plugin (called during runner's init)\n */\n init: function init() {\n var self = this;\n\n /**\n * When an Item is loaded - if we set the focus on any input then the ipad sets the focus on the\n * keyboard, so the windows lose focus\n * and we get an error message for the test in fullscreen mode\n */\n if (!isIOSDevice()) {\n this.getTestRunner().after('renderitem', function () {\n var $input = self.getAreaBroker().getContentArea().find('.qti-itemBody').find('input, textarea, select').not(':input[type=button], :input[type=submit], :input[type=reset]').first();\n var $cke = $input.closest('.qti-interaction').find('.cke');\n if ($cke.length) {\n _.delay(function () {\n ckEditor.instances[$cke.attr('id').replace(/^cke_/, '')].focus();\n }, 100);\n } else {\n $input.focus();\n }\n });\n }\n }\n });\n\n return focusOnFirstField;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/accessibility/jumplinks/helpers',['exports', 'i18n'], function (exports, __) { 'use strict';\n\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Returns factory-like object.\n *\n * @param {AreaBroker} broker\n *\n * @returns {Object} - when you access properties it returns the corresponding element and move the focus on it.\n * List of availiable properties\n * - question\n * - navigation\n * - toolbox\n * - teststatus\n */\n const getJumpElementFactory = broker => ({\n get container() {\n return broker.getContainer();\n },\n get question() {\n return broker.getContainer().find('.content-wrapper').first();\n },\n get navigation() {\n return broker.getNavigationArea().find(':not(.hidden)[tabindex]').first();\n },\n get toolbox() {\n return broker.getToolboxArea().find(':not(.hidden)[tabindex]').first();\n },\n get teststatus() {\n return broker.getPanelArea().find(':not(.hidden)[tabindex]').first();\n }\n });\n\n /**\n * Returns testrunner item status.\n *\n * @param {Object} item - testrunner item\n *\n * @returns {String} - localized string.\n */\n const getItemStatus = item => {\n if (item.flagged) {\n return __('Flagged for review');\n }\n if (item.answered) {\n return __('Answered');\n }\n if (item.viewed) {\n return __('Not answered');\n }\n return __('Not seen');\n };\n\n /**\n * Detects if review panel hidden or not.\n *\n * @param {TestRunner} testRunner\n *\n * @returns {Boolean}\n */\n const isReviewPanelHidden = testRunner => testRunner.getAreaBroker().getPanelArea().find('.qti-navigator').is('.hidden');\n\n exports.getItemStatus = getItemStatus;\n exports.getJumpElementFactory = getJumpElementFactory;\n exports.isReviewPanelHidden = isReviewPanelHidden;\n\n Object.defineProperty(exports, '__esModule', { value: true });\n\n});\n\n","define('taoQtiTest/runner/plugins/content/accessibility/jumplinks/jumplinks',['lodash', 'ui/component', 'handlebars', 'lib/handlebars/helpers'], function (_, component, Handlebars, Helpers0) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n component = component && Object.prototype.hasOwnProperty.call(component, 'default') ? component['default'] : component;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, options, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, functionType=\"function\", self=this;\n\n function program1(depth0,data) {\n \n \n return \"hidden\";\n }\n\n buffer += \"\\n\";\n return buffer;\n });\n function jumplinksTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Default config values, see below.\n */\n const defaults = {};\n\n /**\n * Creates and initialize the jumplinks component.\n * Please not the component IS NOT rendered.\n * You'll have to render it by yourself.\n *\n * @returns {jumplinks} the component, initialized and rendered\n */\n function jumplinksFactory(config) {\n /**\n * @typedef {Object} jumplinksBox\n */\n const jumplinksBox = component({}, defaults).on('render', function () {\n // handle related Jump Links\n const behavior = [{\n selector: '[data-jump=question] ',\n eventName: 'jump',\n eventParam: 'question'\n }, {\n selector: '[data-jump=navigation]',\n eventName: 'jump',\n eventParam: 'navigation'\n }, {\n selector: '[data-jump=toolbox]',\n eventName: 'jump',\n eventParam: 'toolbox'\n }, {\n selector: '[data-jump=teststatus]',\n eventName: 'jump',\n eventParam: 'teststatus'\n }, {\n selector: '[data-jump=shortcuts]',\n eventName: 'shortcuts',\n eventParam: 'shortcuts'\n }];\n _.forEach(behavior, linkDescription => {\n const $link = this.getElement().find(linkDescription.selector);\n const handleLink = () => {\n this.trigger(linkDescription.eventName, linkDescription.eventParam);\n this.getElement().find(':focus').blur();\n };\n if ($link) {\n $link.on('click', handleLink);\n $link.on('keyup', event => {\n const activationKeys = [32, 13]; // link can be activated by click or enter/space keys\n if (activationKeys.includes(event.keyCode)) {\n handleLink();\n }\n });\n }\n });\n });\n jumplinksBox.setTemplate(jumplinksTpl);\n _.defer(() => {\n jumplinksBox.init(config);\n });\n return jumplinksBox;\n }\n\n return jumplinksFactory;\n\n});\n\n","define('taoQtiTest/runner/helpers/map',['lodash'], function (_) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * @typedef {Object} itemStats\n * @property {Number} questions - the number of questions items\n * @property {Number} answered - the number of answered questions\n * @property {Number} flagged - the number of items flagged for review\n * @property {Number} viewed - the number of viewed items\n * @property {Number} total - the total number of items\n * @property {Number} questionsViewed - the number of viewed questions\n */\n\n /**\n * Gets an empty stats record\n * @returns {itemStats}\n */\n function getEmptyStats() {\n return {\n questions: 0,\n answered: 0,\n flagged: 0,\n viewed: 0,\n total: 0,\n questionsViewed: 0\n };\n }\n\n /**\n * Defines a helper that provides extractors for an assessment test map\n */\n var map = {\n /**\n * Gets the jumps table\n * @param {Object} map - The assessment test map\n * @returns {Object}\n */\n getJumps: function getJumps(map) {\n return map && map.jumps;\n },\n /**\n * Gets the parts table\n * @param {Object} map - The assessment test map\n * @returns {Object}\n */\n getParts: function getParts(map) {\n return map && map.parts;\n },\n /**\n * Get sections table\n * @param {Object} map - The assessment test map\n * @returns {Object} the sections\n */\n getSections: function getSections(map) {\n var parts = this.getParts(map),\n result = {};\n _.forEach(parts, function (part) {\n var sections = part.sections;\n if (sections) {\n _.forEach(sections, function (section) {\n result[section.id] = section;\n });\n }\n });\n return result;\n },\n /**\n * Get active item from the test map\n * @param {Object} mapWithActive - The assessment test map which has active part/section/item marked\n * @returns {Object} the active item\n */\n getActiveItem: function getActiveItem(mapWithActive) {\n var parts = this.getParts(mapWithActive),\n result = {};\n _.forEach(parts, function (part) {\n var sections = part.sections;\n if (sections) {\n _.forEach(sections, function (section) {\n if (section.active) {\n const items = section.items;\n _.forEach(items, function (item) {\n if (item.active) {\n result = item;\n }\n });\n }\n });\n }\n });\n return result;\n },\n /**\n * Return the list of remaining sections.\n * @param {Object} map - The assessment test map\n * @param {String} sectionId - The next sections will be gathered once this sectionId has been reached\n * @returns {Object} the next sections\n */\n getNextSections: function getNextSections(map, sectionId) {\n var sections = this.getSections(map),\n result = {},\n canList = false;\n _.forEach(sections, function (section) {\n if (canList) {\n result[section.id] = section;\n }\n if (section.id === sectionId) {\n canList = true;\n }\n });\n return result;\n },\n /**\n * Gets the jump at a particular position\n * @param {Object} map - The assessment test map\n * @param {Number} position - The position of the item\n * @returns {Object}\n */\n getJump: function getJump(map, position) {\n var jumps = this.getJumps(map);\n return jumps && jumps[position];\n },\n /**\n * Gets a test part by its identifier\n * @param {Object} map - The assessment test map\n * @param {String} partName - The identifier of the test part\n * @returns {Object}\n */\n getPart: function getPart(map, partName) {\n var parts = this.getParts(map);\n return parts && parts[partName];\n },\n /**\n * Gets a test section by its identifier\n * @param {Object} map - The assessment test map\n * @param {String} sectionName - The identifier of the test section\n * @returns {Object}\n */\n getSection: function getSection(map, sectionName) {\n var parts = this.getParts(map);\n var section = null;\n _.forEach(parts, function (part) {\n var sections = part.sections;\n if (sections && sections[sectionName]) {\n section = sections[sectionName];\n return false;\n }\n });\n return section;\n },\n /**\n * Gets a test item by its identifier\n * @param {Object} map - The assessment test map\n * @param {String} itemIdentifier - The identifier of the test item\n * @returns {Object}\n */\n getItem(map, itemIdentifier) {\n const jump = _.find(this.getJumps(map), {\n identifier: itemIdentifier\n });\n return this.getItemAt(map, jump && jump.position);\n },\n /**\n * Gets a test item by its identifier\n * @param {Object} map - The assessment test map\n * @param {String} itemIdentifier - The identifier of the test item\n * @returns {String[]} the raw list of categories\n */\n getItemCategories(map, itemIdentifier) {\n const item = this.getItem(map, itemIdentifier);\n if (item && Array.isArray(item.categories)) {\n return item.categories;\n }\n return [];\n },\n /**\n * Check if an item has a category\n * @param {Object} map - The assessment test map\n * @param {String} itemIdentifier - The identifier of the test item\n * @param {String} category - the category to check\n * @param {Boolean} [fuzzyMatch=false] - if true the prefix or the case doesn't matter\n * @returns {String[]} the raw list of categories\n */\n hasItemCategory(map, itemIdentifier, category) {\n let fuzzyMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n const taoPrefix = 'x-tao-option-';\n const categories = this.getItemCategories(map, itemIdentifier);\n if (!category || !category.length) {\n return false;\n }\n const exactMatch = categories.includes(category);\n if (exactMatch) {\n return true;\n }\n if (fuzzyMatch) {\n //check by adding the prefix first\n if (!category.startsWith(taoPrefix) && category.includes(`${taoPrefix}${category}`)) {\n return true;\n }\n\n //compare without the prefix and any case system\n const normalize = elt => elt.replace(taoPrefix, '').replace(/[-_\\s]/g, '').toLowerCase();\n return categories.some(itemCategory => normalize(itemCategory) === normalize(category));\n }\n return false;\n },\n /**\n * Gets the global stats of the assessment test\n * @param {Object} map - The assessment test map\n * @returns {itemStats}\n */\n getTestStats: function getTestStats(map) {\n return map && map.stats;\n },\n /**\n * Gets the stats of the test part containing a particular position\n * @param {Object} map - The assessment test map\n * @param {String} partName - The identifier of the test part\n * @returns {itemStats}\n */\n getPartStats: function getPartStats(map, partName) {\n var part = this.getPart(map, partName);\n return part && part.stats;\n },\n /**\n * Gets the stats of the test section containing a particular position\n * @param {Object} map - The assessment test map\n * @param {String} sectionName - The identifier of the test section\n * @returns {itemStats}\n */\n getSectionStats: function getSectionStats(map, sectionName) {\n var section = this.getSection(map, sectionName);\n return section && section.stats;\n },\n /**\n * Gets the stats related to a particular scope\n * @param {Object} map - The assessment test map\n * @param {Number} position - The current position\n * @param {String} [scope] - The name of the scope. Can be: test, part, section (default: test)\n * @returns {itemStats}\n */\n getScopeStats: function getScopeStats(map, position, scope) {\n var jump = this.getJump(map, position);\n switch (scope) {\n case 'section':\n case 'testSection':\n return this.getSectionStats(map, jump && jump.section);\n case 'part':\n case 'testPart':\n return this.getPartStats(map, jump && jump.part);\n\n // During calculation stats for this case,\n // we are considiring all unanswered inaccessible items as answered\n case 'testWithoutInaccessibleItems':\n {\n const testStats = this.getTestStats(map);\n const {\n position: currentPartPosition,\n isLinear: isCurrentPartLinear\n } = this.getPart(map, jump && jump.part);\n const parts = Object.values(this.getParts(map)).filter(_ref => {\n let {\n position: partPosition\n } = _ref;\n return partPosition < currentPartPosition;\n }).sort((a, b) => b - a);\n\n // Find the neirest part to which test taker can not navigate\n const linearPartIndex = isCurrentPartLinear ? 0 : parts.findIndex(_ref2 => {\n let {\n isLinear\n } = _ref2;\n return isLinear;\n });\n if (linearPartIndex === -1) {\n return testStats;\n }\n\n // Calculate all unanswered and flagged questions in inaccessible parts\n const inaccessibleParts = parts.slice(linearPartIndex);\n const countOfInaccessibleUnasweredQestions = inaccessibleParts.reduce((acc, _ref3) => {\n let {\n stats: {\n questions,\n answered\n }\n } = _ref3;\n return acc + (questions - answered);\n }, 0);\n const countOfInaccessibleFlaggedQestions = inaccessibleParts.reduce((acc, _ref4) => {\n let {\n stats: {\n flagged\n }\n } = _ref4;\n return acc + flagged;\n }, 0);\n return Object.assign({}, testStats, {\n answered: testStats.answered + countOfInaccessibleUnasweredQestions,\n flagged: testStats.flagged - countOfInaccessibleFlaggedQestions\n });\n }\n default:\n case 'test':\n return this.getTestStats(map);\n }\n },\n /**\n * Gets the map of a particular scope from a particular position\n * @param {Object} map - The assessment test map\n * @param {Number} position - The current position\n * @param {String} [scope] - The name of the scope. Can be: test, part, section (default: test)\n * @returns {object} The scoped map\n */\n getScopeMap: function getScopeMap(map, position, scope) {\n // need a clone of the map as we will change some properties\n var scopeMap = _.cloneDeep(map || {});\n\n // gets the current part and section\n var jump = this.getJump(scopeMap, position);\n var part = this.getPart(scopeMap, jump && jump.part);\n var section = this.getSection(scopeMap, jump && jump.section);\n\n // reduce the map to the scope part\n if (scope && scope !== 'test') {\n scopeMap.parts = {};\n if (part) {\n scopeMap.parts[jump.part] = part;\n }\n }\n\n // reduce the map to the scope section\n if (part && (scope === 'section' || scope === 'testSection')) {\n part.sections = {};\n if (section) {\n part.sections[jump.section] = section;\n }\n }\n\n // update the stats to reflect the scope\n if (section) {\n section.stats = this.computeItemStats(section.items);\n }\n if (part) {\n part.stats = this.computeStats(part.sections);\n }\n scopeMap.stats = this.computeStats(scopeMap.parts);\n return scopeMap;\n },\n /**\n * Gets the map of a particular scope from a current context\n * @param {Object} map - The assessment test map\n * @param {Object} context - The current session context\n * @param {String} [scope] - The name of the scope. Can be: test, part, section (default: test)\n * @returns {object} The scoped map\n */\n getScopeMapFromContext: function getScopeMapFromContext(map, context, scope) {\n // need a clone of the map as we will change some properties\n var scopeMap = _.cloneDeep(map || {});\n var part;\n var section;\n\n // gets the current part and section\n if (context && context.testPartId) {\n part = this.getPart(scopeMap, context.testPartId);\n }\n if (context && context.sectionId) {\n section = this.getSection(scopeMap, context.sectionId);\n }\n\n // reduce the map to the scope part\n if (scope && scope !== 'test') {\n scopeMap.parts = {};\n if (part) {\n scopeMap.parts[context.testPartId] = part;\n }\n }\n\n // reduce the map to the scope section\n if (part && (scope === 'section' || scope === 'testSection')) {\n part.sections = {};\n if (section) {\n part.sections[context.sectionId] = section;\n }\n }\n\n // update the stats to reflect the scope\n if (section) {\n section.stats = this.computeItemStats(section.items);\n }\n if (part) {\n part.stats = this.computeStats(part.sections);\n }\n scopeMap.stats = this.computeStats(scopeMap.parts);\n return scopeMap;\n },\n /**\n * Gets the test part containing a particular position\n * @param {Object} map - The assessment test map\n * @param {Number} position - The position of the item\n * @returns {Object}\n */\n getItemPart: function getItemPart(map, position) {\n var jump = this.getJump(map, position);\n return this.getPart(map, jump && jump.part);\n },\n /**\n * Gets the test section containing a particular position\n * @param {Object} map - The assessment test map\n * @param {Number} position - The position of the item\n * @returns {Object}\n */\n getItemSection: function getItemSection(map, position) {\n var jump = this.getJump(map, position);\n var part = this.getPart(map, jump && jump.part);\n var sections = part && part.sections;\n return sections && sections[jump && jump.section];\n },\n /**\n * Gets the item located at a particular position\n * @param {Object} map - The assessment test map\n * @param {Number} position - The position of the item\n * @returns {Object}\n */\n getItemAt: function getItemAt(map, position) {\n var jump = this.getJump(map, position);\n var part = this.getPart(map, jump && jump.part);\n var sections = part && part.sections;\n var section = sections && sections[jump && jump.section];\n var items = section && section.items;\n return items && items[jump && jump.identifier];\n },\n /**\n * Gets the identifier of an existing item\n * @param {Object} map - The assessment test map\n * @param {Number|String} position - The position of the item, can already be the identifier\n * @returns {String}\n */\n getItemIdentifier: function getItemIdentifier(map, position) {\n var item;\n if (_.isFinite(position)) {\n item = this.getItemAt(map, position);\n } else {\n item = this.getItem(map, position);\n }\n return item && item.id;\n },\n /**\n * Applies a callback on each item of the provided map\n * @param {Object} map - The assessment test map\n * @param {Function} callback(item, section, part, map) - A callback to apply on each item\n * @returns {Object}\n */\n each: function each(map, callback) {\n if (_.isFunction(callback)) {\n _.forEach(map && map.parts, function (part) {\n _.forEach(part && part.sections, function (section) {\n _.forEach(section && section.items, function (item) {\n callback(item, section, part, map);\n });\n });\n });\n }\n return map;\n },\n /**\n * Update the map stats from a particular item\n * @param {Object} map - The assessment test map\n * @param {Number} position - The position of the item\n * @returns {Object}\n */\n updateItemStats: function updateItemStats(map, position) {\n var jump = this.getJump(map, position);\n var part = this.getPart(map, jump && jump.part);\n var sections = part && part.sections;\n var section = sections && sections[jump && jump.section];\n if (section) {\n section.stats = this.computeItemStats(section.items);\n }\n if (part) {\n part.stats = this.computeStats(part.sections);\n }\n if (map) {\n map.stats = this.computeStats(map.parts);\n }\n return map;\n },\n /**\n * Computes the stats for a list of items\n * @param {Object} items\n * @returns {itemStats}\n */\n computeItemStats: function computeItemStats(items) {\n return _.reduce(items, function accStats(acc, item) {\n if (!item.informational) {\n acc.questions++;\n if (item.answered) {\n acc.answered++;\n }\n if (item.viewed) {\n acc.questionsViewed++;\n }\n }\n if (item.flagged) {\n acc.flagged++;\n }\n if (item.viewed) {\n acc.viewed++;\n }\n acc.total++;\n return acc;\n }, getEmptyStats());\n },\n /**\n * Computes the global stats of a collection of stats\n * @param {Object} collection\n * @returns {itemStats}\n */\n computeStats: function computeStats(collection) {\n return _.reduce(collection, function accStats(acc, item) {\n acc.questions += item.stats.questions;\n acc.answered += item.stats.answered;\n acc.flagged += item.stats.flagged;\n acc.viewed += item.stats.viewed;\n acc.total += item.stats.total;\n acc.questionsViewed += item.stats.questionsViewed;\n return acc;\n }, getEmptyStats());\n },\n /**\n * Patch a testMap with a partial testMap.\n *\n * If the currentMap is null or the scope is test,\n * we just use the partialMap as it is.\n *\n * Indexes, position and stats will be (re)built.\n *\n * @param {Object} currentMap - the map to patch\n * @param {Object} partialMap - the patch\n * @param {String} partialMap.scope - indicate the scope of the patch (test, part or section)\n * @returns {Object} the patched testMap\n * @throws {TypeError} if the partialMap is no a map\n */\n patch: function patch(currentMap, partialMap) {\n var self = this;\n var targetMap;\n if (!_.isPlainObject(partialMap) || !partialMap.parts) {\n throw new TypeError('Invalid test map format');\n }\n if (!currentMap || partialMap.scope === 'test') {\n targetMap = _.cloneDeep(partialMap);\n } else {\n targetMap = _.cloneDeep(currentMap);\n _.forEach(partialMap.parts, function (partialPart, targetPartId) {\n if (partialMap.scope === 'part') {\n //replace the target part\n targetMap.parts[targetPartId] = _.cloneDeep(partialPart);\n }\n if (partialMap.scope === 'section') {\n _.forEach(partialPart.sections, function (partialSection, targetSectionId) {\n //replace the target section\n targetMap.parts[targetPartId].sections[targetSectionId] = _.cloneDeep(partialSection);\n\n //compte new section stats\n targetMap.parts[targetPartId].sections[targetSectionId].stats = self.computeItemStats(targetMap.parts[targetPartId].sections[targetSectionId].items);\n });\n }\n //compte new/updated part stats\n targetMap.parts[targetPartId].stats = self.computeStats(targetMap.parts[targetPartId].sections);\n });\n //compte updated test stats\n targetMap.stats = this.computeStats(targetMap.parts);\n }\n\n //the updated map can have a different size than the original\n targetMap = this.reindex(targetMap);\n return targetMap;\n },\n /**\n * Rebuild the indexes, positions of all map parts.\n * Then recreate the jump table.\n *\n * @param {Object} map - the map to reindex\n * @returns {Object} the brand new map\n * @throws {TypeError} if the map is no a map\n */\n reindex: function reindex(map) {\n var offset = 0;\n var offsetPart = 0;\n var offsetSection = 0;\n var lastPartId;\n var lastSectionId;\n if (!_.isPlainObject(map) || !map.parts) {\n throw new TypeError('Invalid test map format');\n }\n\n //remove the jump table\n map.jumps = [];\n\n //browse the test map, by position\n _.sortBy(map && map.parts, 'position').forEach(function (part) {\n _.sortBy(part && part.sections, 'position').forEach(function (section) {\n _.sortBy(section && section.items, 'position').forEach(function (item) {\n if (lastPartId !== part.id) {\n offsetPart = 0;\n lastPartId = part.id;\n part.position = offset;\n }\n if (lastSectionId !== section.id) {\n offsetSection = 0;\n lastSectionId = section.id;\n section.position = offset;\n }\n item.position = offset;\n item.index = offsetSection + 1;\n item.positionInPart = offsetPart;\n item.positionInSection = offsetSection;\n map.jumps[offset] = {\n identifier: item.id,\n section: section.id,\n part: part.id,\n position: offset\n };\n offset++;\n offsetSection++;\n offsetPart++;\n });\n });\n });\n return map;\n },\n /**\n * Create the jump table for a test map\n *\n * @param {Object} map - the map\n * @returns {Object} the brand new map with a jump table\n * @throws {TypeError} if the map is no a map\n */\n createJumpTable: function createJumpTable(map) {\n if (!_.isPlainObject(map) || !map.parts) {\n throw new TypeError('Invalid test map format');\n }\n map.jumps = [];\n this.each(map, function (item, section, part) {\n var offset = item.position;\n map.jumps[offset] = {\n identifier: item.id,\n section: section.id,\n part: part.id,\n position: offset\n };\n });\n return map;\n }\n };\n\n return map;\n\n});\n\n","define('taoQtiTest/runner/helpers/isReviewPanelEnabled',['taoQtiTest/runner/helpers/map'], function (mapHelper) { 'use strict';\n\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n\n /**\n * Tells if the review panel is enabled\n * @returns {Boolean}\n */\n function isReviewPanelEnabled(runner) {\n const reviewEnabled = mapHelper.hasItemCategory(runner.getTestMap(), runner.getTestContext().itemIdentifier, 'reviewScreen', true);\n const itemReviewEnabled = runner.getOptions().review.enabled;\n return reviewEnabled && itemReviewEnabled;\n }\n\n return isReviewPanelEnabled;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/accessibility/jumplinks/shortcuts',['i18n', 'lodash', 'ui/component', 'ui/keyNavigation/navigator', 'ui/keyNavigation/navigableDomElement', 'handlebars', 'lib/handlebars/helpers'], function (__, _, component, keyNavigator, navigableDomElement, Handlebars, Helpers0) { 'use strict';\n\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n component = component && Object.prototype.hasOwnProperty.call(component, 'default') ? component['default'] : component;\n keyNavigator = keyNavigator && Object.prototype.hasOwnProperty.call(keyNavigator, 'default') ? keyNavigator['default'] : keyNavigator;\n navigableDomElement = navigableDomElement && Object.prototype.hasOwnProperty.call(navigableDomElement, 'default') ? navigableDomElement['default'] : navigableDomElement;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, options, functionType=\"function\", escapeExpression=this.escapeExpression, self=this, helperMissing=helpers.helperMissing;\n\n function program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\\n
          \\n

          \";\n if (helper = helpers.label) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.label); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"

          \\n
            \\n \";\n stack1 = helpers.each.call(depth0, (depth0 && depth0.shortcuts), {hash:{},inverse:self.noop,fn:self.program(2, program2, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n
          \\n
          \\n \";\n return buffer;\n }\n function program2(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\\n
        • \\n \\n \";\n if (helper = helpers.shortcut) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.shortcut); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\n \\n \\n \";\n if (helper = helpers.label) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.label); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\n \\n
        • \\n \";\n return buffer;\n }\n\n buffer += \"
          \\n
          \\n

          \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Keyboard Navigation\", options) : helperMissing.call(depth0, \"__\", \"Keyboard Navigation\", options)))\n + \"\\n

          \\n
          \\n

          \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Keyboard shortcuts for the Accessibility Tools are available to the Test-taker.\", options) : helperMissing.call(depth0, \"__\", \"Keyboard shortcuts for the Accessibility Tools are available to the Test-taker.\", options)))\n + \"\\n

          \\n

          \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"You can magnify the content by up to 200%. Check your browser settings to find out how to do it.\", options) : helperMissing.call(depth0, \"__\", \"You can magnify the content by up to 200%. Check your browser settings to find out how to do it.\", options)))\n + \"\\n

          \\n
          \\n \\n \";\n stack1 = helpers.each.call(depth0, (depth0 && depth0.shortcutsGroups), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n
          \\n
          \\n\";\n return buffer;\n });\n function shortcutsTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Default config values, see below.\n */\n const defaults = {\n shortcutsGroups: [{\n id: 'navigation-shortcuts',\n label: __('Navigation shortcuts'),\n shortcuts: [{\n id: 'next',\n shortcut: 'ALT + Shift + N',\n label: __('Go to the next question')\n }, {\n id: 'previous',\n shortcut: 'ALT + Shift + P',\n label: __('Go to the previous question')\n }, {\n id: 'current',\n shortcut: 'ALT + Shift + Q',\n label: __('Go to the current question')\n }, {\n id: 'top',\n shortcut: 'ALT + Shift + T',\n label: __('Go to the top of the page')\n }]\n }]\n };\n\n /**\n * Creates and initialize the shortcuts component.\n * Please not the component IS NOT rendered.\n * You'll have to render it by yourself.\n *\n * @param {Object} config\n * @returns {shortcutsBox} the component, initialized and rendered\n */\n function shortcutsBoxFactory(config) {\n const ESK_KEY_CODE = 27;\n const shortcutsBox = component({}, defaults).on('render', function () {\n const $element = this.getElement();\n const $closeBtn = $element.find('.btn-close');\n const $keyNavigationItems = this.getElement().find('.shortcuts-list, .btn-close');\n $closeBtn.on('click', () => this.trigger('close'));\n // handle overlay click\n $element.on('click', e => {\n if ($element.is(e.target)) {\n this.trigger('close');\n }\n });\n $element.on('keyup', e => {\n if (e.keyCode === ESK_KEY_CODE) {\n this.trigger('close');\n }\n });\n this.navigator = keyNavigator({\n elements: navigableDomElement.createFromDoms($keyNavigationItems),\n propagateTab: false\n })\n // keep cursor at close button\n .on('tab', function () {\n this.setCursorAt(1);\n }).on('shift+tab', function () {\n this.setCursorAt(1);\n })\n // prevent focus move from shortcuts modal\n .on('blur', () => {\n _.defer(() => {\n if (!this.navigator.isFocused()) {\n this.navigator.focus();\n }\n });\n }).on('activate', function (cursor) {\n cursor.navigable.getElement().click();\n });\n this.navigator.first();\n }).on('destroy', function () {\n this.navigator.destroy();\n this.getElement().remove();\n });\n shortcutsBox.setTemplate(shortcutsTpl);\n shortcutsBox.init(config);\n return shortcutsBox;\n }\n\n return shortcutsBoxFactory;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/accessibility/jumplinks/plugin',['i18n', 'jquery', 'taoTests/runner/plugin', 'taoQtiTest/runner/helpers/isReviewPanelEnabled', 'taoQtiTest/runner/plugins/content/accessibility/jumplinks/helpers', 'taoQtiTest/runner/plugins/content/accessibility/jumplinks/jumplinks', 'taoQtiTest/runner/plugins/content/accessibility/jumplinks/shortcuts', 'util/shortcut', 'util/namespace', 'handlebars', 'lib/handlebars/helpers'], function (__, $$1, pluginFactory, isReviewPanelEnabled, helpers, jumplinksFactory, shortcutsFactory, shortcut, namespaceHelper, Handlebars, Helpers0) { 'use strict';\n\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n isReviewPanelEnabled = isReviewPanelEnabled && Object.prototype.hasOwnProperty.call(isReviewPanelEnabled, 'default') ? isReviewPanelEnabled['default'] : isReviewPanelEnabled;\n jumplinksFactory = jumplinksFactory && Object.prototype.hasOwnProperty.call(jumplinksFactory, 'default') ? jumplinksFactory['default'] : jumplinksFactory;\n shortcutsFactory = shortcutsFactory && Object.prototype.hasOwnProperty.call(shortcutsFactory, 'default') ? shortcutsFactory['default'] : shortcutsFactory;\n shortcut = shortcut && Object.prototype.hasOwnProperty.call(shortcut, 'default') ? shortcut['default'] : shortcut;\n namespaceHelper = namespaceHelper && Object.prototype.hasOwnProperty.call(namespaceHelper, 'default') ? namespaceHelper['default'] : namespaceHelper;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); \n\n\n return \"\\n\";\n });\n function containerTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Creates the JumpLinks plugin.\n * adding jumplinks accessibility feature for quick navigation\n */\n var plugin = pluginFactory({\n name: 'jumplinks',\n /**\n * Initializes the plugin (called during runner's init)\n */\n init() {\n const testRunner = this.getTestRunner();\n const item = testRunner.getCurrentItem();\n const config = {\n isReviewPanelEnabled: isReviewPanelEnabled(testRunner),\n questionStatus: helpers.getItemStatus(item)\n };\n const testRunnerOptions = testRunner.getOptions();\n const pluginShortcuts = (testRunnerOptions.shortcuts || {})[this.getName()] || {};\n const areaBroker = this.getAreaBroker();\n const getJumpElement = helpers.getJumpElementFactory(areaBroker);\n const shortcutsConfig = navigator.appVersion.indexOf(\"Mac\") !== -1 ? {\n shortcutsGroups: [{\n id: 'navigation-shortcuts',\n label: __('Navigation shortcuts'),\n shortcuts: [{\n id: 'next',\n shortcut: 'OPTION + Shift + N',\n label: __('Go to the next question')\n }, {\n id: 'previous',\n shortcut: 'OPTION + Shift + P',\n label: __('Go to the previous question')\n }, {\n id: 'current',\n shortcut: 'OPTION + Shift + Q',\n label: __('Go to the current question')\n }, {\n id: 'top',\n shortcut: 'OPTION + Shift + T',\n label: __('Go to the top of the page')\n }]\n }]\n } : {};\n if (testRunnerOptions.allowShortcuts) {\n pluginShortcuts.goToTop && shortcut.add(namespaceHelper.namespaceAll(pluginShortcuts.goToTop, this.getName(), true), function () {\n $$1('[tabindex]').first().focus();\n }, {\n avoidInput: true,\n prevent: true\n });\n pluginShortcuts.goToQuestion && shortcut.add(namespaceHelper.namespaceAll(pluginShortcuts.goToQuestion, this.getName(), true), function () {\n getJumpElement.question.focus();\n }, {\n avoidInput: true,\n prevent: true\n });\n }\n this.jumplinks = jumplinksFactory(config).on('render', () => {\n this.jumplinks.on('jump', jumpTo => {\n const $element = getJumpElement[jumpTo];\n $element.focus();\n });\n this.jumplinks.on('shortcuts', () => {\n if (this.shortcuts) {\n return;\n }\n this.shortcuts = shortcutsFactory(shortcutsConfig);\n this.shortcuts.render(this.getAreaBroker().getControlArea());\n this.shortcuts.on('close', () => {\n this.shortcuts.destroy();\n this.shortcuts = null;\n });\n });\n }).on('update', function update(params) {\n this.trigger('changeReviewPanel', params.isReviewPanelEnabled);\n this.trigger('changeQuesitionStatus', params.questionStatus);\n }).on('changeReviewPanel', function changeReviewPanel(enabled) {\n const elem = this.getElement();\n const panelJumplink = elem.find('[data-jump=\"teststatus\"]').parent();\n if (enabled) {\n panelJumplink.removeClass('hidden');\n } else {\n panelJumplink.addClass('hidden');\n }\n }).on('changeQuesitionStatus', function changeQuesitionStatus(questionStatus) {\n const elem = this.getElement();\n const text = `${__('Question')} - ${questionStatus}`;\n elem.find('[data-jump=\"question\"] > b').text(text);\n });\n testRunner.on('renderitem', () => {\n const currentItem = testRunner.getCurrentItem();\n const updatedConfig = {\n isReviewPanelEnabled: !helpers.isReviewPanelHidden(testRunner) && isReviewPanelEnabled(testRunner),\n questionStatus: helpers.getItemStatus(currentItem)\n };\n const announcedText = __('Item %s loaded', currentItem.position);\n let $announce = $$1('[aria-live=polite][role=alert]').first();\n if ($announce.length !== 1) {\n $announce = $$1('
          ');\n $$1('main').first().append($announce);\n }\n $announce.text(announcedText);\n this.jumplinks.trigger('update', updatedConfig);\n }).on('tool-flagitem', () => {\n const currentItem = testRunner.getCurrentItem();\n const questionStatus = helpers.getItemStatus(Object.assign({}, currentItem, {\n flagged: !currentItem.flagged\n }));\n this.jumplinks.trigger('changeQuesitionStatus', questionStatus);\n }).on('tool-reviewpanel', () => {\n const wasHidden = helpers.isReviewPanelHidden(testRunner);\n this.jumplinks.trigger('changeReviewPanel', wasHidden);\n }).after('renderitem', () => {\n getJumpElement.question.attr('tabindex', '-1').focus();\n });\n },\n /**\n * Called during the runner's render phase\n */\n render: function render() {\n const jumplinksContainer = $$1(containerTpl());\n $$1('.content-wrap').prepend(jumplinksContainer);\n this.jumplinks.render(jumplinksContainer);\n }\n });\n\n return plugin;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/headerNavigation',['jquery', 'ui/keyNavigation/navigator', 'ui/keyNavigation/navigableDomElement', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/helpers'], function ($, keyNavigator, navigableDomElement, helpers) { 'use strict';\n\n $ = $ && Object.prototype.hasOwnProperty.call($, 'default') ? $['default'] : $;\n keyNavigator = keyNavigator && Object.prototype.hasOwnProperty.call(keyNavigator, 'default') ? keyNavigator['default'] : keyNavigator;\n navigableDomElement = navigableDomElement && Object.prototype.hasOwnProperty.call(navigableDomElement, 'default') ? navigableDomElement['default'] : navigableDomElement;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 Open Assessment Technologies SA ;\n */\n\n /**\n * The identifier the keyNavigator group\n * @type {String}\n */\n const groupId = 'header-toolbar';\n\n /**\n * Key navigator strategy applying onto the header bar.\n * @type {Object} keyNavigationStrategy\n */\n var headerNavigation = {\n name: 'header',\n /**\n * Builds the header navigation strategy.\n *\n * @returns {keyNavigationStrategy}\n */\n init() {\n const config = this.getConfig();\n // we need a global selector as there is currently no way to access the delivery frame from the test runner\n const $headerBar = $('header');\n const $headerElements = $headerBar.find('a:visible');\n const registerHeaderNavigator = (id, group, $elements) => {\n const elements = navigableDomElement.createFromDoms($elements);\n if (elements.length) {\n const navigator = keyNavigator({\n id,\n group,\n elements,\n propagateTab: false,\n defaultPosition: 0\n });\n helpers.setupItemsNavigator(navigator, config);\n helpers.setupClickableNavigator(navigator);\n this.keyNavigators.push(navigator);\n }\n };\n this.keyNavigators = [];\n if (config.flatNavigation) {\n $headerElements.each((index, element) => registerHeaderNavigator(`${groupId}-${index}`, $headerBar, $(element)));\n } else {\n registerHeaderNavigator(groupId, $headerBar, $headerElements);\n }\n return this;\n },\n /**\n * Gets the list of applied navigators\n * @returns {keyNavigator[]}\n */\n getNavigators() {\n return this.keyNavigators;\n },\n /**\n * Tears down the keyNavigator strategy\n * @returns {keyNavigationStrategy}\n */\n destroy() {\n this.keyNavigators.forEach(navigator => navigator.destroy());\n this.keyNavigators = [];\n return this;\n }\n };\n\n return headerNavigation;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/toolbarNavigation',['lodash', 'jquery', 'ui/keyNavigation/navigator', 'ui/keyNavigation/navigableDomElement', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/helpers'], function (_, $, keyNavigator, navigableDomElement, helpers) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n $ = $ && Object.prototype.hasOwnProperty.call($, 'default') ? $['default'] : $;\n keyNavigator = keyNavigator && Object.prototype.hasOwnProperty.call(keyNavigator, 'default') ? keyNavigator['default'] : keyNavigator;\n navigableDomElement = navigableDomElement && Object.prototype.hasOwnProperty.call(navigableDomElement, 'default') ? navigableDomElement['default'] : navigableDomElement;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 Open Assessment Technologies SA ;\n */\n\n /**\n * The identifier the keyNavigator group\n * @type {String}\n */\n const groupId = 'bottom-toolbar';\n\n /**\n * Key navigator strategy applying onto the tools bar\n * @type {Object} keyNavigationStrategy\n */\n var toolbarNavigation = {\n name: 'toolbar',\n /**\n * Builds the toolbar navigation strategy.\n *\n * @returns {keyNavigationStrategy}\n */\n init() {\n const config = this.getConfig();\n const $navigationBar = this.getTestRunner().getAreaBroker().getContainer().find('.bottom-action-bar');\n let $toolbarElements = $navigationBar.find('.action:not(.btn-group):visible, .action.btn-group .li-inner:visible');\n if (config.reverseBottomToolbar) {\n $toolbarElements = $($toolbarElements.get().reverse());\n }\n const registerToolbarNavigator = (id, group, $elements) => {\n const elements = navigableDomElement.createFromDoms($elements);\n if (elements.length) {\n const navigator = keyNavigator({\n id,\n group,\n elements,\n propagateTab: false,\n defaultPosition(navigableElements) {\n let pos = 0;\n\n // search for the position of the \"Next\" button if any,\n // otherwise take the position of the last element\n if (config.autoFocus) {\n pos = navigableElements.length - 1;\n _.forEach(navigableElements, (navigable, i) => {\n const $element = navigable.getElement();\n if ($element.data('control') === 'move-forward' || $element.data('control') === 'move-end') {\n pos = i;\n }\n });\n }\n return pos;\n }\n });\n helpers.setupItemsNavigator(navigator, config);\n helpers.setupClickableNavigator(navigator);\n this.keyNavigators.push(navigator);\n }\n };\n this.keyNavigators = [];\n if (config.flatNavigation) {\n $toolbarElements.each((index, element) => registerToolbarNavigator(`${groupId}-${index}`, $navigationBar, $(element)));\n } else {\n registerToolbarNavigator(groupId, $navigationBar, $toolbarElements);\n }\n return this;\n },\n /**\n * Gets the list of applied navigators\n * @returns {keyNavigator[]}\n */\n getNavigators() {\n return this.keyNavigators;\n },\n /**\n * Tears down the keyNavigator strategy\n * @returns {keyNavigationStrategy}\n */\n destroy() {\n this.keyNavigators.forEach(navigator => navigator.destroy());\n this.keyNavigators = [];\n return this;\n }\n };\n\n return toolbarNavigation;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/topToolbarNavigation',['jquery', 'ui/keyNavigation/navigator', 'ui/keyNavigation/navigableDomElement', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/helpers'], function ($, keyNavigator, navigableDomElement, helpers) { 'use strict';\n\n $ = $ && Object.prototype.hasOwnProperty.call($, 'default') ? $['default'] : $;\n keyNavigator = keyNavigator && Object.prototype.hasOwnProperty.call(keyNavigator, 'default') ? keyNavigator['default'] : keyNavigator;\n navigableDomElement = navigableDomElement && Object.prototype.hasOwnProperty.call(navigableDomElement, 'default') ? navigableDomElement['default'] : navigableDomElement;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 Open Assessment Technologies SA ;\n */\n\n /**\n * The identifier the keyNavigator group\n * @type {String}\n */\n const groupId = 'top-toolbar';\n\n /**\n * Key navigator strategy applying onto the top toolbar' bar.\n * @type {Object} keyNavigationStrategy\n */\n var topToolbarNavigation = {\n name: 'top-toolbar',\n /**\n * Builds the top toolbar navigation strategy.\n *\n * @returns {keyNavigationStrategy}\n */\n init() {\n const config = this.getConfig();\n const $topToolbar = this.getTestRunner().getAreaBroker().getContainer().find('.top-action-bar');\n const $toolbarElements = $topToolbar.find('.timer-toggler');\n const registerTopToolbarNavigator = (id, group, $elements) => {\n const elements = navigableDomElement.createFromDoms($elements);\n if (elements.length) {\n const navigator = keyNavigator({\n id,\n group,\n elements,\n propagateTab: false\n });\n helpers.setupItemsNavigator(navigator, config);\n helpers.setupClickableNavigator(navigator);\n this.keyNavigators.push(navigator);\n }\n };\n this.keyNavigators = [];\n $toolbarElements.each((index, element) => registerTopToolbarNavigator(`${groupId}-${index}`, $topToolbar, $(element)));\n return this;\n },\n /**\n * Gets the list of applied navigators\n * @returns {keyNavigator[]}\n */\n getNavigators() {\n return this.keyNavigators;\n },\n /**\n * Tears down the keyNavigator strategy\n * @returns {keyNavigationStrategy}\n */\n destroy() {\n this.keyNavigators.forEach(navigator => navigator.destroy());\n this.keyNavigators = [];\n return this;\n }\n };\n\n return topToolbarNavigation;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/navigatorNavigation',['lodash', 'ui/keyNavigation/navigator', 'ui/keyNavigation/navigableDomElement', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/helpers'], function (_, keyNavigator, navigableDomElement, helpers) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n keyNavigator = keyNavigator && Object.prototype.hasOwnProperty.call(keyNavigator, 'default') ? keyNavigator['default'] : keyNavigator;\n navigableDomElement = navigableDomElement && Object.prototype.hasOwnProperty.call(navigableDomElement, 'default') ? navigableDomElement['default'] : navigableDomElement;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 Open Assessment Technologies SA ;\n */\n\n /**\n * List of CSS selectors for the navigables\n * @type {Object}\n */\n const selectors = {\n filters: '.qti-navigator-filters .qti-navigator-filter',\n enabledItems: '.qti-navigator-tree .qti-navigator-item:not(.disabled) .qti-navigator-label'\n };\n\n /**\n * For 'fizzy' navigator layout, builds the navigator navigation strategy.\n *\n * @returns {keyNavigationStrategy}\n */\n function initFizzy(config, $panel, $navigator, keyNavigators, managedNavigators) {\n let itemsNavigator;\n const $navigatorTree = $panel.find('.qti-navigator-tree');\n const $enabledItems = $navigator.find('.qti-navigator-tree .buttonlist-item:not(.disabled) .buttonlist-btn');\n const navigableItems = navigableDomElement.createFromDoms($enabledItems);\n\n /**\n * Get item wrapper from navigable button\n * (`navigable`: '.buttonlist-btn'; `parent()`: '.buttonlist-item')\n * @returns {jQuery}\n */\n const getItemFromNavigable = navigable => {\n return navigable.getElement().parent();\n };\n if (navigableItems.length) {\n itemsNavigator = keyNavigator({\n id: 'navigator-items',\n elements: navigableItems,\n group: $navigatorTree,\n loop: true,\n defaultPosition(navigableElements) {\n let pos = _.findIndex(navigableElements, navigable => {\n const $parent = getItemFromNavigable(navigable);\n if ($parent.hasClass('buttonlist-item-active') && $parent.is(':visible')) {\n return true;\n }\n });\n return pos >= 0 ? pos : 0;\n }\n }).on('focus', cursor => {\n getItemFromNavigable(cursor.navigable).addClass('key-navigation-highlight');\n }).on('blur', cursor => {\n getItemFromNavigable(cursor.navigable).removeClass('key-navigation-highlight');\n });\n helpers.setupItemsNavigator(itemsNavigator, {\n keyNextItem: config.keyNextItem,\n keyPrevItem: config.keyPrevItem\n });\n helpers.setupClickableNavigator(itemsNavigator);\n keyNavigators.push(itemsNavigator);\n managedNavigators.push(itemsNavigator);\n }\n }\n\n /**\n * Key navigator strategy applying onto the navigation panel.\n * @type {Object} keyNavigationStrategy\n */\n var navigatorNavigation = {\n name: 'navigator',\n /**\n * Builds the navigator navigation strategy.\n *\n * @returns {keyNavigationStrategy}\n */\n init() {\n const config = this.getConfig();\n const $panel = this.getTestRunner().getAreaBroker().getPanelArea();\n const $navigator = $panel.find('.qti-navigator');\n const isFizzyLayout = $navigator.hasClass('qti-navigator-fizzy');\n this.managedNavigators = [];\n this.keyNavigators = [];\n if ($navigator.length && !$navigator.hasClass('disabled')) {\n if (isFizzyLayout) {\n initFizzy(config, $panel, $navigator, this.keyNavigators, this.managedNavigators);\n } else {\n const $testStatusHeader = $navigator.find('.qti-navigator-info.collapsible > .qti-navigator-label');\n const navigableTestStatus = navigableDomElement.createFromDoms($testStatusHeader);\n $testStatusHeader.addClass('key-navigation-actionable');\n if (navigableTestStatus.length) {\n const testStatusNavigation = keyNavigator({\n keepState: config.keepState,\n id: 'navigator-test-status',\n propagateTab: false,\n elements: navigableTestStatus,\n group: $testStatusHeader\n });\n helpers.setupItemsNavigator(testStatusNavigation, {\n keyNextItem: config.keyNextTab || config.keyNextItem,\n keyPrevItem: config.keyPrevTab || config.keyPrevItem\n });\n this.keyNavigators.push(testStatusNavigation);\n this.managedNavigators.push(testStatusNavigation);\n }\n let filtersNavigator;\n let itemsNavigator;\n //the tag to identify if the item listing has been browsed, to only \"smart jump\" to active item only on the first visit\n let itemListingVisited = false;\n //the position of the filter in memory, to only \"smart jump\" to active item only on the first visit\n let currentFilter;\n const $filters = $navigator.find(selectors.filters);\n const navigableFilters = navigableDomElement.createFromDoms($filters);\n if (navigableFilters.length) {\n filtersNavigator = keyNavigator({\n keepState: config.keepState,\n id: 'navigator-filters',\n propagateTab: false,\n elements: navigableFilters,\n group: $navigator.find('.qti-navigator-filters')\n });\n helpers.setupItemsNavigator(filtersNavigator, {\n keyNextItem: config.keyNextTab || config.keyNextItem,\n keyPrevItem: config.keyPrevTab || config.keyPrevItem\n });\n helpers.setupClickableNavigator(filtersNavigator);\n if (config.keepState) {\n filtersNavigator.on('focus', cursor => {\n if (config.keepState) {\n const $element = cursor.navigable.getElement();\n const filter = $element.data('mode');\n $element.click();\n if (currentFilter !== filter) {\n itemListingVisited = false;\n }\n currentFilter = filter;\n }\n });\n }\n if (config.keyNextContent) {\n filtersNavigator.on(config.keyNextContent, elem => {\n if (helpers.allowedToNavigateFrom(elem) && itemsNavigator) {\n _.defer(() => {\n if (itemListingVisited) {\n itemsNavigator.first();\n } else {\n itemsNavigator.focus();\n }\n });\n }\n });\n }\n if (config.keyPrevContent) {\n filtersNavigator.on(config.keyPrevContent, elem => {\n if (helpers.allowedToNavigateFrom(elem) && itemsNavigator) {\n _.defer(() => {\n itemsNavigator.last();\n });\n }\n });\n }\n this.keyNavigators.push(filtersNavigator);\n this.managedNavigators.push(filtersNavigator);\n }\n const $navigatorTree = $panel.find('.qti-navigator-tree');\n const $trees = $navigator.find(selectors.enabledItems);\n const navigableTrees = navigableDomElement.createFromDoms($trees);\n $trees.first().addClass('key-navigation-scrollable-up');\n $trees.last().addClass('key-navigation-scrollable-down');\n if (navigableTrees.length) {\n //instantiate a key navigator but do not add it to the returned list of navigators as this is not supposed to be reached with tab key\n itemsNavigator = keyNavigator({\n id: 'navigator-items',\n elements: navigableTrees,\n group: $navigatorTree,\n defaultPosition(navigableElements) {\n let pos = 0;\n if (config.flatNavigation || currentFilter !== 'flagged') {\n pos = _.findIndex(navigableElements, navigable => {\n const $parent = navigable.getElement().parent('.qti-navigator-item');\n if ($parent.hasClass('active') && $parent.is(':visible')) {\n return true;\n }\n });\n }\n return pos;\n }\n }).on('focus', cursor => {\n itemListingVisited = true;\n cursor.navigable.getElement().parent().addClass('key-navigation-highlight');\n }).on('blur', cursor => {\n cursor.navigable.getElement().parent().removeClass('key-navigation-highlight');\n });\n helpers.setupItemsNavigator(itemsNavigator, {\n keyNextItem: config.keyNextContent || config.keyNextItem,\n keyPrevItem: config.keyPrevContent || config.keyPrevItem\n });\n helpers.setupClickableNavigator(itemsNavigator);\n if (config.keepState) {\n itemsNavigator.on('lowerbound upperbound', () => {\n if (filtersNavigator) {\n filtersNavigator.focus();\n }\n });\n }\n if (config.keyNextTab && config.keyPrevTab) {\n itemsNavigator.on(config.keyNextTab, function (elem) {\n if (helpers.allowedToNavigateFrom(elem) && filtersNavigator) {\n filtersNavigator.focus().next();\n }\n });\n itemsNavigator.on(config.keyPrevTab, function (elem) {\n if (helpers.allowedToNavigateFrom(elem) && filtersNavigator) {\n filtersNavigator.focus().previous();\n }\n });\n } else {\n this.keyNavigators.push(itemsNavigator);\n }\n this.managedNavigators.push(itemsNavigator);\n }\n }\n }\n return this;\n },\n /**\n * Gets the list of applied navigators\n * @returns {keyNavigator[]}\n */\n getNavigators() {\n return this.keyNavigators;\n },\n /**\n * Tears down the keyNavigator strategy\n * @returns {keyNavigationStrategy}\n */\n destroy() {\n this.managedNavigators.forEach(navigator => navigator.destroy());\n this.managedNavigators = [];\n this.keyNavigators = [];\n return this;\n }\n };\n\n return navigatorNavigation;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/pageNavigation',['jquery', 'ui/keyNavigation/navigator', 'ui/keyNavigation/navigableDomElement', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/helpers'], function ($, keyNavigator, navigableDomElement, helpers) { 'use strict';\n\n $ = $ && Object.prototype.hasOwnProperty.call($, 'default') ? $['default'] : $;\n keyNavigator = keyNavigator && Object.prototype.hasOwnProperty.call(keyNavigator, 'default') ? keyNavigator['default'] : keyNavigator;\n navigableDomElement = navigableDomElement && Object.prototype.hasOwnProperty.call(navigableDomElement, 'default') ? navigableDomElement['default'] : navigableDomElement;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 Open Assessment Technologies SA ;\n */\n\n /**\n * The identifier the keyNavigator group\n * @type {String}\n */\n const groupId = 'item-content-wrapper';\n\n /**\n * Key navigator strategy applying onto the page.\n * @type {Object} keyNavigationStrategy\n */\n var pageNavigation = {\n name: 'page',\n /**\n * Builds the page navigation strategy.\n *\n * @returns {keyNavigationStrategy}\n */\n init() {\n const config = this.getConfig();\n this.keyNavigators = [];\n this.getTestRunner().getAreaBroker().getContainer().find('.content-wrapper').addClass('key-navigation-scrollable').each((i, el) => {\n const $element = $(el);\n const navigator = keyNavigator({\n id: `${groupId}-${this.keyNavigators.length}`,\n elements: navigableDomElement.createFromDoms($element),\n group: $element,\n propagateTab: false\n });\n helpers.setupItemsNavigator(navigator, config);\n this.keyNavigators.push(navigator);\n });\n return this;\n },\n /**\n * Gets the list of applied navigators\n * @returns {keyNavigator[]}\n */\n getNavigators() {\n return this.keyNavigators;\n },\n /**\n * Tears down the keyNavigator strategy\n * @returns {keyNavigationStrategy}\n */\n destroy() {\n this.keyNavigators.forEach(navigator => navigator.destroy());\n this.keyNavigators = [];\n return this;\n }\n };\n\n return pageNavigation;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/rubricsNavigation',['jquery', 'ui/keyNavigation/navigator', 'ui/keyNavigation/navigableDomElement', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/helpers'], function ($, keyNavigator, navigableDomElement, helpers) { 'use strict';\n\n $ = $ && Object.prototype.hasOwnProperty.call($, 'default') ? $['default'] : $;\n keyNavigator = keyNavigator && Object.prototype.hasOwnProperty.call(keyNavigator, 'default') ? keyNavigator['default'] : keyNavigator;\n navigableDomElement = navigableDomElement && Object.prototype.hasOwnProperty.call(navigableDomElement, 'default') ? navigableDomElement['default'] : navigableDomElement;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 Open Assessment Technologies SA ;\n */\n\n /**\n * The identifier the keyNavigator group\n * @type {String}\n */\n const groupId = 'rubric-element-navigation-group';\n\n /**\n * Key navigator strategy applying onto the rubric blocks.\n * @type {Object} keyNavigationStrategy\n */\n var rubricsNavigation = {\n name: 'rubrics',\n /**\n * Builds the rubric blocks navigation strategy.\n *\n * @returns {keyNavigationStrategy}\n */\n init() {\n const config = this.getConfig();\n this.keyNavigators = [];\n this.getTestRunner().getAreaBroker().getContainer().find('.qti-rubricBlock').addClass('key-navigation-scrollable').each((i, el) => {\n const $element = $(el);\n const navigator = keyNavigator({\n id: `${groupId}-${this.keyNavigators.length}`,\n elements: navigableDomElement.createFromDoms($element),\n group: $element,\n propagateTab: false\n });\n helpers.setupItemsNavigator(navigator, config);\n this.keyNavigators.push(navigator);\n });\n return this;\n },\n /**\n * Gets the list of applied navigators\n * @returns {keyNavigator[]}\n */\n getNavigators() {\n return this.keyNavigators;\n },\n /**\n * Tears down the keyNavigator strategy\n * @returns {keyNavigationStrategy}\n */\n destroy() {\n this.keyNavigators.forEach(navigator => navigator.destroy());\n this.keyNavigators = [];\n return this;\n }\n };\n\n return rubricsNavigation;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/itemNavigation',['jquery', 'ui/scroller', 'ui/keyNavigation/navigator', 'ui/keyNavigation/navigableDomElement', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/helpers'], function ($, scrollHelper, keyNavigator, navigableDomElement, helpers) { 'use strict';\n\n $ = $ && Object.prototype.hasOwnProperty.call($, 'default') ? $['default'] : $;\n scrollHelper = scrollHelper && Object.prototype.hasOwnProperty.call(scrollHelper, 'default') ? scrollHelper['default'] : scrollHelper;\n keyNavigator = keyNavigator && Object.prototype.hasOwnProperty.call(keyNavigator, 'default') ? keyNavigator['default'] : keyNavigator;\n navigableDomElement = navigableDomElement && Object.prototype.hasOwnProperty.call(navigableDomElement, 'default') ? navigableDomElement['default'] : navigableDomElement;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 Open Assessment Technologies SA ;\n */\n\n /**\n * Add aria-labelledby attribute to choice interaction\n *\n * @param {Navigator} cursor\n */\n const addLabelledByAttribute = cursor => {\n const $element = cursor.navigable.getElement();\n const value = $element.attr('value');\n const name = $element.attr('name');\n if (name) {\n $element.attr('aria-labelledby', `${name.replace('response-', 'choice-')}-${value}`);\n }\n };\n\n /**\n * Add aria-labelledby attribute from choice interaction\n *\n * @param {Navigator} cursor\n */\n const removeLabelledByAttribute = cursor => {\n const $element = cursor.navigable.getElement();\n $element.removeAttr('aria-labelledby', '');\n };\n\n /**\n * Adds attributes on navigation focus and blur\n *\n * @param {Navigator} navigator\n */\n const manageLabelledByAttribute = navigator => {\n if (navigator) {\n navigator.on('focus', addLabelledByAttribute);\n navigator.on('blur', removeLabelledByAttribute); // applies WCAG behavior for the radio buttons\n }\n };\n\n /**\n * Key navigator strategy applying inside the item.\n * Navigable item content are interaction choices and body element with the special class \"key-navigation-focusable\".\n * @type {Object} keyNavigationStrategy\n */\n var itemNavigation = {\n name: 'item',\n /**\n * Builds the item navigation strategy.\n *\n * @returns {keyNavigationStrategy}\n */\n init() {\n var _this = this;\n this.keyNavigators = [];\n const config = this.getConfig();\n const $content = this.getTestRunner().getAreaBroker().getContentArea();\n\n /**\n * Gets the QTI choice element from the current position in the keyNavigation\n * @param {Object} cursor - The cursor definition supplied by the keyNavigator\n * @returns {jQuery} - The selected choice element\n */\n const getQtiChoice = function (cursor) {\n return cursor && cursor.navigable.getElement().closest('.qti-choice');\n };\n\n /**\n * Creates and registers a keyNavigator for the supplied list of elements\n * @param {jQuery} $elements - The list of navigable elements\n * @param {jQuery} group - The group container\n * @param {Boolean} [loop=false] - Allow cycling the list when a boundary is reached\n * @param {Number|Function} [defaultPosition=0] - The default position the group should set the focus on\n * @returns {keyNavigator} - the created navigator, if the list of element is not empty\n */\n const addNavigator = function ($elements, group) {\n let loop = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let defaultPosition = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;\n const elements = navigableDomElement.createFromDoms($elements);\n if (elements.length) {\n const navigator = keyNavigator({\n elements,\n group,\n loop,\n defaultPosition,\n propagateTab: false\n });\n _this.keyNavigators.push(navigator);\n return navigator;\n }\n };\n\n /**\n * Creates and setups a keyNavigator for the interaction inputs.\n * @param {jQuery} $elements - The list of navigable elements\n * @param {jQuery} group - The group container\n * @param {Boolean} [loop=false] - Allow cycling the list when a boundary is reached\n * @param {Number|Function} [defaultPosition=0] - The default position the group should set the focus on\n * @returns {keyNavigator} - The supplied keyNavigator\n */\n const addInputsNavigator = function ($elements, group, loop) {\n let defaultPosition = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;\n const navigator = addNavigator($elements, group, loop, defaultPosition);\n if (navigator) {\n helpers.setupItemsNavigator(navigator, config);\n helpers.setupClickableNavigator(navigator);\n\n // each choice is represented by more than the input, the style must be spread to the actual element\n navigator.on('focus', cursor => scrollHelper.scrollTo(getQtiChoice(cursor).addClass('key-navigation-highlight'), $content.closest('.content-wrapper'))).on('blur', cursor => getQtiChoice(cursor).removeClass('key-navigation-highlight'));\n }\n return navigator;\n };\n\n // list the navigable areas inside the item. This could be either the interactions choices or the prompts\n const $qtiInteractions = $content.find('.key-navigation-focusable,.qti-interaction')\n //filter out interaction as it will be managed separately\n .filter((i, node) => !$(node).parents('.qti-interaction').length);\n\n // the item focusable body elements are considered scrollable\n $content.find('.key-navigation-focusable').addClass('key-navigation-scrollable');\n\n // each navigable area will get its own keyNavigator\n $qtiInteractions.each((itemPos, itemElement) => {\n const $itemElement = $(itemElement);\n\n // detect the type of choices: checkbox or radio\n const $choiceInput = $itemElement.find('.qti-choice input');\n const choiceType = $choiceInput.attr('type');\n if ($itemElement.hasClass('qti-interaction')) {\n //add navigable elements from prompt\n $itemElement.find('.key-navigation-focusable').each((navPos, nav) => {\n const $nav = $(nav);\n if (!$nav.closest('.qti-choice').length) {\n addNavigator($nav, $nav);\n }\n });\n\n //reset interaction custom key navigation to override the behaviour with the new one\n $itemElement.off('.keyNavigation');\n\n //search for inputs that represent the interaction focusable choices\n const $inputs = $itemElement.is(':input') ? $itemElement : $itemElement.find(':input');\n if (config.flatNavigation && (config.flatRadioNavigation || choiceType !== 'radio')) {\n $inputs.each((i, input) => {\n const navigator = addInputsNavigator($(input), $itemElement);\n manageLabelledByAttribute(navigator);\n });\n } else {\n const navigator = addInputsNavigator($inputs, $itemElement, true, () => {\n // keep default positioning for now\n let position = -1;\n\n // autofocus the selected radio button if any\n $inputs.each((index, input) => {\n if (input.checked) {\n position = index;\n }\n });\n return position;\n });\n manageLabelledByAttribute(navigator);\n\n // applies WCAG behavior for the radio buttons\n if (navigator && config.wcagBehavior) {\n navigator.on('focus', cursor => {\n const $element = cursor.navigable.getElement();\n if (!$element.is(':checked')) {\n $element.click();\n }\n });\n }\n }\n } else {\n addNavigator($itemElement, $itemElement);\n }\n });\n return this;\n },\n /**\n * Gets the list of applied navigators\n * @returns {keyNavigator[]}\n */\n getNavigators() {\n return this.keyNavigators;\n },\n /**\n * Tears down the keyNavigator strategy\n * @returns {keyNavigationStrategy}\n */\n destroy() {\n this.keyNavigators.forEach(navigator => navigator.destroy());\n this.keyNavigators = [];\n return this;\n }\n };\n\n return itemNavigation;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/linearItemNavigation',['jquery', 'ui/keyNavigation/navigator', 'ui/keyNavigation/navigableDomElement', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/helpers'], function ($, keyNavigator, navigableDomElement, helpers) { 'use strict';\n\n $ = $ && Object.prototype.hasOwnProperty.call($, 'default') ? $['default'] : $;\n keyNavigator = keyNavigator && Object.prototype.hasOwnProperty.call(keyNavigator, 'default') ? keyNavigator['default'] : keyNavigator;\n navigableDomElement = navigableDomElement && Object.prototype.hasOwnProperty.call(navigableDomElement, 'default') ? navigableDomElement['default'] : navigableDomElement;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 Open Assessment Technologies SA ;\n */\n\n /**\n * Key navigator strategy applying inside the item.\n * Navigable item content are interaction choices with the special class \"key-navigation-focusable\".\n * @type {Object} keyNavigationStrategy\n */\n var linearItemNavigation = {\n name: 'linearItem',\n /**\n * Builds the item navigation strategy.\n *\n * @returns {keyNavigationStrategy}\n */\n init() {\n const config = this.getConfig();\n const $content = this.getTestRunner().getAreaBroker().getContentArea();\n const $qtiInteractions = $content.find('.key-navigation-focusable,.qti-interaction')\n //filter out interaction as it will be managed separately\n .filter((i, node) => !$(node).parents('.qti-interaction').length);\n const $qtiChoices = $qtiInteractions.find('.qti-choice');\n let $lastParent = null;\n let list = [];\n const setupListNavigator = () => {\n const navigator = keyNavigator({\n elements: list,\n propagateTab: false\n });\n helpers.setupItemsNavigator(navigator, config);\n this.choicesNavigators.push(navigator);\n };\n\n // this strategy manages 2 navigators:\n // - keyNavigators lists all elements separately, allowing to navigate among them as identified groups\n // - choicesNavigators lists elements with the same parent, allowing to navigate \"horizontally\" among them\n this.keyNavigators = [];\n this.choicesNavigators = [];\n\n // the item focusable body elements are considered scrollable\n $content.find('.key-navigation-focusable').addClass('key-navigation-scrollable');\n $qtiChoices.each((i, el) => {\n const $itemElement = $(el);\n const $parent = $itemElement.parent();\n const choiceNavigator = keyNavigator({\n elements: navigableDomElement.createFromDoms($itemElement),\n group: $itemElement,\n propagateTab: false\n });\n helpers.setupClickableNavigator(choiceNavigator);\n if ($lastParent && !$parent.is($lastParent)) {\n setupListNavigator();\n list = [];\n }\n this.keyNavigators.push(choiceNavigator);\n list.push(choiceNavigator);\n $lastParent = $parent;\n });\n if (list.length) {\n setupListNavigator();\n list = [];\n }\n return this;\n },\n /**\n * Gets the list of applied navigators\n * @returns {keyNavigator[]}\n */\n getNavigators() {\n return this.keyNavigators;\n },\n /**\n * Tears down the keyNavigator strategy\n * @returns {keyNavigationStrategy}\n */\n destroy() {\n this.keyNavigators.forEach(navigator => navigator.destroy());\n this.choicesNavigators.forEach(navigator => navigator.destroy());\n this.choicesNavigators = [];\n this.keyNavigators = [];\n return this;\n }\n };\n\n return linearItemNavigation;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/stimulusNavigation',['jquery', 'i18n', 'ui/keyNavigation/navigator', 'ui/keyNavigation/navigableDomElement', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/helpers'], function ($, __, keyNavigator, navigableDomElement, helpers) { 'use strict';\n\n $ = $ && Object.prototype.hasOwnProperty.call($, 'default') ? $['default'] : $;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n keyNavigator = keyNavigator && Object.prototype.hasOwnProperty.call(keyNavigator, 'default') ? keyNavigator['default'] : keyNavigator;\n navigableDomElement = navigableDomElement && Object.prototype.hasOwnProperty.call(navigableDomElement, 'default') ? navigableDomElement['default'] : navigableDomElement;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 Open Assessment Technologies SA ;\n */\n\n /**\n * The identifier the keyNavigator group\n * @type {String}\n */\n const groupId = 'stimulus-element-navigation-group';\n\n /**\n * Key navigator strategy applying on stimulus items with scrollbar.\n * Navigable item content are body elements with the special class \"stimulus-container\".\n * @type {Object} keyNavigationStrategy\n */\n var stimulusNavigation = {\n name: 'stimulus',\n /**\n * Builds the item navigation strategy.\n *\n * @returns {keyNavigationStrategy}\n */\n init() {\n const config = this.getConfig();\n const $content = this.getTestRunner().getAreaBroker().getContentArea();\n this.keyNavigators = [];\n\n // decorate isEnabled navigableDomElement method to check for dom node height\n const isEnabledDecorator = element => {\n const originalIsEnabled = element.isEnabled;\n element.isEnabled = function isEnabled() {\n if (originalIsEnabled.call(this)) {\n const node = this.getElement().get(0);\n return node.scrollHeight > node.clientHeight;\n }\n return false;\n };\n return element;\n };\n $content.find('.stimulus-container').addClass('key-navigation-scrollable').each((i, el) => {\n const $element = $(el);\n const elements = navigableDomElement.createFromDoms($element).map(isEnabledDecorator);\n\n // assign aria attributes\n $element.attr('aria-label', __('Passage'));\n const navigator = keyNavigator({\n id: `${groupId}-${i}`,\n elements,\n group: $element,\n propagateTab: false\n });\n helpers.setupItemsNavigator(navigator, config);\n this.keyNavigators.push(navigator);\n });\n return this;\n },\n /**\n * Gets the list of applied navigators\n * @returns {keyNavigator[]}\n */\n getNavigators() {\n return this.keyNavigators;\n },\n /**\n * Tears down the keyNavigator strategy\n * @returns {keyNavigationStrategy}\n */\n destroy() {\n this.keyNavigators.forEach(navigator => navigator.destroy());\n this.keyNavigators = [];\n return this;\n }\n };\n\n return stimulusNavigation;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/jumpLinks',['jquery', 'ui/keyNavigation/navigator', 'ui/keyNavigation/navigableDomElement', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/helpers'], function ($, keyNavigator, navigableDomElement, helpers) { 'use strict';\n\n $ = $ && Object.prototype.hasOwnProperty.call($, 'default') ? $['default'] : $;\n keyNavigator = keyNavigator && Object.prototype.hasOwnProperty.call(keyNavigator, 'default') ? keyNavigator['default'] : keyNavigator;\n navigableDomElement = navigableDomElement && Object.prototype.hasOwnProperty.call(navigableDomElement, 'default') ? navigableDomElement['default'] : navigableDomElement;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 Open Assessment Technologies SA ;\n */\n\n /**\n * The identifier the keyNavigator group\n * @type {String}\n */\n const groupId = 'jump-links';\n\n /**\n * Key navigator strategy applying onto the top toolbar' bar.\n * @type {Object} keyNavigationStrategy\n */\n var jumpLinks = {\n name: 'jump-links',\n /**\n * Builds the top toolbar navigation strategy.\n *\n * @returns {keyNavigationStrategy}\n */\n init() {\n const config = this.getConfig();\n const $jumpLinksBox = $('.content-wrap');\n const $links = $jumpLinksBox.find('.jump-link');\n this.keyNavigators = [];\n const registerTopToolbarNavigator = (id, group, $elements) => {\n const elements = navigableDomElement.createFromDoms($elements);\n if (elements.length) {\n const navigator = keyNavigator({\n id,\n group,\n elements,\n propagateTab: false\n });\n helpers.setupItemsNavigator(navigator, config);\n helpers.setupClickableNavigator(navigator);\n this.keyNavigators.push(navigator);\n }\n };\n $links.each((index, element) => registerTopToolbarNavigator(`${groupId}-${index}`, $jumpLinksBox, $(element)));\n return this;\n },\n /**\n * Gets the list of applied navigators\n * @returns {keyNavigator[]}\n */\n getNavigators() {\n return this.keyNavigators;\n },\n /**\n * Tears down the keyNavigator strategy\n * @returns {keyNavigationStrategy}\n */\n destroy() {\n this.keyNavigators.forEach(navigator => navigator.destroy());\n this.keyNavigators = [];\n return this;\n }\n };\n\n return jumpLinks;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/index',['exports', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/headerNavigation', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/toolbarNavigation', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/topToolbarNavigation', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/navigatorNavigation', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/pageNavigation', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/rubricsNavigation', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/itemNavigation', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/linearItemNavigation', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/stimulusNavigation', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/jumpLinks'], function (exports, headerNavigation, toolbarNavigation, topToolbarNavigation, navigatorNavigation, pageNavigation, rubricsNavigation, itemNavigation, linearItemNavigation, stimulusNavigation, jumpLinks) { 'use strict';\n\n\theaderNavigation = headerNavigation && Object.prototype.hasOwnProperty.call(headerNavigation, 'default') ? headerNavigation['default'] : headerNavigation;\n\ttoolbarNavigation = toolbarNavigation && Object.prototype.hasOwnProperty.call(toolbarNavigation, 'default') ? toolbarNavigation['default'] : toolbarNavigation;\n\ttopToolbarNavigation = topToolbarNavigation && Object.prototype.hasOwnProperty.call(topToolbarNavigation, 'default') ? topToolbarNavigation['default'] : topToolbarNavigation;\n\tnavigatorNavigation = navigatorNavigation && Object.prototype.hasOwnProperty.call(navigatorNavigation, 'default') ? navigatorNavigation['default'] : navigatorNavigation;\n\tpageNavigation = pageNavigation && Object.prototype.hasOwnProperty.call(pageNavigation, 'default') ? pageNavigation['default'] : pageNavigation;\n\trubricsNavigation = rubricsNavigation && Object.prototype.hasOwnProperty.call(rubricsNavigation, 'default') ? rubricsNavigation['default'] : rubricsNavigation;\n\titemNavigation = itemNavigation && Object.prototype.hasOwnProperty.call(itemNavigation, 'default') ? itemNavigation['default'] : itemNavigation;\n\tlinearItemNavigation = linearItemNavigation && Object.prototype.hasOwnProperty.call(linearItemNavigation, 'default') ? linearItemNavigation['default'] : linearItemNavigation;\n\tstimulusNavigation = stimulusNavigation && Object.prototype.hasOwnProperty.call(stimulusNavigation, 'default') ? stimulusNavigation['default'] : stimulusNavigation;\n\tjumpLinks = jumpLinks && Object.prototype.hasOwnProperty.call(jumpLinks, 'default') ? jumpLinks['default'] : jumpLinks;\n\n\n\n\texports.headerNavigationStrategy = headerNavigation;\n\texports.toolbarNavigationStrategy = toolbarNavigation;\n\texports.topToolbarNavigationStrategy = topToolbarNavigation;\n\texports.navigatorNavigationStrategy = navigatorNavigation;\n\texports.pageNavigationStrategy = pageNavigation;\n\texports.rubricsNavigationStrategy = rubricsNavigation;\n\texports.itemNavigationStrategy = itemNavigation;\n\texports.linearItemNavigationStrategy = linearItemNavigation;\n\texports.stimulusNavigationStrategy = stimulusNavigation;\n\texports.jumpLinksNavigationStrategy = jumpLinks;\n\n\tObject.defineProperty(exports, '__esModule', { value: true });\n\n});\n\n","define('taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategiesManager',['core/providerRegistry', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/index'], function (providerRegistry, strategies) { 'use strict';\n\n providerRegistry = providerRegistry && Object.prototype.hasOwnProperty.call(providerRegistry, 'default') ? providerRegistry['default'] : providerRegistry;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 Open Assessment Technologies SA ;\n */\n\n /**\n * Defines the strategies API\n * @typedef {Object} keyNavigationStrategy\n * @property {Function} init\n * @property {Function} destroy\n * @property {Function} getNavigators\n * @property {Function} getName\n * @property {Function} getConfig\n * @property {Function} getTestRunner\n */\n\n /**\n * Defines the config structure for the navigation strategies\n * @typedef {Object} keyNavigationStrategyConfig\n * @property {Boolean} autoFocus - auto select the main action when available in a group\n * @property {Boolean} wcagBehavior - apply WCAG recommended behavior for radio buttons and similar elements\n * @property {Boolean} keepState - for strategies able to keep the state, allow to keep the position of the focused\n * element when moving away from the group and restore it when the group retrieves the focus\n * @property {Boolean} propagateTab - propagate the Tab key to the upper level\n * @property {Boolean} flatNavigation - flatten the navigation between groups, allowing to forward the focus to the\n * following group when a group boundary is reached. If disabled, the only way to move between groups is to use the\n * related key combination\n * @property {String} keyNextItem - the keyboard shortcut to move to the next item (inside the scope)\n * @property {String} keyPrevItem - the keyboard shortcut to move to the previous item (inside the scope)\n * @property {String} keyNextGroup - the keyboard shortcut to move to the next group (outside the scope)\n * @property {String} keyPrevGroup - the keyboard shortcut to move to the previous group (outside the scope)\n * @property {String} keyNextTab - the keyboard shortcut to move to the next tab of the bar\n * @property {String} keyPrevTab - the keyboard shortcut to move to the previous tab of the bar\n * @property {String} keyNextContent - the keyboard shortcut to move to the next content element\n * @property {String} keyPrevContent - the keyboard shortcut to move to the previous content element\n */\n\n /**\n * Builds a key navigator strategies manager.\n *\n * @param {String} name - the name of the strategy to build\n * @param {testRunner} testRunner - the test runner instance to control\n * @param {keyNavigationStrategyConfig} config - the config to apply\n * @returns {keyNavigationStrategy}\n */\n function strategyFactory(name, testRunner, config) {\n const strategy = strategyFactory.getProvider(name);\n\n /**\n * @type {Object} keyNavigationStrategy\n */\n return {\n /**\n * Setup the keyNavigator strategy\n * @returns {keyNavigationStrategy}\n */\n init() {\n strategy.init.call(this);\n return this;\n },\n /**\n * Gets the name of the applied strategy\n * @returns {String}\n */\n getName() {\n return name;\n },\n /**\n * Gets the config of the strategy\n * @returns {keyNavigationStrategyConfig}\n */\n getConfig() {\n return config;\n },\n /**\n * Gets the test runner\n * @returns {testRunner}\n */\n getTestRunner() {\n return testRunner;\n },\n /**\n * Gets the list of applied navigators\n * @returns {keyNavigator[]}\n */\n getNavigators() {\n if ('function' === typeof strategy.getNavigators) {\n return strategy.getNavigators.call(this);\n }\n return [];\n },\n /**\n * Tears down the keyNavigator strategy\n * @returns {keyNavigationStrategy}\n */\n destroy() {\n if ('function' === typeof strategy.destroy) {\n strategy.destroy.call(this);\n }\n return this;\n }\n };\n }\n\n // bootstrap the manager and register the strategies\n providerRegistry(strategyFactory);\n Object.values(strategies).forEach(strategy => strategyFactory.registerProvider(strategy.name, strategy));\n\n return strategyFactory;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/accessibility/keyNavigation/helpers',['exports', 'jquery', 'lodash', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategiesManager'], function (exports, $, _, strategyFactory) { 'use strict';\n\n $ = $ && Object.prototype.hasOwnProperty.call($, 'default') ? $['default'] : $;\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n strategyFactory = strategyFactory && Object.prototype.hasOwnProperty.call(strategyFactory, 'default') ? strategyFactory['default'] : strategyFactory;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2020 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * When either an element or its parents have this class - navigation from it would be disabled.\n *\n * @type {String}\n */\n const ignoredClass = 'no-key-navigation';\n\n /**\n * Checks whether element is navigable from\n *\n * @param {HTMLElement|keyNavigator} from\n * @returns {boolean}\n */\n function allowedToNavigateFrom(from) {\n let element = from;\n if (element && 'function' === typeof element.getCursor) {\n const {\n navigable\n } = element.getCursor();\n element = navigable;\n }\n if (element && 'function' === typeof element.getElement) {\n element = element.getElement();\n }\n const $element = $(element);\n if ($element.hasClass(ignoredClass) || $element.parents(`.${ignoredClass}`).length > 0) {\n return false;\n }\n return true;\n }\n\n /**\n * Applies an items' navigation scheme on a keyNavigator.\n * @param {keyNavigator} navigator\n * @param {keyNavigationStrategyConfig} config - the config to apply\n * @returns {keyNavigator}\n */\n function setupItemsNavigator(navigator, config) {\n return navigator.on(config.keyNextItem, function navigateToNextItem(elem) {\n if (allowedToNavigateFrom(elem)) {\n this.next();\n }\n }).on(config.keyPrevItem, function navigateToPrevItem(elem) {\n if (allowedToNavigateFrom(elem)) {\n this.previous();\n }\n });\n }\n\n /**\n * Applies an items' navigation scheme on a keyNavigator.\n * @param {keyNavigator} navigator\n * @returns {keyNavigator}\n */\n function setupClickableNavigator(navigator) {\n return navigator.on('activate', function activateItem(cursor) {\n const $elt = cursor.navigable.getElement();\n\n // jQuery <= 1.9.0\n // the checkbox values are set after the click event if triggered with jQuery\n if ($elt.is(':checkbox')) {\n $elt.each(function () {\n this.click();\n });\n } else {\n $elt.click().mousedown();\n }\n });\n }\n\n /**\n * Build the strategies related to a key navigation mode\n * @param {keyNavigationMode} navigationMode\n * @param {testRunner} testRunner\n * @returns {keyNavigationStrategy[]}\n */\n function getStrategies(navigationMode, testRunner) {\n return navigationMode.strategies.map(area => strategyFactory(area, testRunner, navigationMode.config).init());\n }\n\n /**\n * Gets the key navigators from the provided strategies\n * @param {keyNavigationStrategy[]} strategies\n * @returns {keyNavigator[]}\n */\n function getNavigators(strategies) {\n return _.flatten(strategies.map(strategy => strategy.getNavigators()));\n }\n\n exports.allowedToNavigateFrom = allowedToNavigateFrom;\n exports.getNavigators = getNavigators;\n exports.getStrategies = getStrategies;\n exports.setupClickableNavigator = setupClickableNavigator;\n exports.setupItemsNavigator = setupItemsNavigator;\n\n Object.defineProperty(exports, '__esModule', { value: true });\n\n});\n\n","define('taoQtiTest/runner/plugins/content/accessibility/keyNavigation/modes/defaultMode',[],function () { 'use strict';\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 Open Assessment Technologies SA ;\n */\n\n /**\n * Default key navigation mode\n */\n var defaultMode = {\n name: 'default',\n /**\n * Builds the key navigation config for the \"default\" mode\n * @param {keyNavigationStrategyConfig} config - additional config to set\n * @returns {keyNavigationMode}\n */\n init() {\n let config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n return {\n strategies: ['rubrics', 'stimulus', 'item', 'toolbar', 'header', 'top-toolbar', 'navigator', 'page'],\n config: Object.assign({\n autoFocus: true,\n wcagBehavior: false,\n keepState: true,\n propagateTab: false,\n flatNavigation: false,\n keyNextGroup: 'tab',\n keyPrevGroup: 'shift+tab',\n keyNextItem: 'right down',\n keyPrevItem: 'left up',\n keyNextTab: 'right',\n keyPrevTab: 'left',\n keyNextContent: 'down',\n keyPrevContent: 'up'\n }, config)\n };\n }\n };\n\n return defaultMode;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/accessibility/keyNavigation/modes/linearMode',[],function () { 'use strict';\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 Open Assessment Technologies SA ;\n */\n\n /**\n * Linear key navigation mode\n */\n var linearMode = {\n name: 'linear',\n /**\n * Builds the key navigation config for the \"linear\" mode\n * @param {keyNavigationStrategyConfig} config - additional config to set\n * @returns {keyNavigationMode}\n */\n init() {\n let config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n return {\n strategies: ['rubrics', 'stimulus', 'linearItem', 'toolbar', 'header', 'top-toolbar', 'navigator', 'page'],\n config: Object.assign({\n autoFocus: true,\n wcagBehavior: false,\n keepState: true,\n propagateTab: false,\n flatNavigation: false,\n keyNextGroup: 'tab',\n keyPrevGroup: 'shift+tab',\n keyNextItem: 'right down',\n keyPrevItem: 'left up',\n keyNextTab: 'right',\n keyPrevTab: 'left',\n keyNextContent: 'down',\n keyPrevContent: 'up'\n }, config)\n };\n }\n };\n\n return linearMode;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/accessibility/keyNavigation/modes/nativeMode',[],function () { 'use strict';\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 Open Assessment Technologies SA ;\n */\n\n /**\n * Native key navigation mode\n */\n var nativeMode = {\n name: 'native',\n /**\n * Builds the key navigation config for the \"native\" mode\n * @param {keyNavigationStrategyConfig} config - additional config to set\n * @returns {keyNavigationMode}\n */\n init() {\n let config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n return {\n // todo: add access to the page and the rubric blocks\n strategies: ['jump-links', 'header', 'top-toolbar', 'navigator', 'page', 'rubrics', 'stimulus', 'item', 'toolbar'],\n config: Object.assign({\n autoFocus: false,\n wcagBehavior: false,\n keepState: false,\n propagateTab: true,\n flatNavigation: true,\n keyNextGroup: 'tab',\n keyPrevGroup: 'shift+tab',\n keyNextItem: 'right down',\n keyPrevItem: 'left up',\n keyNextTab: '',\n keyPrevTab: '',\n keyNextContent: '',\n keyPrevContent: ''\n }, config)\n };\n }\n };\n\n return nativeMode;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/accessibility/keyNavigation/modes/index',['exports', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/modes/defaultMode', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/modes/linearMode', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/modes/nativeMode'], function (exports, defaultMode, linearMode, nativeMode) { 'use strict';\n\n\tdefaultMode = defaultMode && Object.prototype.hasOwnProperty.call(defaultMode, 'default') ? defaultMode['default'] : defaultMode;\n\tlinearMode = linearMode && Object.prototype.hasOwnProperty.call(linearMode, 'default') ? linearMode['default'] : linearMode;\n\tnativeMode = nativeMode && Object.prototype.hasOwnProperty.call(nativeMode, 'default') ? nativeMode['default'] : nativeMode;\n\n\n\n\texports.defaultModeProvider = defaultMode;\n\texports.linearModeProvider = linearMode;\n\texports.nativeModeProvider = nativeMode;\n\n\tObject.defineProperty(exports, '__esModule', { value: true });\n\n});\n\n","define('taoQtiTest/runner/plugins/content/accessibility/keyNavigation/modesManager',['core/providerRegistry', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/modes/index'], function (providerRegistry, modes) { 'use strict';\n\n providerRegistry = providerRegistry && Object.prototype.hasOwnProperty.call(providerRegistry, 'default') ? providerRegistry['default'] : providerRegistry;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 Open Assessment Technologies SA ;\n */\n\n /**\n * Defines the mode config\n * @typedef {Object} keyNavigationMode\n * @property {String[]} strategies\n * @property {keyNavigationStrategyConfig} config\n */\n\n /**\n * Builds a key navigator modes manager.\n *\n * @param {String} mode - the name of the mode to get\n * @param {keyNavigationStrategyConfig} config - additional config to set\n * @returns {keyNavigationMode}\n */\n function modeFactory(mode) {\n let config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n const instance = modeFactory.getProvider(mode);\n return instance.init(config);\n }\n\n // bootstrap the manager and register the strategies\n providerRegistry(modeFactory);\n Object.values(modes).forEach(mode => modeFactory.registerProvider(mode.name, mode));\n\n return modeFactory;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/accessibility/keyNavigation/keyNavigation',['ui/keyNavigation/navigator', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/helpers', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/modesManager', 'util/shortcut'], function (keyNavigator, helpers, modeFactory, shortcut) { 'use strict';\n\n keyNavigator = keyNavigator && Object.prototype.hasOwnProperty.call(keyNavigator, 'default') ? keyNavigator['default'] : keyNavigator;\n modeFactory = modeFactory && Object.prototype.hasOwnProperty.call(modeFactory, 'default') ? modeFactory['default'] : modeFactory;\n shortcut = shortcut && Object.prototype.hasOwnProperty.call(shortcut, 'default') ? shortcut['default'] : shortcut;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2020 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * The event namespace used to register removable listeners\n * @type {String}\n */\n const eventNS = '.keyNavigation';\n\n /**\n * Builds a key navigator that can apply onto a test runner\n * @param {testRunner} testRunner - the test runner instance to control\n * @param {Object} config - the config to apply\n * @param {String} config.contentNavigatorType - the keyboard navigation mode\n * @returns {testRunnerKeyNavigator}\n */\n function keyNavigationFactory(testRunner) {\n let config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n let {\n contentNavigatorType\n } = config;\n let groupNavigator = null;\n let strategies = [];\n\n /**\n * @typedef {Object} testRunnerKeyNavigator\n */\n return {\n /**\n * Setup the keyNavigator\n * @returns {testRunnerKeyNavigator}\n */\n init() {\n const navigationMode = modeFactory(contentNavigatorType, config);\n const navigationConfig = navigationMode.config;\n strategies = helpers.getStrategies(navigationMode, testRunner);\n const navigators = helpers.getNavigators(strategies);\n\n //blur current focused element, to reinitialize keyboard navigation\n if (document.activeElement) {\n document.activeElement.blur();\n }\n groupNavigator = keyNavigator({\n id: 'test-runner',\n loop: true,\n elements: navigators,\n propagateTab: navigationConfig.propagateTab\n });\n helpers.setupItemsNavigator(groupNavigator, {\n keyNextItem: navigationConfig.keyNextGroup,\n keyPrevItem: navigationConfig.keyPrevGroup\n });\n shortcut.remove(eventNS).add(`tab${eventNS} shift+tab${eventNS}`, function (e) {\n if (!helpers.allowedToNavigateFrom(e.target)) {\n return false;\n }\n if (!groupNavigator.isFocused()) {\n groupNavigator.focus();\n }\n });\n return this;\n },\n /**\n * Gets the attached testRunner\n * @returns {testRunner}\n */\n getTestRunner() {\n return testRunner;\n },\n /**\n * Switches the navigation mode\n * @param {String} newMode\n * @returns {testRunnerKeyNavigator}\n */\n setMode(newMode) {\n contentNavigatorType = newMode;\n return this;\n },\n /**\n * Gets the active navigation mode\n * @returns {String}\n */\n getMode() {\n return contentNavigatorType;\n },\n /**\n * Returns keyNavigation active state\n * @returns {Boolean}\n */\n isActive() {\n return groupNavigator !== null;\n },\n /**\n * Tears down the keyNavigator\n * @returns {testRunnerKeyNavigator}\n */\n destroy() {\n shortcut.remove(eventNS);\n strategies.forEach(strategy => strategy.destroy());\n if (groupNavigator) {\n groupNavigator.destroy();\n }\n groupNavigator = null;\n strategies = [];\n return this;\n }\n };\n }\n\n return keyNavigationFactory;\n\n});\n\n","\ndefine('css!taoQtiTest/runner/plugins/content/accessibility/css/key-navigation',[],function(){});\n","define('taoQtiTest/runner/plugins/content/accessibility/keyNavigation/plugin',['lodash', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/keyNavigation', 'taoTests/runner/plugin', 'css!taoQtiTest/runner/plugins/content/accessibility/css/key-navigation.css'], function (_, keyNavigatorFactory, pluginFactory, keyNavigation_css) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n keyNavigatorFactory = keyNavigatorFactory && Object.prototype.hasOwnProperty.call(keyNavigatorFactory, 'default') ? keyNavigatorFactory['default'] : keyNavigatorFactory;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2020 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * If we have now config from backend side - we set this default dataset\n *\n * @typedef {object}\n * @properties {string} contentNavigatorType - ('default' | 'linear') - type of content navigation\n */\n const defaultPluginConfig = {\n contentNavigatorType: 'default'\n };\n\n /**\n * Returns the configured plugin\n */\n var plugin = pluginFactory({\n name: 'keyNavigation',\n /**\n * Initialize the plugin (called during runner's init)\n */\n init() {\n const testRunner = this.getTestRunner();\n const pluginConfig = _.defaults(this.getConfig(), defaultPluginConfig);\n const keyNavigator = keyNavigatorFactory(testRunner, pluginConfig);\n\n /**\n * Update plugin state based on changes\n */\n testRunner.after('renderitem', () => {\n // make sure that keyNavigator is destroyed\n // to preevent multiple instances to be active at the same time\n if (keyNavigator.isActive()) {\n keyNavigator.destroy();\n }\n keyNavigator.init();\n }).on('unloaditem', () => {\n keyNavigator.destroy();\n })\n\n /**\n * @param {string} type - type of content tab navigation,\n * can be: 'default', 'linear', 'native'\n */.on('setcontenttabtype', type => {\n keyNavigator.setMode(type);\n pluginConfig.contentNavigatorType = type;\n });\n }\n });\n\n return plugin;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/accessibility/mainLandmark/header',['jquery', 'i18n', 'taoTests/runner/plugin', 'handlebars', 'lib/handlebars/helpers'], function ($$1, __, pluginFactory, Handlebars, Helpers0) { 'use strict';\n\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); \n\n\n return \"\\n\\n\";\n });\n function headerTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 (original work) Open Assessment Technologies SA ;\n */\n function getState(item) {\n let state = __('Unseen');\n if (item.flagged) {\n state = __('Flagged');\n } else if (item.answered) {\n state = __('Answered');\n } else if (item.viewed) {\n state = __('Viewed');\n }\n return state;\n }\n var header = pluginFactory({\n name: 'mainLandmark',\n init() {\n const testRunner = this.getTestRunner();\n const updateTitle = item => {\n this.$title.text(`${item.label}`).show();\n };\n const updateState = item => {\n this.$state.text(`${getState(item)}`).show();\n };\n testRunner.after('renderitem', () => {\n const item = testRunner.getCurrentItem();\n updateTitle(item);\n updateState(item);\n }).on('tool-flagitem', () => {\n let item = testRunner.getCurrentItem();\n item = Object.assign({}, item, {\n flagged: !item.flagged\n });\n updateState(item);\n });\n },\n render() {\n const $container = this.getAreaBroker().getArea('mainLandmark');\n this.$element = $$1(headerTpl());\n $container.append(this.$element);\n this.$title = $container.find(`[data-control=\"qti-test-item-title\"]`);\n this.$state = $container.find(`[data-control=\"qti-test-item-state\"]`);\n }\n });\n\n return header;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/dialog/dialog',['jquery', 'lodash', 'taoTests/runner/plugin', 'ui/dialog/alert', 'ui/dialog/confirm', 'util/shortcut/registry', 'util/shortcut', 'util/namespace'], function ($, _, pluginFactory, dialogAlert, dialogConfirm, shortcutRegistry, globalShortcut, namespaceHelper) { 'use strict';\n\n $ = $ && Object.prototype.hasOwnProperty.call($, 'default') ? $['default'] : $;\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n dialogAlert = dialogAlert && Object.prototype.hasOwnProperty.call(dialogAlert, 'default') ? dialogAlert['default'] : dialogAlert;\n dialogConfirm = dialogConfirm && Object.prototype.hasOwnProperty.call(dialogConfirm, 'default') ? dialogConfirm['default'] : dialogConfirm;\n shortcutRegistry = shortcutRegistry && Object.prototype.hasOwnProperty.call(shortcutRegistry, 'default') ? shortcutRegistry['default'] : shortcutRegistry;\n globalShortcut = globalShortcut && Object.prototype.hasOwnProperty.call(globalShortcut, 'default') ? globalShortcut['default'] : globalShortcut;\n namespaceHelper = namespaceHelper && Object.prototype.hasOwnProperty.call(namespaceHelper, 'default') ? namespaceHelper['default'] : namespaceHelper;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * The public name of the plugin\n * @type {String}\n */\n var pluginName = 'dialog';\n\n /**\n * The prefix of actions triggered through the event loop\n * @type {String}\n */\n var actionPrefix = `tool-${pluginName}-`;\n\n /**\n * Some default options for the plugin\n * @type {Object}\n */\n var defaultOptions = {\n alert: {\n focus: 'ok'\n },\n confirm: {\n focus: 'ok'\n }\n };\n\n /**\n * Returns the configured plugin\n */\n var dialog = pluginFactory({\n name: pluginName,\n /**\n * Initialize the plugin (called during runner's init)\n */\n init: function init() {\n var testRunner = this.getTestRunner();\n var testOptions = testRunner.getOptions();\n var pluginConfig = Object.assign({}, defaultOptions, this.getConfig());\n var pluginShortcuts = (testOptions.shortcuts || {})[pluginName] || {};\n var alerts = [];\n var confirms = [];\n var opened = [];\n var dialogShortcut = shortcutRegistry($('body'), {\n propagate: false,\n prevent: true\n });\n\n /**\n * Closes a dialog with accept\n * @param {dialog} dialog - The instance of the dialog\n */\n function closeAccept(dialog) {\n // TODO: improve the dialog implementation in order to provide a better API\n dialog.trigger('okbtn.modal').hide();\n }\n\n /**\n * Closes a dialog with rejection\n * @param {dialog} dialog - The instance of the dialog\n */\n function closeReject(dialog) {\n dialog.hide();\n }\n\n /**\n * Closes the last opened dialog\n * @param {Boolean} accept Whether the dialog should be accepted or not\n * @param {String} [shortcut] The shortcut that caused the action\n */\n function closeLast(accept, shortcut) {\n var handle = opened.length && opened[opened.length - 1];\n if (handle) {\n handle.shortcut = shortcut;\n if (accept) {\n closeAccept(handle.dialog);\n } else {\n closeReject(handle.dialog);\n }\n }\n }\n\n /**\n * Add dialog on top of the provided stack\n * @param {String} namespace - The event namespace that scope the dialog\n * @param {Array} stack - The dialogs stack on which push the new instance\n * @param {Function} dialog - The constructor of the dialog\n * @param {String} message - The message to display\n * @param {Function} accept - The callback for accept\n * @param {Function} reject - The callback for reject\n * @param {Object} options - Dialog options\n */\n function addHandle(namespace, stack, dialog, message, accept, reject, options) {\n var handle = {\n context: namespace,\n dialog: dialog(message, doAccept, doReject, options)\n };\n function doAccept(e, reason) {\n if (_.isFunction(accept)) {\n accept(handle.shortcut || reason);\n }\n }\n function doReject(e, reason) {\n if (_.isFunction(reject)) {\n reject(handle.shortcut || reason);\n }\n }\n\n // prevents all registered shortcuts to be triggered\n // and brings back the dialog shortcuts\n globalShortcut.disable();\n dialogShortcut.enable();\n stack.push(handle);\n opened.push(handle);\n handle.dialog.focus(options.focus);\n handle.dialog.on('closed.modal', function () {\n removeHandle(stack, handle.dialog);\n removeHandle(opened, handle.dialog);\n\n // if all dialogs have been closed allows all registered shortcuts to be triggered\n // also disables the dialog shortcuts\n if (!opened.length) {\n globalShortcut.enable();\n dialogShortcut.disable();\n }\n });\n }\n\n /**\n * Remove a dialog from the provided stack\n * @param {Array} stack - The dialogs stack from which remove the dialog instance\n * @param {dialog} dialog - The instance of the dialog\n */\n function removeHandle(stack, dialog) {\n if (dialog) {\n _.remove(stack, function (handle) {\n if (handle && dialog === handle.dialog) {\n return true;\n }\n });\n }\n }\n\n /**\n * Closes all dialogs within the provided stack\n * @param {String} namespace - The event namespace that scope the dialogs to close\n * @param {Boolean} accept - Whether (`true`) or not (`false`) to close the dialogs with accept\n * @param {Array} stack - The dialogs stack in which close the dialogs\n */\n function closeDialogs(namespace, accept, stack) {\n if (stack) {\n _.forEach(stack, function (handle) {\n if (handle && (namespace === '@' || namespace === handle.context)) {\n if (accept) {\n closeAccept(handle.dialog);\n } else {\n closeReject(handle.dialog);\n }\n }\n });\n } else {\n closeDialogs(namespace, accept, alerts);\n closeDialogs(namespace, accept, confirms);\n }\n }\n\n // starts with shortcuts disabled, prevents the TAB key to be used to move outside the dialog box\n dialogShortcut.disable().set('Tab Shift+Tab');\n\n // handle the plugin's shortcuts\n if (testOptions.allowShortcuts) {\n _.forEach(pluginShortcuts, function (command, key) {\n dialogShortcut.add(namespaceHelper.namespaceAll(command, pluginName, true), function (e, shortcut) {\n // just fire the action using the event loop\n testRunner.trigger(actionPrefix + key, shortcut);\n });\n });\n }\n\n //change plugin state\n testRunner.before('alert.*', function (e, msg, accept, options) {\n addHandle(e.namespace, alerts, dialogAlert, msg, accept, accept, _.merge({}, pluginConfig.alert, options));\n }).before('confirm.*', function (e, msg, accept, reject, options) {\n addHandle(e.namespace, confirms, dialogConfirm, msg, accept, reject, _.merge({}, pluginConfig.confirm, options));\n }).before('closedialog.*', function (e, accept) {\n closeDialogs(e.namespace, accept);\n }).on(`${actionPrefix}accept`, function (shortcut) {\n closeLast(true, shortcut);\n }).on(`${actionPrefix}reject`, function (shortcut) {\n closeLast(false, shortcut);\n }).on('destroy', function () {\n closeDialogs('.@');\n dialogShortcut.clear();\n dialogShortcut = null;\n });\n }\n });\n\n return dialog;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/dialog/exitMessages',['lodash', 'taoTests/runner/plugin'], function (_, pluginFactory) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Creates the testState plugin.\n * Displays exit message, then leaves the runner once the user has acknowledged\n */\n var exitMessages = pluginFactory({\n name: 'exitMessages',\n /**\n * Initializes the plugin (called during runner's init)\n */\n init: function init() {\n // this function is mandatory\n },\n /**\n * Installs the plugin (called when the runner bind the plugin)\n */\n install: function install() {\n var testRunner = this.getTestRunner();\n\n // intercepts the `leave` event,\n // then if a message needs to be displayed displays it and waits the user acknowledges it\n testRunner.before('leave', function leave(e, data) {\n const dataIsObject = _.isObject(data);\n if (dataIsObject && data.skipExitMessage) {\n return;\n }\n if (dataIsObject && data.message) {\n return new Promise(function (resolve) {\n var context = testRunner.getTestContext();\n\n // the leave can occurs when the runner is in inconsistent state (i.e. error)\n // prevent side error with item disabling\n if (context && context.itemIdentifier) {\n testRunner.disableItem(context.itemIdentifier);\n }\n // wait for the message acknowledge before leaving the runner\n testRunner.trigger('disablefeedbackalerts').trigger('alert.leave', data.message, function () {\n testRunner.trigger('enablefeedbackalerts');\n resolve();\n });\n });\n }\n });\n }\n });\n\n return exitMessages;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/dialog/itemAlertMessage',['jquery', 'ui/hider', 'taoTests/runner/plugin'], function ($, hider, pluginFactory) { 'use strict';\n\n $ = $ && Object.prototype.hasOwnProperty.call($, 'default') ? $['default'] : $;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2019 (original work) Open Assessment Technologies SA;\n *\n * @author Alexander Zagovorichev \n */\n\n /**\n * Returns the configured plugin\n */\n var itemAlertMessage = pluginFactory({\n name: 'itemAlertMessage',\n /**\n * Initialize the plugin (called during runner's init)\n */\n init: function init() {\n var self = this;\n this.$element = $(this.getContent().dom);\n this.$element\n // for GUI actions\n .on('closed.modal', function () {\n $(this).modal('destroy');\n }).on('destroyed.modal', function () {\n self.$element = null;\n self.trigger('resume', self);\n });\n },\n /**\n * Called during the runner's render phase\n */\n render: function render() {\n var testRunner = this.getTestRunner();\n var itemRunner = testRunner.itemRunner;\n var $modalsContainer = this.getContent().$container;\n if (!$modalsContainer) {\n $modalsContainer = $('#modalFeedbacks', itemRunner._item.container);\n }\n $modalsContainer.append(this.$element);\n this.$element.modal({\n startClosed: false,\n top: 200\n });\n },\n /**\n * Called during the runner's destroy phase\n */\n destroy: function destroy() {\n if (this.$element && this.$element.length) {\n this.$element.modal('close');\n }\n }\n });\n\n return itemAlertMessage;\n\n});\n\n","define('taoQtiTest/runner/helpers/navigation',['lodash', 'taoQtiTest/runner/helpers/map'], function (_, mapHelper) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * @typedef {Object} navigationHelper\n */\n var navigationHelper = {\n /**\n * Check whether the test taker is leaving a section\n *\n * @param {Object} testContext - the actual test context\n * @param {String} testContext.itemIdentifier - the id of the current item\n * @param {String} testContext.sectionId - the id of the current section\n * @param {Object} testMap - the actual test map\n * @param {String} direction - the move direction (next, previous or jump)\n * @param {String} scope - the move scope (item, section, testPart)\n * @param {Number} [position] - the position in case of jump\n * @returns {Boolean} true if the action leads to a section leave\n * @throws {TypeError} if the context or the map are incorrect\n */\n isLeavingSection: function isLeavingSection(testContext, testMap, direction, scope, position) {\n var section;\n var sectionStats;\n var nbItems;\n var item;\n if (_.isPlainObject(testContext) && _.isPlainObject(testMap) && !_.isEmpty(testContext.sectionId) && !_.isEmpty(testContext.itemIdentifier)) {\n section = mapHelper.getSection(testMap, testContext.sectionId);\n sectionStats = mapHelper.getSectionStats(testMap, testContext.sectionId);\n nbItems = sectionStats && sectionStats.total;\n item = mapHelper.getItem(testMap, testContext.itemIdentifier);\n return scope === 'section' || scope === 'testPart' || direction === 'next' && item.positionInSection + 1 === nbItems || direction === 'previous' && item.positionInSection === 0 || direction === 'jump' && position > 0 && (position < section.position || position >= section.position + nbItems);\n }\n throw new TypeError('Invalid test context and test map');\n },\n /**\n * Check whether the test taker is leaving a test part\n *\n * @param {Object} testContext - the actual test context\n * @param {String} testContext.itemIdentifier - the id of the current item\n * @param {String} testContext.sectionId - the id of the current section\n * @param {String} testContext.testPartId - the id of the current testPart\n * @param {Object} testMap - the actual test map\n * @param {String} direction - the move direction (next, previous or jump)\n * @param {String} scope - the move scope (item, section, testPart)\n * @param {Number} [position] - the position in case of jump\n * @returns {Boolean} true if the action leads to a section leave\n * @throws {TypeError} if the context or the map are incorrect\n */\n isLeavingTestPart: function isLeavingTestPart(testContext, testMap, direction, scope, position) {\n var testPart;\n var testPartStats;\n var nbItems;\n var item;\n var section;\n var sectionStats;\n if (_.isPlainObject(testContext) && _.isPlainObject(testMap) && !_.isEmpty(testContext.testPartId) && !_.isEmpty(testContext.sectionId) && !_.isEmpty(testContext.itemIdentifier)) {\n testPart = mapHelper.getPart(testMap, testContext.testPartId);\n testPartStats = mapHelper.getPartStats(testMap, testContext.testPartId);\n nbItems = testPartStats && testPartStats.total;\n item = mapHelper.getItem(testMap, testContext.itemIdentifier);\n if (scope === 'section') {\n section = mapHelper.getSection(testMap, testContext.sectionId);\n sectionStats = mapHelper.getSectionStats(testMap, testContext.sectionId);\n }\n return scope === 'testPart' || direction === 'next' && scope === 'item' && item.positionInPart + 1 === nbItems || direction === 'next' && scope === 'section' && section.position + sectionStats.total >= nbItems || direction === 'previous' && scope === 'item' && item.positionInPart === 0 || direction === 'previous' && scope === 'section' && section.position === testPart.position || direction === 'jump' && position > 0 && (position < testPart.position || position >= testPart.position + nbItems);\n }\n throw new TypeError('Invalid test context and test map');\n },\n /**\n * Check if the given item is the last of the test\n * @param {Object} testMap - the test map\n * @param {String} itemIdentifier - the identifier of the item\n * @returns {Boolean} true if the item is the last one\n */\n isLast: function isLast(testMap, itemIdentifier) {\n return this.isLastOf(testMap, itemIdentifier, 'test');\n },\n /**\n * Check if the given item is the first of a test\n * @param {Object} testMap - the test map\n * @param {String} itemIdentifier - the identifier of the item\n * @returns {Boolean} true if the item is the first one\n */\n isFirst: function isFirst(testMap, itemIdentifier) {\n return this.isFirstOf(testMap, itemIdentifier, 'test');\n },\n /**\n * Check if the given item is the last of a the given scope\n * @param {Object} testMap - the test map\n * @param {String} itemIdentifier - the identifier of the item\n * @param {String} [scope = 'test'] - the target scope\n * @returns {Boolean} true if the item is the last one\n */\n isLastOf: function isLastOf(testMap, itemIdentifier, scope) {\n var item;\n var stats;\n if (!_.isPlainObject(testMap)) {\n throw new TypeError('Invalid test map');\n }\n if (_.isEmpty(itemIdentifier)) {\n throw new TypeError('Invalid item identifier');\n }\n scope = scope || 'test';\n item = mapHelper.getItem(testMap, itemIdentifier);\n stats = mapHelper.getScopeStats(testMap, item.position, scope);\n if (stats && _.isNumber(stats.total)) {\n if (scope === 'test') {\n return item.position + 1 === stats.total;\n }\n if (scope === 'section' || scope === 'assessmentSection' || scope === 'testSection') {\n return item.positionInSection + 1 === stats.total;\n }\n if (scope === 'part' || scope === 'testPart') {\n return item.positionInPart + 1 === stats.total;\n }\n }\n return false;\n },\n /**\n * Check if the given item is the first of a the given scope\n * @param {Object} testMap - the test map\n * @param {String} itemIdentifier - the identifier of the item\n * @param {String} [scope = 'test'] - the target scope\n * @returns {Boolean} true if the item is the first one\n */\n isFirstOf: function isFirstOf(testMap, itemIdentifier, scope) {\n var item;\n if (!_.isPlainObject(testMap)) {\n throw new TypeError('Invalid test map');\n }\n if (_.isEmpty(itemIdentifier)) {\n throw new TypeError('Invalid item identifier');\n }\n scope = scope || 'test';\n item = mapHelper.getItem(testMap, itemIdentifier);\n if (scope === 'test') {\n return item.position === 0;\n }\n if (scope === 'section' || scope === 'assessmentSection' || scope === 'testSection') {\n return item.positionInSection === 0;\n }\n if (scope === 'part' || scope === 'testPart') {\n return item.positionInPart === 0;\n }\n return false;\n },\n /**\n * Gets the map descriptors of the sibling items\n * @param {Object} testMap\n * @param {Number|String} itemPosition - (could be also the item id)\n * @param {String} [direction='both'] - previous/next/both\n * @param {Number} [size=3] - will be 2xsize if direction is both\n * @returns {Object[]} the collections of items\n */\n getSiblingItems: function getSiblingItems(testMap, itemPosition, direction, size) {\n var itemId = mapHelper.getItemIdentifier(testMap, itemPosition);\n var previous = null;\n var siblings = [];\n var directions;\n var itemChain = _.reduce(testMap && testMap.jumps, function (map, jump) {\n var ref = jump.identifier;\n if (previous) {\n map[previous].next = ref;\n }\n map[ref] = {\n identifier: ref,\n previous: previous,\n next: null\n };\n previous = ref;\n return map;\n }, {});\n size = _.isFinite(size) ? parseInt(size, 10) : 3;\n if (!direction || direction === 'both') {\n directions = ['previous', 'next'];\n } else {\n directions = [direction];\n }\n _.forEach(directions, function walkDirection(link) {\n var id = itemId;\n _.times(size, function getNeighbor() {\n id = itemChain[id] && itemChain[id][link];\n if (id) {\n siblings.push(mapHelper.getItem(testMap, id));\n } else {\n return false;\n }\n });\n });\n return siblings;\n },\n /**\n * Gets the map descriptor of the next item\n * @param {Object} testMap\n * @param {Number|String} itemPosition - (could be also the item id)\n * @returns {Object}\n */\n getNextItem: function getNextItem(testMap, itemPosition) {\n var siblings = navigationHelper.getSiblingItems(testMap, itemPosition, 'next', 1);\n if (siblings.length) {\n return siblings[0];\n }\n return null;\n },\n /**\n * Gets the map descriptor of the previous item\n * @param {Object} testMap\n * @param {Number|String} itemPosition - (could be also the item id)\n * @returns {Object}\n */\n getPreviousItem: function getPreviousItem(testMap, itemPosition) {\n var siblings = navigationHelper.getSiblingItems(testMap, itemPosition, 'previous', 1);\n if (siblings.length) {\n return siblings[0];\n }\n return null;\n },\n /**\n * Checks if an action will move forward.\n * @param {String} action - the name of the action that will be performed\n * @param {Object} [params] - some optional parameters that apply to the action\n * @returns {Boolean}\n */\n isMovingToNextItem: function isMovingToNextItem(action, params) {\n params = params || {};\n return action === 'timeout' || action === 'skip' || action === 'move' && params.direction === 'next' && params.scope === 'item';\n },\n /**\n * Checks if an action will move backward.\n * @param {String} action - the name of the action that will be performed\n * @param {Object} [params] - some optional parameters that apply to the action\n * @returns {Boolean}\n */\n isMovingToPreviousItem: function isMovingToPreviousItem(action, params) {\n params = params || {};\n return action === 'move' && params.direction === 'previous' && params.scope === 'item';\n },\n /**\n * Checks if an action will jump on another item.\n * @param {String} action - the name of the action that will be performed\n * @param {Object} [params] - some optional parameters that apply to the action\n * @returns {Boolean}\n */\n isJumpingToItem: function isJumpingToItem(action, params) {\n params = params || {};\n return action === 'move' && params.direction === 'jump' && params.scope === 'item';\n }\n };\n\n return navigationHelper;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/dialog/itemInlineMessage',['jquery', 'i18n', 'ui/hider', 'taoTests/runner/plugin', 'handlebars', 'lib/handlebars/helpers', 'taoQtiTest/runner/helpers/navigation'], function ($$1, __, hider, pluginFactory, Handlebars, Helpers0, navigationHelper) { 'use strict';\n\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n navigationHelper = navigationHelper && Object.prototype.hasOwnProperty.call(navigationHelper, 'default') ? navigationHelper['default'] : navigationHelper;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, functionType=\"function\", escapeExpression=this.escapeExpression, self=this;\n\n function program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \" \";\n if (helper = helpers.className) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.className); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1);\n return buffer;\n }\n\n function program3(depth0,data) {\n \n var buffer = \"\", stack1;\n buffer += \"\\n aria-\"\n + escapeExpression(((stack1 = (data == null || data === false ? data : data.key)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1))\n + \"=\\\"\"\n + escapeExpression((typeof depth0 === functionType ? depth0.apply(depth0) : depth0))\n + \"\\\"\\n \";\n return buffer;\n }\n\n function program5(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\";\n return buffer;\n }\n function program6(depth0,data) {\n \n \n return \" no-label\";\n }\n\n function program8(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\";\n if (helper = helpers.text) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.text); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\";\n return buffer;\n }\n\n buffer += \"\\n \\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.icon), {hash:{},inverse:self.noop,fn:self.program(5, program5, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.text), {hash:{},inverse:self.noop,fn:self.program(8, program8, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \\n\\n\";\n return buffer;\n });\n function buttonTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA;\n *\n * @author Alexander Zagovorichev \n */\n\n /**\n * The display of the next button\n */\n var buttonData = {\n next: {\n control: 'move-forward',\n title: __('Submit and go to the next item'),\n icon: 'forward',\n text: __('OK')\n },\n end: {\n control: 'move-end',\n title: __('Submit and go to the end of the test'),\n icon: 'fast-forward',\n text: __('OK & End test')\n }\n };\n\n /**\n * Returns the configured plugin\n */\n var itemInlineMessage = pluginFactory({\n name: 'itemInlineMessage',\n /**\n * Initialize the plugin (called during runner's init)\n */\n init: function init() {\n var self = this;\n var testRunner = this.getTestRunner();\n\n /**\n * Create the button based on the current context\n * @returns {*|jQuery|HTMLElement} the button\n */\n var createOkButton = function createElement() {\n const testContext = testRunner.getTestContext();\n const testMap = testRunner.getTestMap();\n const dataType = navigationHelper.isLast(testMap, testContext.itemIdentifier) ? 'end' : 'next';\n const $btn = $$1(buttonTpl(buttonData[dataType]));\n $btn.addClass('modalFeedback-button');\n\n //plugin behavior\n $btn.on('click', function (e) {\n e.preventDefault();\n self.disable();\n if ($$1(this).data('control') === 'move-end') {\n self.trigger('end');\n }\n $btn.remove();\n self.$element.remove();\n self.trigger('resume', self);\n });\n return $btn;\n };\n this.$button = createOkButton();\n this.$element = $$1(this.getContent().dom);\n },\n /**\n * Called during the runner's render phase\n */\n render: function render() {\n var $navigationContainer = this.getAreaBroker().getNavigationArea();\n var testRunner = this.getTestRunner();\n var itemRunner = testRunner.itemRunner;\n var $inlineContainer = this.getContent().$container;\n if (!$inlineContainer && itemRunner._item.container) {\n $inlineContainer = $$1('.qti-itemBody', itemRunner._item.container);\n }\n $inlineContainer.append(this.$element);\n\n // hide all navigation buttons, create new instead of\n if (!$$1('.modalFeedback-button', $navigationContainer).length) {\n $navigationContainer.append(this.$button);\n }\n },\n /**\n * Enable the button\n */\n enable: function enable() {\n this.$button.removeProp('disabled').removeClass('disabled');\n },\n disable: function disable() {\n this.$button.prop('disabled', true).addClass('disabled');\n },\n /**\n * Called during the runner's destroy phase\n */\n destroy: function destroy() {\n this.$button.click();\n }\n });\n\n return itemInlineMessage;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/feedback/feedback',['i18n', 'taoTests/runner/plugin', 'ui/feedback'], function (__, pluginFactory, feedback$1) { 'use strict';\n\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n feedback$1 = feedback$1 && Object.prototype.hasOwnProperty.call(feedback$1, 'default') ? feedback$1['default'] : feedback$1;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Returns the configured plugin\n */\n var feedback = pluginFactory({\n name: 'feedback',\n /**\n * Initialize the plugin (called during runner's init)\n */\n init: function init() {\n var self = this;\n\n //keep a ref of the feedbacks\n var currentFeedback;\n var testRunner = this.getTestRunner();\n\n /**\n * Close the current feedback\n */\n var closeCurrent = function closeCurrent() {\n if (currentFeedback) {\n currentFeedback.close();\n }\n };\n this.setState('enabled', true);\n\n //change plugin state\n testRunner.on('error', function (err) {\n var message = err;\n var type = 'error';\n if (self.getState('enabled')) {\n if ('object' === typeof err) {\n message = err.message;\n type = err.type;\n }\n if (!message) {\n switch (type) {\n case 'TestState':\n message = __('The test has been closed/suspended!');\n break;\n case 'FileNotFound':\n message = __('File not found!');\n break;\n default:\n message = __('An error occurred!');\n }\n }\n currentFeedback = feedback$1().error(message);\n }\n }).on('danger', function (message) {\n if (self.getState('enabled')) {\n currentFeedback = feedback$1().danger(message);\n }\n }).on('warning', function (message) {\n if (self.getState('enabled')) {\n currentFeedback = feedback$1().warning(message);\n }\n }).on('info', function (message) {\n if (self.getState('enabled')) {\n currentFeedback = feedback$1().info(message);\n }\n }).on('alert.* confirm.* unloaditem', closeCurrent).on('disablefeedbackalerts', function () {\n closeCurrent();\n self.setState('enabled', false);\n }).on('enablefeedbackalerts', function () {\n self.setState('enabled', true);\n });\n }\n });\n\n return feedback;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/itemScrolling/itemScrolling',['jquery', 'util/typeCaster', 'taoTests/runner/plugin'], function ($, typeCaster, pluginFactory) { 'use strict';\n\n $ = $ && Object.prototype.hasOwnProperty.call($, 'default') ? $['default'] : $;\n typeCaster = typeCaster && Object.prototype.hasOwnProperty.call(typeCaster, 'default') ? typeCaster['default'] : typeCaster;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 (original work) Open Assessment Technologies SA;\n */\n\n /**\n * Creates the loading bar plugin.\n * Displays a loading bar when a blocking task is running\n */\n var itemScrolling = pluginFactory({\n name: 'itemScrolling',\n /**\n * Initializes the plugin (called during runner's init)\n */\n init: function init() {\n const testRunner = this.getTestRunner();\n const $contentArea = testRunner.getAreaBroker().getContentArea();\n const gridRowBottomMargin = 12,\n qtiItemPadding = 30 * 2;\n testRunner.on('renderitem', function () {\n adaptItemHeight();\n $(window).off('resize.adaptItemHeight');\n $(window).on('resize.adaptItemHeight', adaptItemHeight);\n });\n function adaptItemHeight() {\n const $itemContainer = $contentArea.find('[data-scrolling=\"true\"]');\n const contentHeight = getItemRunnerHeight() - getExtraGridRowHeight() - getSpaceAboveQtiContent() - gridRowBottomMargin - qtiItemPadding;\n $itemContainer.each(function () {\n const $item = $(this);\n const isScrollable = typeCaster.strToBool($item.attr('data-scrolling') || 'false');\n const selectedHeight = parseFloat($item.attr('data-scrolling-height')) || 100;\n const containerParent = $item.parent().closest('[data-scrolling=\"true\"]');\n if ($item.length && isScrollable) {\n $item.data('scrollable', true);\n $item.css({\n 'overflow-y': 'scroll'\n });\n if (containerParent.length > 0) {\n $item.css('max-height', `${containerParent.height() * (selectedHeight * 0.01)}px`);\n } else {\n $item.css('max-height', `${contentHeight * (selectedHeight * 0.01)}px`);\n }\n }\n });\n }\n\n // depending on the context (item preview, new/old test runner...) available height is computed differently\n function getItemRunnerHeight() {\n var $testRunnerSections = $('.test-runner-sections');\n\n // exists only in the new test runner\n if ($testRunnerSections.length) {\n return $testRunnerSections.get(0).getBoundingClientRect().height;\n }\n // otherwise, we assume that we are in an iframe with all space available (= item preview, old test runner)\n return $(window).height();\n }\n\n // extra grid row are there in case of a vertical layout (item on top/bottom of the question)\n function getExtraGridRowHeight() {\n var $gridRows = $('.qti-itemBody > .grid-row'),\n extraHeight = 0;\n $gridRows.each(function () {\n var $gridRow = $(this),\n $itemContainer = $gridRow.find('[data-scrolling=\"true\"]');\n if (!$itemContainer.length) {\n extraHeight += $gridRow.outerHeight(true);\n }\n });\n return extraHeight;\n }\n\n // most of the time this will be rubrick's block height in the new test runner\n function getSpaceAboveQtiContent() {\n var $testRunnerSections = $('.test-runner-sections'),\n $qtiContent = $('#qti-content');\n if ($testRunnerSections.length && $qtiContent.length) {\n return $qtiContent.get(0).getBoundingClientRect().top - $testRunnerSections.get(0).getBoundingClientRect().top;\n }\n return 0;\n }\n }\n });\n\n return itemScrolling;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/loading/loading',['layout/loading-bar', 'taoTests/runner/plugin'], function (loadingBar, pluginFactory) { 'use strict';\n\n loadingBar = loadingBar && Object.prototype.hasOwnProperty.call(loadingBar, 'default') ? loadingBar['default'] : loadingBar;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Creates the loading bar plugin.\n * Displays a loading bar when a blocking task is running\n */\n var loading = pluginFactory({\n name: 'loading',\n /**\n * Initializes the plugin (called during runner's init)\n */\n init: function init() {\n var testRunner = this.getTestRunner();\n testRunner.on('unloaditem', function () {\n loadingBar.start();\n }).on('renderitem', function () {\n loadingBar.stop();\n });\n }\n });\n\n return loading;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/modalFeedback/modalFeedback',['jquery', 'lodash', 'module', 'taoTests/runner/plugin', 'taoQtiTest/runner/plugins/content/dialog/itemInlineMessage', 'taoQtiTest/runner/plugins/content/dialog/itemAlertMessage', 'ui/autoscroll'], function ($, _, module, pluginFactory, inlineMessage, alertMessage, autoscroll) { 'use strict';\n\n $ = $ && Object.prototype.hasOwnProperty.call($, 'default') ? $['default'] : $;\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n module = module && Object.prototype.hasOwnProperty.call(module, 'default') ? module['default'] : module;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n inlineMessage = inlineMessage && Object.prototype.hasOwnProperty.call(inlineMessage, 'default') ? inlineMessage['default'] : inlineMessage;\n alertMessage = alertMessage && Object.prototype.hasOwnProperty.call(alertMessage, 'default') ? alertMessage['default'] : alertMessage;\n autoscroll = autoscroll && Object.prototype.hasOwnProperty.call(autoscroll, 'default') ? autoscroll['default'] : autoscroll;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA;\n *\n * @author Alexander Zagovorichev \n */\n\n /**\n * Modal or inline type of the messages\n */\n var inlineMode;\n\n /**\n * Form of the feedback\n * by default dialog (modal) form\n */\n var messagePlugin;\n\n /**\n * All feedback messages\n */\n var renderedFeedbacks;\n\n /**\n * modalFeedback was resolved and all components were destroyed\n */\n var isDestroyed;\n\n /**\n * Method which should be halted after modalFeedbacks confirmation action\n */\n var nextStep;\n function destroyFeedback(feedback) {\n var removed = false;\n _.remove(renderedFeedbacks, function (storedFeedback) {\n var found = storedFeedback === feedback;\n if (found) {\n removed = true;\n }\n return found;\n });\n if (removed) {\n feedback.destroy();\n if (!renderedFeedbacks.length) {\n nextStep();\n }\n }\n }\n function defineMode(inline) {\n inlineMode = inline;\n messagePlugin = inlineMode ? inlineMessage : alertMessage;\n }\n\n /**\n * Returns the configured plugin\n */\n var modalFeedback = pluginFactory({\n name: 'QtiModalFeedback',\n /**\n * Initialize the plugin (called during runner's init)\n */\n init: function init() {\n nextStep = function () {};\n defineMode(!!module.config().inlineModalFeedback);\n },\n /**\n * Called during the runner's render phase\n */\n render: function render() {\n var self = this;\n var testRunner = this.getTestRunner();\n var createMessages = function createMessages(renderingQueue, inline) {\n var bInlineMode = inlineMode;\n isDestroyed = false;\n renderedFeedbacks = [];\n if (_.isBoolean(inline)) {\n defineMode(inline);\n }\n if (renderingQueue.length) {\n _.forEach(renderingQueue, function (renderingToken) {\n var feedback = messagePlugin(testRunner, testRunner.getAreaBroker());\n feedback.init({\n dom: renderingToken.feedback.render({\n inline: inlineMode\n }),\n // for alerts will be used #modalMessages container\n $container: inlineMode ? renderingToken.$container : null\n });\n feedback.render();\n renderedFeedbacks.push(feedback);\n });\n\n // auto scroll to the first feedback, only for the \"inline\" mode\n if (inlineMode && renderedFeedbacks) {\n autoscroll($('.qti-modalFeedback', testRunner.getAreaBroker().getContentArea()).first(), testRunner.getAreaBroker().getContentArea().parents('.content-wrapper'));\n }\n } else {\n nextStep();\n }\n\n // restore global feedback mode\n defineMode(bInlineMode);\n };\n if (inlineMode) {\n testRunner.off('plugin-resume.itemInlineMessage').on('plugin-resume.itemInlineMessage', function () {\n self.destroy();\n });\n } else {\n testRunner.off('plugin-resume.itemAlertMessage').on('plugin-resume.itemAlertMessage', function (feedback) {\n destroyFeedback(feedback);\n });\n }\n testRunner.on('modalFeedbacks', function (renderingQueue, done, inline) {\n nextStep = done;\n createMessages(renderingQueue, inline);\n });\n },\n /**\n * Called during the runner's destroy phase\n * allow to run that function only once\n */\n destroy: function destroy() {\n var tFeedbacks, i;\n if (!isDestroyed) {\n isDestroyed = true;\n if (!renderedFeedbacks) {\n nextStep();\n } else {\n tFeedbacks = renderedFeedbacks.slice(0);\n for (i in tFeedbacks) {\n destroyFeedback(tFeedbacks[i]);\n }\n }\n }\n }\n });\n\n return modalFeedback;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/overlay/overlay',['jquery', 'taoTests/runner/plugin'], function ($, pluginFactory) { 'use strict';\n\n $ = $ && Object.prototype.hasOwnProperty.call($, 'default') ? $['default'] : $;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Returns the configured plugin\n */\n var overlay = pluginFactory({\n name: 'overlay',\n /**\n * Initialize the plugin (called during runner's init)\n */\n init: function init() {\n var self = this;\n var testRunner = this.getTestRunner();\n this.$element = $('
          ');\n this.$element.on('click mousedown mouseup touchstart touchend keyup keydow keypress scroll drop', function (e) {\n e.stopImmediatePropagation();\n e.stopPropagation();\n });\n const shield = function shield() {\n self.enable();\n };\n const unshield = function unshield() {\n self.disable();\n };\n\n //change plugin state\n testRunner.on('disableitem', shield).on('enableitem unloaditem modalFeedbacks', unshield);\n },\n /**\n * Called during the runner's render phase\n */\n render: function render() {\n var $contentArea = this.getTestRunner().getAreaBroker().getContentArea();\n $contentArea.after(this.$element);\n },\n /**\n * Called during the runner's destroy phase\n */\n destroy: function destroy() {\n this.$element.remove();\n },\n /**\n * Enable the overlay\n */\n enable() {\n const overlayConfig = this.getConfig();\n this.$element.addClass('overlay');\n if (overlayConfig.full) {\n this.$element.addClass('overlay-full');\n }\n },\n /**\n * Disable the overlay\n */\n disable: function disable() {\n this.$element.removeClass('overlay overlay-full');\n },\n /**\n * Show the overlay\n */\n show: function show() {\n this.enable();\n },\n /**\n * Hide the overlay\n */\n hide: function hide() {\n this.disable();\n }\n });\n\n return overlay;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/responsiveness/collapser',['lodash', 'jquery', 'taoTests/runner/plugin'], function (_, $, pluginFactory) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n $ = $ && Object.prototype.hasOwnProperty.call($, 'default') ? $['default'] : $;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Event namespace\n * @type {String}\n */\n var ns = '.collapser';\n\n /**\n * Name of the CSS class used to collapse the buttons\n * @type {String}\n */\n var noLabelCls = 'tool-label-collapsed';\n\n /**\n * Name of the CSS class used to collapse the buttons and allow to expand on mouse over\n * @type {String}\n */\n var noLabelHoverCls = 'tool-label-collapsed-hover';\n\n /**\n * Name of the CSS class used to hide the label of the button independently of responsiveness\n * @type {string}\n */\n var labelHiddenCls = 'no-tool-label';\n\n /**\n * Name of the CSS class for separators\n * @type {string}\n */\n var separatorCls = 'separator';\n\n /**\n * Default plugin options\n * @type {Object}\n */\n var defaults = {\n collapseTools: true,\n // collapse the tools buttons\n collapseNavigation: false,\n // collapse the navigation buttons\n collapseInOrder: false,\n // collapse any button in the given order\n hover: false,\n // expand when the mouse is over a button,\n\n /**\n * Allow to set manually which buttons should collapse and in which order.\n * This can be set by triggering the \"collapser-set-order\" event on the testRunner.\n * Given as an array of jQuery selectors: first index will be the first to be collapsed, and so on.\n * If no selector is given for a button, then this one will never collapse.\n * ex:\n * var collapseOrder = [\n * '[data-control=\"highlight-clear\"],[data-control=\"highlight-trigger\"]', // those will collapse first...\n * '[data-control=\"hide-review\"]', // this one second...\n * '[data-control=\"set-item-flag\"]', // third...\n * ... // ...\n * ];\n * @type {String[]}\n */\n collapseOrder: []\n };\n var $window = $(window);\n\n /**\n * Creates the responsiveness collapser plugin.\n * Reduce the size of the action bar tools when the available space is below the needed one.\n */\n var collapser = pluginFactory({\n name: 'collapser',\n /**\n * Installs the plugin (called when the runner bind the plugin)\n */\n init: function init() {\n const testRunner = this.getTestRunner();\n const config = Object.assign({}, defaults, this.getConfig());\n const collapseCls = config.hover ? noLabelHoverCls : noLabelCls;\n var areaBroker = testRunner.getAreaBroker();\n var $actionsBar = areaBroker.getArea('actionsBar'),\n $toolbox = areaBroker.getToolboxArea(),\n $navigation = areaBroker.getNavigationArea();\n var allCollapsibles, availableWidth, previousAvailableWidth;\n\n /**\n * Get a reference of all collapsibles\n */\n function buildCollapsiblesList() {\n // use the given order to build the collapsibles list or generate on in natural order\n if (config.collapseInOrder && config.collapseOrder.length) {\n allCollapsibles = getCollapsiblesFromConfig();\n }\n // get values from DOM, grouped by prefix\n else if (config.collapseInOrder) {\n allCollapsibles = getSortedCollapsiblesFromDom();\n }\n // get all in one chunk\n else {\n allCollapsibles = getUnsortedCollapsiblesFromDom();\n }\n }\n\n /**\n * @param {jQuery} $element\n * @returns {number} Size difference, in pixels, between collapsed and expanded state of $element\n */\n function getExtraWidth($element) {\n var expandedWidth, collapsedWidth;\n $element.removeClass(collapseCls);\n expandedWidth = $element.outerWidth(true);\n $element.addClass(collapseCls);\n collapsedWidth = $element.outerWidth(true);\n $element.removeClass(collapseCls);\n return expandedWidth - collapsedWidth;\n }\n\n /**\n * Expand or collapse elements\n */\n function toggleCollapsibles() {\n availableWidth = getAvailableWidth();\n availableWidth < previousAvailableWidth ? collapseInOrder() : expandInOrder();\n previousAvailableWidth = availableWidth;\n }\n function collapseInOrder() {\n var collapsiblesCopy = _.clone(allCollapsibles),\n toCollapse;\n while (collapseNeeded() && collapsiblesCopy.length) {\n toCollapse = collapsiblesCopy.shift();\n toCollapse.$elements.addClass(collapseCls);\n }\n }\n function collapseNeeded() {\n return getToolbarWidth() > getAvailableWidth();\n }\n function expandInOrder() {\n _.forEachRight(allCollapsibles, function (toExpand) {\n if (toExpand.$elements.hasClass(collapseCls)) {\n if (expandPossible(toExpand.extraWidth)) {\n toExpand.$elements.removeClass(collapseCls);\n } else {\n return false;\n }\n }\n });\n }\n function expandPossible(extraWidth) {\n return getToolbarWidth() + extraWidth < getAvailableWidth();\n }\n function getAvailableWidth() {\n // Scrollbars are commonly between ~12px and ~18px in width. Subtracting 20px from the available width\n // makes sure that scrollbars are always taken in account. The worst case scenario is that the buttons\n // start to collapse, although they would still have had 20px available.\n return $actionsBar.width() - 20;\n }\n function getToolbarWidth() {\n return $toolbox.outerWidth(true) + $navigation.outerWidth(true);\n }\n\n /**\n * Parse DOM for controls that can be collapsed\n * @returns {*|jQuery|HTMLElement}\n */\n function getControlsFromDom() {\n var $controls = $(),\n selector = '>ul>[data-control]';\n if (config.collapseTools) {\n $controls = $controls.add($toolbox.find(selector).not(`.${labelHiddenCls}`).not(`.${separatorCls}`));\n }\n if (config.collapseNavigation) {\n $controls = $controls.add($navigation.find(selector).not(`.${labelHiddenCls}`).not(`.${separatorCls}`));\n }\n return $controls;\n }\n\n /**\n * Get allCollapsibles based on configuration\n *\n * @returns {Array}\n */\n function getCollapsiblesFromConfig() {\n return _.compact(config.collapseOrder.map(function (selector) {\n // some buttons are collapsed by configuration, some other are only separators: we should leave them alone\n var $elements = $(selector).not(`.${labelHiddenCls}`).not(`.${separatorCls}`);\n var extraWidth = 0;\n if ($elements.length) {\n $elements.each(function () {\n extraWidth += getExtraWidth($(this));\n });\n return {\n $elements: $elements,\n extraWidth: extraWidth\n };\n }\n return false;\n }));\n }\n\n /**\n * Get allCollapsibles based on DOM\n * Build the collapse order from the left to the right, related elements are grouped.\n *\n * @returns {Array}\n */\n function getSortedCollapsiblesFromDom() {\n var $controlElements = getControlsFromDom(),\n _allCollapsibles = [],\n order = {};\n\n // group items by prefix\n // eg. zoomIn and zoomOut -> zoom\n $controlElements.each(function () {\n var ctrl = this.dataset.control,\n // re makes group `foo` from `foo-bar`, `fooBar` and `foo_bar`\n // if we do not have a prefix use the control name as key to ensure uniqueness\n key = ctrl.substring(0, ctrl.search(/[A-Z-_]/)) || ctrl;\n order[key] = order[key] || $();\n order[key] = order[key].add($(this));\n });\n\n // move items to allCollapsibles\n _.forOwn(order, function ($elements) {\n var extraWidth = 0;\n $elements.each(function () {\n extraWidth += getExtraWidth($(this));\n });\n _allCollapsibles.push({\n $elements: $elements,\n extraWidth: extraWidth\n });\n });\n return _.compact(_allCollapsibles);\n }\n\n /**\n * Get allCollapsibles based on DOM, all buttons will be collapsed at once\n *\n * @returns {Array}\n */\n function getUnsortedCollapsiblesFromDom() {\n var $elements = getControlsFromDom(),\n _allCollapsibles = [],\n extraWidth = 0;\n $elements.each(function () {\n extraWidth += getExtraWidth($(this));\n });\n _allCollapsibles.push({\n $elements: $elements,\n extraWidth: extraWidth\n });\n return _.compact(_allCollapsibles);\n }\n $window.on(`resize${ns}`, _.throttle(function () {\n testRunner.trigger('collapseTools');\n }, 40));\n testRunner.after('renderitem loaditem', function () {\n previousAvailableWidth = Infinity;\n buildCollapsiblesList();\n testRunner.trigger('collapseTools');\n }).on(`collapseTools${ns}`, function () {\n toggleCollapsibles();\n });\n },\n destroy: function destroy() {\n $window.off(ns);\n }\n });\n\n return collapser;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/rubricBlock/rubricBlock',['jquery', 'ui/hider', 'taoTests/runner/plugin', 'handlebars', 'lib/handlebars/helpers'], function ($$1, hider, pluginFactory, Handlebars, Helpers0) { 'use strict';\n\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n hider = hider && Object.prototype.hasOwnProperty.call(hider, 'default') ? hider['default'] : hider;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); \n\n\n return \"
          \\n\";\n });\n function containerTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Ensure the links opens to blank pages\n * @param {jQueryElement} $container - lookup scope\n */\n var blankifyLinks = function blankifyLinks($container) {\n $$1('a', $container).attr('target', '_blank');\n };\n\n /**\n * Apply mathjax\n */\n var mathify = function mathify($container) {\n return new Promise(function (resolve) {\n if ($$1('math', $container).length > 0) {\n //load mathjax only if necessary\n require(['mathJax'], function (MathJax) {\n if (MathJax) {\n MathJax.Hub.Queue(['Typeset', MathJax.Hub], $container[0]);\n MathJax.Hub.Queue(resolve);\n } else {\n resolve();\n }\n }, resolve);\n } else {\n resolve();\n }\n });\n };\n\n /**\n * Returns the configured plugin\n */\n var rubricBlock = pluginFactory({\n name: 'rubricBlock',\n /**\n * Initialize the plugin (called during runner's init)\n */\n init: function init() {\n var self = this;\n var testRunner = this.getTestRunner();\n this.$element = $$1(containerTpl());\n this.hide();\n\n //change plugin state\n testRunner.on('ready', function () {\n self.hide();\n }).on('loaditem', function () {\n var context = testRunner.getTestContext();\n if (context.rubrics) {\n self.$element.html(context.rubrics);\n blankifyLinks(self.$element);\n mathify(self.$element).then(function () {\n // notify that the rubric blocks are loaded\n testRunner.trigger('rubricblock');\n });\n }\n }).on('renderitem', function () {\n self.show();\n }).on('unloaditem', function () {\n self.hide();\n self.$element.empty();\n });\n },\n /**\n * Called during the runner's render phase\n */\n render: function render() {\n //attach the element before the content area\n var $container = this.getAreaBroker().getContentArea();\n $container.before(this.$element);\n },\n /**\n * Called during the runner's destroy phase\n */\n destroy: function destroy() {\n this.$element.remove();\n },\n /**\n * Enable the container\n */\n enable: function enable() {\n this.$element.removeProp('disabled').removeClass('disabled');\n },\n /**\n * Disable the container\n */\n disable: function disable() {\n this.$element.prop('disabled', true).addClass('disabled');\n },\n /**\n * Show the container\n */\n show: function show() {\n hider.show(this.$element);\n },\n /**\n * Hide the container\n */\n hide: function hide() {\n hider.hide(this.$element);\n }\n });\n\n return rubricBlock;\n\n});\n\n","define('taoQtiTest/runner/plugins/controls/connectivity/connectivity',['jquery', 'lodash', 'i18n', 'core/polling', 'ui/waitingDialog/waitingDialog', 'taoTests/runner/plugin', 'handlebars', 'lib/handlebars/helpers', 'util/namespace'], function ($$1, _, __, pollingFactory, waitingDialog, pluginFactory, Handlebars, Helpers0, namespaceHelper) { 'use strict';\n\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n pollingFactory = pollingFactory && Object.prototype.hasOwnProperty.call(pollingFactory, 'default') ? pollingFactory['default'] : pollingFactory;\n waitingDialog = waitingDialog && Object.prototype.hasOwnProperty.call(waitingDialog, 'default') ? waitingDialog['default'] : waitingDialog;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n namespaceHelper = namespaceHelper && Object.prototype.hasOwnProperty.call(namespaceHelper, 'default') ? namespaceHelper['default'] : namespaceHelper;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, options, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, functionType=\"function\", self=this;\n\n function program1(depth0,data) {\n \n \n return \" with-message\";\n }\n\n function program3(depth0,data) {\n \n var buffer = \"\", helper, options;\n buffer += \"\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Online\", options) : helperMissing.call(depth0, \"__\", \"Online\", options)))\n + \"\";\n return buffer;\n }\n\n function program5(depth0,data) {\n \n var buffer = \"\", helper, options;\n buffer += \"\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Offline\", options) : helperMissing.call(depth0, \"__\", \"Offline\", options)))\n + \"\";\n return buffer;\n }\n\n buffer += \"
          \\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.message), {hash:{},inverse:self.noop,fn:self.program(3, program3, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.message), {hash:{},inverse:self.noop,fn:self.program(5, program5, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n
          \\n\";\n return buffer;\n });\n function connectivityTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2021 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * The plugin default configuration\n * @type {Object}\n * @property {Number} checkInterval - when offline, interval to check if we're back online\n * @property {Boolean} indicator - do we display the indicator in the test UI\n * @property {Boolean} message - do we display the message in the test UI\n */\n var defaultConfig = {\n checkInterval: 30 * 1000,\n indicator: true,\n message: false\n };\n\n /**\n * Creates the connectivity plugin.\n * Detects connectivity issues\n */\n var connectivity = pluginFactory({\n name: 'connectivity',\n /**\n * Initializes the plugin (called during runner's init)\n */\n init: function init() {\n var self = this;\n var testRunner = this.getTestRunner();\n var proxy = testRunner.getProxy();\n var config = Object.assign({}, defaultConfig, this.getConfig());\n\n //Displays a connectivity indicator\n if (config && config.indicator) {\n //create the indicator\n this.$element = $$1(connectivityTpl({\n state: proxy.isOnline() ? 'connected' : 'disconnected',\n message: config.message\n }));\n testRunner.on('disconnect', function () {\n self.$element.removeClass('connected').addClass('disconnected');\n }).on('reconnect', function () {\n self.$element.removeClass('disconnected').addClass('connected');\n });\n }\n\n //update the interval, with the new value\n if (this.polling && _.isNumber(config.checkInterval)) {\n this.polling.setInterval(config.checkInterval);\n }\n },\n /**\n * Installs the plugin (called when the runner bind the plugin)\n * We do it before init to catch even offline during the init sequence\n */\n install: function install() {\n var self = this;\n var waiting = false;\n var testRunner = this.getTestRunner();\n var proxy = testRunner.getProxy();\n\n /**\n * Display the waiting dialog, while waiting the connection to be back\n * @param {String} [messsage] - additional message for the dialog\n * @returns {Promise} resolves once the wait is over and the user click on 'proceed'\n */\n this.displayWaitingDialog = function displayWaitingDialog() {\n let message = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var dialog;\n return new Promise(function (resolve) {\n if (!waiting) {\n waiting = true;\n\n //if a pause event occurs while waiting,\n //we also wait the connection to be back\n testRunner.before('pause.waiting', function () {\n return new Promise(function (pauseResolve) {\n proxy.off('reconnect.pausing').after('reconnect.pausing', pauseResolve);\n });\n });\n\n //creates the waiting modal dialog\n dialog = waitingDialog({\n message: __('You are encountering a prolonged connectivity loss. ') + message,\n waitContent: __('Please wait while we try to restore the connection.'),\n proceedContent: __('The connection seems to be back, please proceed')\n }).on('proceed', function () {\n resolve();\n }).on('render', function () {\n proxy.off('reconnect.waiting').after('reconnect.waiting', function () {\n testRunner.off('pause.waiting');\n waiting = false;\n dialog.endWait();\n });\n });\n }\n });\n };\n\n //Last chance to check the connection,\n //by regular polling on the \"up\" signal\n this.polling = pollingFactory({\n action: function action() {\n testRunner.getProxy().telemetry(testRunner.getTestContext().itemIdentifier, 'up').catch(_.noop);\n },\n interval: defaultConfig.checkInterval,\n autoStart: false\n });\n\n //the Proxy is the only one to know something about connectivity\n proxy.on('disconnect', function disconnect(source) {\n if (!testRunner.getState('disconnected')) {\n testRunner.setState('disconnected', true);\n testRunner.trigger('disconnect', source);\n self.polling.start();\n }\n }).on('reconnect', function reconnect() {\n if (testRunner.getState('disconnected')) {\n testRunner.setState('disconnected', false);\n testRunner.trigger('reconnect');\n self.polling.stop();\n }\n });\n\n //intercept tries to leave while offline\n //this could be caused by pauses for example.\n //If caused by an action like exitTest it will be handled\n //by navigation errors (see below)\n testRunner.before('leave', function (e, data) {\n if (proxy.isOffline()) {\n self.displayWaitingDialog(data.message).then(function () {\n testRunner.trigger('leave', data);\n }).catch(function (generalErr) {\n testRunner.trigger('error', generalErr);\n });\n return false;\n }\n });\n\n //intercept offline navigation errors\n testRunner.before('error.connectivity', function (e, err) {\n // detect and prevent connectivity errors\n if (proxy.isConnectivityError(err)) {\n return false;\n }\n if (proxy.isOffline()) {\n self.displayWaitingDialog().then(function () {\n if (err.type === 'nav') {\n testRunner.loadItem(testRunner.getTestContext().itemIdentifier);\n }\n if (err.type === 'finish') {\n testRunner.finish();\n }\n if (err.type === 'pause') {\n testRunner.trigger('pause', {\n reasons: err.data && err.data.reasons,\n message: err.data && err.data.comment\n });\n }\n }).catch(function (generalErr) {\n testRunner.trigger('error', generalErr);\n });\n return false;\n }\n });\n testRunner.before('loaditem.connectivity', function (e, itemRef, item) {\n const testContext = testRunner.getTestContext();\n const {\n flags\n } = item;\n if (!flags) {\n return true;\n }\n if (flags.hasFeedbacks) {\n testContext.hasFeedbacks = true;\n }\n if ((flags.containsNonPreloadedAssets || flags.hasPci) && proxy.isOffline()) {\n self.displayWaitingDialog().then(() => {\n testRunner.loadItem(itemRef);\n });\n return false;\n }\n });\n testRunner.before(namespaceHelper.namespaceAll('move skip timeout', 'connectivity'), function (e) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n var testContext = testRunner.getTestContext();\n var currentItem = testRunner.getCurrentItem();\n if (proxy.isOffline() && (currentItem.hasFeedbacks || testContext.hasFeedbacks)) {\n testRunner.trigger('disableitem');\n self.displayWaitingDialog().then(function () {\n testRunner.trigger('enableitem').trigger(e.name, ...args);\n });\n return false;\n }\n });\n },\n destroy() {\n this.getTestRunner().off('.connectivity');\n },\n /**\n * Called during the runner's render phase\n */\n render: function render() {\n var $container = this.getAreaBroker().getControlArea();\n if (this.$element) {\n $container.append(this.$element);\n }\n }\n });\n\n return connectivity;\n\n});\n\n","define('taoQtiTest/runner/plugins/controls/connectivity/pauseOnError',['i18n', 'taoTests/runner/plugin', 'handlebars', 'lib/handlebars/helpers'], function (__, pluginFactory, Handlebars, Helpers0) { 'use strict';\n\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, functionType=\"function\", escapeExpression=this.escapeExpression;\n\n\n buffer += \"\";\n if (helper = helpers.title) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.title); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"

          \\n\";\n if (helper = helpers.message) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.message); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1);\n return buffer;\n });\n function dialogTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 (original work) Open Assessment Technologies SA ;\n */\n const name = 'pauseOnError';\n const dialogMessage = {\n title: __('Something unexpected happened.'),\n message: __('Please try reloading the page or pause the test. If you pause, you will be able to resume the test from this page.')\n };\n const dialogConfig = {\n focus: 'cancel',\n buttons: {\n labels: {\n ok: __('Pause the test'),\n cancel: __('Reload the page')\n }\n }\n };\n const pauseContext = {\n reasons: {\n category: 'technical',\n subCategory: 'error'\n },\n originalMessage: 'Due to an unexpected issue the test has been suspended.'\n };\n var pauseOnError = pluginFactory({\n name,\n /**\n * Initialize the plugin (called during runner's init)\n */\n init() {\n const testRunner = this.getTestRunner();\n const returnToHome = () => testRunner.trigger('pause', pauseContext);\n const reloadPage = () => testRunner.trigger('reloadpage');\n const processError = error => {\n testRunner.on('reloadpage', () => window.location.reload()).trigger('disablenav disabletools hidenav').trigger(`confirm.${name}`, dialogTpl(dialogMessage), returnToHome, reloadPage, dialogConfig);\n if (error.code === 500) {\n error.originalCode = error.code;\n delete error.code;\n testRunner.trigger(`disablefeedbackalerts`);\n testRunner.after('error.pauseOnError', () => {\n testRunner.off('error.pauseOnError');\n testRunner.trigger(`enablefeedbackalerts`);\n });\n }\n };\n testRunner.before('error', (e, error) => processError(error));\n }\n });\n\n return pauseOnError;\n\n});\n\n","define('taoQtiTest/runner/plugins/controls/duration/duration',['lodash', 'taoTests/runner/plugin', 'core/logger'], function (_, pluginFactory, loggerFactory) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n loggerFactory = loggerFactory && Object.prototype.hasOwnProperty.call(loggerFactory, 'default') ? loggerFactory['default'] : loggerFactory;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 (original work) Open Assessment Technologies SA ;\n */\n const logger = loggerFactory('taoQtiTest/runner/plugins/controls/duration/duration');\n\n /**\n * Creates the timer plugin\n */\n var duration = pluginFactory({\n name: 'duration',\n /**\n * Install step, add behavior before the lifecycle.\n */\n install() {\n // define the \"duration\" store as \"volatile\" (removed on browser change).\n this.getTestRunner().getTestStore().setVolatile(this.getName());\n },\n /**\n * Initializes the plugin (called during runner's init)\n *\n * @returns {Promise}\n */\n init() {\n const testRunner = this.getTestRunner();\n let currentUpdatePromise = Promise.resolve();\n const getItemAttempt = () => {\n const context = testRunner.getTestContext();\n return `${context.itemIdentifier}#${context.attempt}`;\n };\n const getPositiveNumber = value => {\n if (!_.isNumber(value) || value < 0) {\n return 0;\n }\n return value;\n };\n\n //where the duration of attempts are stored\n return testRunner.getPluginStore(this.getName()).then(durationStore => {\n /**\n * Gets the duration of a particular item from the store\n *\n * @param {String} attemptId - the attempt id to get the duration for\n * @returns {Promise}\n */\n const getItemDuration = attemptId => {\n if (!/^(.*)+#+\\d+$/.test(attemptId)) {\n return Promise.reject(new Error('Is it really an attempt id, like \"itemid#attempt\"'));\n }\n return durationStore.getItem(attemptId);\n };\n\n /**\n * Updates the duration of a particular item\n *\n * @param {Number} elapsed - time elapsed since previous tick\n * @returns {Promise}\n */\n const updateDuration = elapsed => {\n const itemAttemptId = getItemAttempt();\n currentUpdatePromise = currentUpdatePromise.then(() => getItemDuration(itemAttemptId)).then(duration => durationStore.setItem(itemAttemptId, getPositiveNumber(duration) + getPositiveNumber(elapsed) / 1000)).catch(err => {\n logger.warn(`Error updating item duration! ${err && err.message}`);\n });\n return currentUpdatePromise;\n };\n\n /**\n * Adds the current duration to the next action request.\n * The duration will be sent to the server with the next request,\n * usually submitItem() or callItemAction()\n *\n * @returns {Promise}\n */\n const addDurationToCallActionParams = () => {\n const itemAttemptId = getItemAttempt();\n return currentUpdatePromise.then(() => getItemDuration(itemAttemptId)).then(duration => testRunner.getProxy().addCallActionParams({\n itemDuration: getPositiveNumber(duration)\n })).catch(err => {\n logger.warn(`Error retrieving item duration! ${err && err.message}`);\n });\n };\n\n //change plugin state\n testRunner.on('tick', updateDuration).before('move skip exit timeout pause', addDurationToCallActionParams)\n /**\n * @event duration.get\n * @param {String} attemptId - the attempt id to get the duration for\n * @param {getDuration} getDuration - a receiver callback\n */.on('plugin-get.duration', (attemptId, getDuration) => {\n if (_.isFunction(getDuration)) {\n getDuration(getItemDuration(attemptId));\n }\n });\n });\n }\n });\n\n return duration;\n\n});\n\n","define('taoQtiTest/runner/plugins/controls/progressbar/progress',['lodash', 'i18n', 'core/format', 'taoQtiTest/runner/helpers/map'], function (_, __, format, mapHelper) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n format = format && Object.prototype.hasOwnProperty.call(format, 'default') ? format['default'] : format;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2018-2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * @typedef {Object} progressDetails\n * @property {Number} position - the position in the current element\n * @property {Number} reached - the number of reached elements (at least one item viewed)\n * @property {Number} viewed - the number of viewed elements (all items viewed)\n * @property {Number} completed - the number of completed elements (all questions answered)\n * @property {Number} total - the total number of elements\n */\n\n /**\n * @typedef {itemStats} progressData\n * @property {Number} position - the position in the scope\n * @property {Number} overallCompleted - the number of completed items in the test\n * @property {Number} overall - the total number of items in the test\n * @property {progressDetails} sections - the details of testSections in the scope\n * @property {progressDetails} parts - the details of testParts in the scope\n * @property {progressDetails} answerableSections - the details of testSections that contain questions in the scope\n * @property {progressDetails} answerableParts - the details of testParts that contain questions in the scope\n * @property {progressDetails} matchedCategories - the details of items that match the expected categories in the scope\n */\n\n /**\n * @typedef {Object} progressIndicator\n * @property {Number} position - the position in the scope\n * @property {Number} total - the length of the scope\n * @property {Number} ratio - the progress ratio of the indicator\n * @property {String} label - the text to display for the indicator\n */\n\n /**\n * @typedef {Object} progressConfig\n * @property {String} scope - the scope of the progression\n * @property {String} indicator - the type of progression\n * @property {Bool} showTotal - display 'item x of y' (true) | 'item x'\n * @property {Array} categories - categories to count by them\n */\n\n /**\n * Default progress config\n * @type {Object}\n */\n var defaultConfig = {\n scope: 'test',\n indicator: 'percentage',\n showTotal: true,\n categories: []\n };\n\n /**\n * List of labels by types\n * @type {Object}\n */\n var labels = {\n item: {\n long: __('Item %d of %d'),\n short: __('Item %d')\n },\n section: {\n long: __('Section %d of %d'),\n short: __('Section %d')\n }\n };\n\n /**\n * Simple map of progress stats computers\n * @type {Object}\n */\n var scopes = {\n /**\n * Gets stats for the whole test\n * @param {Object} testMap - the actual test map\n * @param {Object} testContext - the actual test context\n * @param {progressConfig} config - a config object\n * @param {String} config.scope - the scope of the progression\n * @param {Array} config.categories - categories to count by them\n * @returns {progressData}\n */\n test: function test(testMap, testContext, config) {\n var stats = getProgressStats(testMap, testContext, config, 'test');\n var item = mapHelper.getItemAt(testMap, testContext.itemPosition);\n stats.position = item.position + 1;\n return stats;\n },\n /**\n * Gets stats for the current test part\n * @param {Object} testMap - the actual test map\n * @param {Object} testContext - the actual test context\n * @param {progressConfig} config - a config object\n * @param {String} config.scope - the scope of the progression\n * @param {Array} config.categories - categories to count by them\n * @returns {progressData}\n */\n testPart: function testPart(testMap, testContext, config) {\n var stats = getProgressStats(testMap, testContext, config, 'testPart');\n var item = mapHelper.getItemAt(testMap, testContext.itemPosition);\n stats.position = item.positionInPart + 1;\n return stats;\n },\n /**\n * Gets stats for the current test section\n * @param {Object} testMap - the actual test map\n * @param {Object} testContext - the actual test context\n * @param {progressConfig} config - a config object\n * @param {String} config.scope - the scope of the progression\n * @param {Array} config.categories - categories to count by them\n * @returns {progressData}\n */\n testSection: function testSection(testMap, testContext, config) {\n var stats = getProgressStats(testMap, testContext, config, 'testSection');\n var item = mapHelper.getItemAt(testMap, testContext.itemPosition);\n stats.position = item.positionInSection + 1;\n return stats;\n }\n };\n\n /**\n * Simple map of progress indicator computers\n * @type {Object}\n */\n var indicators = {\n /**\n * Indicator that shows the percentage of completed items\n * @param {progressData} stats\n * @returns {progressIndicator}\n */\n percentage: function percentage(stats) {\n return getRatioProgression(stats.answered, stats.questions);\n },\n /**\n * Indicator that shows the position of current item\n * @param {progressData} stats\n * @param {progressConfig} config\n * @param {String} config.scope - the scope of the progression\n * @param {Array} config.categories - categories to count by them\n * @returns {progressIndicator}\n */\n position: function position(stats, config) {\n return getPositionProgression(stats.position, stats.total, 'item', config);\n },\n /**\n * Indicator that shows the number of viewed questions\n * @param {progressData} stats\n * @param {progressConfig} config\n * @param {String} config.scope - the scope of the progression\n * @param {Array} config.categories - categories to count by them\n * @returns {progressIndicator}\n */\n questions: function questions(stats, config) {\n return getPositionProgression(stats.questionsViewed, stats.questions, 'item', config);\n },\n /**\n * Indicator that shows the number of reached answerable sections\n * @param {progressData} stats\n * @param {progressConfig} config\n * @param {String} config.scope - the scope of the progression\n * @param {Array} config.categories - categories to count by them\n * @returns {progressIndicator}\n */\n sections: function sections(stats, config) {\n return getPositionProgression(stats.answerableSections.reached, stats.answerableSections.total, 'section', config);\n },\n /**\n * Indicator that shows the number of viewed items which have categories from the configuration\n * (show all if categories are not set)\n * @param {progressData} stats\n * @param {progressConfig} config\n * @param {String} config.scope - the scope of the progression\n * @param {Array} config.categories - categories to count by them\n */\n categories: function categories(stats, config) {\n return getPositionProgression(stats.matchedCategories.position, stats.matchedCategories.total, 'item', config);\n }\n };\n\n /**\n * Fix the test map if the current test part is linear, as the current item should not be answered.\n * @param {Object} testMap - the actual test map\n * @param {Object} testContext - the actual test context\n * @returns {Object} The fixed test map\n */\n function getFixedMap(testMap, testContext) {\n const currentTestPart = mapHelper.getPart(testMap, testContext.testPartId);\n const currentItem = mapHelper.getItemAt(testMap, testContext.itemPosition);\n if (currentItem.answered && currentTestPart.isLinear) {\n const fixedTestMap = _.cloneDeep(testMap);\n const fixedCurrentItem = mapHelper.getItemAt(fixedTestMap, testContext.itemPosition);\n fixedCurrentItem.answered = false;\n return fixedTestMap;\n }\n return testMap;\n }\n\n /**\n * Gets an empty stats record\n * @returns {progressDetails}\n */\n function getEmptyStats() {\n return {\n position: 0,\n reached: 0,\n viewed: 0,\n completed: 0,\n total: 0\n };\n }\n\n /**\n * Updates the progress stats from the given element\n * @param {progressDetails} stats - The stats details to update\n * @param {Object} element - The element from which take the details\n * @param {Number} position - The current item position\n */\n function updateStats(stats, element, position) {\n if (element.position <= position) {\n stats.position++;\n }\n if (element.stats.viewed) {\n stats.reached++;\n if (element.stats.viewed === element.stats.total) {\n stats.viewed++;\n }\n }\n if (element.stats.answered) {\n if (element.stats.answered === element.stats.questions) {\n stats.completed++;\n }\n }\n stats.total++;\n }\n\n /**\n * Updates the progress stats from the given element\n * @param {progressDetails} stats - The stats details to update\n * @param {Object} element - The element from which take the details\n * @param {Number} position - The current item position\n */\n function updateItemStats(stats, element, position) {\n if (element.position <= position) {\n stats.position++;\n }\n if (element.viewed) {\n stats.reached++;\n stats.viewed++;\n }\n if (element.answered) {\n stats.completed++;\n }\n stats.total++;\n }\n\n /**\n * Convert list of the categories to the hashtable to improve performance\n * @param categories\n * @returns {*}\n */\n function getCategoriesToMatch(categories) {\n var matchSize = categories && categories.length;\n return matchSize && _.reduce(categories, function (map, category) {\n map[category] = true;\n return map;\n }, {});\n }\n\n /**\n * Completes the progression stats\n * @param {Object} testMap - the actual test map\n * @param {Object} testContext - the actual test context\n * @param {progressConfig} config\n * @param {String} config.scope - the scope of the progression\n * @param {Array} config.categories - categories to count by them\n * @param {String} [scope] - The name of the scope. Can be: test, part, section (default: test)\n * @returns {progressData}\n */\n function getProgressStats(testMap, testContext, config, scope) {\n var fixedMap = getFixedMap(testMap, testContext);\n var scopedMap = mapHelper.getScopeMap(fixedMap, testContext.itemPosition, scope);\n var stats = _.clone(scopedMap.stats);\n var categoriesToMatch;\n var matchSize;\n if (config.indicator === 'categories') {\n categoriesToMatch = getCategoriesToMatch(config.categories);\n matchSize = config.categories && config.categories.length;\n stats.matchedCategories = getEmptyStats();\n }\n stats.parts = getEmptyStats();\n stats.sections = getEmptyStats();\n stats.answerableParts = getEmptyStats();\n stats.answerableSections = getEmptyStats();\n _.forEach(scopedMap.parts, function (part) {\n updateStats(stats.parts, part, testContext.itemPosition);\n if (part.stats.questions > 0) {\n updateStats(stats.answerableParts, part, testContext.itemPosition);\n }\n _.forEach(part.sections, function (section) {\n updateStats(stats.sections, section, testContext.itemPosition);\n if (section.stats.questions > 0) {\n updateStats(stats.answerableSections, section, testContext.itemPosition);\n }\n if (config.indicator === 'categories') {\n _.forEach(section.items, function (item) {\n if (matchCategories(item.categories, categoriesToMatch, matchSize)) {\n updateItemStats(stats.matchedCategories, item, testContext.itemPosition);\n }\n });\n }\n });\n });\n return stats;\n }\n\n /**\n *\n * @param {Array} categories - List of categories to check\n * @param {Object} expectedCategories - Hashtable of expected categories\n * @param {Number} minWanted - Minimal number of expected categories that should match\n * @returns {Boolean}\n */\n function matchCategories(categories, expectedCategories, minWanted) {\n var matched = 0;\n if (expectedCategories) {\n _.forEach(categories, function (category) {\n if (expectedCategories[category]) {\n matched++;\n if (matched >= minWanted) {\n return false;\n }\n }\n });\n }\n return matched === minWanted;\n }\n\n /**\n * Gets the progression ratio\n * @param {Number} position\n * @param {Number} total\n * @returns {Number}\n */\n function getRatio(position, total) {\n if (position && total > 0) {\n return Math.floor(position / total * 100);\n }\n return 0;\n }\n\n /**\n * Gets the label of the progress bar for an item\n * @param {Number} position - the current position\n * @param {Number} total - the total number of items\n * @param {String} type - the type of element that is represented\n * @param {progressConfig} config - a config object\n * @param {String} config.scope - the scope of the progression\n * @param {Array} config.categories - categories to count by them\n * @returns {String}\n */\n function getProgressionLabel(position, total, type, config) {\n var patterns = labels[type] || labels.item;\n var pattern = config.showTotal ? patterns.long : patterns.short;\n return format(pattern, position || '0', total || '0');\n }\n\n /**\n * Gets the progression based on position\n * @param {Number} position - the current position\n * @param {Number} total - the total number of items\n * @param {String} type - the type of element that is represented\n * @param {progressConfig} config - a config object\n * @param {String} config.scope - the scope of the progression\n * @param {Array} config.categories - categories to count by them\n * @returns {progressIndicator}\n */\n function getPositionProgression(position, total, type, config) {\n return {\n position: position || 0,\n total: total || 0,\n ratio: getRatio(position, total),\n label: getProgressionLabel(position, total, type, config)\n };\n }\n\n /**\n * Gets the progression based on a ratio\n * @param {Number} position - the current position\n * @param {Number} total - the total number of items\n * @returns {progressIndicator}\n */\n function getRatioProgression(position, total) {\n var ratio = getRatio(position, total);\n return {\n position: position || 0,\n total: total || 0,\n ratio: ratio,\n label: `${ratio}%`\n };\n }\n var progress = {\n /**\n * Checks that categories matched\n * @param categories\n * @param expectedCategories\n * @returns {Boolean}\n */\n isMatchedCategories: function validCategories(categories, expectedCategories) {\n var categoriesToMatch = getCategoriesToMatch(expectedCategories);\n var matchSize = expectedCategories && expectedCategories.length;\n return matchCategories(categories, categoriesToMatch, matchSize);\n },\n /**\n * Computes the progress stats for the specified scope\n * @param {Object} testMap - the actual test map\n * @param {Object} testContext - the actual test context\n * @param {progressConfig} config - a config object\n * @param {String} config.scope - the scope of the progression\n * @param {Array} config.categories - categories to count by them\n * @returns {progressData}\n */\n computeStats(testMap, testContext, config) {\n const testPart = mapHelper.getPart(testMap, testContext.testPartId);\n const statsComputer = config.scope && scopes[config.scope] || scopes.test;\n const stats = statsComputer(testMap, testContext, config || defaultConfig);\n stats.overall = testMap.stats.total;\n if (testPart && testPart.isLinear) {\n stats.overallCompleted = testMap.stats.answered - 1;\n } else {\n stats.overallCompleted = testMap.stats.answered;\n }\n return stats;\n },\n /**\n * Computes the specified progress indicator\n * @param {progressData} stats - the progress stats\n * @param {String} type - the [type=\"percentage\"] of indicator to compute (could be: percentage, position, questions, sections)\n * @param {progressConfig} [config] - a config object\n * @param {Boolean} [config.showTotal] - display 'item x of y' (true) | 'item x'\n * @returns {progressIndicator}\n */\n computeIndicator: function computeIndicator(stats, type, config) {\n var indicatorComputer = type && indicators[type] || indicators.percentage;\n return indicatorComputer(stats || {}, config || defaultConfig);\n },\n /**\n *\n * @param {Object} testMap - the actual test map\n * @param {Object} testContext - the actual test context\n * @param {progressConfig} config - a config object\n * @param {String} config.indicator - the type of progression\n * @param {String} config.scope - the scope of the progression\n * @param {Array} config.categories - categories to count by them\n * @param {Boolean} [config.showTotal=true] - display 'item x of y' (true) | 'item x'\n */\n computeProgress: function computeProgress(testMap, testContext, config) {\n var progressData;\n config = _.defaults(config || {}, defaultConfig);\n progressData = this.computeStats(testMap, testContext, config);\n return this.computeIndicator(progressData, config.indicator, config);\n }\n };\n\n return progress;\n\n});\n\n","define('taoQtiTest/runner/plugins/controls/progressbar/renderer/percentage',['ui/component', 'handlebars', 'lib/handlebars/helpers', 'ui/progressbar'], function (component, Handlebars, Helpers0, progressbar) { 'use strict';\n\n component = component && Object.prototype.hasOwnProperty.call(component, 'default') ? component['default'] : component;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); \n\n\n return \"
          \\n
          \\n
          \\n
          \\n\";\n });\n function percentageTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2018 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Default config values\n * @type {Object}\n */\n var defaults = {\n showLabel: true\n };\n\n /**\n * Builds percentage indicator renderer\n * @param {Object} [config] - a config object\n * @param {Boolean} [config.showLabel=true] - show/hide the progress label\n * @param {Object} [progressData] - the initial dataset\n */\n function percentageIndicatorRenderer(config, progressData) {\n var rendererApi = {\n /**\n * Update the progress bar according to the provided indicator data\n * @param {progressIndicator} data\n */\n update: function update(data) {\n progressData = data;\n if (this.is('rendered') && this.controls) {\n this.controls.$label.text(progressData.label);\n this.controls.$bar.progressbar('value', progressData.ratio);\n }\n\n /**\n * Executes extra tasks on update\n * @event percentageIndicatorRenderer#update\n * @param {progressIndicator} data\n */\n this.trigger('update', data);\n }\n };\n return component(rendererApi, defaults).setTemplate(percentageTpl).on('render', function () {\n // get access to the controls\n this.controls = {\n $label: this.getElement().find('[data-control=\"progress-label\"]'),\n $bar: this.getElement().find('[data-control=\"progress-bar\"]')\n };\n\n // apply option\n if (!this.config.showLabel) {\n this.controls.$label.hide();\n }\n\n // and initialize the progress bar component\n this.controls.$bar.progressbar();\n\n // set the right progression according to init data\n if (progressData) {\n this.update(progressData);\n }\n\n // forward the hidden state if it has been set before render\n if (this.is('hidden')) {\n this.hide();\n }\n }).on('destroy', function () {\n this.controls = null;\n }).init(config);\n }\n\n return percentageIndicatorRenderer;\n\n});\n\n","define('taoQtiTest/runner/plugins/controls/progressbar/renderer/position',['lodash', 'ui/component', 'handlebars', 'lib/handlebars/helpers'], function (_, component, Handlebars, Helpers0) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n component = component && Object.prototype.hasOwnProperty.call(component, 'default') ? component['default'] : component;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); \n\n\n return \"
          \\n
          \\n
          \\n
          \\n
          \\n
          \\n\";\n });\n function positionTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template$1 = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var stack1, functionType=\"function\", escapeExpression=this.escapeExpression, self=this;\n\n function program1(depth0,data) {\n \n var buffer = \"\";\n buffer += \"\\n\\n\";\n return buffer;\n }\n\n stack1 = helpers.each.call(depth0, depth0, {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { return stack1; }\n else { return ''; }\n });\n function pointTpl(data, options, asString) {\n var html = Template$1(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2018 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Default config values\n * @type {Object}\n */\n var defaults = {\n showLabel: true\n };\n\n /**\n * Builds percentage indicator renderer\n * @param {Object} [config] - a config object\n * @param {Boolean} [config.showLabel=true] - show/hide the progress label\n * @param {Object} [progressData] - the initial dataset\n */\n function positionIndicatorRenderer(config, progressData) {\n var count = 0;\n var rendererApi = {\n /**\n * Update the progress bar according to the provided indicator data\n * @param {progressIndicator} data\n */\n update: function update(data) {\n progressData = data;\n if (this.is('rendered') && this.controls) {\n if (count !== progressData.total) {\n // the number of points have changed, regenerate the full bar\n count = progressData.total;\n this.controls.$bar.empty().append(pointTpl(_.range(count)));\n }\n this.controls.$label.text(progressData.label);\n this.controls.$bar\n // remove progression from all points\n .children().removeClass('reached current')\n // set progression to each reached point\n .slice(0, progressData.position).addClass('reached')\n // set current position\n .slice(-1).addClass('current');\n }\n\n /**\n * Executes extra tasks on update\n * @event positionIndicatorRenderer#update\n * @param {progressIndicator} data\n */\n this.trigger('update', data);\n }\n };\n return component(rendererApi, defaults).setTemplate(positionTpl).on('render', function () {\n // get access to the controls\n this.controls = {\n $label: this.getElement().find('[data-control=\"progress-label\"]'),\n $bar: this.getElement().find('[data-control=\"progress-bar\"] .progressbar-points')\n };\n\n // apply option\n if (!this.config.showLabel) {\n this.controls.$label.hide();\n }\n\n // set the right progression according to init data\n if (progressData) {\n this.update(progressData);\n }\n\n // forward the hidden state if it has been set before render\n if (this.is('hidden')) {\n this.hide();\n }\n }).on('destroy', function () {\n this.controls = null;\n }).init(config);\n }\n\n return positionIndicatorRenderer;\n\n});\n\n","define('taoQtiTest/runner/plugins/controls/progressbar/progressbar',['taoTests/runner/plugin', 'taoQtiTest/runner/helpers/map', 'taoQtiTest/runner/plugins/controls/progressbar/progress', 'taoQtiTest/runner/plugins/controls/progressbar/renderer/percentage', 'taoQtiTest/runner/plugins/controls/progressbar/renderer/position'], function (pluginFactory, mapHelper, progressHelper, percentageRendererFactory, positionRendererFactory) { 'use strict';\n\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n progressHelper = progressHelper && Object.prototype.hasOwnProperty.call(progressHelper, 'default') ? progressHelper['default'] : progressHelper;\n percentageRendererFactory = percentageRendererFactory && Object.prototype.hasOwnProperty.call(percentageRendererFactory, 'default') ? percentageRendererFactory['default'] : percentageRendererFactory;\n positionRendererFactory = positionRendererFactory && Object.prototype.hasOwnProperty.call(positionRendererFactory, 'default') ? positionRendererFactory['default'] : positionRendererFactory;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2018 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * List of available progress indicator renderers\n * @type {Object}\n */\n var renderers = {\n percentage: percentageRendererFactory,\n position: positionRendererFactory\n };\n\n /**\n * Returns the configured plugin\n */\n var progressbar = pluginFactory({\n name: 'progressBar',\n /**\n * Initialize the plugin (called during runner's init)\n */\n init: function init() {\n const testRunner = this.getTestRunner();\n const testRunnerConfig = testRunner.getOptions();\n const config = Object.assign({}, testRunnerConfig.progressIndicator || {}, this.getConfig());\n const self = this;\n var rendererFactory = renderers[config.renderer] || renderers.percentage;\n var progressConfig = {\n indicator: config.type || 'percentage',\n scope: config.scope || 'test',\n showLabel: config.showLabel,\n showTotal: config.showTotal,\n categories: config.categories\n };\n var hiddenByQuestions = function hiddenByQuestions(item) {\n return item && item.informational && progressConfig.indicator === 'questions';\n };\n var hiddenByCategories = function (item) {\n return item && progressConfig.indicator === 'categories' && !progressHelper.isMatchedCategories(item.categories, progressConfig.categories);\n };\n\n /**\n * Check if progress bar should be hidden\n */\n var isProgressbarHidden = function isProgressbarHidden(item) {\n return hiddenByQuestions(item) || hiddenByCategories(item);\n };\n\n /**\n * Update the progress bar\n */\n var update = function update() {\n var testContext = testRunner.getTestContext();\n var testMap = testRunner.getTestMap();\n var item = mapHelper.getItemAt(testMap, testContext.itemPosition);\n if (isProgressbarHidden(item)) {\n self.renderer.hide();\n } else {\n self.renderer.show();\n self.renderer.update(progressHelper.computeProgress(testMap, testContext, progressConfig));\n }\n };\n\n //create the progressbar\n this.renderer = rendererFactory(progressConfig);\n\n //let update the progression\n update();\n testRunner.on('ready loaditem', update);\n },\n /**\n * Called during the runner's render phase\n */\n render: function render() {\n var $container = this.getAreaBroker().getControlArea();\n this.renderer.render($container);\n },\n /**\n * Called during the runner's render phase\n */\n destroy: function destroy() {\n if (this.renderer) {\n this.renderer.destroy();\n }\n this.renderer = null;\n },\n /**\n * Show the progress bar\n */\n show: function show() {\n if (this.renderer) {\n this.renderer.show();\n }\n },\n /**\n * Hide the progress bar\n */\n hide: function hide() {\n if (this.renderer) {\n this.renderer.hide();\n }\n }\n });\n\n return progressbar;\n\n});\n\n","define('taoQtiTest/runner/plugins/controls/testState/testState',['lodash', 'taoTests/runner/plugin'], function (_, pluginFactory) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Creates the testState plugin.\n * Handle particular states of the assessment test\n */\n var testState = pluginFactory({\n name: 'testState',\n /**\n * Installs the plugin (called when the runner bind the plugin)\n */\n install: function install() {\n var testRunner = this.getTestRunner();\n\n // middleware invoked on every requests\n testRunner.getProxy().use(function qtiFilter(req, res, next) {\n var data = res && res.data;\n\n // test has been closed/suspended => redirect to the index page after message acknowledge\n if (data && data.type && data.type === 'TestState' && !testRunner.getState('closedOrSuspended')) {\n // spread the world about the reason of the leave\n testRunner.setState('closedOrSuspended', true);\n if (!testRunner.getState('ready')) {\n // if we open an inconsistent test just leave\n // should happen if we refresh an auto paused test\n testRunner.trigger('destroy');\n } else if (_.isEmpty(data.messages) || !_.find(data.messages, {\n channel: 'teststate'\n })) {\n testRunner.trigger('leave', data);\n }\n // break the chain to avoid uncaught exception in promise...\n // this will lead to unresolved promise, but the browser will be redirected soon!\n return;\n }\n next();\n });\n },\n /**\n * Initializes the plugin (called during runner's init)\n */\n init: function init() {\n var testRunner = this.getTestRunner();\n var isLeaving = false;\n\n // immediate handling of proctor's actions\n testRunner.getProxy().channel('teststate', function (data) {\n if (!isLeaving && data && ('close' === data.type || 'pause' === data.type) && !testRunner.getState('closedOrSuspended')) {\n isLeaving = true;\n if ('pause' === data.type) {\n testRunner.trigger('pause', data);\n } else {\n testRunner.setState('closedOrSuspended', true);\n testRunner.trigger('leave', data);\n }\n }\n });\n }\n });\n\n return testState;\n\n});\n\n","define('taoQtiTest/runner/helpers/getTimerMessage',['i18n'], function (__) { 'use strict';\n\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n\n /**\n * Returns timer information string\n * @returns {Boolean}\n */\n function getTimerMessage(hours, minutes, seconds, unansweredQuestions, scope) {\n let timerMessage;\n const timeArr = [hours, minutes, seconds];\n const timeArgArr = [];\n [__('hours'), __('minutes'), __('seconds')].forEach((unit, idx) => {\n if (timeArr[idx] > 0) {\n timeArgArr.push(`${timeArr[idx]} ${unit}`);\n }\n });\n let answeredMessage;\n if (!unansweredQuestions || scope === 'item') {\n answeredMessage = __('the current question');\n } else {\n let questionsMessage = __('questions');\n if (unansweredQuestions === 1) {\n questionsMessage = __('question');\n }\n answeredMessage = __('remaining %s %s', unansweredQuestions, questionsMessage);\n }\n if (timeArgArr.length === 0) {\n timerMessage = __('%s to answer %s', 'no time left', answeredMessage);\n } else {\n timerMessage = __('%s to answer %s', timeArgArr.join(', '), answeredMessage);\n }\n return timerMessage;\n }\n\n return getTimerMessage;\n\n});\n\n","\ndefine('css!taoQtiTest/runner/plugins/controls/timer/component/css/countdown',[],function(){});\n","define('taoQtiTest/runner/plugins/controls/timer/component/countdown',['jquery', 'lodash', 'core/encoder/time', 'ui/component', 'handlebars', 'lib/handlebars/helpers', 'taoQtiTest/runner/helpers/getTimerMessage', 'ui/tooltip', 'css!taoQtiTest/runner/plugins/controls/timer/component/css/countdown.css', 'moment'], function ($$1, _, timeEncoder, component, Handlebars, Helpers0, getTimerMessage, tooltip, countdown_css, moment) { 'use strict';\n\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n timeEncoder = timeEncoder && Object.prototype.hasOwnProperty.call(timeEncoder, 'default') ? timeEncoder['default'] : timeEncoder;\n component = component && Object.prototype.hasOwnProperty.call(component, 'default') ? component['default'] : component;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n getTimerMessage = getTimerMessage && Object.prototype.hasOwnProperty.call(getTimerMessage, 'default') ? getTimerMessage['default'] : getTimerMessage;\n tooltip = tooltip && Object.prototype.hasOwnProperty.call(tooltip, 'default') ? tooltip['default'] : tooltip;\n moment = moment && Object.prototype.hasOwnProperty.call(moment, 'default') ? moment['default'] : moment;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, functionType=\"function\", escapeExpression=this.escapeExpression;\n\n\n buffer += \"
          \\n \";\n if (helper = helpers.label) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.label); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\n \\n
          \\n
          \\n\";\n return buffer;\n });\n function countdownTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2018 (original work) Open Assessment Technologies SA ;\n */\n\n //Precision is milliseconds\n var precision = 1000;\n\n /**\n * Default config values, see below.\n */\n var defaults = {\n showBeforeStart: true,\n displayWarning: true\n };\n\n /**\n * time to display warnings\n */\n var warningTimeout = {\n info: 2000,\n success: 2000,\n warning: 4000,\n danger: 4000,\n error: 8000\n };\n\n /**\n * Creates, initialize and render a countdown component.\n *\n * @param {jQueryElement|HTMLElement} $container - where to append the countdown\n * @param {Object} config\n * @param {String} config.id - the timer unique identifier\n * @param {String} config.label - the text to display above the timer\n * @param {String} config.type - the type of countdown (to categorize them)\n * @param {String} [config.scope] - scope of a timer\n * @param {Number} [config.unansweredQuestions] - number of unanswered options\n * @param {Number} [config.remainingTime] - the current value of the countdown, in milliseconds\n * @param {Boolean} [config.showBeforeStart = true] - do we show the time before starting\n * @param {Boolean} [config.displayWarning = true] - do we display the warnings or trigger only the event\n * @param {Object[]} [config.warnings] - define warnings thresholds\n * @param {Number} [config.warnings.threshold] - when the warning is shown, in milliseconds\n * @param {String} [config.warnings.message] - the warning message\n * @param {String} [config.warnings.level = warn] - the feedback level in (success, info, warn, danger and error)\n * @returns {countdown} the component, initialized and rendered\n */\n function countdownFactory($container, config) {\n let $time;\n let $timeScreenreader;\n\n /**\n * @typedef {Object} countdown\n */\n var countdown = component({\n /**\n * Update the countdown\n * @param {Number} remainingTime - the time remaining (milliseconds)\n * @param {Number} unansweredQuestions\n * @returns {countdown} chains\n * @fires countdown#change - when the value has changed\n * @fires countdown#warn - when a threshold is reached\n */\n update: function udpate(remainingTime, unansweredQuestions) {\n var self = this;\n var encodedTime;\n var warningId;\n var warningMessage;\n if (!this.is('completed')) {\n if (remainingTime <= 0) {\n this.remainingTime = 0;\n } else {\n this.remainingTime = parseInt(remainingTime, 10);\n }\n if (this.is('rendered') && this.is('running')) {\n encodedTime = timeEncoder.encode(this.remainingTime / precision);\n if (encodedTime !== this.encodedTime) {\n this.encodedTime = encodedTime;\n const time = moment.duration(this.remainingTime / precision, 'seconds');\n const hours = time.get('hours');\n const minutes = time.get('minutes');\n const seconds = time.get('seconds');\n $time.text(this.encodedTime);\n $timeScreenreader.text(getTimerMessage(hours, minutes, seconds, unansweredQuestions, this.config.scope));\n }\n if (this.warnings) {\n //the warnings have already be sorted\n warningId = _.findLastKey(this.warnings, function (warning) {\n return warning && !warning.shown && warning.threshold > 0 && warning.threshold >= self.remainingTime;\n });\n if (warningId) {\n this.warnings[warningId].shown = true;\n if (_.isFunction(this.warnings[warningId].message)) {\n warningMessage = this.warnings[warningId].message(this.remainingTime);\n } else {\n warningMessage = this.warnings[warningId].message;\n }\n\n /**\n * Warn user the timer reach a threshold\n * @event countdown#warn\n * @param {String} message\n * @param {String} level\n */\n this.trigger('warn', warningMessage, this.warnings[warningId].level);\n }\n }\n if (this.warningsForScreenreader) {\n //the warnings have already be sorted\n const screenreaderWarningId = _.findLastKey(this.warningsForScreenreader, warning => warning && !warning.shown && warning.threshold > 0 && warning.threshold >= self.remainingTime);\n if (screenreaderWarningId) {\n this.warningsForScreenreader[screenreaderWarningId].shown = true;\n\n /**\n * Warn user the timer reach a threshold\n * @event countdown#warnscreenreader\n * @param {Function} message\n * @param {Number} remainingTime\n * @param {String} scope\n */\n this.trigger('warnscreenreader', this.warningsForScreenreader[screenreaderWarningId].message, self.remainingTime, this.warningsForScreenreader[screenreaderWarningId].scope);\n }\n }\n\n /**\n * The current value has changed\n * @event countdown#change\n * @param {Number} remainingTime - the updated time\n * @param {String} displayed - the displayed value\n */\n this.trigger('change', this.remainingTime, encodedTime);\n }\n if (this.remainingTime === 0) {\n this.complete();\n }\n }\n return this;\n },\n /**\n * Starts the countdown\n * @returns {countdown} chains\n * @fires countdown#start\n */\n start: function start() {\n if (this.is('rendered') && !this.is('running') && !this.is('completed')) {\n this.enable();\n this.setState('running', true);\n\n /**\n * The count has started\n * @event countdown#start\n */\n this.trigger('start');\n }\n return this;\n },\n /**\n * Stops the countdown (can be restarted then)\n * @returns {countdown} chains\n * @fires countdown#stop\n */\n stop: function stop() {\n if (this.is('rendered') && this.is('running')) {\n this.setState('running', false);\n\n /**\n * The count is stopped\n * @event countdown#stop\n */\n this.trigger('stop');\n }\n return this;\n },\n /**\n * Calls to complete the countdown,\n * it can't be resumed after.\n *\n * @returns {countdown} chains\n *\n * @fires countdown#complete\n * @fires countdown#end\n */\n complete: function complete() {\n if (this.is('rendered') && this.is('running') && !this.is('completed')) {\n this.stop();\n this.setState('completed', true);\n\n /**\n * The countdown has ended, is completed\n * @event countdown#complete\n * @event countdown#end (alias)\n */\n this.trigger('complete end');\n }\n return this;\n }\n }, defaults).on('init', function () {\n this.remainingTime = this.config.remainingTime;\n this.unansweredQuestions = this.config.unansweredQuestions;\n if (this.config.warnings) {\n this.warnings = _.sortBy(this.config.warnings, 'threshold');\n }\n if (this.config.warningsForScreenreader) {\n this.warningsForScreenreader = _.sortBy(this.config.warningsForScreenreader, 'threshold');\n }\n\n //auto renders\n this.render($container);\n }).on('render', function () {\n $time = $$1('.time', this.getElement());\n $timeScreenreader = $$1('.time--screenreader', this.getElement());\n if (this.config.showBeforeStart === true) {\n $time.text(timeEncoder.encode(this.remainingTime / precision));\n }\n }).on('warn', function (message, level) {\n var countdownTooltip;\n level = level || 'warning';\n if (this.is('rendered') && this.is('running') && _.isString(message) && !_.isEmpty(message)) {\n $time.removeClass('txt-success txt-info txt-warning txt-danger txt-error').addClass(`txt-${level}`);\n if (this.config.displayWarning === true) {\n countdownTooltip = tooltip.create(this.getElement(), message, {\n trigger: 'manual',\n theme: level,\n placement: 'bottom'\n });\n countdownTooltip.show();\n setTimeout(function () {\n countdownTooltip.hide();\n countdownTooltip.dispose();\n }, warningTimeout[level] || 2000);\n }\n }\n });\n countdown.setTemplate(countdownTpl);\n _.defer(function () {\n countdown.init(config);\n });\n return countdown;\n }\n\n return countdownFactory;\n\n});\n\n","\ndefine('css!taoQtiTest/runner/plugins/controls/timer/component/css/timerbox',[],function(){});\n","define('taoQtiTest/runner/plugins/controls/timer/component/timerbox',['jquery', 'lodash', 'i18n', 'ui/component', 'ui/hider', 'taoQtiTest/runner/plugins/controls/timer/component/countdown', 'handlebars', 'lib/handlebars/helpers', 'css!taoQtiTest/runner/plugins/controls/timer/component/css/timerbox.css'], function ($$1, _, __, component, hider, countdownFactory, Handlebars, Helpers0, timerbox_css) { 'use strict';\n\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n component = component && Object.prototype.hasOwnProperty.call(component, 'default') ? component['default'] : component;\n hider = hider && Object.prototype.hasOwnProperty.call(hider, 'default') ? hider['default'] : hider;\n countdownFactory = countdownFactory && Object.prototype.hasOwnProperty.call(countdownFactory, 'default') ? countdownFactory['default'] : countdownFactory;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, self=this, functionType=\"function\";\n\n function program1(depth0,data) {\n \n var buffer = \"\", helper, options;\n buffer += \"\\n
          \\n \";\n return buffer;\n }\n\n buffer += \"
          \\n \";\n stack1 = helpers['if'].call(depth0, ((stack1 = (depth0 && depth0.zenMode)),stack1 == null || stack1 === false ? stack1 : stack1.enabled), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n
          \\n\\n
          \\n
          \\n\";\n return buffer;\n });\n function timerboxTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2018 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Default config values, see below.\n */\n var defaults = {\n zenMode: {\n enabled: true,\n startHidden: false\n }\n };\n\n /**\n * Creates and initialize the timerbox component.\n * Please not the component IS NOT rendered.\n * You'll have to render it by yourself.\n *\n * @param {Object} config\n * @param {Boolean} [config.zenMode = true] - zen mode adds a button to hide the countdowns to stay zen\n * @param {Object[]} [config.timers] - the timers to start with\n * @param {Boolean} [config.displayWarning = true] - let the countdown display their warning (contextual)\n * @returns {timerbox} the component, initialized and rendered\n */\n function timerboxFactory(config) {\n var $zenModeToggler;\n var $countdownContainer;\n\n /**\n * @typedef {Object} timerbox\n */\n var timerbox = component({\n /***\n * Update the displayed timers.\n * Compare the current and the given, it will add,remove and update timers.\n *\n * @param {Object[]} timers - the new timers\n * @returns {Promise} resolves when all timers are up to date (with the result of all the update operations)\n *\n * @fires timerbox#update the update is done\n */\n update: function update(timers) {\n var self = this;\n var updating = [];\n\n //remove timers\n var timerIdsToRemove = _.difference(_.keys(this.timers), _.keys(timers));\n if (timerIdsToRemove.length) {\n _.forEach(timerIdsToRemove, function (timerId) {\n updating.push(self.removeTimer(timerId));\n });\n }\n\n //add/update\n _.forEach(timers, function (timer, id) {\n if (typeof self.timers[id] === 'undefined') {\n updating.push(self.addTimer(id, timer));\n } else {\n updating.push(self.updateTimer(id, timer));\n }\n });\n return Promise.all(updating).then(function (results) {\n //show the toggler only if there's timers\n if (_.size(self.timers) > 0) {\n hider.show($zenModeToggler);\n } else {\n hider.hide($zenModeToggler);\n }\n\n /**\n * The timer box update is done\n * @event timerbox#update\n * @param {Object[]} timers - ALL update results (includes removals)\n */\n self.trigger('update', results);\n return results;\n });\n },\n /**\n * Get the current timers\n * @return {Object[]} the timers\n */\n getTimers: function getTimers() {\n return this.timers;\n },\n /**\n * Adds a new timer to the box\n * @param {String} id - the timer unique identifier\n * @param {Object} timer - the new timer\n * @return {Promise} resolves with the timer once added or false\n *\n * @fires timerbox#timerchange something changes in a timer\n * @fires timerbox#timeradd a new timer is in the box\n * @fires timerbox#timerstart a timer get started\n * @fires timerbox#timerstop a timer get stopped\n * @fires timerbox#timerend a timer get completed\n * @fires timerbox#change spread from the countdown\n */\n addTimer: function addTimer(id, timer) {\n var self = this;\n if (this.is('rendered') && typeof this.timers[id] === 'undefined') {\n return new Promise(function (resolve) {\n var countdown = countdownFactory($countdownContainer, _.defaults(timer, {\n displayWarning: self.config.displayWarning\n })).on('render', function () {\n //keep track of the new timer\n //and the countdown component\n self.timers[id] = _.clone(timer);\n self.timers[id].countdown = this;\n\n /**\n * The timers have changed (add, update, remove)\n * @event timerbox#timerchange\n * @param {String} action - add, update, remove\n * @param {Object} timer\n */\n self.trigger('timerchange', 'add', self.timers[id]);\n\n /**\n * A new timer is added\n * @event timerbox#timeradd\n * @param {Object} timer\n */\n self.trigger('timeradd', self.timers[id]);\n resolve(self.timers[id]);\n }).on('start', function () {\n /**\n * A timer starts\n * @event timerbox#timerstart\n * @param {Object} timer\n */\n self.trigger('timerstart', self.timers[id]);\n }).on('stop', function () {\n /**\n * A timer stops\n * @event timerbox#timerstop\n * @param {Object} timer\n */\n self.trigger('timerstop', self.timers[id]);\n }).on('end', function () {\n /**\n * A timer ends\n * @event timerbox#timerend\n * @param {Object} timer\n */\n self.trigger('timerend', self.timers[id]);\n }).on('change', function (value) {\n if (self.timers[id]) {\n self.trigger('timertick', this.remainingTime, self.timers[id].scope, self.timers[id].unansweredQuestions); // propogate current timer data\n\n //keep the current timer data in sync\n self.timers[id].remainingTime = value;\n }\n });\n countdown.spread(self, ['error', 'change', 'warn', 'warnscreenreader']);\n });\n }\n return Promise.resolve(false);\n },\n /**\n * Updates an existing timer\n * @param {String} id - the timer unique identifier\n * @param {Object} timer - the new timer\n * @return {Promise} resolves with the timer once updated or false\n *\n * @fires timerbox#timerchange something changes in a timer\n * @fires timerbox#timerupdate an existing timer is updated\n */\n updateTimer: function updateTimer(id, timer) {\n if (this.is('rendered') && typeof this.timers[id] !== 'undefined') {\n this.timers[id].remainingTime = timer.remainingTime;\n this.timers[id].unansweredQuestions = timer.unansweredQuestions;\n this.timers[id].extraTime = timer.extraTime;\n if (_.isNumber(timer.remainingWithoutExtraTime)) {\n this.timers[id].remainingWithoutExtraTime = timer.remainingWithoutExtraTime;\n }\n if (this.timers[id].countdown) {\n this.timers[id].countdown.update(timer.remainingTime, timer.unansweredQuestions);\n }\n this.trigger('timerchange', 'update', this.timers[id]);\n\n /**\n * A timer has been updated with external values\n * @event timerbox#timerupdate\n * @param {Object} timer\n */\n this.trigger('timerupdate', this.timers[id]);\n return Promise.resolve(this.timers[id]);\n }\n return Promise.resolve(false);\n },\n /**\n * Remove a timer\n * @param {String} id - the timer unique identifier\n * @return {Promise} resolves with the timer once removed or false\n *\n * @fires timerbox#timerchange something changes in a timer\n * @fires timerbox#timerremove a timer is removed\n */\n removeTimer: function removeTimer(id) {\n var self = this;\n if (this.is('rendered') && typeof this.timers[id] !== 'undefined') {\n return new Promise(function (resolve) {\n /**\n * Artifact function, remove the timer from the component index\n */\n var deindex = function deindex() {\n //keep a clone, without the component, for the event\n var removed = _.omit(self.timers[id], 'countdown');\n\n //remove the timer from the list\n self.timers = _.omit(self.timers, id);\n self.trigger('timerchange', 'remove', removed);\n\n /**\n * A timer has been updated with external values\n * @event timerbox#timerupdate\n * @param {Object} timer\n */\n self.trigger('timerremove', removed);\n resolve(removed);\n };\n if (self.timers[id].countdown) {\n self.timers[id].countdown.on('destroy', deindex).destroy();\n } else {\n deindex();\n }\n });\n }\n return Promise.resolve();\n },\n /**\n * Starts all the timers contained in the box\n * @returns {timerbox} chains\n */\n start: function start() {\n _.forEach(this.timers, function (timer) {\n if (timer.countdown) {\n timer.countdown.start();\n }\n });\n return this;\n },\n /**\n * Stops all the timers contained in the box\n * @returns {timerbox} chains\n */\n stop: function stop() {\n _.forEach(this.timers, function (timer) {\n if (timer.countdown) {\n timer.countdown.stop();\n }\n });\n return this;\n },\n /**\n * Show/hide the timers aka \"zen mode\"\n * @returns {timerbox} chains\n * @fires timerbox#zenchange\n */\n toggleZenMode: function toggleZenMode() {\n if (this.is('rendered') && this.config.zenMode.enabled) {\n if (this.is('zen')) {\n this.setState('zen', false);\n $zenModeToggler.attr('title', __('Hide timers'));\n } else {\n this.setState('zen', true);\n $zenModeToggler.attr('title', __('Show timers'));\n }\n\n /**\n * @event timerbox#zenchange\n * @param {Boolean} isZen\n */\n this.trigger('zenchange', this.is('zen'));\n }\n return this;\n }\n }, defaults).on('init', function () {\n //index the current timers\n this.timers = {};\n }).on('render', function () {\n var self = this;\n var $element = this.getElement();\n\n //where we append the countdowns components\n $countdownContainer = $$1('.timer-wrapper', $element);\n\n //set up the zen mode toggler\n if (this.config.zenMode.enabled) {\n $zenModeToggler = $$1('.timer-toggler', $element);\n self.setState('zen', !!self.config.zenMode.startHidden);\n $zenModeToggler.on('click', function (e) {\n e.preventDefault();\n self.toggleZenMode();\n });\n }\n\n //if timers are provided with the config, we perform the 1st update\n if (this.config.timers) {\n this.update(this.config.timers);\n }\n });\n timerbox.setTemplate(timerboxTpl);\n _.defer(function () {\n timerbox.init(config);\n });\n return timerbox;\n }\n\n return timerboxFactory;\n\n});\n\n","define('taoQtiTest/runner/plugins/controls/timer/strategy/enforcedStay',[],function () { 'use strict';\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2018-2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Timer strategy that enforce the test taker to stay in\n * front of the item until the timer completes,\n * by disabling the navigation elements.\n *\n * Applies on item scope, min timers if the testPart is linear\n *\n * @author Bertrand Chevrier \n */\n\n /**\n * Creates the strategy if it applies to the given timer\n * @param {runner} testRunner\n * @param {Object} timer\n * @returns {strategy|Boolean} the strategy if applies or false\n */\n function enforcedStayStrategy(testRunner, timer) {\n const testPart = testRunner.getCurrentPart();\n if (timer && timer.type === 'min' && timer.scope === 'item' && testPart && testPart.isLinear) {\n return {\n name: 'enforcedStay',\n /**\n * setUp entry point : disable the navigation\n */\n setUp: function setUp() {\n testRunner.on('enablenav.enforcestay', function () {\n testRunner.trigger('disablenav');\n });\n testRunner.trigger('disablenav');\n },\n /**\n * complete entry point : enables back the navigation\n */\n complete: function complete() {\n this.tearDown();\n testRunner.trigger('enablenav');\n },\n /**\n * tearDown entry point : remove the listeners\n */\n tearDown: function tearDown() {\n testRunner.off('enablenav.enforcestay');\n }\n };\n }\n return false;\n }\n\n return enforcedStayStrategy;\n\n});\n\n","define('taoQtiTest/runner/plugins/controls/timer/strategy/extraTime',['lodash'], function (_) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2018 (original work) Open Assessment Technologies SA ;\n */\n var precision = 1000;\n var lastConsumedExtraTime = 0;\n\n /**\n * Creates the strategy if it applies to the given timer\n * @param {runner} testRunner\n * @param {Object} timer\n * @returns {strategy|Boolean} the strategy if applies or false\n */\n function extraTimeStrategy(testRunner, timer) {\n /**\n * Apply the extra time to the timer 'once' and\n * listen for test movment to add the consumed extrat time as parameter\n * Since the extra time is global, if multiple timers use the extra time part,\n * we take the biggest consumed extra time.\n */\n var applyExtraTime = function applyExtraTime() {\n if (_.isNumber(timer.extraTime) && timer.extraTime > 0 && !timer.extraTimeSetup) {\n timer.extraTimeSetup = true;\n testRunner.before('move.extra skip.extra exit.extra timeout.extra', function () {\n var consumedExtraTime = 0;\n var testContext = testRunner.getTestContext();\n if (timer.remainingTime < timer.extraTime) {\n consumedExtraTime = Math.max(timer.extraTime - timer.remainingTime, 0) / precision;\n lastConsumedExtraTime = Math.max(consumedExtraTime, lastConsumedExtraTime, testContext.extraTime.consumed);\n testRunner.getProxy().addCallActionParams({\n consumedExtraTime: lastConsumedExtraTime\n });\n }\n }).after('move.extra skip.extra exit.extra timeout.extra', function () {\n lastConsumedExtraTime = 0;\n });\n }\n };\n if (timer && timer.type === 'max') {\n return {\n name: 'extraTime',\n /**\n * setUp entry point : adds the extratime to the timer\n */\n setUp: function setUp() {\n applyExtraTime();\n },\n /**\n * setUp entry point : adds the extratime to the timer\n */\n start: function start() {\n //apply at start also in case the extra time is added in between\n applyExtraTime();\n },\n /**\n * tearDown entry point : remove the listeners\n */\n tearDown: function tearDown() {\n testRunner.off('move.extra skip.extra exit.extra timeout.extra');\n }\n };\n }\n return false;\n }\n\n return extraTimeStrategy;\n\n});\n\n","define('taoQtiTest/runner/plugins/controls/timer/strategy/guidedNavigation',[],function () { 'use strict';\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2018-2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Timer strategy that enforce the test taker to stay in\n * front of the item until the timer completes,\n * by hidding the navigation elements.\n * Once the timer completes, the test moves to the next item.\n *\n * Applies on item scope, locked timers only, linear test part and\n * the test configuration \"guidedNavigation\"\n *\n * @author Bertrand Chevrier \n */\n\n /**\n * Creates the strategy if it applies to the given timer\n * @param {runner} testRunner\n * @param {Object} timer\n * @returns {strategy|Boolean} the strategy if applies or false\n */\n function guidedNavigationStrategy(testRunner, timer) {\n const testRunnerOptions = testRunner.getOptions();\n const testPart = testRunner.getCurrentPart();\n if (timer && timer.type === 'locked' && timer.scope === 'item' && testRunnerOptions.guidedNavigation === true && testPart && testPart.isLinear) {\n return {\n name: 'guidedNavigation',\n /**\n * setUp entry point : hides the navigation\n */\n setUp: function setUp() {\n testRunner.trigger('hidenav');\n },\n /**\n * complete entry point : enables back the navigation\n */\n complete: function complete() {\n testRunner.trigger('disableitem disablenav shownav');\n setTimeout(function () {\n testRunner.trigger('move', 'next', 'item');\n }, 500);\n }\n };\n }\n return false;\n }\n\n return guidedNavigationStrategy;\n\n});\n\n","define('taoQtiTest/runner/plugins/controls/timer/strategy/timeout',[],function () { 'use strict';\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2018 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Timeout strategy, the given scope is timedout when the timer completes.\n *\n * Applies on all max timers\n *\n * @author Bertrand Chevrier \n */\n\n /**\n * Creates the strategy if it applies to the given timer\n * @param {runner} testRunner\n * @param {Object} timer\n * @returns {strategy|Boolean} the strategy if applies or false\n */\n function timeoutStrategy(testRunner, timer) {\n if (timer && timer.type === 'max') {\n return {\n name: 'timeout',\n /**\n * complete entry point : timeout\n */\n complete: function complete() {\n if (timer.qtiClassName && timer.source) {\n return testRunner.timeout(timer.qtiClassName, timer.source, timer);\n }\n }\n };\n }\n return false;\n }\n\n return timeoutStrategy;\n\n});\n\n","define('taoQtiTest/runner/helpers/currentItem',['lodash'], function (_) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * List of QTI model cardinalities\n * @type {Object}\n */\n var responseCardinalities = {\n single: 'base',\n multiple: 'list',\n ordered: 'list',\n record: 'record'\n };\n\n /**\n * List of QTI interaction minConstraint properties\n * @type {Object}\n */\n var interactionMinConstraintProperties = {\n matchInteraction: 'minAssociations',\n choiceInteraction: 'minChoices',\n orderInteraction: 'minChoices',\n associateInteraction: 'minAssociations',\n hottextInteraction: 'minChoices',\n hotspotInteraction: 'minChoices',\n graphicOrderInteraction: 'minChoices',\n graphicAssociateInteraction: 'minAssociations',\n selectPointInteraction: 'minChoices'\n };\n\n /**\n * @typedef {currentItemHelper}\n */\n var currentItemHelper = {\n /**\n * Gets the responses declarations of the current item.\n * @param {Object} runner - testRunner instance\n * @returns {Object}\n */\n getDeclarations: function getDeclarations(runner) {\n var itemRunner = runner.itemRunner;\n return itemRunner._item && itemRunner._item.responses;\n },\n /**\n * Gets a response declaration by the identifier of the response\n * @param {Object} runner - testRunner instance\n * @param {String} identifier - The identifier of the response\n * @returns {Object|null}\n */\n getResponseDeclaration: function getResponseDeclaration(runner, identifier) {\n var found = null;\n _.forEach(currentItemHelper.getDeclarations(runner), function (declaration) {\n var attributes = declaration.attributes || {};\n if (attributes.identifier === identifier) {\n found = declaration;\n return false;\n }\n });\n return found;\n },\n /**\n * Convert a value to a response object\n * @param {Array|String} value\n * @param {String} baseType\n * @param {String} cardinality\n * @returns {Object}\n */\n toResponse: function toResponse(value, baseType, cardinality) {\n var mappedCardinality = responseCardinalities[cardinality];\n var response = {};\n if (_.isString(value) || _.isNumber(value)) {\n value = [value];\n }\n let transform = v => v;\n if (baseType === 'boolean') {\n transform = v => v === true || v === 'true';\n } else if (baseType === 'integer') {\n transform = v => typeof v === 'number' ? v : parseInt(v);\n } else if (baseType === 'float') {\n transform = v => typeof v === 'number' ? v : parseFloat(v);\n } else if (baseType === 'directedPair' || baseType === 'pair') {\n transform = v => {\n if (_.isString(v)) {\n return v.split(' ');\n }\n return v;\n };\n }\n value = _.map(value || [], transform);\n if (mappedCardinality) {\n if (mappedCardinality === 'base') {\n if (value.length === 0) {\n //return empty response:\n response.base = null;\n } else {\n response.base = {};\n response.base[baseType] = value[0];\n }\n } else {\n response[mappedCardinality] = {};\n response[mappedCardinality][baseType] = value;\n }\n }\n return response;\n },\n /**\n * Checks if the provided value can be considered as null\n * @param {Object} value\n * @param {String} baseType\n * @param {String} cardinality\n * @returns {boolean}\n */\n isQtiValueNull: function isQtiValueNull(value, baseType, cardinality) {\n var mappedCardinality = responseCardinalities[cardinality];\n if (_.isObject(value) && value[mappedCardinality] === null) {\n value = null;\n }\n if (_.isObject(value) && value[mappedCardinality] && 'undefined' !== typeof value[mappedCardinality][baseType]) {\n value = value[mappedCardinality][baseType];\n }\n const stringyValue = 'string' === baseType || 'integer' === baseType || 'float' === baseType;\n return null === value || stringyValue && value === '' || cardinality !== 'single' && _.isEmpty(value);\n },\n /**\n * Tells if an item question has been answered or not\n * @param {Object} response\n * @param {String} baseType\n * @param {String} cardinality\n * @param {Object} [defaultValue]\n * @param {Object} constraintValue\n * @returns {*}\n */\n isQuestionAnswered: function isQuestionAnswered(response, baseType, cardinality, defaultValue, constraintValue) {\n var answered, currentCardinality, responses;\n var fullyAnswered = true;\n defaultValue = _.isUndefined(defaultValue) ? null : defaultValue;\n constraintValue = constraintValue || 0;\n if (currentItemHelper.isQtiValueNull(response, baseType, cardinality)) {\n answered = false;\n } else {\n answered = !_.isEqual(response, currentItemHelper.toResponse(defaultValue, baseType, cardinality));\n if (constraintValue !== 0) {\n currentCardinality = responseCardinalities[cardinality];\n responses = response[currentCardinality][baseType] || [];\n fullyAnswered = responses && responses.length >= constraintValue;\n }\n answered = answered && fullyAnswered;\n }\n return answered;\n },\n guessInteractionConstraintValues: function guessInteractionConstraintValues(runner) {\n var itemRunner = runner.itemRunner;\n var itemBody = itemRunner._item && itemRunner._item.bdy || {};\n var interactions = itemBody.elements || {};\n var constraintValues = {};\n _.forEach(interactions, function (interaction) {\n var attributes = interaction.attributes || {};\n var qtiClass = interaction.__proto__.qtiClass;\n var constraintProperty;\n if (Object.prototype.hasOwnProperty.call(interactionMinConstraintProperties, qtiClass)) {\n constraintProperty = interactionMinConstraintProperties[qtiClass];\n constraintValues[attributes.responseIdentifier] = attributes[constraintProperty];\n }\n });\n return constraintValues;\n },\n /**\n * Tells is the current item has been answered or not\n * The item is considered answered when at least one response has been set to not empty {base : null}\n * @param {Object} runner - testRunner instance\n * @param {Boolean} [partially=true] - if false all questions must have been answered\n * @returns {Boolean}\n */\n isAnswered: function isAnswered(runner, partially) {\n var itemRunner = runner.itemRunner;\n var responses = itemRunner && itemRunner.getResponses();\n var count = 0;\n var empty = 0;\n var declarations, constraintValues;\n if (itemRunner) {\n declarations = currentItemHelper.getDeclarations(runner);\n constraintValues = currentItemHelper.guessInteractionConstraintValues(runner);\n _.forEach(declarations, function (declaration) {\n var attributes = declaration.attributes || {};\n var response = responses[attributes.identifier];\n var baseType = attributes.baseType;\n var cardinality = attributes.cardinality;\n count++;\n if (!currentItemHelper.isQuestionAnswered(response, baseType, cardinality, declaration.defaultValue, constraintValues[attributes.identifier])) {\n empty++;\n }\n });\n }\n if (partially === false) {\n return count > 0 && empty === 0;\n }\n return count > 0 && empty < count;\n },\n /**\n * Gets list of shared stimuli hrefs in the current item\n *\n * @param {Object} runner - testRunner instance\n * @returns {Array}\n */\n getStimuliHrefs: function getStimuliHrefs(runner) {\n var itemRunner = runner.itemRunner;\n var itemBody = itemRunner._item && itemRunner._item.bdy || {};\n var interactions = itemBody.elements || {};\n return _(interactions).values().filter(function (element) {\n return element.qtiClass === 'include';\n }).pluck('attributes').pluck('href').value();\n },\n /**\n * Find the list of text stimulus ids in the current item\n * Depends on the DOM already being loaded\n * @param {Object} runner - testRunner instance\n * @returns {Array}\n */\n getTextStimuliHrefs: function getTextStimuliHrefs(runner) {\n var stimuli = this.getStimuliHrefs(runner);\n var textStimuli;\n if (stimuli.length > 0) {\n // Filter the ones containing text:\n textStimuli = stimuli.filter(function (stimulusHref) {\n var domNode = document.querySelector(`.qti-include[data-href=\"${stimulusHref}\"]`);\n return _(domNode.childNodes).some(function (child) {\n return child.nodeType === child.TEXT_NODE;\n });\n });\n return textStimuli;\n }\n return [];\n }\n };\n\n return currentItemHelper;\n\n});\n\n","define('taoQtiTest/runner/helpers/stats',['lodash', 'taoQtiTest/runner/helpers/map', 'taoQtiTest/runner/helpers/currentItem'], function (_, mapHelper, currentItemHelper) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n currentItemHelper = currentItemHelper && Object.prototype.hasOwnProperty.call(currentItemHelper, 'default') ? currentItemHelper['default'] : currentItemHelper;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2019 (original work) Open Assessment Technologies SA ;\n */\n var stats = {\n /**\n * Return scope stats that takes into account any test taker interaction made since the item has been loaded\n * @param {String} scope - scope to consider for calculating the stats\n * @param {Object} runner - testRunner instance\n * @param {Boolean} sync - flag for sync the unanswered stats in exit message and the unanswered stats in the toolbox. Default false\n * @returns {Object} the stats\n */\n getInstantStats(scope, runner, sync) {\n const map = runner.getTestMap();\n const context = runner.getTestContext();\n const item = runner.getCurrentItem();\n const testPart = runner.getCurrentPart();\n const stats = _.clone(mapHelper.getScopeStats(map, context.itemPosition, scope));\n const options = runner.getOptions() || {};\n let partiallyAnsweredIsAnswered;\n if (options.review) {\n partiallyAnsweredIsAnswered = options.review.partiallyAnsweredIsAnswered;\n }\n if (!item.informational) {\n const isItemCurrentlyAnswered = currentItemHelper.isAnswered(runner, partiallyAnsweredIsAnswered);\n if (!isItemCurrentlyAnswered && item.answered) {\n stats.answered--;\n } else if ((isItemCurrentlyAnswered || sync) && !item.answered) {\n stats.answered++;\n // eslint-disable-next-line no-dupe-else-if\n } else if (sync && !isItemCurrentlyAnswered && item.answered && testPart.isLinear) {\n stats.answered++;\n }\n }\n return stats;\n }\n };\n\n return stats;\n\n});\n\n","define('taoQtiTest/runner/helpers/messages',['i18n', 'taoQtiTest/runner/helpers/stats', 'handlebars', 'lib/handlebars/helpers'], function (__, statsHelper, Handlebars, Helpers0) { 'use strict';\n\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n statsHelper = statsHelper && Object.prototype.hasOwnProperty.call(statsHelper, 'default') ? statsHelper['default'] : statsHelper;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var stack1, functionType=\"function\", escapeExpression=this.escapeExpression, self=this;\n\n function program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\";\n if (helper = helpers.header) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.header); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"

          \";\n return buffer;\n }\n\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.header), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { return stack1; }\n else { return ''; }\n });\n function messageHeaderTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2021 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Completes an exit message\n * @param {String} scope - scope to consider for calculating the stats\n * @param {Object} runner - testRunner instance\n * @param {String} message - custom message that will be appended to the unanswered stats count\n * @param {Boolean} sync - flag for sync the unanswered stats in exit message and the unanswered stats in the toolbox\n * @param {String|undefined} submitButtonLabel - point the user to the submit button\n * @returns {String} Returns the message text\n */\n function getExitMessage(scope, runner) {\n let message = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n let sync = arguments.length > 3 ? arguments[3] : undefined;\n let submitButtonLabel = arguments.length > 4 ? arguments[4] : undefined;\n let itemsCountMessage = '';\n const testRunnerOptions = runner.getOptions();\n const messageEnabled = testRunnerOptions.enableUnansweredItemsWarning;\n if (messageEnabled) {\n itemsCountMessage = getUnansweredItemsWarning(scope, runner, sync).trim();\n if (itemsCountMessage) {\n itemsCountMessage += '.';\n }\n }\n return `${getHeader(scope)}${itemsCountMessage} ${getActionMessage(scope, submitButtonLabel)}${message}`.trim();\n }\n\n /**\n * Build message if not all items have answers\n * @param {String} scope - scope to consider for calculating the stats\n * @returns {String} Returns the message text\n */\n function getHeader(scope) {\n let header = '';\n if (scope === 'section' || scope === 'testSection') {\n header = __('You are about to leave this section.');\n } else if (scope === 'test' || scope === 'testWithoutInaccessibleItems') {\n header = __('You are about to submit the test.');\n } else if (scope === 'part') {\n header = __('You are about to submit this test part.');\n }\n return messageHeaderTpl({\n header: header.trim()\n });\n }\n\n /**\n * Generates the message to help users perform the action\n * @param {String} scope - scope to consider for calculating the stats\n * @param {String} [submitButtonLabel] - Pointed user perform click on given button\n * @returns {String} Returns the message text\n */\n function getActionMessage(scope) {\n let submitButtonLabel = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : __('OK');\n var msg;\n switch (scope) {\n case 'section':\n case 'testSection':\n case 'part':\n return __('Click \"%s\" to continue.', submitButtonLabel).trim();\n case 'test':\n case 'testWithoutInaccessibleItems':\n msg = __('You will not be able to access this test once submitted. Click \"%s\" to continue and submit the test.', submitButtonLabel);\n return `${msg}`;\n }\n return '';\n }\n\n /**\n * Build message for the flagged items if any.\n * @param {Object} stats - The stats for the current context\n * @param {String} [message] - The existing message to complete\n * @returns {string|*}\n */\n function getFlaggedItemsWarning(stats) {\n let message = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n const flaggedCount = stats && stats.flagged;\n if (!flaggedCount) {\n return message;\n }\n if (message) {\n return `${message} ${__('and you flagged %s item(s) that you can review now', flaggedCount.toString())}`;\n }\n return __('You flagged %s item(s) that you can review now', flaggedCount.toString());\n }\n\n /**\n * Build message if not all items have answers\n * @param {String} scope - scope to consider for calculating the stats\n * @param {Object} runner - testRunner instance\n * @param {Boolean} sync - flag for sync the unanswered stats in exit message and the unanswered stats in the toolbox. Default false\n * @returns {String} Returns the message text\n */\n function getUnansweredItemsWarning(scope, runner, sync) {\n const stats = statsHelper.getInstantStats(scope, runner, sync);\n const unansweredCount = stats && stats.questions - stats.answered;\n const flaggedCount = stats && stats.flagged;\n let itemsCountMessage = '';\n if (scope === 'section' || scope === 'testSection') {\n itemsCountMessage = __('You answered %s of %s question(s) for this section of the test', stats.answered.toString(), stats.questions.toString());\n if (flaggedCount) {\n itemsCountMessage += `, ${__('and flagged %s of them', flaggedCount.toString())}`;\n }\n } else if (scope === 'test' || scope === 'testWithoutInaccessibleItems') {\n if (unansweredCount > 1) {\n itemsCountMessage = __('There are %s unanswered questions', unansweredCount.toString());\n } else if (unansweredCount === 1) {\n itemsCountMessage = __('There is %s unanswered question', unansweredCount.toString());\n }\n if (flaggedCount) {\n itemsCountMessage = getFlaggedItemsWarning(stats, itemsCountMessage);\n }\n } else if (scope === 'part') {\n if (unansweredCount > 1) {\n itemsCountMessage = __('There are %s unanswered questions in this part of the test', unansweredCount.toString());\n } else if (unansweredCount === 1) {\n itemsCountMessage = __('There is %s unanswered question in this part of the test', unansweredCount.toString());\n }\n if (flaggedCount) {\n itemsCountMessage = getFlaggedItemsWarning(stats, itemsCountMessage);\n }\n }\n itemsCountMessage = itemsCountMessage.trim();\n return itemsCountMessage;\n }\n var messages = {\n getExitMessage: getExitMessage\n };\n\n return messages;\n\n});\n\n","define('taoQtiTest/runner/config/states',[],function () { 'use strict';\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * The possible states\n * @author Bertrand Chevrier \n */\n var states = {\n //the test session states\n testSession: Object.freeze({\n initial: 0,\n interacting: 1,\n modalFeedback: 2,\n suspended: 3,\n closed: 4\n }),\n //the item session states\n itemSession: Object.freeze({\n initial: 0,\n interacting: 1,\n modalFeedback: 2,\n suspended: 3,\n closed: 4,\n solution: 5,\n notSelected: 255\n })\n };\n\n return states;\n\n});\n\n","define('taoQtiTest/runner/plugins/controls/timer/strategy/warnSectionLeaving',['lodash', 'i18n', 'taoQtiTest/runner/helpers/messages', 'taoQtiTest/runner/helpers/navigation', 'taoQtiTest/runner/config/states', 'taoQtiTest/runner/helpers/map'], function (_, __, messages, navigationHelper, states, mapHelper) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n messages = messages && Object.prototype.hasOwnProperty.call(messages, 'default') ? messages['default'] : messages;\n navigationHelper = navigationHelper && Object.prototype.hasOwnProperty.call(navigationHelper, 'default') ? navigationHelper['default'] : navigationHelper;\n states = states && Object.prototype.hasOwnProperty.call(states, 'default') ? states['default'] : states;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2018-2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * The message to display when exiting\n */\n var exitMessage = __('Once you close this section, you cannot return to it or change your answers.');\n\n /**\n * Creates the strategy if it applies to the given timer\n * @param {runner} testRunner\n * @param {Object} timer\n * @returns {strategy|Boolean} the strategy if applies or false\n */\n function warnSectionLeavingStrategy(testRunner, timer) {\n /**\n * Check if the movment leads to leaving an active timed section\n * @param {String} direction - the move direction (next, previous or jump)\n * @param {String} scope - the move scope (item, section, testPart)\n * @param {Number} [position] - the position in case of jump\n * @returns {Boolean}\n */\n var leaveTimedSection = function leaveTimedSection(direction, scope, position) {\n var context = testRunner.getTestContext();\n var map = testRunner.getTestMap();\n if (!context.isTimeout && context.itemSessionState !== states.itemSession.closed && context.sectionId === timer.source) {\n return navigationHelper.isLeavingSection(context, map, direction, scope, position);\n }\n return false;\n };\n if (timer && timer.scope === 'section' && timer.type === 'max') {\n return {\n name: 'warnSectionLeaving',\n /**\n * setUp entry point : blocks the move to display a message if needed\n */\n setUp: function setUp() {\n testRunner.off('move.warntimedsection skip.warntimedsection').before('move.warntimedsection skip.warntimedsection', function (e, type, scope, position) {\n const testContext = testRunner.getTestContext();\n const testMap = testRunner.getTestMap();\n const testRunnerOptions = testRunner.getOptions();\n const timerConfig = testRunnerOptions.timer || {};\n const itemIdentifier = testContext.itemIdentifier;\n const isLast = navigationHelper.isLast(testMap, itemIdentifier);\n const endTestWarning = mapHelper.hasItemCategory(testMap, itemIdentifier, 'endTestWarning', true);\n const noExitTimedSectionWarning = mapHelper.hasItemCategory(testMap, itemIdentifier, 'noExitTimedSectionWarning', true);\n var movePromise = new Promise(function (resolve, reject) {\n // endTestWarning has already been displayed, so we don't repeat the warning\n if (isLast && endTestWarning) {\n resolve();\n // display a message if we exit a timed section\n } else if (leaveTimedSection(type || 'next', scope, position) && !noExitTimedSectionWarning && !timerConfig.keepUpToTimeout) {\n const submitButtonLabel = __('Close this Section');\n testRunner.trigger('confirm.exittimed', messages.getExitMessage('section', testRunner, exitMessage, false, submitButtonLabel), resolve, reject, {\n buttons: {\n labels: {\n ok: submitButtonLabel,\n cancel: __('Review my Answers')\n }\n }\n });\n } else {\n resolve();\n }\n });\n movePromise.catch(function cancelMove() {\n // Use `defer` to be sure the timer resume will occur after the move event is\n // finished to be handled. Otherwise, the duration plugin will be frozen and\n // the additional time will not be taken into account!\n _.defer(function () {\n testRunner.trigger('enableitem enablenav');\n });\n });\n return movePromise;\n });\n },\n /**\n * complete entry point : removes the listeners\n */\n complete: function complete() {\n return this.tearDown();\n },\n /**\n * tearDown entry point : removes the listeners\n */\n tearDown: function tearDown() {\n testRunner.off('move.warntimedsection skip.warntimedsection');\n }\n };\n }\n return false;\n }\n\n return warnSectionLeavingStrategy;\n\n});\n\n","define('taoQtiTest/runner/plugins/controls/timer/strategy/strategyHandler',['lodash', 'taoQtiTest/runner/plugins/controls/timer/strategy/enforcedStay', 'taoQtiTest/runner/plugins/controls/timer/strategy/extraTime', 'taoQtiTest/runner/plugins/controls/timer/strategy/guidedNavigation', 'taoQtiTest/runner/plugins/controls/timer/strategy/timeout', 'taoQtiTest/runner/plugins/controls/timer/strategy/warnSectionLeaving'], function (_, extraTimeStrategy, enforcedStayStrategy, guidedNavigationStrategy, timeoutStrategy, warnSectionLeavingStrategy) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n extraTimeStrategy = extraTimeStrategy && Object.prototype.hasOwnProperty.call(extraTimeStrategy, 'default') ? extraTimeStrategy['default'] : extraTimeStrategy;\n enforcedStayStrategy = enforcedStayStrategy && Object.prototype.hasOwnProperty.call(enforcedStayStrategy, 'default') ? enforcedStayStrategy['default'] : enforcedStayStrategy;\n guidedNavigationStrategy = guidedNavigationStrategy && Object.prototype.hasOwnProperty.call(guidedNavigationStrategy, 'default') ? guidedNavigationStrategy['default'] : guidedNavigationStrategy;\n timeoutStrategy = timeoutStrategy && Object.prototype.hasOwnProperty.call(timeoutStrategy, 'default') ? timeoutStrategy['default'] : timeoutStrategy;\n warnSectionLeavingStrategy = warnSectionLeavingStrategy && Object.prototype.hasOwnProperty.call(warnSectionLeavingStrategy, 'default') ? warnSectionLeavingStrategy['default'] : warnSectionLeavingStrategy;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2018 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * The list of available strategies\n * TODO this list could come from the configuration\n */\n var defaultAvailableStrategies = [extraTimeStrategy, enforcedStayStrategy, guidedNavigationStrategy, timeoutStrategy, warnSectionLeavingStrategy];\n\n /**\n * Get a strategyHandler object for a testRunner instance\n * @param {runner} testRunner - the test runner instance\n * @param {strategy[]} strategies - the list of available strategies, to override the defaults\n * @returns {strategyHandler} the handler\n */\n function getStrategyHandler(testRunner, strategies) {\n var strategyHandler;\n\n /**\n * To keep track of the active strategies, per timer\n */\n var actives = {};\n\n /**\n * Artifact function to apply an action to a list of strategy\n * @param {String} timerId - the id of the timer to run the actions against\n * @param {String} action -\n */\n var applyToStrategies = function applyToStrategies(timerId, action) {\n var api = _.keys(strategyHandler);\n if (_.isEmpty(timerId) || _.isEmpty(action) || !_.contains(api, action)) {\n throw new TypeError('Invalid timer id or unauthorized action');\n }\n if (!_.isArray(actives[timerId])) {\n return Promise.resolve();\n }\n return Promise.all(_.map(actives[timerId], function (strategy) {\n if (_.isFunction(strategy[action])) {\n return strategy[action]();\n }\n }));\n };\n var availableStrategies = strategies || defaultAvailableStrategies;\n\n //quick validation of the test runner\n if (!testRunner || !_.isFunction(testRunner.on) || !_.isFunction(testRunner.getTestContext)) {\n throw new TypeError('The strategy handler needs a valid test runner.');\n }\n\n /**\n * @typedef {Object} strategyHandler\n */\n strategyHandler = {\n /**\n * Try to set up strategies for the given timer\n * @param {Object} timer\n * @returns {Promise} resolves once the set up is done\n */\n setUp: function setUp(timer) {\n _.forEach(availableStrategies, function (availableStrategy) {\n var strategy = availableStrategy(testRunner, timer);\n if (strategy !== false) {\n actives[timer.id] = actives[timer.id] || [];\n actives[timer.id].push(strategy);\n }\n });\n return applyToStrategies(timer.id, 'setUp');\n },\n /**\n * Get the actives strategies for the given timer\n * @returns {strategy[]} the actives strategies\n */\n getActives: function getActives(timer) {\n if (timer && timer.id && _.isArray(actives[timer.id])) {\n return actives[timer.id];\n }\n return [];\n },\n /**\n * Call the timer's strategies \"start\"\n * @param {Object} timer\n * @returns {Promise}\n */\n start: function start(timer) {\n return applyToStrategies(timer.id, 'start');\n },\n /**\n * Call the timer's strategies \"stop\"\n * @param {Object} timer\n * @returns {Promise}\n */\n stop: function stop(timer) {\n return applyToStrategies(timer.id, 'stop');\n },\n /**\n * Call the timer's strategies \"complete\"\n * @param {Object} timer\n * @returns {Promise}\n */\n complete: function complete(timer) {\n return applyToStrategies(timer.id, 'complete');\n },\n /**\n * Call the timer's strategies \"tearDown\"\n * will also un-reference the strategies\n * @param {Object} timer\n * @returns {Promise}\n */\n tearDown: function tearDown(timer) {\n return applyToStrategies(timer.id, 'tearDown').then(function () {\n actives = _.omit(actives, timer.id);\n });\n }\n };\n return strategyHandler;\n }\n\n return getStrategyHandler;\n\n});\n\n","define('taoQtiTest/runner/plugins/controls/timer/timers',['lodash', 'i18n', 'moment', 'core/format', 'core/logger'], function (_, __, moment, format, loggerFactory) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n moment = moment && Object.prototype.hasOwnProperty.call(moment, 'default') ? moment['default'] : moment;\n format = format && Object.prototype.hasOwnProperty.call(format, 'default') ? format['default'] : format;\n loggerFactory = loggerFactory && Object.prototype.hasOwnProperty.call(loggerFactory, 'default') ? loggerFactory['default'] : loggerFactory;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2018 (original work) Open Assessment Technologies SA ;\n */\n var logger = loggerFactory('taoQtiTest/runner/plugins/controls/timer/timers');\n\n /**\n * We receive values in seconds, so we convert them to milliseconds\n */\n var precision = 1000;\n\n /**\n * The timer's scope\n */\n var scopes = ['item', 'section', 'testPart', 'test'];\n\n /**\n * Map qti class names to scopes\n */\n var scopeMapping = {\n assessmentTest: 'test',\n assessmentSection: 'section',\n assessmentItemRef: 'item'\n };\n\n /**\n * helps you get the scope from a scope or qti class name\n * @param {String} value - scope or qti class name\n * @returns {String?} the scope\n */\n var getScope = function getScope(value) {\n if (scopeMapping[value]) {\n return scopeMapping[value];\n }\n if (_.contains(scopes, value)) {\n return value;\n }\n return null;\n };\n\n /**\n * The text of warning messages\n * TODO add warning messages for other timers types\n */\n var warningMessages = {\n item: __('Warning – You have %s remaining to complete this item.'),\n section: __('Warning – You have %s remaining to complete this section.'),\n testPart: __('Warning – You have %s remaining to complete this test part.'),\n test: __('Warning – You have %s remaining to complete this test.')\n };\n\n /**\n * The text of warning messages for screenreader\n */\n const warningMessagesForScreenraeder = {\n item: __('You have %s remaining to complete the current item.'),\n section: __('You have %s left to answer remaining %s questions.'),\n testPart: __('You have %s left to answer remaining %s questions.'),\n test: __('You have %s left to answer remaining %s questions.')\n };\n\n /**\n * Get the timers objects from the time constraints andt the given config\n * @param {Object[]} timeConstraints - as defined in the testContext\n * @param {Boolean} isLinear - is the current navigation mode linear\n * @param {Object} [config] - timers config\n * @param {Object[]} [config.warnings] - the warnings to apply to the timers (max only for now)\n * @param {Object[]} [config.warnings] - the warnings to apply to the timers (max only for now)\n * @returns {timer[]} the timers\n */\n function getTimers(timeConstraints, isLinear, config) {\n var timers = {};\n\n /**\n * The warnings comes in a weird format (ie. {scope:{threshold:level}}) , so we reformat them\n */\n var constraintsWarnings = _.reduce(config.warnings, function (acc, warnings, qtiScope) {\n var scope = getScope(qtiScope);\n acc[scope] = _.map(warnings, function (value, key) {\n return {\n threshold: parseInt(key, 10) * precision,\n message: function applyMessage(remainingTime) {\n var displayRemaining = moment.duration(remainingTime / precision, 'seconds').humanize();\n return format(warningMessages[scope], displayRemaining);\n },\n level: value,\n shown: false\n };\n });\n return acc;\n }, {});\n\n /**\n * The warnings comes in a weird format (ie. {scope:[threshold, ...]}) , so we reformat them\n */\n const constraintsWarningsForScreenreader = _.reduce(config.warningsForScreenreader, (acc, warnings, qtiScope) => {\n const scope = getScope(qtiScope);\n acc[scope] = _.map(warnings, value => ({\n threshold: parseInt(value, 10) * precision,\n message: function applyMessage(remainingTime, unansweredQuestions) {\n const displayRemaining = moment.duration(remainingTime / precision, 'seconds').humanize();\n return format(warningMessagesForScreenraeder[scope], displayRemaining, unansweredQuestions);\n },\n scope,\n shown: false\n }));\n return acc;\n }, {});\n\n /**\n * Build a timer of a given type from a time constraints\n * @param {String} type - min, max, locked\n * @param {Object} constraintData\n * @returns {timer} timer\n */\n var buildTimer = function buildTimer(type, constraintData) {\n /**\n * @typedef {Object} timer\n * @property {String} id - identify the timer (for max, it's the source for backward compat)\n * @property {String} type - min, max or locked\n * @property {String} label - the title to display\n * @property {String} scope - the timer's scope (item, section, etc.)\n * @property {String} qtiClassName - the QTI class of the timers applies to\n * @property {String} source - the ID of the element the timers belongs to\n * @property {Number} extraTime - additional time data, object\n * @property {Number} originalTime - the starting value of the timer, never changes, in ms.\n * @property {Number} remainingTime - current value, in ms.\n * @property {Number} remainingWithoutExtraTime - remaining time without extra time, in ms.\n * @property {Number} total - total time (original time + extra time), in ms.\n */\n var timer = _.pick(constraintData, ['label', 'scope', 'source', 'extraTime', 'qtiClassName']);\n timer.type = type;\n timer.allowLateSubmission = constraintData.allowLateSubmission;\n if (type === 'min') {\n timer.id = `${type}-${constraintData.scope}-${constraintData.source}`;\n timer.originalTime = constraintData.minTime * precision;\n timer.remainingTime = constraintData.minTimeRemaining * precision;\n } else {\n timer.id = constraintData.source;\n timer.originalTime = constraintData.maxTime * precision;\n timer.remainingTime = constraintData.maxTimeRemaining * precision;\n }\n timer.remainingWithoutExtraTime = timer.remainingTime;\n if (timer.extraTime && timer.type !== 'min') {\n timer.extraTime.consumed = timer.extraTime.consumed * precision;\n timer.extraTime.remaining = timer.extraTime.remaining * precision;\n timer.extraTime.total = timer.extraTime.total * precision;\n timer.total = timer.originalTime + timer.extraTime.total;\n timer.remainingTime += timer.extraTime.remaining;\n }\n\n //TODO supports warnings for other types\n if (type === 'max' && _.isArray(constraintsWarnings[timer.scope])) {\n timer.warnings = constraintsWarnings[timer.scope];\n }\n if (_.isArray(constraintsWarningsForScreenreader[timer.scope])) {\n timer.warningsForScreenreader = constraintsWarningsForScreenreader[timer.scope];\n }\n const stats = config.questionsStats[timer.scope];\n timer.unansweredQuestions = stats && stats.questions - stats.answered;\n return timer;\n };\n _.forEach(timeConstraints, function (timeConstraint) {\n var constraintData = _.clone(timeConstraint);\n var newTimer;\n constraintData.scope = getScope(timeConstraint.scope || timeConstraint.qtiClassName);\n if (!constraintData.scope) {\n logger.warn('Wrong data, a time constraint should apply to a valid scope, skipping');\n } else if (constraintData.minTime === false && constraintData.maxTime === false) {\n logger.warn('Time constraint defined with no time, skipping');\n\n // minTime = maxTime -> one locked timer\n } else if (config.guidedNavigation && isLinear && constraintData.maxTime && constraintData.minTime && constraintData.minTime === constraintData.maxTime && constraintData.maxTime > 0) {\n newTimer = buildTimer('locked', constraintData);\n timers[newTimer.id] = newTimer;\n } else {\n //minTime -> min timer\n if (isLinear && constraintData.minTime && constraintData.minTime > 0) {\n newTimer = buildTimer('min', constraintData);\n timers[newTimer.id] = newTimer;\n }\n\n //maxTime -> max timer\n if (constraintData.maxTime && constraintData.maxTime > 0) {\n newTimer = buildTimer('max', constraintData);\n timers[newTimer.id] = newTimer;\n }\n }\n });\n logger.debug('Timers built from timeConstraints', timers);\n return timers;\n }\n\n return getTimers;\n\n});\n\n","define('taoQtiTest/runner/plugins/controls/timer/plugin',['jquery', 'lodash', 'taoTests/runner/plugin', 'taoQtiTest/runner/plugins/controls/timer/strategy/strategyHandler', 'taoQtiTest/runner/plugins/controls/timer/component/timerbox', 'taoQtiTest/runner/plugins/controls/timer/timers', 'taoQtiTest/runner/helpers/isReviewPanelEnabled', 'taoQtiTest/runner/helpers/stats', 'handlebars', 'lib/handlebars/helpers'], function ($$1, _, pluginFactory, getStrategyHandler, timerboxFactory, timersFactory, isReviewPanelEnabled, statsHelper, Handlebars, Helpers0) { 'use strict';\n\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n getStrategyHandler = getStrategyHandler && Object.prototype.hasOwnProperty.call(getStrategyHandler, 'default') ? getStrategyHandler['default'] : getStrategyHandler;\n timerboxFactory = timerboxFactory && Object.prototype.hasOwnProperty.call(timerboxFactory, 'default') ? timerboxFactory['default'] : timerboxFactory;\n timersFactory = timersFactory && Object.prototype.hasOwnProperty.call(timersFactory, 'default') ? timersFactory['default'] : timersFactory;\n isReviewPanelEnabled = isReviewPanelEnabled && Object.prototype.hasOwnProperty.call(isReviewPanelEnabled, 'default') ? isReviewPanelEnabled['default'] : isReviewPanelEnabled;\n statsHelper = statsHelper && Object.prototype.hasOwnProperty.call(statsHelper, 'default') ? statsHelper['default'] : statsHelper;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); \n\n\n return \"
          \\n\";\n });\n function screenreaderNotificationTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2018-2019 (original work) Open Assessment Technologies SA ;\n */\n\n // timeout after which screenreader notifcation should be cleaned up\n const screenreaderNotificationTimeout = 20000;\n\n /**\n * Creates the plugin\n */\n var plugin = pluginFactory({\n name: 'timer',\n /**\n * Install step, add behavior before the lifecycle\n */\n install() {\n const testRunner = this.getTestRunner();\n\n /**\n * Load the timers, from the given timeConstraints and reading the current value in the store\n * @param {store} timeStore - where the values are read\n * @param {Object} config - the current config, especially for the warnings\n * @returns {Promise} the list of timers for the current context\n */\n this.loadTimers = function loadTimers(timeStore, config) {\n const testContext = testRunner.getTestContext();\n const testPart = testRunner.getCurrentPart();\n const isLinear = testPart && testPart.isLinear;\n const timeConstraints = testContext.timeConstraints;\n const timers = timersFactory(timeConstraints, isLinear, config);\n return Promise.all(_.map(timers, function (timer) {\n return timeStore.getItem(`consumed_${timer.id}`).then(function (savedConsumedTime) {\n if (_.isNumber(savedConsumedTime) && savedConsumedTime >= 0 && config.restoreTimerFromClient) {\n timer.remainingTime = timer.originalTime + timer.extraTime.total - savedConsumedTime;\n }\n });\n })).then(function () {\n return timers;\n });\n };\n\n /**\n * Save consumed time values into the store\n * @param {store} timeStore - where the values are saved\n * @param {Object[]} timers - the timers to save\n * @returns {Promise} resolves once saved\n */\n this.saveTimers = function saveTimers(timeStore, timers) {\n return Promise.all(_.map(timers, function (timer) {\n return timeStore.setItem(`consumed_${timer.id}`, timer.originalTime + timer.extraTime.total - timer.remainingTime);\n }));\n };\n\n //define the \"timer\" store as \"volatile\" (removed on browser change).\n testRunner.getTestStore().setVolatile(this.getName());\n },\n /**\n * Initializes the plugin (called during runner's init)\n *\n * @returns {Promise}\n */\n init: function init() {\n const self = this;\n const testRunner = this.getTestRunner();\n const testRunnerOptions = testRunner.getOptions();\n let screenreaderNotifcationTimeoutId;\n const stats = {};\n ['test', 'testPart', 'section', 'item'].forEach(scope => Object.assign(stats, {\n [scope]: statsHelper.getInstantStats(scope, testRunner)\n }));\n\n /**\n * Plugin config,\n */\n const config = Object.assign({\n /**\n * An option to control is the warnings are contextual or global\n */\n contextualWarnings: false,\n /**\n * The list of configured warnings\n */\n warnings: testRunnerOptions.timerWarning || {},\n /**\n * The list of configured warnings for screenreaders\n */\n warningsForScreenreader: testRunnerOptions.timerWarningForScreenreader || {},\n /**\n * The guided navigation option\n */\n guidedNavigation: testRunnerOptions.guidedNavigation,\n /**\n * Restore timer from client.\n */\n restoreTimerFromClient: testRunnerOptions.timer && testRunnerOptions.timer.restoreTimerFromClient,\n /**\n * Questions stats\n */\n questionsStats: stats\n }, this.getConfig());\n\n /**\n * Set up the strategy handler\n */\n const strategyHandler = getStrategyHandler(testRunner);\n\n /**\n * dispatch errors to the test runner\n * @param {Error} err - to dispatch\n */\n const handleError = err => {\n testRunner.trigger('error', err);\n };\n function loadSavedTimers(timeStore) {\n const testContext = testRunner.getTestContext();\n //update the timers before each item\n if (self.timerbox && testContext.timeConstraints) {\n return self.loadTimers(timeStore, config).then(function (timers) {\n return self.timerbox.update(timers);\n }).catch(handleError);\n }\n }\n return new Promise(function (resolve) {\n //load the plugin store\n return testRunner.getPluginStore(self.getName()).then(function (timeStore) {\n testRunner.before('renderitem', function () {\n return loadSavedTimers(timeStore);\n }).before('enableitem', function () {\n if (config.restoreTimerFromClient) {\n return loadSavedTimers(timeStore);\n }\n }).on('tick', function (elapsed) {\n if (self.timerbox) {\n const timers = self.timerbox.getTimers();\n const updatedTimers = Object.keys(timers).reduce((acc, timerName) => {\n const statsScope = statsHelper.getInstantStats(timers[timerName].scope, testRunner);\n const unansweredQuestions = statsScope && statsScope.questions - statsScope.answered;\n acc[timerName] = Object.assign({}, timers[timerName], {\n remainingTime: timers[timerName].remainingTime - elapsed,\n unansweredQuestions\n });\n return acc;\n }, {});\n self.timerbox.update(updatedTimers).catch(handleError);\n }\n }).after('renderitem', function () {\n if (self.timerbox) {\n $$1(self.timerbox.getElement()).find('.timer-wrapper').attr('aria-hidden', isReviewPanelEnabled(testRunner));\n self.timerbox.start();\n }\n self.$screenreaderWarningContainer.text('');\n }).after('enableitem', function () {\n if (self.timerbox && config.restoreTimerFromClient) {\n //this will \"resume\" the countdowns if timers have client mode\n self.timerbox.start();\n }\n }).on('move skip', function () {\n if (self.timerbox) {\n //this will \"pause\" the countdowns\n self.timerbox.stop();\n }\n }).on('disableitem', function () {\n if (self.timerbox && config.restoreTimerFromClient) {\n //this will \"pause\" the countdowns if timers have client mode\n self.timerbox.stop();\n }\n });\n timeStore.getItem('zen-mode').then(function (startZen) {\n //set up the timerbox\n self.timerbox = timerboxFactory({\n ariaHidden: isReviewPanelEnabled(testRunner),\n zenMode: {\n enabled: true,\n startHidden: !!startZen\n },\n displayWarning: config.contextualWarnings\n }).on('change', _.throttle(function () {\n //update the store with the current timer values\n self.saveTimers(timeStore, this.getTimers());\n }, 1000)).on('timeradd', function (timer) {\n strategyHandler.setUp(timer).catch(handleError);\n }).on('timerremove', function (timer) {\n strategyHandler.tearDown(timer).catch(handleError);\n }).on('timerstart', function (timer) {\n strategyHandler.start(timer).catch(handleError);\n }).on('timerstop', function (timer) {\n strategyHandler.stop(timer).catch(handleError);\n }).on('timerend', function (timer) {\n strategyHandler.complete(timer).catch(handleError);\n }).on('timerchange', function (action, timer) {\n //backward compatible events\n self.trigger(`${action}timer`, timer.qtiClassName, timer);\n }).on('zenchange', function (isZen) {\n timeStore.setItem('zen-mode', !!isZen);\n }).on('init', resolve).on('error', handleError);\n\n // share this timer values to use in other components\n self.timerbox.spread(testRunner, 'timertick');\n if (!config.contextualWarnings) {\n self.timerbox.on('warn', function (message, level) {\n if (level && message) {\n testRunner.trigger(level, message);\n }\n });\n\n // debounce used to prevent multiple invoking at the same time\n self.timerbox.on('warnscreenreader', _.debounce((message, remainingTime, scope) => {\n const statsScope = statsHelper.getInstantStats(scope, testRunner);\n const unansweredQuestions = statsScope && statsScope.questions - statsScope.answered;\n if (screenreaderNotifcationTimeoutId) {\n clearTimeout(screenreaderNotifcationTimeoutId);\n }\n self.$screenreaderWarningContainer.text(message(remainingTime, unansweredQuestions));\n screenreaderNotifcationTimeoutId = setTimeout(() => self.$screenreaderWarningContainer.text(''), screenreaderNotificationTimeout);\n }, 1000, {\n 'leading': true,\n 'trailing': false\n }));\n }\n }).catch(handleError);\n });\n });\n },\n /**\n * Called during the runner's render phase\n */\n render: function render() {\n const $container = this.getAreaBroker().getControlArea();\n this.$screenreaderWarningContainer = $$1(screenreaderNotificationTpl());\n this.timerbox.render($container);\n $container.append(this.$screenreaderWarningContainer);\n },\n /**\n * Called during the runner's destroy phase\n */\n destroy: function destroy() {\n if (this.timerbox) {\n this.timerbox.stop().destroy();\n }\n },\n /**\n * Shows the timers\n */\n show: function show() {\n if (this.timerbox) {\n this.timerbox.show();\n }\n },\n /**\n * Hides the timers\n */\n hide: function hide() {\n if (this.timerbox) {\n this.timerbox.hide();\n }\n }\n });\n\n return plugin;\n\n});\n\n","define('taoQtiTest/runner/plugins/controls/title/title',['jquery', 'lodash', 'taoTests/runner/plugin', 'handlebars', 'lib/handlebars/helpers', 'taoQtiTest/runner/helpers/map', 'taoQtiTest/runner/helpers/getTimerMessage', 'moment', 'taoQtiTest/runner/helpers/stats'], function ($$1, _, pluginFactory, Handlebars, Helpers0, mapHelper, getTimerMessage, moment, statsHelper) { 'use strict';\n\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n getTimerMessage = getTimerMessage && Object.prototype.hasOwnProperty.call(getTimerMessage, 'default') ? getTimerMessage['default'] : getTimerMessage;\n moment = moment && Object.prototype.hasOwnProperty.call(moment, 'default') ? moment['default'] : moment;\n statsHelper = statsHelper && Object.prototype.hasOwnProperty.call(statsHelper, 'default') ? statsHelper['default'] : statsHelper;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, functionType=\"function\", escapeExpression=this.escapeExpression, self=this;\n\n function program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\\n \\n
          \\n \";\n return buffer;\n }\n\n buffer += \"
          \\n \";\n stack1 = helpers.each.call(depth0, (depth0 && depth0.titles), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n
          \\n\";\n return buffer;\n });\n function titleTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n const precision = 1000;\n var title = pluginFactory({\n name: 'title',\n init: function init() {\n const testRunner = this.getTestRunner();\n const testMap = testRunner.getTestMap();\n const updateTitles = () => {\n const testContext = testRunner.getTestContext();\n const currentPart = mapHelper.getItemPart(testMap, testContext.itemPosition);\n const currentItem = mapHelper.getItem(testMap, testContext.itemIdentifier);\n\n // update test title\n if (testMap.title) {\n this.titles.test.$title.text(testMap.title).show();\n }\n\n // update part title\n if (currentPart && currentPart.label) {\n this.titles.testPart.$title.text(` - ${currentPart.label}`).show();\n }\n\n // update section title\n //@deprecated the following block seems to\n //be very specific and need to be reworked\n if (testContext.isDeepestSectionVisible) {\n const section = mapHelper.getItemSection(testMap, testContext.itemPosition);\n\n //testContext.sectionTitle is kept only for backward compat\n this.titles.section.$title.text(` - ${section.label || testContext.sectionTitle}`).show();\n }\n\n // update item title\n if (currentItem.label) {\n this.titles.item.$title.text(` - ${currentItem.label}`).show();\n }\n };\n testRunner.after('renderitem', () => {\n _.forOwn(this.titles, (options, scope) => {\n this.titles[scope].$title.text('');\n this.titles[scope].$timer.text('');\n if (scope !== 'item') {\n this.titles[scope].stats = statsHelper.getInstantStats(scope, testRunner);\n }\n });\n updateTitles();\n }).on('timertick', (remainingTime, scope) => {\n const title = this.titles[scope];\n if (!title) {\n return;\n }\n const {\n $timer,\n stats\n } = this.titles[scope];\n const time = moment.duration(remainingTime / precision, 'seconds');\n const hours = time.get('hours');\n const minutes = time.get('minutes');\n const seconds = time.get('seconds');\n const unansweredQuestions = stats && stats.questions - stats.answered;\n\n // check if notification should be updated\n if ($timer) {\n $timer.text(getTimerMessage(hours, minutes, seconds, unansweredQuestions));\n }\n }).on('unloaditem', () => {\n $$1('.qti-controls', this.$element).hide();\n });\n },\n render: function render() {\n const $container = this.getAreaBroker().getControlArea();\n this.titles = {\n test: {\n attribute: 'qti-test-title',\n className: ''\n },\n testPart: {\n attribute: 'qti-test-part-title',\n className: 'visible-hidden'\n },\n section: {\n attribute: 'qti-test-position',\n className: ''\n },\n item: {\n attribute: 'qti-test-item-title',\n className: 'visible-hidden'\n }\n };\n this.$element = $$1(titleTpl({\n titles: _.values(this.titles)\n }));\n\n // hide titles by default\n $$1('.qti-controls', this.$element).hide();\n $container.append(this.$element);\n _.forOwn(this.titles, (_ref, scope) => {\n let {\n attribute\n } = _ref;\n this.titles[scope].$title = $container.find(`[data-control=\"${attribute}\"]`);\n this.titles[scope].$timer = $container.find(`[data-control=\"${attribute}-timer\"]`);\n });\n }\n });\n\n return title;\n\n});\n\n","define('taoQtiTest/runner/plugins/controls/trace/itemTraceVariables',['lodash', 'moment', 'taoTests/runner/plugin'], function (_, moment, pluginFactory) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n moment = moment && Object.prototype.hasOwnProperty.call(moment, 'default') ? moment['default'] : moment;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Duration of a second in the timer's base unit\n * @type {Number}\n */\n var precision = 1000;\n\n /**\n * Gets the current timestamp\n * @returns {Number}\n */\n function timestamp() {\n return Date.now() / precision;\n }\n\n /**\n * Creates the timer plugin\n */\n var itemTraceVariables = pluginFactory({\n name: 'itemTraceVariables',\n /**\n * Install step, add behavior before the lifecycle.\n */\n install: function install() {\n //define the \"trace\" store as \"volatile\" (removed on browser change).\n // the store name is \"trace\" for backward compatibility,\n // best practice is to use the plugin name\n this.getTestRunner().getTestStore().setVolatile('trace');\n },\n /**\n * Initializes the plugin (called during runner's init)\n */\n init: function init() {\n var testRunner = this.getTestRunner();\n var variables = {};\n function onError(err) {\n testRunner.trigger('error', err);\n }\n return testRunner.getPluginStore('trace').then(function (tracesStore) {\n testRunner.after('renderitem enableitem', function () {\n var context = testRunner.getTestContext();\n variables = {\n ITEM_START_TIME_CLIENT: timestamp()\n };\n tracesStore.getItem(context.itemIdentifier).then(function (data) {\n if (data) {\n _.merge(variables, data);\n }\n return tracesStore.setItem(context.itemIdentifier, variables);\n }).catch(onError);\n }).before('move skip exit timeout', function () {\n var context = testRunner.getTestContext();\n variables.ITEM_END_TIME_CLIENT = timestamp();\n variables.ITEM_TIMEZONE = moment().utcOffset(moment().utcOffset()).format('Z');\n return tracesStore.setItem(context.itemIdentifier, variables).catch(onError);\n }).before('unloaditem', function () {\n var context = testRunner.getTestContext();\n return testRunner.getProxy().callItemAction(context.itemIdentifier, 'storeTraceData', {\n traceData: JSON.stringify(variables)\n }, true);\n });\n });\n }\n });\n\n return itemTraceVariables;\n\n});\n\n","define('taoQtiTest/runner/plugins/navigation/allowSkipping',['lodash', 'i18n', 'taoTests/runner/plugin', 'taoQtiTest/runner/helpers/currentItem'], function (_, __, pluginFactory, currentItemHelper) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n currentItemHelper = currentItemHelper && Object.prototype.hasOwnProperty.call(currentItemHelper, 'default') ? currentItemHelper['default'] : currentItemHelper;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017-2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Default plugin options\n * @type {Object}\n */\n var defaults = {\n allowPartial: true // whether all interactions must be answered to count an item as answered\n };\n\n /**\n * Plugin factory\n * @returns {Object}\n */\n var allowSkipping = pluginFactory({\n /**\n * Plugin name\n * @type {String}\n */\n name: 'allowSkipping',\n /**\n * Initialize plugin (called during runner's initialization)\n * @returns {this}\n */\n init() {\n const testRunner = this.getTestRunner();\n const testRunnerOptions = testRunner.getOptions();\n const pluginConfig = Object.assign({}, defaults, this.getConfig());\n testRunner.before('nav-next move', () => {\n const testContext = testRunner.getTestContext();\n const isInteracting = !testRunner.getItemState(testContext.itemIdentifier, 'disabled');\n const warning = pluginConfig.allowPartial ? __('A response to this item is required.') : __('A response to every question in this item is required.');\n if (isInteracting && testRunnerOptions.enableAllowSkipping) {\n const currenItem = testRunner.getCurrentItem();\n //@deprecated use allowSkipping from testMap instead of the testContext\n const allowSkipping = typeof currenItem.allowSkipping === 'boolean' ? currenItem.allowSkipping : testContext.allowSkipping;\n if (!allowSkipping) {\n return new Promise((resolve, reject) => {\n if (_.size(currentItemHelper.getDeclarations(testRunner)) === 0) {\n return resolve();\n }\n if (currentItemHelper.isAnswered(testRunner, pluginConfig.allowPartial)) {\n return resolve();\n }\n if (!testRunner.getState('alerted.notallowed')) {\n // Only show one alert for itemSessionControl\n\n testRunner.setState('alerted.notallowed', true);\n testRunner.trigger('alert.notallowed', warning, () => {\n testRunner.trigger('resumeitem');\n reject();\n testRunner.setState('alerted.notallowed', false);\n });\n }\n });\n }\n }\n });\n }\n });\n\n return allowSkipping;\n\n});\n\n","define('taoQtiTest/runner/plugins/navigation/next/nextWarningHelper',[],function () { 'use strict';\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * This is a helper for navigation plugins. It decides if a warning should be displayed\n * before actually moving to the next item\n *\n * @author Christophe Noël \n */\n\n /**\n * Convert a value to a boolean\n * @param {*} value\n * @param {Boolean} defaultValue\n * @returns {Boolean}\n */\n var toBoolean = function toBoolean(value, defaultValue) {\n if (typeof value === 'undefined') {\n return defaultValue;\n } else {\n return value === true || value === 'true';\n }\n };\n\n /**\n * @param {Object} options\n * @param {Boolean} options.endTestWarning - enables the end test warning, when applicable\n * @param {Boolean} options.isLast - if the item is the last of the test\n * @param {Boolean} options.isLinear - if the current part is linear\n * @param {Boolean} options.nextItemWarning - enables the next item warning, when applicable\n * @param {Boolean} options.nextPartWarning - enables the next item warning on part change\n * @param {Boolean} options.stats - current state of the test\n * @param {Object} options.nextPart - description of the next part of the test\n * @param {Number} options.remainingAttempts - remaining attempts for the current item\n * @param {String} options.testPartId - current test part identifier\n * @param {Boolean} options.unansweredOnly - warn only if there are unanswered/flagged items\n * @returns {Object}\n */\n var nextWarningHelper = function nextWarningHelper(options) {\n var endTestWarning = toBoolean(options.endTestWarning, false),\n isLast = toBoolean(options.isLast, false),\n isLinear = toBoolean(options.isLinear, false),\n nextItemWarning = toBoolean(options.nextItemWarning, false),\n nextPartWarning = toBoolean(options.nextPartWarning, false),\n stats = options.stats,\n nextPart = options.nextPart || {},\n remainingAttempts = typeof options.remainingAttempts === 'undefined' ? -1 : options.remainingAttempts,\n testPartId = options.testPartId || '',\n unansweredOnly = toBoolean(options.unansweredOnly, false),\n warnBeforeNext = shouldWarnBeforeNext(),\n warnBeforeEnd = shouldWarnBeforeEnd(),\n warnBeforeEndPart = shouldWarnBeforeEndPart();\n\n /**\n * Decide if we should display a warning before moving to the next item.\n * This is useful to prevent accidental navigation (for example by pressing a shortcut) that would occur\n * before the test taker actually gets a chance to answer an item\n */\n function shouldWarnBeforeNext() {\n return nextItemWarning && !itemCanBeTriedAtWill();\n //&& !exitTimedSectionWarning(); //todo: this should be implemented to prevent a double warning!\n }\n\n /**\n * We try to decide if the test taker has the freedom to come back to this item as many times as he wants\n */\n function itemCanBeTriedAtWill() {\n return isLast === false &&\n // the test is not over\n isLinear === false &&\n // the context is not linear\n remainingAttempts === -1 &&\n // the item doesn't have a configured max attempts number\n !isNextItemInLinearPart() // the next item is not in a linear part\n ;\n }\n\n /**\n * Check if the next item is in a linear part, as this would prevent the test taker to come back to the current item\n */\n function isNextItemInLinearPart() {\n return nextPart && typeof nextPart.isLinear !== 'undefined' && isLastOfPart() && nextPart.isLinear === true;\n }\n\n /**\n * Decide if we should display a warning before ending the test\n */\n function shouldWarnBeforeEnd() {\n return shouldWarnOnTestEnd();\n }\n\n /**\n * Decide if we should display a warning before ending the test part\n */\n function shouldWarnBeforeEndPart() {\n return shouldWarnOnPartChange();\n }\n\n /**\n * Are we on the last test item?\n * @returns {Boolean}\n */\n function shouldWarnOnTestEnd() {\n return isLast && (endTestWarning ||\n // warning is explicitly required by endTestWarning category\n warnBeforeNext) &&\n // warning is implicitly triggered by the next item warning being true (prevent double warning)\n shouldWarnForUnansweredItems();\n }\n\n /**\n * Provide the opportunity to cancel the display of the warning if there are no unanswered/flagged item\n * for this to work, the unansweredOnly option has to be set\n * @returns {Boolean}\n */\n function shouldWarnForUnansweredItems() {\n var hasUnanswered = stats && stats.questions - stats.answered !== 0,\n hasFlagged = stats && stats.flagged !== 0;\n if (unansweredOnly) {\n return hasUnanswered || hasFlagged;\n } else {\n return true;\n }\n }\n\n /**\n * Are we on the last part item?\n * @returns {Boolean}\n */\n function shouldWarnOnPartChange() {\n return nextPartWarning && isLastOfPart() && shouldWarnForUnansweredItems();\n }\n\n /**\n * Check if the next item belong to a different part\n * @returns {Boolean}\n */\n function isLastOfPart() {\n return nextPart && nextPart.id && testPartId !== nextPart.id;\n }\n\n /**\n * The helper object\n */\n return {\n shouldWarnBeforeEndPart: function () {\n return warnBeforeEndPart;\n },\n shouldWarnBeforeEnd: function () {\n return warnBeforeEnd;\n },\n shouldWarnBeforeNext: function () {\n return warnBeforeNext;\n }\n };\n };\n\n return nextWarningHelper;\n\n});\n\n","define('taoQtiTest/runner/plugins/navigation/next',['jquery', 'i18n', 'ui/hider', 'taoTests/runner/plugin', 'taoQtiTest/runner/plugins/navigation/next/nextWarningHelper', 'taoQtiTest/runner/helpers/messages', 'taoQtiTest/runner/helpers/map', 'taoQtiTest/runner/helpers/navigation', 'taoQtiTest/runner/helpers/stats', 'util/shortcut', 'util/namespace', 'handlebars', 'lib/handlebars/helpers'], function ($$1, __, hider, pluginFactory, nextWarningHelper, messages, mapHelper, navigationHelper, statsHelper, shortcut, namespaceHelper, Handlebars, Helpers0) { 'use strict';\n\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n hider = hider && Object.prototype.hasOwnProperty.call(hider, 'default') ? hider['default'] : hider;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n nextWarningHelper = nextWarningHelper && Object.prototype.hasOwnProperty.call(nextWarningHelper, 'default') ? nextWarningHelper['default'] : nextWarningHelper;\n messages = messages && Object.prototype.hasOwnProperty.call(messages, 'default') ? messages['default'] : messages;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n navigationHelper = navigationHelper && Object.prototype.hasOwnProperty.call(navigationHelper, 'default') ? navigationHelper['default'] : navigationHelper;\n statsHelper = statsHelper && Object.prototype.hasOwnProperty.call(statsHelper, 'default') ? statsHelper['default'] : statsHelper;\n shortcut = shortcut && Object.prototype.hasOwnProperty.call(shortcut, 'default') ? shortcut['default'] : shortcut;\n namespaceHelper = namespaceHelper && Object.prototype.hasOwnProperty.call(namespaceHelper, 'default') ? namespaceHelper['default'] : namespaceHelper;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, functionType=\"function\", escapeExpression=this.escapeExpression, self=this;\n\n function program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \" \";\n if (helper = helpers.className) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.className); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1);\n return buffer;\n }\n\n function program3(depth0,data) {\n \n var buffer = \"\", stack1;\n buffer += \"\\n aria-\"\n + escapeExpression(((stack1 = (data == null || data === false ? data : data.key)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1))\n + \"=\\\"\"\n + escapeExpression((typeof depth0 === functionType ? depth0.apply(depth0) : depth0))\n + \"\\\"\\n \";\n return buffer;\n }\n\n function program5(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\";\n return buffer;\n }\n function program6(depth0,data) {\n \n \n return \" no-label\";\n }\n\n function program8(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\";\n if (helper = helpers.text) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.text); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\";\n return buffer;\n }\n\n buffer += \"\\n \\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.icon), {hash:{},inverse:self.noop,fn:self.program(5, program5, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.text), {hash:{},inverse:self.noop,fn:self.program(8, program8, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \\n\\n\";\n return buffer;\n });\n function buttonTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * The display of the next button\n */\n const buttonData = {\n next: {\n control: 'move-forward',\n title: __('Submit and go to the next item'),\n specificTitle: __('Submit and go to the item %s'),\n icon: 'forward',\n text: __('Next')\n },\n end: {\n control: 'move-end',\n title: __('Submit and go to the end of the test'),\n icon: 'fast-forward',\n text: __('End test')\n }\n };\n\n /**\n * Create the button based on the current context\n * @param {Boolean} [isLast=false] - is the current item the last\n * @returns {jQueryElement} the button\n */\n const createElement = function () {\n let isLast = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n const dataType = isLast ? 'end' : 'next';\n return $$1(buttonTpl(buttonData[dataType]));\n };\n\n /**\n * Makes an element enabled\n * @param {jQuery} $element\n * @returns {jQuery}\n */\n const enableElement = $element => $element.removeProp('disabled').removeClass('disabled');\n\n /**\n * Makes an element disabled\n * @param {jQuery} $element\n * @returns {jQuery}\n */\n const disableElement = $element => $element.prop('disabled', true).addClass('disabled');\n\n /**\n * Update the button based on the context\n * @param {jQueryElement} $element - the element to update\n * @param {TestRunner} [testRunner] - the test runner instance\n * @param {Boolean} [isLast=false] - is the current item the last\n */\n const updateElement = function ($element, testRunner) {\n let isLast = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n const dataType = isLast ? 'end' : 'next';\n const testContext = testRunner.getTestContext();\n if (dataType === 'next' && !testContext.isAdaptive && !testContext.isCatAdaptive) {\n const testMap = testRunner.getTestMap();\n const nextItem = navigationHelper.getNextItem(testMap, testContext.itemPosition);\n $element.attr('title', __(buttonData.next.specificTitle, nextItem.label));\n } else {\n $element.attr('title', buttonData[dataType].title);\n }\n if ($element.attr('data-control') !== buttonData[dataType].control) {\n $element.attr('data-control', buttonData[dataType].control).find('.text').text(buttonData[dataType].text);\n if (dataType === 'next') {\n $element.find(`.icon-${buttonData.end.icon}`).removeClass(`icon-${buttonData.end.icon}`).addClass(`icon-${buttonData.next.icon}`);\n } else {\n $element.find(`.icon-${buttonData.next.icon}`).removeClass(`icon-${buttonData.next.icon}`).addClass(`icon-${buttonData.end.icon}`);\n }\n }\n };\n\n /**\n * Returns the configured plugin\n */\n var next = pluginFactory({\n name: 'next',\n /**\n * Initialize the plugin (called during runner's init)\n */\n init() {\n const testRunner = this.getTestRunner();\n const testRunnerOptions = testRunner.getOptions();\n const pluginShortcuts = (testRunnerOptions.shortcuts || {})[this.getName()] || {};\n\n /**\n * Check if the current item is the last item\n * @returns {Boolean} true if the last\n */\n const isLastItem = () => {\n const testContext = testRunner.getTestContext();\n const testMap = testRunner.getTestMap();\n const itemIdentifier = testContext.itemIdentifier;\n return navigationHelper.isLast(testMap, itemIdentifier);\n };\n\n //plugin behavior\n /**\n * @param {Boolean} nextItemWarning - enable the display of a warning when going to the next item.\n * Note: the actual display of the warning depends on other conditions (see nextWarningHelper)\n */\n const doNext = nextItemWarning => {\n const testContext = testRunner.getTestContext();\n const testMap = testRunner.getTestMap();\n const testPart = testRunner.getCurrentPart();\n const nextItemPosition = testContext.itemPosition + 1;\n const itemIdentifier = testContext.itemIdentifier;\n\n // x-tao-option-unansweredWarning is a deprecated option whose behavior now matches the one of\n const unansweredWarning = mapHelper.hasItemCategory(testMap, itemIdentifier, 'unansweredWarning', true);\n\n // x-tao-option-nextPartWarning with the unansweredOnly option\n const nextPartWarning = mapHelper.hasItemCategory(testMap, itemIdentifier, 'nextPartWarning', true) || unansweredWarning;\n const endTestWarning = mapHelper.hasItemCategory(testMap, itemIdentifier, 'endTestWarning', true);\n\n // this check to avoid an edge case where having both endTestWarning\n // and unansweredWarning options would prevent endTestWarning to behave normally\n const unansweredOnly = !endTestWarning && unansweredWarning;\n const warningScope = nextPartWarning ? 'part' : 'test';\n const enableNav = () => testRunner.trigger('enablenav');\n const triggerNextAction = () => {\n if (isLastItem()) {\n this.trigger('end');\n }\n testRunner.next();\n };\n testRunner.trigger('disablenav');\n if (this.getState('enabled') !== false) {\n const warningHelper = nextWarningHelper({\n endTestWarning: endTestWarning,\n isLast: isLastItem(),\n isLinear: testPart.isLinear,\n nextItemWarning: nextItemWarning,\n nextPartWarning: nextPartWarning,\n nextPart: mapHelper.getItemPart(testMap, nextItemPosition),\n remainingAttempts: testContext.remainingAttempts,\n testPartId: testContext.testPartId,\n unansweredWarning: unansweredWarning,\n stats: statsHelper.getInstantStats(warningScope, testRunner),\n unansweredOnly: unansweredOnly\n });\n if (warningHelper.shouldWarnBeforeEndPart()) {\n const submitButtonLabel = __('SUBMIT THIS PART');\n testRunner.trigger('confirm.endTestPart', messages.getExitMessage(warningScope, testRunner, '', false, submitButtonLabel), triggerNextAction,\n // if the test taker accept\n enableNav,\n // if he refuse\n {\n buttons: {\n labels: {\n ok: submitButtonLabel,\n cancel: __('CANCEL')\n }\n }\n });\n } else if (warningHelper.shouldWarnBeforeEnd()) {\n const submitButtonLabel = __('SUBMIT THE TEST');\n testRunner.trigger('confirm.endTest', messages.getExitMessage(warningScope, testRunner, '', false, submitButtonLabel), triggerNextAction,\n // if the test taker accept\n enableNav,\n // if he refuse\n {\n buttons: {\n labels: {\n ok: submitButtonLabel,\n cancel: __('CANCEL')\n }\n }\n });\n } else if (warningHelper.shouldWarnBeforeNext()) {\n testRunner.trigger('confirm.next', __('You are about to go to the next item. Click OK to continue and go to the next item.'), triggerNextAction,\n // if the test taker accept\n enableNav // if he refuse\n );\n } else {\n triggerNextAction();\n }\n }\n };\n\n //create the button (detached)\n this.$element = createElement(isLastItem());\n\n //attach behavior\n this.$element.on('click', e => {\n e.preventDefault();\n disableElement(this.$element);\n testRunner.trigger('nav-next');\n });\n const registerShortcut = kbdShortcut => {\n if (testRunnerOptions.allowShortcuts && kbdShortcut) {\n shortcut.add(namespaceHelper.namespaceAll(kbdShortcut, this.getName(), true), () => {\n if (this.getState('enabled') === true) {\n testRunner.trigger('nav-next', true);\n }\n }, {\n avoidInput: true,\n prevent: true\n });\n }\n };\n registerShortcut(pluginShortcuts.trigger);\n\n //disabled by default\n this.disable();\n\n //change plugin state\n testRunner.on('loaditem', () => {\n updateElement(this.$element, testRunner, isLastItem());\n }).on('enablenav', () => this.enable()).on('disablenav', () => this.disable()).on('hidenav', () => this.hide()).on('shownav', () => this.show()).on('nav-next', nextItemWarning => doNext(nextItemWarning)).on('enableaccessibilitymode', () => {\n const kbdShortcut = pluginShortcuts.triggerAccessibility;\n if (kbdShortcut && !this.getState('eaccessibilitymode')) {\n shortcut.remove(`.${this.getName()}`);\n registerShortcut(kbdShortcut);\n this.setState('eaccessibilitymode');\n }\n });\n },\n /**\n * Called during the runner's render phase\n */\n render() {\n //attach the element to the navigation area\n const $container = this.getAreaBroker().getNavigationArea();\n $container.append(this.$element);\n },\n /**\n * Called during the runner's destroy phase\n */\n destroy() {\n shortcut.remove(`.${this.getName()}`);\n this.$element.remove();\n },\n /**\n * Enable the button\n */\n enable() {\n enableElement(this.$element);\n },\n /**\n * Disable the button\n */\n disable() {\n disableElement(this.$element);\n },\n /**\n * Show the button\n */\n show() {\n hider.show(this.$element);\n },\n /**\n * Hide the button\n */\n hide() {\n hider.hide(this.$element);\n }\n });\n\n return next;\n\n});\n\n","define('taoQtiTest/runner/plugins/navigation/next/dialogConfirmNext',['jquery', 'lodash', 'i18n', 'ui/dialog', 'handlebars', 'lib/handlebars/helpers'], function ($$1, _, __, dialog, Handlebars, Helpers0) { 'use strict';\n\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n dialog = dialog && Object.prototype.hasOwnProperty.call(dialog, 'default') ? dialog['default'] : dialog;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, functionType=\"function\", escapeExpression=this.escapeExpression, self=this;\n\n function program1(depth0,data) {\n \n \n return \"checked\";\n }\n\n buffer += \"\";\n return buffer;\n });\n function checkboxTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Displays a confirmation dialog with a checkbox in it\n *\n * @param {String} heading - Above the main message\n * @param {String} message - The displayed message\n * @param {Function} accept - An action called when the dialog is accepted\n * @param {Function} refuse - An action called when the dialog is refused\n * @param {Object} checkboxParams - Checkbox options\n * @param {Boolean} [checkboxParams.checked] - True to render it checked\n * @param {Function} [checkboxParams.submitChecked] - Action called when dialog accepted with checkbox checked\n * @param {Function} [checkboxParams.submitUnchecked] - Action called when dialog accepted with checkbox unchecked\n * @returns {dialog} - Returns the dialog instance\n */\n function dialogConfirmNext(heading, message, accept, refuse, checkboxParams, dialogOptions) {\n var accepted = false;\n var dlg;\n var content = null;\n if (checkboxParams && checkboxParams.checked !== true) {\n content = checkboxTpl({\n checked: false,\n text: \"Don't show this again next time\",\n id: 'dont-show-again'\n });\n }\n dialogOptions = _.defaults({\n heading: heading,\n message: message,\n content: content,\n autoRender: true,\n autoDestroy: true,\n buttons: [{\n id: 'cancel',\n type: 'regular',\n label: __('Cancel'),\n close: true\n }, {\n id: 'ok',\n type: 'info',\n label: __('Go to next item'),\n close: true\n }],\n onOkBtn: function onOkBtn() {\n var $checkbox;\n accepted = true;\n if (_.isFunction(accept)) {\n accept.call(this);\n if (checkboxParams) {\n // handle checkbox callbacks:\n $checkbox = $$1('input[name=\"dont-show-again\"]', this);\n if ($checkbox.prop('checked') && _.isFunction(checkboxParams.submitChecked)) {\n checkboxParams.submitChecked();\n } else if (!$checkbox.prop('checked') && _.isFunction(checkboxParams.submitUnchecked)) {\n checkboxParams.submitUnchecked();\n }\n }\n }\n }\n }, dialogOptions);\n dlg = dialog(dialogOptions);\n if (_.isFunction(refuse)) {\n dlg.on('closed.modal', function () {\n if (!accepted) {\n refuse.call(this);\n }\n });\n }\n return dlg;\n }\n\n return dialogConfirmNext;\n\n});\n\n","define('taoQtiTest/runner/plugins/navigation/next/linearNextItemWarning',['i18n', 'taoTests/runner/plugin', 'taoQtiTest/runner/helpers/map', 'taoQtiTest/runner/helpers/currentItem', 'taoQtiTest/runner/plugins/navigation/next/dialogConfirmNext', 'taoQtiTest/runner/helpers/navigation'], function (__, pluginFactory, mapHelper, currentItemHelper, dialogConfirmNext, navigationHelper) { 'use strict';\n\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n currentItemHelper = currentItemHelper && Object.prototype.hasOwnProperty.call(currentItemHelper, 'default') ? currentItemHelper['default'] : currentItemHelper;\n dialogConfirmNext = dialogConfirmNext && Object.prototype.hasOwnProperty.call(dialogConfirmNext, 'default') ? dialogConfirmNext['default'] : dialogConfirmNext;\n navigationHelper = navigationHelper && Object.prototype.hasOwnProperty.call(navigationHelper, 'default') ? navigationHelper['default'] : navigationHelper;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Returns the configured plugin\n */\n var linearNextItemWarning = pluginFactory({\n name: 'linearNextItemWarning',\n /**\n * Initialize the plugin (called during runner's init)\n */\n init() {\n const self = this;\n const testRunner = this.getTestRunner();\n const testRunnerOptions = testRunner.getOptions();\n const testStore = testRunner.getTestStore(); // we'll store user's checkbox choice in here\n testStore.setVolatile(self.getName());\n\n /**\n * Retrieve the required categories of the current item\n * @returns {Object} the calculator categories\n */\n function getNextItemCategories() {\n const testContext = testRunner.getTestContext();\n const testMap = testRunner.getTestMap();\n return {\n nextPartWarning: mapHelper.hasItemCategory(testMap, testContext.itemIdentifier, 'nextPartWarning', true),\n nextSectionWarning: mapHelper.hasItemCategory(testMap, testContext.itemIdentifier, 'nextSectionWarning', true)\n };\n }\n\n /**\n * Provides different variants of message text\n * @param {String} action - 'next' or 'skip'\n * @returns {String}\n */\n function getCustomNextMessage(action) {\n var customNextMessage;\n var itemPartiallyAnswered = currentItemHelper.isAnswered(testRunner, true);\n if (!itemPartiallyAnswered) {\n customNextMessage = __('Are you sure you want to go to the next item? You will not be able to go back and provide an answer.');\n } else if (action === 'next') {\n customNextMessage = __('Are you sure you want to go to the next item? You will not be able to go back and change your answer.');\n } else if (action === 'skip') {\n customNextMessage = __('Are you sure you want to clear your answer and go to the next item? You will not be able to go back and provide an answer.');\n } else {\n // more generic message for default case:\n customNextMessage = __('Are you sure you want to go to the next item? You will not be able to go back.');\n }\n return customNextMessage;\n }\n\n //plugin behavior\n /**\n * Checks configuration, shows a dialog asking to confirm the nav action\n *\n * @param {String} action - 'next' or 'skip'\n * @returns {Promise} - resolves if dialog accepted or not shown, rejects if dialog cancelled\n */\n function doNextWarning(action) {\n testRunner.trigger('disablenav');\n\n // Load testStore checkbox value (async)\n return testStore.getStore(self.getName()).then(function (store) {\n return store.getItem('dontShowLinearNextItemWarning').then(function (checkboxValue) {\n var checkboxParams = null;\n\n // Show the warning unless user has turned it off:\n if (checkboxValue !== true) {\n // Define checkbox only if enabled by config:\n if (testRunnerOptions.enableLinearNextItemWarningCheckbox) {\n checkboxParams = {\n checked: checkboxValue,\n submitChecked: function () {\n store.setItem('dontShowLinearNextItemWarning', true);\n },\n submitUnchecked: function () {\n store.setItem('dontShowLinearNextItemWarning', false);\n }\n };\n }\n return new Promise(function (resolve, reject) {\n // show special dialog:\n dialogConfirmNext(__('Go to the next item?'), getCustomNextMessage(action), resolve,\n // if the test taker accepts\n function cancel() {\n // if he refuses\n reject({\n cancel: true\n });\n }, checkboxParams);\n });\n }\n });\n }).catch(function (err) {\n // if the rejection is due to an error, rethrow it\n if (err && err instanceof Error) {\n throw err;\n }\n if (err && err.cancel === true) {\n testRunner.trigger('enablenav');\n return Promise.reject(); // to cancel the move\n }\n });\n }\n\n // Attach this plugin to 'next' & 'skip' events\n testRunner.on('init', function () {\n // Clear the stored checkbox value before each test:\n testStore.getStore(self.getName()).then(function (store) {\n store.setItem('dontShowLinearNextItemWarning', null);\n });\n }).before('move skip', function (e, type, scope) {\n const context = testRunner.getTestContext();\n const map = testRunner.getTestMap();\n const item = testRunner.getCurrentItem();\n const currentPart = testRunner.getCurrentPart();\n const categories = getNextItemCategories();\n const isLast = navigationHelper.isLast(map, context.itemIdentifier);\n if (currentPart && currentPart.isLinear) {\n // Do nothing if nextSection warning imminent:\n if (scope === 'section' && categories.nextSectionWarning) {\n return;\n // Do nothing if endOfPart warning imminent:\n } else if (categories.nextPartWarning) {\n return;\n // Do nothing if 'informational item':\n } else if (item.informational) {\n return;\n // Show dialog if conditions met:\n } else if (type === 'next' && !isLast && testRunnerOptions.forceEnableLinearNextItemWarning) {\n return doNextWarning('next');\n } else if (e.name === 'skip' && !isLast && testRunnerOptions.forceEnableLinearNextItemWarning) {\n return doNextWarning('skip');\n }\n }\n });\n }\n });\n\n return linearNextItemWarning;\n\n});\n\n","define('taoQtiTest/runner/plugins/navigation/nextSection',['jquery', 'lodash', 'i18n', 'ui/hider', 'taoTests/runner/plugin', 'taoQtiTest/runner/helpers/messages', 'handlebars', 'lib/handlebars/helpers', 'taoQtiTest/runner/helpers/map'], function ($$1, _, __, hider, pluginFactory, messages, Handlebars, Helpers0, mapHelper) { 'use strict';\n\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n hider = hider && Object.prototype.hasOwnProperty.call(hider, 'default') ? hider['default'] : hider;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n messages = messages && Object.prototype.hasOwnProperty.call(messages, 'default') ? messages['default'] : messages;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, functionType=\"function\", escapeExpression=this.escapeExpression, self=this;\n\n function program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \" \";\n if (helper = helpers.className) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.className); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1);\n return buffer;\n }\n\n function program3(depth0,data) {\n \n var buffer = \"\", stack1;\n buffer += \"\\n aria-\"\n + escapeExpression(((stack1 = (data == null || data === false ? data : data.key)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1))\n + \"=\\\"\"\n + escapeExpression((typeof depth0 === functionType ? depth0.apply(depth0) : depth0))\n + \"\\\"\\n \";\n return buffer;\n }\n\n function program5(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\";\n return buffer;\n }\n function program6(depth0,data) {\n \n \n return \" no-label\";\n }\n\n function program8(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\";\n if (helper = helpers.text) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.text); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\";\n return buffer;\n }\n\n buffer += \"\\n \\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.icon), {hash:{},inverse:self.noop,fn:self.program(5, program5, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.text), {hash:{},inverse:self.noop,fn:self.program(8, program8, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \\n\\n\";\n return buffer;\n });\n function buttonTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2015-2019 (original work) Open Assessment Technologies SA ;\n */\n var nextSection = pluginFactory({\n name: 'nextsection',\n init() {\n const self = this;\n const testRunner = this.getTestRunner();\n const testRunnerOptions = testRunner.getOptions();\n\n /**\n * Retrieve the nexSection categories of the current item\n * @returns {Object} the calculator categories\n */\n function getNextSectionCategories() {\n const testContext = testRunner.getTestContext();\n const testMap = testRunner.getTestMap();\n return {\n nextSection: mapHelper.hasItemCategory(testMap, testContext.itemIdentifier, 'nextSection', true),\n nextSectionWarning: mapHelper.hasItemCategory(testMap, testContext.itemIdentifier, 'nextSectionWarning', true),\n noExitTimedSectionWarning: mapHelper.hasItemCategory(testMap, testContext.itemIdentifier, 'noExitTimedSectionWarning', true)\n };\n }\n function toggle() {\n const categories = getNextSectionCategories();\n if (testRunnerOptions.nextSection && (categories.nextSection || categories.nextSectionWarning)) {\n self.show();\n } else {\n self.hide();\n }\n }\n function nextSection() {\n testRunner.next('section');\n }\n\n /**\n * Check if warn section leaving dialog enabled to prevent showing double dialogs\n * @returns {Boolean}\n */\n const isWarnSectionLeavingEabled = () => {\n const testContext = testRunner.getTestContext();\n const categories = getNextSectionCategories();\n const timeConstraints = testContext.timeConstraints || [];\n return timeConstraints.some(_ref => {\n let {\n source\n } = _ref;\n return source === testContext.sectionId;\n }) && !categories.noExitTimedSectionWarning && !(testRunnerOptions.timer || {}).keepUpToTimeout;\n };\n this.$element = $$1(buttonTpl({\n control: 'next-section',\n title: __('Skip to the next section'),\n icon: 'fast-forward',\n text: __('Next Section')\n }));\n this.$element.on('click', function (e) {\n const enable = _.bind(self.enable, self);\n const categories = getNextSectionCategories();\n e.preventDefault();\n if (self.getState('enabled') !== false) {\n self.disable();\n if (categories.nextSectionWarning && !isWarnSectionLeavingEabled()) {\n const submitButtonLabel = __('CONTINUE TO THE NEXT SECTION');\n testRunner.trigger('confirm.nextsection', messages.getExitMessage('section', testRunner, '', false, submitButtonLabel), nextSection,\n // if the test taker accept\n enable,\n // if the test taker refuse\n {\n buttons: {\n labels: {\n ok: submitButtonLabel,\n cancel: __('CANCEL')\n }\n }\n });\n } else {\n nextSection();\n }\n }\n });\n this.disable();\n toggle();\n testRunner.on('loaditem', toggle).on('enablenav', function () {\n self.enable();\n }).on('disablenav', function () {\n self.disable();\n }).on('hidenav', function () {\n self.hide();\n }).on('shownav', function () {\n self.show();\n });\n },\n /**\n * Called during the runner's render phase\n */\n render: function render() {\n //attach the element to the navigation area\n var $container = this.getAreaBroker().getNavigationArea();\n $container.append(this.$element);\n },\n /**\n * Called during the runner's destroy phase\n */\n destroy: function destroy() {\n this.$element.remove();\n },\n /**\n * Enable the button\n */\n enable: function enable() {\n this.$element.removeProp('disabled').removeClass('disabled');\n },\n /**\n * Disable the button\n */\n disable: function disable() {\n this.$element.prop('disabled', true).addClass('disabled');\n },\n /**\n * Show the button\n */\n show: function show() {\n hider.show(this.$element);\n },\n /**\n * Hide the button\n */\n hide: function hide() {\n hider.hide(this.$element);\n }\n });\n\n return nextSection;\n\n});\n\n","define('taoQtiTest/runner/plugins/navigation/previous',['jquery', 'lodash', 'i18n', 'ui/hider', 'taoTests/runner/plugin', 'util/shortcut', 'util/namespace', 'taoQtiTest/runner/helpers/navigation', 'taoQtiTest/runner/helpers/map', 'handlebars', 'lib/handlebars/helpers'], function ($$1, _, __, hider, pluginFactory, shortcut, namespaceHelper, navigationHelper, mapHelper, Handlebars, Helpers0) { 'use strict';\n\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n hider = hider && Object.prototype.hasOwnProperty.call(hider, 'default') ? hider['default'] : hider;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n shortcut = shortcut && Object.prototype.hasOwnProperty.call(shortcut, 'default') ? shortcut['default'] : shortcut;\n namespaceHelper = namespaceHelper && Object.prototype.hasOwnProperty.call(namespaceHelper, 'default') ? namespaceHelper['default'] : namespaceHelper;\n navigationHelper = navigationHelper && Object.prototype.hasOwnProperty.call(navigationHelper, 'default') ? navigationHelper['default'] : navigationHelper;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, functionType=\"function\", escapeExpression=this.escapeExpression, self=this;\n\n function program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \" \";\n if (helper = helpers.className) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.className); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1);\n return buffer;\n }\n\n function program3(depth0,data) {\n \n var buffer = \"\", stack1;\n buffer += \"\\n aria-\"\n + escapeExpression(((stack1 = (data == null || data === false ? data : data.key)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1))\n + \"=\\\"\"\n + escapeExpression((typeof depth0 === functionType ? depth0.apply(depth0) : depth0))\n + \"\\\"\\n \";\n return buffer;\n }\n\n function program5(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\";\n return buffer;\n }\n function program6(depth0,data) {\n \n \n return \" no-label\";\n }\n\n function program8(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\";\n if (helper = helpers.text) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.text); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\";\n return buffer;\n }\n\n buffer += \"\\n \\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.icon), {hash:{},inverse:self.noop,fn:self.program(5, program5, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.text), {hash:{},inverse:self.noop,fn:self.program(8, program8, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \\n\\n\";\n return buffer;\n });\n function buttonTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Returns the configured plugin\n */\n var previous = pluginFactory({\n name: 'previous',\n /**\n * Initialize the plugin (called during runner's init)\n */\n init() {\n const self = this;\n const testRunner = this.getTestRunner();\n const testRunnerOptions = testRunner.getOptions();\n const pluginShortcuts = (testRunnerOptions.shortcuts || {})[this.getName()] || {};\n\n /**\n * Check if the \"Previous\" functionality should be available or not\n */\n var canDoPrevious = function canDoPrevious() {\n const testMap = testRunner.getTestMap();\n const context = testRunner.getTestContext();\n const currentSection = testRunner.getCurrentSection();\n const noExitTimedSectionWarning = mapHelper.hasItemCategory(testMap, context.itemIdentifier, 'noExitTimedSectionWarning', true);\n const currentPart = testRunner.getCurrentPart();\n let previousSection;\n let previousPart;\n\n // check TestMap if empty\n if (_.isPlainObject(testMap) && _.size(testMap) === 0) {\n return false;\n }\n\n //first item of the test\n if (navigationHelper.isFirst(testMap, context.itemIdentifier)) {\n return false;\n }\n\n //first item of a section\n if (navigationHelper.isFirstOf(testMap, context.itemIdentifier, 'section')) {\n //when entering an adaptive section,\n //you can't leave the section from the beginning\n if (currentSection.isCatAdaptive) {\n return false;\n }\n\n //if the previous section is adaptive or a timed section\n previousSection = mapHelper.getItemSection(testMap, context.itemPosition - 1);\n if (previousSection.isCatAdaptive || previousSection.timeConstraint && !noExitTimedSectionWarning) {\n return false;\n }\n }\n if (navigationHelper.isFirstOf(testMap, context.itemIdentifier, 'part')) {\n //if the previous part is linear, we don't enter it too\n previousPart = mapHelper.getItemPart(testMap, context.itemPosition - 1);\n if (previousPart.isLinear) {\n return false;\n }\n }\n return currentPart.isLinear === false && context.canMoveBackward === true;\n };\n\n /**\n * Hide the plugin if the Previous functionality shouldn't be available\n */\n var toggle = function toggle() {\n if (canDoPrevious()) {\n self.show();\n } else {\n self.hide();\n }\n };\n\n //build element (detached)\n this.$element = $$1(buttonTpl({\n control: 'move-backward',\n title: __('Submit and go to the previous item'),\n icon: 'backward',\n text: __('Previous')\n }));\n\n //attach behavior\n function doPrevious(previousItemWarning) {\n var context = testRunner.getTestContext();\n function enableNav() {\n testRunner.trigger('enablenav');\n }\n function triggerAction() {\n testRunner.previous();\n }\n testRunner.trigger('disablenav');\n if (self.getState('enabled') !== false) {\n if (previousItemWarning && context.remainingAttempts !== -1) {\n testRunner.trigger('confirm.previous', __('You are about to go to the previous item. Click OK to continue and go to the previous item.'), triggerAction,\n // if the test taker accept\n enableNav // if he refuses\n );\n } else {\n triggerAction();\n }\n }\n }\n this.$element.on('click', function (e) {\n e.preventDefault();\n testRunner.trigger('nav-previous');\n });\n const registerShortcut = kbdShortcut => {\n if (testRunnerOptions.allowShortcuts && kbdShortcut) {\n shortcut.add(namespaceHelper.namespaceAll(kbdShortcut, this.getName(), true), function () {\n if (canDoPrevious() && self.getState('enabled') === true) {\n testRunner.trigger('nav-previous', [true]);\n }\n }, {\n avoidInput: true,\n prevent: true\n });\n }\n };\n registerShortcut(pluginShortcuts.trigger);\n\n //start disabled\n toggle();\n self.disable();\n\n //update plugin state based on changes\n testRunner.on('loaditem', toggle).on('enablenav', function () {\n self.enable();\n }).on('disablenav', function () {\n self.disable();\n }).on('hidenav', function () {\n self.hide();\n }).on('shownav', function () {\n self.show();\n }).on('nav-previous', function (previousItemWarning) {\n doPrevious(previousItemWarning);\n }).on('enableaccessibilitymode', () => {\n const kbdShortcut = pluginShortcuts.triggerAccessibility;\n if (kbdShortcut && !this.getState('eaccessibilitymode')) {\n shortcut.remove(`.${this.getName()}`);\n registerShortcut(kbdShortcut);\n this.setState('eaccessibilitymode');\n }\n });\n },\n /**\n * Called during the runner's render phase\n */\n render: function render() {\n var $container = this.getAreaBroker().getNavigationArea();\n $container.append(this.$element);\n },\n /**\n * Called during the runner's destroy phase\n */\n destroy: function destroy() {\n shortcut.remove(`.${this.getName()}`);\n this.$element.remove();\n },\n /**\n * Enable the button\n */\n enable: function enable() {\n this.$element.removeProp('disabled').removeClass('disabled');\n },\n /**\n * Disable the button\n */\n disable: function disable() {\n this.$element.prop('disabled', true).addClass('disabled');\n },\n /**\n * Show the button\n */\n show: function show() {\n hider.show(this.$element);\n },\n /**\n * Hide the button\n */\n hide: function hide() {\n hider.hide(this.$element);\n }\n });\n\n return previous;\n\n});\n\n","define('taoQtiTest/runner/plugins/navigation/review/navigator',['jquery', 'lodash', 'ui/component', 'ui/autoscroll', 'taoQtiTest/runner/helpers/map', 'handlebars', 'lib/handlebars/helpers'], function ($$1, _, component, autoscroll, mapHelper, Handlebars, Helpers0) { 'use strict';\n\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n component = component && Object.prototype.hasOwnProperty.call(component, 'default') ? component['default'] : component;\n autoscroll = autoscroll && Object.prototype.hasOwnProperty.call(autoscroll, 'default') ? autoscroll['default'] : autoscroll;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, options, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, self=this;\n\n function program1(depth0,data) {\n \n \n return \" hidden\";\n }\n\n function program3(depth0,data) {\n \n var buffer = \"\", helper, options;\n buffer += \"\\n
          \\n \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Test status\", options) : helperMissing.call(depth0, \"__\", \"Test status\", options)))\n + \"\\n \\n \\n \\n
            \\n
          • \\n \\n \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Viewed\", options) : helperMissing.call(depth0, \"__\", \"Viewed\", options)))\n + \"\\n -/-\\n \\n
          • \\n
          • \\n \\n \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Answered\", options) : helperMissing.call(depth0, \"__\", \"Answered\", options)))\n + \"\\n -/-\\n \\n
          • \\n
          • \\n \\n \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Unanswered\", options) : helperMissing.call(depth0, \"__\", \"Unanswered\", options)))\n + \"\\n -/-\\n \\n
          • \\n
          • \\n \\n \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Flagged\", options) : helperMissing.call(depth0, \"__\", \"Flagged\", options)))\n + \"\\n -/-\\n \\n
          • \\n
          \\n
          \\n \";\n return buffer;\n }\n\n function program5(depth0,data) {\n \n \n return \"(0)\";\n }\n\n function program7(depth0,data) {\n \n \n return \"icon-unanswered \";\n }\n\n function program9(depth0,data) {\n \n var buffer = \"\", helper, options;\n buffer += escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Unanswered\", options) : helperMissing.call(depth0, \"__\", \"Unanswered\", options)))\n + \" (0)\";\n return buffer;\n }\n\n function program11(depth0,data) {\n \n \n return \"icon-flagged \";\n }\n\n function program13(depth0,data) {\n \n var buffer = \"\", helper, options;\n buffer += escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Flagged\", options) : helperMissing.call(depth0, \"__\", \"Flagged\", options)))\n + \" (0)\";\n return buffer;\n }\n\n buffer += \"
          \\n
          \\n \\n \\n
          \\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.showLegend), {hash:{},inverse:self.noop,fn:self.program(3, program3, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n\\n\\n
          \\n
            \\n
          • \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"All\", options) : helperMissing.call(depth0, \"__\", \"All\", options)))\n + \"\\n \";\n stack1 = helpers.unless.call(depth0, (depth0 && depth0.showLegend), {hash:{},inverse:self.noop,fn:self.program(5, program5, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \\n
          • \\n\\n
          • \\n \\n \";\n stack1 = helpers.unless.call(depth0, (depth0 && depth0.showLegend), {hash:{},inverse:self.noop,fn:self.program(9, program9, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \\n
          • \\n\\n
          • \\n \\n \";\n stack1 = helpers.unless.call(depth0, (depth0 && depth0.showLegend), {hash:{},inverse:self.noop,fn:self.program(13, program13, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \\n
          • \\n
          \\n
          \\n\\n \\n\\n
          \\n \\n

          \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"In this part of the test navigation is not allowed.\", options) : helperMissing.call(depth0, \"__\", \"In this part of the test navigation is not allowed.\", options)))\n + \"\\n

          \\n
          \\n
          \\n\";\n return buffer;\n });\n function navigatorTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template$1 = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, functionType=\"function\", self=this;\n\n function program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\\n
        • \\n \\n \";\n if (helper = helpers.label) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.label); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\n \\n \\n \\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.isLinear), {hash:{},inverse:self.program(8, program8, data),fn:self.program(6, program6, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n
        • \\n \";\n return buffer;\n }\n function program2(depth0,data) {\n \n \n return \"active\";\n }\n\n function program4(depth0,data) {\n \n \n return \"collapsed\";\n }\n\n function program6(depth0,data) {\n \n var buffer = \"\", stack1, helper, options;\n buffer += \"\\n
          \\n \\n

          \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"In this part of the test navigation is not allowed.\", options) : helperMissing.call(depth0, \"__\", \"In this part of the test navigation is not allowed.\", options)))\n + \"\\n

          \\n

          \\n \\n

          \\n
          \\n \";\n return buffer;\n }\n\n function program8(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\\n
            \\n \";\n stack1 = helpers.each.call(depth0, (depth0 && depth0.sections), {hash:{},inverse:self.noop,fn:self.program(9, program9, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n
          \\n \";\n return buffer;\n }\n function program9(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\\n
        • \\n \\n \";\n if (helper = helpers.label) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.label); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\n \"\n + escapeExpression(((stack1 = ((stack1 = (depth0 && depth0.stats)),stack1 == null || stack1 === false ? stack1 : stack1.answered)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1))\n + \"/\"\n + escapeExpression(((stack1 = ((stack1 = (depth0 && depth0.stats)),stack1 == null || stack1 === false ? stack1 : stack1.total)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1))\n + \"\\n \\n
            \\n \";\n stack1 = helpers.each.call(depth0, (depth0 && depth0.items), {hash:{},inverse:self.noop,fn:self.programWithDepth(10, program10, data, depth0),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n
          \\n
        • \\n \";\n return buffer;\n }\n function program10(depth0,data,depth1) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\\n
        • \\n \\n \\n \";\n if (helper = helpers.index) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.index); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\n \";\n if (helper = helpers.label) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.label); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\n \\n
        • \\n \";\n return buffer;\n }\n function program11(depth0,data) {\n \n \n return \"false\";\n }\n\n function program13(depth0,data) {\n \n \n return \"true\";\n }\n\n function program15(depth0,data) {\n \n \n return \"aria-current=\\\"page\\\"\";\n }\n\n buffer += \"
            \\n \";\n stack1 = helpers.each.call(depth0, (depth0 && depth0.parts), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n
          \\n\";\n return buffer;\n });\n function navigatorTreeTpl(data, options, asString) {\n var html = Template$1(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Some default values\n * @type {Object}\n * @private\n */\n var _defaults = {\n scope: 'test',\n canCollapse: false,\n preventsUnseen: true,\n hidden: false\n };\n\n /**\n * List of CSS classes\n * @type {Object}\n * @private\n */\n var _cssCls = {\n active: 'active',\n collapsed: 'collapsed',\n collapsible: 'collapsible',\n hidden: 'hidden',\n disabled: 'disabled',\n flagged: 'flagged',\n answered: 'answered',\n viewed: 'viewed',\n unseen: 'unseen',\n info: 'info',\n icon: 'qti-navigator-icon',\n scope: {\n test: 'scope-test',\n testPart: 'scope-test-part',\n testSection: 'scope-test-section'\n }\n };\n\n /**\n * List of icon CSS classes\n * @type {Array}\n * @private\n */\n var _iconCls = [_cssCls.info, _cssCls.flagged, _cssCls.answered, _cssCls.viewed];\n\n /**\n * List of common CSS selectors\n * @type {Object}\n * @private\n */\n var _selectors = {\n component: '.qti-navigator',\n filterBar: '.qti-navigator-filters',\n filter: '.qti-navigator-filter',\n tree: '.qti-navigator-tree',\n collapseHandle: '.qti-navigator-collapsible',\n linearState: '.qti-navigator-linear',\n infoAnswered: '.qti-navigator-answered .qti-navigator-counter',\n infoViewed: '.qti-navigator-viewed .qti-navigator-counter',\n infoUnanswered: '.qti-navigator-unanswered .qti-navigator-counter',\n infoFlagged: '.qti-navigator-flagged .qti-navigator-counter',\n infoPanel: '.qti-navigator-info',\n infoPanelLabels: '.qti-navigator-info > .qti-navigator-label',\n tabInfoAll: '[data-mode=\"all\"] .qti-navigator-counter',\n tabInfoUnanswered: '[data-mode=\"unanswered\"] .qti-navigator-counter',\n tabInfoFlagged: '[data-mode=\"flagged\"] .qti-navigator-counter',\n parts: '.qti-navigator-part',\n partLabels: '.qti-navigator-part > .qti-navigator-label',\n sections: '.qti-navigator-section',\n sectionLabels: '.qti-navigator-section > .qti-navigator-label',\n items: '.qti-navigator-item',\n itemLabels: '.qti-navigator-item > .qti-navigator-label',\n itemIcons: '.qti-navigator-item > .qti-navigator-icon',\n activeItem: '.qti-navigator-item.active',\n icons: '.qti-navigator-icon',\n linearStart: '.qti-navigator-linear-part button',\n counters: '.qti-navigator-counter',\n actives: '.active',\n collapsible: '.collapsible',\n collapsiblePanels: '.collapsible-panel',\n unseen: '.unseen',\n answered: '.answered',\n flagged: '.flagged',\n notFlagged: ':not(.flagged)',\n notAnswered: ':not(.answered)',\n notInformational: ':not(.info)',\n informational: '.info',\n hidden: '.hidden',\n disabled: '.disabled'\n };\n\n /**\n * Maps the filter mode to filter criteria.\n * Each filter criteria is a CSS selector used to find and mask the items to be discarded by the filter.\n * @type {Object}\n * @private\n */\n var _filterMap = {\n all: '',\n unanswered: [_selectors.answered, _selectors.informational].join(','),\n flagged: _selectors.notFlagged,\n answered: _selectors.notAnswered,\n filtered: _selectors.hidden\n };\n\n /**\n *\n * @type {Object}\n */\n var navigatorApi = {\n /**\n * Updates the stats on the flagged items in the current map\n * @param {Number} position\n * @param {Boolean} flag\n */\n updateStats: function updateStats(position, flag) {\n var map = this.map;\n var item;\n if (map) {\n item = mapHelper.getItemAt(map, position);\n if (item) {\n item.flagged = flag;\n mapHelper.updateItemStats(map, position);\n }\n }\n },\n /**\n * Gets the total number of items for the provided target\n * @param {Object} progression\n * @param {String} target\n * @returns {Number}\n */\n getProgressionTotal: function getProgressionTotal(progression, target) {\n var total;\n if ('questions' === target) {\n total = progression.questions;\n } else {\n total = progression.total;\n }\n return total;\n },\n /**\n * Set the marked state of an item\n * @param {Number|String|jQuery} position\n * @param {Boolean} flag\n */\n setItemFlag: function setItemFlag(position, flag) {\n var $item = position && position.jquery ? position : this.controls.$tree.find(`[data-position=${position}]`);\n var progression = this.progression;\n var icon;\n\n // update the map stats\n this.updateStats(position, flag);\n\n // update the item flag\n $item.toggleClass(_cssCls.flagged, flag);\n\n // set the item icon according to its state\n icon = _.find(_iconCls, _.bind($item.hasClass, $item)) || _cssCls.unseen;\n $item.find(_selectors.icons).attr('class', `${_cssCls.icon} icon-${icon}`);\n\n // update the info panel\n progression.flagged = this.controls.$tree.find(_selectors.flagged).length;\n this.writeCount(this.controls.$infoFlagged, progression.flagged, this.getProgressionTotal(progression, 'questions'));\n\n // recompute the filters\n this.filter(this.currentFilter);\n },\n /**\n * Filters the items by a criteria\n * @param {String} criteria\n */\n filter: function filter(criteria) {\n var self = this;\n\n // remove the current filter by restoring all items\n var $items = this.controls.$tree.find(_selectors.items).removeClass(_cssCls.hidden);\n\n // filter the items according to the provided criteria\n var filterCb = _filterMap[criteria];\n if (filterCb) {\n $items.filter(filterCb).addClass(_cssCls.hidden);\n }\n\n // update the section counters\n this.controls.$tree.find(_selectors.sections).each(function () {\n var $section = $$1(this);\n var $itemsFound = $section.find(_selectors.items).not(_selectors.hidden);\n var $filtered = $itemsFound.not(_selectors.disabled);\n self.writeCount($section.find(_selectors.counters), $filtered.length, $itemsFound.length);\n });\n this.currentFilter = criteria;\n },\n /**\n * Update the config\n * @param {Object} [config]\n * @returns {navigatorApi}\n */\n updateConfig: function updateConfig(config) {\n var $component = this.getElement();\n var scopeClass = _cssCls.scope[this.config.scope || _defaults.scope];\n\n // apply the new config\n config = _.merge(this.config, config || {});\n\n // enable/disable the collapsing of the panel\n $component.toggleClass(_cssCls.collapsible, config.canCollapse);\n\n // update the component CSS class according to the scope\n $component.removeClass(scopeClass);\n scopeClass = _cssCls.scope[this.config.scope || _defaults.scope];\n $component.addClass(scopeClass);\n return this;\n },\n /**\n * Keep the active item visible, auto scroll if needed\n */\n autoScroll: function autoScroll() {\n autoscroll(this.controls.$tree.find(_selectors.activeItem), this.controls.$tree);\n },\n /**\n * Updates the review screen\n * @param {Object} map The current test map\n * @param {Object} context The current test context\n * @returns {navigatorApi}\n * @fires navigator#update\n */\n update(map, context) {\n const scopedMap = this.getScopedMap(map, context);\n const testPart = mapHelper.getPart(map, context.testPartId);\n const progression = scopedMap.stats || {\n questions: 0,\n answered: 0,\n flagged: 0,\n viewed: 0,\n total: 0\n };\n const totalQuestions = this.getProgressionTotal(progression, 'questions');\n this.map = map;\n this.progression = progression;\n\n // update the info panel\n this.writeCount(this.controls.$infoAnswered, progression.answered, totalQuestions);\n this.writeCount(this.controls.$infoUnanswered, totalQuestions - progression.answered, totalQuestions);\n this.writeCount(this.controls.$infoViewed, progression.viewed, this.getProgressionTotal(progression, 'total'));\n this.writeCount(this.controls.$infoFlagged, progression.flagged, totalQuestions);\n this.writeCount(this.controls.$infoAll, totalQuestions, null);\n\n // rebuild the tree\n if (!testPart.isLinear) {\n this.controls.$filterBar.show();\n this.controls.$linearState.hide();\n this.controls.$tree.html(navigatorTreeTpl(scopedMap));\n this.autoScroll();\n const activeItem = mapHelper.getActiveItem(scopedMap);\n this.setState('prevents-unseen', this.config.preventsUnseen);\n const isSkipaheadEnabled = activeItem && activeItem.categories && _.indexOf(activeItem.categories, 'x-tao-option-review-skipahead') >= 0;\n this.setState('skipahead-enabled', isSkipaheadEnabled);\n if (this.config.preventsUnseen && !isSkipaheadEnabled) {\n // disables all unseen items to prevent the test taker has access to.\n this.controls.$tree.find(_selectors.unseen).addClass(_cssCls.disabled);\n }\n } else {\n this.controls.$filterBar.hide();\n this.controls.$linearState.show();\n this.controls.$tree.empty();\n }\n\n // apply again the current filter\n this.filter(this.controls.$filters.filter(_selectors.actives).data('mode'));\n\n /**\n * @event navigator#update the navigation data have changed\n */\n this.trigger('update');\n return this;\n },\n /**\n * Gets the scoped map\n * @param {Object} map The current test map\n * @param {Object} context The current test context\n * @returns {object} The scoped map\n */\n getScopedMap: function getScopedMap(map, context) {\n var scopedMap = mapHelper.getScopeMapFromContext(map, context, this.config.scope);\n var testPart = mapHelper.getPart(scopedMap, context.testPartId) || {};\n var section = mapHelper.getSection(scopedMap, context.sectionId) || {};\n var item = mapHelper.getItem(scopedMap, context.itemIdentifier) || {};\n\n // set the active part/section/item\n testPart.active = true;\n section.active = true;\n item.active = true;\n\n //interactive item counter\n let counter = 0;\n\n // adjust each item with additional meta\n return mapHelper.each(scopedMap, function (itm) {\n var cls = [];\n var icon = '';\n if (itm.active) {\n cls.push('active');\n }\n if (itm.informational) {\n cls.push('info');\n icon = icon || 'info';\n }\n if (itm.flagged) {\n cls.push('flagged');\n icon = icon || 'flagged';\n }\n if (itm.answered) {\n cls.push('answered');\n icon = icon || 'answered';\n }\n if (itm.viewed) {\n cls.push('viewed');\n icon = icon || 'viewed';\n } else {\n cls.push('unseen');\n icon = icon || 'unseen';\n }\n if (!itm.informational) {\n counter += 1;\n itm.numberTest = counter; //item position in whole test from 1\n }\n\n itm.cls = cls.join(' ');\n itm.icon = icon;\n });\n },\n /**\n * Updates a counter\n * @param {jQuery} $place\n * @param {Number} count\n * @param {Number|Null} total\n * @private\n */\n writeCount: function writeCount($place, count, total) {\n var display = 0;\n if ($place.parent().hasClass('qti-navigator-tab')) {\n display = Math.max(count, 0);\n } else if (total > 0) {\n display = `${Math.min(count, total)}/${total}`;\n }\n $place.text(display);\n },\n /**\n * Selects an item\n * @param {String|jQuery} position The item's position\n * @param {Boolean} [open] Forces the tree to be opened on the selected item\n * @returns {jQuery} Returns the selected item\n */\n select: function select(position, open) {\n // find the item to select and extract its hierarchy\n var $tree = this.controls.$tree;\n var selected = position && position.jquery ? position : $tree.find(`[data-position=${position}]`);\n var hierarchy = selected.parentsUntil($tree);\n var previousPosition = 0;\n var $previous = $tree.find(_selectors.activeItem);\n if ($previous.length) {\n previousPosition = $previous.data('position');\n }\n\n // collapse the full tree and open only the hierarchy of the selected item\n if (open) {\n this.openOnly(hierarchy);\n }\n\n // select the item\n $tree.find(_selectors.actives).removeClass(_cssCls.active);\n hierarchy.add(selected).addClass(_cssCls.active);\n position = selected.data('position');\n\n /**\n * An item is selected\n *\n * @param {Number} position - The item position on which select\n * @param {Number} previousPosition - The item position from which select\n * @event navigator#selected\n */\n this.trigger('selected', position, previousPosition);\n return selected;\n },\n /**\n * Opens the tree on the selected item only\n * @returns {jQuery} Returns the selected item\n */\n openSelected: function openSelected() {\n // find the selected item and extract its hierarchy\n var $tree = this.controls.$tree;\n var selected = $tree.find(_selectors.items + _selectors.actives);\n var hierarchy = selected.parentsUntil($tree);\n\n // collapse the full tree and open only the hierarchy of the selected item\n this.openOnly(hierarchy);\n return selected;\n },\n /**\n * Collapses the full tree and opens only the provided branch\n * @param {jQuery} opened The element to be opened\n * @param {jQuery} [root] The root element from which collapse the panels\n */\n openOnly: function openOnly(opened, root) {\n (root || this.controls.$tree).find(_selectors.collapsible).addClass(_cssCls.collapsed);\n opened.removeClass(_cssCls.collapsed);\n },\n /**\n * Toggles a panel\n * @param {jQuery} panel The panel to toggle\n * @param {String} [collapseSelector] Selector of panels to collapse\n * @returns {Boolean} Returns `true` if the panel just expanded now\n */\n togglePanel: function togglePanel(panel, collapseSelector) {\n var collapsed = panel.hasClass(_cssCls.collapsed);\n if (collapseSelector) {\n this.controls.$tree.find(collapseSelector).addClass(_cssCls.collapsed);\n }\n if (collapsed) {\n panel.removeClass(_cssCls.collapsed);\n } else {\n panel.addClass(_cssCls.collapsed);\n }\n return collapsed;\n },\n /**\n * Toggles the display state of the component\n * @param {Boolean} [show] External condition that's tells if the component must be shown or hidden\n * @returns {navigatorApi}\n */\n toggle: function toggle(show) {\n if (typeof show === 'undefined') {\n show = this.is('hidden');\n }\n if (show) {\n this.show();\n } else {\n this.hide();\n }\n return this;\n }\n };\n\n /**\n *\n * @param {Object} config\n * @param {String} [config.scope] Limit the review screen to a particular scope: test, testPart, testSection\n * @param {Boolean} [config.preventsUnseen] Prevents the test taker to access unseen items\n * @param {Boolean} [config.canCollapse] Allow the test taker to collapse the component\n * @param {Boolean} [config.canFlag] Allow the test taker to flag items\n * @param {Boolean} [config.hidden] Hide the component at init\n * @returns {*}\n */\n function navigatorFactory(config) {\n var navigator;\n\n /**\n * Flags an item\n * @param {jQuery} $item\n */\n function flagItem($item) {\n var position = $item.data('position');\n var flagged = !$item.hasClass(_cssCls.flagged);\n\n // update the display\n navigator.setItemFlag(position, flagged);\n\n /**\n * An item is flagged\n * @event navigator#flag\n * @param {Number} position - The item position on which jump\n * @param {Boolean} flag - Tells whether the item is marked for review or not\n */\n navigator.trigger('flag', position, flagged);\n }\n\n /**\n * Jumps to an item\n * @param {jQuery} $item\n * @private\n */\n function jump($item) {\n var position = $item.data('position');\n\n /**\n * A jump to a particular item is required\n * @event navigator#jump\n * @param {Number} position - The item position on which jump\n */\n navigator.trigger('jump', position);\n }\n navigator = component(navigatorApi, _defaults).setTemplate(navigatorTpl)\n\n // uninstalls the component\n .on('destroy', function () {\n this.controls = null;\n })\n\n // keep the activ item visible\n .on('show', function () {\n this.autoScroll();\n })\n\n // renders the component\n .on('render', function () {\n var self = this;\n\n // main component elements\n var $component = this.getElement();\n var $filterBar = $component.find(_selectors.filterBar);\n var $filters = $filterBar.find('li');\n var $tree = $component.find(_selectors.tree);\n\n // links the component to the underlying DOM elements\n this.controls = {\n // access to info panel displaying counters\n\n $infoAnswered: $component.find(_selectors.infoAnswered),\n $infoViewed: $component.find(_selectors.infoViewed),\n $infoAll: $component.find(_selectors.tabInfoAll),\n $infoUnanswered: this.config.showLegend ? $component.find(_selectors.infoUnanswered) : $component.find(_selectors.tabInfoUnanswered),\n $infoFlagged: this.config.showLegend ? $component.find(_selectors.infoFlagged) : $component.find(_selectors.tabInfoFlagged),\n // access to filter switches\n $filterBar: $filterBar,\n $filters: $filters,\n // access to the tree of parts/sections/items\n $tree: $tree,\n // access to the panel displayed when a linear part is reached\n $linearState: $component.find(_selectors.linearState)\n };\n\n // apply options\n this.updateConfig();\n\n // click on the collapse handle: collapse/expand the review panel\n $component.on(`click${_selectors.component}`, _selectors.collapseHandle, function () {\n if (!self.is('disabled')) {\n $component.toggleClass(_cssCls.collapsed);\n if ($component.hasClass(_cssCls.collapsed)) {\n self.openSelected();\n }\n }\n });\n\n // click on the info panel title: toggle the related panel\n $component.on(`click${_selectors.component}`, _selectors.infoPanelLabels, function () {\n if (!self.is('disabled')) {\n self.togglePanel($$1(this).closest(_selectors.infoPanel), _selectors.infoPanel);\n }\n });\n\n // click on a part title: toggle the related panel\n $tree.on(`click${_selectors.component}`, _selectors.partLabels, function () {\n var $panel;\n if (!self.is('disabled')) {\n $panel = $$1(this).closest(_selectors.parts);\n if (self.togglePanel($panel, _selectors.parts)) {\n if ($panel.hasClass(_cssCls.active)) {\n self.openSelected();\n } else {\n self.openOnly($panel.find(_selectors.sections).first(), $panel);\n }\n }\n }\n });\n\n // click on a section title: toggle the related panel\n $tree.on(`click${_selectors.component}`, _selectors.sectionLabels, function () {\n if (!self.is('disabled')) {\n self.togglePanel($$1(this).closest(_selectors.sections), _selectors.sections);\n }\n });\n\n // click on an item: jump to the position\n $tree.on(`click${_selectors.component}`, _selectors.itemLabels, function (event) {\n var $item, $target;\n if (!self.is('disabled')) {\n $item = $$1(this).closest(_selectors.items);\n if (!$item.hasClass(_cssCls.disabled)) {\n $target = $$1(event.target);\n if (self.config.canFlag && $target.is(_selectors.icons) && !$component.hasClass(_cssCls.collapsed)) {\n // click on the icon, just flag the item, unless the panel is collapsed\n if (!$item.hasClass(_cssCls.unseen) && !$item.hasClass(_cssCls.info)) {\n flagItem($item);\n }\n } else if (!$item.hasClass(_cssCls.active)) {\n // go to the selected item\n self.select($item);\n jump($item);\n }\n }\n }\n });\n\n // click on the start button inside a linear part: jump to the position\n $tree.on(`click${_selectors.component}`, _selectors.linearStart, function () {\n var $btn;\n if (!self.is('disabled')) {\n $btn = $$1(this);\n\n // go to the first item of the linear part\n if (!$btn.hasClass(_cssCls.disabled)) {\n $btn.addClass(_cssCls.disabled);\n jump($btn);\n }\n }\n });\n\n // click on a filter button\n $filterBar.on(`click${_selectors.component}`, _selectors.filter, function () {\n var $btn, mode;\n if (!self.is('disabled')) {\n $btn = $$1(this);\n mode = $btn.data('mode');\n\n // select the button\n $filters.removeClass(_cssCls.active);\n $filters.attr('aria-selected', false);\n $component.removeClass(_cssCls.collapsed);\n $btn.addClass(_cssCls.active);\n $btn.attr('aria-selected', true);\n\n // filter the items\n self.filter(mode);\n\n //after filtering, ensure that the active item (if exists) is visible\n self.autoScroll();\n }\n });\n });\n\n // set default filter\n navigator.currentFilter = 'all';\n\n // the component will be ready\n return navigator.init(config);\n }\n\n return navigatorFactory;\n\n});\n\n","define('taoQtiTest/runner/plugins/navigation/review/navigatorFizzy',['lodash', 'i18n', 'ui/component', 'ui/itemButtonList', 'taoQtiTest/runner/helpers/map', 'handlebars', 'lib/handlebars/helpers'], function (_, __, componentFactory, itemButtonListFactory, mapHelper, Handlebars, Helpers0) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n componentFactory = componentFactory && Object.prototype.hasOwnProperty.call(componentFactory, 'default') ? componentFactory['default'] : componentFactory;\n itemButtonListFactory = itemButtonListFactory && Object.prototype.hasOwnProperty.call(itemButtonListFactory, 'default') ? itemButtonListFactory['default'] : itemButtonListFactory;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, options, self=this, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;\n\n function program1(depth0,data) {\n \n \n return \" hidden\";\n }\n\n buffer += \"
          \\n
          \\n
          \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Test overview\", options) : helperMissing.call(depth0, \"__\", \"Test overview\", options)))\n + \"
          \\n \\n
          \\n \\n
          \\n

          \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"In this part of the test navigation is not allowed.\", options) : helperMissing.call(depth0, \"__\", \"In this part of the test navigation is not allowed.\", options)))\n + \"\\n

          \\n
          \\n
          \\n\";\n return buffer;\n });\n function navigatorTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template$1 = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, functionType=\"function\", escapeExpression=this.escapeExpression, self=this;\n\n function program1(depth0,data) {\n \n var buffer = \"\", stack1;\n buffer += \"\\n \";\n stack1 = helpers.each.call(depth0, (depth0 && depth0.parts), {hash:{},inverse:self.noop,fn:self.program(2, program2, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n\";\n return buffer;\n }\n function program2(depth0,data) {\n \n var buffer = \"\", stack1;\n buffer += \"\\n \";\n stack1 = helpers.each.call(depth0, (depth0 && depth0.sections), {hash:{},inverse:self.noop,fn:self.program(3, program3, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n return buffer;\n }\n function program3(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\\n
        • \\n
          \\n \";\n if (helper = helpers.label) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.label); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\n
          \\n
          \\n
        • \\n \";\n return buffer;\n }\n\n function program5(depth0,data) {\n \n \n return \"\\n
        • \\n
          \\n
        • \\n\";\n }\n\n buffer += \"
            \\n\";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.displaySectionTitles), {hash:{},inverse:self.program(5, program5, data),fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n
          \\n\";\n return buffer;\n });\n function navigatorTreeTpl(data, options, asString) {\n var html = Template$1(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2022 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Some default values\n * @type {Object}\n * @private\n */\n const _defaults = {\n scope: 'test',\n preventsUnseen: true\n };\n\n /**\n * List of common CSS selectors\n * @type {Object}\n * @private\n */\n const _selectors = {\n component: '.qti-navigator',\n tree: '.qti-navigator-tree',\n linearState: '.qti-navigator-linear',\n closeButton: '.icon-close',\n itemButtonListContainer: '.qti-navigator-items'\n };\n\n /**\n * @param {Object} config\n * @param {String} [config.scope] Limit the review screen to a particular scope: test, testPart, testSection\n * @param {Boolean} [config.preventsUnseen] Prevents the test taker to access unseen items\n * @returns {*}\n */\n function navigatorFactory(config) {\n let component;\n\n /**\n * Handle click on an item: jump to the position, if allowed\n * @param {String} itemId\n */\n function onItemClick(itemId) {\n const item = mapHelper.getItem(component.map, itemId);\n const activeItem = mapHelper.getItem(component.map, component.testContext.itemIdentifier);\n if (item && item.id && !component.is('disabled')) {\n if (!(component.disableUnseenItems && !item.viewed) && (!activeItem || item.position !== activeItem.position)) {\n component.select(item.position);\n /**\n * A jump to a particular item is required\n * @event navigator#jump\n * @param {Number} position - The item position on which jump\n */\n component.trigger('jump', item.position);\n }\n }\n }\n\n /**\n * Render items\n * @param {Object} fizzyItemButtonMap - list of items in format needed for rendering\n * @param {String} activeItemId\n */\n function renderItemButtonListComponents(fizzyItemButtonMap, activeItemId) {\n component.itemButtonListComponents.forEach(c => c.destroy());\n component.itemButtonListComponents = [];\n component.controls.$tree.find(_selectors.itemButtonListContainer).each((index, itemButtonListContainerElem) => {\n const itemButtonListComponent = itemButtonListFactory({\n items: fizzyItemButtonMap.sections[index].items,\n scrollContainer: component.controls.$tree\n }).render(itemButtonListContainerElem).on('click', _ref => {\n let {\n id\n } = _ref;\n return onItemClick(id);\n });\n component.itemButtonListComponents.push(itemButtonListComponent);\n });\n component.itemButtonListComponents.forEach(c => c.setActiveItem(activeItemId));\n }\n\n /**\n * Get list of items in format needed for rendering\n * @param {Object} scopedMap - test map, limited to the scope\n * @param {Boolean} disableUnseenItems\n * @returns {Object}\n */\n function getFizzyItemButtonMap(scopedMap, disableUnseenItems) {\n const {\n displaySectionTitles,\n displayItemTooltip\n } = component.getConfig();\n let nonInformationalCount = 0;\n const fizzyMap = {\n sections: []\n };\n _.forEach(scopedMap.parts, function (part) {\n _.forEach(part.sections, function (dataSection) {\n let fizzySection;\n if (displaySectionTitles) {\n fizzySection = {\n label: dataSection.label,\n items: []\n };\n fizzyMap.sections.push(fizzySection);\n } else {\n if (fizzyMap.sections.length) {\n fizzySection = fizzyMap.sections[0];\n } else {\n fizzySection = {\n items: []\n };\n fizzyMap.sections.push(fizzySection);\n }\n }\n _.forEach(dataSection.items, function (dataItem) {\n if (!dataItem.informational) {\n nonInformationalCount++;\n }\n const fizzyItem = {\n id: dataItem.id,\n position: dataItem.position\n };\n fizzySection.items.push(fizzyItem);\n fizzyItem.numericLabel = dataItem.informational ? '' : `${nonInformationalCount}`;\n if (dataItem.informational) {\n fizzyItem.icon = 'info';\n fizzyItem.ariaLabel = __('Informational item');\n } else if (dataItem.flagged) {\n fizzyItem.icon = 'flagged';\n fizzyItem.ariaLabel = __('Bookmarked question %s', nonInformationalCount);\n } else {\n fizzyItem.icon = null;\n fizzyItem.ariaLabel = __('Question %s', nonInformationalCount);\n }\n if (dataItem.answered) {\n fizzyItem.status = 'answered';\n } else if (dataItem.viewed) {\n fizzyItem.status = 'viewed';\n } else {\n fizzyItem.status = 'unseen';\n }\n if (disableUnseenItems && !dataItem.viewed) {\n // disables all unseen items to prevent the test taker has access to.\n fizzyItem.disabled = true;\n } else if (displayItemTooltip) {\n fizzyItem.title = dataItem.label;\n }\n });\n });\n });\n return fizzyMap;\n }\n\n /**\n *\n * @type {Object}\n */\n const navigatorApi = {\n /**\n * Set the marked state of an item\n * @param {Number} position\n * @param {Boolean} flag\n */\n setItemFlag(position, flag) {\n const updatedMap = _.cloneDeep(this.map);\n const updatedItem = mapHelper.getItemAt(updatedMap, position);\n if (updatedItem && updatedItem.id) {\n updatedItem.flagged = flag;\n const updatedScopeMap = mapHelper.getScopeMapFromContext(updatedMap, this.testContext, this.config.scope);\n const updatedFizzyMap = getFizzyItemButtonMap(updatedScopeMap, this.disableUnseenItems);\n let updatedItemData;\n _.forEach(updatedFizzyMap.sections, fizzySection => {\n updatedItemData = _.find(fizzySection.items, fizzyItem => fizzyItem.id === updatedItem.id);\n if (updatedItemData) {\n return false;\n }\n });\n this.itemButtonListComponents.forEach(c => c.updateItem(updatedItem.id, updatedItemData));\n }\n },\n /**\n * Update the config\n * @returns {navigatorApi}\n */\n updateConfig() {\n //not implemented\n return this;\n },\n /**\n * Updates the review screen\n * @param {Object} map The current test map\n * @param {Object} context The current test context\n * @returns {navigatorApi}\n * @fires navigator#update\n */\n update(map, context) {\n const scopedMap = mapHelper.getScopeMapFromContext(map, context, this.config.scope);\n scopedMap.displaySectionTitles = this.getConfig().displaySectionTitles;\n const activeItemId = context.itemIdentifier;\n const isSkipaheadEnabled = mapHelper.hasItemCategory(map, activeItemId, 'x-tao-option-review-skipahead');\n this.map = map;\n this.testContext = context;\n this.disableUnseenItems = this.config.preventsUnseen && !isSkipaheadEnabled;\n\n // rebuild the tree\n const testPart = mapHelper.getPart(map, context.testPartId);\n if (!testPart.isLinear) {\n this.setState('skipahead-enabled', isSkipaheadEnabled);\n this.setState('prevents-unseen', this.config.preventsUnseen);\n this.controls.$linearState.hide();\n this.controls.$tree.html(navigatorTreeTpl(scopedMap));\n const fizzyItemButtonMap = getFizzyItemButtonMap(scopedMap, this.disableUnseenItems);\n renderItemButtonListComponents(fizzyItemButtonMap, activeItemId);\n } else {\n this.controls.$linearState.show();\n this.controls.$tree.empty();\n }\n\n /**\n * @event navigator#update the navigation data have changed\n */\n this.trigger('update');\n return this;\n },\n /**\n * Selects an item\n * @param {Number} position The item's position\n */\n select(position) {\n let previousPosition = 0;\n const previousItem = mapHelper.getItem(this.map, this.testContext.itemIdentifier);\n if (previousItem && previousItem.id) {\n previousPosition = previousItem.position;\n }\n const item = mapHelper.getItemAt(this.map, parseInt(position));\n if (item && item.id) {\n this.itemButtonListComponents.forEach(c => c.setActiveItem(item.id));\n }\n\n /**\n * An item is selected\n * @param {Number} position - The item position on which select\n * @param {Number} previousPosition - The item position from which select\n * @event navigator#selected\n */\n this.trigger('selected', position, previousPosition);\n }\n };\n component = componentFactory(navigatorApi, _defaults).setTemplate(navigatorTpl).on('init', function () {\n this.itemButtonListComponents = [];\n }).on('destroy', function () {\n this.controls = null;\n this.itemButtonListComponents.forEach(c => c.destroy());\n this.itemButtonListComponents = [];\n }).on('render', function () {\n const $component = this.getElement();\n this.controls = {\n $tree: $component.find(_selectors.tree),\n $linearState: $component.find(_selectors.linearState),\n $closeButton: $component.find(_selectors.closeButton)\n };\n this.controls.$closeButton.on('click', function (e) {\n e.preventDefault();\n /**\n * Review screen should be closed\n * @event navigator#close\n */\n component.trigger('close');\n });\n }).on('enable', function () {\n this.itemButtonListComponents.forEach(c => c.enable());\n }).on('disable', function () {\n this.itemButtonListComponents.forEach(c => c.disable());\n });\n return component.init(config);\n }\n\n return navigatorFactory;\n\n});\n\n","define('taoQtiTest/runner/plugins/navigation/review/review',['lodash', 'i18n', 'ui/hider', 'util/shortcut', 'util/namespace', 'taoTests/runner/plugin', 'taoQtiTest/runner/helpers/map', 'taoQtiTest/runner/plugins/navigation/review/navigator', 'taoQtiTest/runner/plugins/navigation/review/navigatorFizzy'], function (_, __, hider, shortcut, namespaceHelper, pluginFactory, mapHelper, defaultNavigatorFactory, fizzyNavigatorFactory) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n shortcut = shortcut && Object.prototype.hasOwnProperty.call(shortcut, 'default') ? shortcut['default'] : shortcut;\n namespaceHelper = namespaceHelper && Object.prototype.hasOwnProperty.call(namespaceHelper, 'default') ? namespaceHelper['default'] : namespaceHelper;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n defaultNavigatorFactory = defaultNavigatorFactory && Object.prototype.hasOwnProperty.call(defaultNavigatorFactory, 'default') ? defaultNavigatorFactory['default'] : defaultNavigatorFactory;\n fizzyNavigatorFactory = fizzyNavigatorFactory && Object.prototype.hasOwnProperty.call(fizzyNavigatorFactory, 'default') ? fizzyNavigatorFactory['default'] : fizzyNavigatorFactory;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * The display states of the buttons\n */\n var buttonData = {\n setFlag: {\n control: 'set-item-flag',\n title: __('Flag the current item for later review'),\n icon: 'anchor',\n text: __('Flag for Review')\n },\n unsetFlag: {\n control: 'unset-item-flag',\n title: __('Do not flag the current item for later review'),\n icon: 'anchor',\n text: __('Unflag for Review')\n },\n setFlagBookmarked: {\n control: 'set-item-flag',\n title: __('Bookmark the current question for later review'),\n icon: 'bookmark',\n text: __('Bookmark question')\n },\n unsetFlagBookmarked: {\n control: 'unset-item-flag',\n title: __('Do not bookmark the current question for later review'),\n icon: 'bookmark-outline',\n text: __('Bookmark question')\n },\n showReview: {\n control: 'show-review',\n title: __('Show the review screen'),\n icon: 'right',\n text: __('Show Review')\n },\n hideReview: {\n control: 'hide-review',\n title: __('Hide the review screen'),\n icon: 'left',\n text: __('Hide Review')\n },\n showTestOverview: {\n control: 'show-test-overview',\n title: __('Show test overview panel'),\n icon: 'desktop-preview',\n text: __('Test overview')\n },\n hideTestOverview: {\n control: 'hide-test-overview',\n title: __('Hide test overview panel'),\n icon: 'desktop-preview',\n text: __('Test overview')\n }\n };\n\n /**\n * Get the flagged value for the item at that position\n * @param {Object} testMap\n * @param {Number} position - the item position\n * @returns {Boolean}\n */\n function isItemFlagged(testMap, position) {\n const item = mapHelper.getItemAt(testMap, position);\n return !!item.flagged;\n }\n\n /**\n * Update the button based on the provided data\n * @param {Component} button - the element to update\n * @param {Object} data - the button data\n */\n function updateButton(button, data) {\n var $button = button.getElement();\n if (button.is('rendered')) {\n if ($button.data('control') !== data.control) {\n $button.data('control', data.control).attr('title', data.title);\n $button.find('.icon').attr('class', `icon icon-${data.icon}`);\n $button.find('.text').text(data.text);\n if (data.control.includes('flag') || data.control.includes('overview')) {\n if (button.is('active')) {\n button.turnOff();\n } else {\n button.turnOn();\n }\n }\n }\n }\n }\n\n /**\n * Checks if the current context allows to mark the item for review\n * @param {Object} testRunner\n * @returns {Boolean}\n */\n function canFlag(testRunner) {\n const testContext = testRunner.getTestContext();\n const testMap = testRunner.getTestMap();\n const item = testRunner.getCurrentItem();\n const testPart = testRunner.getCurrentPart();\n const markReviewCategory = mapHelper.hasItemCategory(testMap, testContext.itemIdentifier, 'markReview', true);\n return !!(!testPart.isLinear && markReviewCategory && !(item && item.informational));\n }\n\n /**\n * Creates the timer plugin\n */\n var review = pluginFactory({\n name: 'review',\n /**\n * Initializes the plugin (called during runner's init)\n */\n init: function init() {\n const self = this;\n const testRunner = this.getTestRunner();\n const testContext = testRunner.getTestContext();\n const testMap = testRunner.getTestMap();\n const testRunnerOptions = testRunner.getOptions();\n const pluginShortcuts = (testRunnerOptions.shortcuts || {})[this.getName()] || {};\n const pluginConfig = this.getConfig();\n let navigatorConfig = testRunnerOptions.review || {\n defaultOpen: false\n };\n navigatorConfig = Object.assign({}, navigatorConfig, pluginConfig);\n this.isFizzyLayout = navigatorConfig && navigatorConfig.reviewLayout === 'fizzy';\n let previousItemPosition;\n\n /**\n * Gets the definition of the flagItem button related to the context\n * @param {Boolean} flag - the flag status\n * @returns {Object}\n */\n function getFlagItemButtonData(flag) {\n let dataType = flag ? 'unsetFlag' : 'setFlag';\n if (self.isFizzyLayout) {\n dataType = flag ? 'unsetFlagBookmarked' : 'setFlagBookmarked';\n }\n return buttonData[dataType];\n }\n\n /**\n * Gets the definition of the toggleNavigator button related to the context\n * @param {Object} navigator - the navigator component\n * @returns {Object}\n */\n function getToggleButtonData(navigator) {\n let dataType = navigator.is('hidden') ? 'showReview' : 'hideReview';\n if (self.isFizzyLayout) {\n dataType = navigator.is('hidden') ? 'showTestOverview' : 'hideTestOverview';\n }\n return buttonData[dataType];\n }\n\n /**\n * Retrieve the review categories of the current item\n * @returns {Object} the calculator categories\n */\n function getReviewCategories() {\n const currentContext = testRunner.getTestContext();\n const currentMap = testRunner.getTestMap();\n return {\n reviewScreen: mapHelper.hasItemCategory(currentMap, currentContext.itemIdentifier, 'reviewScreen', true),\n markReview: mapHelper.hasItemCategory(currentMap, currentContext.itemIdentifier, 'markReview', true)\n };\n }\n\n /**\n * Tells if the component is enabled\n * @returns {Boolean}\n */\n function isPluginAllowed() {\n const categories = getReviewCategories();\n return navigatorConfig.enabled && categories.reviewScreen;\n }\n\n /**\n * Mark an item for review\n * @param {Number} position\n * @param {Boolean} flag\n * @returns {Promise}\n */\n function flagItem(position, flag) {\n self.disable();\n return testRunner.getProxy().callTestAction('flagItem', {\n position,\n flag\n }).then(function () {\n const item = mapHelper.getItemAt(testRunner.getTestMap(), position);\n\n //update the value in the current testMap\n item.flagged = flag;\n\n // update the display of the flag button\n updateButton(self.flagItemButton, getFlagItemButtonData(flag));\n\n // update the item state\n self.navigator.setItemFlag(position, flag);\n self.enable();\n }).catch(function () {\n // rollback on the item flag\n self.navigator.setItemFlag(position, !flag);\n self.enable();\n });\n }\n\n /**\n * Mark the current item for review\n */\n function flagCurrentItem() {\n if (self.getState('enabled') !== false) {\n const itemPosition = testRunner.getTestContext().itemPosition;\n const flagStatus = isItemFlagged(testRunner.getTestMap(), itemPosition);\n flagItem(itemPosition, !flagStatus);\n }\n }\n\n /**\n * Shows/hides the review panel\n *\n * @param [{Boolean} forcedState], true will show the panel\n */\n function togglePanel(forcedState) {\n var isHidden = _.isUndefined(forcedState) ? self.navigator.is('hidden') : forcedState;\n if (isHidden) {\n self.explicitlyHidden = false;\n self.navigator.show();\n } else {\n self.explicitlyHidden = true;\n self.navigator.hide();\n }\n updateButton(self.toggleButton, getToggleButtonData(self.navigator));\n }\n const navigatorFactory = this.isFizzyLayout ? fizzyNavigatorFactory : defaultNavigatorFactory;\n this.navigator = navigatorFactory(navigatorConfig).on('selected', function (position, previousPosition) {\n previousItemPosition = previousPosition;\n }).on('jump', function (position) {\n if (self.getState('enabled') !== false) {\n self.disable();\n testRunner.jump(position, 'item');\n }\n }).on('flag', function (position, flag) {\n if (self.getState('enabled') !== false) {\n flagItem(position, flag);\n }\n }).on('close', function () {\n testRunner.trigger('tool-reviewpanel');\n }).render();\n\n // restore current item in the navigator if movement not allowed\n testRunner.on('alert.notallowed', function () {\n self.navigator.select(previousItemPosition);\n });\n this.explicitlyHidden = false;\n\n // register buttons in the toolbox component\n this.toggleButton = this.getAreaBroker().getToolbox().createEntry(getToggleButtonData(this.navigator));\n this.toggleButton.on('click', function (e) {\n e.preventDefault();\n testRunner.trigger('tool-reviewpanel');\n });\n this.flagItemButton = this.getAreaBroker().getToolbox().createEntry(getFlagItemButtonData(isItemFlagged(testMap, testContext.itemPosition)));\n this.flagItemButton.on('click', function (e) {\n e.preventDefault();\n testRunner.trigger('tool-flagitem');\n });\n if (testRunnerOptions.allowShortcuts) {\n if (pluginShortcuts.flag) {\n shortcut.add(namespaceHelper.namespaceAll(pluginShortcuts.flag, this.getName(), true), function () {\n testRunner.trigger('tool-flagitem');\n }, {\n avoidInput: true\n });\n }\n if (pluginShortcuts.toggle) {\n shortcut.add(namespaceHelper.namespaceAll(pluginShortcuts.toggle, this.getName(), true), function () {\n testRunner.trigger('tool-reviewpanel');\n }, {\n avoidInput: true\n });\n }\n }\n if (!isPluginAllowed()) {\n this.hide();\n }\n\n //disabled by default\n this.disable();\n togglePanel(navigatorConfig.defaultOpen);\n\n //change plugin state\n testRunner.on('render', function () {\n if (isPluginAllowed()) {\n self.show();\n updateButton(self.toggleButton, getToggleButtonData(self.navigator));\n } else {\n self.hide();\n }\n }).on('loaditem', function () {\n const context = testRunner.getTestContext();\n const map = testRunner.getTestMap();\n const testPart = testRunner.getCurrentPart();\n const categories = getReviewCategories();\n if (isPluginAllowed()) {\n updateButton(self.flagItemButton, getFlagItemButtonData(isItemFlagged(map, context.itemPosition)));\n self.navigator.update(map, context).updateConfig({\n canFlag: !testPart.isLinear && categories.markReview\n });\n self.show();\n updateButton(self.toggleButton, getToggleButtonData(self.navigator));\n } else {\n self.hide();\n }\n }).on('enabletools enablenav', function () {\n if (isPluginAllowed()) {\n self.enable();\n }\n }).on('disabletools disablenav', function () {\n if (isPluginAllowed()) {\n self.disable();\n }\n }).on('hidenav', function () {\n self.hide();\n }).on('shownav', function () {\n if (isPluginAllowed()) {\n self.show();\n }\n }).on('tool-flagitem', function () {\n if (isPluginAllowed() && canFlag(testRunner)) {\n flagCurrentItem();\n }\n }).on('tool-reviewpanel', function () {\n if (isPluginAllowed() && self.getState('enabled')) {\n togglePanel();\n }\n });\n },\n /**\n * Called during the runner's render phase\n */\n render: function render() {\n var areaBroker = this.getAreaBroker();\n var $panelContainer = areaBroker.getPanelArea();\n $panelContainer.append(this.navigator.getElement());\n },\n /**\n * Called during the runner's destroy phase\n */\n destroy: function destroy() {\n shortcut.remove(`.${this.getName()}`);\n this.navigator.destroy();\n },\n /**\n * Enables the button\n */\n enable: function enable() {\n const testRunner = this.getTestRunner();\n const testContext = testRunner.getTestContext();\n const testMap = testRunner.getTestMap();\n this.flagItemButton.enable();\n this.toggleButton.enable();\n this.navigator.enable();\n if (isItemFlagged(testMap, testContext.itemPosition)) {\n this.flagItemButton.turnOn();\n } else {\n this.flagItemButton.turnOff();\n }\n if (this.isFizzyLayout) {\n if (!this.explicitlyHidden) {\n this.toggleButton.turnOn();\n } else {\n this.toggleButton.turnOff();\n }\n }\n },\n /**\n * Disables the button\n */\n disable: function disable() {\n this.flagItemButton.disable();\n this.flagItemButton.turnOff();\n this.toggleButton.disable();\n if (this.isFizzyLayout) {\n this.toggleButton.turnOff();\n }\n this.navigator.disable();\n },\n /**\n * Shows the button\n */\n show: function show() {\n var testRunner = this.getTestRunner();\n if (canFlag(testRunner)) {\n this.flagItemButton.show();\n } else {\n this.flagItemButton.hide();\n }\n this.toggleButton.show();\n if (!this.explicitlyHidden) {\n this.navigator.show();\n } else {\n this.navigator.hide();\n }\n },\n /**\n * Hides the button\n */\n hide: function hide() {\n this.flagItemButton.hide();\n this.toggleButton.hide();\n this.navigator.hide();\n }\n });\n\n return review;\n\n});\n\n","define('taoQtiTest/runner/plugins/navigation/skip',['jquery', 'i18n', 'ui/hider', 'taoTests/runner/plugin', 'taoQtiTest/runner/helpers/messages', 'handlebars', 'lib/handlebars/helpers', 'taoQtiTest/runner/helpers/navigation', 'taoQtiTest/runner/helpers/map'], function ($$1, __, hider, pluginFactory, messages, Handlebars, Helpers0, navigationHelper, mapHelper) { 'use strict';\n\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n hider = hider && Object.prototype.hasOwnProperty.call(hider, 'default') ? hider['default'] : hider;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n messages = messages && Object.prototype.hasOwnProperty.call(messages, 'default') ? messages['default'] : messages;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n navigationHelper = navigationHelper && Object.prototype.hasOwnProperty.call(navigationHelper, 'default') ? navigationHelper['default'] : navigationHelper;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, functionType=\"function\", escapeExpression=this.escapeExpression, self=this;\n\n function program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \" \";\n if (helper = helpers.className) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.className); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1);\n return buffer;\n }\n\n function program3(depth0,data) {\n \n var buffer = \"\", stack1;\n buffer += \"\\n aria-\"\n + escapeExpression(((stack1 = (data == null || data === false ? data : data.key)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1))\n + \"=\\\"\"\n + escapeExpression((typeof depth0 === functionType ? depth0.apply(depth0) : depth0))\n + \"\\\"\\n \";\n return buffer;\n }\n\n function program5(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\";\n return buffer;\n }\n function program6(depth0,data) {\n \n \n return \" no-label\";\n }\n\n function program8(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\";\n if (helper = helpers.text) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.text); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\";\n return buffer;\n }\n\n buffer += \"\\n \\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.icon), {hash:{},inverse:self.noop,fn:self.program(5, program5, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.text), {hash:{},inverse:self.noop,fn:self.program(8, program8, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \\n\\n\";\n return buffer;\n });\n function buttonTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * The display of the skip\n */\n var buttonData = {\n skip: {\n control: 'skip',\n title: __('Skip and go to the next item'),\n icon: 'external',\n text: __('Skip')\n },\n end: {\n control: 'skip-end',\n title: __('Skip and go to the end of the test'),\n icon: 'external',\n text: __('Skip and end test')\n }\n };\n\n /**\n * Create the button based on the current context\n * @param {Object} testRunner - testRunner\n * @returns {jQueryElement} the button\n */\n var createElement = function createElement(testRunner) {\n const testContext = testRunner.getTestContext();\n const testMap = testRunner.getTestMap();\n const isLast = navigationHelper.isLast(testMap, testContext.itemIdentifier);\n const dataType = isLast ? 'end' : 'skip';\n return $$1(buttonTpl(buttonData[dataType]));\n };\n\n /**\n * Update the button based on the context\n * @param {jQueryElement} $element - the element to update\n * @param {Boolean} [isLast=false] - are we on the last item ?\n */\n const updateElement = function updateElement($element) {\n let isLast = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n const dataType = isLast ? 'end' : 'skip';\n const button = buttonData[dataType];\n if (button && $element.attr('data-control') !== button.control) {\n $element.attr('data-control', button.control).attr('title', button.title).find('.text').text(button.text);\n }\n };\n\n /**\n * Returns the configured plugin\n */\n var skip = pluginFactory({\n name: 'skip',\n /**\n * Initialize the plugin (called during runner's init)\n */\n init() {\n const testRunner = this.getTestRunner();\n const toggle = () => {\n const testContext = testRunner.getTestContext();\n if (testContext.allowSkipping === true) {\n this.show();\n return true;\n }\n this.hide();\n return false;\n };\n function doSkip() {\n testRunner.skip();\n }\n this.$element = createElement(testRunner);\n this.$element.on('click', e => {\n const enable = this.enable.bind(this);\n const testContext = testRunner.getTestContext();\n const testMap = testRunner.getTestMap();\n const isLast = navigationHelper.isLast(testMap, testContext.itemIdentifier);\n const endTestWarning = mapHelper.hasItemCategory(testMap, testContext.itemIdentifier, 'endTestWarning', true);\n e.preventDefault();\n if (this.getState('enabled') !== false) {\n this.disable();\n if (endTestWarning && isLast) {\n testRunner.trigger('confirm.endTest', messages.getExitMessage('test', testRunner), doSkip,\n // if the test taker accept\n enable // if the test taker refuse\n );\n } else {\n doSkip();\n }\n }\n });\n toggle();\n this.disable();\n testRunner.on('loaditem', () => {\n if (toggle()) {\n const testContext = testRunner.getTestContext();\n const testMap = testRunner.getTestMap();\n const isLast = navigationHelper.isLast(testMap, testContext.itemIdentifier);\n updateElement(this.$element, isLast);\n }\n }).on('enablenav', () => this.enable()).on('disablenav', () => this.disable()).on('hidenav', () => this.hide()).on('shownav', () => this.show());\n },\n /**\n * Called during the runner's render phase\n */\n render: function render() {\n var $container = this.getAreaBroker().getNavigationArea();\n $container.append(this.$element);\n },\n /**\n * Called during the runner's destroy phase\n */\n destroy: function destroy() {\n this.$element.remove();\n },\n /**\n * Enable the button\n */\n enable: function enable() {\n this.$element.removeProp('disabled').removeClass('disabled');\n },\n /**\n * Disable the button\n */\n disable: function disable() {\n this.$element.prop('disabled', true).addClass('disabled');\n },\n /**\n * Show the button\n */\n show: function show() {\n hider.show(this.$element);\n },\n /**\n * Hide the button\n */\n hide: function hide() {\n hider.hide(this.$element);\n }\n });\n\n return skip;\n\n});\n\n","define('taoQtiTest/runner/plugins/navigation/validateResponses',['lodash', 'i18n', 'taoTests/runner/plugin', 'taoQtiTest/runner/helpers/currentItem'], function (_, __, pluginFactory, currentItemHelper) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n currentItemHelper = currentItemHelper && Object.prototype.hasOwnProperty.call(currentItemHelper, 'default') ? currentItemHelper['default'] : currentItemHelper;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017-2019 (original work) Open Assessment Technologies SA ;\n */\n var pluginName = 'validateResponses';\n\n /**\n * Plugin\n * @returns {Object}\n */\n var validateResponses = pluginFactory({\n /**\n * Plugin name\n * @type {String}\n */\n name: pluginName,\n /**\n * Initialize plugin (called during runner's initialization)\n * @returns {this}\n */\n init() {\n const testRunner = this.getTestRunner();\n const testRunnerOptions = testRunner.getOptions();\n const pluginConfig = this.getConfig();\n testRunner.before('move', (e, direction) => {\n const testContext = testRunner.getTestContext();\n const isInteracting = !testRunner.getItemState(testContext.itemIdentifier, 'disabled');\n if (!pluginConfig.validateOnPreviousMove && direction === 'previous') {\n return Promise.resolve();\n }\n if (isInteracting && testRunnerOptions.enableValidateResponses) {\n const currenItem = testRunner.getCurrentItem();\n //@deprecated use validateResponses from testMap instead of the testContext\n const validateResponses = typeof currenItem.validateResponses === 'boolean' ? currenItem.validateResponses : testContext.validateResponses;\n if (validateResponses) {\n return new Promise((resolve, reject) => {\n if (_.size(currentItemHelper.getDeclarations(testRunner)) === 0) {\n return resolve();\n }\n if (currentItemHelper.isAnswered(testRunner, false)) {\n return resolve();\n }\n if (!testRunner.getState('alerted.notallowed')) {\n // Only show one alert for itemSessionControl\n testRunner.setState('alerted.notallowed', true);\n testRunner.trigger('alert.notallowed', __('A valid response to this item is required.'), () => {\n testRunner.trigger('resumeitem');\n reject();\n testRunner.setState('alerted.notallowed', false);\n });\n }\n });\n }\n }\n });\n return this;\n }\n });\n\n return validateResponses;\n\n});\n\n","define('taoQtiTest/runner/plugins/navigation/warnBeforeLeaving',['i18n', 'taoTests/runner/plugin'], function (__, pluginFactory) { 'use strict';\n\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * There's only a few chance to have this message displayed.\n * Most browsers doesn't support custom message anymore.\n * See https://www.chromestatus.com/feature/5349061406228480\n */\n var warnMessage = __('Please confirm you want to leave the test.');\n\n /**\n * The beforeunload listener\n * @param {Event} e\n * @returns {String} the custom message (for some browser, just need to be a string)\n */\n var warnListener = function warnListener(e) {\n e.returnValue = warnMessage;\n return warnMessage;\n };\n\n /**\n * Plugin factory\n * @returns {Object}\n */\n var warnBeforeLeaving = pluginFactory({\n /**\n * Plugin name\n * @type {String}\n */\n name: 'warnBeforeLeaving',\n /**\n * Initialize plugin (called during runner's initialization)\n */\n init: function init() {\n this.enable();\n },\n /**\n * Destroy plugin (called during runner's destruction)\n */\n destroy: function destroy() {\n this.disable();\n },\n /**\n * Enables the warning\n */\n enable: function enable() {\n window.addEventListener('beforeunload', warnListener);\n },\n /**\n * Disables the warning\n */\n disable: function disable() {\n window.removeEventListener('beforeunload', warnListener);\n }\n });\n\n return warnBeforeLeaving;\n\n});\n\n","define('taoQtiTest/runner/plugins/security/disableRightClick',['taoTests/runner/plugin'], function (pluginFactory) { 'use strict';\n\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n var disableRightClick = pluginFactory({\n name: 'disableRightClick',\n /**\n * Initializes the plugin (called during runner's init)\n */\n init: function init() {\n var rightClickEvents = ['contextmenu', 'mousedown', 'mouseup'];\n rightClickEvents.forEach(function (eventName) {\n window.document.addEventListener(eventName, function disableRightClick(event) {\n if (event.button === 2) {\n event.preventDefault();\n }\n });\n });\n }\n });\n\n return disableRightClick;\n\n});\n\n","define('taoQtiTest/runner/plugins/tools/answerElimination/eliminator',['lodash', 'i18n', 'ui/hider', 'util/shortcut', 'util/namespace', 'taoQtiTest/runner/helpers/map', 'taoTests/runner/plugin'], function (_, __, hider, shortcut, namespaceHelper, mapHelper, pluginFactory) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n shortcut = shortcut && Object.prototype.hasOwnProperty.call(shortcut, 'default') ? shortcut['default'] : shortcut;\n namespaceHelper = namespaceHelper && Object.prototype.hasOwnProperty.call(namespaceHelper, 'default') ? namespaceHelper['default'] : namespaceHelper;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017 (original work) Open Assessment Technologies SA;\n */\n\n /**\n * The public name of the plugin\n * @type {String}\n */\n var pluginName = 'eliminator';\n\n /**\n * The prefix of actions triggered through the event loop\n * @type {String}\n */\n var actionPrefix = `tool-${pluginName}-`;\n\n /**\n * Some default options for the plugin\n * @type {Object}\n */\n var defaultConfig = {\n // when hiding the buttons, don't remove existing eliminations\n removeEliminationsOnClose: false,\n // when showing the buttons, restore previously set eliminations\n restoreEliminationsOnOpen: false\n };\n\n /**\n * Returns the configured plugin\n */\n var eliminator = pluginFactory({\n name: pluginName,\n /**\n * Initialize the plugin (called during runner's init)\n */\n init() {\n const self = this;\n const testRunner = this.getTestRunner();\n const $container = testRunner.getAreaBroker().getContentArea().parent();\n const testRunnerOptions = testRunner.getOptions();\n const pluginShortcuts = (testRunnerOptions.shortcuts || {})[pluginName] || {};\n const config = Object.assign({}, defaultConfig, this.getConfig());\n\n // register the button in the toolbox\n this.button = this.getAreaBroker().getToolbox().createEntry({\n control: 'eliminator',\n title: __('Eliminate choices'),\n icon: 'eliminate',\n text: __('Answer Eliminator')\n });\n\n /**\n * Checks if the plugin is currently available\n * @returns {Boolean}\n */\n function isPluginEnabled() {\n //to be activated with the special category x-tao-option-eliminator\n return mapHelper.hasItemCategory(testRunner.getTestMap(), testRunner.getTestContext().itemIdentifier, 'eliminator', true);\n }\n\n /**\n * Is plugin activated ? if not, then we hide the plugin\n */\n function togglePluginButton() {\n if (isPluginEnabled()) {\n self.show();\n } else {\n self.hide();\n }\n }\n function togglePlugin() {\n if (!self.$choiceInteractions) {\n return;\n }\n self.$choiceInteractions.toggleClass('eliminable');\n if (isEliminable()) {\n enableEliminator();\n } else {\n disableEliminator();\n }\n }\n function isEliminable() {\n if (!self.$choiceInteractions) {\n return;\n }\n return self.$choiceInteractions.hasClass('eliminable');\n }\n function enableEliminator() {\n var $choices;\n if (!self.$choiceInteractions) {\n return;\n }\n $choices = self.$choiceInteractions.find('.qti-choice');\n self.button.turnOn();\n self.trigger('start');\n if (config.restoreEliminationsOnOpen) {\n $choices.each(function () {\n var input = this.querySelector('.real-label input');\n if (this.dataset.wasEliminated) {\n this.dataset.wasEliminated = null;\n this.classList.add('eliminated');\n input.setAttribute('disabled', 'disabled');\n input.checked = false;\n }\n });\n }\n }\n function disableEliminator() {\n var $choices;\n if (!self.$choiceInteractions) {\n return;\n }\n $choices = self.$choiceInteractions.find('.qti-choice');\n self.$choiceInteractions.removeClass('eliminable');\n self.button.turnOff();\n self.trigger('end');\n $choices.each(function () {\n if (this.classList.contains('eliminated')) {\n this.dataset.wasEliminated = true;\n this.classList.remove('eliminated');\n this.querySelector('.real-label input').removeAttribute('disabled');\n }\n });\n }\n\n //add a new mask each time the button is pressed\n this.button.on('click', function (e) {\n e.preventDefault();\n testRunner.trigger(`${actionPrefix}toggle`);\n });\n\n // handle the plugin's shortcuts\n if (testRunnerOptions.allowShortcuts) {\n _.forEach(pluginShortcuts, function (command, key) {\n shortcut.add(namespaceHelper.namespaceAll(command, pluginName, true), function () {\n // just fire the action using the event loop\n testRunner.trigger(actionPrefix + key);\n }, {\n avoidInput: true\n });\n });\n }\n\n //start disabled\n this.disable();\n\n //update plugin state based on changes\n testRunner.on('loaditem', togglePluginButton).on('renderitem', function conditionalInit() {\n // show button only when in the presence of choice interactions\n self.$choiceInteractions = $container.find('.qti-choiceInteraction');\n if (!self.$choiceInteractions.length) {\n self.hide();\n return;\n }\n if (isPluginEnabled()) {\n self.show();\n }\n }).on('enabletools renderitem', function () {\n self.enable();\n }).on('disabletools unloaditem', function () {\n self.disable();\n disableEliminator();\n })\n\n // commands that controls the plugin\n .on(`${actionPrefix}toggle`, function () {\n if (isPluginEnabled()) {\n togglePlugin();\n }\n })\n // Answer-eliminator and Answer-masking are mutually exclusive tools\n .on('tool-answer-masking-toggle', function () {\n if (isEliminable()) {\n disableEliminator();\n }\n });\n },\n /**\n * Called during the runner's destroy phase\n */\n destroy: function destroy() {\n shortcut.remove(`.${pluginName}`);\n },\n /**\n * Enable the button\n */\n enable: function enable() {\n this.button.enable();\n },\n /**\n * Disable the button\n */\n disable: function disable() {\n this.button.disable();\n },\n /**\n * Show the button\n */\n show: function show() {\n this.button.show();\n },\n /**\n * Hide the button\n */\n hide: function hide() {\n this.button.hide();\n }\n });\n\n return eliminator;\n\n});\n\n","define('taoQtiTest/runner/plugins/tools/answerMasking/answerMasking',['lodash', 'jquery', 'core/statifier', 'ui/component', 'handlebars', 'lib/handlebars/helpers'], function (_, $$1, statifier, componentFactory, Handlebars, Helpers0) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n statifier = statifier && Object.prototype.hasOwnProperty.call(statifier, 'default') ? statifier['default'] : statifier;\n componentFactory = componentFactory && Object.prototype.hasOwnProperty.call(componentFactory, 'default') ? componentFactory['default'] : componentFactory;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); \n\n\n return \"
          \\n \\n
          \";\n });\n function maskTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017 (original work) Open Assessment Technologies SA;\n */\n var ns = '.answerMasking';\n\n /**\n * @param {jQuery} $contentArea - DOM element containing the rendered item\n */\n function answerMaskingFactory($contentArea) {\n var answerMasking,\n allMasks = [],\n maskApi = {\n /**\n * Toggle mask visibility\n * @returns {component}\n */\n toggle: function toggle() {\n if (this.is('masked')) {\n return this.reveal();\n } else {\n return this.mask();\n }\n },\n /**\n * Show the choice under the current mask\n * @returns {component}\n */\n reveal: function reveal() {\n var $container = this.getContainer();\n $container.removeClass('masked');\n $container.find('input').removeAttr('disabled');\n this.setState('masked', false);\n return this;\n },\n /**\n * Cover the whole choice with the mask\n * @returns {component}\n */\n mask: function mask() {\n var $container = this.getContainer();\n $container.addClass('masked');\n $container.find('input').attr('disabled', 'disabled');\n this.setState('masked', true);\n return this;\n }\n };\n\n /**\n * Creates a ui/component to serve as a mask over a QTI Choice\n * @param {jQuery} $container - the qti-choice element\n * @returns {component}\n */\n function createMask($container) {\n return componentFactory(maskApi).setTemplate(maskTpl).on('render', function () {\n var self = this,\n $component = this.getElement();\n $component.on(`click${ns}`, function (e) {\n e.stopPropagation();\n e.preventDefault();\n self.toggle();\n });\n }).on('destroy', function () {\n var $component = this.getElement();\n $component.off(ns);\n }).init().render($container).mask();\n }\n\n /**\n * The answer masking helper\n */\n answerMasking = {\n /**\n * Enable the answer masking functionality by creating masks over the Qti Choices\n */\n enable: function enable() {\n var $choiceInteractions = $contentArea.find('.qti-choiceInteraction'),\n $qtiChoices = $contentArea.find('.qti-choice');\n allMasks = [];\n $choiceInteractions.addClass('maskable');\n $qtiChoices.each(function () {\n var $choice = $$1(this);\n allMasks.push(createMask($choice));\n });\n this.setState('enabled', true);\n },\n /**\n * Remove any answerMasking-related markup from the rendered item\n */\n disable: function disable() {\n var $choiceInteractions = $contentArea.find('.qti-choiceInteraction');\n $choiceInteractions.removeClass('maskable');\n allMasks.forEach(function (mask) {\n mask.reveal(); // remove class on container\n mask.destroy();\n });\n allMasks = [];\n this.setState('enabled', false);\n },\n /**\n * Return the current state of the masks\n * @returns {Boolean[]} - true if the choice is masked, false if the choice is revealed\n */\n getMasksState: function getMasksState() {\n var state = allMasks.map(function (mask) {\n return mask.is('masked');\n });\n return state;\n },\n /**\n * Restore a previously saved state for the masked choices\n * @param {Boolean[]} state - array of boolean, most probably given by the getMasksState method\n */\n setMasksState: function setMasksState(state) {\n state = state || [];\n state.forEach(function (masked, index) {\n var mask = allMasks[index];\n if (_.isObject(mask) && _.isFunction(mask.reveal) && !masked) {\n mask.reveal();\n }\n });\n }\n };\n statifier(answerMasking);\n return answerMasking;\n }\n\n return answerMaskingFactory;\n\n});\n\n","define('taoQtiTest/runner/plugins/tools/answerMasking/plugin',['i18n', 'taoTests/runner/plugin', 'ui/hider', 'util/shortcut', 'util/namespace', 'taoQtiTest/runner/helpers/map', 'taoQtiTest/runner/plugins/tools/answerMasking/answerMasking'], function (__, pluginFactory, hider, shortcut, namespaceHelper, mapHelper, answerMaskingFactory) { 'use strict';\n\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n shortcut = shortcut && Object.prototype.hasOwnProperty.call(shortcut, 'default') ? shortcut['default'] : shortcut;\n namespaceHelper = namespaceHelper && Object.prototype.hasOwnProperty.call(namespaceHelper, 'default') ? namespaceHelper['default'] : namespaceHelper;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n answerMaskingFactory = answerMaskingFactory && Object.prototype.hasOwnProperty.call(answerMaskingFactory, 'default') ? answerMaskingFactory['default'] : answerMaskingFactory;\n\n /*\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017 (original work) Open Assessment Technologies SA (under the project TAO-PRODUCT);\n *\n */\n\n /**\n * The public name of the plugin\n * @type {String}\n */\n var pluginName = 'answer-masking';\n\n /**\n * The prefix of actions triggered through the event loop\n * @type {String}\n */\n var actionPrefix = `tool-${pluginName}-`;\n\n /**\n * Stores the masking state for each item in the test\n * @type {Object}\n */\n var itemStates = {};\n\n /**\n * Default Configuration\n */\n var defaultConfig = {\n restoreStateOnToggle: true,\n restoreStateOnMove: true\n };\n\n /**\n * Returns the configured plugin\n */\n var plugin = pluginFactory({\n name: pluginName,\n /**\n * Initialize the plugin (called during runner's init)\n */\n init: function init() {\n const self = this;\n const testRunner = this.getTestRunner();\n const testRunnerOptions = testRunner.getOptions();\n const pluginConfig = Object.assign({}, defaultConfig, this.getConfig());\n const pluginShortcuts = (testRunnerOptions.shortcuts || {})[pluginName] || {};\n const $contentArea = this.getAreaBroker().getContentArea();\n var answerMasking = answerMaskingFactory($contentArea);\n function isPluginEnabled() {\n //to be activated with the special category x-tao-option-answerMasking\n const answerMaskingCategory = mapHelper.hasItemCategory(testRunner.getTestMap(), testRunner.getTestContext().itemIdentifier, 'answerMasking', true);\n return answerMaskingCategory && itemContainsChoiceInteraction();\n }\n function itemContainsChoiceInteraction() {\n var $container = self.getAreaBroker().getContentArea().parent();\n return $container.find('.qti-choiceInteraction').length;\n }\n function togglePluginButton() {\n if (isPluginEnabled()) {\n self.show();\n } else {\n self.hide();\n }\n }\n function togglePlugin() {\n if (!answerMasking.getState('enabled')) {\n enableMasking();\n } else {\n disableMasking();\n }\n }\n function enableMasking() {\n var testContext = testRunner.getTestContext(),\n itemId = testContext.itemIdentifier;\n answerMasking.enable();\n if (pluginConfig.restoreStateOnToggle) {\n answerMasking.setMasksState(itemStates[itemId]);\n }\n self.button.turnOn();\n self.trigger('start');\n }\n function disableMasking() {\n var testContext = testRunner.getTestContext(),\n itemId = testContext.itemIdentifier;\n if (answerMasking.getState('enabled')) {\n itemStates[itemId] = answerMasking.getMasksState();\n }\n answerMasking.disable();\n self.button.turnOff();\n self.trigger('end');\n }\n\n // create buttons\n this.button = this.getAreaBroker().getToolbox().createEntry({\n title: __('Answer Masking'),\n icon: 'result-nok',\n control: 'answer-masking',\n text: __('Answer Masking')\n });\n\n // attach user events\n this.button.on('click', function (e) {\n e.preventDefault();\n testRunner.trigger(`${actionPrefix}toggle`);\n });\n if (testRunnerOptions.allowShortcuts) {\n if (pluginShortcuts.toggle) {\n shortcut.add(namespaceHelper.namespaceAll(pluginShortcuts.toggle, this.getName(), true), function () {\n testRunner.trigger(`${actionPrefix}toggle`);\n }, {\n avoidInput: true,\n prevent: true\n });\n }\n }\n\n //start disabled\n this.disable();\n\n //update plugin state based on changes\n testRunner.on('loaditem', function () {\n var testContext = testRunner.getTestContext(),\n itemId = testContext.itemIdentifier;\n if (!pluginConfig.restoreStateOnMove) {\n itemStates[itemId] = [];\n }\n togglePluginButton();\n }).on('enabletools renderitem', function () {\n togglePluginButton(); // we repeat this here as we need the rendered item markup in order to decide whether the plugin is enabled\n self.enable();\n }).on('beforeunloaditem', function () {\n disableMasking();\n }).on('disabletools unloaditem', function () {\n self.disable();\n disableMasking();\n }).on(`${actionPrefix}toggle`, function () {\n if (isPluginEnabled()) {\n togglePlugin();\n }\n })\n // Answer-eliminator and Answer-masking are mutually exclusive tools\n .on('tool-eliminator-toggle', function () {\n disableMasking();\n });\n },\n /**\n * Called during the runner's destroy phase\n */\n destroy: function destroy() {\n shortcut.remove(`.${this.getName()}`);\n },\n /**\n * Enable the button\n */\n enable: function enable() {\n this.button.enable();\n },\n /**\n * Disable the button\n */\n disable: function disable() {\n this.button.disable();\n },\n /**\n * Show the button\n */\n show: function show() {\n this.button.show();\n },\n /**\n * Hide the button\n */\n hide: function hide() {\n this.button.hide();\n }\n });\n\n return plugin;\n\n});\n\n","define('taoQtiTest/runner/plugins/tools/apipTextToSpeech/textToSpeech',['jquery', 'i18n', 'handlebars', 'lib/handlebars/helpers', 'ui/component', 'interact', 'ui/component/stackable', 'ui/component/placeable', 'ui/feedback', 'nouislider'], function ($$1, __, Handlebars, Helpers0, component, interact, makeStackable, makePlaceable, feedback, nouislider) { 'use strict';\n\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n component = component && Object.prototype.hasOwnProperty.call(component, 'default') ? component['default'] : component;\n interact = interact && Object.prototype.hasOwnProperty.call(interact, 'default') ? interact['default'] : interact;\n makeStackable = makeStackable && Object.prototype.hasOwnProperty.call(makeStackable, 'default') ? makeStackable['default'] : makeStackable;\n makePlaceable = makePlaceable && Object.prototype.hasOwnProperty.call(makePlaceable, 'default') ? makePlaceable['default'] : makePlaceable;\n feedback = feedback && Object.prototype.hasOwnProperty.call(feedback, 'default') ? feedback['default'] : feedback;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", helper, options, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;\n\n\n buffer += \"
          \\n
          \\n
          \\n \\n \\n \\n
          \\n \\n
          \\n \\n \\n \\n \\n
          \\n
          \\n \\n \\n \\n
          \\n
          \\n \\n \\n \\n
          \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Speed\", options) : helperMissing.call(depth0, \"__\", \"Speed\", options)))\n + \"
          \\n
          \\n
          \\n
          \\n
          \\n\";\n return buffer;\n });\n function ttsTemplate(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA;\n */\n const defaultConfig = {\n activeElementClass: 'tts-active-content-node',\n elementClass: 'tts-content-node',\n left: -10,\n maxPlaybackRate: 2,\n minPlaybackRate: 0.5,\n playbackRate: 1,\n top: 50\n };\n const stackingOptions = {\n stackingScope: 'test-runner'\n };\n\n /**\n * Creates an instance of Text to Speech component\n *\n * @param {Element} container\n * @param {Object} config - component configurations\n * @param {String} config.activeElementClass - class applied to active content element. Default value 'tts-active-content-node'\n * @param {String} config.elementClass - class applied to content element. Default value 'tts-content-node'\n * @param {Number} config.left - initial left position of component. Default value 50\n * @param {Number} config.maxPlaybackRate - max playback rate. Default value 2\n * @param {Number} config.minPlaybackRate - min playback rate. Default value 0.5\n * @param {Number} config.playbackRate - playback rate. Default value 1\n * @param {Number} config.top - initial top position of component. Default value 50\n * @returns {ttsComponent} the textToSpeech component (uninitialized)\n */\n function maskingComponentFactory(container, config) {\n const audio = new Audio();\n let currentPlayback = [];\n let currentItem;\n let mediaContentData = [];\n let playbackRate;\n\n // Browser does not support selection Api If getSelection is not defined\n const selection = window.getSelection && window.getSelection();\n\n // component API\n const spec = {\n /**\n * Remove APIP element class and click handlers from APIP elements\n */\n clearAPIPElements() {\n const {\n elementClass\n } = this.config;\n const $contentNodes = $$1(mediaContentData.map(_ref => {\n let {\n selector\n } = _ref;\n return selector;\n }).join(', '), container);\n $contentNodes.removeClass(elementClass);\n $contentNodes.off('click', this.handleContentNodeClick);\n },\n /**\n * Update componet state and stop playback\n *\n * @fires close\n */\n close() {\n this.setTTSStateOnContainer('playing', false);\n this.setTTSStateOnContainer('sfhMode', false);\n this.setState('settings', false);\n this.stop();\n this.trigger('close');\n },\n /**\n * Get current active APIP item\n *\n * @returns {Object} active APIP item\n */\n getCurrentItem() {\n return currentItem;\n },\n /**\n * When component in start from here mode, switch to clicked content element\n *\n * @param {Object} e - event object\n */\n handleContentNodeClick(e) {\n const $target = $$1(e.target);\n\n // Allow default behaviour for inputs\n if ($target.hasClass('icon-checkbox') || $target.hasClass('icon-radio') || $target.is('input')) {\n return;\n }\n\n // Prevent default behaviour for lables and links\n e.stopPropagation();\n e.preventDefault();\n if (!this.is('sfhMode')) {\n return;\n }\n const $currentTarget = $$1(e.currentTarget);\n // Find APIP item associated with clicked element\n const selectedItemIndex = mediaContentData.findIndex(_ref2 => {\n let {\n selector\n } = _ref2;\n return $currentTarget.is(selector);\n });\n currentPlayback = mediaContentData.slice(selectedItemIndex);\n this.stop();\n this.initNextItem();\n this.togglePlayback();\n },\n /**\n * Select APIP item for default mode\n */\n initDefaultModeItem() {\n this.initItemWithTextSelection();\n if (!currentItem) {\n this.initDefaultModePlayback();\n }\n },\n /**\n * Check if there is some selected content inside APIP elelemts on the page\n */\n initItemWithTextSelection() {\n // Check if there is selected content\n if (this.is('sfhMode') || !selection || !selection.toString()) {\n return;\n }\n\n // Get APIP item by current selection\n const currentSelection = selection.getRangeAt(0);\n const {\n commonAncestorContainer\n } = currentSelection;\n const selectedItem = mediaContentData.find(_ref3 => {\n let {\n selector\n } = _ref3;\n const $item = $$1(selector, container);\n return $item.is(commonAncestorContainer) || $$1.contains($item[0], commonAncestorContainer);\n });\n if (selectedItem && selectedItem !== currentItem) {\n currentPlayback = [selectedItem];\n this.initNextItem();\n }\n },\n /**\n * Check if there is next APIP item to play and start playback if component in playing state.\n * If there is no APIP item to play stop playback\n *\n * @fires finish\n * @fires next\n */\n initNextItem() {\n const {\n activeElementClass\n } = this.config;\n currentItem && $$1(currentItem.selector, container).removeClass(activeElementClass);\n currentItem = currentPlayback.shift();\n if (currentItem) {\n const {\n selector,\n url\n } = currentItem;\n $$1(selector, container).addClass(activeElementClass);\n audio.setAttribute('src', url);\n audio.load();\n audio.playbackRate = playbackRate;\n if (this.is('playing')) {\n audio.play();\n }\n this.trigger('next');\n return;\n }\n this.trigger('finish');\n this.stop();\n },\n /**\n * Init default mode playback\n */\n initDefaultModePlayback() {\n currentPlayback = [...mediaContentData];\n this.initNextItem();\n },\n /**\n * Set APIP data. Apply handlers to APIP elements. Stop current playback\n *\n * @param {Array} data - APIP data items\n */\n setMediaContentData(data) {\n this.clearAPIPElements();\n const {\n elementClass\n } = this.config;\n mediaContentData = data;\n const $contentNodes = $$1(mediaContentData.map(_ref4 => {\n let {\n selector\n } = _ref4;\n return selector;\n }).join(', '), container);\n $contentNodes.addClass(elementClass);\n $contentNodes.on('click', this.handleContentNodeClick);\n this.stop();\n },\n /**\n * Set playback rate\n *\n * @param {Object} e - event object\n * @param {Number} value - playback rate\n */\n setPlaybackRate(e, value) {\n playbackRate = value;\n audio.playbackRate = value;\n },\n /**\n * Update component state. Toggle state class on page body\n *\n * @param {String} name\n * @param {Boolean} value\n */\n setTTSStateOnContainer(name, value) {\n this.setState(name, value);\n $$1(container).toggleClass(`tts-${name}`, value);\n },\n /**\n * Pause playback and update component state. Set current item to null\n */\n stop() {\n const {\n activeElementClass\n } = this.config;\n audio.pause();\n audio.currentTime = 0;\n currentItem && $$1(currentItem.selector, container).removeClass(activeElementClass);\n currentItem = null;\n this.setTTSStateOnContainer('playing', false);\n },\n /**\n * Toggle playback\n *\n * @param {Object} e - event object\n */\n togglePlayback(e) {\n e && e.preventDefault();\n const isPlaying = this.is('playing');\n this.initDefaultModeItem();\n if (!isPlaying && currentItem) {\n audio.play();\n this.setTTSStateOnContainer('playing', true);\n } else {\n audio.pause();\n this.setTTSStateOnContainer('playing', false);\n }\n },\n /**\n * Toggle start from here mode\n */\n toggleSFHMode() {\n const isSFHMode = this.is('sfhMode');\n this.setTTSStateOnContainer('sfhMode', !isSFHMode);\n this.stop();\n },\n /**\n * Toggle settings element\n */\n toggleSettings() {\n const isSettings = this.is('settings');\n this.setState('settings', !isSettings);\n\n // if settings was enabled make sure that component still inside the container\n if (!isSettings) {\n this.handleResize();\n }\n },\n /**\n * Handle browser resize\n */\n handleResize() {\n // offset from right\n const offsetFromRight = 10;\n const {\n x,\n y\n } = this.getPosition();\n const maxXPosition = window.innerWidth - this.getElement().width() - offsetFromRight;\n this.moveTo(x > maxXPosition ? maxXPosition : x, y);\n }\n };\n const ttsComponent = component(spec, defaultConfig);\n makePlaceable(ttsComponent);\n makeStackable(ttsComponent, stackingOptions);\n ttsComponent.setTemplate(ttsTemplate).on('init', function () {\n if (container.hasClass('tts-component-container')) {\n throw new Error('Container already has assigned text to speech component');\n }\n container.addClass('tts-component-container');\n this.render(container);\n }).on('render', function () {\n let {\n left,\n maxPlaybackRate,\n minPlaybackRate,\n playbackRate: defaultPlaybackRate,\n top\n } = this.getConfig();\n if (left < 0) {\n left = window.innerWidth - this.getElement().width() + left;\n }\n const $element = this.getElement();\n const $closeElement = $$1('.tts-control-close', $element);\n const $dragElement = $$1('.tts-control-drag', $element);\n const $playbackElement = $$1('.tts-control-playback', $element);\n const $sfhModeElement = $$1('.tts-control-mode', $element);\n const $sliderElement = $$1('.tts-slider', $element);\n const $settingsElement = $$1('.tts-control-settings', $element);\n playbackRate = defaultPlaybackRate;\n $element.css('touch-action', 'none');\n\n // make component dragable\n const interactElement = interact($element).draggable({\n autoScroll: true,\n manualStart: true,\n restrict: {\n restriction: container[0],\n elementRect: {\n left: 0,\n right: 1,\n top: 0,\n bottom: 1\n }\n },\n onmove: event => {\n const xOffset = Math.round(event.dx),\n yOffset = Math.round(event.dy);\n this.moveBy(xOffset, yOffset);\n }\n });\n interact($dragElement[0]).on('down', event => {\n const interaction = event.interaction;\n interaction.start({\n name: 'drag'\n }, interactElement, $element[0]);\n });\n\n // initialise slider\n $sliderElement.noUiSlider({\n animate: true,\n connected: true,\n range: {\n min: minPlaybackRate,\n max: maxPlaybackRate\n },\n start: defaultPlaybackRate,\n step: 0.1\n }).on('change', this.setPlaybackRate);\n\n // handle controls\n $closeElement.on('click', this.close);\n // handle mousedown instead of click to prevent selection lose\n $playbackElement.on('mousedown touchstart', this.togglePlayback);\n $sfhModeElement.on('click', this.toggleSFHMode);\n $settingsElement.on('click', this.toggleSettings);\n audio.addEventListener('ended', this.initNextItem);\n audio.addEventListener('error', () => {\n feedback().error(__('Can not playback media file!'));\n this.initNextItem();\n });\n window.addEventListener('resize', this.handleResize);\n\n // move to initial position\n this.moveTo(left, top);\n }).on('hide', function () {\n this.setTTSStateOnContainer('visible', false);\n }).on('show', function () {\n this.setTTSStateOnContainer('visible', true);\n }).on('destroy', function () {\n container.removeClass('tts-component-container');\n this.clearAPIPElements();\n this.stop();\n window.removeEventListener('resize', this.handleResize);\n });\n ttsComponent.init(config);\n return ttsComponent;\n }\n\n return maskingComponentFactory;\n\n});\n\n","define('taoQtiTest/runner/plugins/tools/apipTextToSpeech/ttsApipDataProvider',[],function () { 'use strict';\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2019 (original work) Open Assessment Technologies SA;\n *\n * @author Anton Tsymuk \n */\n\n /**\n * Extract TTS data from APIP item data\n *\n * @param {Object} apipElement - APIP item Data\n * @returns {Object}\n */\n const getTTSItemData = apipElement => {\n const {\n identifier\n } = apipElement['@attributes'];\n const {\n contentLinkInfo = {\n '@attributes': {}\n },\n relatedElementInfo: {\n spoken: {\n audioFileInfo = []\n } = {}\n } = {}\n } = apipElement;\n const {\n fileHref = ''\n } = audioFileInfo.find(audioFile => audioFile['@attributes'].mimeType === 'audio/mpeg') || {};\n const elementId = contentLinkInfo['@attributes'].qtiLinkIdentifierRef;\n return {\n identifier,\n selector: elementId && `#${elementId}`,\n url: fileHref.replace('assets/', '')\n };\n };\n\n /**\n * Get APIP item order from APIP order data\n *\n * @param {String} identifier - APIP item identifier\n * @param {Object} elementOrder - APIP order data\n * @returns {Number}\n */\n const getTTSItemOrder = (identifier, elementOrder) => {\n const {\n order\n } = elementOrder.find(apipElementOrder => apipElementOrder['@attributes'].identifierRef === identifier) || {};\n return parseInt(order) || Number.POSITIVE_INFINITY;\n };\n\n /**\n * Extract data related to Text To Speech from item APIP data\n * @param {Object} apipData\n * @returns {Object}\n */\n var ttsApipDataProvider = (apipData => {\n const {\n accessibilityInfo: {\n accessElement = []\n } = {},\n inclusionOrder: {\n textGraphicsDefaultOrder: {\n elementOrder = []\n } = {}\n } = {}\n } = apipData;\n return accessElement.map(getTTSItemData).filter(_ref => {\n let {\n url\n } = _ref;\n return !!url;\n }).sort((a, b) => getTTSItemOrder(a.identifier, elementOrder) - getTTSItemOrder(b.identifier, elementOrder));\n });\n\n return ttsApipDataProvider;\n\n});\n\n","define('taoQtiTest/runner/plugins/tools/apipTextToSpeech/plugin',['lodash', 'i18n', 'ui/hider', 'util/shortcut', 'util/namespace', 'taoTests/runner/plugin', 'taoQtiTest/runner/helpers/map', 'ui/keyNavigation/navigator', 'ui/keyNavigation/navigableDomElement', 'taoQtiTest/runner/plugins/tools/apipTextToSpeech/textToSpeech', 'taoQtiTest/runner/plugins/tools/apipTextToSpeech/ttsApipDataProvider'], function (_, __, hider, shortcut, namespaceHelper, pluginFactory, mapHelper, keyNavigator, navigableDomElement, ttsComponentFactory, ttsApipDataProvider) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n shortcut = shortcut && Object.prototype.hasOwnProperty.call(shortcut, 'default') ? shortcut['default'] : shortcut;\n namespaceHelper = namespaceHelper && Object.prototype.hasOwnProperty.call(namespaceHelper, 'default') ? namespaceHelper['default'] : namespaceHelper;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n keyNavigator = keyNavigator && Object.prototype.hasOwnProperty.call(keyNavigator, 'default') ? keyNavigator['default'] : keyNavigator;\n navigableDomElement = navigableDomElement && Object.prototype.hasOwnProperty.call(navigableDomElement, 'default') ? navigableDomElement['default'] : navigableDomElement;\n ttsComponentFactory = ttsComponentFactory && Object.prototype.hasOwnProperty.call(ttsComponentFactory, 'default') ? ttsComponentFactory['default'] : ttsComponentFactory;\n ttsApipDataProvider = ttsApipDataProvider && Object.prototype.hasOwnProperty.call(ttsApipDataProvider, 'default') ? ttsApipDataProvider['default'] : ttsApipDataProvider;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2019 (original work) Open Assessment Technologies SA;\n *\n * @author Anton Tsymuk \n */\n const pluginName = 'apiptts';\n const actionPrefix = `tool-${pluginName}-`;\n\n /**\n * Returns the configured plugin\n */\n var plugin = pluginFactory({\n name: pluginName,\n /**\n * Initialize the plugin (called during runner's init)\n */\n init() {\n const testRunner = this.getTestRunner();\n const testRunnerOptions = testRunner.getOptions();\n const pluginShortcuts = (testRunnerOptions.shortcuts || {})[this.getName()] || {};\n let ttsComponent;\n let ttsApipData;\n const createNavigationGroup = () => {\n const $container = testRunner.getAreaBroker().getContainer();\n const $navigationGroupElement = this.button.getElement();\n const groupNavigationId = `${pluginName}_navigation_group`;\n const $navigationElements = $container.find(ttsApipData.map(_ref => {\n let {\n selector\n } = _ref;\n return selector;\n }).join(', '));\n this.navigationGroup = keyNavigator({\n id: groupNavigationId,\n group: $navigationGroupElement,\n elements: navigableDomElement.createFromDoms($navigationElements.add($navigationGroupElement)),\n propagateTab: false,\n loop: true,\n keepState: true\n }).on('tab', () => {\n if (ttsComponent.is('sfhMode')) {\n this.navigationGroup.next();\n testRunner.trigger(`${actionPrefix}next`);\n }\n }).on('shift+tab', () => {\n if (ttsComponent.is('sfhMode')) {\n this.navigationGroup.previous();\n testRunner.trigger(`${actionPrefix}previous`);\n }\n }).on('activate', () => {\n if (ttsComponent.is('sfhMode')) {\n testRunner.trigger(`${actionPrefix}togglePlayback`);\n }\n }).on('blur', () => {\n setTimeout(() => {\n if (!this.navigationGroup.isFocused()) {\n this.navigationGroup.focus();\n }\n }, 0);\n }).setCursorAt($navigationElements.length);\n ttsComponent.on('next finish', () => {\n if (ttsComponent.is('sfhMode')) {\n const $currentElement = this.navigationGroup.getCursor().navigable.getElement();\n const {\n selector\n } = ttsComponent.getCurrentItem() || {};\n if (!selector || !$currentElement.is(selector)) {\n this.navigationGroup.next();\n }\n }\n });\n };\n\n /**\n * Creates the tts component on demand\n * @returns {textToSpeech}\n */\n const getTTSComponent = () => {\n if (!ttsComponent) {\n const $container = testRunner.getAreaBroker().getContainer();\n ttsComponent = ttsComponentFactory($container, {}).on('close', () => {\n if (this.getState('active')) {\n testRunner.trigger(`${actionPrefix}toggle`);\n }\n }).hide();\n }\n return ttsComponent;\n };\n\n /**\n * Checks if the plugin is currently available.\n * To be activated with the special category x-tao-option-apiptts\n *\n * @returns {Boolean}\n */\n const isConfigured = () => mapHelper.hasItemCategory(testRunner.getTestMap(), testRunner.getTestContext().itemIdentifier, 'apiptts', true);\n\n /**\n * Is plugin activated ? if not, then we hide the plugin\n */\n const togglePlugin = () => {\n if (isConfigured()) {\n this.show();\n } else {\n this.hide();\n }\n };\n\n /**\n * Show the plugin panel\n *\n * @fires plugin-open.apiptts\n */\n const enablePlugin = () => {\n createNavigationGroup();\n this.button.turnOn();\n this.setState('active', true);\n this.trigger('open');\n if (ttsComponent.is('hidden')) {\n ttsComponent.show();\n }\n };\n\n /**\n * Hide the plugin panel\n *\n * @fires plugin-close.apiptts\n */\n const disablePlugin = () => {\n if (this.getState('active')) {\n this.navigationGroup.blur();\n this.navigationGroup.destroy();\n this.setState('active', false);\n this.button.turnOff();\n this.trigger('close');\n if (ttsComponent && !ttsComponent.is('hidden')) {\n ttsComponent.close();\n ttsComponent.hide();\n }\n }\n };\n\n /**\n * Shows/hides the plugin\n */\n const toggleTool = () => {\n if (this.getState('enabled')) {\n if (this.getState('active')) {\n disablePlugin();\n this.setState('sleep', true);\n } else {\n enablePlugin();\n this.setState('sleep', false);\n }\n }\n };\n\n // Add plugin button to toolbox\n this.button = this.getAreaBroker().getToolbox().createEntry({\n className: `${this.getName()}-plugin`,\n control: this.getName(),\n icon: 'headphones',\n text: __('Text To Speech'),\n title: __('Enable text to speech')\n });\n\n // Handle plugin button click\n this.button.on('click', e => {\n e.preventDefault();\n testRunner.trigger(`${actionPrefix}toggle`);\n });\n\n // Register plugin shortcuts\n if (testRunnerOptions.allowShortcuts) {\n _.forEach(pluginShortcuts, (command, key) => {\n shortcut.add(namespaceHelper.namespaceAll(command, pluginName, true), () => {\n if (key === 'spaceTogglePlayback' && ttsComponent && ttsComponent.is('sfhMode')) {\n return;\n }\n const eventKey = key.endsWith('TogglePlayback') ? 'togglePlayback' : key;\n testRunner.trigger(actionPrefix + eventKey);\n }, {\n avoidInput: true\n });\n });\n }\n\n // Hide plugin by default\n togglePlugin();\n this.disable();\n this.hide();\n\n //update plugin state based on changes\n testRunner.on('loaditem', () => {\n togglePlugin();\n this.disable();\n }).on('enabletools renderitem', () => {\n this.enable();\n }).on('disabletools unloaditem', () => {\n disablePlugin();\n this.disable();\n }).on(`${actionPrefix}toggle`, () => {\n if (isConfigured()) {\n toggleTool();\n }\n }).on(`${actionPrefix}togglePlayback`, () => {\n if (this.getState('enabled')) {\n if (this.getState('active')) {\n if (ttsComponent.is('sfhMode')) {\n const $currentElement = this.navigationGroup.getCursor().navigable.getElement();\n const {\n selector\n } = ttsComponent.getCurrentItem() || {};\n if (!$currentElement.is(selector)) {\n if (this.button.getElement()[0] !== $currentElement[0]) {\n $currentElement.trigger('click');\n }\n return;\n }\n }\n ttsComponent.togglePlayback();\n }\n }\n }).on('renderitem', () => {\n if (!isConfigured()) {\n return;\n }\n ttsApipData = ttsApipDataProvider(testRunner.itemRunner.getData().apipAccessibility || {}).map(apipItemData => Object.assign({}, apipItemData, {\n url: testRunner.itemRunner.assetManager.resolve(apipItemData.url)\n }));\n if (!ttsApipData.length) {\n disablePlugin();\n this.hide();\n return;\n }\n getTTSComponent().setMediaContentData(ttsApipData);\n this.show();\n if (!this.getState('sleep')) {\n this.setState('enabled', true);\n toggleTool();\n }\n });\n },\n /**\n * Called during the runner's destroy phase\n */\n destroy() {\n shortcut.remove(`.${this.getName()}`);\n },\n /**\n * Enable the button\n */\n enable() {\n this.button.enable();\n },\n /**\n * Disable the button\n */\n disable() {\n this.button.disable();\n },\n /**\n * Show the button\n */\n show() {\n this.button.show();\n },\n /**\n * Hide the button\n */\n hide() {\n this.button.hide();\n }\n });\n\n return plugin;\n\n});\n\n","define('taoQtiTest/runner/plugins/tools/areaMasking/mask',['lodash', 'handlebars', 'lib/handlebars/helpers', 'ui/dynamicComponent'], function (_, Handlebars, Helpers0, dynamicComponent) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n dynamicComponent = dynamicComponent && Object.prototype.hasOwnProperty.call(dynamicComponent, 'default') ? dynamicComponent['default'] : dynamicComponent;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", helper, options, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;\n\n\n buffer += \"
          \\n
          \\n
          \\n \\n \\n
          \\n
          \\n\";\n return buffer;\n });\n function areaMaskingTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA;\n */\n var defaultConfig = {\n draggable: true,\n resizable: true,\n preserveAspectRatio: false,\n width: 250,\n minWidth: 160,\n maxWidth: 1000,\n minHeight: 60,\n height: 100,\n stackingScope: 'test-runner',\n top: 50,\n left: 10,\n previewDelay: 3000\n };\n\n /**\n * Creates a new masking component\n * @returns {maskComponent} the component (uninitialized)\n */\n function maskingComponentFactory() {\n var dynamicComponentInstance;\n\n /**\n * @typedef {Object} dynamicComponent\n */\n dynamicComponentInstance = dynamicComponent({\n /**\n * Preview the content under the masked area\n * @returns {maskComponent} chains\n *\n * @fires maskComponent#preview\n */\n preview: function preview() {\n var self = this;\n var delay = this.config.previewDelay || 1000;\n if (this.is('rendered') && !this.is('disabled') && !this.is('previewing')) {\n this.setState('previewing', true);\n this.trigger('preview');\n _.delay(function () {\n self.setState('previewing', false);\n }, delay);\n }\n return this;\n }\n }, defaultConfig).on('rendercontent', function ($content) {\n var self = this;\n var $element = this.getElement();\n $content.append(areaMaskingTpl({}));\n $element.addClass('mask-container');\n $element.on('click touchstart', '.view', function (e) {\n e.preventDefault();\n self.preview();\n }).on('click touchend', '.close', function (e) {\n e.preventDefault();\n self.destroy();\n });\n }).init();\n return dynamicComponentInstance;\n }\n\n return maskingComponentFactory;\n\n});\n\n","define('taoQtiTest/runner/plugins/tools/areaMasking/areaMasking',['lodash', 'i18n', 'ui/hider', 'util/shortcut', 'util/namespace', 'taoTests/runner/plugin', 'taoQtiTest/runner/plugins/tools/areaMasking/mask', 'taoQtiTest/runner/helpers/map'], function (_, __, hider, shortcut, namespaceHelper, pluginFactory, maskComponent, mapHelper) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n shortcut = shortcut && Object.prototype.hasOwnProperty.call(shortcut, 'default') ? shortcut['default'] : shortcut;\n namespaceHelper = namespaceHelper && Object.prototype.hasOwnProperty.call(namespaceHelper, 'default') ? namespaceHelper['default'] : namespaceHelper;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n maskComponent = maskComponent && Object.prototype.hasOwnProperty.call(maskComponent, 'default') ? maskComponent['default'] : maskComponent;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA;\n */\n\n /**\n * The public name of the plugin\n * @type {String}\n */\n var pluginName = 'area-masking';\n\n /**\n * The prefix of actions triggered through the event loop\n * @type {String}\n */\n var actionPrefix = `tool-${pluginName}-`;\n\n /**\n * Some default options for the plugin\n * @type {Object}\n */\n var defaultConfig = {\n max: 5,\n foo: true\n };\n\n /**\n * Returns the configured plugin\n */\n var areaMasking = pluginFactory({\n name: pluginName,\n /**\n * Initialize the plugin (called during runner's init)\n */\n init() {\n const self = this;\n const testRunner = this.getTestRunner();\n const $container = testRunner.getAreaBroker().getContentArea().parent();\n const testRunnerOptions = testRunner.getOptions();\n const config = Object.assign({}, defaultConfig, this.getConfig());\n const pluginShortcuts = (testRunnerOptions.shortcuts || {})[pluginName] || {};\n function addMask() {\n maskComponent().on('render', function () {\n self.masks.push(this);\n self.button.turnOn();\n\n /**\n * @event areaMasking#maskadd\n */\n self.trigger('maskadd');\n }).on('destroy', function () {\n self.masks = _.without(self.masks, this);\n if (self.masks.length < config.max) {\n self.enable();\n }\n if (self.masks.length === 0) {\n self.button.turnOff();\n self.trigger('close');\n }\n\n /**\n * @event areaMasking#maskclose\n */\n self.trigger('maskclose');\n }).init({\n renderTo: $container,\n draggableContainer: $container\n });\n }\n\n //keep a ref to all masks\n this.masks = [];\n\n // register the element in the Toolbox\n this.button = this.getAreaBroker().getToolbox().createEntry({\n control: 'area-masking',\n text: __('Masking'),\n title: __('Covers parts of the item'),\n icon: 'eye-slash'\n });\n\n //add a new mask each time the button is pressed\n this.button.on('click', function (e) {\n e.preventDefault();\n testRunner.trigger(`${actionPrefix}toggle`);\n });\n\n // handle the plugin's shortcuts\n if (testRunnerOptions.allowShortcuts) {\n _.forEach(pluginShortcuts, function (command, key) {\n shortcut.add(namespaceHelper.namespaceAll(command, pluginName, true), function () {\n // just fire the action using the event loop\n testRunner.trigger(actionPrefix + key);\n }, {\n avoidInput: true\n });\n });\n }\n\n //start disabled\n this.disable();\n\n /**\n * Checks if the plugin is currently available\n * @returns {Boolean}\n */\n function isEnabled() {\n //to be activated with the special category x-tao-option-areaMasking\n return mapHelper.hasItemCategory(testRunner.getTestMap(), testRunner.getTestContext().itemIdentifier, 'areaMasking', true);\n }\n\n /**\n * Is plugin activated ? if not, then we hide the plugin\n */\n function togglePlugin() {\n if (isEnabled()) {\n self.show();\n } else {\n self.hide();\n }\n }\n //update plugin state based on changes\n testRunner.on('loaditem', togglePlugin).on('enabletools renderitem', function () {\n self.enable();\n }).on('disabletools unloaditem', function () {\n self.disable();\n //remove all masks\n _.invoke(self.masks, 'destroy');\n })\n // commands that controls the plugin\n .on(`${actionPrefix}toggle`, function () {\n if (isEnabled()) {\n if (self.masks.length === 0) {\n self.trigger('open');\n }\n if (self.masks.length < config.max) {\n addMask();\n } else if (config.max === 1) {\n _.invoke(self.masks, 'destroy');\n }\n }\n });\n },\n /**\n * Called during the runner's destroy phase\n */\n destroy: function destroy() {\n shortcut.remove(`.${pluginName}`);\n },\n /**\n * Enable the button\n */\n enable: function enable() {\n this.button.enable();\n },\n /**\n * Disable the button\n */\n disable: function disable() {\n this.button.disable();\n },\n /**\n * Show the button\n */\n show: function show() {\n this.button.show();\n },\n /**\n * Hide the button\n */\n hide: function hide() {\n this.button.hide();\n }\n });\n\n return areaMasking;\n\n});\n\n","define('taoQtiTest/runner/plugins/tools/calculator',['jquery', 'lodash', 'i18n', 'ui/hider', 'ui/calculator', 'ui/maths/calculator/basicCalculator', 'ui/maths/calculator/scientificCalculator', 'util/shortcut', 'util/namespace', 'taoTests/runner/plugin', 'taoQtiTest/runner/helpers/map', 'handlebars', 'lib/handlebars/helpers'], function ($$1, _, __, hider, calculatorFactory, basicCalculatorFactory, scientificCalculatorFactory, shortcut, namespaceHelper, pluginFactory, mapHelper, Handlebars, Helpers0) { 'use strict';\n\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n calculatorFactory = calculatorFactory && Object.prototype.hasOwnProperty.call(calculatorFactory, 'default') ? calculatorFactory['default'] : calculatorFactory;\n basicCalculatorFactory = basicCalculatorFactory && Object.prototype.hasOwnProperty.call(basicCalculatorFactory, 'default') ? basicCalculatorFactory['default'] : basicCalculatorFactory;\n scientificCalculatorFactory = scientificCalculatorFactory && Object.prototype.hasOwnProperty.call(scientificCalculatorFactory, 'default') ? scientificCalculatorFactory['default'] : scientificCalculatorFactory;\n shortcut = shortcut && Object.prototype.hasOwnProperty.call(shortcut, 'default') ? shortcut['default'] : shortcut;\n namespaceHelper = namespaceHelper && Object.prototype.hasOwnProperty.call(namespaceHelper, 'default') ? namespaceHelper['default'] : namespaceHelper;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); \n\n\n return \"
          \";\n });\n function calculatorTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Default config for calculator components\n * @type {Object}\n */\n var defaultCalcConfig = {\n height: 380,\n width: 280,\n top: 50,\n left: 10,\n stackingScope: 'test-runner',\n proportionalResize: true\n };\n\n /**\n * Default config for BODMAS calculator component\n * @type {Object}\n */\n var bodmasCalcConfig = _.defaults({\n height: 380,\n width: 280\n }, defaultCalcConfig);\n\n /**\n * Default config for scientific calculator component\n * @type {Object}\n */\n var scientificCalcConfig = _.defaults({\n width: 490,\n height: 420,\n calculator: {\n maths: {\n degree: true\n }\n }\n }, defaultCalcConfig);\n\n /**\n * Returns the configured plugin\n */\n var calculator = pluginFactory({\n name: 'calculator',\n /**\n * Initialize the plugin (called during runner's init)\n */\n init: function init() {\n const self = this;\n const testRunner = this.getTestRunner();\n const areaBroker = this.getAreaBroker();\n const testRunnerOptions = testRunner.getOptions();\n const config = this.getConfig();\n const pluginShortcuts = (testRunnerOptions.shortcuts || {})[this.getName()] || {};\n\n /**\n * Retrieve the calculators categories of the current item\n * @returns {Object} the calculator categories\n */\n function getCalculatorCategories() {\n const testContext = testRunner.getTestContext();\n const itemIdentifier = testContext.itemIdentifier;\n const testMap = testRunner.getTestMap();\n return {\n calculator: mapHelper.hasItemCategory(testMap, itemIdentifier, 'calculator', true),\n bodmas: mapHelper.hasItemCategory(testMap, itemIdentifier, 'calculator-bodmas', true),\n scientific: mapHelper.hasItemCategory(testMap, itemIdentifier, 'calculator-scientific', true)\n };\n }\n\n /**\n * Checks if the plugin is currently available\n * @returns {Boolean}\n */\n function isEnabled() {\n //to be activated with a special category from:\n // - x-tao-option-calculator\n // - x-tao-option-calculator-bodmas\n // - x-tao-option-calculator-scientific\n const categories = getCalculatorCategories();\n return categories.calculator || categories.bodmas || categories.scientific;\n }\n\n /**\n * Is calculator activated ? if not, then we hide the plugin\n */\n function togglePlugin() {\n if (isEnabled()) {\n //allow calculator\n self.show();\n } else {\n self.hide();\n }\n }\n\n /**\n * Build the calculator component\n * @param {Function} [calcTpl] - An optional alternative template for the calculator.\n * Only compatible with the four-functions version\n */\n function buildCalculator(calcTpl) {\n const categories = getCalculatorCategories();\n let factory, calcConfig;\n if (categories.scientific) {\n factory = scientificCalculatorFactory;\n calcConfig = scientificCalcConfig;\n calcConfig.calculator.maths.degree = _.isUndefined(config.degree) ? scientificCalcConfig.calculator.maths.degree : config.degree;\n } else if (categories.bodmas) {\n factory = basicCalculatorFactory;\n calcConfig = bodmasCalcConfig;\n } else {\n factory = calculatorFactory;\n calcConfig = defaultCalcConfig;\n }\n self.calculator = factory(_.defaults({\n renderTo: self.$calculatorContainer,\n replace: true,\n draggableContainer: areaBroker.getContainer(),\n alternativeTemplate: calcTpl || null\n }, calcConfig)).on('show', function () {\n self.trigger('open');\n self.button.turnOn();\n }).on('hide', function () {\n self.trigger('close');\n self.button.turnOff();\n }).after('render', function () {\n this.show();\n });\n }\n\n /**\n * Show/hide the calculator\n */\n function toggleCalculator() {\n if (self.getState('enabled') !== false) {\n if (self.calculator) {\n //just show/hide the calculator widget\n if (self.calculator.is('hidden')) {\n self.calculator.show();\n } else {\n self.calculator.hide();\n }\n } else {\n //build calculator widget\n if (config.template) {\n require([`tpl!${config.template.replace(/\\.tpl$/, '')}`], function (calcTpl) {\n buildCalculator(calcTpl);\n }, function () {\n //in case of error, display the default calculator:\n buildCalculator();\n });\n } else {\n buildCalculator();\n }\n }\n }\n }\n\n //build element (detached)\n this.button = this.getAreaBroker().getToolbox().createEntry({\n control: 'calculator',\n title: __('Open Calculator'),\n icon: 'table',\n text: __('Calculator')\n });\n this.$calculatorContainer = $$1(calculatorTpl());\n\n //init calculator instance var, it will be created only necessary\n this.calculator = null;\n\n //attach behavior\n this.button.on('click', function (e) {\n //prevent action if the click is made inside the form which is a sub part of the button\n if ($$1(e.target).closest('.widget-calculator').length) {\n return;\n }\n e.preventDefault();\n testRunner.trigger('tool-calculator');\n });\n if (testRunnerOptions.allowShortcuts) {\n if (pluginShortcuts.toggle) {\n shortcut.add(namespaceHelper.namespaceAll(pluginShortcuts.toggle, this.getName(), true), function () {\n testRunner.trigger('tool-calculator');\n }, {\n avoidInput: true,\n allowIn: '.widget-calculator'\n });\n }\n }\n\n //start disabled\n togglePlugin();\n this.disable();\n\n //update plugin state based on changes\n testRunner.on('loaditem', togglePlugin).on('enabletools renderitem', function () {\n self.enable();\n }).on('disabletools unloaditem', function () {\n self.disable();\n if (self.calculator) {\n //destroy calculator to create a new instance of calculator each time\n self.calculator.destroy();\n self.calculator = null;\n }\n }).on('tool-calculator', function () {\n if (isEnabled()) {\n toggleCalculator();\n }\n });\n },\n /**\n * Called during the runner's render phase\n */\n render: function render() {\n var areaBroker = this.getAreaBroker();\n areaBroker.getContainer().append(this.$calculatorContainer);\n },\n /**\n * Called during the runner's destroy phase\n */\n destroy: function destroy() {\n shortcut.remove(`.${this.getName()}`);\n this.$calculatorContainer.remove();\n if (this.calculator) {\n this.calculator.destroy();\n }\n },\n /**\n * Enable the button\n */\n enable: function enable() {\n this.button.enable();\n },\n /**\n * Disable the button\n */\n disable: function disable() {\n this.button.disable();\n if (this.calculator) {\n this.calculator.hide();\n }\n },\n /**\n * Show the button\n */\n show: function show() {\n this.button.show();\n },\n /**\n * Hide the button\n */\n hide: function hide() {\n this.button.hide();\n if (this.calculator) {\n this.calculator.hide();\n }\n }\n });\n\n return calculator;\n\n});\n\n","define('taoQtiTest/runner/plugins/tools/comment/comment',['jquery', 'i18n', 'taoTests/runner/plugin', 'ui/hider', 'ui/stacker', 'util/shortcut', 'util/namespace', 'handlebars', 'lib/handlebars/helpers'], function ($$1, __, pluginFactory, hider, stackerFactory, shortcut, namespaceHelper, Handlebars, Helpers0) { 'use strict';\n\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n hider = hider && Object.prototype.hasOwnProperty.call(hider, 'default') ? hider['default'] : hider;\n stackerFactory = stackerFactory && Object.prototype.hasOwnProperty.call(stackerFactory, 'default') ? stackerFactory['default'] : stackerFactory;\n shortcut = shortcut && Object.prototype.hasOwnProperty.call(shortcut, 'default') ? shortcut['default'] : shortcut;\n namespaceHelper = namespaceHelper && Object.prototype.hasOwnProperty.call(namespaceHelper, 'default') ? namespaceHelper['default'] : namespaceHelper;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", helper, options, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;\n\n\n buffer += \"
          \\n \\n \\n \\n
          \\n\";\n return buffer;\n });\n function commentTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Returns the configured plugin\n */\n var comment = pluginFactory({\n name: 'comment',\n /**\n * Initialize the plugin (called during runner's init)\n */\n init() {\n const self = this;\n const testRunner = this.getTestRunner();\n const testRunnerOptions = testRunner.getOptions();\n const pluginShortcuts = (testRunnerOptions.shortcuts || {})[this.getName()] || {};\n const stacker = stackerFactory('test-runner');\n\n /**\n * Checks if the plugin is currently available\n * @returns {Boolean}\n */\n function isEnabled() {\n const currentItem = testRunner.getCurrentItem();\n if (typeof currentItem.allowComment === 'boolean') {\n return currentItem.allowComment;\n }\n\n //@deprecated use allowComment from the testMap\n const testContext = testRunner.getTestContext();\n const contextOptions = testContext.options || {};\n return !!contextOptions.allowComment;\n }\n\n /**\n * Can we comment ? if not, then we hide the plugin\n */\n function togglePlugin() {\n if (isEnabled()) {\n self.show();\n } else {\n self.hide();\n }\n }\n\n /**\n * Show/hide the comment panel\n */\n function toggleComment() {\n if (self.getState('enabled') !== false) {\n //just show/hide the form\n hider.toggle(self.$form);\n if (!hider.isHidden(self.$form)) {\n //reset the form on each display\n self.$input.val('').focus();\n self.button.turnOn();\n stacker.bringToFront(self.$form);\n } else {\n self.button.turnOff();\n }\n }\n }\n\n // register button in toolbox\n this.button = this.getAreaBroker().getToolbox().createEntry({\n control: 'comment',\n title: __('Leave a comment'),\n icon: 'tag',\n text: __('Comment')\n });\n\n //get access to controls\n this.button.on('render', function () {\n self.$button = self.button.getElement();\n self.$form = $$1(commentTpl()).appendTo(self.$button);\n self.$input = self.$button.find('[data-control=\"qti-comment-text\"]');\n self.$cancel = self.$button.find('[data-control=\"qti-comment-cancel\"]');\n self.$submit = self.$button.find('[data-control=\"qti-comment-send\"]');\n stacker.autoBringToFront(self.$form);\n\n //hide the form without submit\n self.$cancel.on('click', function () {\n hider.hide(self.$form);\n self.button.turnOff();\n });\n\n //submit the comment, then hide the form\n self.$submit.on('click', function () {\n var comment = self.$input.val();\n if (comment) {\n self.disable();\n self.button.turnOff();\n testRunner.getProxy().callTestAction('comment', {\n comment: comment\n }).then(function () {\n hider.hide(self.$form);\n self.enable();\n }).catch(function () {\n hider.hide(self.$form);\n self.enable();\n });\n }\n });\n });\n\n //attach behavior\n this.button.on('click', function (e) {\n //prevent action if the click is made inside the form which is a sub part of the button\n if ($$1(e.target).closest('[data-control=\"qti-comment\"]').length) {\n return;\n }\n e.preventDefault();\n testRunner.trigger('tool-comment');\n });\n if (testRunnerOptions.allowShortcuts) {\n if (pluginShortcuts.toggle) {\n shortcut.add(namespaceHelper.namespaceAll(pluginShortcuts.toggle, this.getName(), true), function () {\n testRunner.trigger('tool-comment');\n }, {\n avoidInput: true\n });\n }\n }\n\n //start disabled\n togglePlugin();\n this.disable();\n\n //update plugin state based on changes\n testRunner.on('loaditem', togglePlugin).on('renderitem enabletools', function () {\n self.enable();\n }).on('unloaditem disabletools', function () {\n self.disable();\n }).on('tool-comment', function () {\n if (isEnabled()) {\n toggleComment();\n }\n });\n },\n /**\n * Called during the runner's destroy phase\n */\n destroy: function destroy() {\n shortcut.remove(`.${this.getName()}`);\n },\n /**\n * Enable the button\n */\n enable: function enable() {\n this.button.enable();\n },\n /**\n * Disable the button\n */\n disable: function disable() {\n if (this.$form) {\n hider.hide(this.$form);\n }\n this.button.disable();\n this.button.turnOff();\n },\n /**\n * Show the button\n */\n show: function show() {\n this.button.show();\n },\n /**\n * Hide the button\n */\n hide: function hide() {\n if (this.$form) {\n hider.hide(this.$form);\n }\n this.button.hide();\n }\n });\n\n return comment;\n\n});\n\n","define('taoQtiTest/runner/plugins/tools/documentViewer/documentViewer',['jquery', 'lodash', 'ui/hider', 'ui/documentViewer', 'ui/documentViewer/providers/pdfViewer', 'taoTests/runner/plugin', 'handlebars', 'lib/handlebars/helpers'], function ($$1, _, hider, viewerFactory, pdfViewer, pluginFactory, Handlebars, Helpers0) { 'use strict';\n\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n hider = hider && Object.prototype.hasOwnProperty.call(hider, 'default') ? hider['default'] : hider;\n viewerFactory = viewerFactory && Object.prototype.hasOwnProperty.call(viewerFactory, 'default') ? viewerFactory['default'] : viewerFactory;\n pdfViewer = pdfViewer && Object.prototype.hasOwnProperty.call(pdfViewer, 'default') ? pdfViewer['default'] : pdfViewer;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, functionType=\"function\", escapeExpression=this.escapeExpression;\n\n\n buffer += \"
          \\n
          \\n
          \\n
          \\n \";\n if (helper = helpers.title) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.title); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\n \\n
          \\n
          \";\n if (helper = helpers.content) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.content); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"
          \\n
          \\n
          \\n
          \\n\";\n return buffer;\n });\n function panelTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * The name of the plugin\n * @type {String}\n */\n var pluginName = 'documentViewer';\n\n /**\n * Shows the panel, trigger the `panelshow` event\n *\n * @param plugin\n */\n function showPanel(plugin) {\n hider.show(plugin.controls.$panel);\n plugin.trigger('panelshow');\n $$1(window).on(`resize.${plugin.getName()}`, _.debounce(_.partial(resizeViewer, plugin), 50));\n }\n\n /**\n * Hides the panel, trigger the `panelhide` event\n *\n * @param plugin\n */\n function hidePanel(plugin) {\n hider.hide(plugin.controls.$panel);\n plugin.trigger('panelhide');\n $$1(window).off(`resize.${plugin.getName()}`);\n }\n\n /**\n * Hides the panel if it is visible\n *\n * @param plugin\n * @returns {Boolean} Returns `true` if the panel was visible and has been hidden\n */\n function hideIfVisible(plugin) {\n var isVisible = !hider.isHidden(plugin.controls.$panel, true);\n if (isVisible) {\n hidePanel(plugin);\n }\n return isVisible;\n }\n\n /**\n * Initializes the event handlers for the panel container\n *\n * @param plugin\n */\n function initPanelEvents(plugin) {\n var namespace = `.${plugin.getName()}`;\n var stopEvents = ['click', 'mousedown', 'mouseup', 'touchstart', 'touchend', 'keyup', 'keydow', 'keypress', 'scroll', 'drop'].join(`${namespace} `) + namespace;\n var hideViewer = _.partial(hidePanel, plugin);\n function stopPropagation(e) {\n e.stopImmediatePropagation();\n e.stopPropagation();\n }\n plugin.controls.$overlay.off(namespace).on(`click${namespace}`, hideViewer).on(stopEvents, stopPropagation);\n plugin.controls.$panel.off(namespace).on(`click${namespace}`, '.icon-close', hideViewer).on(stopEvents, stopPropagation);\n }\n\n /**\n * Resizes the viewer to fit the panel content area\n * @param plugin\n */\n function resizeViewer(plugin) {\n var $content = plugin.controls.$content;\n plugin.viewer.setSize($content.width(), $content.height());\n }\n\n // all document viewers need to be registered\n viewerFactory.registerProvider('pdf', pdfViewer);\n\n /**\n * Returns the configured plugin\n */\n var documentViewer = pluginFactory({\n name: pluginName,\n /**\n * Initialize the plugin (called during runner's init)\n */\n init: function init() {\n var self = this;\n var testRunner = this.getTestRunner();\n var $panel = $$1(panelTpl());\n\n /**\n * @param {Object} data\n * @param {String} data.label - document title\n * @param {String} data.document - document url\n */\n function displayViewer(data) {\n if (self.getState('enabled') !== false) {\n showPanel(self);\n self.controls.$title.text(data.label);\n resizeViewer(self);\n self.viewer.load(data.document, 'pdf');\n }\n }\n this.controls = {\n $panel: $panel,\n $overlay: $panel.find('.viewer-overlay'),\n $title: $panel.find('.viewer-title'),\n $content: $panel.find('.viewer-content')\n };\n this.viewer = viewerFactory({\n renderTo: this.controls.$content,\n replace: true,\n fitToWidth: true,\n allowSearch: true\n });\n\n //update plugin state based on changes\n testRunner.on('renderitem enabletools', function () {\n self.enable();\n }).on('renderitem', function () {\n self.getAreaBroker().getContentArea().append(self.controls.$panel).off(`.${self.getName()}`).on(`viewDocument.${self.getName()}`, function (event) {\n var data = event.originalEvent.detail;\n displayViewer(data);\n });\n initPanelEvents(self);\n }).on('move', function () {\n hideIfVisible(self);\n }).on('skip', function () {\n hideIfVisible(self);\n }).on('unloaditem disabletools', function () {\n self.disable();\n }).on('tool-documentViewer', function (data) {\n displayViewer(data);\n });\n },\n /**\n * Called during the runner's render phase\n */\n render: function render() {},\n /**\n * Called during the runner's destroy phase\n */\n destroy: function destroy() {\n this.getAreaBroker().getContentArea().off(`.${this.getName()}`);\n if (this.viewer) {\n this.viewer.destroy();\n }\n if (this.controls.$panel) {\n this.controls.$panel.remove();\n }\n this.viewer = null;\n this.controls = {};\n },\n /**\n * Enable the button\n */\n enable: function enable() {},\n /**\n * Disable the button\n */\n disable: function disable() {\n hideIfVisible(this);\n },\n /**\n * Show the button\n */\n show: function show() {},\n /**\n * Hide the button\n */\n hide: function hide() {\n hideIfVisible(this);\n }\n });\n\n return documentViewer;\n\n});\n\n","define('taoQtiTest/runner/plugins/tools/highlighter/highlighter',['lodash', 'jquery', 'core/eventifier', 'ui/highlighter'], function (_, $, eventifier, highlighterFactory) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n $ = $ && Object.prototype.hasOwnProperty.call($, 'default') ? $['default'] : $;\n eventifier = eventifier && Object.prototype.hasOwnProperty.call(eventifier, 'default') ? eventifier['default'] : eventifier;\n highlighterFactory = highlighterFactory && Object.prototype.hasOwnProperty.call(highlighterFactory, 'default') ? highlighterFactory['default'] : highlighterFactory;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA;\n */\n var prevSelection = [];\n var selection;\n if (!window.getSelection) throw new Error('Browser does not support getSelection()');\n selection = window.getSelection();\n\n /**\n * Returns an array of active ranges.\n * If browser doesn't support multiple Ranges, returns only the first range\n * see note on https://w3c.github.io/selection-api/#methods\n *\n * @returns {Range[]}\n */\n function getAllRanges() {\n var i,\n allRanges = [];\n for (i = 0; i < selection.rangeCount; i++) {\n allRanges.push(selection.getRangeAt(i));\n }\n return allRanges;\n }\n\n /**\n * Discards the global text selection from the browser (window.selection)\n */\n function discardSelection() {\n // delay discarding, to allow time for multiple highlighters logic\n setTimeout(function () {\n selection.removeAllRanges();\n }, 250);\n }\n\n /**\n * The highlighter Factory\n * @param {Object} options\n * @param {String} [options.className]\n * @param {String} [options.containerSelector]\n * @param {Array} [options.containersBlackList]\n * @param {String} [options.id]\n * @returns {Object} the highlighter instance\n */\n function testHighlighterFactory(options) {\n /**\n * Is this highlighter enabled or disabled?\n * @type {boolean}\n */\n var enabled = true;\n\n /**\n * Are we in highlight mode, meaning that each new selection is automatically highlighted\n * without having to press any button\n * @type {boolean}\n */\n var isHighlighting = false;\n\n /**\n * The helper that does the highlight magic\n */\n var highlightHelper = highlighterFactory({\n className: options.className || 'txt-user-highlight',\n containerSelector: options.containerSelector || '.qti-itemBody',\n containersBlackList: options.containersBlackList || [],\n clearOnClick: true\n });\n\n //add event to automatically highlight the recently made selection if needed\n $(document).on('mouseup.highlighter', function () {\n if (isHighlighting && !selection.isCollapsed) {\n highlightHelper.highlightRanges(getAllRanges());\n discardSelection();\n }\n });\n\n //add event to automatically highlight the recently made selection if needed\n //added touch event (as from TAO-6578)\n $(document).on('touchend.highlighter', function () {\n if (isHighlighting && !selection.isCollapsed) {\n highlightHelper.highlightRanges(getAllRanges());\n }\n });\n\n // iOS devices clears selection after click on button,\n // so we store prev selection for this devices to be able\n // to use it after click on highlight button\n if (/iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream) {\n $(document).on('selectionchange', function () {\n if (!isHighlighting) {\n prevSelection = _.clone(getAllRanges(), true);\n }\n });\n }\n\n /**\n * The highlighter instance\n */\n return eventifier({\n /**\n * Enable this instance\n */\n enable: function enable() {\n enabled = true;\n },\n /**\n * Disable this instance\n */\n disable: function disable() {\n enabled = false;\n },\n /**\n * Is this instance currently enabled?\n * @returns {Boolean}\n */\n isEnabled: function isEnabled() {\n return enabled;\n },\n /**\n * toggle highlighting mode on and off\n * @param {Boolean} bool - wanted state\n */\n toggleHighlighting: function toggleHighlighting(bool) {\n isHighlighting = bool;\n if (isHighlighting) {\n this.trigger('start');\n $('.qti-itemBody').toggleClass('highlighter-cursor', true);\n } else {\n this.trigger('end');\n $('.qti-itemBody').toggleClass('highlighter-cursor', false);\n }\n return this;\n },\n /**\n * Either highlight the current or selection, or toggle highlighting mode\n */\n highlight: function highlight() {\n if (!isHighlighting) {\n if (!selection.isCollapsed) {\n this.toggleHighlighting(true);\n highlightHelper.highlightRanges(getAllRanges());\n this.toggleHighlighting(false);\n discardSelection();\n } else if (prevSelection[0] && !prevSelection[0].collapsed) {\n this.toggleHighlighting(true);\n highlightHelper.highlightRanges(prevSelection);\n this.toggleHighlighting(false);\n discardSelection();\n } else {\n this.toggleHighlighting(true);\n }\n } else {\n this.toggleHighlighting(false);\n }\n },\n /**\n * restore the highlight from a given index\n * @param {Array} index\n */\n restoreIndex: function restoreIndex(index) {\n if (index && index.length > 0) {\n highlightHelper.highlightFromIndex(index);\n }\n },\n /**\n * Get the current index\n * @returns {Array} index\n */\n getIndex: function getIndex() {\n return highlightHelper.getHighlightIndex();\n },\n /**\n * remove all highlights\n */\n clearHighlights: function clearHighlights() {\n highlightHelper.clearHighlights();\n selection.removeAllRanges();\n },\n /**\n * Getter for the instance's id\n * @returns {String}\n */\n getId: function getId() {\n return options.id;\n }\n });\n }\n\n return testHighlighterFactory;\n\n});\n\n","define('taoQtiTest/runner/plugins/tools/highlighter/collection',['taoQtiTest/runner/plugins/tools/highlighter/highlighter'], function (highlighterFactory) { 'use strict';\n\n highlighterFactory = highlighterFactory && Object.prototype.hasOwnProperty.call(highlighterFactory, 'default') ? highlighterFactory['default'] : highlighterFactory;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * @var {Array} highlighters - Highlighters collection\n * We can run multiple instances of the highlighter plugin on one page:\n * - one for item-level highlights, which persist for the Test session\n * - others for stimulus-level highlights, which should persist across multiple sessions (TAO-7617)\n */\n var highlighters = [];\n\n /**\n * @typedef {highlighterCollection}\n * @returns {Object}\n */\n var highlighterCollection = function highlighterCollection() {\n return {\n /**\n * Instantiates new highlighter and adds it to array\n * @param {Object} options\n * @param {String} options.className - class applied to highlighted spans\n * @param {String} options.containerSelector - selector for the unique root DOM node the HL will work on\n * @param {Array} options.containersBlackList - list of children which should not receive highlights\n * @param {String} options.id\n * @returns {Object} a highlighter instance\n */\n addHighlighter: function addHighlighter(options) {\n var hl = highlighterFactory(options);\n highlighters.push(hl);\n return hl;\n },\n /**\n * Retrieves one highlighter from the collection by matching its id\n * @param {String} id\n * @returns {Object} highlighter instance\n */\n getHighlighterById: function getHighlighterById(id) {\n return highlighters.find(function (hl) {\n return hl.getId() === id;\n });\n },\n /**\n * Retrieves the full array of highlighters from the collection\n * @returns {Array}\n */\n getAllHighlighters: function getAllHighlighters() {\n return highlighters;\n },\n /**\n * Retrieves the first highlighter in the collection\n * @returns {Object} highlighter instance\n */\n getItemHighlighter: function getItemHighlighter() {\n return highlighters[0];\n },\n /**\n * Retrieves the fully array of highlighter from the collection, minus the first one\n * @returns {Array} highlighter instance\n */\n getNonItemHighlighters: function getNonItemHighlighters() {\n return highlighters.slice(1);\n },\n /**\n * Empties th highlighter collection\n * @returns {Integer}\n */\n getLength: function getLength() {\n return highlighters.length;\n },\n /**\n * Empties the highlighter collection\n * @returns {Object}\n */\n empty: function empty() {\n highlighters = [];\n return this;\n }\n };\n };\n\n return highlighterCollection;\n\n});\n\n","define('taoQtiTest/runner/plugins/tools/highlighter/plugin',['jquery', 'lodash', 'i18n', 'core/logger', 'taoTests/runner/plugin', 'util/shortcut', 'util/namespace', 'taoQtiTest/runner/helpers/currentItem', 'taoQtiTest/runner/plugins/tools/highlighter/collection', 'taoQtiTest/runner/helpers/map'], function ($, _, __, loggerFactory, pluginFactory, shortcut, namespaceHelper, itemHelper, highlighterCollection, mapHelper) { 'use strict';\n\n $ = $ && Object.prototype.hasOwnProperty.call($, 'default') ? $['default'] : $;\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n loggerFactory = loggerFactory && Object.prototype.hasOwnProperty.call(loggerFactory, 'default') ? loggerFactory['default'] : loggerFactory;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n shortcut = shortcut && Object.prototype.hasOwnProperty.call(shortcut, 'default') ? shortcut['default'] : shortcut;\n namespaceHelper = namespaceHelper && Object.prototype.hasOwnProperty.call(namespaceHelper, 'default') ? namespaceHelper['default'] : namespaceHelper;\n itemHelper = itemHelper && Object.prototype.hasOwnProperty.call(itemHelper, 'default') ? itemHelper['default'] : itemHelper;\n highlighterCollection = highlighterCollection && Object.prototype.hasOwnProperty.call(highlighterCollection, 'default') ? highlighterCollection['default'] : highlighterCollection;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Returns the configured plugin\n */\n var plugin = pluginFactory({\n name: 'highlighter',\n /**\n * Install plugin's functions\n *\n */\n install: function install() {\n var testRunner = this.getTestRunner();\n\n //define the \"highlighter\" store as \"volatile\" (removed on browser change).\n testRunner.getTestStore().setVolatile(this.getName());\n },\n /**\n * Initialize the plugin (called during runner's init)\n * @returns {void}\n */\n init: function init() {\n const self = this;\n const testRunner = this.getTestRunner();\n const testRunnerOptions = testRunner.getOptions();\n const pluginShortcuts = (testRunnerOptions.shortcuts || {})[this.getName()] || {};\n let hasHighlights = false;\n const logger = loggerFactory('highlighterPlugin');\n\n /**\n * @var {Object} highlighters - Highlighters collection\n * See taoQtiTest/views/js/runner/plugins/tools/highlighter/collection.js\n */\n var highlighters = highlighterCollection();\n\n // Create the first (item-level) highlighter instance:\n highlighters.addHighlighter({\n className: 'txt-user-highlight',\n containerSelector: '.qti-itemBody',\n containersBlackList: ['.qti-include'],\n id: 'item-highlighter'\n });\n\n // create buttons\n this.buttonMain = this.getAreaBroker().getToolbox().createEntry({\n title: __('Highlight Text'),\n icon: 'text-marker',\n control: 'highlight-trigger',\n aria: {\n pressed: 'false',\n label: __('(Visual) Highlight Text')\n },\n text: __('Highlight')\n });\n this.buttonRemove = this.getAreaBroker().getToolbox().createEntry({\n title: __('Clear all active highlights'),\n icon: 'result-nok',\n control: 'highlight-clear',\n aria: {\n label: __('(Visual) Clear all active highlights')\n },\n text: __('Clear Highlights')\n });\n\n // attach user events\n this.buttonMain.on('mousedown', function (e) {\n // using 'mousedown' instead of 'click' to avoid losing current selection\n e.preventDefault();\n if (isPluginEnabled()) {\n _.forEach(highlighters.getAllHighlighters(), function (instance) {\n if (instance.isEnabled()) {\n instance.highlight();\n }\n });\n }\n });\n this.buttonRemove.on('click', function (e) {\n e.preventDefault();\n if (isPluginEnabled()) {\n _.forEach(highlighters.getAllHighlighters(), function (instance) {\n if (instance.isEnabled()) {\n instance.clearHighlights();\n }\n });\n testRunner.trigger('clear');\n }\n });\n if (testRunnerOptions.allowShortcuts) {\n if (pluginShortcuts.toggle) {\n shortcut.add(namespaceHelper.namespaceAll(pluginShortcuts.toggle, this.getName(), true), function () {\n if (isPluginEnabled()) {\n _.forEach(highlighters.getAllHighlighters(), function (instance) {\n if (instance.isEnabled()) {\n instance.highlight();\n }\n });\n }\n }, {\n avoidInput: true,\n prevent: true\n });\n }\n }\n\n //start disabled\n this.disable();\n\n /**\n * Checks if the plugin is currently available\n * @returns {Boolean}\n */\n function isPluginEnabled() {\n //to be activated with the special category x-tao-option-highlighter\n return mapHelper.hasItemCategory(testRunner.getTestMap(), testRunner.getTestContext().itemIdentifier, 'highlighter', true);\n }\n\n /**\n * Is plugin activated ? if not, then we hide the plugin\n */\n function togglePlugin() {\n if (isPluginEnabled()) {\n self.show();\n } else {\n self.hide();\n }\n }\n\n /**\n * Gets the browser test store\n * Can be in volatile or non-volatile mode, depending on config\n * @returns {Promise}\n */\n function getStore() {\n return testRunner.getTestStore().getStore(self.getName());\n }\n\n /**\n * Load the stores and hook the behavior\n */\n return getStore().then(function (highlighterStore) {\n /**\n * Saves a highlighter's state to the appropriate store\n * @param {String} [itemId] - must be provided to save item-level highlights,\n * will be used as store key if no key provided\n * @param {String} [key] - a key (e.g. a stimulus href) under which we store non-item-level highlights\n * @returns {Boolean} true if save was done\n */\n function saveHighlight(itemId, key) {\n var instance;\n var highlightsIndex;\n if (!itemId) {\n instance = highlighters.getHighlighterById(key);\n } else {\n key = itemId;\n instance = highlighters.getItemHighlighter();\n }\n if (!instance) return Promise.resolve(false);\n highlightsIndex = instance.getIndex();\n if (isPluginEnabled() && hasHighlights && key) {\n logger.debug(`Saving ${highlightsIndex.length} highlights for id ${key}`);\n return highlighterStore.setItem(key, highlightsIndex);\n }\n return false;\n }\n\n /**\n * Saves all the highlighters states in the store\n * First the non-item highlighters, then the item highlighter (index 0)\n * @returns {Promise} resolves once the save is done\n */\n function saveAll() {\n var nonItemHighlighters = highlighters.getNonItemHighlighters();\n return Promise.all(_(nonItemHighlighters).filter(function (instance) {\n return instance.isEnabled();\n }).map(function (instance) {\n var key = instance.getId();\n return saveHighlight(null, key);\n }).value()).then(function (results) {\n // Now save the main item highlight\n // and if every setItem() returned true, return true\n var itemId = testRunner.getTestContext().itemIdentifier;\n return saveHighlight(itemId) && _.every(results);\n });\n }\n\n /**\n * Retrieves a highlighter's state from a store and applies it to the DOM\n * @param {String} [itemId] - must be provided to save item-level highlights,\n * will be used as store key if no key provided\n * @param {String} [key] - a key (e.g. a stimulus href) under which we store non-item-level highlights\n * @returns {Promise} resolves once the load is done\n */\n function loadHighlight(itemId, key) {\n var instance;\n if (!itemId) {\n instance = highlighters.getHighlighterById(key);\n } else {\n key = itemId;\n instance = highlighters.getItemHighlighter();\n }\n if (!instance) return Promise.resolve(false);\n return highlighterStore.getItem(key).then(function (index) {\n if (index) {\n logger.debug(`Loading ${index.length} highlights for key ${key}`);\n hasHighlights = true;\n instance.restoreIndex(index);\n }\n }).then(function () {\n //save highlighter state during the item session,\n //when the highlighting ends\n instance.on('end.save', function () {\n return saveHighlight(itemId, key);\n });\n });\n }\n\n //update plugin state based on changes\n testRunner.on('loaditem', togglePlugin).on('enabletools renderitem', function () {\n self.enable();\n if (isPluginEnabled()) {\n _.forEach(highlighters.getAllHighlighters(), function (instance) {\n if (!instance.isEnabled()) {\n instance.on('start').toggleHighlighting(false).enable();\n }\n });\n }\n }).on('renderitem', function () {\n var textStimuli;\n var itemId = testRunner.getTestContext().itemIdentifier;\n if (itemId && isPluginEnabled()) {\n hasHighlights = false;\n highlighters.getItemHighlighter().enable();\n // Load item-level highlights from store:\n loadHighlight(itemId);\n\n // Count stimuli in this item:\n textStimuli = itemHelper.getTextStimuliHrefs(testRunner);\n\n // NOW we can instantiate the extra highlighters:\n _.forEach(textStimuli, function (textStimulusHref) {\n var stimHighlighter = highlighters.getHighlighterById(textStimulusHref);\n // Instantiate, if id not already present in highlighters...\n if (!stimHighlighter) {\n stimHighlighter = highlighters.addHighlighter({\n className: 'txt-user-highlight',\n containerSelector: `.qti-include[data-href=\"${textStimulusHref}\"]`,\n id: textStimulusHref\n });\n }\n stimHighlighter.enable();\n // And load its data:\n loadHighlight(null, textStimulusHref);\n });\n }\n }).after('renderitem', function () {\n // Attach start/end listeners only to item level highlighter\n const instance = highlighters.getItemHighlighter();\n if (instance.isEnabled()) {\n instance.on('start', function () {\n self.buttonMain.turnOn();\n self.buttonMain.$component.attr('aria-pressed', 'true');\n self.trigger('start');\n hasHighlights = true;\n }).on('end', function () {\n self.buttonMain.turnOff();\n self.buttonMain.$component.attr('aria-pressed', 'false');\n self.trigger('end');\n });\n }\n }).after('clear.highlighter', function () {\n saveAll();\n }).before('skip move timeout', function () {\n return saveAll();\n }).on('disabletools unloaditem', function () {\n self.disable();\n if (isPluginEnabled()) {\n _.forEach(highlighters.getAllHighlighters(), function (instance) {\n if (instance.isEnabled()) {\n instance.off('end.save end start').toggleHighlighting(false).disable();\n }\n });\n }\n });\n });\n },\n /**\n * Called during the runner's destroy phase\n */\n destroy: function destroy() {\n shortcut.remove(`.${this.getName()}`);\n $(document).off('.highlighter');\n },\n /**\n * Enable the button\n */\n enable: function enable() {\n this.buttonMain.enable();\n this.buttonRemove.enable();\n },\n /**\n * Disable the button\n */\n disable: function disable() {\n this.buttonMain.disable();\n this.buttonRemove.disable();\n },\n /**\n * Show the button\n */\n show: function show() {\n this.buttonMain.show();\n this.buttonRemove.show();\n },\n /**\n * Hide the button\n */\n hide: function hide() {\n this.buttonMain.hide();\n this.buttonRemove.hide();\n }\n });\n\n return plugin;\n\n});\n\n","define('taoQtiTest/runner/plugins/tools/itemThemeSwitcher/itemThemeSwitcher',['jquery', 'lodash', 'i18n', 'taoTests/runner/plugin', 'ui/hider', 'ui/themes', 'util/shortcut', 'util/namespace', 'ui/themeLoader'], function ($, _, __, pluginFactory, hider, themeHandler, shortcut, namespaceHelper, themeLoader) { 'use strict';\n\n $ = $ && Object.prototype.hasOwnProperty.call($, 'default') ? $['default'] : $;\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n themeHandler = themeHandler && Object.prototype.hasOwnProperty.call(themeHandler, 'default') ? themeHandler['default'] : themeHandler;\n shortcut = shortcut && Object.prototype.hasOwnProperty.call(shortcut, 'default') ? shortcut['default'] : shortcut;\n namespaceHelper = namespaceHelper && Object.prototype.hasOwnProperty.call(namespaceHelper, 'default') ? namespaceHelper['default'] : namespaceHelper;\n themeLoader = themeLoader && Object.prototype.hasOwnProperty.call(themeLoader, 'default') ? themeLoader['default'] : themeLoader;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Returns the configured plugin\n */\n var itemThemeSwitcher = pluginFactory({\n name: 'itemThemeSwitcher',\n /**\n * Install step, add behavior before the lifecycle.\n */\n install: function install() {\n //define the \"itemThemeSwitcher\" store as \"volatile\" (removed on browser change).\n this.getTestRunner().getTestStore().setVolatile(this.getName());\n },\n /**\n * Initialize the plugin (called during runner's init)\n */\n init: function init() {\n var self = this;\n var pluginName = this.getName();\n var testRunner = this.getTestRunner();\n var testRunnerOptions = testRunner.getOptions();\n var pluginShortcuts = (testRunnerOptions.shortcuts || {})[this.getName()] || {};\n const pluginConfig = this.getConfig();\n this.oldNamespace = themeHandler.getActiveNamespace();\n const state = {\n availableThemes: [],\n defaultTheme: '',\n selectedTheme: ''\n };\n const allMenuEntries = [];\n if (pluginConfig.activeNamespace) {\n themeHandler.setActiveNamespace(pluginConfig.activeNamespace);\n }\n const themesConfig = themeHandler.get('items') || {};\n if (pluginConfig.activeNamespace !== this.oldNamespace && !_.isEmpty(themesConfig)) {\n reloadThemes();\n }\n\n /**\n * Tells if the component is enabled\n * @returns {Boolean}\n */\n function isPluginAllowed() {\n return themesConfig && _.size(themesConfig.available) > 1;\n }\n\n /**\n * Reloads theme config and changes theme\n */\n function reloadThemes() {\n var themeConfig = themeHandler.get('items');\n themeLoader(themeConfig).load();\n if (state && state.selectedTheme) {\n changeTheme(state.selectedTheme);\n } else {\n changeTheme(themeConfig.default);\n }\n }\n\n /**\n * Load the selected theme\n * @param themeId\n */\n function changeTheme(themeId) {\n var $qtiItem = $('.qti-item');\n var previousTheme = state.selectedTheme;\n state.selectedTheme = themeId;\n if ($qtiItem) {\n _.defer(function () {\n $qtiItem.trigger('themechange', [state.selectedTheme]);\n });\n }\n if (self.storage) {\n self.storage.setItem('itemThemeId', themeId);\n }\n if (previousTheme !== state.selectedTheme) {\n testRunner.trigger('themechange', state.selectedTheme, previousTheme);\n }\n allMenuEntries.forEach(function (menuEntry) {\n if (menuEntry.getId() === themeId) {\n menuEntry.turnOn();\n } else {\n menuEntry.turnOff();\n }\n });\n }\n\n //init plugin state\n if (themesConfig) {\n if (themesConfig.default) {\n state.defaultTheme = themesConfig.default;\n state.selectedTheme = themesConfig.default;\n changeTheme(themesConfig.default);\n }\n if (themesConfig.available) {\n _.forEach(themesConfig.available, function (theme) {\n state.availableThemes.push({\n id: theme.id,\n label: __(theme.name)\n });\n });\n }\n }\n\n // register toolbox button\n this.menuButton = this.getAreaBroker().getToolbox().createMenu({\n control: 'color-contrast',\n title: __('Change the current color preset'),\n icon: 'contrast',\n text: __('Contrast')\n }).after('render', () => {\n if (!isPluginAllowed()) {\n self.hide();\n }\n }).on('click', function (e) {\n e.preventDefault();\n testRunner.trigger('tool-themeswitcher-toggle');\n }).on('openmenu', function () {\n testRunner.trigger(`plugin-open.${pluginName}`, state.selectedTheme);\n }).on('closemenu', function () {\n testRunner.trigger(`plugin-close.${pluginName}`, state.selectedTheme);\n });\n\n // register menu entries\n state.availableThemes.forEach(function (theme) {\n var themeEntry = self.getAreaBroker().getToolbox().createEntry({\n role: 'option',\n control: theme.id,\n title: theme.label,\n icon: 'preview',\n text: __(theme.label)\n });\n themeEntry.setMenuId('color-contrast');\n themeEntry.on('click', function (e) {\n var themeId = this.config.control;\n e.preventDefault();\n self.menuButton.turnOffAll();\n this.turnOn();\n changeTheme(themeId);\n });\n if (state.defaultTheme === theme.id) {\n themeEntry.on('render', function () {\n this.turnOn();\n });\n }\n allMenuEntries.push(themeEntry);\n });\n if (testRunnerOptions.allowShortcuts) {\n if (pluginShortcuts.toggle) {\n shortcut.add(namespaceHelper.namespaceAll(pluginShortcuts.toggle, this.getName(), true), function () {\n testRunner.trigger('tool-themeswitcher-toggle');\n }, {\n avoidInput: true\n });\n }\n }\n if (!isPluginAllowed()) {\n this.hide();\n }\n\n //start disabled\n this.disable();\n\n //update plugin state based on changes\n testRunner.on('loaditem', function () {\n if (isPluginAllowed()) {\n self.show();\n } else {\n self.hide();\n }\n }).on('renderitem', function () {\n self.enable();\n changeTheme(state.selectedTheme);\n }).on('enabletools', function () {\n self.enable();\n }).on('disabletools unloaditem', function () {\n self.disable();\n }).on('tool-themeswitcher-toggle', function () {\n if (self.getState('enabled') !== false) {\n self.menuButton.toggleMenu();\n }\n }).on('tool-themeswitcher-setnavtype', function (type) {\n self.menuButton.setNavigationType(type);\n });\n return testRunner.getPluginStore(this.getName()).then(function (itemThemesStore) {\n self.storage = itemThemesStore;\n self.storage.getItem('itemThemeId').then(function (itemThemeId) {\n if (itemThemeId && state.selectedTheme !== itemThemeId) {\n changeTheme(itemThemeId);\n }\n });\n });\n },\n /**\n * Called during the runner's destroy phase\n */\n destroy: function destroy() {\n themeHandler.setActiveNamespace(this.oldNamespace);\n shortcut.remove(`.${this.getName()}`);\n return this.getTestRunner().getPluginStore(this.getName()).then(function (itemThemesStore) {\n return itemThemesStore.removeItem('itemThemeId');\n });\n },\n /**\n * Enable the button\n */\n enable: function enable() {\n this.menuButton.enable();\n },\n /**\n * Disable the button\n */\n disable: function disable() {\n this.menuButton.disable();\n },\n /**\n * Show the button\n */\n show: function show() {\n this.menuButton.show();\n },\n /**\n * Hide the button\n */\n hide: function hide() {\n this.menuButton.hide();\n }\n });\n\n return itemThemeSwitcher;\n\n});\n\n","define('taoQtiTest/runner/plugins/tools/lineReader/compoundMask',['jquery', 'lodash', 'core/statifier', 'core/eventifier', 'ui/component', 'ui/component/placeable', 'ui/component/draggable', 'ui/component/resizable', 'ui/component/stackable'], function ($, _, statifier, eventifier, componentFactory, makePlaceable, makeDraggable, makeResizable, makeStackable) { 'use strict';\n\n $ = $ && Object.prototype.hasOwnProperty.call($, 'default') ? $['default'] : $;\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n statifier = statifier && Object.prototype.hasOwnProperty.call(statifier, 'default') ? statifier['default'] : statifier;\n eventifier = eventifier && Object.prototype.hasOwnProperty.call(eventifier, 'default') ? eventifier['default'] : eventifier;\n componentFactory = componentFactory && Object.prototype.hasOwnProperty.call(componentFactory, 'default') ? componentFactory['default'] : componentFactory;\n makePlaceable = makePlaceable && Object.prototype.hasOwnProperty.call(makePlaceable, 'default') ? makePlaceable['default'] : makePlaceable;\n makeDraggable = makeDraggable && Object.prototype.hasOwnProperty.call(makeDraggable, 'default') ? makeDraggable['default'] : makeDraggable;\n makeResizable = makeResizable && Object.prototype.hasOwnProperty.call(makeResizable, 'default') ? makeResizable['default'] : makeResizable;\n makeStackable = makeStackable && Object.prototype.hasOwnProperty.call(makeStackable, 'default') ? makeStackable['default'] : makeStackable;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017 (original work) Open Assessment Technologies SA;\n */\n var defaultDimensions = {\n outerWidth: 600,\n outerHeight: 400,\n innerWidth: 500,\n innerHeight: 20\n };\n var defaultPosition = {\n outerX: 0,\n outerY: 0,\n innerX: 50,\n innerY: 50\n };\n var defaultOptions = {\n dragMinWidth: 10,\n dragMinHeight: 10,\n resizeHandleSize: 10,\n innerDragHeight: 20\n };\n var stackingOptions = {\n stackingScope: 'test-runner'\n };\n var constrains;\n\n /**\n * @param {Object} options\n * @param {Number} options.resizeHandleSize - size of the resize handlers on each resizable edge\n * @param {Number} options.dragMinWidth - minimal width for the draggable area of each component.\n * @param {Number} options.dragMinHeight - minimal height for the draggable area of each component.\n * @param {Number} options.innerDragHeight - height of the inner window drag handle\n * @param {Object} dimensions\n * @param {Number} dimensions.outerWidth - overall mask width\n * @param {Number} dimensions.outerHeight - overall mask height\n * @param {Number} dimensions.innerWidth - inner window width\n * @param {Number} dimensions.innerHeight - inner window height\n * @param {Number} position\n * @param {Number} position.outerX - overall mask x\n * @param {Number} position.outerY - overall mask y\n * @param {Number} position.innerX - inner window mask x\n * @param {Number} position.innerY - inner window mask y\n */\n function compoundMaskFactory(options, dimensions, position) {\n var compoundMask,\n allParts = {},\n innerDrag,\n closer,\n visualGuides = {};\n\n /**\n * ============================================\n * Definition of Mask & Overlay component types\n * ============================================\n */\n\n /**\n * Create a mask component. They are used for masking (obviously) but also resizing the compound mask\n * @param {Object} maskConfig\n * @param {String} maskConfig.id\n * @param {Function} maskConfig.place - size and position the mask according to the transform model\n * @param {Function} maskConfig.placeOverlay - size and position the overlay according to the transform model\n * @param {Function} maskConfig.beforeResize - used to set the resize limit depending on which edge the resizing occurs\n * @param {Function} maskConfig.onResize - how the resize affect the transform model\n * @param {Object} maskConfig.edges - Interact configuration to specify which edges can be used for resizing\n * @param {Number} maskConfig.minWidth\n * @param {Number} maskConfig.minHeight\n */\n function createMask(maskConfig) {\n var mask,\n maskAPI = {\n place: maskConfig.place,\n placeOverlay: maskConfig.placeOverlay,\n styleResizableEdges: function styleResizableEdges() {\n var $element = this.getElement();\n _.forOwn(this.config.edgesBorders, function (isResizable, edgeId) {\n if (isResizable) {\n $element.addClass(`border-${edgeId}`);\n }\n });\n },\n addResizeControll: function addResizeControll() {\n var $element = this.getElement();\n var $resizeControll = $('
          ', {\n class: 'resize-control'\n });\n $element.append($resizeControll);\n }\n };\n mask = componentFactory(maskAPI, maskConfig);\n makeResizable(mask);\n makeStackable(mask, stackingOptions);\n return mask.on('render', function () {\n var $element = this.getElement();\n this.styleResizableEdges();\n if (this.config.resizeControll) {\n this.addResizeControll();\n }\n $element.addClass(`line-reader-mask ${maskConfig.id}`).on('mousedown touchstart', function () {\n bringAllToFront();\n });\n\n // uncomment this to see what's going on with masks:\n // $element.css({ border: '1px solid olive'});\n }).on('resizestart', function () {\n innerDrag.hide();\n closer.hide();\n invokeOnOverlays('hide');\n invokeOnMasks('setState', ['resizing', true]);\n this.setState('resizer', true);\n }).on('beforeresize', maskConfig.beforeResize || _.noop).on('resize', maskConfig.onResize || _.noop).on('resizeend', function () {\n applyTransformsToOverlays();\n applyTransformsToInnerDrag();\n applyTransformsToCloser();\n invokeOnMasks('setState', ['resizing', false]);\n invokeOnOverlays('show');\n innerDrag.show();\n closer.show();\n this.setState('resizer', false);\n }).init();\n }\n\n /**\n * Create a overlay component. Overlay are invisible and are used for dragging.\n * When clicked, the whole mask is hidden and only the overlay is displayed, after being resized to fit the whole mask surface\n * this allows for performance improvement as well as giving the dragged element proper dragging boundaries.\n * Also, visual guides are added, like a fake inner window, during the drag\n * @param {Object} overlayConfig\n * @param {String} overlayConfig.id\n */\n function createOverlay(overlayConfig) {\n var overlay,\n overlayAPI = {\n transformOverlay: function transformOverlay() {\n var $element = this.getElement();\n this._sizeBackup = this.getSize();\n this._posBackup = this.getPosition();\n this.setSize(dimensions.outerWidth, dimensions.outerHeight).moveTo(position.outerX, position.outerY);\n $element.addClass('moving');\n this.setState('transformed', true);\n },\n restoreOverlay: function restoreOverlay() {\n var $element = this.getElement();\n if (this.is('transformed')) {\n this.setSize(this._sizeBackup.width, this._sizeBackup.height).moveTo(this._posBackup.x, this._posBackup.y);\n $element.removeClass('moving');\n this._sizeBackup = null;\n this._posBackup = null;\n this.setState('transformed', false);\n }\n },\n appendVisualGuides: function appendVisualGuides() {\n var $element = this.getElement(),\n borderWidth = 1,\n // this mirror the $lrBorderWidth css variable\n borderOffset = borderWidth * 2;\n $element.append(visualGuides.$maskBg);\n $element.append(visualGuides.$innerWindow);\n visualGuides.$maskBg.css({\n width: dimensions.outerWidth - borderOffset,\n height: dimensions.outerHeight - borderOffset,\n 'border-top-width': dimensions.topHeight - borderOffset,\n 'border-right-width': dimensions.rightWidth - borderOffset,\n 'border-bottom-width': dimensions.bottomHeight - borderOffset,\n 'border-left-width': dimensions.leftWidth - borderOffset\n });\n visualGuides.$innerWindow.css({\n width: dimensions.innerWidth,\n height: dimensions.innerHeight,\n left: dimensions.leftWidth - borderOffset,\n top: dimensions.topHeight - borderOffset\n });\n },\n removeVisualGuides: function removeVisualGuides() {\n visualGuides.$maskBg.remove();\n visualGuides.$innerWindow.remove();\n }\n };\n overlay = componentFactory(overlayAPI, overlayConfig);\n makeDraggable(overlay);\n makeStackable(overlay, stackingOptions);\n return overlay.on('render', function () {\n var self = this,\n $element = this.getElement(),\n // captures touch and mouse\n // also fixes issue with IE not capturing 'mousedown' etc\n pointerEventsPrefix = window.PointerEvent ? 'pointer' : 'mouse',\n $moveIcon = $('
          ', {\n class: 'icon icon-mobile-menu'\n });\n $element.addClass(`line-reader-overlay ${overlayConfig.id}`).on(`${pointerEventsPrefix}down` + ` touchstart`, function () {\n bringAllToFront();\n self.transformOverlay();\n }).on(`${pointerEventsPrefix}up` + ` touchend`, function () {\n self.restoreOverlay();\n }).prepend($moveIcon);\n }).on('dragstart', function () {\n innerDrag.hide();\n closer.hide();\n invokeOnMasks('hide');\n this.appendVisualGuides();\n }).on('dragmove', function moveAllPartsTogether(xOffsetRelative, yOffsetRelative) {\n // update the transform model\n position.outerX += xOffsetRelative;\n position.outerY += yOffsetRelative;\n position.innerX += xOffsetRelative;\n position.innerY += yOffsetRelative;\n }).on('dragend', function () {\n this.removeVisualGuides();\n // although they are already display, calling show() again on the overlays\n // will force their z-Index at the top of the stack\n invokeOnAll('show');\n innerDrag.show();\n closer.show();\n\n // apply the new transform model\n applyTransforms();\n }).init();\n }\n\n /**\n * ==========================\n * Inner Drag Handle & Closer\n * ==========================\n */\n\n /**\n * This handle allows to drag the inner window\n */\n function createInnerDragHandle() {\n // uncomment this (and a few lines below) if debugging is needed:\n // var $boundingBox = $('
          ').css({ position: 'fixed', 'box-sizing': 'border-box', border: '1px solid red' });\n\n innerDrag = componentFactory();\n makeStackable(innerDrag, stackingOptions);\n makeDraggable(innerDrag, {\n dragRestriction: function dragRestriction() {\n var fixedXY = allParts.nw.mask.getElement().offset(),\n rect;\n rect = {\n x: fixedXY.left + constrains.minWidth,\n y: fixedXY.top + (constrains.minTopHeight + dimensions.innerHeight + options.resizeHandleSize),\n width: dimensions.outerWidth - constrains.minWidth * 2,\n height: dimensions.outerHeight - (dimensions.innerHeight + constrains.minTopHeight + constrains.minBottomHeight - options.innerDragHeight)\n };\n\n // uncomment to see what's going on:\n // allParts.ne.mask.getContainer().append($boundingBox);\n // $boundingBox.css({ width: rect.width, height: rect.height, top: rect.y, left: rect.x });\n\n return rect;\n }\n }).on('render', function () {\n var $element = this.getElement(),\n $dragIcon = $('
          ', {\n class: 'icon icon-move'\n });\n $element.css('touch-action', 'none');\n $element.addClass('line-reader-inner-drag');\n $element.css({\n background: 'none'\n });\n $element.append($dragIcon);\n }).on('dragstart', function () {\n closer.hide();\n bringAllToFront();\n invokeOnMasks('setState', ['resizing', true]);\n }).on('dragmove', function (xOffsetRelative, yOffsetRelative) {\n position.innerX += xOffsetRelative;\n position.innerY += yOffsetRelative;\n dimensions.leftWidth += xOffsetRelative;\n dimensions.topHeight += yOffsetRelative;\n dimensions.rightWidth -= xOffsetRelative;\n dimensions.bottomHeight -= yOffsetRelative;\n applyTransformsToMasks();\n }).on('dragend', function () {\n innerDrag.bringToFront();\n closer.show();\n invokeOnMasks('setState', ['resizing', false]);\n applyTransformsToOverlays();\n }).init();\n }\n\n /**\n * Close button for the compound mask\n */\n function createCloser() {\n closer = componentFactory();\n makeStackable(closer, stackingOptions);\n makePlaceable(closer).on('render', function () {\n var self = this,\n $element = this.getElement(),\n $closeIcon = $('
          ', {\n class: 'icon icon-result-nok'\n });\n $element.append($closeIcon);\n $element.addClass('line-reader-closer');\n $element.on('mousedown touchstart', function () {\n bringAllToFront();\n });\n $element.on('click', function (e) {\n e.stopPropagation();\n self.trigger('click');\n });\n }).init();\n }\n\n /**\n * =================\n * Utility functions\n * =================\n */\n function bringAllToFront() {\n invokeOnAll('bringToFront');\n innerDrag.bringToFront();\n closer.bringToFront();\n }\n function invokeOnAll(fn, args) {\n invokeOnMasks(fn, args);\n invokeOnOverlays(fn, args);\n }\n function invokeOnMasks(fn, args) {\n invokeOn('mask', fn, args);\n }\n function invokeOnOverlays(fn, args) {\n invokeOn('overlay', fn, args);\n }\n\n /**\n * Invoke a method on all compound mask parts, whether mask or overlays\n * @param {String} target - mask | overlay\n * @param {String} fn - the name of the method to invoke\n * @param {*[]} args - arguments passed on invoke\n */\n function invokeOn(target, fn, args) {\n _.forOwn(allParts, function (part) {\n if (_.isObject(part[target]) && _.isFunction(part[target][fn])) {\n part[target][fn](...(args || []));\n }\n });\n }\n\n /**\n * =================================\n * Transform model related functions\n * =================================\n */\n\n function applyTransforms() {\n applyTransformsToMasks();\n applyTransformsToOverlays();\n applyTransformsToInnerDrag();\n applyTransformsToCloser();\n }\n function applyTransformsToMasks() {\n invokeOnMasks('place');\n }\n function applyTransformsToOverlays() {\n _.forOwn(allParts, function (part) {\n if (part.overlay) {\n part.mask.placeOverlay(part.overlay);\n }\n });\n }\n function applyTransformsToInnerDrag() {\n if (innerDrag) {\n innerDrag.setSize(dimensions.innerWidth - 20, options.innerDragHeight).moveTo(position.innerX + 10, position.innerY + dimensions.innerHeight + options.resizeHandleSize);\n }\n }\n function applyTransformsToCloser() {\n if (closer) {\n closer.setSize(constrains.minWidth - options.resizeHandleSize, constrains.minHeight - options.resizeHandleSize).moveTo(position.outerX + dimensions.outerWidth - constrains.minWidth - 5,\n // manual adjustment so it looks better\n position.outerY + options.resizeHandleSize - 4);\n }\n }\n\n /**\n * Check that the given transform model respect the current constrains.\n * If not, correct them\n */\n function correctTransforms() {\n if (dimensions.topHeight < constrains.minTopHeight) {\n dimensions.topHeight = constrains.minTopHeight;\n position.innerY = position.outerY + constrains.minTopHeight;\n }\n if (dimensions.innerHeight < constrains.minHeight) {\n dimensions.innerHeight = constrains.minHeight;\n }\n if (dimensions.bottomHeight < constrains.minBottomHeight) {\n dimensions.bottomHeight = constrains.minBottomHeight;\n }\n dimensions.outerHeight = dimensions.topHeight + dimensions.innerHeight + dimensions.bottomHeight;\n if (dimensions.leftWidth < constrains.minWidth) {\n dimensions.leftWidth = constrains.minWidth;\n position.innerX = position.outerX + constrains.minWidth;\n }\n if (dimensions.innerWidth < constrains.minWidth) {\n dimensions.innerWidth = constrains.minWidth;\n }\n if (dimensions.rightWidth < constrains.minWidth) {\n dimensions.rightWidth = constrains.minWidth;\n }\n dimensions.outerWidth = dimensions.leftWidth + dimensions.innerWidth + dimensions.rightWidth;\n }\n\n /**\n * Update the transform model during a resize affecting the top height\n * @param {Number} newHeight\n * @param {Number} newY\n * @param {Boolean} fromTop - if the resize occurs from the top\n */\n function setTopHeight(newHeight, newY, fromTop) {\n dimensions.topHeight = newHeight;\n if (fromTop) {\n dimensions.outerHeight = newHeight + dimensions.innerHeight + dimensions.bottomHeight;\n position.outerY = newY;\n } else {\n dimensions.innerHeight = dimensions.outerHeight - newHeight - dimensions.bottomHeight;\n position.innerY = position.outerY + newHeight;\n }\n }\n\n /**\n * Update the transform model during a resize affecting the right width\n * @param {Number} newWidth\n * @param {Number} newX\n * @param {Boolean} fromLeft - if the resize occurs from the left\n */\n function setRightWidth(newWidth, newX, fromLeft) {\n dimensions.rightWidth = newWidth;\n if (fromLeft) {\n dimensions.innerWidth = newX - position.innerX;\n } else {\n dimensions.outerWidth = dimensions.leftWidth + dimensions.innerWidth + newWidth;\n }\n }\n\n /**\n * Update the transform model during a resize affecting the bottom height\n * @param {Number} newHeight\n * @param {Number} newY\n * @param {Boolean} fromTop - if the resize occurs from the top\n */\n function setBottomHeight(newHeight, newY, fromTop) {\n dimensions.bottomHeight = newHeight;\n if (fromTop) {\n dimensions.innerHeight = newY - position.innerY;\n dimensions.bottomHeight = newHeight;\n } else {\n dimensions.outerHeight = dimensions.topHeight + dimensions.innerHeight + newHeight;\n }\n }\n\n /**\n * Update the transform model during a resize affecting the left width\n * @param {Number} newWidth\n * @param {Number} newX\n * @param {Boolean} fromLeft - if the resize occurs from the left\n */\n function setLeftWidth(newWidth, newX, fromLeft) {\n dimensions.leftWidth = newWidth;\n if (fromLeft) {\n dimensions.outerWidth = newWidth + dimensions.innerWidth + dimensions.rightWidth;\n position.outerX = newX;\n } else {\n dimensions.innerWidth = dimensions.outerWidth - newWidth - dimensions.rightWidth;\n position.innerX = position.outerX + newWidth;\n }\n }\n\n /**\n * Update the transform model during a resize affecting inner height\n * @param {Number} newHeight\n */\n const setInnerHeight = newHeight => {\n dimensions.innerHeight = newHeight;\n dimensions.bottomHeight = dimensions.outerHeight - dimensions.innerHeight - dimensions.topHeight;\n };\n /**\n * ======================================\n * Mask parts and other elements creation\n * ======================================\n */\n\n function createCompoundMask() {\n // North\n createPart({\n id: 'n',\n edges: {\n top: false,\n right: false,\n bottom: false,\n left: false\n },\n edgesBorders: {\n top: true,\n right: false,\n bottom: true,\n left: false\n },\n addOverlay: true,\n minHeight: constrains.minTopHeight,\n // move and dimension the mask\n place: function place() {\n this.moveTo(position.innerX, position.outerY).setSize(dimensions.innerWidth, dimensions.topHeight);\n },\n // move and dimension the overlay\n placeOverlay: function placeOverlay(overlay) {\n var pos = this.getPosition(),\n size = this.getSize();\n overlay.moveTo(position.outerX, pos.y).setSize(dimensions.outerWidth, size.height);\n },\n // set a resize limit whenever resize happens on an inner edge (here, the top inner edge, eg. the bottom of the mask),\n // so the min/max width/height limit for \"inner component\" is respected\n beforeResize: function beforeResize(width, height, fromLeft, fromTop) {\n this.config.maxHeight = fromTop ? null : dimensions.topHeight + (dimensions.innerHeight - constrains.minHeight);\n },\n // set the new transform values (dimension and position) resulting from the current mask resize, and apply them\n onResize: function onResize(width, height, fromLeft, fromTop, x, y) {\n setTopHeight(height, y, fromTop);\n applyTransformsToMasks();\n }\n });\n\n // North-east\n createPart({\n id: 'ne',\n edges: {\n top: false,\n right: false,\n bottom: false,\n left: false\n },\n edgesBorders: {\n top: true,\n right: true,\n bottom: false,\n left: false\n },\n minHeight: constrains.minTopHeight,\n place: function place() {\n this.moveTo(position.innerX + dimensions.innerWidth, position.outerY).setSize(dimensions.rightWidth, dimensions.topHeight);\n },\n placeOverlay: function placeOverlay(overlay) {\n var pos = this.getPosition(),\n size = this.getSize();\n overlay.moveTo(pos.x, pos.y + options.resizeHandleSize).setSize(size.width - options.resizeHandleSize, size.height - options.resizeHandleSize * 2);\n },\n onResize: function onResize(width, height, fromLeft, fromTop, x, y) {\n setTopHeight(height, y, fromTop);\n setRightWidth(width, x, fromLeft);\n applyTransformsToMasks();\n }\n });\n\n // South east\n createPart({\n id: 'se',\n edges: {\n top: false,\n right: '.resize-control',\n bottom: '.resize-control',\n left: false\n },\n edgesBorders: {\n top: false,\n right: true,\n bottom: true,\n left: false\n },\n minHeight: constrains.minBottomHeight,\n resizeControll: true,\n place: function place() {\n this.moveTo(position.innerX + dimensions.innerWidth, position.innerY + dimensions.innerHeight).setSize(dimensions.rightWidth, dimensions.bottomHeight);\n },\n placeOverlay: function placeOverlay(overlay) {\n var pos = this.getPosition(),\n size = this.getSize();\n overlay.moveTo(pos.x, pos.y + options.resizeHandleSize).setSize(size.width - options.resizeHandleSize, size.height - options.resizeHandleSize * 2);\n },\n onResize: function onResize(width, height, fromLeft, fromTop, x, y) {\n setRightWidth(width, x, fromLeft);\n setBottomHeight(height, y, fromTop);\n applyTransformsToMasks();\n }\n });\n\n // South\n createPart({\n id: 's',\n edges: {\n top: false,\n right: false,\n bottom: false,\n left: false\n },\n edgesBorders: {\n top: true,\n right: false,\n bottom: true,\n left: false\n },\n minHeight: constrains.minBottomHeight,\n place: function place() {\n this.moveTo(position.innerX, position.innerY + dimensions.innerHeight).setSize(dimensions.innerWidth, dimensions.bottomHeight);\n },\n placeOverlay: function placeOverlay(overlay) {\n var pos = this.getPosition(),\n size = this.getSize();\n overlay.moveTo(pos.x, pos.y + options.resizeHandleSize).setSize(size.width, size.height - options.resizeHandleSize * 2);\n },\n beforeResize: function beforeResize(width, height, fromLeft, fromTop) {\n this.config.maxHeight = fromTop ? dimensions.bottomHeight + (dimensions.innerHeight - constrains.minHeight) : null;\n },\n onResize: function onResize(width, height, fromLeft, fromTop, x, y) {\n setBottomHeight(height, y, fromTop);\n applyTransformsToMasks();\n }\n });\n\n // East\n createPart({\n id: 'e',\n edges: {\n top: false,\n right: false,\n bottom: '.resize-control',\n left: '.resize-control'\n },\n edgesBorders: {\n top: false,\n right: true,\n bottom: false,\n left: true\n },\n resizeControll: true,\n place: function place() {\n this.moveTo(position.innerX + dimensions.innerWidth, position.innerY).setSize(dimensions.rightWidth, dimensions.innerHeight);\n },\n placeOverlay: function placeOverlay(overlay) {\n var pos = this.getPosition(),\n size = this.getSize();\n overlay.moveTo(pos.x + options.resizeHandleSize, pos.y - options.resizeHandleSize).setSize(size.width - options.resizeHandleSize * 2, size.height + options.resizeHandleSize * 2);\n },\n // eslint-disable-next-line no-unused-vars\n beforeResize: function beforeResize(width, height, fromLeft) {\n this.config.maxWidth = dimensions.rightWidth + (dimensions.innerWidth - constrains.minWidth);\n this.config.minWidth = constrains.minWidth;\n this.config.maxHeight = dimensions.outerHeight - dimensions.topHeight - constrains.minBottomHeight;\n },\n onResize: function onResize(width, height, fromLeft, fromTop, x) {\n setRightWidth(width, x, fromLeft);\n setInnerHeight(height);\n applyTransformsToMasks();\n }\n });\n\n // South-west\n createPart({\n id: 'sw',\n edges: {\n top: false,\n right: false,\n bottom: false,\n left: false\n },\n edgesBorders: {\n top: false,\n right: false,\n bottom: true,\n left: true\n },\n minHeight: constrains.minBottomHeight,\n place: function place() {\n this.moveTo(position.outerX, position.innerY + dimensions.innerHeight).setSize(dimensions.leftWidth, dimensions.bottomHeight);\n },\n placeOverlay: function placeOverlay(overlay) {\n var pos = this.getPosition(),\n size = this.getSize();\n overlay.moveTo(pos.x + options.resizeHandleSize, pos.y + options.resizeHandleSize).setSize(size.width - options.resizeHandleSize, size.height - options.resizeHandleSize * 2);\n },\n onResize: function onResize(width, height, fromLeft, fromTop, x, y) {\n setBottomHeight(height, y, fromTop);\n setLeftWidth(width, x, fromLeft);\n applyTransformsToMasks();\n }\n });\n\n // West\n createPart({\n id: 'w',\n edges: {\n top: false,\n right: false,\n bottom: false,\n left: false\n },\n edgesBorders: {\n top: false,\n right: true,\n bottom: false,\n left: true\n },\n place: function place() {\n this.moveTo(position.outerX, position.innerY).setSize(dimensions.leftWidth, dimensions.innerHeight);\n },\n placeOverlay: function placeOverlay(overlay) {\n var pos = this.getPosition(),\n size = this.getSize();\n overlay.moveTo(pos.x + options.resizeHandleSize, pos.y - options.resizeHandleSize).setSize(size.width - options.resizeHandleSize * 2, size.height + options.resizeHandleSize * 2);\n },\n beforeResize: function beforeResize(width, height, fromLeft) {\n this.config.maxWidth = fromLeft ? null : dimensions.leftWidth + (dimensions.innerWidth - constrains.minWidth);\n },\n onResize: function onResize(width, height, fromLeft, fromTop, x) {\n setLeftWidth(width, x, fromLeft);\n applyTransformsToMasks();\n }\n });\n\n // North-west\n createPart({\n id: 'nw',\n edges: {\n top: false,\n right: false,\n bottom: false,\n left: false\n },\n edgesBorders: {\n top: true,\n right: false,\n bottom: false,\n left: true\n },\n minHeight: constrains.minTopHeight,\n place: function place() {\n this.moveTo(position.outerX, position.outerY).setSize(dimensions.leftWidth, dimensions.topHeight);\n },\n placeOverlay: function placeOverlay(overlay) {\n var pos = this.getPosition(),\n size = this.getSize();\n overlay.moveTo(pos.x + options.resizeHandleSize, pos.y + options.resizeHandleSize).setSize(size.width - options.resizeHandleSize, size.height - options.resizeHandleSize * 2);\n },\n onResize: function onResize(width, height, fromLeft, fromTop, x, y) {\n setTopHeight(height, y, fromTop);\n setLeftWidth(width, x, fromLeft);\n applyTransformsToMasks();\n }\n });\n }\n function createPart(partConfig) {\n allParts[partConfig.id] = {\n mask: createMask(_.assign({}, constrains, partConfig)),\n overlay: partConfig.addOverlay ? createOverlay(partConfig) : null\n };\n }\n function createVisualGuides() {\n visualGuides.$maskBg = $('
          ', {\n class: 'mask-bg'\n });\n visualGuides.$innerWindow = $('
          ', {\n class: 'inner-window'\n });\n }\n\n /**\n * =========================\n * The compoundMask instance\n * =========================\n */\n\n dimensions = _.defaults(dimensions || {}, defaultDimensions);\n position = _.defaults(position || {}, defaultPosition);\n options = _.defaults(options || {}, defaultOptions);\n constrains = {\n minWidth: options.resizeHandleSize * 2 + options.dragMinWidth,\n minHeight: options.resizeHandleSize * 2 + options.dragMinHeight,\n minBottomHeight: options.resizeHandleSize * 2 + options.innerDragHeight,\n minTopHeight: options.resizeHandleSize * 2 + 18 // make sure that top will fit header size\n };\n\n compoundMask = {\n init: function init() {\n var self = this;\n this.setTransforms(dimensions, position);\n createCompoundMask();\n createVisualGuides();\n createInnerDragHandle();\n createCloser();\n closer.on('click', function () {\n self.hide();\n self.trigger('close');\n });\n return this;\n },\n render: function render($container) {\n invokeOnAll('render', [$container]);\n innerDrag.render($container);\n closer.render($container);\n applyTransforms();\n return this;\n },\n destroy: function destroy() {\n invokeOnAll('destroy');\n visualGuides = null;\n innerDrag = null;\n closer = null;\n return this;\n },\n show: function show() {\n invokeOnAll('show');\n innerDrag.show();\n closer.show();\n this.setState('hidden', false);\n return this;\n },\n hide: function hide() {\n invokeOnAll('hide');\n innerDrag.hide();\n closer.hide();\n this.setState('hidden', true);\n return this;\n },\n /**\n * Allow updating the transform model\n * @param {Object} dim\n * @param {Number} dim.outerWidth - overall mask width\n * @param {Number} dim.outerHeight - overall mask height\n * @param {Number} dim.innerWidth - inner window width\n * @param {Number} dim.innerHeight - inner window height\n * @param {Number} pos\n * @param {Number} pos.outerX - overall mask x\n * @param {Number} pos.outerY - overall mask y\n * @param {Number} pos.innerX - inner window x\n * @param {Number} pos.innerY - inner window y\n */\n setTransforms: function setTransforms(dim, pos) {\n dimensions = _.defaults(dim || {}, dimensions);\n position = _.defaults(pos || {}, position);\n\n // automatically complete the dimensions\n dimensions.topHeight = pos.innerY - pos.outerY;\n dimensions.rightWidth = dim.outerWidth - (pos.innerX - pos.outerX) - dim.innerWidth;\n dimensions.bottomHeight = dim.outerHeight - (pos.innerY - pos.outerY) - dim.innerHeight;\n dimensions.leftWidth = pos.innerX - pos.outerX;\n correctTransforms();\n applyTransforms();\n },\n getDimensions: function getDimensions() {\n return dimensions;\n },\n getPosition: function getPosition() {\n return position;\n },\n getParts: function getParts() {\n return allParts;\n }\n };\n statifier(compoundMask);\n eventifier(compoundMask);\n return compoundMask;\n }\n\n return compoundMaskFactory;\n\n});\n\n","define('taoQtiTest/runner/plugins/tools/lineReader/plugin',['lodash', 'i18n', 'taoTests/runner/plugin', 'ui/hider', 'util/shortcut', 'util/namespace', 'taoQtiTest/runner/helpers/map', 'taoQtiTest/runner/plugins/tools/lineReader/compoundMask'], function (_, __, pluginFactory, hider, shortcut, namespaceHelper, mapHelper, compoundMaskFactory) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n shortcut = shortcut && Object.prototype.hasOwnProperty.call(shortcut, 'default') ? shortcut['default'] : shortcut;\n namespaceHelper = namespaceHelper && Object.prototype.hasOwnProperty.call(namespaceHelper, 'default') ? namespaceHelper['default'] : namespaceHelper;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n compoundMaskFactory = compoundMaskFactory && Object.prototype.hasOwnProperty.call(compoundMaskFactory, 'default') ? compoundMaskFactory['default'] : compoundMaskFactory;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * The public name of the plugin\n * @type {String}\n */\n var pluginName = 'line-reader';\n\n /**\n * The prefix of actions triggered through the event loop\n * @type {String}\n */\n var actionPrefix = `tool-${pluginName}-`;\n\n /**\n * Options for the compoundMask factory\n * @type {Object}\n */\n var maskOptions = {\n dragMinWidth: 17,\n dragMinHeight: 7,\n resizeHandleSize: 7,\n innerDragHeight: 20\n };\n var dimensions, position;\n\n /**\n * These functions are a first effort to place the mask on the first line on the item\n * They make a lot of assumptions:\n * - the item starts with a text\n * - the padding is set on the .qti-item container\n * - the padding is consistent with the minWidth/minHeight configuration of the mask\n * - and some other...\n * @param {jQuery} $container - where the mask is appended\n */\n function getDimensions($container) {\n var $qtiContent = $container.find('#qti-content'),\n $qtiItem = $qtiContent.find('.qti-item'),\n lineHeight = Math.ceil(parseFloat($qtiContent.css('line-height'))) || 20; // reasonable default line height\n\n return {\n outerWidth: $qtiItem.width() + maskOptions.resizeHandleSize * 4 + maskOptions.dragMinWidth * 2,\n outerHeight: 175,\n // reasonable default height\n innerWidth: $qtiItem.width(),\n innerHeight: lineHeight\n };\n }\n function getPosition($container) {\n var $qtiContent = $container.find('#qti-content'),\n $qtiItem = $qtiContent.find('.qti-item'),\n itemPosition = $qtiItem.position() || {},\n paddingLeft = parseInt($qtiItem.css('padding-left'), 10),\n paddingTop = parseInt($qtiItem.css('padding-top'), 10),\n textPadding = 3,\n // this is to let the text breathe a bit\n innerX = parseInt(itemPosition.left, 10) + paddingLeft - textPadding,\n innerY = parseInt(itemPosition.top, 10) + paddingTop - textPadding;\n return {\n outerX: innerX - maskOptions.resizeHandleSize * 2 - maskOptions.dragMinWidth,\n outerY: 0,\n innerX: innerX,\n innerY: innerY\n };\n }\n function containerWidthHasChanged($container) {\n var newDimensions = getDimensions($container);\n return newDimensions.outerWidth !== dimensions.outerWidth;\n }\n\n /**\n * Returns the configured plugin\n */\n var plugin = pluginFactory({\n name: pluginName,\n /**\n * Initialize the plugin (called during runner's init)\n */\n init: function init() {\n const self = this;\n const testRunner = this.getTestRunner();\n const testRunnerOptions = testRunner.getOptions();\n const pluginShortcuts = (testRunnerOptions.shortcuts || {})[pluginName] || {};\n const $container = testRunner.getAreaBroker().getContentArea().parent();\n this.compoundMask = compoundMaskFactory(maskOptions).init().render($container).on('close', function () {\n closeMask();\n }).hide();\n\n /**\n * Checks if the plugin is currently available\n * @returns {Boolean}\n */\n function isEnabled() {\n //to be activated with the special category x-tao-option-lineReader\n return mapHelper.hasItemCategory(testRunner.getTestMap(), testRunner.getTestContext().itemIdentifier, 'lineReader', true);\n }\n function toggleButton() {\n if (isEnabled()) {\n self.show();\n } else {\n self.hide();\n }\n }\n function toggleMask() {\n if (self.compoundMask.getState('hidden')) {\n if (containerWidthHasChanged($container)) {\n transformMask($container);\n }\n openMask();\n } else {\n closeMask();\n }\n }\n function openMask() {\n self.compoundMask.show();\n self.trigger('start');\n self.button.turnOn();\n }\n function closeMask() {\n if (!self.compoundMask.getState('hidden')) {\n self.compoundMask.hide();\n }\n self.trigger('end');\n self.button.turnOff();\n }\n function transformMask($maskContainer) {\n dimensions = getDimensions($maskContainer);\n position = getPosition($maskContainer);\n self.compoundMask.setTransforms(_.clone(dimensions), _.clone(position));\n }\n\n // create button\n this.button = this.getAreaBroker().getToolbox().createEntry({\n title: __('Line Reader'),\n icon: 'insert-horizontal-line',\n control: 'line-reader',\n text: __('Line Reader')\n });\n\n // attach user events\n this.button.on('click', function (e) {\n e.preventDefault();\n testRunner.trigger(`${actionPrefix}toggle`);\n });\n if (testRunnerOptions.allowShortcuts) {\n if (pluginShortcuts.toggle) {\n shortcut.add(namespaceHelper.namespaceAll(pluginShortcuts.toggle, this.getName(), true), function () {\n testRunner.trigger(`${actionPrefix}toggle`);\n }, {\n avoidInput: true,\n prevent: true\n });\n }\n }\n\n //start disabled\n this.disable();\n\n //update plugin state based on changes\n testRunner.on('loaditem', toggleButton).on('renderitem', function () {\n transformMask($container);\n }).on('enabletools renderitem', function () {\n self.enable();\n }).on('disabletools unloaditem', function () {\n self.disable();\n closeMask();\n }).on(`${actionPrefix}toggle`, function () {\n if (isEnabled()) {\n toggleMask();\n }\n });\n },\n /**\n * Called during the runner's destroy phase\n */\n destroy: function destroy() {\n this.compoundMask.destroy();\n shortcut.remove(`.${this.getName()}`);\n },\n /**\n * Enable the button\n */\n enable: function enable() {\n this.button.enable();\n },\n /**\n * Disable the button\n */\n disable: function disable() {\n this.button.disable();\n },\n /**\n * Show the button\n */\n show: function show() {\n this.button.show();\n },\n /**\n * Hide the button\n */\n hide: function hide() {\n this.button.hide();\n }\n });\n\n return plugin;\n\n});\n\n","define('taoQtiTest/runner/plugins/tools/magnifier/magnifierPanel',['jquery', 'lodash', 'ui/component', 'handlebars', 'lib/handlebars/helpers', 'ui/dynamicComponent'], function ($$1, _, component, Handlebars, Helpers0, dynamicComponent) { 'use strict';\n\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n component = component && Object.prototype.hasOwnProperty.call(component, 'default') ? component['default'] : component;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n dynamicComponent = dynamicComponent && Object.prototype.hasOwnProperty.call(dynamicComponent, 'default') ? dynamicComponent['default'] : dynamicComponent;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, options, functionType=\"function\", escapeExpression=this.escapeExpression, helperMissing=helpers.helperMissing;\n\n\n buffer += \"
          \\n
          \";\n if (helper = helpers.level) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.level); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"
          \\n
          \\n
          \\n
          \\n \\n \\n \\n
          \\n
          \\n\";\n return buffer;\n });\n function magnifierPanelTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * The screen pixel ratio\n * @type {Number}\n */\n var screenRatio = window.screen.width / window.screen.height;\n\n /**\n * Standard debounce delay for heavy process\n * @type {Number}\n */\n var debounceDelay = 50;\n\n /**\n * Standard scrolling throttling for the scrolling\n * It can be lower than the debounce delay as it is lighter in process and it improves the user experience\n * @type {Number}\n */\n var scrollingDelay = 20;\n\n /**\n * The default base size\n * @type {Number}\n */\n var defaultBaseSize = 116;\n\n /**\n * The minimum zoom level\n * @type {Number}\n */\n var defaultLevelMin = 2;\n\n /**\n * The maximum zoom level\n * @type {Number}\n */\n var defaultLevelMax = 8;\n\n /**\n * The default zoom level\n * @type {Number}\n */\n var defaultLevel = defaultLevelMin;\n\n /**\n * Some default values\n * @type {Object}\n */\n var defaultConfig = {\n level: defaultLevel,\n levelMin: defaultLevelMin,\n levelMax: defaultLevelMax,\n levelStep: 0.5,\n baseSize: defaultBaseSize,\n maxRatio: 0.5\n };\n var dynamicComponentDefaultConfig = {\n draggable: true,\n resizable: true,\n preserveAspectRatio: false,\n width: defaultBaseSize * defaultLevel,\n height: defaultBaseSize * defaultLevel / screenRatio,\n minWidth: defaultBaseSize * defaultLevelMin,\n minHeight: defaultBaseSize * defaultLevelMin / screenRatio,\n stackingScope: 'test-runner',\n top: 50,\n left: 10\n };\n\n /**\n * Creates a magnifier panel component\n * @param {Object} config\n * @param {Number} [config.level] - The default zoom level\n * @param {Number} [config.levelMin] - The minimum allowed zoom level\n * @param {Number} [config.levelMax] - The maximum allowed zoom level\n * @param {Number} [config.levelStep] - The level increment applied when using the controls + and -\n * @param {Number} [config.baseSize] - The base size used to assign the width and the height according to the zoom level\n * @param {Number} [config.maxRatio] - The ratio for the maximum size regarding the size of the window\n * @returns {magnifierPanel} the component (initialized)\n */\n function magnifierPanelFactory(config) {\n var initConfig = _.defaults(config || {}, defaultConfig);\n var zoomLevelMin = parseFloat(initConfig.levelMin);\n var zoomLevelMax = parseFloat(initConfig.levelMax);\n var zoomLevelStep = parseFloat(initConfig.levelStep);\n var zoomLevel = adjustZoomLevel(initConfig.level);\n var maxRatio = parseFloat(initConfig.maxRatio);\n var $initTarget = null;\n var controls = null;\n var observer = null;\n var targetWidth, targetHeight, dx, dy;\n var scrolling = [];\n var dynamicComponentInstance;\n var dynamicComponentConfig = _.defaults(config ? config.component || {} : {}, dynamicComponentDefaultConfig);\n\n /**\n * @typedef {Object} magnifierPanel\n */\n var magnifierPanel = component({\n /**\n * Gets the current zoom level\n * @returns {Number}\n */\n getZoomLevel: function getZoomLevel() {\n return zoomLevel;\n },\n /**\n * Gets the targeted content the magnifier will zoom\n * @returns {jQuery}\n */\n getTarget: function getTarget() {\n return controls && controls.$target;\n },\n /**\n * Sets the targeted content the magnifier will zoom\n * @param {jQuery} $newTarget\n * @returns {magnifierPanel}\n * @fires targetchange\n * @fires update\n */\n setTarget: function setTarget($newTarget) {\n if (controls) {\n controls.$target = $newTarget;\n controls.$viewTarget = null;\n setScrollingListener();\n\n /**\n * @event magnifierPanel#targetchange\n * @param {jQuery} $target\n */\n this.trigger('targetchange', controls.$target);\n this.update();\n } else {\n $initTarget = $newTarget;\n }\n return this;\n },\n /**\n * Sets the zoom level of the magnifier\n * @param {Number} level\n * @returns {magnifierPanel}\n * @fires zoom\n */\n zoomTo: function zoomTo(level) {\n if (level && _.isFinite(level)) {\n zoomLevel = adjustZoomLevel(level);\n }\n applyZoomLevel();\n showZoomLevel();\n updateMaxSize();\n updateZoom();\n\n /**\n * @event magnifierPanel#zoom\n * @param {Number} zoomLevel\n */\n this.trigger('zoom', zoomLevel);\n return this;\n },\n /**\n * Increments the zoom level of the magnifier\n * @param {Number} step\n * @returns {magnifierPanel}\n * @fires zoom\n */\n zoomBy: function zoomBy(step) {\n if (step && _.isFinite(step)) {\n this.zoomTo(zoomLevel + parseFloat(step));\n }\n return this;\n },\n /**\n * Zoom-in using the configured level step\n * @returns {magnifierPanel}\n * @fires zoom\n */\n zoomIn: function zoomIn() {\n return this.zoomBy(zoomLevelStep);\n },\n /**\n * Zoom-out using the configured level step\n * @returns {magnifierPanel}\n * @fires zoom\n */\n zoomOut: function zoomOut() {\n return this.zoomBy(-zoomLevelStep);\n },\n /**\n * Places the magnifier sight at a particular position on the target content\n * @param {Number} x\n * @param {Number} y\n * @returns {magnifierPanel}\n */\n zoomAt: function zoomAt(x, y) {\n var position;\n if (controls) {\n position = this.translate(x, y);\n controls.$inner.css({\n top: -position.top,\n left: -position.left\n });\n }\n },\n /**\n * Translates screen coordinates to zoom coordinates\n * @param {Number} x\n * @param {Number} y\n * @returns {Object}\n */\n translate: function translate(x, y) {\n return {\n top: translateMagnifier(y, targetHeight, dynamicComponentInstance.position.height),\n left: translateMagnifier(x, targetWidth, dynamicComponentInstance.position.width)\n };\n },\n /**\n * Updates the magnifier with the target content\n * @returns {magnifierPanel}\n * @fires update\n */\n update: function update() {\n if (controls && controls.$target) {\n controls.$clone = controls.$target.clone().removeAttr('id');\n controls.$clone.find('iframe').remove();\n controls.$clone.find('[name],[id],[data-serial]').removeAttr('name id data-serial');\n controls.$inner.empty().append(controls.$clone);\n controls.$clone.find('audio').prop('muted', true);\n applySize();\n applyZoomLevel();\n updateZoom();\n updateMaxSize();\n applyScrolling();\n\n /**\n * @event magnifierPanel#update\n */\n this.trigger('update');\n }\n return this;\n }\n }, defaultConfig);\n\n /**\n * Will update the magnifier content with the actual content\n * @type {Function}\n */\n var updateMagnifier = _.debounce(_.bind(magnifierPanel.update, magnifierPanel), debounceDelay);\n\n /**\n * Will update the magnifier content with the scrolling position\n * @type {Function}\n */\n var scrollingListenerCallback = _.throttle(function (event) {\n var $target = $$1(event.target);\n var scrollingTop = event.target.scrollTop;\n var scrollLeft = event.target.scrollLeft;\n var scrollId, scrollData;\n\n //check if the element is already known as a scrollable element\n if (controls && controls.$clone && $target.data('magnifier-scroll')) {\n scrollId = $target.data('magnifier-scroll');\n scrollData = _.find(scrolling, {\n id: scrollId\n });\n scrollData.scrollTop = scrollingTop;\n scrollData.scrollLeft = scrollLeft;\n\n //if in clone, scroll it\n scrollInClone(scrollData);\n } else {\n //if the element is not yet identified as a scrollable element, tag it and register its id\n scrollId = _.uniqueId('scrolling_');\n $target.attr('data-magnifier-scroll', scrollId);\n scrolling.push({\n id: scrollId,\n scrollTop: scrollingTop,\n scrollLeft: scrollLeft\n });\n\n //update all\n magnifierPanel.update();\n }\n }, scrollingDelay);\n\n /**\n * Scroll an element in the clone\n *\n * @param {Object} scrollData\n * @param {String} scrollData.id\n * @param {Number} [scrollData.scrollTop]\n * @param {Number} [scrollData.scrollLeft]\n */\n function scrollInClone(scrollData) {\n var $clonedTarget;\n if (controls && controls.$clone && scrollData && scrollData.id) {\n $clonedTarget = controls.$clone.find(`[data-magnifier-scroll=${scrollData.id}]`);\n if ($clonedTarget.length) {\n if (_.isNumber(scrollData.scrollTop)) {\n $clonedTarget[0].scrollTop = scrollData.scrollTop;\n }\n if (_.isNumber(scrollData.scrollLeft)) {\n $clonedTarget[0].scrollLeft = scrollData.scrollLeft;\n }\n }\n }\n }\n\n /**\n * Capture all scroll positions of elements inside current target\n */\n function updateScrollPositions() {\n if (!controls || !controls.$target) {\n return;\n }\n const elements = [controls.$target];\n let scrollOffsetsChanged = false;\n while (elements.length) {\n const $currentElement = $$1(elements.shift());\n const scrollLeft = $currentElement.scrollLeft();\n const scrollTop = $currentElement.scrollTop();\n let scrollId = $currentElement.data('magnifier-scroll');\n elements.push(...Array.from($currentElement.children()));\n if (scrollLeft > 0 || scrollTop > 0 || scrollId) {\n scrollOffsetsChanged = true;\n if (scrollId) {\n const scrollData = _.find(scrolling, {\n id: scrollId\n });\n scrollData.scrollTop = scrollTop;\n scrollData.scrollLeft = scrollLeft;\n } else {\n scrollId = _.uniqueId('scrolling_');\n $currentElement.attr('data-magnifier-scroll', scrollId);\n scrolling.push({\n id: scrollId,\n scrollTop,\n scrollLeft\n });\n }\n }\n }\n\n // If there is any changes to scroll offset inside the target the magnifier should be updated\n if (scrollOffsetsChanged) {\n magnifierPanel.update();\n }\n }\n\n /**\n * Initializes the listener for scrolling event and transfer the scrolling\n */\n function setScrollingListener() {\n updateScrollPositions();\n window.addEventListener('scroll', scrollingListenerCallback, true);\n }\n\n /**\n * Stops the listener for scrolling event\n */\n function removeScrollingListener() {\n window.removeEventListener('scroll', scrollingListenerCallback, true);\n }\n\n /**\n * Applies scrolling programmatically from the recorded list of elements to be scrolled\n */\n function applyScrolling() {\n _.forEach(scrolling, scrollInClone);\n }\n\n /**\n * Adjusts a provided zoom level to fit the constraints\n * @param {Number|String} level\n * @returns {Number}\n */\n function adjustZoomLevel(level) {\n return Math.max(zoomLevelMin, Math.min(parseFloat(level), zoomLevelMax));\n }\n\n /**\n * Applies the zoom level to the content\n */\n function applyZoomLevel() {\n if (controls) {\n controls.$inner.css({\n transform: `scale(${zoomLevel})`\n });\n }\n }\n\n /**\n * Shows the zoom level using a CSS animation\n */\n function showZoomLevel() {\n var $newZoomLevel;\n if (controls) {\n $newZoomLevel = controls.$zoomLevel.clone(true).html(zoomLevel);\n controls.$zoomLevel.before($newZoomLevel).remove();\n controls.$zoomLevel = $newZoomLevel;\n }\n }\n\n /**\n * Updates the max size according to the window's size\n */\n function updateMaxSize() {\n if (!dynamicComponentInstance) {\n return;\n }\n const $window = $$1(window);\n dynamicComponentInstance.config.maxWidth = $window.width() * maxRatio;\n dynamicComponentInstance.config.maxHeight = $window.height() * maxRatio;\n }\n\n /**\n * Forwards the size of the target to the cloned content\n */\n function applySize() {\n if (controls && controls.$clone) {\n targetWidth = controls.$target.width();\n targetHeight = controls.$target.height();\n controls.$clone.width(targetWidth).height(targetHeight);\n }\n }\n\n /**\n * Place the zoom sight at the right place inside the magnifier\n */\n function updateZoom() {\n var position;\n if (controls && controls.$target) {\n position = dynamicComponentInstance.position;\n position.x += dx + controls.$target.scrollLeft();\n position.y += dy + controls.$target.scrollTop();\n magnifierPanel.zoomAt(position.x, position.y);\n }\n }\n\n /**\n * Creates the observer that will react to DOM changes to update the magnifier\n */\n function createObserver() {\n observer = new window.MutationObserver(updateMagnifier);\n }\n\n /**\n * Starts to observe the DOM of the magnifier target\n */\n function startObserver() {\n if (controls && controls.$target) {\n observer.observe(controls.$target.get(0), {\n childList: true,\n // Set to true if additions and removals of the target node's child elements (including text nodes) are to be observed.\n attributes: true,\n // Set to true if mutations to target's attributes are to be observed.\n characterData: true,\n // Set to true if mutations to target's data are to be observed.\n subtree: true // Set to true if mutations to target and target's descendants are to be observed.\n });\n }\n\n setScrollingListener();\n }\n\n /**\n * Stops to observe the DOM of the magnifier target\n */\n function stopObserver() {\n observer.disconnect();\n removeScrollingListener();\n }\n\n /**\n * Translates a screen coordinate into the magnifier\n * @param {Number} coordinate\n * @param {Number} actualSize\n * @param {Number} magnifierSize\n * @returns {Number}\n */\n function translateMagnifier(coordinate, actualSize, magnifierSize) {\n var delta = 0;\n var ratio = zoomLevel;\n if (actualSize) {\n delta = actualSize * (zoomLevel - 1) / 2;\n ratio = (actualSize * zoomLevel - magnifierSize) / (actualSize - magnifierSize);\n }\n return coordinate * ratio - delta;\n }\n\n /**\n * Gets the top element from a particular absolute point.\n * @param {Number} x - the page X-coordinate of the point\n * @param {Number} y - the page Y-coordinate of the point\n * @returns {HTMLElement}\n */\n function getElementFromPoint(x, y) {\n var el;\n\n // this is done to prevent working with undefined coordinates\n x = x || 0;\n y = y || 0;\n if (controls) {\n controls.$overlay.addClass('hidden');\n }\n el = document.elementFromPoint(x, y);\n if (controls) {\n controls.$overlay.removeClass('hidden');\n }\n return el;\n }\n\n /**\n * Find the related node in the target. The both trees must have the same content.\n * @param {jQuery|HTMLElement} node - the node for which find a relation\n * @param {jQuery|HTMLElement} root - the root of the tree that contains the actual node\n * @param {jQuery|HTMLElement} target - the root of the tree that could contains the related node\n * @returns {jQuery}\n */\n function findSourceNode(node, root, target) {\n var $node = $$1(node);\n var $root = $$1(root);\n var $target = $$1(target);\n var indexes = [$node.index()];\n\n // compute map of node's parents indexes\n $node.parents().each(function () {\n var $this = $$1(this);\n if (!$this.is($root)) {\n indexes.push($this.index());\n } else {\n return false;\n }\n });\n\n // the last index is related to the root, so ignore it\n indexes.pop();\n\n // now try to find the same node using the path provided by the indexes map\n if (indexes.length) {\n $node = $target;\n _.forEachRight(indexes, function (index) {\n $node = $node.children().eq(index);\n if (!$node.length) {\n return false;\n }\n });\n } else {\n // nothing to search for...\n $node = $$1();\n }\n return $node;\n }\n dynamicComponentInstance = dynamicComponent({}).on('rendercontent', function ($content) {\n // eslint-disable-next-line consistent-this\n var dynamicComponentContext = this;\n var $element = this.getElement();\n $element.addClass('magnifier-container');\n magnifierPanel.setTemplate(magnifierPanelTpl).on('render', function () {\n var self = this;\n var $component = this.getElement();\n this.setState('hidden', true);\n\n // compute the padding of the magnifier content\n dx = ($component.outerWidth() - $component.width()) / 2;\n dy = ($component.outerHeight() - $component.height()) / 2;\n controls = {\n $target: $initTarget,\n $inner: $$1('.inner', $component),\n $zoomLevel: $$1('.level', $component),\n $overlay: $$1('.overlay', $component)\n };\n $initTarget = null;\n\n // click on zoom-out control\n $component.on('click touchstart', '.control[data-control=\"zoomOut\"]', function (event) {\n event.preventDefault();\n self.zoomOut();\n });\n\n // click on zoom-in control\n $component.on('click touchstart', '.control[data-control=\"zoomIn\"]', function (event) {\n event.preventDefault();\n self.zoomIn();\n });\n\n // click on close controls\n $component.on('click touchstart', '.closeMagnifier', function (event) {\n event.preventDefault();\n self.hide();\n self.trigger('close');\n });\n\n // interact through the magnifier glass with the zoomed content\n $component.on('click touchstart', '.overlay', function (event) {\n findSourceNode(getElementFromPoint(event.pageX, event.pageY), controls.$inner, controls.$target).click().focus();\n });\n createObserver();\n updateMaxSize();\n applyZoomLevel();\n }).on('show', function () {\n updateMagnifier();\n startObserver();\n dynamicComponentContext.show();\n }).on('hide', function () {\n stopObserver();\n dynamicComponentContext.hide();\n }).on('destroy', function () {\n stopObserver();\n $initTarget = null;\n controls = null;\n observer = null;\n dynamicComponentContext.destroy();\n }).init(initConfig).render($content);\n }).on('down move resize', function () {\n updateZoom();\n }).on('resize', function () {\n updateMaxSize();\n }).init(dynamicComponentConfig);\n return magnifierPanel;\n }\n\n return magnifierPanelFactory;\n\n});\n\n","define('taoQtiTest/runner/plugins/tools/magnifier/magnifier',['lodash', 'i18n', 'taoTests/runner/plugin', 'ui/hider', 'util/shortcut', 'util/namespace', 'taoQtiTest/runner/plugins/tools/magnifier/magnifierPanel', 'taoQtiTest/runner/helpers/map'], function (_, __, pluginFactory, hider, shortcut, namespaceHelper, magnifierPanelFactory, mapHelper) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n shortcut = shortcut && Object.prototype.hasOwnProperty.call(shortcut, 'default') ? shortcut['default'] : shortcut;\n namespaceHelper = namespaceHelper && Object.prototype.hasOwnProperty.call(namespaceHelper, 'default') ? namespaceHelper['default'] : namespaceHelper;\n magnifierPanelFactory = magnifierPanelFactory && Object.prototype.hasOwnProperty.call(magnifierPanelFactory, 'default') ? magnifierPanelFactory['default'] : magnifierPanelFactory;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * The public name of the plugin\n * @type {String}\n */\n var pluginName = 'magnifier';\n\n /**\n * The prefix of actions triggered through the event loop\n * @type {String}\n */\n var actionPrefix = `tool-${pluginName}-`;\n\n /**\n * Some default options for the plugin\n * @type {Object}\n */\n var defaultOptions = {\n zoomMin: 2,\n // Smallest magnification factor\n zoomMax: 8,\n // Biggest magnification factor\n zoomStep: 0.5 // Increment between min an max\n };\n\n /**\n * Returns the configured plugin\n */\n var magnifier = pluginFactory({\n name: pluginName,\n /**\n * Initializes the plugin (called during runner's init)\n */\n init: function init() {\n const self = this;\n const testRunner = this.getTestRunner();\n const testRunnerOptions = testRunner.getOptions();\n const pluginConfig = Object.assign({}, defaultOptions, this.getConfig());\n const pluginShortcuts = (testRunnerOptions.shortcuts || {})[pluginName] || {};\n let magnifierPanel = null;\n\n /**\n * Creates the magnifier panel on demand\n * @returns {magnifierPanel}\n * @fires plugin-magnifier-create.magnifier\n */\n function getMagnifierPanel() {\n var $container;\n if (!magnifierPanel) {\n $container = testRunner.getAreaBroker().getContainer();\n magnifierPanel = magnifierPanelFactory({\n levelMin: pluginConfig.zoomMin,\n levelMax: pluginConfig.zoomMax,\n levelStep: pluginConfig.zoomStep,\n component: {\n renderTo: $container.parent(),\n draggableContainer: $container.parent()\n }\n }).on('show', function () {\n /**\n * @event plugin-magnifier-show.magnifier\n */\n self.trigger('magnifier-show');\n }).on('hide', function () {\n /**\n * @event plugin-magnifier-hide.magnifier\n */\n self.trigger('magnifier-hide');\n }).on('zoom', function (level) {\n /**\n * @event plugin-magnifier-zoom.magnifier\n * @param {Number} zoomLevel\n */\n self.trigger('magnifier-zoom', level);\n }).on('close', function () {\n hideMagnifier();\n }).setTarget($container);\n\n /**\n * @event plugin-magnifier-create.magnifier\n */\n self.trigger('magnifier-create');\n }\n return magnifierPanel;\n }\n\n /**\n * Checks if the plugin is currently available\n * @returns {Boolean}\n */\n function isEnabled() {\n //to be activated with the special category x-tao-option-magnifier\n return mapHelper.hasItemCategory(testRunner.getTestMap(), testRunner.getTestContext().itemIdentifier, 'magnifier', true);\n }\n\n /**\n * Shows/hides the plugin GUI according to context\n */\n function togglePlugin() {\n if (isEnabled()) {\n self.show();\n } else {\n self.hide();\n }\n }\n\n /**\n * Shows/hides the magnifier\n */\n function toggleMagnifier() {\n if (self.getState('enabled')) {\n if (self.getState('active')) {\n hideMagnifier();\n } else {\n showMagnifier();\n }\n }\n }\n\n /**\n * Opens the magnifier panel\n * @fires plugin-magnifier-show.magnifier\n */\n function showMagnifier() {\n getMagnifierPanel();\n if (magnifierPanel.is('hidden')) {\n magnifierPanel.show();\n }\n self.button.turnOn();\n testRunner.trigger(`plugin-open.${pluginName}`);\n self.setState('active', true);\n }\n\n /**\n * Closes the magnifier panel\n * @fires plugin-magnifier-hide.magnifier\n */\n function hideMagnifier() {\n self.setState('active', false);\n self.button.turnOff();\n testRunner.trigger(`plugin-close.${pluginName}`);\n if (magnifierPanel && !magnifierPanel.is('hidden')) {\n magnifierPanel.hide();\n }\n }\n\n // build element\n this.button = this.getAreaBroker().getToolbox().createEntry({\n control: 'magnify',\n title: __('Displays a customisable magnifier'),\n text: __('Magnifying Glass'),\n icon: 'find'\n });\n\n // attach behavior\n this.button.on('click', function (event) {\n event.preventDefault();\n testRunner.trigger(`${actionPrefix}toggle`);\n });\n\n // handle the plugin's shortcuts\n if (testRunnerOptions.allowShortcuts) {\n _.forEach(pluginShortcuts, function (command, key) {\n shortcut.add(namespaceHelper.namespaceAll(command, pluginName, true), function () {\n // just fire the action using the event loop\n testRunner.trigger(actionPrefix + key);\n }, {\n avoidInput: true\n });\n });\n }\n\n //start disabled\n togglePlugin();\n this.disable();\n\n //update plugin state based on changes\n testRunner\n // runner life cycle\n .on('loaditem', function () {\n togglePlugin();\n self.disable();\n }).on('renderitem', function () {\n if (magnifierPanel) {\n magnifierPanel.update().zoomTo(pluginConfig.zoomMin);\n }\n }).on('enabletools renderitem', function () {\n self.enable();\n }).on('disabletools unloaditem', function () {\n if (self.getState('active')) {\n hideMagnifier();\n }\n self.disable();\n }).on('destroy', function () {\n if (magnifierPanel) {\n magnifierPanel.destroy();\n }\n magnifierPanel = null;\n })\n\n // commands that controls the magnifier\n .on(`${actionPrefix}toggle`, function () {\n if (isEnabled()) {\n toggleMagnifier();\n }\n }).on(`${actionPrefix}in`, function () {\n if (isEnabled() && self.getState('enabled') && self.getState('active')) {\n getMagnifierPanel().zoomIn();\n }\n }).on(`${actionPrefix}out`, function () {\n if (isEnabled() && self.getState('enabled') && self.getState('active')) {\n getMagnifierPanel().zoomOut();\n }\n }).on(`${actionPrefix}close`, function () {\n if (self.getState('active')) {\n hideMagnifier();\n }\n });\n },\n /**\n * Called during the runner's destroy phase\n */\n destroy: function destroy() {\n shortcut.remove(`.${pluginName}`);\n },\n /**\n * Enables the button\n */\n enable: function enable() {\n this.button.enable();\n },\n /**\n * Disables the button\n */\n disable: function disable() {\n this.button.disable();\n },\n /**\n * Shows the button\n */\n show: function show() {\n this.button.show();\n },\n /**\n * Hides the button\n */\n hide: function hide() {\n this.button.hide();\n }\n });\n\n return magnifier;\n\n});\n\n","define('taoQtiTest/runner/plugins/tools/zoom',['jquery', 'i18n', 'ui/hider', 'ui/transformer', 'util/shortcut', 'util/namespace', 'taoTests/runner/plugin', 'taoQtiTest/runner/helpers/map'], function ($, __, hider, transformer, shortcut, namespaceHelper, pluginFactory, mapHelper) { 'use strict';\n\n $ = $ && Object.prototype.hasOwnProperty.call($, 'default') ? $['default'] : $;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n transformer = transformer && Object.prototype.hasOwnProperty.call(transformer, 'default') ? transformer['default'] : transformer;\n shortcut = shortcut && Object.prototype.hasOwnProperty.call(shortcut, 'default') ? shortcut['default'] : shortcut;\n namespaceHelper = namespaceHelper && Object.prototype.hasOwnProperty.call(namespaceHelper, 'default') ? namespaceHelper['default'] : namespaceHelper;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2022 (original work) Open Assessment Technologies SA;\n *\n * @author dieter \n * @author Alexander Zagovorichev \n */\n\n /**\n * The standard zoom level, in percentage\n * @type {Number}\n */\n const standard = 100;\n\n /**\n * Zoom-In/Zoom-Out steps\n * @type {Number}\n */\n const increment = 10;\n\n /**\n * The zoom boundaries, in percentage\n * @type {Object}\n */\n const threshold = {\n lower: 10,\n upper: 200\n };\n\n /**\n * Sets the zoom level\n * @param {jQuery} $target\n * @param {Number} level - Zoom percentage\n */\n const _setZoomLevel = ($target, level) => {\n const $parent = $target.parent();\n const newScale = level / standard;\n const isOverZoom = $parent.outerWidth(true) < $target.width() * newScale;\n if (isOverZoom) {\n transformer.setTransformOrigin($target, '0 0');\n $parent.css('margin-left', '0');\n } else {\n transformer.setTransformOrigin($target, '50% 0');\n $parent.css('margin-left', '');\n }\n transformer.scale($target, newScale);\n };\n\n /**\n * Restores the standard zoom level\n * @param {jQuery} $target\n */\n const _resetZoom = $target => {\n transformer.reset($target);\n };\n\n /**\n * Forces a browser repaint\n * Solution from http://stackoverflow.com/questions/3485365/how-can-i-force-webkit-to-redraw-repaint-to-propagate-style-changes?answertab=votes#tab-top\n * @param {jQuery} $target\n */\n const forceRepaint = $target => {\n const sel = $target[0];\n if (sel) {\n sel.style.display = 'none';\n sel.offsetHeight; // no need to store this anywhere, the reference is enough\n sel.style.display = '';\n }\n };\n\n /**\n * Returns the configured plugin\n */\n var zoom = pluginFactory({\n name: 'zoom',\n /**\n * Initialize the plugin (called during runner's init)\n */\n init() {\n const testRunner = this.getTestRunner();\n const testRunnerOptions = testRunner.getOptions();\n const pluginShortcuts = (testRunnerOptions.shortcuts || {})[this.getName()] || {};\n const testRunnerContainer = this.getAreaBroker().getContainer().get(0);\n\n /**\n * Checks if the plugin is currently available\n * @returns {Boolean}\n */\n const isConfigured = () => {\n //to be activated with the special category x-tao-option-zoom\n return mapHelper.hasItemCategory(testRunner.getTestMap(), testRunner.getTestContext().itemIdentifier, 'zoom', true);\n };\n\n /**\n * Is zoom activated ? if not, then we hide the plugin\n */\n const togglePlugin = () => {\n if (isConfigured()) {\n //allow zoom\n this.show();\n } else {\n this.hide();\n }\n };\n const zoomAction = dir => {\n const inc = increment * dir;\n if (this.$zoomTarget) {\n const el = this.$zoomTarget[0];\n const before = el.getBoundingClientRect();\n let sx = this.$container.scrollLeft();\n let sy = this.$container.scrollTop();\n this.zoom = Math.max(threshold.lower, Math.min(threshold.upper, this.zoom + inc));\n if (this.zoom === standard) {\n _resetZoom(this.$zoomTarget);\n } else {\n _setZoomLevel(this.$zoomTarget, this.zoom);\n }\n testRunnerContainer.style.setProperty('--tool-zoom-level', this.zoom / standard);\n\n // force a browser repaint to fix a scrollbar issue with WebKit\n forceRepaint(this.$zoomTarget);\n const after = el.getBoundingClientRect();\n sx = Math.max(0, sx + (after.width - before.width) / 2);\n sy = Math.max(0, sy + (after.height - before.height) / 2);\n this.$container.scrollLeft(sx).scrollTop(sy);\n }\n };\n const zoomIn = () => {\n if (this.getState('enabled') !== false) {\n zoomAction(1);\n }\n };\n const zoomOut = () => {\n if (this.getState('enabled') !== false) {\n zoomAction(-1);\n }\n };\n\n /**\n * Reapplys the same zoom level to the target\n * It can be useful if the element was (visually-)hidden why zoom happened\n */\n const zoomReApply = () => {\n if (this.zoom !== standard) {\n _setZoomLevel(this.$zoomTarget, this.zoom);\n }\n };\n\n //build element (detached)\n this.buttonZoomOut = this.getAreaBroker().getToolbox().createEntry({\n control: 'zoomOut',\n title: __('Zoom out'),\n icon: 'remove'\n });\n this.buttonZoomIn = this.getAreaBroker().getToolbox().createEntry({\n control: 'zoomIn',\n title: __('Zoom in'),\n icon: 'add'\n });\n\n //attach behavior\n this.buttonZoomIn.on('click', e => {\n e.preventDefault();\n testRunner.trigger('tool-zoomin');\n });\n\n //attach behavior\n this.buttonZoomOut.on('click', e => {\n e.preventDefault();\n testRunner.trigger('tool-zoomout');\n });\n if (testRunnerOptions.allowShortcuts) {\n if (pluginShortcuts.in) {\n shortcut.add(namespaceHelper.namespaceAll(pluginShortcuts.in, this.getName(), true), () => {\n testRunner.trigger('tool-zoomin');\n }, {\n avoidInput: true\n });\n }\n if (pluginShortcuts.out) {\n shortcut.add(namespaceHelper.namespaceAll(pluginShortcuts.out, this.getName(), true), () => {\n testRunner.trigger('tool-zoomout');\n }, {\n avoidInput: true\n });\n }\n }\n\n //start disabled\n togglePlugin();\n this.disable();\n\n //update plugin state based on changes\n testRunner.on('loaditem', () => {\n this.zoom = standard;\n togglePlugin();\n this.disable();\n }).on('renderitem', () => {\n this.$container = $('#qti-content');\n this.$zoomTarget = $('.qti-item');\n this.enable();\n }).on('enabletools', () => {\n this.enable();\n }).on('disabletools unloaditem', () => {\n this.disable();\n }).on('tool-zoomin', zoomIn).on('tool-zoomout', zoomOut).on('tool-zoomreapply', zoomReApply);\n },\n /**\n * Called during the runner's destroy phase\n */\n destroy() {\n shortcut.remove(`.${this.getName()}`);\n },\n /**\n * Enable the button\n */\n enable() {\n this.buttonZoomIn.enable();\n this.buttonZoomOut.enable();\n },\n /**\n * Disable the button\n */\n disable() {\n this.buttonZoomIn.disable();\n this.buttonZoomOut.disable();\n },\n /**\n * Show the button\n */\n show() {\n this.buttonZoomIn.show();\n this.buttonZoomOut.show();\n },\n /**\n * Hide the button\n */\n hide() {\n this.buttonZoomIn.hide();\n this.buttonZoomOut.hide();\n }\n });\n\n return zoom;\n\n});\n\n","\n(function(c){var d=document,a='appendChild',i='styleSheet',s=d.createElement('style');s.type='text/css';d.getElementsByTagName('head')[0][a](s);s[i]?s[i].cssText=c:s[a](d.createTextNode(c));})\n('/*\\nUsage:\\n- linear-gradient((color1, color2, color3)) - returns linear-gradient with evenly distributed colors,\\n if 3 colors used then the position of each will be 33,33%\\n- linear-gradient((color1 0%, color2 30%, color3 80%)) - returns linear-gradient with manually distributed colors,\\n first param - color, second - position. Also you can use px or other valid units for set position.\\n*/\\n/* based on \\\"visually-hidden\\\" mixin in LDS for accessibility goals */\\n/* Do not edit */\\n.test-runner-scope .content-wrapper p.key-navigation-group, .test-runner-scope .content-wrapper div.key-navigation-group:not(.select2-container) {\\n padding: 5px !important;\\n}\\n.test-runner-scope .content-wrapper .key-navigation-group:not(.qti-extendedTextInteraction):not(.qti-textEntryInteraction):not(.qti-customInteraction) {\\n border-width: 1px !important;\\n border-style: solid;\\n border-color: transparent;\\n}\\n.test-runner-scope .content-wrapper .key-navigation-group:not(.qti-extendedTextInteraction):not(.qti-textEntryInteraction):not(.qti-customInteraction).focusin {\\n border-color: rgb(14, 93, 145) !important;\\n outline: none;\\n}\\n.test-runner-scope .content-wrapper .key-navigation-group:not(.qti-extendedTextInteraction):not(.qti-textEntryInteraction):not(.qti-customInteraction).qti-interaction .qti-choice.key-navigation-highlight:not(.tts-content-node) {\\n background: #e7eff4 !important;\\n}\\n.test-runner-scope .content-wrapper span.key-navigation-group {\\n border: none !important;\\n}\\n.test-runner-scope .content-wrapper span.key-navigation-group.focusin {\\n outline: solid rgb(14, 93, 145) 1px !important;\\n outline-offset: 1px;\\n}\\n.test-runner-scope .test-sidebar .key-navigation-group.focusin {\\n background: #e7eff4;\\n}\\n.test-runner-scope .test-sidebar .key-navigation-group .qti-navigator-filters .key-navigation-highlight .qti-navigator-tab {\\n border-width: 2px;\\n}\\n.test-runner-scope .test-sidebar .key-navigation-group .qti-navigator-filters .key-navigation-highlight:focus {\\n outline: none;\\n}\\n.test-runner-scope .test-sidebar .key-navigation-group .qti-navigator-filters .key-navigation-highlight:focus .qti-navigator-tab {\\n border-top-color: #222 !important;\\n border-left-color: #222 !important;\\n border-right-color: #222 !important;\\n}\\n.test-runner-scope .test-sidebar .key-navigation-group li.qti-navigator-item.key-navigation-highlight {\\n padding-left: 8px;\\n border-left: solid 2px #222;\\n}\\n.test-runner-scope .test-sidebar .key-navigation-group li.qti-navigator-item.key-navigation-highlight .key-navigation-highlight:focus {\\n outline: none;\\n}\\n.test-runner-scope .test-sidebar .qti-navigator-fizzy .key-navigation-group.focusin {\\n background: #f2f2f2;\\n}\\n.test-runner-scope .bottom-action-bar.content-action-bar.key-navigation-group.focusin {\\n -ms-box-shadow: 0 0 6px 2px #3e7da7;\\n -o-box-shadow: 0 0 6px 2px #3e7da7;\\n box-shadow: 0 0 6px 2px #3e7da7;\\n}\\n.test-runner-scope .bottom-action-bar.content-action-bar.key-navigation-group .key-navigation-highlight:focus {\\n margin-bottom: 0;\\n border-bottom-color: #e7eff4 !important;\\n outline: none;\\n}\\n.test-runner-scope .bottom-action-bar.content-action-bar.key-navigation-group .key-navigation-highlight:focus.active {\\n border-bottom-color: transparent !important;\\n background: #e7eff4 !important;\\n}\\n.test-runner-scope .bottom-action-bar.content-action-bar.key-navigation-group .key-navigation-highlight:focus:not(.active):not(:active) .li-inner {\\n color: #e7eff4;\\n}\\n\\nheader .settings-menu .key-navigation-group {\\n padding-right: 5px;\\n}\\nheader .settings-menu .key-navigation-group.focusin {\\n background-color: rgba(14, 93, 145, 0.5);\\n padding-bottom: 10px;\\n}\\nheader .settings-menu .key-navigation-highlight:focus {\\n height: 54px;\\n color: white !important;\\n border-bottom: solid 2px white !important;\\n}\\n/*# sourceMappingURL=../../../taoQtiTest/views/node_modules/@oat-sa/tao-test-runner-qti/dist/plugins/content/accessibility/css/key-navigation.css.map *//*\\nUsage:\\n- linear-gradient((color1, color2, color3)) - returns linear-gradient with evenly distributed colors,\\n if 3 colors used then the position of each will be 33,33%\\n- linear-gradient((color1 0%, color2 30%, color3 80%)) - returns linear-gradient with manually distributed colors,\\n first param - color, second - position. Also you can use px or other valid units for set position.\\n*/\\n/* based on \\\"visually-hidden\\\" mixin in LDS for accessibility goals */\\n/* Do not edit */\\n.countdown {\\n opacity: 0;\\n position: relative;\\n display: inline-block;\\n overflow: hidden;\\n text-align: center;\\n vertical-align: top;\\n line-height: 1.2;\\n padding: 0 20px;\\n margin-top: -1px;\\n height: 100%;\\n}\\n.countdown.rendered {\\n opacity: 1;\\n transition: opacity, 300ms, linear, 0s;\\n}\\n.countdown .label {\\n max-width: 130px;\\n display: block;\\n font-size: 12px;\\n font-size: 1.2rem;\\n}\\n/*# sourceMappingURL=../../../taoQtiTest/views/node_modules/@oat-sa/tao-test-runner-qti/dist/plugins/controls/timer/component/css/countdown.css.map *//*\\nUsage:\\n- linear-gradient((color1, color2, color3)) - returns linear-gradient with evenly distributed colors,\\n if 3 colors used then the position of each will be 33,33%\\n- linear-gradient((color1 0%, color2 30%, color3 80%)) - returns linear-gradient with manually distributed colors,\\n first param - color, second - position. Also you can use px or other valid units for set position.\\n*/\\n/* based on \\\"visually-hidden\\\" mixin in LDS for accessibility goals */\\n/* Do not edit */\\n.timer-box {\\n opacity: 0;\\n padding-top: 0;\\n white-space: nowrap;\\n /*flex item of control-box */\\n flex: 1 0 auto;\\n /* is also a flex container for .qti-timer */\\n display: flex;\\n flex-direction: row;\\n flex-wrap: nowrap;\\n justify-content: flex-end;\\n}\\n.timer-box.rendered {\\n opacity: 1;\\n transition: opacity, 300ms, linear, 0s;\\n}\\n.timer-box .timer-toggler {\\n text-decoration: none;\\n color: white;\\n line-height: 1.3;\\n opacity: 0.68;\\n padding: 8px 20px;\\n position: relative;\\n top: -1px;\\n left: 20px;\\n z-index: 2;\\n transition: opacity, 0.5s, ease-out, 0s;\\n}\\n.timer-box .timer-toggler:hover, .timer-box .timer-toggler:active, .timer-box .timer-toggler:focus {\\n outline: unset;\\n}\\n.timer-box .timer-toggler:active, .timer-box .timer-toggler:focus {\\n border: 2px solid white;\\n}\\n.timer-box .timer-toggler:hover {\\n opacity: 0.93;\\n transition: opacity, 0.5s, ease-out, 0s;\\n}\\n.timer-box.zen .timer-toggler {\\n opacity: 0.93;\\n transition: opacity, 0.5s, ease-out, 0s;\\n}\\n.timer-box.zen .countdown .time {\\n opacity: 0;\\n transition: opacity, 1s, ease-out, 0s;\\n}\\n.timer-box .countdown::before {\\n content: \\\" \\\";\\n background: rgba(255, 255, 255, 0.3);\\n width: 1px;\\n height: 20px;\\n position: absolute;\\n left: 0;\\n top: 5px;\\n}\\n.timer-box .countdown:first-child::before {\\n content: none;\\n}\\n.timer-box .countdown[data-scope=test][data-type=min] {\\n order: 5;\\n}\\n.timer-box .countdown[data-scope=test] {\\n order: 10;\\n}\\n.timer-box .countdown[data-scope=testPart][data-type=min] {\\n order: 15;\\n}\\n.timer-box .countdown[data-scope=testPart] {\\n order: 20;\\n}\\n.timer-box .countdown[data-scope=section][data-type=min] {\\n order: 25;\\n}\\n.timer-box .countdown[data-scope=section] {\\n order: 30;\\n}\\n.timer-box .countdown[data-scope=item][data-type=min] {\\n order: 35;\\n}\\n.timer-box .countdown[data-scope=item] {\\n order: 40;\\n}\\n/*# sourceMappingURL=../../../taoQtiTest/views/node_modules/@oat-sa/tao-test-runner-qti/dist/plugins/controls/timer/component/css/timerbox.css.map */');\n","\ndefine(\"taoQtiTest/loader/testPlugins.bundle\", function(){});\n"],"mappings":"AAAAA,MAAA,6HAAAC,CAAA,CAAAC,aAAA,CAAAC,QAAA,eA6BA,SAAAC,YAAA,EACA,wBAAAC,IAAA,CAAAC,SAAA,CAAAC,SAAA,CACA,CA7BAN,CAAA,CAAAA,CAAA,EAAAO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAV,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACAC,aAAA,CAAAA,aAAA,EAAAM,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAT,aAAA,YAAAA,aAAA,YAAAA,aAAA,CACAC,QAAA,CAAAA,QAAA,EAAAK,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAR,QAAA,YAAAA,QAAA,YAAAA,QAAA,CAgCA,IAAAS,iBAAA,CAAAV,aAAA,EACAW,IAAA,qBAIAC,IAAA,UAAAA,KAAA,EACA,IAAAC,IAAA,MAOAX,WAAA,IACA,KAAAY,aAAA,GAAAC,KAAA,4BACA,CAAAC,MAAA,CAAAH,IAAA,CAAAI,aAAA,GAAAC,cAAA,GAAAC,IAAA,kBAAAA,IAAA,4BAAAC,GAAA,iEAAAC,KAAA,GACAC,IAAA,CAAAN,MAAA,CAAAO,OAAA,qBAAAJ,IAAA,SACAG,IAAA,CAAAE,MAAA,CACAzB,CAAA,CAAA0B,KAAA,YACAxB,QAAA,CAAAyB,SAAA,CAAAJ,IAAA,CAAAK,IAAA,OAAAC,OAAA,cAAAC,KAAA,EACA,OAEAb,MAAA,CAAAa,KAAA,EAEA,EAEA,CACA,GAEA,OAAAnB,iBAEA,GAEAZ,MCrEA,iGAAAgC,OAAA,CAAAC,EAAA,eAEAA,EAAA,CAAAA,EAAA,EAAAzB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAsB,EAAA,YAAAA,EAAA,YAAAA,EAAA,MAgCA,CAAAC,qBAAA,CAAAC,MAAA,IACA,IAAAC,UAAA,EACA,OAAAD,MAAA,CAAAE,YAAA,EACA,EACA,IAAAC,SAAA,EACA,OAAAH,MAAA,CAAAE,YAAA,GAAAhB,IAAA,qBAAAE,KAAA,EACA,EACA,IAAAgB,WAAA,EACA,OAAAJ,MAAA,CAAAK,iBAAA,GAAAnB,IAAA,4BAAAE,KAAA,EACA,EACA,IAAAkB,QAAA,EACA,OAAAN,MAAA,CAAAO,cAAA,GAAArB,IAAA,4BAAAE,KAAA,EACA,EACA,IAAAoB,WAAA,EACA,OAAAR,MAAA,CAAAS,YAAA,GAAAvB,IAAA,4BAAAE,KAAA,EACA,CACA,GASAsB,aAAA,CAAAC,IAAA,EACAA,IAAA,CAAAC,OAAA,CACAd,EAAA,uBAEAa,IAAA,CAAAE,QAAA,CACAf,EAAA,aAEAa,IAAA,CAAAG,MAAA,CACAhB,EAAA,iBAEAA,EAAA,YACA,CASAiB,mBAAA,CAAAC,UAAA,EAAAA,UAAA,CAAAhC,aAAA,GAAAyB,YAAA,GAAAvB,IAAA,mBAAA+B,EAAA,YAEApB,OAAA,CAAAa,aAAA,CAAAA,aAAA,CACAb,OAAA,CAAAE,qBAAA,CAAAA,qBAAA,CACAF,OAAA,CAAAkB,mBAAA,CAAAA,mBAAA,CAEA1C,MAAA,CAAA6C,cAAA,CAAArB,OAAA,eAAAsB,KAAA,KAEA,GAEAtD,MCzFA,gJAAAC,CAAA,CAAAsD,SAAA,CAAAC,UAAA,CAAAC,QAAA,eAsDA,SAAAC,aAAAC,IAAA,CAAAC,OAAA,CAAAC,QAAA,EACA,IAAAC,IAAA,CAAAC,QAAA,CAAAJ,IAAA,CAAAC,OAAA,EACA,OAAAC,QAAA,KAAAC,IAAA,CAAAE,CAAA,CAAAF,IAAA,CACA,CAgCA,SAAAG,iBAAAC,MAAA,EAIA,MAAAC,YAAA,CAAAZ,SAAA,IAAAa,QAAA,EAAAC,EAAA,qBAEA,MAAAC,QAAA,GACAC,QAAA,yBACAC,SAAA,QACAC,UAAA,WACA,GACAF,QAAA,0BACAC,SAAA,QACAC,UAAA,aACA,GACAF,QAAA,uBACAC,SAAA,QACAC,UAAA,UACA,GACAF,QAAA,0BACAC,SAAA,QACAC,UAAA,aACA,GACAF,QAAA,yBACAC,SAAA,aACAC,UAAA,YACA,GACAxE,CAAA,CAAAyE,OAAA,CAAAJ,QAAA,CAAAK,eAAA,QACA,CAAAC,KAAA,MAAAC,UAAA,GAAAxD,IAAA,CAAAsD,eAAA,CAAAJ,QAAA,EACAO,UAAA,CAAAA,CAAA,IACA,KAAAC,OAAA,CAAAJ,eAAA,CAAAH,SAAA,CAAAG,eAAA,CAAAF,UAAA,EACA,KAAAI,UAAA,GAAAxD,IAAA,WAAA2D,IAAA,EACA,EACAJ,KAAA,GACAA,KAAA,CAAAP,EAAA,SAAAS,UAAA,EACAF,KAAA,CAAAP,EAAA,SAAAY,KAAA,GACA,MAAAC,cAAA,SACAA,cAAA,CAAAC,QAAA,CAAAF,KAAA,CAAAG,OAAA,GACAN,UAAA,EAEA,GAEA,EACA,GAKA,MAJA,CAAAX,YAAA,CAAAkB,WAAA,CAAA3B,YAAA,EACAzD,CAAA,CAAAqF,KAAA,MACAnB,YAAA,CAAArD,IAAA,CAAAoD,MAAA,CACA,GACAC,YACA,CAxIAlE,CAAA,CAAAA,CAAA,EAAAO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAV,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACAsD,SAAA,CAAAA,SAAA,EAAA/C,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA4C,SAAA,YAAAA,SAAA,YAAAA,SAAA,CACAC,UAAA,CAAAA,UAAA,EAAAhD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6C,UAAA,YAAAA,UAAA,YAAAA,UAAA,CACAC,QAAA,CAAAA,QAAA,EAAAjD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA8C,QAAA,YAAAA,QAAA,YAAAA,QAAA,CAEAA,QAAA,CAAA8B,aAAA,GACA9B,QAAA,CAAAD,UAAA,EACAC,QAAA,CAAA8B,aAAA,KAEA,IAAAxB,QAAA,CAAAP,UAAA,CAAAgC,QAAA,UAAAhC,UAAA,CAAAiC,MAAA,CAAAC,OAAA,CAAAC,QAAA,CAAAhC,IAAA,EAKA,SAAAiC,SAAAH,MAAA,CAAA9B,IAAA,EAGA,cACA,CARA,KAAAkC,YAAA,gBACAH,OAAA,MAAAI,KAAA,CAAAJ,OAAA,CAAAlC,UAAA,CAAAkC,OAAA,EAAA/B,IAAA,CAAAA,IAAA,KACA,IAAAoC,MAAA,IAAAC,aAAA,CAAAN,OAAA,CAAAM,aAAA,CAAAC,gBAAA,MAAAA,gBAAA,CAAAC,YAAA,YAAAnF,IAAA,MAAAoF,MAAA,CAAAC,MAAA,CAAAxC,OAAA,CAsCA,MA9BA,CAAAmC,MAAA,gDACAE,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,aAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,kBAAA7B,OAAA,IACA,yHACAqC,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,YAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,iBAAA7B,OAAA,IACA,OACAqC,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,YAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,iBAAA7B,OAAA,IACA,OACAwC,MAAA,CAAAV,OAAA,CAAAY,cAAA,EAAAH,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAa,cAAA,CAAAH,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,0IACAF,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,YAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,iBAAA7B,OAAA,IACA,OACAqC,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,cAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,mBAAA7B,OAAA,IACA,uIACAqC,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,YAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,iBAAA7B,OAAA,IACA,OACAqC,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,WAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,gBAAA7B,OAAA,IACA,oEACAuC,MAAA,CAAAT,OAAA,CAAAa,MAAA,CAAA5F,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAAe,oBAAA,EAAAH,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA2F,IAAA,CAAAC,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,GAAAhB,QAAA,CAAAjC,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,6EACAE,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,YAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,iBAAA7B,OAAA,IACA,OACAqC,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,6BAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,kCAAA7B,OAAA,IACA,yIACAqC,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,YAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,iBAAA7B,OAAA,IACA,OACAqC,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,2BAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,gCAAA7B,OAAA,IACA,oDACAmC,MACA,GA2BA,MAAA3B,QAAA,IA4DA,OAAAH,gBAEA,GAEAjE,MChJA,qDAAAC,CAAA,eAoCA,SAAA4G,cAAA,EACA,OACAC,SAAA,GACA9D,QAAA,GACAD,OAAA,GACAE,MAAA,GACA8D,KAAA,GACAC,eAAA,EACA,CACA,CA3CA/G,CAAA,CAAAA,CAAA,EAAAO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAV,CAAA,YAAAA,CAAA,YAAAA,CAAA,CAgDA,IAAAgH,GAAA,EAMAC,QAAA,UAAAA,SAAAD,GAAA,EACA,OAAAA,GAAA,EAAAA,GAAA,CAAAE,KACA,EAMAC,QAAA,UAAAA,SAAAH,GAAA,EACA,OAAAA,GAAA,EAAAA,GAAA,CAAAI,KACA,EAMAC,WAAA,UAAAA,YAAAL,GAAA,EACA,IAAAI,KAAA,MAAAD,QAAA,CAAAH,GAAA,EACAM,MAAA,IASA,MARA,CAAAtH,CAAA,CAAAyE,OAAA,CAAA2C,KAAA,UAAAG,IAAA,EACA,IAAAC,QAAA,CAAAD,IAAA,CAAAC,QAAA,CACAA,QAAA,EACAxH,CAAA,CAAAyE,OAAA,CAAA+C,QAAA,UAAAC,OAAA,EACAH,MAAA,CAAAG,OAAA,CAAAC,EAAA,EAAAD,OACA,EAEA,GACAH,MACA,EAMAK,aAAA,UAAAA,cAAAC,aAAA,EACA,IAAAR,KAAA,MAAAD,QAAA,CAAAS,aAAA,EACAN,MAAA,IAgBA,MAfA,CAAAtH,CAAA,CAAAyE,OAAA,CAAA2C,KAAA,UAAAG,IAAA,EACA,IAAAC,QAAA,CAAAD,IAAA,CAAAC,QAAA,CACAA,QAAA,EACAxH,CAAA,CAAAyE,OAAA,CAAA+C,QAAA,UAAAC,OAAA,EACA,GAAAA,OAAA,CAAAI,MAAA,EACA,MAAAC,KAAA,CAAAL,OAAA,CAAAK,KAAA,CACA9H,CAAA,CAAAyE,OAAA,CAAAqD,KAAA,UAAAjF,IAAA,EACAA,IAAA,CAAAgF,MAAA,GACAP,MAAA,CAAAzE,IAAA,CAEA,EACA,CACA,EAEA,GACAyE,MACA,EAOAS,eAAA,UAAAA,gBAAAf,GAAA,CAAAgB,SAAA,EACA,IAAAR,QAAA,MAAAH,WAAA,CAAAL,GAAA,EACAM,MAAA,IACAW,OAAA,IASA,MARA,CAAAjI,CAAA,CAAAyE,OAAA,CAAA+C,QAAA,UAAAC,OAAA,EACAQ,OAAA,GACAX,MAAA,CAAAG,OAAA,CAAAC,EAAA,EAAAD,OAAA,EAEAA,OAAA,CAAAC,EAAA,GAAAM,SAAA,GACAC,OAAA,IAEA,GACAX,MACA,EAOAY,OAAA,UAAAA,QAAAlB,GAAA,CAAAmB,QAAA,EACA,IAAAjB,KAAA,MAAAD,QAAA,CAAAD,GAAA,EACA,OAAAE,KAAA,EAAAA,KAAA,CAAAiB,QAAA,CACA,EAOAC,OAAA,UAAAA,QAAApB,GAAA,CAAAqB,QAAA,EACA,IAAAjB,KAAA,MAAAD,QAAA,CAAAH,GAAA,EACA,OAAAI,KAAA,EAAAA,KAAA,CAAAiB,QAAA,CACA,EAOAC,UAAA,UAAAA,WAAAtB,GAAA,CAAAuB,WAAA,KACA,CAAAnB,KAAA,MAAAD,QAAA,CAAAH,GAAA,EACAS,OAAA,MAQA,MAPA,CAAAzH,CAAA,CAAAyE,OAAA,CAAA2C,KAAA,UAAAG,IAAA,EACA,IAAAC,QAAA,CAAAD,IAAA,CAAAC,QAAA,CACA,GAAAA,QAAA,EAAAA,QAAA,CAAAe,WAAA,EAEA,MADA,CAAAd,OAAA,CAAAD,QAAA,CAAAe,WAAA,IAGA,GACAd,OACA,EAOAe,QAAAxB,GAAA,CAAAyB,cAAA,EACA,MAAAC,IAAA,CAAA1I,CAAA,CAAAoB,IAAA,MAAA6F,QAAA,CAAAD,GAAA,GACA2B,UAAA,CAAAF,cACA,GACA,YAAAG,SAAA,CAAA5B,GAAA,CAAA0B,IAAA,EAAAA,IAAA,CAAAP,QAAA,CACA,EAOAU,kBAAA7B,GAAA,CAAAyB,cAAA,EACA,MAAA5F,IAAA,MAAA2F,OAAA,CAAAxB,GAAA,CAAAyB,cAAA,QACA,CAAA5F,IAAA,EAAAiG,KAAA,CAAAC,OAAA,CAAAlG,IAAA,CAAAmG,UAAA,EACAnG,IAAA,CAAAmG,UAAA,CAEA,EACA,EASAC,gBAAAjC,GAAA,CAAAyB,cAAA,CAAAS,QAAA,EACA,IAAAC,UAAA,MAAAC,SAAA,CAAA3H,MAAA,EAAA2H,SAAA,eAAAA,SAAA,SACA,CAAAC,SAAA,iBACAL,UAAA,MAAAH,iBAAA,CAAA7B,GAAA,CAAAyB,cAAA,EACA,IAAAS,QAAA,GAAAA,QAAA,CAAAzH,MAAA,CACA,SAEA,MAAA6H,UAAA,CAAAN,UAAA,CAAA9D,QAAA,CAAAgE,QAAA,EACA,GAAAI,UAAA,CACA,SAEA,GAAAH,UAAA,EAEA,IAAAD,QAAA,CAAAK,UAAA,CAAAF,SAAA,GAAAH,QAAA,CAAAhE,QAAA,IAAAmE,SAAA,GAAAH,QAAA,IACA,SAIA,MAAAM,SAAA,CAAAC,GAAA,EAAAA,GAAA,CAAA5H,OAAA,CAAAwH,SAAA,KAAAxH,OAAA,eAAA6H,WAAA,GACA,OAAAV,UAAA,CAAAW,IAAA,CAAAC,YAAA,EAAAJ,SAAA,CAAAI,YAAA,IAAAJ,SAAA,CAAAN,QAAA,EACA,CACA,QACA,EAMAW,YAAA,UAAAA,aAAA7C,GAAA,EACA,OAAAA,GAAA,EAAAA,GAAA,CAAA8C,KACA,EAOAC,YAAA,UAAAA,aAAA/C,GAAA,CAAAqB,QAAA,EACA,IAAAd,IAAA,MAAAa,OAAA,CAAApB,GAAA,CAAAqB,QAAA,EACA,OAAAd,IAAA,EAAAA,IAAA,CAAAuC,KACA,EAOAE,eAAA,UAAAA,gBAAAhD,GAAA,CAAAuB,WAAA,EACA,IAAAd,OAAA,MAAAa,UAAA,CAAAtB,GAAA,CAAAuB,WAAA,EACA,OAAAd,OAAA,EAAAA,OAAA,CAAAqC,KACA,EAQAG,aAAA,UAAAA,cAAAjD,GAAA,CAAAmB,QAAA,CAAA+B,KAAA,EACA,IAAAxB,IAAA,MAAAR,OAAA,CAAAlB,GAAA,CAAAmB,QAAA,EACA,OAAA+B,KAAA,EACA,cACA,kBACA,YAAAF,eAAA,CAAAhD,GAAA,CAAA0B,IAAA,EAAAA,IAAA,CAAAjB,OAAA,EACA,WACA,eACA,YAAAsC,YAAA,CAAA/C,GAAA,CAAA0B,IAAA,EAAAA,IAAA,CAAAnB,IAAA,EAIA,mCACA,MACA,CAAA4C,SAAA,MAAAN,YAAA,CAAA7C,GAAA,EACA,CACAmB,QAAA,CAAAiC,mBAAA,CACAC,QAAA,CAAAC,mBACA,OAAAlC,OAAA,CAAApB,GAAA,CAAA0B,IAAA,EAAAA,IAAA,CAAAnB,IAAA,EACAH,KAAA,CAAA7G,MAAA,CAAAgK,MAAA,MAAApD,QAAA,CAAAH,GAAA,GAAAwD,MAAA,CAAAC,IAAA,GACA,IACAtC,QAAA,CAAAuC,YACA,EAAAD,IAAA,CACA,OAAAC,YAAA,CAAAN,mBACA,GAAAO,IAAA,EAAAC,CAAA,CAAAC,CAAA,GAAAA,CAAA,CAAAD,CAAA,EAGAE,eAAA,CAAAR,mBAAA,GAAAlD,KAAA,CAAA2D,SAAA,CAAAC,KAAA,GACA,IACAX,QACA,EAAAW,KAAA,CACA,OAAAX,QACA,GACA,QAAAS,eAAA,CACA,OAAAX,SAAA,CACA,KAGA,CAAAc,iBAAA,CAAA7D,KAAA,CAAA8D,KAAA,CAAAJ,eAAA,EACAK,oCAAA,CAAAF,iBAAA,CAAAG,MAAA,EAAAC,GAAA,CAAAC,KAAA,IACA,IACAxB,KAAA,EACAjD,SAAA,CACA9D,QACA,CACA,EAAAuI,KAAA,CACA,OAAAD,GAAA,EAAAxE,SAAA,CAAA9D,QAAA,CACA,KACAwI,kCAAA,CAAAN,iBAAA,CAAAG,MAAA,EAAAC,GAAA,CAAAG,KAAA,IACA,IACA1B,KAAA,EACAhH,OACA,CACA,EAAA0I,KAAA,CACA,OAAAH,GAAA,CAAAvI,OACA,KACA,OAAAvC,MAAA,CAAAkL,MAAA,IAAAtB,SAAA,EACApH,QAAA,CAAAoH,SAAA,CAAApH,QAAA,CAAAoI,oCAAA,CACArI,OAAA,CAAAqH,SAAA,CAAArH,OAAA,CAAAyI,kCACA,EACA,CACA,QACA,WACA,YAAA1B,YAAA,CAAA7C,GAAA,CACA,CACA,EAQA0E,WAAA,UAAAA,YAAA1E,GAAA,CAAAmB,QAAA,CAAA+B,KAAA,KAEA,CAAAyB,QAAA,CAAA3L,CAAA,CAAA4L,SAAA,CAAA5E,GAAA,MAGA0B,IAAA,MAAAR,OAAA,CAAAyD,QAAA,CAAAxD,QAAA,EACAZ,IAAA,MAAAa,OAAA,CAAAuD,QAAA,CAAAjD,IAAA,EAAAA,IAAA,CAAAnB,IAAA,EACAE,OAAA,MAAAa,UAAA,CAAAqD,QAAA,CAAAjD,IAAA,EAAAA,IAAA,CAAAjB,OAAA,EA0BA,MAvBA,CAAAyC,KAAA,WAAAA,KAAA,GACAyB,QAAA,CAAAvE,KAAA,IACAG,IAAA,GACAoE,QAAA,CAAAvE,KAAA,CAAAsB,IAAA,CAAAnB,IAAA,EAAAA,IAAA,GAKAA,IAAA,eAAA2C,KAAA,kBAAAA,KAAA,IACA3C,IAAA,CAAAC,QAAA,IACAC,OAAA,GACAF,IAAA,CAAAC,QAAA,CAAAkB,IAAA,CAAAjB,OAAA,EAAAA,OAAA,GAKAA,OAAA,GACAA,OAAA,CAAAqC,KAAA,MAAA+B,gBAAA,CAAApE,OAAA,CAAAK,KAAA,GAEAP,IAAA,GACAA,IAAA,CAAAuC,KAAA,MAAAgC,YAAA,CAAAvE,IAAA,CAAAC,QAAA,GAEAmE,QAAA,CAAA7B,KAAA,MAAAgC,YAAA,CAAAH,QAAA,CAAAvE,KAAA,EACAuE,QACA,EAQAI,sBAAA,UAAAA,uBAAA/E,GAAA,CAAAgF,OAAA,CAAA9B,KAAA,KAEA,CAAAyB,QAAA,CAAA3L,CAAA,CAAA4L,SAAA,CAAA5E,GAAA,MACAO,IAAA,CACAE,OAAA,CAkCA,MA/BA,CAAAuE,OAAA,EAAAA,OAAA,CAAAC,UAAA,GACA1E,IAAA,MAAAa,OAAA,CAAAuD,QAAA,CAAAK,OAAA,CAAAC,UAAA,GAEAD,OAAA,EAAAA,OAAA,CAAAhE,SAAA,GACAP,OAAA,MAAAa,UAAA,CAAAqD,QAAA,CAAAK,OAAA,CAAAhE,SAAA,GAIAkC,KAAA,WAAAA,KAAA,GACAyB,QAAA,CAAAvE,KAAA,IACAG,IAAA,GACAoE,QAAA,CAAAvE,KAAA,CAAA4E,OAAA,CAAAC,UAAA,EAAA1E,IAAA,GAKAA,IAAA,eAAA2C,KAAA,kBAAAA,KAAA,IACA3C,IAAA,CAAAC,QAAA,IACAC,OAAA,GACAF,IAAA,CAAAC,QAAA,CAAAwE,OAAA,CAAAhE,SAAA,EAAAP,OAAA,GAKAA,OAAA,GACAA,OAAA,CAAAqC,KAAA,MAAA+B,gBAAA,CAAApE,OAAA,CAAAK,KAAA,GAEAP,IAAA,GACAA,IAAA,CAAAuC,KAAA,MAAAgC,YAAA,CAAAvE,IAAA,CAAAC,QAAA,GAEAmE,QAAA,CAAA7B,KAAA,MAAAgC,YAAA,CAAAH,QAAA,CAAAvE,KAAA,EACAuE,QACA,EAOAO,WAAA,UAAAA,YAAAlF,GAAA,CAAAmB,QAAA,EACA,IAAAO,IAAA,MAAAR,OAAA,CAAAlB,GAAA,CAAAmB,QAAA,EACA,YAAAC,OAAA,CAAApB,GAAA,CAAA0B,IAAA,EAAAA,IAAA,CAAAnB,IAAA,CACA,EAOA4E,cAAA,UAAAA,eAAAnF,GAAA,CAAAmB,QAAA,KACA,CAAAO,IAAA,MAAAR,OAAA,CAAAlB,GAAA,CAAAmB,QAAA,EACAZ,IAAA,MAAAa,OAAA,CAAApB,GAAA,CAAA0B,IAAA,EAAAA,IAAA,CAAAnB,IAAA,EACAC,QAAA,CAAAD,IAAA,EAAAA,IAAA,CAAAC,QAAA,CACA,OAAAA,QAAA,EAAAA,QAAA,CAAAkB,IAAA,EAAAA,IAAA,CAAAjB,OAAA,CACA,EAOAmB,SAAA,UAAAA,UAAA5B,GAAA,CAAAmB,QAAA,KACA,CAAAO,IAAA,MAAAR,OAAA,CAAAlB,GAAA,CAAAmB,QAAA,EACAZ,IAAA,MAAAa,OAAA,CAAApB,GAAA,CAAA0B,IAAA,EAAAA,IAAA,CAAAnB,IAAA,EACAC,QAAA,CAAAD,IAAA,EAAAA,IAAA,CAAAC,QAAA,CACAC,OAAA,CAAAD,QAAA,EAAAA,QAAA,CAAAkB,IAAA,EAAAA,IAAA,CAAAjB,OAAA,EACAK,KAAA,CAAAL,OAAA,EAAAA,OAAA,CAAAK,KAAA,CACA,OAAAA,KAAA,EAAAA,KAAA,CAAAY,IAAA,EAAAA,IAAA,CAAAC,UAAA,CACA,EAOAyD,iBAAA,UAAAA,kBAAApF,GAAA,CAAAmB,QAAA,EACA,IAAAtF,IAAA,CAMA,MAJA,CAAAA,IAAA,CADA7C,CAAA,CAAAqM,QAAA,CAAAlE,QAAA,EACA,KAAAS,SAAA,CAAA5B,GAAA,CAAAmB,QAAA,EAEA,KAAAK,OAAA,CAAAxB,GAAA,CAAAmB,QAAA,EAEAtF,IAAA,EAAAA,IAAA,CAAA6E,EACA,EAOA4E,IAAA,UAAAA,KAAAtF,GAAA,CAAAuF,QAAA,EAUA,MATA,CAAAvM,CAAA,CAAAwM,UAAA,CAAAD,QAAA,GACAvM,CAAA,CAAAyE,OAAA,CAAAuC,GAAA,EAAAA,GAAA,CAAAI,KAAA,UAAAG,IAAA,EACAvH,CAAA,CAAAyE,OAAA,CAAA8C,IAAA,EAAAA,IAAA,CAAAC,QAAA,UAAAC,OAAA,EACAzH,CAAA,CAAAyE,OAAA,CAAAgD,OAAA,EAAAA,OAAA,CAAAK,KAAA,UAAAjF,IAAA,EACA0J,QAAA,CAAA1J,IAAA,CAAA4E,OAAA,CAAAF,IAAA,CAAAP,GAAA,CACA,EACA,EACA,GAEAA,GACA,EAOAyF,eAAA,UAAAA,gBAAAzF,GAAA,CAAAmB,QAAA,KACA,CAAAO,IAAA,MAAAR,OAAA,CAAAlB,GAAA,CAAAmB,QAAA,EACAZ,IAAA,MAAAa,OAAA,CAAApB,GAAA,CAAA0B,IAAA,EAAAA,IAAA,CAAAnB,IAAA,EACAC,QAAA,CAAAD,IAAA,EAAAA,IAAA,CAAAC,QAAA,CACAC,OAAA,CAAAD,QAAA,EAAAA,QAAA,CAAAkB,IAAA,EAAAA,IAAA,CAAAjB,OAAA,EAUA,MATA,CAAAA,OAAA,GACAA,OAAA,CAAAqC,KAAA,MAAA+B,gBAAA,CAAApE,OAAA,CAAAK,KAAA,GAEAP,IAAA,GACAA,IAAA,CAAAuC,KAAA,MAAAgC,YAAA,CAAAvE,IAAA,CAAAC,QAAA,GAEAR,GAAA,GACAA,GAAA,CAAA8C,KAAA,MAAAgC,YAAA,CAAA9E,GAAA,CAAAI,KAAA,GAEAJ,GACA,EAMA6E,gBAAA,UAAAA,iBAAA/D,KAAA,EACA,OAAA9H,CAAA,CAAAoL,MAAA,CAAAtD,KAAA,UAAA4E,SAAArB,GAAA,CAAAxI,IAAA,EAiBA,MAhBA,CAAAA,IAAA,CAAA8J,aAAA,GACAtB,GAAA,CAAAxE,SAAA,GACAhE,IAAA,CAAAE,QAAA,EACAsI,GAAA,CAAAtI,QAAA,GAEAF,IAAA,CAAAG,MAAA,EACAqI,GAAA,CAAAtE,eAAA,IAGAlE,IAAA,CAAAC,OAAA,EACAuI,GAAA,CAAAvI,OAAA,GAEAD,IAAA,CAAAG,MAAA,EACAqI,GAAA,CAAArI,MAAA,GAEAqI,GAAA,CAAAvE,KAAA,GACAuE,GACA,EAAAzE,aAAA,GACA,EAMAkF,YAAA,UAAAA,aAAAc,UAAA,EACA,OAAA5M,CAAA,CAAAoL,MAAA,CAAAwB,UAAA,UAAAF,SAAArB,GAAA,CAAAxI,IAAA,EAOA,MANA,CAAAwI,GAAA,CAAAxE,SAAA,EAAAhE,IAAA,CAAAiH,KAAA,CAAAjD,SAAA,CACAwE,GAAA,CAAAtI,QAAA,EAAAF,IAAA,CAAAiH,KAAA,CAAA/G,QAAA,CACAsI,GAAA,CAAAvI,OAAA,EAAAD,IAAA,CAAAiH,KAAA,CAAAhH,OAAA,CACAuI,GAAA,CAAArI,MAAA,EAAAH,IAAA,CAAAiH,KAAA,CAAA9G,MAAA,CACAqI,GAAA,CAAAvE,KAAA,EAAAjE,IAAA,CAAAiH,KAAA,CAAAhD,KAAA,CACAuE,GAAA,CAAAtE,eAAA,EAAAlE,IAAA,CAAAiH,KAAA,CAAA/C,eAAA,CACAsE,GACA,EAAAzE,aAAA,GACA,EAeAiG,KAAA,UAAAA,MAAAC,UAAA,CAAAC,UAAA,KACA,CAAAjM,IAAA,MACAkM,SAAA,CACA,IAAAhN,CAAA,CAAAiN,aAAA,CAAAF,UAAA,IAAAA,UAAA,CAAA3F,KAAA,CACA,UAAA8F,SAAA,4BA6BA,MA3BA,CAAAJ,UAAA,WAAAC,UAAA,CAAA7C,KAAA,EAGA8C,SAAA,CAAAhN,CAAA,CAAA4L,SAAA,CAAAkB,UAAA,EACA9M,CAAA,CAAAyE,OAAA,CAAAsI,UAAA,CAAA3F,KAAA,UAAA+F,WAAA,CAAAC,YAAA,EACA,SAAAL,UAAA,CAAA7C,KAAA,GAEA8C,SAAA,CAAA5F,KAAA,CAAAgG,YAAA,EAAApN,CAAA,CAAA4L,SAAA,CAAAuB,WAAA,GAEA,YAAAJ,UAAA,CAAA7C,KAAA,EACAlK,CAAA,CAAAyE,OAAA,CAAA0I,WAAA,CAAA3F,QAAA,UAAA6F,cAAA,CAAAC,eAAA,EAEAN,SAAA,CAAA5F,KAAA,CAAAgG,YAAA,EAAA5F,QAAA,CAAA8F,eAAA,EAAAtN,CAAA,CAAA4L,SAAA,CAAAyB,cAAA,EAGAL,SAAA,CAAA5F,KAAA,CAAAgG,YAAA,EAAA5F,QAAA,CAAA8F,eAAA,EAAAxD,KAAA,CAAAhJ,IAAA,CAAA+K,gBAAA,CAAAmB,SAAA,CAAA5F,KAAA,CAAAgG,YAAA,EAAA5F,QAAA,CAAA8F,eAAA,EAAAxF,KAAA,CACA,GAGAkF,SAAA,CAAA5F,KAAA,CAAAgG,YAAA,EAAAtD,KAAA,CAAAhJ,IAAA,CAAAgL,YAAA,CAAAkB,SAAA,CAAA5F,KAAA,CAAAgG,YAAA,EAAA5F,QAAA,CACA,GAEAwF,SAAA,CAAAlD,KAAA,MAAAgC,YAAA,CAAAkB,SAAA,CAAA5F,KAAA,GArBA4F,SAAA,CAAAhN,CAAA,CAAA4L,SAAA,CAAAmB,UAAA,EAyBAC,SAAA,MAAAO,OAAA,CAAAP,SAAA,EACAA,SACA,EASAO,OAAA,UAAAA,QAAAvG,GAAA,KACA,CAAAwG,MAAA,GACAC,UAAA,GACAC,aAAA,GACAC,UAAA,CACAC,aAAA,CACA,IAAA5N,CAAA,CAAAiN,aAAA,CAAAjG,GAAA,IAAAA,GAAA,CAAAI,KAAA,CACA,UAAA8F,SAAA,4BAoCA,MAhCA,CAAAlG,GAAA,CAAAE,KAAA,IAGAlH,CAAA,CAAA6N,MAAA,CAAA7G,GAAA,EAAAA,GAAA,CAAAI,KAAA,aAAA3C,OAAA,UAAA8C,IAAA,EACAvH,CAAA,CAAA6N,MAAA,CAAAtG,IAAA,EAAAA,IAAA,CAAAC,QAAA,aAAA/C,OAAA,UAAAgD,OAAA,EACAzH,CAAA,CAAA6N,MAAA,CAAApG,OAAA,EAAAA,OAAA,CAAAK,KAAA,aAAArD,OAAA,UAAA5B,IAAA,EACA8K,UAAA,GAAApG,IAAA,CAAAG,EAAA,GACA+F,UAAA,GACAE,UAAA,CAAApG,IAAA,CAAAG,EAAA,CACAH,IAAA,CAAAY,QAAA,CAAAqF,MAAA,EAEAI,aAAA,GAAAnG,OAAA,CAAAC,EAAA,GACAgG,aAAA,GACAE,aAAA,CAAAnG,OAAA,CAAAC,EAAA,CACAD,OAAA,CAAAU,QAAA,CAAAqF,MAAA,EAEA3K,IAAA,CAAAsF,QAAA,CAAAqF,MAAA,CACA3K,IAAA,CAAAiL,KAAA,CAAAJ,aAAA,GACA7K,IAAA,CAAAkL,cAAA,CAAAN,UAAA,CACA5K,IAAA,CAAAmL,iBAAA,CAAAN,aAAA,CACA1G,GAAA,CAAAE,KAAA,CAAAsG,MAAA,GACA7E,UAAA,CAAA9F,IAAA,CAAA6E,EAAA,CACAD,OAAA,CAAAA,OAAA,CAAAC,EAAA,CACAH,IAAA,CAAAA,IAAA,CAAAG,EAAA,CACAS,QAAA,CAAAqF,MACA,EACAA,MAAA,GACAE,aAAA,GACAD,UAAA,EACA,EACA,EACA,GACAzG,GACA,EAQAiH,eAAA,UAAAA,gBAAAjH,GAAA,EACA,IAAAhH,CAAA,CAAAiN,aAAA,CAAAjG,GAAA,IAAAA,GAAA,CAAAI,KAAA,CACA,UAAA8F,SAAA,4BAYA,MAVA,CAAAlG,GAAA,CAAAE,KAAA,IACA,KAAAoF,IAAA,CAAAtF,GAAA,UAAAnE,IAAA,CAAA4E,OAAA,CAAAF,IAAA,EACA,IAAAiG,MAAA,CAAA3K,IAAA,CAAAsF,QAAA,CACAnB,GAAA,CAAAE,KAAA,CAAAsG,MAAA,GACA7E,UAAA,CAAA9F,IAAA,CAAA6E,EAAA,CACAD,OAAA,CAAAA,OAAA,CAAAC,EAAA,CACAH,IAAA,CAAAA,IAAA,CAAAG,EAAA,CACAS,QAAA,CAAAqF,MACA,CACA,GACAxG,GACA,CACA,EAEA,OAAAA,GAEA,GAEAjH,MCtqBA,6FAAAmO,SAAA,eAQA,SAAA3H,qBAAA4H,MAAA,OACA,CAAAC,aAAA,CAAAF,SAAA,CAAAjF,eAAA,CAAAkF,MAAA,CAAAE,UAAA,GAAAF,MAAA,CAAAG,cAAA,GAAA7F,cAAA,oBACA8F,iBAAA,CAAAJ,MAAA,CAAAK,UAAA,GAAAC,MAAA,CAAAC,OAAA,CACA,OAAAN,aAAA,EAAAG,iBACA,CAEA,MAZA,CAAAL,SAAA,CAAAA,SAAA,EAAA3N,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAwN,SAAA,YAAAA,SAAA,YAAAA,SAAA,CAYA3H,oBAEA,GAEAxG,MClBA,2NAAAiC,EAAA,CAAAhC,CAAA,CAAAsD,SAAA,CAAAqL,YAAA,CAAAC,mBAAA,CAAArL,UAAA,CAAAC,QAAA,eA2DA,SAAAqL,aAAAnL,IAAA,CAAAC,OAAA,CAAAC,QAAA,EACA,IAAAC,IAAA,CAAAC,QAAA,CAAAJ,IAAA,CAAAC,OAAA,EACA,OAAAC,QAAA,KAAAC,IAAA,CAAAE,CAAA,CAAAF,IAAA,CACA,CAuDA,SAAAiL,oBAAA7K,MAAA,OACA,CAAA8K,YAAA,IACAC,YAAA,CAAA1L,SAAA,IAAAa,QAAA,EAAAC,EAAA,0BACA,CAAA6K,QAAA,MAAArK,UAAA,GACAsK,SAAA,CAAAD,QAAA,CAAA7N,IAAA,eACA+N,mBAAA,MAAAvK,UAAA,GAAAxD,IAAA,gCACA8N,SAAA,CAAA9K,EAAA,kBAAAU,OAAA,WAEAmK,QAAA,CAAA7K,EAAA,SAAAgL,CAAA,GACAH,QAAA,CAAA9L,EAAA,CAAAiM,CAAA,CAAAC,MAAA,GACA,KAAAvK,OAAA,SAEA,GACAmK,QAAA,CAAA7K,EAAA,SAAAgL,CAAA,GACAA,CAAA,CAAAjK,OAAA,GAAA4J,YAAA,EACA,KAAAjK,OAAA,SAEA,GACA,KAAAzE,SAAA,CAAAsO,YAAA,EACAW,QAAA,CAAAV,mBAAA,CAAAW,cAAA,CAAAJ,mBAAA,EACAK,YAAA,GACA,GAEApL,EAAA,kBACA,KAAAqL,WAAA,GACA,GAAArL,EAAA,wBACA,KAAAqL,WAAA,GACA,GAEArL,EAAA,aACApE,CAAA,CAAAqF,KAAA,MACA,KAAAhF,SAAA,CAAAqP,SAAA,IACA,KAAArP,SAAA,CAAAyB,KAAA,EAEA,EACA,GAAAsC,EAAA,qBAAAuL,MAAA,EACAA,MAAA,CAAAC,SAAA,CAAAhL,UAAA,GAAAiL,KAAA,EACA,GACA,KAAAxP,SAAA,CAAAiB,KAAA,EACA,GAAA8C,EAAA,sBACA,KAAA/D,SAAA,CAAAyP,OAAA,GACA,KAAAlL,UAAA,GAAAmL,MAAA,EACA,GAGA,MAFA,CAAAf,YAAA,CAAA5J,WAAA,CAAAyJ,YAAA,EACAG,YAAA,CAAAnO,IAAA,CAAAoD,MAAA,EACA+K,YACA,CAjKAhN,EAAA,CAAAA,EAAA,EAAAzB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAsB,EAAA,YAAAA,EAAA,YAAAA,EAAA,CACAhC,CAAA,CAAAA,CAAA,EAAAO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAV,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACAsD,SAAA,CAAAA,SAAA,EAAA/C,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA4C,SAAA,YAAAA,SAAA,YAAAA,SAAA,CACAqL,YAAA,CAAAA,YAAA,EAAApO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAiO,YAAA,YAAAA,YAAA,YAAAA,YAAA,CACAC,mBAAA,CAAAA,mBAAA,EAAArO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAkO,mBAAA,YAAAA,mBAAA,YAAAA,mBAAA,CACArL,UAAA,CAAAA,UAAA,EAAAhD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6C,UAAA,YAAAA,UAAA,YAAAA,UAAA,CACAC,QAAA,CAAAA,QAAA,EAAAjD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA8C,QAAA,YAAAA,QAAA,YAAAA,QAAA,CAEAA,QAAA,CAAA8B,aAAA,GACA9B,QAAA,CAAAD,UAAA,EACAC,QAAA,CAAA8B,aAAA,KAEA,IAAAxB,QAAA,CAAAP,UAAA,CAAAgC,QAAA,UAAAhC,UAAA,CAAAiC,MAAA,CAAAC,OAAA,CAAAC,QAAA,CAAAhC,IAAA,EAKA,SAAAiC,SAAAH,MAAA,CAAA9B,IAAA,EAEA,IAAAoC,MAAA,IAAAI,MAAA,CAAAC,MAAA,CASA,MARA,CAAAL,MAAA,yGACAK,MAAA,CAAAV,OAAA,CAAAuK,KAAA,EAAA9J,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAwK,KAAA,CAAA9J,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,2EACAA,MAAA,CAAAT,OAAA,CAAA6G,IAAA,CAAA5L,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAAyK,SAAA,EAAA7J,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA2F,IAAA,CAAAC,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,GAAAuJ,QAAA,CAAAxM,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,kDACAA,MACA,CACA,SAAAoK,SAAA1K,MAAA,CAAA9B,IAAA,EAEA,IAAAoC,MAAA,IAAAI,MAAA,CAAAC,MAAA,CAUA,MATA,CAAAL,MAAA,gJACAK,MAAA,CAAAV,OAAA,CAAA0K,QAAA,EAAAjK,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAA2K,QAAA,CAAAjK,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,4HACAC,MAAA,CAAAV,OAAA,CAAAuK,KAAA,EAAA9J,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAwK,KAAA,CAAA9J,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,yEACAJ,MACA,CA9BA,KAAAF,YAAA,gBACAH,OAAA,MAAAI,KAAA,CAAAJ,OAAA,CAAAlC,UAAA,CAAAkC,OAAA,EAAA/B,IAAA,CAAAA,IAAA,KACA,IAAAoC,MAAA,IAAAG,YAAA,YAAAD,gBAAA,MAAAA,gBAAA,CAAAlF,IAAA,MAAAiF,aAAA,CAAAN,OAAA,CAAAM,aAAA,CAAAG,MAAA,CAAAC,MAAA,CAAAxC,OAAA,CAwCA,MAVA,CAAAmC,MAAA,+TACAE,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,uBAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,4BAAA7B,OAAA,IACA,gJACAqC,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,mFAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,wFAAA7B,OAAA,IACA,6FACAqC,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,oGAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,yGAAA7B,OAAA,IACA,qOACAuC,MAAA,CAAAT,OAAA,CAAA6G,IAAA,CAAA5L,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAA4K,eAAA,EAAAhK,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA2F,IAAA,CAAAC,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,GAAAhB,QAAA,CAAAjC,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,2BACAA,MACA,GA2BA,MAAA3B,QAAA,EACAiM,eAAA,GACA1I,EAAA,wBACAsI,KAAA,CAAAhO,EAAA,yBACAiO,SAAA,GACAvI,EAAA,QACAyI,QAAA,mBACAH,KAAA,CAAAhO,EAAA,2BACA,GACA0F,EAAA,YACAyI,QAAA,mBACAH,KAAA,CAAAhO,EAAA,+BACA,GACA0F,EAAA,WACAyI,QAAA,mBACAH,KAAA,CAAAhO,EAAA,8BACA,GACA0F,EAAA,OACAyI,QAAA,mBACAH,KAAA,CAAAhO,EAAA,6BACA,EACA,EACA,EA0DA,OAAA8M,mBAEA,GAEA/O,MCzKA,gcAAAiC,EAAA,CAAAqO,GAAA,CAAApQ,aAAA,CAAAsG,oBAAA,CAAAd,OAAA,CAAAzB,gBAAA,CAAAsM,gBAAA,CAAAH,QAAA,CAAAI,eAAA,CAAAhN,UAAA,CAAAC,QAAA,eAwBA,SAAAgN,aAAA9M,IAAA,CAAAC,OAAA,CAAAC,QAAA,EACA,IAAAC,IAAA,CAAAC,QAAA,CAAAJ,IAAA,CAAAC,OAAA,EACA,OAAAC,QAAA,KAAAC,IAAA,CAAAE,CAAA,CAAAF,IAAA,CACA,CAzBA7B,EAAA,CAAAA,EAAA,EAAAzB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAsB,EAAA,YAAAA,EAAA,YAAAA,EAAA,CACAqO,GAAA,CAAAA,GAAA,EAAA9P,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA2P,GAAA,YAAAA,GAAA,YAAAA,GAAA,CACApQ,aAAA,CAAAA,aAAA,EAAAM,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAT,aAAA,YAAAA,aAAA,YAAAA,aAAA,CACAsG,oBAAA,CAAAA,oBAAA,EAAAhG,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6F,oBAAA,YAAAA,oBAAA,YAAAA,oBAAA,CACAvC,gBAAA,CAAAA,gBAAA,EAAAzD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAsD,gBAAA,YAAAA,gBAAA,YAAAA,gBAAA,CACAsM,gBAAA,CAAAA,gBAAA,EAAA/P,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA4P,gBAAA,YAAAA,gBAAA,YAAAA,gBAAA,CACAH,QAAA,CAAAA,QAAA,EAAA5P,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAyP,QAAA,YAAAA,QAAA,YAAAA,QAAA,CACAI,eAAA,CAAAA,eAAA,EAAAhQ,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6P,eAAA,YAAAA,eAAA,YAAAA,eAAA,CACAhN,UAAA,CAAAA,UAAA,EAAAhD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6C,UAAA,YAAAA,UAAA,YAAAA,UAAA,CACAC,QAAA,CAAAA,QAAA,EAAAjD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA8C,QAAA,YAAAA,QAAA,YAAAA,QAAA,CAEAA,QAAA,CAAA8B,aAAA,GACA9B,QAAA,CAAAD,UAAA,EACAC,QAAA,CAAA8B,aAAA,QAEA,CAAAxB,QAAA,CAAAP,UAAA,CAAAgC,QAAA,UAAAhC,UAAA,CAAAiC,MAAA,CAAAC,OAAA,CAAAC,QAAA,CAAAhC,IAAA,EAKA,MAJA,MAAAkC,YAAA,gBACAH,OAAA,MAAAI,KAAA,CAAAJ,OAAA,CAAAlC,UAAA,CAAAkC,OAAA,EAGA,8CACA,GA4BAgL,MAAA,CAAAxQ,aAAA,EACAW,IAAA,aAIAC,KAAA,OACA,CAAAqC,UAAA,MAAAnC,aAAA,GACA8B,IAAA,CAAAK,UAAA,CAAAwN,cAAA,GACAzM,MAAA,EACAsC,oBAAA,CAAAA,oBAAA,CAAArD,UAAA,EACAmD,cAAA,CAAAZ,OAAA,CAAA7C,aAAA,CAAAC,IAAA,CACA,EACA8N,iBAAA,CAAAzN,UAAA,CAAAsL,UAAA,GACAoC,eAAA,EAAAD,iBAAA,CAAAV,SAAA,WAAAY,OAAA,QACAC,UAAA,MAAA5P,aAAA,GACA6P,cAAA,CAAAtL,OAAA,CAAAxD,qBAAA,CAAA6O,UAAA,EACAE,eAAA,MAAA3Q,SAAA,CAAA4Q,UAAA,CAAAC,OAAA,QAsBA,GAtBA,CACAd,eAAA,GACA1I,EAAA,wBACAsI,KAAA,CAAAhO,EAAA,yBACAiO,SAAA,GACAvI,EAAA,QACAyI,QAAA,sBACAH,KAAA,CAAAhO,EAAA,2BACA,GACA0F,EAAA,YACAyI,QAAA,sBACAH,KAAA,CAAAhO,EAAA,+BACA,GACA0F,EAAA,WACAyI,QAAA,sBACAH,KAAA,CAAAhO,EAAA,8BACA,GACA0F,EAAA,OACAyI,QAAA,sBACAH,KAAA,CAAAhO,EAAA,6BACA,EACA,EACA,EACA2O,iBAAA,CAAAQ,cAAA,GACAP,eAAA,CAAAQ,OAAA,EAAAjB,QAAA,CAAAkB,GAAA,CAAAd,eAAA,CAAAe,YAAA,CAAAV,eAAA,CAAAQ,OAAA,MAAAP,OAAA,kBACAR,GAAA,eAAA/O,KAAA,GAAAQ,KAAA,EACA,GACAyP,UAAA,IACAC,OAAA,GACA,GACAZ,eAAA,CAAAa,YAAA,EAAAtB,QAAA,CAAAkB,GAAA,CAAAd,eAAA,CAAAe,YAAA,CAAAV,eAAA,CAAAa,YAAA,MAAAZ,OAAA,kBACAE,cAAA,CAAA1O,QAAA,CAAAP,KAAA,EACA,GACAyP,UAAA,IACAC,OAAA,GACA,IAEA,KAAAE,SAAA,CAAA1N,gBAAA,CAAAC,MAAA,EAAAG,EAAA,eACA,KAAAsN,SAAA,CAAAtN,EAAA,QAAAuN,MAAA,GACA,MAAA1C,QAAA,CAAA8B,cAAA,CAAAY,MAAA,EACA1C,QAAA,CAAAnN,KAAA,EACA,GACA,KAAA4P,SAAA,CAAAtN,EAAA,kBACA,KAAA6L,SAAA,GAGA,KAAAA,SAAA,CAAAK,gBAAA,CAAAU,eAAA,EACA,KAAAf,SAAA,CAAA2B,MAAA,MAAA1Q,aAAA,GAAA2Q,cAAA,IACA,KAAA5B,SAAA,CAAA7L,EAAA,cACA,KAAA6L,SAAA,CAAAH,OAAA,GACA,KAAAG,SAAA,KACA,GACA,EACA,GAAA7L,EAAA,mBAAA0N,OAAAC,MAAA,EACA,KAAAjN,OAAA,qBAAAiN,MAAA,CAAAxL,oBAAA,EACA,KAAAzB,OAAA,yBAAAiN,MAAA,CAAA1L,cAAA,CACA,GAAAjC,EAAA,8BAAA4N,kBAAAtD,OAAA,OACA,CAAAuD,IAAA,MAAArN,UAAA,GACAsN,aAAA,CAAAD,IAAA,CAAA7Q,IAAA,+BAAA+Q,MAAA,GACAzD,OAAA,CACAwD,aAAA,CAAAE,WAAA,WAEAF,aAAA,CAAAG,QAAA,UAEA,GAAAjO,EAAA,kCAAAkO,sBAAAjM,cAAA,OACA,CAAA4L,IAAA,MAAArN,UAAA,GACA2N,IAAA,IAAAvQ,EAAA,kBAAAqE,cAAA,GACA4L,IAAA,CAAA7Q,IAAA,iCAAAmR,IAAA,CAAAA,IAAA,CACA,GACArP,UAAA,CAAAkB,EAAA,wBACA,CAAAoO,WAAA,CAAAtP,UAAA,CAAAwN,cAAA,GACA+B,aAAA,EACAlM,oBAAA,EAAAd,OAAA,CAAAxC,mBAAA,CAAAC,UAAA,GAAAqD,oBAAA,CAAArD,UAAA,EACAmD,cAAA,CAAAZ,OAAA,CAAA7C,aAAA,CAAA4P,WAAA,CACA,EACAE,aAAA,CAAA1Q,EAAA,kBAAAwQ,WAAA,CAAArK,QAAA,EACA,IAAAwK,SAAA,CAAAtC,GAAA,mCAAA/O,KAAA,GACA,IAAAqR,SAAA,CAAAlR,MAAA,GACAkR,SAAA,CAAAtC,GAAA,6EACAA,GAAA,SAAA/O,KAAA,GAAAsR,MAAA,CAAAD,SAAA,GAEAA,SAAA,CAAAJ,IAAA,CAAAG,aAAA,EACA,KAAAhB,SAAA,CAAA5M,OAAA,UAAA2N,aAAA,CACA,GAAArO,EAAA,2BACA,CAAAoO,WAAA,CAAAtP,UAAA,CAAAwN,cAAA,GACArK,cAAA,CAAAZ,OAAA,CAAA7C,aAAA,CAAArC,MAAA,CAAAkL,MAAA,IAAA+G,WAAA,EACA1P,OAAA,EAAA0P,WAAA,CAAA1P,OACA,IACA,KAAA4O,SAAA,CAAA5M,OAAA,yBAAAuB,cAAA,CACA,GAAAjC,EAAA,yBACA,MAAAyO,SAAA,CAAApN,OAAA,CAAAxC,mBAAA,CAAAC,UAAA,EACA,KAAAwO,SAAA,CAAA5M,OAAA,qBAAA+N,SAAA,CACA,GAAA7R,KAAA,mBACA+P,cAAA,CAAA1O,QAAA,CAAAT,IAAA,kBAAAE,KAAA,EACA,EACA,EAIA8P,MAAA,UAAAA,OAAA,EACA,MAAAkB,kBAAA,CAAAzC,GAAA,CAAAG,YAAA,IACAH,GAAA,kBAAA0C,OAAA,CAAAD,kBAAA,EACA,KAAApB,SAAA,CAAAE,MAAA,CAAAkB,kBAAA,CACA,CACA,GAEA,OAAArC,MAEA,GAEA1Q,MCjLA,6PAAAgE,CAAA,CAAA4K,YAAA,CAAAC,mBAAA,CAAAnJ,OAAA,eAEA1B,CAAA,CAAAA,CAAA,EAAAxD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAqD,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACA4K,YAAA,CAAAA,YAAA,EAAApO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAiO,YAAA,YAAAA,YAAA,YAAAA,YAAA,CACAC,mBAAA,CAAAA,mBAAA,EAAArO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAkO,mBAAA,YAAAA,mBAAA,YAAAA,mBAAA,CAwBA,MAAAoE,OAAA,kBAMA,IAAAC,gBAAA,EACArS,IAAA,UAMAC,KAAA,OACA,CAAAoD,MAAA,MAAAiP,SAAA,GAEAC,UAAA,CAAApP,CAAA,WACAqP,eAAA,CAAAD,UAAA,CAAA/R,IAAA,cACAiS,uBAAA,CAAAA,CAAA3L,EAAA,CAAA4L,KAAA,CAAAC,SAAA,IACA,MAAAjE,QAAA,CAAAV,mBAAA,CAAAW,cAAA,CAAAgE,SAAA,EACA,GAAAjE,QAAA,CAAA7N,MAAA,EACA,MAAApB,SAAA,CAAAsO,YAAA,EACAjH,EAAA,CACA4L,KAAA,CACAhE,QAAA,CACAE,YAAA,IACAgE,eAAA,EACA,GACA/N,OAAA,CAAAgO,mBAAA,CAAApT,SAAA,CAAA4D,MAAA,EACAwB,OAAA,CAAAiO,uBAAA,CAAArT,SAAA,EACA,KAAAsT,aAAA,CAAAC,IAAA,CAAAvT,SAAA,CACA,CACA,EAOA,MANA,MAAAsT,aAAA,IACA1P,MAAA,CAAA4P,cAAA,CACAT,eAAA,CAAA9G,IAAA,EAAAwB,KAAA,CAAAgG,OAAA,GAAAT,uBAAA,IAAAL,OAAA,IAAAlF,KAAA,GAAAqF,UAAA,CAAApP,CAAA,CAAA+P,OAAA,IAEAT,uBAAA,CAAAL,OAAA,CAAAG,UAAA,CAAAC,eAAA,EAEA,IACA,EAKAW,cAAA,EACA,YAAAJ,aACA,EAKA7D,QAAA,EAGA,MAFA,MAAA6D,aAAA,CAAAlP,OAAA,CAAApE,SAAA,EAAAA,SAAA,CAAAyP,OAAA,IACA,KAAA6D,aAAA,IACA,IACA,CACA,EAEA,OAAAV,gBAEA,GAEAlT,MC3FA,uQAAAC,CAAA,CAAA+D,CAAA,CAAA4K,YAAA,CAAAC,mBAAA,CAAAnJ,OAAA,eAEAzF,CAAA,CAAAA,CAAA,EAAAO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAV,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACA+D,CAAA,CAAAA,CAAA,EAAAxD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAqD,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACA4K,YAAA,CAAAA,YAAA,EAAApO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAiO,YAAA,YAAAA,YAAA,YAAAA,YAAA,CACAC,mBAAA,CAAAA,mBAAA,EAAArO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAkO,mBAAA,YAAAA,mBAAA,YAAAA,mBAAA,CAwBA,MAAAoE,OAAA,kBAMA,IAAAgB,iBAAA,EACApT,IAAA,WAMAC,KAAA,OACA,CAAAoD,MAAA,MAAAiP,SAAA,GACAe,cAAA,MAAAlT,aAAA,GAAAG,aAAA,GAAAkB,YAAA,GAAAhB,IAAA,uBACA,IAAA8S,gBAAA,CAAAD,cAAA,CAAA7S,IAAA,yEACA6C,MAAA,CAAAkQ,oBAAA,GACAD,gBAAA,CAAAnQ,CAAA,CAAAmQ,gBAAA,CAAAE,GAAA,GAAAC,OAAA,KAEA,MAAAC,wBAAA,CAAAA,CAAA5M,EAAA,CAAA4L,KAAA,CAAAC,SAAA,IACA,MAAAjE,QAAA,CAAAV,mBAAA,CAAAW,cAAA,CAAAgE,SAAA,EACA,GAAAjE,QAAA,CAAA7N,MAAA,EACA,MAAApB,SAAA,CAAAsO,YAAA,EACAjH,EAAA,CACA4L,KAAA,CACAhE,QAAA,CACAE,YAAA,IACAgE,gBAAAe,iBAAA,EACA,IAAAC,GAAA,GAaA,MATA,CAAAvQ,MAAA,CAAAwQ,SAAA,GACAD,GAAA,CAAAD,iBAAA,CAAA9S,MAAA,GACAzB,CAAA,CAAAyE,OAAA,CAAA8P,iBAAA,EAAA3E,SAAA,CAAA8E,CAAA,IACA,MAAAzF,QAAA,CAAAW,SAAA,CAAAhL,UAAA,IACA,iBAAAqK,QAAA,CAAAvL,IAAA,0BAAAuL,QAAA,CAAAvL,IAAA,eACA8Q,GAAA,CAAAE,CAAA,CAEA,IAEAF,GACA,CACA,GACA/O,OAAA,CAAAgO,mBAAA,CAAApT,SAAA,CAAA4D,MAAA,EACAwB,OAAA,CAAAiO,uBAAA,CAAArT,SAAA,EACA,KAAAsT,aAAA,CAAAC,IAAA,CAAAvT,SAAA,CACA,CACA,EAOA,MANA,MAAAsT,aAAA,IACA1P,MAAA,CAAA4P,cAAA,CACAK,gBAAA,CAAA5H,IAAA,EAAAwB,KAAA,CAAAgG,OAAA,GAAAQ,wBAAA,IAAAtB,OAAA,IAAAlF,KAAA,GAAAmG,cAAA,CAAAlQ,CAAA,CAAA+P,OAAA,IAEAQ,wBAAA,CAAAtB,OAAA,CAAAiB,cAAA,CAAAC,gBAAA,EAEA,IACA,EAKAH,cAAA,EACA,YAAAJ,aACA,EAKA7D,QAAA,EAGA,MAFA,MAAA6D,aAAA,CAAAlP,OAAA,CAAApE,SAAA,EAAAA,SAAA,CAAAyP,OAAA,IACA,KAAA6D,aAAA,IACA,IACA,CACA,EAEA,OAAAK,iBAEA,GAEAjU,MC7GA,iQAAAgE,CAAA,CAAA4K,YAAA,CAAAC,mBAAA,CAAAnJ,OAAA,eAEA1B,CAAA,CAAAA,CAAA,EAAAxD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAqD,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACA4K,YAAA,CAAAA,YAAA,EAAApO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAiO,YAAA,YAAAA,YAAA,YAAAA,YAAA,CACAC,mBAAA,CAAAA,mBAAA,EAAArO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAkO,mBAAA,YAAAA,mBAAA,YAAAA,mBAAA,CAwBA,MAAAoE,OAAA,eAMA,IAAA2B,oBAAA,EACA/T,IAAA,eAMAC,KAAA,OACA,CAAAoD,MAAA,MAAAiP,SAAA,GACA0B,WAAA,MAAA7T,aAAA,GAAAG,aAAA,GAAAkB,YAAA,GAAAhB,IAAA,oBACA8S,gBAAA,CAAAU,WAAA,CAAAxT,IAAA,mBACAyT,2BAAA,CAAAA,CAAAnN,EAAA,CAAA4L,KAAA,CAAAC,SAAA,IACA,MAAAjE,QAAA,CAAAV,mBAAA,CAAAW,cAAA,CAAAgE,SAAA,EACA,GAAAjE,QAAA,CAAA7N,MAAA,EACA,MAAApB,SAAA,CAAAsO,YAAA,EACAjH,EAAA,CACA4L,KAAA,CACAhE,QAAA,CACAE,YAAA,GACA,GACA/J,OAAA,CAAAgO,mBAAA,CAAApT,SAAA,CAAA4D,MAAA,EACAwB,OAAA,CAAAiO,uBAAA,CAAArT,SAAA,EACA,KAAAsT,aAAA,CAAAC,IAAA,CAAAvT,SAAA,CACA,CACA,EAGA,MAFA,MAAAsT,aAAA,IACAO,gBAAA,CAAA5H,IAAA,EAAAwB,KAAA,CAAAgG,OAAA,GAAAe,2BAAA,IAAA7B,OAAA,IAAAlF,KAAA,GAAA8G,WAAA,CAAA7Q,CAAA,CAAA+P,OAAA,IACA,IACA,EAKAC,cAAA,EACA,YAAAJ,aACA,EAKA7D,QAAA,EAGA,MAFA,MAAA6D,aAAA,CAAAlP,OAAA,CAAApE,SAAA,EAAAA,SAAA,CAAAyP,OAAA,IACA,KAAA6D,aAAA,IACA,IACA,CACA,EAEA,OAAAgB,oBAEA,GAEA5U,MCrFA,gQAAAC,CAAA,CAAA2O,YAAA,CAAAC,mBAAA,CAAAnJ,OAAA,eAsCA,SAAAqP,UAAA7Q,MAAA,CAAA8Q,MAAA,CAAAC,UAAA,CAAArB,aAAA,CAAAsB,iBAAA,EACA,IAAAC,cAAA,MACA,CAAAC,cAAA,CAAAJ,MAAA,CAAA3T,IAAA,wBACAgU,aAAA,CAAAJ,UAAA,CAAA5T,IAAA,wEACAiU,cAAA,CAAAzG,mBAAA,CAAAW,cAAA,CAAA6F,aAAA,EAOAE,oBAAA,CAAA1F,SAAA,EACAA,SAAA,CAAAhL,UAAA,GAAAuN,MAAA,EACA,CACAkD,cAAA,CAAA5T,MAAA,GACAyT,cAAA,CAAAvG,YAAA,EACAjH,EAAA,mBACA4H,QAAA,CAAA+F,cAAA,CACA/B,KAAA,CAAA6B,cAAA,CACAI,IAAA,IACA/B,gBAAAe,iBAAA,EACA,IAAAC,GAAA,CAAAxU,CAAA,CAAA+K,SAAA,CAAAwJ,iBAAA,CAAA3E,SAAA,GACA,MAAA4F,OAAA,CAAAF,oBAAA,CAAA1F,SAAA,EACA,GAAA4F,OAAA,CAAAC,QAAA,4BAAAD,OAAA,CAAArS,EAAA,aACA,QAEA,GACA,UAAAqR,GAAA,CAAAA,GAAA,EACA,CACA,GAAApQ,EAAA,SAAAuL,MAAA,GACA2F,oBAAA,CAAA3F,MAAA,CAAAC,SAAA,EAAAyC,QAAA,4BACA,GAAAjO,EAAA,QAAAuL,MAAA,GACA2F,oBAAA,CAAA3F,MAAA,CAAAC,SAAA,EAAAwC,WAAA,4BACA,GACA3M,OAAA,CAAAgO,mBAAA,CAAAyB,cAAA,EACAQ,WAAA,CAAAzR,MAAA,CAAAyR,WAAA,CACAC,WAAA,CAAA1R,MAAA,CAAA0R,WACA,GACAlQ,OAAA,CAAAiO,uBAAA,CAAAwB,cAAA,EACAvB,aAAA,CAAAC,IAAA,CAAAsB,cAAA,EACAD,iBAAA,CAAArB,IAAA,CAAAsB,cAAA,EAEA,CA9EAlV,CAAA,CAAAA,CAAA,EAAAO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAV,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACA2O,YAAA,CAAAA,YAAA,EAAApO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAiO,YAAA,YAAAA,YAAA,YAAAA,YAAA,CACAC,mBAAA,CAAAA,mBAAA,EAAArO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAkO,mBAAA,YAAAA,mBAAA,YAAAA,mBAAA,CAwBA,MAAAgH,SAAA,EACAC,OAAA,gDACAC,YAAA,8EACA,EAuDA,IAAAC,mBAAA,EACAnV,IAAA,aAMAC,KAAA,OACA,CAAAoD,MAAA,MAAAiP,SAAA,GACA6B,MAAA,MAAAhU,aAAA,GAAAG,aAAA,GAAAyB,YAAA,GACAqS,UAAA,CAAAD,MAAA,CAAA3T,IAAA,mBACA4U,aAAA,CAAAhB,UAAA,CAAAS,QAAA,wBAGA,GAFA,KAAAR,iBAAA,IACA,KAAAtB,aAAA,IACAqB,UAAA,CAAAvT,MAAA,GAAAuT,UAAA,CAAAS,QAAA,aACA,GAAAO,aAAA,CACAlB,SAAA,CAAA7Q,MAAA,CAAA8Q,MAAA,CAAAC,UAAA,MAAArB,aAAA,MAAAsB,iBAAA,MACA,MACA,CAAAgB,iBAAA,CAAAjB,UAAA,CAAA5T,IAAA,2DACA8U,mBAAA,CAAAtH,mBAAA,CAAAW,cAAA,CAAA0G,iBAAA,EAEA,GADAA,iBAAA,CAAA5D,QAAA,8BACA6D,mBAAA,CAAAzU,MAAA,EACA,MAAA0U,oBAAA,CAAAxH,YAAA,EACAyH,SAAA,CAAAnS,MAAA,CAAAmS,SAAA,CACA1O,EAAA,yBACA8H,YAAA,IACAF,QAAA,CAAA4G,mBAAA,CACA5C,KAAA,CAAA2C,iBACA,GACAxQ,OAAA,CAAAgO,mBAAA,CAAA0C,oBAAA,EACAT,WAAA,CAAAzR,MAAA,CAAAoS,UAAA,EAAApS,MAAA,CAAAyR,WAAA,CACAC,WAAA,CAAA1R,MAAA,CAAAqS,UAAA,EAAArS,MAAA,CAAA0R,WACA,GACA,KAAAhC,aAAA,CAAAC,IAAA,CAAAuC,oBAAA,EACA,KAAAlB,iBAAA,CAAArB,IAAA,CAAAuC,oBAAA,CACA,IAIA,CAAAI,kBAAA,IAHAC,gBAAA,CACAtB,cAAA,CAIAuB,aAAA,MACA,CAAAC,QAAA,CAAA1B,UAAA,CAAA5T,IAAA,CAAAwU,SAAA,CAAAC,OAAA,EACAc,gBAAA,CAAA/H,mBAAA,CAAAW,cAAA,CAAAmH,QAAA,EACAC,gBAAA,CAAAlV,MAAA,GACA+U,gBAAA,CAAA7H,YAAA,EACAyH,SAAA,CAAAnS,MAAA,CAAAmS,SAAA,CACA1O,EAAA,qBACA8H,YAAA,IACAF,QAAA,CAAAqH,gBAAA,CACArD,KAAA,CAAA0B,UAAA,CAAA5T,IAAA,0BACA,GACAqE,OAAA,CAAAgO,mBAAA,CAAA+C,gBAAA,EACAd,WAAA,CAAAzR,MAAA,CAAAoS,UAAA,EAAApS,MAAA,CAAAyR,WAAA,CACAC,WAAA,CAAA1R,MAAA,CAAAqS,UAAA,EAAArS,MAAA,CAAA0R,WACA,GACAlQ,OAAA,CAAAiO,uBAAA,CAAA8C,gBAAA,EACAvS,MAAA,CAAAmS,SAAA,EACAI,gBAAA,CAAApS,EAAA,SAAAuL,MAAA,GACA,GAAA1L,MAAA,CAAAmS,SAAA,OACA,CAAAnH,QAAA,CAAAU,MAAA,CAAAC,SAAA,CAAAhL,UAAA,GACA4F,MAAA,CAAAyE,QAAA,CAAAvL,IAAA,SACAuL,QAAA,CAAAY,KAAA,GACA4G,aAAA,GAAAjM,MAAA,GACA+L,kBAAA,KAEAE,aAAA,CAAAjM,MACA,CACA,GAEAvG,MAAA,CAAA2S,cAAA,EACAJ,gBAAA,CAAApS,EAAA,CAAAH,MAAA,CAAA2S,cAAA,CAAA3E,IAAA,GACAxM,OAAA,CAAAoR,qBAAA,CAAA5E,IAAA,GAAAiD,cAAA,EACAlV,CAAA,CAAAqF,KAAA,MACAkR,kBAAA,CACArB,cAAA,CAAA5T,KAAA,GAEA4T,cAAA,CAAApT,KAAA,EAEA,EAEA,GAEAmC,MAAA,CAAA6S,cAAA,EACAN,gBAAA,CAAApS,EAAA,CAAAH,MAAA,CAAA6S,cAAA,CAAA7E,IAAA,GACAxM,OAAA,CAAAoR,qBAAA,CAAA5E,IAAA,GAAAiD,cAAA,EACAlV,CAAA,CAAAqF,KAAA,MACA6P,cAAA,CAAA6B,IAAA,EACA,EAEA,GAEA,KAAApD,aAAA,CAAAC,IAAA,CAAA4C,gBAAA,EACA,KAAAvB,iBAAA,CAAArB,IAAA,CAAA4C,gBAAA,QAEA,CAAArB,cAAA,CAAAJ,MAAA,CAAA3T,IAAA,wBACA4V,MAAA,CAAAhC,UAAA,CAAA5T,IAAA,CAAAwU,SAAA,CAAAE,YAAA,EACAmB,cAAA,CAAArI,mBAAA,CAAAW,cAAA,CAAAyH,MAAA,EACAA,MAAA,CAAA1V,KAAA,GAAA+Q,QAAA,iCACA2E,MAAA,CAAAD,IAAA,GAAA1E,QAAA,mCACA4E,cAAA,CAAAxV,MAAA,GAEAyT,cAAA,CAAAvG,YAAA,EACAjH,EAAA,mBACA4H,QAAA,CAAA2H,cAAA,CACA3D,KAAA,CAAA6B,cAAA,CACA3B,gBAAAe,iBAAA,EACA,IAAAC,GAAA,GASA,OARAvQ,MAAA,CAAA4P,cAAA,cAAA4C,aAAA,IACAjC,GAAA,CAAAxU,CAAA,CAAA+K,SAAA,CAAAwJ,iBAAA,CAAA3E,SAAA,GACA,MAAA4F,OAAA,CAAA5F,SAAA,CAAAhL,UAAA,GAAAuN,MAAA,wBACA,GAAAqD,OAAA,CAAAC,QAAA,YAAAD,OAAA,CAAArS,EAAA,aACA,QAEA,IAEAqR,GACA,CACA,GAAApQ,EAAA,SAAAuL,MAAA,GACA4G,kBAAA,IACA5G,MAAA,CAAAC,SAAA,CAAAhL,UAAA,GAAAuN,MAAA,GAAAE,QAAA,4BACA,GAAAjO,EAAA,QAAAuL,MAAA,GACAA,MAAA,CAAAC,SAAA,CAAAhL,UAAA,GAAAuN,MAAA,GAAAC,WAAA,4BACA,GACA3M,OAAA,CAAAgO,mBAAA,CAAAyB,cAAA,EACAQ,WAAA,CAAAzR,MAAA,CAAA2S,cAAA,EAAA3S,MAAA,CAAAyR,WAAA,CACAC,WAAA,CAAA1R,MAAA,CAAA6S,cAAA,EAAA7S,MAAA,CAAA0R,WACA,GACAlQ,OAAA,CAAAiO,uBAAA,CAAAwB,cAAA,EACAjR,MAAA,CAAAmS,SAAA,EACAlB,cAAA,CAAA9Q,EAAA,8BACAoS,gBAAA,EACAA,gBAAA,CAAA1U,KAAA,EAEA,GAEAmC,MAAA,CAAAoS,UAAA,EAAApS,MAAA,CAAAqS,UAAA,EACApB,cAAA,CAAA9Q,EAAA,CAAAH,MAAA,CAAAoS,UAAA,UAAApE,IAAA,EACAxM,OAAA,CAAAoR,qBAAA,CAAA5E,IAAA,GAAAuE,gBAAA,EACAA,gBAAA,CAAA1U,KAAA,GAAAoV,IAAA,EAEA,GACAhC,cAAA,CAAA9Q,EAAA,CAAAH,MAAA,CAAAqS,UAAA,UAAArE,IAAA,EACAxM,OAAA,CAAAoR,qBAAA,CAAA5E,IAAA,GAAAuE,gBAAA,EACAA,gBAAA,CAAA1U,KAAA,GAAAqV,QAAA,EAEA,IAEA,KAAAxD,aAAA,CAAAC,IAAA,CAAAsB,cAAA,EAEA,KAAAD,iBAAA,CAAArB,IAAA,CAAAsB,cAAA,EAEA,CAEA,WACA,EAKAnB,cAAA,EACA,YAAAJ,aACA,EAKA7D,QAAA,EAIA,MAHA,MAAAmF,iBAAA,CAAAxQ,OAAA,CAAApE,SAAA,EAAAA,SAAA,CAAAyP,OAAA,IACA,KAAAmF,iBAAA,IACA,KAAAtB,aAAA,IACA,IACA,CACA,EAEA,OAAAoC,mBAEA,GAEAhW,MCzQA,2PAAAgE,CAAA,CAAA4K,YAAA,CAAAC,mBAAA,CAAAnJ,OAAA,eAEA1B,CAAA,CAAAA,CAAA,EAAAxD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAqD,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACA4K,YAAA,CAAAA,YAAA,EAAApO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAiO,YAAA,YAAAA,YAAA,YAAAA,YAAA,CACAC,mBAAA,CAAAA,mBAAA,EAAArO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAkO,mBAAA,YAAAA,mBAAA,YAAAA,mBAAA,CAwBA,MAAAoE,OAAA,wBAMA,IAAAoE,cAAA,EACAxW,IAAA,QAMAC,KAAA,EACA,MAAAoD,MAAA,MAAAiP,SAAA,GAaA,MAZA,MAAAS,aAAA,IACA,KAAA5S,aAAA,GAAAG,aAAA,GAAAkB,YAAA,GAAAhB,IAAA,qBAAAiR,QAAA,8BAAA/F,IAAA,EAAAoI,CAAA,CAAA2C,EAAA,SACA,CAAApI,QAAA,CAAAlL,CAAA,CAAAsT,EAAA,EACAhX,SAAA,CAAAsO,YAAA,EACAjH,EAAA,IAAAsL,OAAA,SAAAW,aAAA,CAAAlS,MAAA,GACA6N,QAAA,CAAAV,mBAAA,CAAAW,cAAA,CAAAN,QAAA,EACAqE,KAAA,CAAArE,QAAA,CACAO,YAAA,GACA,GACA/J,OAAA,CAAAgO,mBAAA,CAAApT,SAAA,CAAA4D,MAAA,EACA,KAAA0P,aAAA,CAAAC,IAAA,CAAAvT,SAAA,CACA,GACA,IACA,EAKA0T,cAAA,EACA,YAAAJ,aACA,EAKA7D,QAAA,EAGA,MAFA,MAAA6D,aAAA,CAAAlP,OAAA,CAAApE,SAAA,EAAAA,SAAA,CAAAyP,OAAA,IACA,KAAA6D,aAAA,IACA,IACA,CACA,EAEA,OAAAyD,cAEA,GAEArX,MC/EA,8PAAAgE,CAAA,CAAA4K,YAAA,CAAAC,mBAAA,CAAAnJ,OAAA,eAEA1B,CAAA,CAAAA,CAAA,EAAAxD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAqD,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACA4K,YAAA,CAAAA,YAAA,EAAApO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAiO,YAAA,YAAAA,YAAA,YAAAA,YAAA,CACAC,mBAAA,CAAAA,mBAAA,EAAArO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAkO,mBAAA,YAAAA,mBAAA,YAAAA,mBAAA,CAwBA,MAAAoE,OAAA,mCAMA,IAAAsE,iBAAA,EACA1W,IAAA,WAMAC,KAAA,EACA,MAAAoD,MAAA,MAAAiP,SAAA,GAaA,MAZA,MAAAS,aAAA,IACA,KAAA5S,aAAA,GAAAG,aAAA,GAAAkB,YAAA,GAAAhB,IAAA,qBAAAiR,QAAA,8BAAA/F,IAAA,EAAAoI,CAAA,CAAA2C,EAAA,SACA,CAAApI,QAAA,CAAAlL,CAAA,CAAAsT,EAAA,EACAhX,SAAA,CAAAsO,YAAA,EACAjH,EAAA,IAAAsL,OAAA,SAAAW,aAAA,CAAAlS,MAAA,GACA6N,QAAA,CAAAV,mBAAA,CAAAW,cAAA,CAAAN,QAAA,EACAqE,KAAA,CAAArE,QAAA,CACAO,YAAA,GACA,GACA/J,OAAA,CAAAgO,mBAAA,CAAApT,SAAA,CAAA4D,MAAA,EACA,KAAA0P,aAAA,CAAAC,IAAA,CAAAvT,SAAA,CACA,GACA,IACA,EAKA0T,cAAA,EACA,YAAAJ,aACA,EAKA7D,QAAA,EAGA,MAFA,MAAA6D,aAAA,CAAAlP,OAAA,CAAApE,SAAA,EAAAA,SAAA,CAAAyP,OAAA,IACA,KAAA6D,aAAA,IACA,IACA,CACA,EAEA,OAAA2D,iBAEA,GAEAvX,MC/EA,yQAAAgE,CAAA,CAAAwT,YAAA,CAAA5I,YAAA,CAAAC,mBAAA,CAAAnJ,OAAA,eAEA1B,CAAA,CAAAA,CAAA,EAAAxD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAqD,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACAwT,YAAA,CAAAA,YAAA,EAAAhX,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6W,YAAA,YAAAA,YAAA,YAAAA,YAAA,CACA5I,YAAA,CAAAA,YAAA,EAAApO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAiO,YAAA,YAAAA,YAAA,YAAAA,YAAA,CACAC,mBAAA,CAAAA,mBAAA,EAAArO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAkO,mBAAA,YAAAA,mBAAA,YAAAA,mBAAA,MAyBA,CAAA4I,sBAAA,CAAA7H,MAAA,QACA,CAAAV,QAAA,CAAAU,MAAA,CAAAC,SAAA,CAAAhL,UAAA,GACAvB,KAAA,CAAA4L,QAAA,CAAArN,IAAA,UACAhB,IAAA,CAAAqO,QAAA,CAAArN,IAAA,SACAhB,IAAA,EACAqO,QAAA,CAAArN,IAAA,sBAAAhB,IAAA,CAAAiB,OAAA,2BAAAwB,KAAA,GAEA,EAOAoU,yBAAA,CAAA9H,MAAA,GACA,MAAAV,QAAA,CAAAU,MAAA,CAAAC,SAAA,CAAAhL,UAAA,GACAqK,QAAA,CAAAyI,UAAA,sBACA,EAOAC,yBAAA,CAAAtX,SAAA,GACAA,SAAA,GACAA,SAAA,CAAA+D,EAAA,SAAAoT,sBAAA,EACAnX,SAAA,CAAA+D,EAAA,QAAAqT,yBAAA,EAEA,EAOA,IAAAG,cAAA,EACAhX,IAAA,QAMAC,KAAA,EACA,IAAAgX,KAAA,MACA,KAAAlE,aAAA,SACA,CAAA1P,MAAA,MAAAiP,SAAA,GACA4E,QAAA,MAAA/W,aAAA,GAAAG,aAAA,GAAAC,cAAA,GAOA4W,YAAA,SAAAA,CAAApI,MAAA,EACA,OAAAA,MAAA,EAAAA,MAAA,CAAAC,SAAA,CAAAhL,UAAA,GAAApD,OAAA,eACA,EAUAwW,YAAA,SAAAA,CAAAzE,SAAA,CAAAD,KAAA,KACA,CAAAiC,IAAA,MAAAnM,SAAA,CAAA3H,MAAA,WAAA2H,SAAA,MAAAA,SAAA,IACAoK,eAAA,GAAApK,SAAA,CAAA3H,MAAA,WAAA2H,SAAA,IAAAA,SAAA,MACA,MAAAkG,QAAA,CAAAV,mBAAA,CAAAW,cAAA,CAAAgE,SAAA,EACA,GAAAjE,QAAA,CAAA7N,MAAA,EACA,MAAApB,SAAA,CAAAsO,YAAA,EACAW,QAAA,CACAgE,KAAA,CACAiC,IAAA,CACA/B,eAAA,CACAhE,YAAA,GACA,GAEA,MADA,CAAAqI,KAAA,CAAAlE,aAAA,CAAAC,IAAA,CAAAvT,SAAA,EACAA,SACA,CACA,EAUA4X,kBAAA,SAAAA,CAAA1E,SAAA,CAAAD,KAAA,CAAAiC,IAAA,EACA,IAAA/B,eAAA,GAAApK,SAAA,CAAA3H,MAAA,WAAA2H,SAAA,IAAAA,SAAA,MACA,MAAA/I,SAAA,CAAA2X,YAAA,CAAAzE,SAAA,CAAAD,KAAA,CAAAiC,IAAA,CAAA/B,eAAA,EAQA,MAPA,CAAAnT,SAAA,GACAoF,OAAA,CAAAgO,mBAAA,CAAApT,SAAA,CAAA4D,MAAA,EACAwB,OAAA,CAAAiO,uBAAA,CAAArT,SAAA,EAGAA,SAAA,CAAA+D,EAAA,SAAAuL,MAAA,EAAA4H,YAAA,CAAAW,QAAA,CAAAH,YAAA,CAAApI,MAAA,EAAA0C,QAAA,6BAAAyF,QAAA,CAAAtW,OAAA,uBAAA4C,EAAA,QAAAuL,MAAA,EAAAoI,YAAA,CAAApI,MAAA,EAAAyC,WAAA,+BAEA/R,SACA,EAGA8X,gBAAA,CAAAL,QAAA,CAAA1W,IAAA,+CAEAoJ,MAAA,EAAAkK,CAAA,CAAA0D,IAAA,IAAArU,CAAA,CAAAqU,IAAA,EAAAC,OAAA,qBAAA5W,MAAA,EA4DA,MAzDA,CAAAqW,QAAA,CAAA1W,IAAA,8BAAAiR,QAAA,8BAGA8F,gBAAA,CAAA7L,IAAA,EAAAgM,OAAA,CAAAC,WAAA,SACA,CAAAC,YAAA,CAAAzU,CAAA,CAAAwU,WAAA,EAGAE,YAAA,CAAAD,YAAA,CAAApX,IAAA,sBACAsX,UAAA,CAAAD,YAAA,CAAA7W,IAAA,SACA,GAAA4W,YAAA,CAAA/C,QAAA,qBAEA+C,YAAA,CAAApX,IAAA,8BAAAkL,IAAA,EAAAqM,MAAA,CAAAC,GAAA,IACA,MAAAC,IAAA,CAAA9U,CAAA,CAAA6U,GAAA,EACAC,IAAA,CAAArX,OAAA,gBAAAC,MAAA,EACAuW,YAAA,CAAAa,IAAA,CAAAA,IAAA,CAEA,GAGAL,YAAA,CAAAM,GAAA,mBAGA,MAAAC,OAAA,CAAAP,YAAA,CAAArV,EAAA,WAAAqV,YAAA,CAAAA,YAAA,CAAApX,IAAA,WACA,GAAA6C,MAAA,CAAA4P,cAAA,GAAA5P,MAAA,CAAA+U,mBAAA,YAAAN,UAAA,EACAK,OAAA,CAAAzM,IAAA,EAAAoI,CAAA,CAAAuE,KAAA,IACA,MAAA5Y,SAAA,CAAA4X,kBAAA,CAAAlU,CAAA,CAAAkV,KAAA,EAAAT,YAAA,EACAb,yBAAA,CAAAtX,SAAA,CACA,OACA,CACA,MAAAA,SAAA,CAAA4X,kBAAA,CAAAc,OAAA,CAAAP,YAAA,SAEA,IAAArQ,QAAA,IAQA,MALA,CAAA4Q,OAAA,CAAAzM,IAAA,EAAAwB,KAAA,CAAAmL,KAAA,IACAA,KAAA,CAAAC,OAAA,GACA/Q,QAAA,CAAA2F,KAAA,CAEA,GACA3F,QACA,GACAwP,yBAAA,CAAAtX,SAAA,EAGAA,SAAA,EAAA4D,MAAA,CAAAkV,YAAA,EACA9Y,SAAA,CAAA+D,EAAA,SAAAuL,MAAA,GACA,MAAAV,QAAA,CAAAU,MAAA,CAAAC,SAAA,CAAAhL,UAAA,GACAqK,QAAA,CAAA9L,EAAA,cACA8L,QAAA,CAAAY,KAAA,EAEA,EAEA,CACA,KACA,CAAAmI,YAAA,CAAAQ,YAAA,CAAAA,YAAA,CAEA,GACA,IACA,EAKAzE,cAAA,EACA,YAAAJ,aACA,EAKA7D,QAAA,EAGA,MAFA,MAAA6D,aAAA,CAAAlP,OAAA,CAAApE,SAAA,EAAAA,SAAA,CAAAyP,OAAA,IACA,KAAA6D,aAAA,IACA,IACA,CACA,EAEA,OAAAiE,cAEA,GAEA7X,MC7NA,iQAAAgE,CAAA,CAAA4K,YAAA,CAAAC,mBAAA,CAAAnJ,OAAA,eAEA1B,CAAA,CAAAA,CAAA,EAAAxD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAqD,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACA4K,YAAA,CAAAA,YAAA,EAAApO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAiO,YAAA,YAAAA,YAAA,YAAAA,YAAA,CACAC,mBAAA,CAAAA,mBAAA,EAAArO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAkO,mBAAA,YAAAA,mBAAA,YAAAA,mBAAA,CAyBA,IAAAwK,oBAAA,EACAxY,IAAA,cAMAC,KAAA,OACA,CAAAoD,MAAA,MAAAiP,SAAA,GACA4E,QAAA,MAAA/W,aAAA,GAAAG,aAAA,GAAAC,cAAA,GACAgX,gBAAA,CAAAL,QAAA,CAAA1W,IAAA,+CAEAoJ,MAAA,EAAAkK,CAAA,CAAA0D,IAAA,IAAArU,CAAA,CAAAqU,IAAA,EAAAC,OAAA,qBAAA5W,MAAA,EACA4X,WAAA,CAAAlB,gBAAA,CAAA/W,IAAA,mBACA,CAAAkY,WAAA,MACAC,IAAA,IACA,MAAAC,kBAAA,CAAAA,CAAA,IACA,MAAAnZ,SAAA,CAAAsO,YAAA,EACAW,QAAA,CAAAiK,IAAA,CACA/J,YAAA,GACA,GACA/J,OAAA,CAAAgO,mBAAA,CAAApT,SAAA,CAAA4D,MAAA,EACA,KAAAwV,iBAAA,CAAA7F,IAAA,CAAAvT,SAAA,CACA,EA+BA,MA1BA,MAAAsT,aAAA,IACA,KAAA8F,iBAAA,IAGA3B,QAAA,CAAA1W,IAAA,8BAAAiR,QAAA,8BACAgH,WAAA,CAAA/M,IAAA,EAAAoI,CAAA,CAAA2C,EAAA,SACA,CAAAmB,YAAA,CAAAzU,CAAA,CAAAsT,EAAA,EACA7B,OAAA,CAAAgD,YAAA,CAAArG,MAAA,GACAuH,eAAA,CAAA/K,YAAA,EACAW,QAAA,CAAAV,mBAAA,CAAAW,cAAA,CAAAiJ,YAAA,EACAlF,KAAA,CAAAkF,YAAA,CACAhJ,YAAA,GACA,GACA/J,OAAA,CAAAiO,uBAAA,CAAAgG,eAAA,EACAJ,WAAA,GAAA9D,OAAA,CAAArS,EAAA,CAAAmW,WAAA,IACAE,kBAAA,GACAD,IAAA,KAEA,KAAA5F,aAAA,CAAAC,IAAA,CAAA8F,eAAA,EACAH,IAAA,CAAA3F,IAAA,CAAA8F,eAAA,EACAJ,WAAA,CAAA9D,OACA,GACA+D,IAAA,CAAA9X,MAAA,GACA+X,kBAAA,GACAD,IAAA,KAEA,IACA,EAKAxF,cAAA,EACA,YAAAJ,aACA,EAKA7D,QAAA,EAKA,MAJA,MAAA6D,aAAA,CAAAlP,OAAA,CAAApE,SAAA,EAAAA,SAAA,CAAAyP,OAAA,IACA,KAAA2J,iBAAA,CAAAhV,OAAA,CAAApE,SAAA,EAAAA,SAAA,CAAAyP,OAAA,IACA,KAAA2J,iBAAA,IACA,KAAA9F,aAAA,IACA,IACA,CACA,EAEA,OAAAyF,oBAEA,GAEArZ,MC7GA,sQAAAgE,CAAA,CAAA/B,EAAA,CAAA2M,YAAA,CAAAC,mBAAA,CAAAnJ,OAAA,eAEA1B,CAAA,CAAAA,CAAA,EAAAxD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAqD,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACA/B,EAAA,CAAAA,EAAA,EAAAzB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAsB,EAAA,YAAAA,EAAA,YAAAA,EAAA,CACA2M,YAAA,CAAAA,YAAA,EAAApO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAiO,YAAA,YAAAA,YAAA,YAAAA,YAAA,CACAC,mBAAA,CAAAA,mBAAA,EAAArO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAkO,mBAAA,YAAAA,mBAAA,YAAAA,mBAAA,CAwBA,MAAAoE,OAAA,qCAOA,IAAA2G,kBAAA,EACA/Y,IAAA,YAMAC,KAAA,OACA,CAAAoD,MAAA,MAAAiP,SAAA,GACA4E,QAAA,MAAA/W,aAAA,GAAAG,aAAA,GAAAC,cAAA,GACA,KAAAwS,aAAA,IAGA,MAAAiG,kBAAA,CAAA9F,OAAA,GACA,MAAA+F,iBAAA,CAAA/F,OAAA,CAAAgG,SAAA,CAQA,MAPA,CAAAhG,OAAA,CAAAgG,SAAA,UAAAA,UAAA,EACA,GAAAD,iBAAA,CAAAnZ,IAAA,QACA,MAAA0X,IAAA,MAAAxT,UAAA,GAAAwP,GAAA,IACA,OAAAgE,IAAA,CAAA2B,YAAA,CAAA3B,IAAA,CAAA4B,YACA,CACA,QACA,EACAlG,OACA,EAgBA,MAfA,CAAAgE,QAAA,CAAA1W,IAAA,wBAAAiR,QAAA,8BAAA/F,IAAA,EAAAoI,CAAA,CAAA2C,EAAA,SACA,CAAApI,QAAA,CAAAlL,CAAA,CAAAsT,EAAA,EACA/H,QAAA,CAAAV,mBAAA,CAAAW,cAAA,CAAAN,QAAA,EAAAjI,GAAA,CAAA4S,kBAAA,EAGA3K,QAAA,CAAArN,IAAA,cAAAI,EAAA,aACA,MAAA3B,SAAA,CAAAsO,YAAA,EACAjH,EAAA,IAAAsL,OAAA,IAAA0B,CAAA,GACApF,QAAA,CACAgE,KAAA,CAAArE,QAAA,CACAO,YAAA,GACA,GACA/J,OAAA,CAAAgO,mBAAA,CAAApT,SAAA,CAAA4D,MAAA,EACA,KAAA0P,aAAA,CAAAC,IAAA,CAAAvT,SAAA,CACA,GACA,IACA,EAKA0T,cAAA,EACA,YAAAJ,aACA,EAKA7D,QAAA,EAGA,MAFA,MAAA6D,aAAA,CAAAlP,OAAA,CAAApE,SAAA,EAAAA,SAAA,CAAAyP,OAAA,IACA,KAAA6D,aAAA,IACA,IACA,CACA,EAEA,OAAAgG,kBAEA,GAEA5Z,MCnGA,sPAAAgE,CAAA,CAAA4K,YAAA,CAAAC,mBAAA,CAAAnJ,OAAA,eAEA1B,CAAA,CAAAA,CAAA,EAAAxD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAqD,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACA4K,YAAA,CAAAA,YAAA,EAAApO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAiO,YAAA,YAAAA,YAAA,YAAAA,YAAA,CACAC,mBAAA,CAAAA,mBAAA,EAAArO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAkO,mBAAA,YAAAA,mBAAA,YAAAA,mBAAA,CAwBA,MAAAoE,OAAA,cAMA,IAAAiH,SAAA,EACArZ,IAAA,cAMAC,KAAA,OACA,CAAAoD,MAAA,MAAAiP,SAAA,GACAgH,aAAA,CAAAnW,CAAA,kBACAoW,MAAA,CAAAD,aAAA,CAAA9Y,IAAA,eACA,KAAAuS,aAAA,IACA,MAAAkB,2BAAA,CAAAA,CAAAnN,EAAA,CAAA4L,KAAA,CAAAC,SAAA,IACA,MAAAjE,QAAA,CAAAV,mBAAA,CAAAW,cAAA,CAAAgE,SAAA,EACA,GAAAjE,QAAA,CAAA7N,MAAA,EACA,MAAApB,SAAA,CAAAsO,YAAA,EACAjH,EAAA,CACA4L,KAAA,CACAhE,QAAA,CACAE,YAAA,GACA,GACA/J,OAAA,CAAAgO,mBAAA,CAAApT,SAAA,CAAA4D,MAAA,EACAwB,OAAA,CAAAiO,uBAAA,CAAArT,SAAA,EACA,KAAAsT,aAAA,CAAAC,IAAA,CAAAvT,SAAA,CACA,CACA,EAEA,MADA,CAAA8Z,MAAA,CAAA7N,IAAA,EAAAwB,KAAA,CAAAgG,OAAA,GAAAe,2BAAA,IAAA7B,OAAA,IAAAlF,KAAA,GAAAoM,aAAA,CAAAnW,CAAA,CAAA+P,OAAA,IACA,IACA,EAKAC,cAAA,EACA,YAAAJ,aACA,EAKA7D,QAAA,EAGA,MAFA,MAAA6D,aAAA,CAAAlP,OAAA,CAAApE,SAAA,EAAAA,SAAA,CAAAyP,OAAA,IACA,KAAA6D,aAAA,IACA,IACA,CACA,EAEA,OAAAsG,SAEA,GAEAla,MCrFA,mgCAAAgC,OAAA,CAAAkR,gBAAA,CAAAe,iBAAA,CAAAW,oBAAA,CAAAoB,mBAAA,CAAAqB,cAAA,CAAAE,iBAAA,CAAAM,cAAA,CAAAwB,oBAAA,CAAAO,kBAAA,CAAAM,SAAA,eAEAhH,gBAAA,CAAAA,gBAAA,EAAA1S,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAuS,gBAAA,YAAAA,gBAAA,YAAAA,gBAAA,CACAe,iBAAA,CAAAA,iBAAA,EAAAzT,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAsT,iBAAA,YAAAA,iBAAA,YAAAA,iBAAA,CACAW,oBAAA,CAAAA,oBAAA,EAAApU,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAiU,oBAAA,YAAAA,oBAAA,YAAAA,oBAAA,CACAoB,mBAAA,CAAAA,mBAAA,EAAAxV,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAqV,mBAAA,YAAAA,mBAAA,YAAAA,mBAAA,CACAqB,cAAA,CAAAA,cAAA,EAAA7W,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA0W,cAAA,YAAAA,cAAA,YAAAA,cAAA,CACAE,iBAAA,CAAAA,iBAAA,EAAA/W,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA4W,iBAAA,YAAAA,iBAAA,YAAAA,iBAAA,CACAM,cAAA,CAAAA,cAAA,EAAArX,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAkX,cAAA,YAAAA,cAAA,YAAAA,cAAA,CACAwB,oBAAA,CAAAA,oBAAA,EAAA7Y,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA0Y,oBAAA,YAAAA,oBAAA,YAAAA,oBAAA,CACAO,kBAAA,CAAAA,kBAAA,EAAApZ,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAiZ,kBAAA,YAAAA,kBAAA,YAAAA,kBAAA,CACAM,SAAA,CAAAA,SAAA,EAAA1Z,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAuZ,SAAA,YAAAA,SAAA,YAAAA,SAAA,CAIAlY,OAAA,CAAAqY,wBAAA,CAAAnH,gBAAA,CACAlR,OAAA,CAAAsY,yBAAA,CAAArG,iBAAA,CACAjS,OAAA,CAAAuY,4BAAA,CAAA3F,oBAAA,CACA5S,OAAA,CAAAwY,2BAAA,CAAAxE,mBAAA,CACAhU,OAAA,CAAAyY,sBAAA,CAAApD,cAAA,CACArV,OAAA,CAAA0Y,yBAAA,CAAAnD,iBAAA,CACAvV,OAAA,CAAA2Y,sBAAA,CAAA9C,cAAA,CACA7V,OAAA,CAAA4Y,4BAAA,CAAAvB,oBAAA,CACArX,OAAA,CAAA6Y,0BAAA,CAAAjB,kBAAA,CACA5X,OAAA,CAAA8Y,2BAAA,CAAAZ,SAAA,CAEA1Z,MAAA,CAAA6C,cAAA,CAAArB,OAAA,eAAAsB,KAAA,KAEA,GAEAtD,MC9BA,uMAAA+a,gBAAA,CAAAC,UAAA,eA8DA,SAAAC,gBAAApa,IAAA,CAAAsC,UAAA,CAAAe,MAAA,EACA,MAAAgX,QAAA,CAAAD,eAAA,CAAAE,WAAA,CAAAta,IAAA,EAKA,OAKAC,KAAA,EAEA,MADA,CAAAoa,QAAA,CAAApa,IAAA,CAAAH,IAAA,OACA,IACA,EAKAmQ,QAAA,EACA,OAAAjQ,IACA,EAKAsS,UAAA,EACA,OAAAjP,MACA,EAKAlD,cAAA,EACA,OAAAmC,UACA,EAKA6Q,cAAA,QACA,mBAAAkH,QAAA,CAAAlH,aAAA,CACAkH,QAAA,CAAAlH,aAAA,CAAArT,IAAA,OAEA,EACA,EAKAoP,QAAA,EAIA,MAHA,mBAAAmL,QAAA,CAAAnL,OAAA,EACAmL,QAAA,CAAAnL,OAAA,CAAApP,IAAA,OAEA,IACA,CACA,CACA,CAMA,MA3HA,CAAAoa,gBAAA,CAAAA,gBAAA,EAAAva,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAoa,gBAAA,YAAAA,gBAAA,YAAAA,gBAAA,CAwHAA,gBAAA,CAAAE,eAAA,EACAza,MAAA,CAAAgK,MAAA,CAAAwQ,UAAA,EAAAtW,OAAA,CAAAwW,QAAA,EAAAD,eAAA,CAAAG,gBAAA,CAAAF,QAAA,CAAAra,IAAA,CAAAqa,QAAA,GAEAD,eAEA,GAEAjb,MCjIA,kMAAAgC,OAAA,CAAAgC,CAAA,CAAA/D,CAAA,CAAAgb,eAAA,eAqCA,SAAAnE,sBAAAuE,IAAA,EACA,IAAAtH,OAAA,CAAAsH,IAAA,CACA,GAAAtH,OAAA,qBAAAA,OAAA,CAAAuH,SAAA,EACA,MACAzL,SACA,EAAAkE,OAAA,CAAAuH,SAAA,GACAvH,OAAA,CAAAlE,SACA,CACAkE,OAAA,qBAAAA,OAAA,CAAAlP,UAAA,GACAkP,OAAA,CAAAA,OAAA,CAAAlP,UAAA,IAEA,MAAAqK,QAAA,CAAAlL,CAAA,CAAA+P,OAAA,UACA7E,QAAA,CAAAwG,QAAA,CAAA6F,YAAA,KAAArM,QAAA,CAAAoJ,OAAA,KAAAiD,YAAA,IAAA7Z,MAAA,CAIA,CAQA,SAAAgS,oBAAApT,SAAA,CAAA4D,MAAA,EACA,OAAA5D,SAAA,CAAA+D,EAAA,CAAAH,MAAA,CAAAyR,WAAA,UAAA6F,mBAAAtJ,IAAA,EACA4E,qBAAA,CAAA5E,IAAA,GACA,KAAAiF,IAAA,EAEA,GAAA9S,EAAA,CAAAH,MAAA,CAAA0R,WAAA,UAAA6F,mBAAAvJ,IAAA,EACA4E,qBAAA,CAAA5E,IAAA,GACA,KAAAkF,QAAA,EAEA,EACA,CAOA,SAAAzD,wBAAArT,SAAA,EACA,OAAAA,SAAA,CAAA+D,EAAA,qBAAAqX,aAAA9L,MAAA,EACA,MAAA+L,IAAA,CAAA/L,MAAA,CAAAC,SAAA,CAAAhL,UAAA,GAIA8W,IAAA,CAAAvY,EAAA,cACAuY,IAAA,CAAApP,IAAA,YACA,KAAAuD,KAAA,EACA,GAEA6L,IAAA,CAAA7L,KAAA,GAAA8L,SAAA,EAEA,EACA,CAQA,SAAAC,cAAAC,cAAA,CAAA3Y,UAAA,EACA,OAAA2Y,cAAA,CAAAd,UAAA,CAAA/T,GAAA,CAAA8U,IAAA,EAAAd,eAAA,CAAAc,IAAA,CAAA5Y,UAAA,CAAA2Y,cAAA,CAAA5X,MAAA,EAAApD,IAAA,GACA,CAOA,SAAAkT,cAAAgH,UAAA,EACA,OAAA/a,CAAA,CAAA+b,OAAA,CAAAhB,UAAA,CAAA/T,GAAA,CAAAiU,QAAA,EAAAA,QAAA,CAAAlH,aAAA,IACA,CA7GAhQ,CAAA,CAAAA,CAAA,EAAAxD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAqD,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACA/D,CAAA,CAAAA,CAAA,EAAAO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAV,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACAgb,eAAA,CAAAA,eAAA,EAAAza,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAsa,eAAA,YAAAA,eAAA,YAAAA,eAAA,CAyBA,MAAAM,YAAA,qBAoFAvZ,OAAA,CAAA8U,qBAAA,CAAAA,qBAAA,CACA9U,OAAA,CAAAgS,aAAA,CAAAA,aAAA,CACAhS,OAAA,CAAA6Z,aAAA,CAAAA,aAAA,CACA7Z,OAAA,CAAA2R,uBAAA,CAAAA,uBAAA,CACA3R,OAAA,CAAA0R,mBAAA,CAAAA,mBAAA,CAEAlT,MAAA,CAAA6C,cAAA,CAAArB,OAAA,eAAAsB,KAAA,KAEA,GAEAtD,MC3HA,8GAuBA,IAAAic,WAAA,EACApb,IAAA,WAMAC,KAAA,EACA,IAAAoD,MAAA,GAAAmF,SAAA,CAAA3H,MAAA,EAAA2H,SAAA,aAAAA,SAAA,OACA,OACA2R,UAAA,mFACA9W,MAAA,CAAA1D,MAAA,CAAAkL,MAAA,EACAgJ,SAAA,IACA0E,YAAA,IACA/C,SAAA,IACA5G,YAAA,IACAqE,cAAA,IACAoI,YAAA,OACAC,YAAA,aACAxG,WAAA,cACAC,WAAA,WACAU,UAAA,SACAC,UAAA,QACAM,cAAA,QACAE,cAAA,KACA,EAAA7S,MAAA,CACA,CACA,CACA,EAEA,OAAA+X,WAEA,GAEAjc,MCzDA,6GAuBA,IAAAoc,UAAA,EACAvb,IAAA,UAMAC,KAAA,EACA,IAAAoD,MAAA,GAAAmF,SAAA,CAAA3H,MAAA,EAAA2H,SAAA,aAAAA,SAAA,OACA,OACA2R,UAAA,yFACA9W,MAAA,CAAA1D,MAAA,CAAAkL,MAAA,EACAgJ,SAAA,IACA0E,YAAA,IACA/C,SAAA,IACA5G,YAAA,IACAqE,cAAA,IACAoI,YAAA,OACAC,YAAA,aACAxG,WAAA,cACAC,WAAA,WACAU,UAAA,SACAC,UAAA,QACAM,cAAA,QACAE,cAAA,KACA,EAAA7S,MAAA,CACA,CACA,CACA,EAEA,OAAAkY,UAEA,GAEApc,MCzDA,6GAuBA,IAAAqc,UAAA,EACAxb,IAAA,UAMAC,KAAA,EACA,IAAAoD,MAAA,GAAAmF,SAAA,CAAA3H,MAAA,EAAA2H,SAAA,aAAAA,SAAA,OACA,OAEA2R,UAAA,gGACA9W,MAAA,CAAA1D,MAAA,CAAAkL,MAAA,EACAgJ,SAAA,IACA0E,YAAA,IACA/C,SAAA,IACA5G,YAAA,IACAqE,cAAA,IACAoI,YAAA,OACAC,YAAA,aACAxG,WAAA,cACAC,WAAA,WACAU,UAAA,IACAC,UAAA,IACAM,cAAA,IACAE,cAAA,GACA,EAAA7S,MAAA,CACA,CACA,CACA,EAEA,OAAAmY,UAEA,GAEArc,MC1DA,sVAAAgC,OAAA,CAAAia,WAAA,CAAAG,UAAA,CAAAC,UAAA,eAEAJ,WAAA,CAAAA,WAAA,EAAAzb,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAsb,WAAA,YAAAA,WAAA,YAAAA,WAAA,CACAG,UAAA,CAAAA,UAAA,EAAA5b,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAyb,UAAA,YAAAA,UAAA,YAAAA,UAAA,CACAC,UAAA,CAAAA,UAAA,EAAA7b,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA0b,UAAA,YAAAA,UAAA,YAAAA,UAAA,CAIAra,OAAA,CAAAsa,mBAAA,CAAAL,WAAA,CACAja,OAAA,CAAAua,kBAAA,CAAAH,UAAA,CACApa,OAAA,CAAAwa,kBAAA,CAAAH,UAAA,CAEA7b,MAAA,CAAA6C,cAAA,CAAArB,OAAA,eAAAsB,KAAA,KAEA,GAEAtD,MChBA,6LAAA+a,gBAAA,CAAA0B,KAAA,eAoCA,SAAAC,YAAAC,IAAA,EACA,IAAAzY,MAAA,GAAAmF,SAAA,CAAA3H,MAAA,WAAA2H,SAAA,IAAAA,SAAA,OACA,MAAAuT,QAAA,CAAAF,WAAA,CAAAvB,WAAA,CAAAwB,IAAA,EACA,OAAAC,QAAA,CAAA9b,IAAA,CAAAoD,MAAA,CACA,CAMA,MA5CA,CAAA6W,gBAAA,CAAAA,gBAAA,EAAAva,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAoa,gBAAA,YAAAA,gBAAA,YAAAA,gBAAA,CAyCAA,gBAAA,CAAA2B,WAAA,EACAlc,MAAA,CAAAgK,MAAA,CAAAiS,KAAA,EAAA/X,OAAA,CAAAiY,IAAA,EAAAD,WAAA,CAAAtB,gBAAA,CAAAuB,IAAA,CAAA9b,IAAA,CAAA8b,IAAA,GAEAD,WAEA,GAEA1c,MClDA,4RAAA4O,YAAA,CAAAlJ,OAAA,CAAAgX,WAAA,CAAAtM,QAAA,eAqCA,SAAAyM,qBAAA1Z,UAAA,KACA,CAAAe,MAAA,GAAAmF,SAAA,CAAA3H,MAAA,EAAA2H,SAAA,aAAAA,SAAA,OACA,CACAyT,oBACA,EAAA5Y,MAAA,CACA6Y,cAAA,MACA/B,UAAA,IAKA,OAKAla,KAAA,OACA,CAAAgb,cAAA,CAAAY,WAAA,CAAAI,oBAAA,CAAA5Y,MAAA,EACA8Y,gBAAA,CAAAlB,cAAA,CAAA5X,MAAA,CACA8W,UAAA,CAAAtV,OAAA,CAAAmW,aAAA,CAAAC,cAAA,CAAA3Y,UAAA,EACA,MAAA8Z,UAAA,CAAAvX,OAAA,CAAAsO,aAAA,CAAAgH,UAAA,EAwBA,MArBA,CAAAkC,QAAA,CAAAC,aAAA,EACAD,QAAA,CAAAC,aAAA,CAAAnY,IAAA,GAEA+X,cAAA,CAAAnO,YAAA,EACAjH,EAAA,eACA6N,IAAA,IACAjG,QAAA,CAAA0N,UAAA,CACAxN,YAAA,CAAAuN,gBAAA,CAAAvN,YACA,GACA/J,OAAA,CAAAgO,mBAAA,CAAAqJ,cAAA,EACApH,WAAA,CAAAqH,gBAAA,CAAAd,YAAA,CACAtG,WAAA,CAAAoH,gBAAA,CAAAb,YACA,GACA/L,QAAA,CAAAJ,MAAA,CAAAoN,OAAA,EAAA9L,GAAA,OAAA8L,OAAA,aAAAA,OAAA,YAAA/N,CAAA,UACA3J,OAAA,CAAAoR,qBAAA,CAAAzH,CAAA,CAAAC,MAAA,QAGA,CAAAyN,cAAA,CAAApN,SAAA,IACAoN,cAAA,CAAAhb,KAAA,GAEA,GACA,IACA,EAKAf,cAAA,EACA,OAAAmC,UACA,EAMAka,QAAAC,OAAA,EAEA,MADA,CAAAR,oBAAA,CAAAQ,OAAA,CACA,IACA,EAKAC,QAAA,EACA,OAAAT,oBACA,EAKAU,SAAA,EACA,cAAAT,cACA,EAKAhN,QAAA,EAQA,MAPA,CAAAK,QAAA,CAAAJ,MAAA,CAAAoN,OAAA,EACApC,UAAA,CAAAtW,OAAA,CAAAwW,QAAA,EAAAA,QAAA,CAAAnL,OAAA,IACAgN,cAAA,EACAA,cAAA,CAAAhN,OAAA,GAEAgN,cAAA,MACA/B,UAAA,IACA,IACA,CACA,CACA,CA9HApM,YAAA,CAAAA,YAAA,EAAApO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAiO,YAAA,YAAAA,YAAA,YAAAA,YAAA,CACA8N,WAAA,CAAAA,WAAA,EAAAlc,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA+b,WAAA,YAAAA,WAAA,YAAAA,WAAA,CACAtM,QAAA,CAAAA,QAAA,EAAA5P,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAyP,QAAA,YAAAA,QAAA,YAAAA,QAAA,CAwBA,MAAAgN,OAAA,kBAsGA,OAAAP,oBAEA,GCnIA7c,MAAA,2FACAA,MCFA,gRAAAC,CAAA,CAAAwd,mBAAA,CAAAvd,aAAA,CAAAwd,iBAAA,eAEAzd,CAAA,CAAAA,CAAA,EAAAO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAV,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACAwd,mBAAA,CAAAA,mBAAA,EAAAjd,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA8c,mBAAA,YAAAA,mBAAA,YAAAA,mBAAA,CACAvd,aAAA,CAAAA,aAAA,EAAAM,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAT,aAAA,YAAAA,aAAA,YAAAA,aAAA,CA0BA,MAAAyd,mBAAA,EACAb,oBAAA,UACA,EAKA,IAAApM,MAAA,CAAAxQ,aAAA,EACAW,IAAA,iBAIAC,KAAA,OACA,CAAAqC,UAAA,MAAAnC,aAAA,GACA4c,YAAA,CAAA3d,CAAA,CAAAmE,QAAA,MAAA+O,SAAA,GAAAwK,mBAAA,EACA/O,YAAA,CAAA6O,mBAAA,CAAAta,UAAA,CAAAya,YAAA,EAKAza,UAAA,CAAAlC,KAAA,mBAGA2N,YAAA,CAAA4O,QAAA,IACA5O,YAAA,CAAAmB,OAAA,GAEAnB,YAAA,CAAA9N,IAAA,EACA,GAAAuD,EAAA,mBACAuK,YAAA,CAAAmB,OAAA,EACA,GAKA1L,EAAA,qBAAAwZ,IAAA,GACAjP,YAAA,CAAAyO,OAAA,CAAAQ,IAAA,EACAD,YAAA,CAAAd,oBAAA,CAAAe,IACA,EACA,CACA,GAEA,OAAAnN,MAEA,GAEA1Q,MC3EA,iKAAAsQ,GAAA,CAAArO,EAAA,CAAA/B,aAAA,CAAAsD,UAAA,CAAAC,QAAA,eAmBA,SAAAqa,UAAAna,IAAA,CAAAC,OAAA,CAAAC,QAAA,EACA,IAAAC,IAAA,CAAAC,QAAA,CAAAJ,IAAA,CAAAC,OAAA,EACA,OAAAC,QAAA,KAAAC,IAAA,CAAAE,CAAA,CAAAF,IAAA,CACA,CAmBA,SAAAia,SAAAjb,IAAA,EACA,IAAAkb,KAAA,CAAA/b,EAAA,WAQA,MAPA,CAAAa,IAAA,CAAAC,OAAA,CACAib,KAAA,CAAA/b,EAAA,YACAa,IAAA,CAAAE,QAAA,CACAgb,KAAA,CAAA/b,EAAA,aACAa,IAAA,CAAAG,MAAA,GACA+a,KAAA,CAAA/b,EAAA,YAEA+b,KACA,CAjDA1N,GAAA,CAAAA,GAAA,EAAA9P,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA2P,GAAA,YAAAA,GAAA,YAAAA,GAAA,CACArO,EAAA,CAAAA,EAAA,EAAAzB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAsB,EAAA,YAAAA,EAAA,YAAAA,EAAA,CACA/B,aAAA,CAAAA,aAAA,EAAAM,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAT,aAAA,YAAAA,aAAA,YAAAA,aAAA,CACAsD,UAAA,CAAAA,UAAA,EAAAhD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6C,UAAA,YAAAA,UAAA,YAAAA,UAAA,CACAC,QAAA,CAAAA,QAAA,EAAAjD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA8C,QAAA,YAAAA,QAAA,YAAAA,QAAA,CAEAA,QAAA,CAAA8B,aAAA,GACA9B,QAAA,CAAAD,UAAA,EACAC,QAAA,CAAA8B,aAAA,QAEA,CAAAxB,QAAA,CAAAP,UAAA,CAAAgC,QAAA,UAAAhC,UAAA,CAAAiC,MAAA,CAAAC,OAAA,CAAAC,QAAA,CAAAhC,IAAA,EAKA,MAJA,MAAAkC,YAAA,gBACAH,OAAA,MAAAI,KAAA,CAAAJ,OAAA,CAAAlC,UAAA,CAAAkC,OAAA,EAGA,0GACA,GAkCAuY,MAAA,CAAA/d,aAAA,EACAW,IAAA,gBACAC,KAAA,OACA,CAAAqC,UAAA,MAAAnC,aAAA,GACAkd,WAAA,CAAApb,IAAA,GACA,KAAAqb,MAAA,CAAA3L,IAAA,IAAA1P,IAAA,CAAAmN,KAAA,IAAAmO,IAAA,EACA,EACAC,WAAA,CAAAvb,IAAA,GACA,KAAAwb,MAAA,CAAA9L,IAAA,IAAAuL,QAAA,CAAAjb,IAAA,KAAAsb,IAAA,EACA,EACAjb,UAAA,CAAAlC,KAAA,mBACA,MAAA6B,IAAA,CAAAK,UAAA,CAAAwN,cAAA,GACAuN,WAAA,CAAApb,IAAA,EACAub,WAAA,CAAAvb,IAAA,CACA,GAAAuB,EAAA,sBACA,IAAAvB,IAAA,CAAAK,UAAA,CAAAwN,cAAA,GACA7N,IAAA,CAAAtC,MAAA,CAAAkL,MAAA,IAAA5I,IAAA,EACAC,OAAA,EAAAD,IAAA,CAAAC,OACA,GACAsb,WAAA,CAAAvb,IAAA,CACA,EACA,EACA+O,OAAA,EACA,MAAA0M,UAAA,MAAApd,aAAA,GAAAqd,OAAA,iBACA,KAAAtP,QAAA,CAAAoB,GAAA,CAAAwN,SAAA,IACAS,UAAA,CAAA1L,MAAA,MAAA3D,QAAA,EACA,KAAAiP,MAAA,CAAAI,UAAA,CAAAld,IAAA,yCACA,KAAAid,MAAA,CAAAC,UAAA,CAAAld,IAAA,wCACA,CACA,GAEA,OAAA4c,MAEA,GAEAje,MCvFA,yMAAAgE,CAAA,CAAA/D,CAAA,CAAAC,aAAA,CAAAue,WAAA,CAAAC,aAAA,CAAAC,gBAAA,CAAAC,cAAA,CAAApO,eAAA,eAEAxM,CAAA,CAAAA,CAAA,EAAAxD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAqD,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACA/D,CAAA,CAAAA,CAAA,EAAAO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAV,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACAC,aAAA,CAAAA,aAAA,EAAAM,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAT,aAAA,YAAAA,aAAA,YAAAA,aAAA,CACAue,WAAA,CAAAA,WAAA,EAAAje,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA8d,WAAA,YAAAA,WAAA,YAAAA,WAAA,CACAC,aAAA,CAAAA,aAAA,EAAAle,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA+d,aAAA,YAAAA,aAAA,YAAAA,aAAA,CACAC,gBAAA,CAAAA,gBAAA,EAAAne,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAge,gBAAA,YAAAA,gBAAA,YAAAA,gBAAA,CACAC,cAAA,CAAAA,cAAA,EAAApe,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAie,cAAA,YAAAA,cAAA,YAAAA,cAAA,CACApO,eAAA,CAAAA,eAAA,EAAAhQ,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6P,eAAA,YAAAA,eAAA,YAAAA,eAAA,IAwBA,CAAAqO,UAAA,UAMAC,YAAA,qBAMAC,cAAA,EACAC,KAAA,EACAjd,KAAA,KACA,EACAkd,OAAA,EACAld,KAAA,KACA,CACA,EAKAmd,MAAA,CAAAhf,aAAA,EACAW,IAAA,UAIAC,IAAA,UAAAA,KAAA,EAiBA,SAAAqe,YAAAD,MAAA,EAEAA,MAAA,CAAAna,OAAA,gBAAAqa,IAAA,EACA,CAMA,SAAAC,YAAAH,MAAA,EACAA,MAAA,CAAAE,IAAA,EACA,CAOA,SAAAE,UAAAC,MAAA,CAAAnP,QAAA,EACA,IAAAoP,MAAA,CAAAC,MAAA,CAAA/d,MAAA,EAAA+d,MAAA,CAAAA,MAAA,CAAA/d,MAAA,IACA8d,MAAA,GACAA,MAAA,CAAApP,QAAA,CAAAA,QAAA,CACAmP,MAAA,CACAJ,WAAA,CAAAK,MAAA,CAAAN,MAAA,EAEAG,WAAA,CAAAG,MAAA,CAAAN,MAAA,EAGA,CAYA,SAAAQ,UAAAC,SAAA,CAAAC,KAAA,CAAAV,MAAA,CAAAW,OAAA,CAAAN,MAAA,CAAAO,MAAA,CAAAlc,OAAA,EAKA,SAAAmc,SAAA1Q,CAAA,CAAA2Q,MAAA,EACA/f,CAAA,CAAAwM,UAAA,CAAA8S,MAAA,GACAA,MAAA,CAAAC,MAAA,CAAApP,QAAA,EAAA4P,MAAA,CAEA,CACA,SAAAC,SAAA5Q,CAAA,CAAA2Q,MAAA,EACA/f,CAAA,CAAAwM,UAAA,CAAAqT,MAAA,GACAA,MAAA,CAAAN,MAAA,CAAApP,QAAA,EAAA4P,MAAA,CAEA,CAbA,IAAAR,MAAA,EACAvT,OAAA,CAAA0T,SAAA,CACAT,MAAA,CAAAA,MAAA,CAAAW,OAAA,CAAAE,QAAA,CAAAE,QAAA,CAAArc,OAAA,CACA,EAcAgb,cAAA,CAAAsB,OAAA,GACAC,cAAA,CAAAC,MAAA,GACAR,KAAA,CAAA/L,IAAA,CAAA2L,MAAA,EACAC,MAAA,CAAA5L,IAAA,CAAA2L,MAAA,EACAA,MAAA,CAAAN,MAAA,CAAAnd,KAAA,CAAA6B,OAAA,CAAA7B,KAAA,EACAyd,MAAA,CAAAN,MAAA,CAAA7a,EAAA,2BACAgc,YAAA,CAAAT,KAAA,CAAAJ,MAAA,CAAAN,MAAA,EACAmB,YAAA,CAAAZ,MAAA,CAAAD,MAAA,CAAAN,MAAA,EAIAO,MAAA,CAAA/d,MAAA,GACAkd,cAAA,CAAAwB,MAAA,GACAD,cAAA,CAAAD,OAAA,GAEA,EACA,CAOA,SAAAG,aAAAT,KAAA,CAAAV,MAAA,EACAA,MAAA,EACAjf,CAAA,CAAA+P,MAAA,CAAA4P,KAAA,UAAAJ,MAAA,EACA,GAAAA,MAAA,EAAAN,MAAA,GAAAM,MAAA,CAAAN,MAAA,CACA,QAEA,EAEA,CAQA,SAAAoB,aAAAX,SAAA,CAAAJ,MAAA,CAAAK,KAAA,EACAA,KAAA,CACA3f,CAAA,CAAAyE,OAAA,CAAAkb,KAAA,UAAAJ,MAAA,EACAA,MAAA,SAAAG,SAAA,EAAAA,SAAA,GAAAH,MAAA,CAAAvT,OAAA,IACAsT,MAAA,CACAJ,WAAA,CAAAK,MAAA,CAAAN,MAAA,EAEAG,WAAA,CAAAG,MAAA,CAAAN,MAAA,EAGA,IAEAoB,YAAA,CAAAX,SAAA,CAAAJ,MAAA,CAAAgB,MAAA,EACAD,YAAA,CAAAX,SAAA,CAAAJ,MAAA,CAAAiB,QAAA,EAEA,IAhIA,CAAArd,UAAA,MAAAnC,aAAA,GACAyf,WAAA,CAAAtd,UAAA,CAAAsL,UAAA,GACAmP,YAAA,CAAApd,MAAA,CAAAkL,MAAA,IAAAqT,cAAA,MAAA5L,SAAA,IACAtC,eAAA,EAAA4P,WAAA,CAAAvQ,SAAA,MAAAgP,MAAA,KACAqB,MAAA,IACAC,QAAA,IACAf,MAAA,IACAU,cAAA,CAAAxB,gBAAA,CAAA3a,CAAA,UACA0c,SAAA,IACAjP,OAAA,GACA,GAyHA0O,cAAA,CAAAD,OAAA,GAAAS,GAAA,kBAGAF,WAAA,CAAArP,cAAA,EACAnR,CAAA,CAAAyE,OAAA,CAAAmM,eAAA,UAAA+P,OAAA,CAAAC,GAAA,EACAV,cAAA,CAAA7O,GAAA,CAAAd,eAAA,CAAAe,YAAA,CAAAqP,OAAA,uBAAAvR,CAAA,CAAAe,QAAA,EAEAjN,UAAA,CAAA4B,OAAA,CAAA+Z,YAAA,CAAA+B,GAAA,CAAAzQ,QAAA,CACA,EACA,GAIAjN,UAAA,CAAA2d,MAAA,oBAAAzR,CAAA,CAAA0R,GAAA,CAAAxB,MAAA,CAAA3b,OAAA,EACA8b,SAAA,CAAArQ,CAAA,CAAAsQ,SAAA,CAAAY,MAAA,CAAA9B,WAAA,CAAAsC,GAAA,CAAAxB,MAAA,CAAAA,MAAA,CAAAtf,CAAA,CAAA6F,KAAA,IAAA8X,YAAA,CAAAoB,KAAA,CAAApb,OAAA,EACA,GAAAkd,MAAA,sBAAAzR,CAAA,CAAA0R,GAAA,CAAAxB,MAAA,CAAAO,MAAA,CAAAlc,OAAA,EACA8b,SAAA,CAAArQ,CAAA,CAAAsQ,SAAA,CAAAa,QAAA,CAAA9B,aAAA,CAAAqC,GAAA,CAAAxB,MAAA,CAAAO,MAAA,CAAA7f,CAAA,CAAA6F,KAAA,IAAA8X,YAAA,CAAAqB,OAAA,CAAArb,OAAA,EACA,GAAAkd,MAAA,0BAAAzR,CAAA,CAAAkQ,MAAA,EACAe,YAAA,CAAAjR,CAAA,CAAAsQ,SAAA,CAAAJ,MAAA,CACA,GAAAlb,EAAA,IAAAya,YAAA,kBAAA1O,QAAA,EACAkP,SAAA,IAAAlP,QAAA,CACA,GAAA/L,EAAA,IAAAya,YAAA,kBAAA1O,QAAA,EACAkP,SAAA,IAAAlP,QAAA,CACA,GAAA/L,EAAA,sBACAic,YAAA,OACAH,cAAA,CAAAa,KAAA,GACAb,cAAA,KACA,EACA,CACA,GAEA,OAAAjB,MAEA,GAEAlf,MCrOA,sGAAAC,CAAA,CAAAC,aAAA,eAEAD,CAAA,CAAAA,CAAA,EAAAO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAV,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACAC,aAAA,CAAAA,aAAA,EAAAM,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAT,aAAA,YAAAA,aAAA,YAAAA,aAAA,CAwBA,IAAA+gB,YAAA,CAAA/gB,aAAA,EACAW,IAAA,gBAIAC,IAAA,UAAAA,KAAA,EAEA,EAIAogB,OAAA,UAAAA,QAAA,EACA,IAAA/d,UAAA,MAAAnC,aAAA,GAIAmC,UAAA,CAAA2d,MAAA,kBAAAK,MAAA9R,CAAA,CAAA1L,IAAA,EACA,MAAAyd,YAAA,CAAAnhB,CAAA,CAAAohB,QAAA,CAAA1d,IAAA,QACA,CAAAyd,YAAA,EAAAzd,IAAA,CAAA2d,eAAA,QAGAF,YAAA,EAAAzd,IAAA,CAAAkc,OAAA,CACA,IAAA0B,OAAA,UAAAC,OAAA,EACA,IAAAvV,OAAA,CAAA9I,UAAA,CAAAoL,cAAA,GAIAtC,OAAA,EAAAA,OAAA,CAAAvD,cAAA,EACAvF,UAAA,CAAAse,WAAA,CAAAxV,OAAA,CAAAvD,cAAA,EAGAvF,UAAA,CAAA4B,OAAA,0BAAAA,OAAA,eAAApB,IAAA,CAAAkc,OAAA,YACA1c,UAAA,CAAA4B,OAAA,yBACAyc,OAAA,EACA,EACA,SAEA,EACA,CACA,GAEA,OAAAP,YAEA,GAEAjhB,MCxEA,qHAAAgE,CAAA,CAAA0d,KAAA,CAAAxhB,aAAA,eAEA8D,CAAA,CAAAA,CAAA,EAAAxD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAqD,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACA9D,aAAA,CAAAA,aAAA,EAAAM,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAT,aAAA,YAAAA,aAAA,YAAAA,aAAA,CAyBA,IAAAyhB,gBAAA,CAAAzhB,aAAA,EACAW,IAAA,oBAIAC,IAAA,UAAAA,KAAA,EACA,IAAAC,IAAA,MACA,KAAAmO,QAAA,CAAAlL,CAAA,MAAA4d,UAAA,GAAAC,GAAA,EACA,KAAA3S,QAAA,CAEA7K,EAAA,2BACAL,CAAA,OAAA8d,KAAA,WACA,GAAAzd,EAAA,8BACAtD,IAAA,CAAAmO,QAAA,MACAnO,IAAA,CAAAgE,OAAA,UAAAhE,IAAA,CACA,EACA,EAIA8Q,MAAA,UAAAA,OAAA,KACA,CAAA1O,UAAA,MAAAnC,aAAA,GACA+gB,UAAA,CAAA5e,UAAA,CAAA4e,UAAA,CACAC,gBAAA,MAAAJ,UAAA,GAAArD,UAAA,CACAyD,gBAAA,GACAA,gBAAA,CAAAhe,CAAA,mBAAA+d,UAAA,CAAAE,KAAA,CAAA7f,SAAA,GAEA4f,gBAAA,CAAAnP,MAAA,MAAA3D,QAAA,EACA,KAAAA,QAAA,CAAA4S,KAAA,EACAI,WAAA,IACAC,GAAA,IACA,EACA,EAIApS,OAAA,UAAAA,QAAA,EACA,KAAAb,QAAA,OAAAA,QAAA,CAAAxN,MAAA,EACA,KAAAwN,QAAA,CAAA4S,KAAA,SAEA,CACA,GAEA,OAAAH,gBAEA,GAEA3hB,MC3EA,4FAAAC,CAAA,CAAAkO,SAAA,eAEAlO,CAAA,CAAAA,CAAA,EAAAO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAV,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACAkO,SAAA,CAAAA,SAAA,EAAA3N,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAwN,SAAA,YAAAA,SAAA,YAAAA,SAAA,CAuBA,IAAAiU,gBAAA,EAcAC,gBAAA,UAAAA,iBAAAC,WAAA,CAAAC,OAAA,CAAAC,SAAA,CAAArY,KAAA,CAAA/B,QAAA,KACA,CAAAV,OAAA,CACA+a,YAAA,CACAC,OAAA,CACA5f,IAAA,CACA,GAAA7C,CAAA,CAAAiN,aAAA,CAAAoV,WAAA,GAAAriB,CAAA,CAAAiN,aAAA,CAAAqV,OAAA,IAAAtiB,CAAA,CAAA0iB,OAAA,CAAAL,WAAA,CAAAra,SAAA,IAAAhI,CAAA,CAAA0iB,OAAA,CAAAL,WAAA,CAAA5Z,cAAA,EAKA,MAJA,CAAAhB,OAAA,CAAAyG,SAAA,CAAA5F,UAAA,CAAAga,OAAA,CAAAD,WAAA,CAAAra,SAAA,EACAwa,YAAA,CAAAtU,SAAA,CAAAlE,eAAA,CAAAsY,OAAA,CAAAD,WAAA,CAAAra,SAAA,EACAya,OAAA,CAAAD,YAAA,EAAAA,YAAA,CAAA1b,KAAA,CACAjE,IAAA,CAAAqL,SAAA,CAAA1F,OAAA,CAAA8Z,OAAA,CAAAD,WAAA,CAAA5Z,cAAA,EACA,YAAAyB,KAAA,eAAAA,KAAA,WAAAqY,SAAA,EAAA1f,IAAA,CAAAmL,iBAAA,KAAAyU,OAAA,eAAAF,SAAA,MAAA1f,IAAA,CAAAmL,iBAAA,WAAAuU,SAAA,IAAApa,QAAA,GAAAA,QAAA,CAAAV,OAAA,CAAAU,QAAA,EAAAA,QAAA,EAAAV,OAAA,CAAAU,QAAA,CAAAsa,OAAA,EAEA,UAAAvV,SAAA,qCACA,EAeAyV,iBAAA,UAAAA,kBAAAN,WAAA,CAAAC,OAAA,CAAAC,SAAA,CAAArY,KAAA,CAAA/B,QAAA,KACA,CAAAya,QAAA,CACAC,aAAA,CACAJ,OAAA,CACA5f,IAAA,CACA4E,OAAA,CACA+a,YAAA,CACA,GAAAxiB,CAAA,CAAAiN,aAAA,CAAAoV,WAAA,GAAAriB,CAAA,CAAAiN,aAAA,CAAAqV,OAAA,IAAAtiB,CAAA,CAAA0iB,OAAA,CAAAL,WAAA,CAAApW,UAAA,IAAAjM,CAAA,CAAA0iB,OAAA,CAAAL,WAAA,CAAAra,SAAA,IAAAhI,CAAA,CAAA0iB,OAAA,CAAAL,WAAA,CAAA5Z,cAAA,EASA,MARA,CAAAma,QAAA,CAAA1U,SAAA,CAAA9F,OAAA,CAAAka,OAAA,CAAAD,WAAA,CAAApW,UAAA,EACA4W,aAAA,CAAA3U,SAAA,CAAAnE,YAAA,CAAAuY,OAAA,CAAAD,WAAA,CAAApW,UAAA,EACAwW,OAAA,CAAAI,aAAA,EAAAA,aAAA,CAAA/b,KAAA,CACAjE,IAAA,CAAAqL,SAAA,CAAA1F,OAAA,CAAA8Z,OAAA,CAAAD,WAAA,CAAA5Z,cAAA,EACA,YAAAyB,KAAA,GACAzC,OAAA,CAAAyG,SAAA,CAAA5F,UAAA,CAAAga,OAAA,CAAAD,WAAA,CAAAra,SAAA,EACAwa,YAAA,CAAAtU,SAAA,CAAAlE,eAAA,CAAAsY,OAAA,CAAAD,WAAA,CAAAra,SAAA,GAEA,aAAAkC,KAAA,WAAAqY,SAAA,WAAArY,KAAA,EAAArH,IAAA,CAAAkL,cAAA,KAAA0U,OAAA,WAAAF,SAAA,cAAArY,KAAA,EAAAzC,OAAA,CAAAU,QAAA,CAAAqa,YAAA,CAAA1b,KAAA,EAAA2b,OAAA,eAAAF,SAAA,WAAArY,KAAA,MAAArH,IAAA,CAAAkL,cAAA,eAAAwU,SAAA,cAAArY,KAAA,EAAAzC,OAAA,CAAAU,QAAA,GAAAya,QAAA,CAAAza,QAAA,WAAAoa,SAAA,IAAApa,QAAA,GAAAA,QAAA,CAAAya,QAAA,CAAAza,QAAA,EAAAA,QAAA,EAAAya,QAAA,CAAAza,QAAA,CAAAsa,OAAA,EAEA,UAAAvV,SAAA,qCACA,EAOA4V,MAAA,UAAAA,OAAAR,OAAA,CAAA7Z,cAAA,EACA,YAAAsa,QAAA,CAAAT,OAAA,CAAA7Z,cAAA,QACA,EAOAua,OAAA,UAAAA,QAAAV,OAAA,CAAA7Z,cAAA,EACA,YAAAwa,SAAA,CAAAX,OAAA,CAAA7Z,cAAA,QACA,EAQAsa,QAAA,UAAAA,SAAAT,OAAA,CAAA7Z,cAAA,CAAAyB,KAAA,KACA,CAAArH,IAAA,CACAiH,KAAA,CACA,IAAA9J,CAAA,CAAAiN,aAAA,CAAAqV,OAAA,EACA,UAAApV,SAAA,qBAEA,GAAAlN,CAAA,CAAA0iB,OAAA,CAAAja,cAAA,EACA,UAAAyE,SAAA,4BAKA,GAHAhD,KAAA,CAAAA,KAAA,SACArH,IAAA,CAAAqL,SAAA,CAAA1F,OAAA,CAAA8Z,OAAA,CAAA7Z,cAAA,EACAqB,KAAA,CAAAoE,SAAA,CAAAjE,aAAA,CAAAqY,OAAA,CAAAzf,IAAA,CAAAsF,QAAA,CAAA+B,KAAA,EACAJ,KAAA,EAAA9J,CAAA,CAAAkjB,QAAA,CAAApZ,KAAA,CAAAhD,KAAA,GACA,YAAAoD,KAAA,CACA,OAAArH,IAAA,CAAAsF,QAAA,KAAA2B,KAAA,CAAAhD,KAAA,CAEA,eAAAoD,KAAA,wBAAAA,KAAA,kBAAAA,KAAA,CACA,OAAArH,IAAA,CAAAmL,iBAAA,KAAAlE,KAAA,CAAAhD,KAAA,CAEA,YAAAoD,KAAA,eAAAA,KAAA,CACA,OAAArH,IAAA,CAAAkL,cAAA,KAAAjE,KAAA,CAAAhD,KAEA,CACA,QACA,EAQAmc,SAAA,UAAAA,UAAAX,OAAA,CAAA7Z,cAAA,CAAAyB,KAAA,EACA,IAAArH,IAAA,CACA,IAAA7C,CAAA,CAAAiN,aAAA,CAAAqV,OAAA,EACA,UAAApV,SAAA,qBAEA,GAAAlN,CAAA,CAAA0iB,OAAA,CAAAja,cAAA,EACA,UAAAyE,SAAA,4BACA,MACA,CAAAhD,KAAA,CAAAA,KAAA,SACArH,IAAA,CAAAqL,SAAA,CAAA1F,OAAA,CAAA8Z,OAAA,CAAA7Z,cAAA,EACA,SAAAyB,KAAA,CACA,IAAArH,IAAA,CAAAsF,QAAA,CAEA,YAAA+B,KAAA,wBAAAA,KAAA,kBAAAA,KAAA,CACA,IAAArH,IAAA,CAAAmL,iBAAA,EAEA,SAAA9D,KAAA,eAAAA,KAAA,GACA,IAAArH,IAAA,CAAAkL,cAGA,EASAoV,eAAA,UAAAA,gBAAAb,OAAA,CAAAc,YAAA,CAAAb,SAAA,CAAAc,IAAA,KACA,CAAAC,MAAA,CAAApV,SAAA,CAAA9B,iBAAA,CAAAkW,OAAA,CAAAc,YAAA,EACAjM,QAAA,MACAoM,QAAA,IAEAC,SAAA,CAAAxjB,CAAA,CAAAoL,MAAA,CAAAkX,OAAA,EAAAA,OAAA,CAAApb,KAAA,UAAAF,GAAA,CAAA0B,IAAA,EACA,IAAA+a,GAAA,CAAA/a,IAAA,CAAAC,UAAA,CAUA,MATA,CAAAwO,QAAA,GACAnQ,GAAA,CAAAmQ,QAAA,EAAAD,IAAA,CAAAuM,GAAA,EAEAzc,GAAA,CAAAyc,GAAA,GACA9a,UAAA,CAAA8a,GAAA,CACAtM,QAAA,CAAAA,QAAA,CACAD,IAAA,KACA,EACAC,QAAA,CAAAsM,GAAA,CACAzc,GACA,MAbA0c,UAAA,CA+BA,MAjBA,CAAAL,IAAA,CAAArjB,CAAA,CAAAqM,QAAA,CAAAgX,IAAA,EAAAM,QAAA,CAAAN,IAAA,OAIAK,UAAA,CAHAnB,SAAA,WAAAA,SAAA,CAGA,CAAAA,SAAA,EAFA,oBAIAviB,CAAA,CAAAyE,OAAA,CAAAif,UAAA,UAAAE,cAAAC,IAAA,EACA,IAAAnc,EAAA,CAAA4b,MAAA,CACAtjB,CAAA,CAAA8jB,KAAA,CAAAT,IAAA,UAAAU,YAAA,QACA,CAAArc,EAAA,CAAA8b,SAAA,CAAA9b,EAAA,GAAA8b,SAAA,CAAA9b,EAAA,EAAAmc,IAAA,IACAnc,EAAA,MACA,CAAA6b,QAAA,CAAA3P,IAAA,CAAA1F,SAAA,CAAA1F,OAAA,CAAA8Z,OAAA,CAAA5a,EAAA,EAIA,EACA,GACA6b,QACA,EAOAS,WAAA,UAAAA,YAAA1B,OAAA,CAAAc,YAAA,EACA,IAAAG,QAAA,CAAApB,gBAAA,CAAAgB,eAAA,CAAAb,OAAA,CAAAc,YAAA,iBACA,CAAAG,QAAA,CAAA9hB,MAAA,CACA8hB,QAAA,IAEA,IACA,EAOAU,eAAA,UAAAA,gBAAA3B,OAAA,CAAAc,YAAA,EACA,IAAAG,QAAA,CAAApB,gBAAA,CAAAgB,eAAA,CAAAb,OAAA,CAAAc,YAAA,qBACA,CAAAG,QAAA,CAAA9hB,MAAA,CACA8hB,QAAA,IAEA,IACA,EAOAW,kBAAA,UAAAA,mBAAAC,MAAA,CAAApS,MAAA,EAEA,MADA,CAAAA,MAAA,CAAAA,MAAA,KACA,YAAAoS,MAAA,WAAAA,MAAA,WAAAA,MAAA,WAAApS,MAAA,CAAAwQ,SAAA,WAAAxQ,MAAA,CAAA7H,KACA,EAOAka,sBAAA,UAAAA,uBAAAD,MAAA,CAAApS,MAAA,EAEA,MADA,CAAAA,MAAA,CAAAA,MAAA,KACA,SAAAoS,MAAA,eAAApS,MAAA,CAAAwQ,SAAA,WAAAxQ,MAAA,CAAA7H,KACA,EAOAma,eAAA,UAAAA,gBAAAF,MAAA,CAAApS,MAAA,EAEA,MADA,CAAAA,MAAA,CAAAA,MAAA,KACA,SAAAoS,MAAA,WAAApS,MAAA,CAAAwQ,SAAA,WAAAxQ,MAAA,CAAA7H,KACA,CACA,EAEA,OAAAiY,gBAEA,GAEApiB,MCjRA,0MAAAsQ,GAAA,CAAArO,EAAA,CAAAyf,KAAA,CAAAxhB,aAAA,CAAAsD,UAAA,CAAAC,QAAA,CAAA2e,gBAAA,eA2FA,SAAAmC,UAAA5gB,IAAA,CAAAC,OAAA,CAAAC,QAAA,EACA,IAAAC,IAAA,CAAAC,QAAA,CAAAJ,IAAA,CAAAC,OAAA,EACA,OAAAC,QAAA,KAAAC,IAAA,CAAAE,CAAA,CAAAF,IAAA,CACA,CA5FAwM,GAAA,CAAAA,GAAA,EAAA9P,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA2P,GAAA,YAAAA,GAAA,YAAAA,GAAA,CACArO,EAAA,CAAAA,EAAA,EAAAzB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAsB,EAAA,YAAAA,EAAA,YAAAA,EAAA,CACA/B,aAAA,CAAAA,aAAA,EAAAM,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAT,aAAA,YAAAA,aAAA,YAAAA,aAAA,CACAsD,UAAA,CAAAA,UAAA,EAAAhD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6C,UAAA,YAAAA,UAAA,YAAAA,UAAA,CACAC,QAAA,CAAAA,QAAA,EAAAjD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA8C,QAAA,YAAAA,QAAA,YAAAA,QAAA,CACA2e,gBAAA,CAAAA,gBAAA,EAAA5hB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAyhB,gBAAA,YAAAA,gBAAA,YAAAA,gBAAA,CAEA3e,QAAA,CAAA8B,aAAA,GACA9B,QAAA,CAAAD,UAAA,EACAC,QAAA,CAAA8B,aAAA,QAEA,CAAAxB,QAAA,CAAAP,UAAA,CAAAgC,QAAA,UAAAhC,UAAA,CAAAiC,MAAA,CAAAC,OAAA,CAAAC,QAAA,CAAAhC,IAAA,EAKA,SAAAiC,SAAAH,MAAA,CAAA9B,IAAA,EAEA,IAAAoC,MAAA,IAAAI,MAAA,CAAAC,MAAA,CAKA,MAJA,CAAAL,MAAA,OACAK,MAAA,CAAAV,OAAA,CAAA8e,SAAA,EAAAre,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAA+e,SAAA,CAAAre,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACAJ,MACA,CAEA,SAAA0e,SAAAhf,MAAA,CAAA9B,IAAA,EAEA,IAAAoC,MAAA,IAAAI,MAAA,CAMA,MALA,CAAAJ,MAAA,oBACAE,gBAAA,EAAAE,MAAA,OAAAxC,IAAA,OAAAA,IAAA,CAAAA,IAAA,CAAAA,IAAA,CAAAkd,GAAA,qBAAA1a,MAAA,CAAAA,MAAA,CAAAue,KAAA,CAAAjf,MAAA,EAAAU,MAAA,GACA,MACAF,gBAAA,qBAAAR,MAAA,CAAAA,MAAA,CAAAif,KAAA,CAAAjf,MAAA,EAAAA,MAAA,EACA,WACAM,MACA,CAEA,SAAA4e,SAAAlf,MAAA,CAAA9B,IAAA,EAEA,IAAAoC,MAAA,IAAAI,MAAA,CAAAC,MAAA,CAQA,MAPA,CAAAL,MAAA,8BACAK,MAAA,CAAAV,OAAA,CAAAkf,IAAA,EAAAze,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAmf,IAAA,CAAAze,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACAA,MAAA,CAAAT,OAAA,CAAAa,MAAA,CAAA5F,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAA+M,IAAA,EAAAnM,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA2F,IAAA,CAAAC,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,GAAAie,QAAA,CAAAlhB,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,eACAA,MACA,CACA,SAAA8e,SAAApf,MAAA,CAAA9B,IAAA,EAGA,iBACA,CAEA,SAAAmhB,SAAArf,MAAA,CAAA9B,IAAA,EAEA,IAAAoC,MAAA,IAAAI,MAAA,CAAAC,MAAA,CAMA,MALA,CAAAL,MAAA,2BACAK,MAAA,CAAAV,OAAA,CAAA8M,IAAA,EAAArM,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAA+M,IAAA,CAAArM,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,UACAJ,MACA,CApDA,KAAAF,YAAA,gBACAH,OAAA,MAAAI,KAAA,CAAAJ,OAAA,CAAAlC,UAAA,CAAAkC,OAAA,EAAA/B,IAAA,CAAAA,IAAA,KACA,IAAAoC,MAAA,IAAAG,YAAA,YAAAD,gBAAA,MAAAA,gBAAA,CAAAlF,IAAA,MAAAoF,MAAA,CAAAC,MAAA,CAyEA,MArBA,CAAAL,MAAA,8BACAK,MAAA,CAAAV,OAAA,CAAAqf,OAAA,EAAA5e,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAsf,OAAA,CAAA5e,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,wCACAA,MAAA,CAAAT,OAAA,OAAA/E,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAA+e,SAAA,EAAAne,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA2F,IAAA,CAAAC,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,GAAAhB,QAAA,CAAAjC,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,sBACAK,MAAA,CAAAV,OAAA,CAAAsf,KAAA,EAAA7e,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAuf,KAAA,CAAA7e,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,gCACAA,MAAA,CAAAT,OAAA,CAAA6G,IAAA,CAAA5L,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAAwf,IAAA,EAAA5e,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA2F,IAAA,CAAAC,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,GAAA6d,QAAA,CAAA9gB,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,wGACAI,MAAA,CAAAT,OAAA,OAAA/E,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAAmf,IAAA,EAAAve,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA2F,IAAA,CAAAC,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,GAAA+d,QAAA,CAAAhhB,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,eACAI,MAAA,CAAAT,OAAA,OAAA/E,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAA+M,IAAA,EAAAnM,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA2F,IAAA,CAAAC,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,GAAAke,QAAA,CAAAnhB,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,wBACAA,MACA,GA6BAmf,UAAA,EACA/N,IAAA,EACA4N,OAAA,gBACAC,KAAA,CAAA/iB,EAAA,mCACA2iB,IAAA,WACApS,IAAA,CAAAvQ,EAAA,MACA,EACAkjB,GAAA,EACAJ,OAAA,YACAC,KAAA,CAAA/iB,EAAA,yCACA2iB,IAAA,gBACApS,IAAA,CAAAvQ,EAAA,iBACA,CACA,EAKAmjB,iBAAA,CAAAllB,aAAA,EACAW,IAAA,qBAIAC,IAAA,UAAAA,KAAA,KACA,CAAAC,IAAA,MACAoC,UAAA,MAAAnC,aAAA,GAMAqkB,cAAA,UAAAC,cAAA,OACA,CAAAhD,WAAA,CAAAnf,UAAA,CAAAoL,cAAA,GACAgU,OAAA,CAAApf,UAAA,CAAAmL,UAAA,GACAiX,QAAA,CAAAnD,gBAAA,CAAAW,MAAA,CAAAR,OAAA,CAAAD,WAAA,CAAA5Z,cAAA,eACA8c,IAAA,CAAAlV,GAAA,CAAAiU,SAAA,CAAAW,UAAA,CAAAK,QAAA,IAcA,MAbA,CAAAC,IAAA,CAAAlT,QAAA,yBAGAkT,IAAA,CAAAnhB,EAAA,kBAAAgL,CAAA,EACAA,CAAA,CAAAoW,cAAA,GACA1kB,IAAA,CAAAmf,OAAA,GACA,aAAA5P,GAAA,OAAA3M,IAAA,aACA5C,IAAA,CAAAgE,OAAA,QAEAygB,IAAA,CAAAxV,MAAA,GACAjP,IAAA,CAAAmO,QAAA,CAAAc,MAAA,GACAjP,IAAA,CAAAgE,OAAA,UAAAhE,IAAA,CACA,GACAykB,IACA,EACA,KAAAE,OAAA,CAAAL,cAAA,GACA,KAAAnW,QAAA,CAAAoB,GAAA,MAAAsR,UAAA,GAAAC,GAAA,CACA,EAIAhQ,MAAA,UAAAA,OAAA,KACA,CAAA8T,oBAAA,MAAAxkB,aAAA,GAAAqB,iBAAA,GACAW,UAAA,MAAAnC,aAAA,GACA+gB,UAAA,CAAA5e,UAAA,CAAA4e,UAAA,CACA6D,gBAAA,MAAAhE,UAAA,GAAArD,UAAA,CACA,CAAAqH,gBAAA,EAAA7D,UAAA,CAAAE,KAAA,CAAA7f,SAAA,GACAwjB,gBAAA,CAAAtV,GAAA,iBAAAyR,UAAA,CAAAE,KAAA,CAAA7f,SAAA,GAEAwjB,gBAAA,CAAA/S,MAAA,MAAA3D,QAAA,EAGAoB,GAAA,yBAAAqV,oBAAA,EAAAjkB,MAAA,EACAikB,oBAAA,CAAA9S,MAAA,MAAA6S,OAAA,CAEA,EAIAtF,MAAA,UAAAA,OAAA,EACA,KAAAsF,OAAA,CAAAG,UAAA,aAAAxT,WAAA,YACA,EACA6N,OAAA,UAAAA,QAAA,EACA,KAAAwF,OAAA,CAAAI,IAAA,gBAAAxT,QAAA,YACA,EAIAvC,OAAA,UAAAA,QAAA,EACA,KAAA2V,OAAA,CAAA5V,KAAA,EACA,CACA,GAEA,OAAAsV,iBAEA,GAEAplB,MCpNA,gHAAAiC,EAAA,CAAA/B,aAAA,CAAA6lB,UAAA,eAEA9jB,EAAA,CAAAA,EAAA,EAAAzB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAsB,EAAA,YAAAA,EAAA,YAAAA,EAAA,CACA/B,aAAA,CAAAA,aAAA,EAAAM,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAT,aAAA,YAAAA,aAAA,YAAAA,aAAA,CACA6lB,UAAA,CAAAA,UAAA,EAAAvlB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAolB,UAAA,YAAAA,UAAA,YAAAA,UAAA,CAuBA,IAAAC,QAAA,CAAA9lB,aAAA,EACAW,IAAA,YAIAC,IAAA,UAAAA,KAAA,KACA,CAAAC,IAAA,MAIAoC,UAAA,MAAAnC,aAAA,GAKAilB,YAAA,UAAAA,aAAA,EACAC,eAAA,EACAA,eAAA,CAAAC,KAAA,EAEA,EAVAD,eAAA,CAWA,KAAAE,QAAA,eAGAjjB,UAAA,CAAAkB,EAAA,kBAAAgiB,GAAA,KACA,CAAAxG,OAAA,CAAAwG,GAAA,CACAxI,IAAA,SACA9c,IAAA,CAAAgd,QAAA,cACA,iBAAAsI,GAAA,GACAxG,OAAA,CAAAwG,GAAA,CAAAxG,OAAA,CACAhC,IAAA,CAAAwI,GAAA,CAAAxI,IAAA,EAEAgC,OAAA,GAGAA,OAAA,CADA,cADAhC,IAAA,CAEA5b,EAAA,wCAEA,iBAJA4b,IAAA,CAKA5b,EAAA,oBAGAA,EAAA,wBAGAikB,eAAA,CAAAH,UAAA,GAAAO,KAAA,CAAAzG,OAAA,EAEA,GAAAxb,EAAA,mBAAAwb,OAAA,EACA9e,IAAA,CAAAgd,QAAA,cACAmI,eAAA,CAAAH,UAAA,GAAAQ,MAAA,CAAA1G,OAAA,EAEA,GAAAxb,EAAA,oBAAAwb,OAAA,EACA9e,IAAA,CAAAgd,QAAA,cACAmI,eAAA,CAAAH,UAAA,GAAAS,OAAA,CAAA3G,OAAA,EAEA,GAAAxb,EAAA,iBAAAwb,OAAA,EACA9e,IAAA,CAAAgd,QAAA,cACAmI,eAAA,CAAAH,UAAA,GAAAU,IAAA,CAAA5G,OAAA,EAEA,GAAAxb,EAAA,gCAAA4hB,YAAA,EAAA5hB,EAAA,oCACA4hB,YAAA,GACAllB,IAAA,CAAAqlB,QAAA,cACA,GAAA/hB,EAAA,mCACAtD,IAAA,CAAAqlB,QAAA,cACA,EACA,CACA,GAEA,OAAAJ,QAEA,GAEAhmB,MCjGA,gIAAAgE,CAAA,CAAA0iB,UAAA,CAAAxmB,aAAA,eAEA8D,CAAA,CAAAA,CAAA,EAAAxD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAqD,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACA0iB,UAAA,CAAAA,UAAA,EAAAlmB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA+lB,UAAA,YAAAA,UAAA,YAAAA,UAAA,CACAxmB,aAAA,CAAAA,aAAA,EAAAM,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAT,aAAA,YAAAA,aAAA,YAAAA,aAAA,CAwBA,IAAAymB,aAAA,CAAAzmB,aAAA,EACAW,IAAA,iBAIAC,IAAA,UAAAA,KAAA,EAUA,SAAA8lB,gBAAA,OACA,CAAAC,cAAA,CAAAC,YAAA,CAAAzlB,IAAA,8BACA0lB,aAAA,CAAAC,mBAAA,GAAAC,qBAAA,GAAAC,uBAAA,GAAAC,mBAAA,CAAAC,cAAA,CACAP,cAAA,CAAAta,IAAA,iBACA,CAAA8a,KAAA,CAAArjB,CAAA,OACAsjB,YAAA,CAAAZ,UAAA,CAAAa,SAAA,CAAAF,KAAA,CAAAxlB,IAAA,6BACA2lB,cAAA,CAAAC,UAAA,CAAAJ,KAAA,CAAAxlB,IAAA,gCACA6lB,eAAA,CAAAL,KAAA,CAAAjV,MAAA,GAAA3Q,OAAA,8BACA4lB,KAAA,CAAA3lB,MAAA,EAAA4lB,YAAA,GACAD,KAAA,CAAA1jB,IAAA,kBACA0jB,KAAA,CAAAM,GAAA,EACAC,YAAA,SACA,GACA,EAAAF,eAAA,CAAAhmB,MAAA,CACA2lB,KAAA,CAAAM,GAAA,iBAAAD,eAAA,CAAAG,MAAA,QAAAL,cAAA,OAEAH,KAAA,CAAAM,GAAA,iBAAAZ,aAAA,MAAAS,cAAA,OAGA,EACA,CAGA,SAAAR,oBAAA,EACA,IAAAc,mBAAA,CAAA9jB,CAAA,gCAGA,CAAA8jB,mBAAA,CAAApmB,MAAA,CACAomB,mBAAA,CAAAzT,GAAA,IAAA0T,qBAAA,GAAAF,MAAA,CAGA7jB,CAAA,CAAAgkB,MAAA,EAAAH,MAAA,EACA,CAGA,SAAAZ,sBAAA,EACA,IAAAgB,SAAA,CAAAjkB,CAAA,8BACAkkB,WAAA,GAQA,MAPA,CAAAD,SAAA,CAAA1b,IAAA,YACA,IAAA4b,QAAA,CAAAnkB,CAAA,OACA6iB,cAAA,CAAAsB,QAAA,CAAA9mB,IAAA,8BACAwlB,cAAA,CAAAnlB,MAAA,GACAwmB,WAAA,EAAAC,QAAA,CAAAC,WAAA,KAEA,GACAF,WACA,CAGA,SAAAhB,wBAAA,EACA,IAAAY,mBAAA,CAAA9jB,CAAA,0BACAqkB,WAAA,CAAArkB,CAAA,uBACA,CAAA8jB,mBAAA,CAAApmB,MAAA,EAAA2mB,WAAA,CAAA3mB,MAAA,CACA2mB,WAAA,CAAAhU,GAAA,IAAA0T,qBAAA,GAAA5F,GAAA,CAAA2F,mBAAA,CAAAzT,GAAA,IAAA0T,qBAAA,GAAA5F,GAAA,CAEA,CACA,MAjEA,CAAAhf,UAAA,MAAAnC,aAAA,GACA8lB,YAAA,CAAA3jB,UAAA,CAAAhC,aAAA,GAAAC,cAAA,GACA+lB,mBAAA,IACAC,cAAA,IACAjkB,UAAA,CAAAkB,EAAA,yBACAuiB,eAAA,GACA5iB,CAAA,CAAAgkB,MAAA,EAAAjP,GAAA,2BACA/U,CAAA,CAAAgkB,MAAA,EAAA3jB,EAAA,0BAAAuiB,eAAA,CACA,EA0DA,CACA,GAEA,OAAAD,aAEA,GAEA3mB,MC3GA,8GAAAsoB,UAAA,CAAApoB,aAAA,eAEAooB,UAAA,CAAAA,UAAA,EAAA9nB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA2nB,UAAA,YAAAA,UAAA,YAAAA,UAAA,CACApoB,aAAA,CAAAA,aAAA,EAAAM,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAT,aAAA,YAAAA,aAAA,YAAAA,aAAA,CAwBA,IAAAqoB,OAAA,CAAAroB,aAAA,EACAW,IAAA,WAIAC,IAAA,UAAAA,KAAA,EACA,IAAAqC,UAAA,MAAAnC,aAAA,GACAmC,UAAA,CAAAkB,EAAA,yBACAikB,UAAA,CAAAE,KAAA,EACA,GAAAnkB,EAAA,yBACAikB,UAAA,CAAAG,IAAA,EACA,EACA,CACA,GAEA,OAAAF,OAEA,GAEAvoB,MC9CA,yQAAAgE,CAAA,CAAA/D,CAAA,CAAAyoB,MAAA,CAAAxoB,aAAA,CAAAyoB,aAAA,CAAAC,YAAA,CAAAC,UAAA,eAuDA,SAAAC,gBAAA9C,QAAA,EACA,IAAA+C,OAAA,IACA9oB,CAAA,CAAA+P,MAAA,CAAAgZ,iBAAA,UAAAC,cAAA,EACA,IAAAC,KAAA,CAAAD,cAAA,GAAAjD,QAAA,CAIA,MAHA,CAAAkD,KAAA,GACAH,OAAA,KAEAG,KACA,GACAH,OAAA,GACA/C,QAAA,CAAAjW,OAAA,GACA,CAAAiZ,iBAAA,CAAAtnB,MAAA,EACAynB,QAAA,GAGA,CACA,SAAAC,WAAAC,MAAA,EACAC,UAAA,CAAAD,MAAA,CACAE,aAAA,CAAAD,UAAA,CAAAX,aAAA,CAAAC,YACA,CAxEA5kB,CAAA,CAAAA,CAAA,EAAAxD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAqD,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACA/D,CAAA,CAAAA,CAAA,EAAAO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAV,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACAyoB,MAAA,CAAAA,MAAA,EAAAloB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA+nB,MAAA,YAAAA,MAAA,YAAAA,MAAA,CACAxoB,aAAA,CAAAA,aAAA,EAAAM,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAT,aAAA,YAAAA,aAAA,YAAAA,aAAA,CACAyoB,aAAA,CAAAA,aAAA,EAAAnoB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAgoB,aAAA,YAAAA,aAAA,YAAAA,aAAA,CACAC,YAAA,CAAAA,YAAA,EAAApoB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAioB,YAAA,YAAAA,YAAA,YAAAA,YAAA,CACAC,UAAA,CAAAA,UAAA,EAAAroB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAkoB,UAAA,YAAAA,UAAA,YAAAA,UAAA,IAuEA,CAAAW,aAAA,CAAAtpB,aAAA,EACAW,IAAA,oBAIAC,IAAA,UAAAA,KAAA,EACAqoB,QAAA,SAAAA,CAAA,IACAC,UAAA,GAAAV,MAAA,CAAAxkB,MAAA,GAAAulB,mBAAA,CACA,EAIA5X,MAAA,UAAAA,OAAA,KACA,CAAA9Q,IAAA,MACAoC,UAAA,MAAAnC,aAAA,GACA0oB,cAAA,UAAAA,eAAAC,cAAA,CAAAN,MAAA,EACA,IAAAO,WAAA,CAAAN,UAAA,CACAO,WAAA,IACAb,iBAAA,IACA/oB,CAAA,CAAA6pB,SAAA,CAAAT,MAAA,GACAD,UAAA,CAAAC,MAAA,EAEAM,cAAA,CAAAjoB,MAAA,EACAzB,CAAA,CAAAyE,OAAA,CAAAilB,cAAA,UAAAI,cAAA,EACA,IAAA/D,QAAA,CAAAuD,aAAA,CAAApmB,UAAA,CAAAA,UAAA,CAAAhC,aAAA,IACA6kB,QAAA,CAAAllB,IAAA,EACA+gB,GAAA,CAAAkI,cAAA,CAAA/D,QAAA,CAAAnU,MAAA,EACAwX,MAAA,CAAAC,UACA,GAEA/K,UAAA,CAAA+K,UAAA,CAAAS,cAAA,CAAAxL,UAAA,KACA,GACAyH,QAAA,CAAAnU,MAAA,GACAmX,iBAAA,CAAAnV,IAAA,CAAAmS,QAAA,CACA,GAGAsD,UAAA,EAAAN,iBAAA,EACAH,UAAA,CAAA7kB,CAAA,sBAAAb,UAAA,CAAAhC,aAAA,GAAAC,cAAA,IAAAG,KAAA,GAAA4B,UAAA,CAAAhC,aAAA,GAAAC,cAAA,GAAAkX,OAAA,uBAGA6Q,QAAA,GAIAC,UAAA,CAAAQ,WAAA,CACA,EACAN,UAAA,CACAnmB,UAAA,CAAA4V,GAAA,oCAAA1U,EAAA,8CACAtD,IAAA,CAAAgP,OAAA,EACA,GAEA5M,UAAA,CAAA4V,GAAA,mCAAA1U,EAAA,2CAAA2hB,QAAA,EACA8C,eAAA,CAAA9C,QAAA,CACA,GAEA7iB,UAAA,CAAAkB,EAAA,2BAAAslB,cAAA,CAAAK,IAAA,CAAAX,MAAA,EACAF,QAAA,CAAAa,IAAA,CACAN,cAAA,CAAAC,cAAA,CAAAN,MAAA,CACA,EACA,EAKAtZ,OAAA,UAAAA,QAAA,EACA,IAAAka,UAAA,CAAAtV,CAAA,CACA,IAAAkV,WAAA,CAEA,GADAA,WAAA,IACA,CAAAb,iBAAA,CACAG,QAAA,OAGA,KAAAxU,CAAA,GADA,CAAAsV,UAAA,CAAAjB,iBAAA,CAAA7d,KAAA,IACA8e,UAAA,CACAnB,eAAA,CAAAmB,UAAA,CAAAtV,CAAA,EAIA,CACA,GA7HA2U,UAAA,CAMAC,aAAA,CAKAP,iBAAA,CAKAa,WAAA,CAKAV,QAAA,CA0GA,OAAAK,aAEA,GAEAxpB,MCpKA,kGAAAgE,CAAA,CAAA9D,aAAA,eAEA8D,CAAA,CAAAA,CAAA,EAAAxD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAqD,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACA9D,aAAA,CAAAA,aAAA,EAAAM,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAT,aAAA,YAAAA,aAAA,YAAAA,aAAA,CAuBA,IAAAgqB,OAAA,CAAAhqB,aAAA,EACAW,IAAA,WAIAC,IAAA,UAAAA,KAAA,KACA,CAAAC,IAAA,MACAoC,UAAA,MAAAnC,aAAA,GACA,KAAAkO,QAAA,CAAAlL,CAAA,YACA,KAAAkL,QAAA,CAAA7K,EAAA,0FAAAgL,CAAA,EACAA,CAAA,CAAA8a,wBAAA,GACA9a,CAAA,CAAA+a,eAAA,EACA,QACA,CAAAC,MAAA,UAAAA,OAAA,EACAtpB,IAAA,CAAAqf,MAAA,EACA,EACAkK,QAAA,UAAAA,SAAA,EACAvpB,IAAA,CAAAmf,OAAA,EACA,EAGA/c,UAAA,CAAAkB,EAAA,eAAAgmB,MAAA,EAAAhmB,EAAA,wCAAAimB,QAAA,CACA,EAIAzY,MAAA,UAAAA,OAAA,EACA,IAAAiV,YAAA,MAAA9lB,aAAA,GAAAG,aAAA,GAAAC,cAAA,GACA0lB,YAAA,CAAA7lB,KAAA,MAAAiO,QAAA,CACA,EAIAa,OAAA,UAAAA,QAAA,EACA,KAAAb,QAAA,CAAAc,MAAA,EACA,EAIAoQ,OAAA,EACA,MAAAmK,aAAA,MAAApX,SAAA,GACA,KAAAjE,QAAA,CAAAoD,QAAA,YACAiY,aAAA,CAAAC,IAAA,EACA,KAAAtb,QAAA,CAAAoD,QAAA,gBAEA,EAIA4N,OAAA,UAAAA,QAAA,EACA,KAAAhR,QAAA,CAAAmD,WAAA,wBACA,EAIA+L,IAAA,UAAAA,KAAA,EACA,KAAAgC,MAAA,EACA,EAIAhB,IAAA,UAAAA,KAAA,EACA,KAAAc,OAAA,EACA,CACA,GAEA,OAAAgK,OAEA,GAEAlqB,MChGA,oHAAAC,CAAA,CAAA+D,CAAA,CAAA9D,aAAA,eAEAD,CAAA,CAAAA,CAAA,EAAAO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAV,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACA+D,CAAA,CAAAA,CAAA,EAAAxD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAqD,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACA9D,aAAA,CAAAA,aAAA,EAAAM,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAT,aAAA,YAAAA,aAAA,YAAAA,aAAA,IAwBA,CAAAuqB,EAAA,cAMAC,UAAA,wBAMAC,eAAA,8BAMAC,cAAA,iBAMAC,YAAA,aAMAzmB,QAAA,EACA0mB,aAAA,IAEAC,kBAAA,IAEAC,eAAA,IAEAC,KAAA,IAiBAC,aAAA,GACA,EACAC,OAAA,CAAAnnB,CAAA,CAAAgkB,MAAA,EAMAoD,SAAA,CAAAlrB,aAAA,EACAW,IAAA,aAIAC,IAAA,UAAAA,KAAA,EAaA,SAAAuqB,sBAAA,EAGAC,eAAA,CADApnB,MAAA,CAAA8mB,eAAA,EAAA9mB,MAAA,CAAAgnB,aAAA,CAAAxpB,MAAA,CACA6pB,yBAAA,GAGArnB,MAAA,CAAA8mB,eAAA,CACAQ,4BAAA,GAIAC,8BAAA,EAEA,CAMA,SAAAC,cAAAxc,QAAA,EACA,IAAAyc,aAAA,CAAAC,cAAA,CAMA,MALA,CAAA1c,QAAA,CAAAmD,WAAA,CAAAwZ,WAAA,EACAF,aAAA,CAAAzc,QAAA,CAAA4c,UAAA,KACA5c,QAAA,CAAAoD,QAAA,CAAAuZ,WAAA,EACAD,cAAA,CAAA1c,QAAA,CAAA4c,UAAA,KACA5c,QAAA,CAAAmD,WAAA,CAAAwZ,WAAA,EACAF,aAAA,CAAAC,cACA,CAKA,SAAAG,mBAAA,EACAC,cAAA,CAAAC,iBAAA,GACAD,cAAA,CAAAE,sBAAA,CAAAlB,eAAA,GAAAmB,aAAA,GACAD,sBAAA,CAAAF,cACA,CACA,SAAAhB,gBAAA,MACA,IAAAoB,gBAAA,CAAAnsB,CAAA,CAAAosB,KAAA,CAAAf,eAAA,EACAgB,UAAA,CACAC,cAAA,IAAAH,gBAAA,CAAA1qB,MAAA,EACA4qB,UAAA,CAAAF,gBAAA,CAAAI,KAAA,GACAF,UAAA,CAAA9Y,SAAA,CAAAlB,QAAA,CAAAuZ,WAAA,CAEA,CACA,SAAAU,eAAA,EACA,OAAAE,eAAA,GAAAR,iBAAA,EACA,CACA,SAAAE,cAAA,EACAlsB,CAAA,CAAAysB,YAAA,CAAApB,eAAA,UAAAqB,QAAA,EACA,GAAAA,QAAA,CAAAnZ,SAAA,CAAAkC,QAAA,CAAAmW,WAAA,EACA,GAAAe,cAAA,CAAAD,QAAA,CAAAE,UAAA,EACAF,QAAA,CAAAnZ,SAAA,CAAAnB,WAAA,CAAAwZ,WAAA,MAEA,SAGA,EACA,CACA,SAAAe,eAAAC,UAAA,EACA,OAAAJ,eAAA,GAAAI,UAAA,CAAAZ,iBAAA,EACA,CACA,SAAAA,kBAAA,EAIA,OAAAa,WAAA,CAAAC,KAAA,KACA,CACA,SAAAN,gBAAA,EACA,OAAAO,QAAA,CAAAlB,UAAA,KAAAmB,WAAA,CAAAnB,UAAA,IACA,CAMA,SAAAoB,mBAAA,EACA,IAAAC,SAAA,CAAAnpB,CAAA,GACAO,QAAA,sBAOA,MANA,CAAAL,MAAA,CAAA4mB,aAAA,GACAqC,SAAA,CAAAA,SAAA,CAAA7b,GAAA,CAAA0b,QAAA,CAAA3rB,IAAA,uBAAAC,GAAA,KAAAspB,cAAA,IAAAtpB,GAAA,KAAAupB,YAAA,MAEA3mB,MAAA,CAAA6mB,kBAAA,GACAoC,SAAA,CAAAA,SAAA,CAAA7b,GAAA,CAAA2b,WAAA,CAAA5rB,IAAA,uBAAAC,GAAA,KAAAspB,cAAA,IAAAtpB,GAAA,KAAAupB,YAAA,MAEAsC,SACA,CAOA,SAAA5B,0BAAA,EACA,OAAAtrB,CAAA,CAAAmtB,OAAA,CAAAlpB,MAAA,CAAAgnB,aAAA,CAAAjkB,GAAA,UAAA1C,QAAA,KAEA,CAAAiP,SAAA,CAAAxP,CAAA,CAAAO,QAAA,EAAAjD,GAAA,KAAAspB,cAAA,IAAAtpB,GAAA,KAAAupB,YAAA,IACAgC,UAAA,WACArZ,SAAA,CAAA9R,MAAA,GACA8R,SAAA,CAAAjH,IAAA,YACAsgB,UAAA,EAAAnB,aAAA,CAAA1nB,CAAA,OACA,GACA,CACAwP,SAAA,CAAAA,SAAA,CACAqZ,UAAA,CAAAA,UACA,EAGA,GACA,CAQA,SAAArB,6BAAA,EACA,IAAA6B,gBAAA,CAAAH,kBAAA,GACAI,gBAAA,IACAC,KAAA,IAwBA,MApBA,CAAAF,gBAAA,CAAA9gB,IAAA,YACA,IAAAihB,IAAA,MAAAC,OAAA,CAAA1I,OAAA,CAGAlE,GAAA,CAAA2M,IAAA,CAAAE,SAAA,GAAAF,IAAA,CAAAG,MAAA,cAAAH,IAAA,CACAD,KAAA,CAAA1M,GAAA,EAAA0M,KAAA,CAAA1M,GAAA,GAAA7c,CAAA,GACAupB,KAAA,CAAA1M,GAAA,EAAA0M,KAAA,CAAA1M,GAAA,EAAAvP,GAAA,CAAAtN,CAAA,OACA,GAGA/D,CAAA,CAAA2tB,MAAA,CAAAL,KAAA,UAAA/Z,SAAA,EACA,IAAAqZ,UAAA,GACArZ,SAAA,CAAAjH,IAAA,YACAsgB,UAAA,EAAAnB,aAAA,CAAA1nB,CAAA,OACA,GACAspB,gBAAA,CAAAzZ,IAAA,EACAL,SAAA,CAAAA,SAAA,CACAqZ,UAAA,CAAAA,UACA,EACA,GACA5sB,CAAA,CAAAmtB,OAAA,CAAAE,gBAAA,CACA,CAOA,SAAA7B,+BAAA,EACA,IAAAjY,SAAA,CAAA0Z,kBAAA,GACAI,gBAAA,IACAT,UAAA,GAQA,MAPA,CAAArZ,SAAA,CAAAjH,IAAA,YACAsgB,UAAA,EAAAnB,aAAA,CAAA1nB,CAAA,OACA,GACAspB,gBAAA,CAAAzZ,IAAA,EACAL,SAAA,CAAAA,SAAA,CACAqZ,UAAA,CAAAA,UACA,GACA5sB,CAAA,CAAAmtB,OAAA,CAAAE,gBAAA,CACA,MAhLA,CAAAnqB,UAAA,MAAAnC,aAAA,GACAkD,MAAA,CAAA1D,MAAA,CAAAkL,MAAA,IAAAtH,QAAA,MAAA+O,SAAA,IACA0Y,WAAA,CAAA3nB,MAAA,CAAA+mB,KAAA,CAAAN,eAAA,CAAAD,UAAA,IACA,CAAA3Z,UAAA,CAAA5N,UAAA,CAAAhC,aAAA,GACA2rB,WAAA,CAAA/b,UAAA,CAAAyN,OAAA,eACAwO,QAAA,CAAAjc,UAAA,CAAArO,cAAA,GACAuqB,WAAA,CAAAlc,UAAA,CAAAvO,iBAAA,GACA8oB,eAAA,CAAAU,cAAA,CAAAE,sBAAA,CA0KAf,OAAA,CAAA9mB,EAAA,yBAAApE,CAAA,CAAA4tB,QAAA,YACA1qB,UAAA,CAAA4B,OAAA,iBACA,OACA5B,UAAA,CAAAlC,KAAA,kCACAirB,sBAAA,KACAb,qBAAA,GACAloB,UAAA,CAAA4B,OAAA,iBACA,GAAAV,EAAA,2CACA0nB,kBAAA,EACA,EACA,EACAhc,OAAA,UAAAA,QAAA,EACAob,OAAA,CAAApS,GAAA,cACA,CACA,GAEA,OAAAqS,SAEA,GAEAprB,MCrSA,2JAAAsQ,GAAA,CAAAoR,KAAA,CAAAxhB,aAAA,CAAAsD,UAAA,CAAAC,QAAA,eAmBA,SAAAgN,aAAA9M,IAAA,CAAAC,OAAA,CAAAC,QAAA,EACA,IAAAC,IAAA,CAAAC,QAAA,CAAAJ,IAAA,CAAAC,OAAA,EACA,OAAAC,QAAA,KAAAC,IAAA,CAAAE,CAAA,CAAAF,IAAA,CACA,CApBAwM,GAAA,CAAAA,GAAA,EAAA9P,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA2P,GAAA,YAAAA,GAAA,YAAAA,GAAA,CACAoR,KAAA,CAAAA,KAAA,EAAAlhB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA+gB,KAAA,YAAAA,KAAA,YAAAA,KAAA,CACAxhB,aAAA,CAAAA,aAAA,EAAAM,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAT,aAAA,YAAAA,aAAA,YAAAA,aAAA,CACAsD,UAAA,CAAAA,UAAA,EAAAhD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6C,UAAA,YAAAA,UAAA,YAAAA,UAAA,CACAC,QAAA,CAAAA,QAAA,EAAAjD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA8C,QAAA,YAAAA,QAAA,YAAAA,QAAA,CAEAA,QAAA,CAAA8B,aAAA,GACA9B,QAAA,CAAAD,UAAA,EACAC,QAAA,CAAA8B,aAAA,QAEA,CAAAxB,QAAA,CAAAP,UAAA,CAAAgC,QAAA,UAAAhC,UAAA,CAAAiC,MAAA,CAAAC,OAAA,CAAAC,QAAA,CAAAhC,IAAA,EAKA,MAJA,MAAAkC,YAAA,gBACAH,OAAA,MAAAI,KAAA,CAAAJ,OAAA,CAAAlC,UAAA,CAAAkC,OAAA,EAGA,kCACA,GA4BAooB,aAAA,UAAAA,cAAAvP,UAAA,EACAjO,GAAA,KAAAiO,UAAA,EAAA1c,IAAA,mBACA,EAKAksB,OAAA,UAAAA,QAAAxP,UAAA,EACA,WAAAgD,OAAA,UAAAC,OAAA,EACA,EAAAlR,GAAA,QAAAiO,UAAA,EAAA7c,MAAA,CAEAssB,OAAA,sBAAAC,OAAA,EACAA,OAAA,EACAA,OAAA,CAAAC,GAAA,CAAAC,KAAA,YAAAF,OAAA,CAAAC,GAAA,EAAA3P,UAAA,KACA0P,OAAA,CAAAC,GAAA,CAAAC,KAAA,CAAA3M,OAAA,GAEAA,OAAA,EAEA,EAAAA,OAAA,EAEAA,OAAA,EAEA,EACA,EAKA4M,WAAA,CAAAluB,aAAA,EACAW,IAAA,eAIAC,IAAA,UAAAA,KAAA,KACA,CAAAC,IAAA,MACAoC,UAAA,MAAAnC,aAAA,GACA,KAAAkO,QAAA,CAAAoB,GAAA,CAAAG,YAAA,IACA,KAAA2O,IAAA,GAGAjc,UAAA,CAAAkB,EAAA,oBACAtD,IAAA,CAAAqe,IAAA,EACA,GAAA/a,EAAA,uBACA,IAAA4H,OAAA,CAAA9I,UAAA,CAAAoL,cAAA,GACAtC,OAAA,CAAAoiB,OAAA,GACAttB,IAAA,CAAAmO,QAAA,CAAApL,IAAA,CAAAmI,OAAA,CAAAoiB,OAAA,EACAP,aAAA,CAAA/sB,IAAA,CAAAmO,QAAA,EACA6e,OAAA,CAAAhtB,IAAA,CAAAmO,QAAA,EAAAof,IAAA,YAEAnrB,UAAA,CAAA4B,OAAA,eACA,GAEA,GAAAV,EAAA,yBACAtD,IAAA,CAAAqd,IAAA,EACA,GAAA/Z,EAAA,yBACAtD,IAAA,CAAAqe,IAAA,GACAre,IAAA,CAAAmO,QAAA,CAAAqf,KAAA,EACA,EACA,EAIA1c,MAAA,UAAAA,OAAA,EAEA,IAAA0M,UAAA,MAAApd,aAAA,GAAAC,cAAA,GACAmd,UAAA,CAAAuC,MAAA,MAAA5R,QAAA,CACA,EAIAa,OAAA,UAAAA,QAAA,EACA,KAAAb,QAAA,CAAAc,MAAA,EACA,EAIAoQ,MAAA,UAAAA,OAAA,EACA,KAAAlR,QAAA,CAAA2W,UAAA,aAAAxT,WAAA,YACA,EAIA6N,OAAA,UAAAA,QAAA,EACA,KAAAhR,QAAA,CAAA4W,IAAA,gBAAAxT,QAAA,YACA,EAIA8L,IAAA,UAAAA,KAAA,EACAsD,KAAA,CAAAtD,IAAA,MAAAlP,QAAA,CACA,EAIAkQ,IAAA,UAAAA,KAAA,EACAsC,KAAA,CAAAtC,IAAA,MAAAlQ,QAAA,CACA,CACA,GAEA,OAAAkf,WAEA,GAEApuB,MCrJA,oOAAAsQ,GAAA,CAAArQ,CAAA,CAAAgC,EAAA,CAAAusB,cAAA,CAAAC,aAAA,CAAAvuB,aAAA,CAAAsD,UAAA,CAAAC,QAAA,CAAA+M,eAAA,eAgEA,SAAAke,gBAAA/qB,IAAA,CAAAC,OAAA,CAAAC,QAAA,EACA,IAAAC,IAAA,CAAAC,QAAA,CAAAJ,IAAA,CAAAC,OAAA,EACA,OAAAC,QAAA,KAAAC,IAAA,CAAAE,CAAA,CAAAF,IAAA,CACA,CAjEAwM,GAAA,CAAAA,GAAA,EAAA9P,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA2P,GAAA,YAAAA,GAAA,YAAAA,GAAA,CACArQ,CAAA,CAAAA,CAAA,EAAAO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAV,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACAgC,EAAA,CAAAA,EAAA,EAAAzB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAsB,EAAA,YAAAA,EAAA,YAAAA,EAAA,CACAusB,cAAA,CAAAA,cAAA,EAAAhuB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6tB,cAAA,YAAAA,cAAA,YAAAA,cAAA,CACAC,aAAA,CAAAA,aAAA,EAAAjuB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA8tB,aAAA,YAAAA,aAAA,YAAAA,aAAA,CACAvuB,aAAA,CAAAA,aAAA,EAAAM,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAT,aAAA,YAAAA,aAAA,YAAAA,aAAA,CACAsD,UAAA,CAAAA,UAAA,EAAAhD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6C,UAAA,YAAAA,UAAA,YAAAA,UAAA,CACAC,QAAA,CAAAA,QAAA,EAAAjD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA8C,QAAA,YAAAA,QAAA,YAAAA,QAAA,CACA+M,eAAA,CAAAA,eAAA,EAAAhQ,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6P,eAAA,YAAAA,eAAA,YAAAA,eAAA,CAEA/M,QAAA,CAAA8B,aAAA,GACA9B,QAAA,CAAAD,UAAA,EACAC,QAAA,CAAA8B,aAAA,QAEA,CAAAxB,QAAA,CAAAP,UAAA,CAAAgC,QAAA,UAAAhC,UAAA,CAAAiC,MAAA,CAAAC,OAAA,CAAAC,QAAA,CAAAhC,IAAA,EAKA,SAAAiC,SAAAH,MAAA,CAAA9B,IAAA,EAGA,qBACA,CAEA,SAAA8gB,SAAAhf,MAAA,CAAA9B,IAAA,EAEA,IAAAoC,MAAA,IAAAK,MAAA,CAAAxC,OAAA,CAIA,MAHA,CAAAmC,MAAA,qCACAE,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,UAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,eAAA7B,OAAA,IACA,UACAmC,MACA,CAEA,SAAA4e,SAAAlf,MAAA,CAAA9B,IAAA,EAEA,IAAAoC,MAAA,IAAAK,MAAA,CAAAxC,OAAA,CAIA,MAHA,CAAAmC,MAAA,0CACAE,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,WAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,gBAAA7B,OAAA,IACA,UACAmC,MACA,CA1BA,KAAAF,YAAA,gBACAH,OAAA,MAAAI,KAAA,CAAAJ,OAAA,CAAAlC,UAAA,CAAAkC,OAAA,EAAA/B,IAAA,CAAAA,IAAA,KACA,IAAAoC,MAAA,IAAAC,aAAA,CAAAN,OAAA,CAAAM,aAAA,CAAAC,gBAAA,MAAAA,gBAAA,CAAAC,YAAA,YAAAnF,IAAA,MAAAoF,MAAA,CAAAC,MAAA,CAAAxC,OAAA,CA2CA,MAjBA,CAAAmC,MAAA,oCACAK,MAAA,CAAAV,OAAA,CAAAsY,KAAA,EAAA7X,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAuY,KAAA,CAAA7X,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACAA,MAAA,CAAAT,OAAA,OAAA/E,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAAoa,OAAA,EAAAxZ,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA2F,IAAA,CAAAC,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,GAAAhB,QAAA,CAAAjC,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,cACAI,MAAA,CAAAT,OAAA,OAAA/E,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAAoa,OAAA,EAAAxZ,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA2F,IAAA,CAAAC,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,GAAA6d,QAAA,CAAA9gB,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,+FACAE,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,uBAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,4BAAA7B,OAAA,IACA,mBACAuC,MAAA,CAAAT,OAAA,OAAA/E,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAAoa,OAAA,EAAAxZ,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA2F,IAAA,CAAAC,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,GAAA+d,QAAA,CAAAhhB,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,qGACAE,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,4BAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,iCAAA7B,OAAA,IACA,uBACAmC,MACA,GA+BA4oB,aAAA,EACAC,aAAA,OACAC,SAAA,IACAhP,OAAA,GACA,EAMAiP,YAAA,CAAA5uB,aAAA,EACAW,IAAA,gBAIAC,IAAA,UAAAA,KAAA,KACA,CAAAC,IAAA,MACAoC,UAAA,MAAAnC,aAAA,GACA+tB,KAAA,CAAA5rB,UAAA,CAAA6rB,QAAA,GACA9qB,MAAA,CAAA1D,MAAA,CAAAkL,MAAA,IAAAijB,aAAA,MAAAxb,SAAA,IAGAjP,MAAA,EAAAA,MAAA,CAAA2qB,SAAA,GAEA,KAAA3f,QAAA,CAAAoB,GAAA,CAAAoe,eAAA,EACA1Q,KAAA,CAAA+Q,KAAA,CAAAE,QAAA,8BACApP,OAAA,CAAA3b,MAAA,CAAA2b,OACA,IACA1c,UAAA,CAAAkB,EAAA,yBACAtD,IAAA,CAAAmO,QAAA,CAAAmD,WAAA,cAAAC,QAAA,gBACA,GAAAjO,EAAA,wBACAtD,IAAA,CAAAmO,QAAA,CAAAmD,WAAA,iBAAAC,QAAA,aACA,IAIA,KAAA4c,OAAA,EAAAjvB,CAAA,CAAAkjB,QAAA,CAAAjf,MAAA,CAAA0qB,aAAA,GACA,KAAAM,OAAA,CAAAC,WAAA,CAAAjrB,MAAA,CAAA0qB,aAAA,CAEA,EAKA1N,OAAA,UAAAA,QAAA,KACA,CAAAngB,IAAA,MACAquB,OAAA,IACAjsB,UAAA,MAAAnC,aAAA,GACA+tB,KAAA,CAAA5rB,UAAA,CAAA6rB,QAAA,GAOA,KAAAK,oBAAA,UAAAA,qBAAA,EACA,IAAAxP,OAAA,GAAAxW,SAAA,CAAA3H,MAAA,EAAA2H,SAAA,aAAAA,SAAA,OACA,IAAA6V,MAAA,CACA,WAAAqC,OAAA,UAAAC,OAAA,EACA4N,OAAA,GACAA,OAAA,IAIAjsB,UAAA,CAAA2d,MAAA,4BACA,WAAAS,OAAA,UAAA+N,YAAA,EACAP,KAAA,CAAAhW,GAAA,sBAAA9X,KAAA,qBAAAquB,YAAA,CACA,EACA,GAGApQ,MAAA,CAAAuP,aAAA,EACA5O,OAAA,CAAA5d,EAAA,yDAAA4d,OAAA,CACA0P,WAAA,CAAAttB,EAAA,wDACAutB,cAAA,CAAAvtB,EAAA,mDACA,GAAAoC,EAAA,sBACAmd,OAAA,EACA,GAAAnd,EAAA,qBACA0qB,KAAA,CAAAhW,GAAA,sBAAA9X,KAAA,gCACAkC,UAAA,CAAA4V,GAAA,kBACAqW,OAAA,IACAlQ,MAAA,CAAAuQ,OAAA,EACA,EACA,GAEA,EACA,EAIA,KAAAP,OAAA,CAAAV,cAAA,EACApK,MAAA,UAAAA,OAAA,EACAjhB,UAAA,CAAA6rB,QAAA,GAAAU,SAAA,CAAAvsB,UAAA,CAAAoL,cAAA,GAAA7F,cAAA,OAAAinB,KAAA,CAAA1vB,CAAA,CAAAyG,IAAA,CACA,EACAkpB,QAAA,CAAAjB,aAAA,CAAAC,aAAA,CACAiB,SAAA,GACA,GAGAd,KAAA,CAAA1qB,EAAA,uBAAAyrB,WAAAC,MAAA,EACA5sB,UAAA,CAAA4a,QAAA,mBACA5a,UAAA,CAAAijB,QAAA,oBACAjjB,UAAA,CAAA4B,OAAA,cAAAgrB,MAAA,EACAhvB,IAAA,CAAAmuB,OAAA,CAAA1G,KAAA,GAEA,GAAAnkB,EAAA,sBAAA2rB,UAAA,EACA7sB,UAAA,CAAA4a,QAAA,mBACA5a,UAAA,CAAAijB,QAAA,oBACAjjB,UAAA,CAAA4B,OAAA,cACAhE,IAAA,CAAAmuB,OAAA,CAAAzG,IAAA,GAEA,GAMAtlB,UAAA,CAAA2d,MAAA,kBAAAzR,CAAA,CAAA1L,IAAA,EACA,GAAAorB,KAAA,CAAAkB,SAAA,GAMA,MALA,CAAAlvB,IAAA,CAAAsuB,oBAAA,CAAA1rB,IAAA,CAAAkc,OAAA,EAAAyO,IAAA,YACAnrB,UAAA,CAAA4B,OAAA,SAAApB,IAAA,CACA,GAAAgsB,KAAA,UAAAO,UAAA,EACA/sB,UAAA,CAAA4B,OAAA,SAAAmrB,UAAA,CACA,KAGA,GAGA/sB,UAAA,CAAA2d,MAAA,+BAAAzR,CAAA,CAAAgX,GAAA,SAEA0I,KAAA,CAAAoB,mBAAA,CAAA9J,GAAA,IAGA0I,KAAA,CAAAkB,SAAA,IACAlvB,IAAA,CAAAsuB,oBAAA,GAAAf,IAAA,YACA,QAAAjI,GAAA,CAAAxI,IAAA,EACA1a,UAAA,CAAAitB,QAAA,CAAAjtB,UAAA,CAAAoL,cAAA,GAAA7F,cAAA,EAEA,WAAA2d,GAAA,CAAAxI,IAAA,EACA1a,UAAA,CAAAktB,MAAA,GAEA,UAAAhK,GAAA,CAAAxI,IAAA,EACA1a,UAAA,CAAA4B,OAAA,UACAurB,OAAA,CAAAjK,GAAA,CAAA1iB,IAAA,EAAA0iB,GAAA,CAAA1iB,IAAA,CAAA2sB,OAAA,CACAzQ,OAAA,CAAAwG,GAAA,CAAA1iB,IAAA,EAAA0iB,GAAA,CAAA1iB,IAAA,CAAA4sB,OACA,EAEA,GAAAZ,KAAA,UAAAO,UAAA,EACA/sB,UAAA,CAAA4B,OAAA,SAAAmrB,UAAA,CACA,cAGA,GACA/sB,UAAA,CAAA2d,MAAA,kCAAAzR,CAAA,CAAAmhB,OAAA,CAAA1tB,IAAA,OACA,CAAAwf,WAAA,CAAAnf,UAAA,CAAAoL,cAAA,GACA,CACAkiB,KACA,EAAA3tB,IAAA,QACA2tB,KAAA,IAGAA,KAAA,CAAAC,YAAA,GACApO,WAAA,CAAAoO,YAAA,KAEA,CAAAD,KAAA,CAAAE,0BAAA,EAAAF,KAAA,CAAAG,MAAA,GAAA7B,KAAA,CAAAkB,SAAA,KACAlvB,IAAA,CAAAsuB,oBAAA,GAAAf,IAAA,MACAnrB,UAAA,CAAAitB,QAAA,CAAAI,OAAA,CACA,cAGA,GACArtB,UAAA,CAAA2d,MAAA,CAAAtQ,eAAA,CAAAe,YAAA,8CAAAlC,CAAA,EACA,QAAAwhB,IAAA,CAAAxnB,SAAA,CAAA3H,MAAA,CAAAovB,IAAA,CAAA/nB,KAAA,GAAA8nB,IAAA,CAAAA,IAAA,MAAAE,IAAA,GAAAA,IAAA,CAAAF,IAAA,CAAAE,IAAA,GACAD,IAAA,CAAAC,IAAA,IAAA1nB,SAAA,CAAA0nB,IAAA,EACA,GACA,CAAAzO,WAAA,CAAAnf,UAAA,CAAAoL,cAAA,GACAkE,WAAA,CAAAtP,UAAA,CAAAwN,cAAA,GACA,GAAAoe,KAAA,CAAAkB,SAAA,KAAAxd,WAAA,CAAAie,YAAA,EAAApO,WAAA,CAAAoO,YAAA,EAKA,MAJA,CAAAvtB,UAAA,CAAA4B,OAAA,gBACAhE,IAAA,CAAAsuB,oBAAA,GAAAf,IAAA,YACAnrB,UAAA,CAAA4B,OAAA,eAAAA,OAAA,CAAAsK,CAAA,CAAAxO,IAAA,IAAAiwB,IAAA,CACA,KAGA,EACA,EACA/gB,QAAA,EACA,KAAA/O,aAAA,GAAA+X,GAAA,iBACA,EAIAlH,MAAA,UAAAA,OAAA,EACA,IAAA0M,UAAA,MAAApd,aAAA,GAAA2Q,cAAA,GACA,KAAA5C,QAAA,EACAqP,UAAA,CAAA1L,MAAA,MAAA3D,QAAA,CAEA,CACA,GAEA,OAAA4f,YAEA,GAEA9uB,MC3SA,iJAAAiC,EAAA,CAAA/B,aAAA,CAAAsD,UAAA,CAAAC,QAAA,eA2BA,SAAAutB,UAAArtB,IAAA,CAAAC,OAAA,CAAAC,QAAA,EACA,IAAAC,IAAA,CAAAC,QAAA,CAAAJ,IAAA,CAAAC,OAAA,EACA,OAAAC,QAAA,KAAAC,IAAA,CAAAE,CAAA,CAAAF,IAAA,CACA,CA5BA7B,EAAA,CAAAA,EAAA,EAAAzB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAsB,EAAA,YAAAA,EAAA,YAAAA,EAAA,CACA/B,aAAA,CAAAA,aAAA,EAAAM,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAT,aAAA,YAAAA,aAAA,YAAAA,aAAA,CACAsD,UAAA,CAAAA,UAAA,EAAAhD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6C,UAAA,YAAAA,UAAA,YAAAA,UAAA,CACAC,QAAA,CAAAA,QAAA,EAAAjD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA8C,QAAA,YAAAA,QAAA,YAAAA,QAAA,CAEAA,QAAA,CAAA8B,aAAA,GACA9B,QAAA,CAAAD,UAAA,EACAC,QAAA,CAAA8B,aAAA,KAEA,IAAAxB,QAAA,CAAAP,UAAA,CAAAgC,QAAA,UAAAhC,UAAA,CAAAiC,MAAA,CAAAC,OAAA,CAAAC,QAAA,CAAAhC,IAAA,EACA,KAAAkC,YAAA,gBACAH,OAAA,MAAAI,KAAA,CAAAJ,OAAA,CAAAlC,UAAA,CAAAkC,OAAA,EAAA/B,IAAA,CAAAA,IAAA,KACA,IAAAoC,MAAA,IAAAG,YAAA,YAAAD,gBAAA,MAAAA,gBAAA,CAAAE,MAAA,CAAAC,MAAA,CAWA,MARA,CAAAL,MAAA,SACAK,MAAA,CAAAV,OAAA,CAAAsf,KAAA,EAAA7e,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAuf,KAAA,CAAA7e,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,kBACAC,MAAA,CAAAV,OAAA,CAAAma,OAAA,EAAA1Z,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAoa,OAAA,CAAA1Z,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACAJ,MACA,QAuBA,CAAAlF,IAAA,gBACAowB,aAAA,EACAjM,KAAA,CAAA/iB,EAAA,mCACA4d,OAAA,CAAA5d,EAAA,sHACA,EACAivB,YAAA,EACAnvB,KAAA,UACAovB,OAAA,EACAC,MAAA,EACAC,EAAA,CAAApvB,EAAA,mBACAqvB,MAAA,CAAArvB,EAAA,mBACA,CACA,CACA,EACAsvB,YAAA,EACAjB,OAAA,EACAnnB,QAAA,aACAqoB,WAAA,QACA,EACAC,eAAA,0DACA,EACA,IAAAC,YAAA,CAAAxxB,aAAA,EACAW,IAAA,gBAIAC,KAAA,OACA,CAAAqC,UAAA,MAAAnC,aAAA,GACA2wB,YAAA,CAAAA,CAAA,GAAAxuB,UAAA,CAAA4B,OAAA,SAAAwsB,YAAA,EACAK,UAAA,CAAAA,CAAA,GAAAzuB,UAAA,CAAA4B,OAAA,eACA8sB,YAAA,CAAAvL,KAAA,GACAnjB,UAAA,CAAAkB,EAAA,kBAAA2jB,MAAA,CAAA8J,QAAA,CAAAC,MAAA,IAAAhtB,OAAA,oCAAAA,OAAA,YAAAlE,IAAA,GAAAmwB,SAAA,CAAAC,aAAA,EAAAU,YAAA,CAAAC,UAAA,CAAAV,YAAA,EACA,MAAA5K,KAAA,CAAA0L,IAAA,GACA1L,KAAA,CAAA2L,YAAA,CAAA3L,KAAA,CAAA0L,IAAA,CACA,OAAA1L,KAAA,CAAA0L,IAAA,CACA7uB,UAAA,CAAA4B,OAAA,0BACA5B,UAAA,CAAAlC,KAAA,2BACAkC,UAAA,CAAA4V,GAAA,uBACA5V,UAAA,CAAA4B,OAAA,wBACA,GAEA,EACA5B,UAAA,CAAA2d,MAAA,UAAAzR,CAAA,CAAAiX,KAAA,GAAAuL,YAAA,CAAAvL,KAAA,EACA,CACA,GAEA,OAAAoL,YAEA,GAEA1xB,MCnGA,mHAAAC,CAAA,CAAAC,aAAA,CAAAgyB,aAAA,eAEAjyB,CAAA,CAAAA,CAAA,EAAAO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAV,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACAC,aAAA,CAAAA,aAAA,EAAAM,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAT,aAAA,YAAAA,aAAA,YAAAA,aAAA,CACAgyB,aAAA,CAAAA,aAAA,EAAA1xB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAuxB,aAAA,YAAAA,aAAA,YAAAA,aAAA,CAmBA,MAAAC,MAAA,CAAAD,aAAA,yDAKA,IAAAE,QAAA,CAAAlyB,aAAA,EACAW,IAAA,YAIAqgB,QAAA,EAEA,KAAAlgB,aAAA,GAAAqxB,YAAA,GAAAC,WAAA,MAAAxhB,OAAA,GACA,EAMAhQ,KAAA,EACA,MAAAqC,UAAA,MAAAnC,aAAA,GACA,IAAAuxB,oBAAA,CAAAhR,OAAA,CAAAC,OAAA,QACA,CAAAgR,cAAA,CAAAA,CAAA,IACA,MAAAvmB,OAAA,CAAA9I,UAAA,CAAAoL,cAAA,GACA,SAAAtC,OAAA,CAAAvD,cAAA,IAAAuD,OAAA,CAAAwmB,OAAA,EACA,EACAC,iBAAA,CAAApvB,KAAA,EACA,CAAArD,CAAA,CAAAkjB,QAAA,CAAA7f,KAAA,KAAAA,KAAA,CACA,EAEAA,KACA,CAGA,OAAAH,UAAA,CAAAwvB,cAAA,MAAA7hB,OAAA,IAAAwd,IAAA,CAAAsE,aAAA,QAOA,CAAAC,eAAA,CAAAC,SAAA,EACA,eAAAzyB,IAAA,CAAAyyB,SAAA,EAGAF,aAAA,CAAAnqB,OAAA,CAAAqqB,SAAA,EAFAvR,OAAA,CAAAzB,MAAA,KAAAiT,KAAA,wDAGA,CAQAC,cAAA,CAAAC,OAAA,GACA,MAAAC,aAAA,CAAAV,cAAA,GAIA,MAHA,CAAAD,oBAAA,CAAAA,oBAAA,CAAAjE,IAAA,KAAAuE,eAAA,CAAAK,aAAA,GAAA5E,IAAA,CAAA8D,QAAA,EAAAQ,aAAA,CAAAO,OAAA,CAAAD,aAAA,CAAAR,iBAAA,CAAAN,QAAA,EAAAM,iBAAA,CAAAO,OAAA,QAAAtD,KAAA,CAAAtJ,GAAA,GACA8L,MAAA,CAAAiB,IAAA,kCAAA/M,GAAA,EAAAA,GAAA,CAAAxG,OAAA,GACA,GACA0S,oBACA,EASAc,6BAAA,CAAAA,CAAA,IACA,MAAAH,aAAA,CAAAV,cAAA,GACA,OAAAD,oBAAA,CAAAjE,IAAA,KAAAuE,eAAA,CAAAK,aAAA,GAAA5E,IAAA,CAAA8D,QAAA,EAAAjvB,UAAA,CAAA6rB,QAAA,GAAAsE,mBAAA,EACAC,YAAA,CAAAb,iBAAA,CAAAN,QAAA,CACA,IAAAzC,KAAA,CAAAtJ,GAAA,GACA8L,MAAA,CAAAiB,IAAA,oCAAA/M,GAAA,EAAAA,GAAA,CAAAxG,OAAA,GACA,EACA,EAGA1c,UAAA,CAAAkB,EAAA,QAAA2uB,cAAA,EAAAlS,MAAA,gCAAAuS,6BAAA,EAKAhvB,EAAA,wBAAAyuB,SAAA,CAAAU,WAAA,IACAvzB,CAAA,CAAAwM,UAAA,CAAA+mB,WAAA,GACAA,WAAA,CAAAX,eAAA,CAAAC,SAAA,EAEA,EACA,EACA,CACA,GAEA,OAAAV,QAEA,GAEApyB,MCxHA,oIAAAC,CAAA,CAAAgC,EAAA,CAAAwxB,MAAA,CAAAtlB,SAAA,eA6MA,SAAAulB,YAAAnR,OAAA,CAAAD,WAAA,OACA,CAAAqR,eAAA,CAAAxlB,SAAA,CAAA9F,OAAA,CAAAka,OAAA,CAAAD,WAAA,CAAApW,UAAA,EACAuG,WAAA,CAAAtE,SAAA,CAAAtF,SAAA,CAAA0Z,OAAA,CAAAD,WAAA,CAAAe,YAAA,EACA,GAAA5Q,WAAA,CAAAzP,QAAA,EAAA2wB,eAAA,CAAArpB,QAAA,OACA,CAAAspB,YAAA,CAAA3zB,CAAA,CAAA4L,SAAA,CAAA0W,OAAA,EACAsR,gBAAA,CAAA1lB,SAAA,CAAAtF,SAAA,CAAA+qB,YAAA,CAAAtR,WAAA,CAAAe,YAAA,EAEA,MADA,CAAAwQ,gBAAA,CAAA7wB,QAAA,IACA4wB,YACA,CACA,OAAArR,OACA,CAMA,SAAA1b,cAAA,EACA,OACAuB,QAAA,GACA0rB,OAAA,GACA7wB,MAAA,GACA8wB,SAAA,GACAhtB,KAAA,EACA,CACA,CAQA,SAAAitB,YAAAjqB,KAAA,CAAAgK,OAAA,CAAA3L,QAAA,EACA2L,OAAA,CAAA3L,QAAA,EAAAA,QAAA,EACA2B,KAAA,CAAA3B,QAAA,GAEA2L,OAAA,CAAAhK,KAAA,CAAA9G,MAAA,GACA8G,KAAA,CAAA+pB,OAAA,GACA/f,OAAA,CAAAhK,KAAA,CAAA9G,MAAA,GAAA8Q,OAAA,CAAAhK,KAAA,CAAAhD,KAAA,EACAgD,KAAA,CAAA9G,MAAA,IAGA8Q,OAAA,CAAAhK,KAAA,CAAA/G,QAAA,EACA+Q,OAAA,CAAAhK,KAAA,CAAA/G,QAAA,GAAA+Q,OAAA,CAAAhK,KAAA,CAAAjD,SAAA,EACAiD,KAAA,CAAAgqB,SAAA,GAGAhqB,KAAA,CAAAhD,KAAA,EACA,CAQA,SAAA2F,gBAAA3C,KAAA,CAAAgK,OAAA,CAAA3L,QAAA,EACA2L,OAAA,CAAA3L,QAAA,EAAAA,QAAA,EACA2B,KAAA,CAAA3B,QAAA,GAEA2L,OAAA,CAAA9Q,MAAA,GACA8G,KAAA,CAAA+pB,OAAA,GACA/pB,KAAA,CAAA9G,MAAA,IAEA8Q,OAAA,CAAA/Q,QAAA,EACA+G,KAAA,CAAAgqB,SAAA,GAEAhqB,KAAA,CAAAhD,KAAA,EACA,CAOA,SAAAktB,qBAAAhrB,UAAA,EACA,IAAAirB,SAAA,CAAAjrB,UAAA,EAAAA,UAAA,CAAAvH,MAAA,CACA,OAAAwyB,SAAA,EAAAj0B,CAAA,CAAAoL,MAAA,CAAApC,UAAA,UAAAhC,GAAA,CAAAkC,QAAA,EAEA,MADA,CAAAlC,GAAA,CAAAkC,QAAA,KACAlC,GACA,KACA,CAYA,SAAAktB,iBAAA5R,OAAA,CAAAD,WAAA,CAAApe,MAAA,CAAAiG,KAAA,KACA,CAAAiqB,QAAA,CAAAV,WAAA,CAAAnR,OAAA,CAAAD,WAAA,EACA+R,SAAA,CAAAlmB,SAAA,CAAAxC,WAAA,CAAAyoB,QAAA,CAAA9R,WAAA,CAAAe,YAAA,CAAAlZ,KAAA,EACAJ,KAAA,CAAA9J,CAAA,CAAAosB,KAAA,CAAAgI,SAAA,CAAAtqB,KAAA,EACAuqB,iBAAA,CACAJ,SAAA,CA6BA,MA5BA,eAAAhwB,MAAA,CAAA2qB,SAAA,GACAyF,iBAAA,CAAAL,oBAAA,CAAA/vB,MAAA,CAAA+E,UAAA,EACAirB,SAAA,CAAAhwB,MAAA,CAAA+E,UAAA,EAAA/E,MAAA,CAAA+E,UAAA,CAAAvH,MAAA,CACAqI,KAAA,CAAAwqB,iBAAA,CAAA1tB,aAAA,IAEAkD,KAAA,CAAA1C,KAAA,CAAAR,aAAA,GACAkD,KAAA,CAAAtC,QAAA,CAAAZ,aAAA,GACAkD,KAAA,CAAAyqB,eAAA,CAAA3tB,aAAA,GACAkD,KAAA,CAAA0qB,kBAAA,CAAA5tB,aAAA,GACA5G,CAAA,CAAAyE,OAAA,CAAA2vB,SAAA,CAAAhtB,KAAA,UAAAG,IAAA,EACAwsB,WAAA,CAAAjqB,KAAA,CAAA1C,KAAA,CAAAG,IAAA,CAAA8a,WAAA,CAAAe,YAAA,EACA,EAAA7b,IAAA,CAAAuC,KAAA,CAAAjD,SAAA,EACAktB,WAAA,CAAAjqB,KAAA,CAAAyqB,eAAA,CAAAhtB,IAAA,CAAA8a,WAAA,CAAAe,YAAA,EAEApjB,CAAA,CAAAyE,OAAA,CAAA8C,IAAA,CAAAC,QAAA,UAAAC,OAAA,EACAssB,WAAA,CAAAjqB,KAAA,CAAAtC,QAAA,CAAAC,OAAA,CAAA4a,WAAA,CAAAe,YAAA,EACA,EAAA3b,OAAA,CAAAqC,KAAA,CAAAjD,SAAA,EACAktB,WAAA,CAAAjqB,KAAA,CAAA0qB,kBAAA,CAAA/sB,OAAA,CAAA4a,WAAA,CAAAe,YAAA,EAEA,eAAAnf,MAAA,CAAA2qB,SAAA,EACA5uB,CAAA,CAAAyE,OAAA,CAAAgD,OAAA,CAAAK,KAAA,UAAAjF,IAAA,EACA4xB,eAAA,CAAA5xB,IAAA,CAAAmG,UAAA,CAAAqrB,iBAAA,CAAAJ,SAAA,GACAxnB,eAAA,CAAA3C,KAAA,CAAAwqB,iBAAA,CAAAzxB,IAAA,CAAAwf,WAAA,CAAAe,YAAA,CAEA,EAEA,EACA,GACAtZ,KACA,CASA,SAAA2qB,gBAAAzrB,UAAA,CAAA0rB,kBAAA,CAAAC,SAAA,EACA,IAAAC,OAAA,GAWA,MAVA,CAAAF,kBAAA,EACA10B,CAAA,CAAAyE,OAAA,CAAAuE,UAAA,UAAAE,QAAA,EACA,GAAAwrB,kBAAA,CAAAxrB,QAAA,IACA0rB,OAAA,GACAA,OAAA,EAAAD,SAAA,EACA,QAGA,GAEAC,OAAA,GAAAD,SACA,CAQA,SAAAE,SAAA1sB,QAAA,CAAArB,KAAA,MAAAguB,UAAA,CAEAC,IAAA,CAAAC,KAAA,OADA,CAAA7sB,QAAA,IAAArB,KAAA,CACAguB,UAAA,MAAA3sB,QAAA,CAAArB,KAAA,GAEA,CACA,CAYA,SAAAmuB,oBAAA9sB,QAAA,CAAArB,KAAA,CAAA8W,IAAA,CAAA3Z,MAAA,KACA,CAAAixB,QAAA,CAAA/D,MAAA,CAAAvT,IAAA,GAAAuT,MAAA,CAAAtuB,IAAA,CACAsyB,OAAA,CAAAlxB,MAAA,CAAAmxB,SAAA,CAAAF,QAAA,CAAAG,IAAA,CAAAH,QAAA,CAAAI,KAAA,CACA,OAAA9B,MAAA,CAAA2B,OAAA,CAAAhtB,QAAA,MAAArB,KAAA,MACA,CAYA,SAAAyuB,uBAAAptB,QAAA,CAAArB,KAAA,CAAA8W,IAAA,CAAA3Z,MAAA,EACA,OACAkE,QAAA,CAAAA,QAAA,IACArB,KAAA,CAAAA,KAAA,IACA0uB,KAAA,CAAAX,QAAA,CAAA1sB,QAAA,CAAArB,KAAA,EACAkJ,KAAA,CAAAilB,mBAAA,CAAA9sB,QAAA,CAAArB,KAAA,CAAA8W,IAAA,CAAA3Z,MAAA,CACA,CACA,CAQA,SAAAwxB,oBAAAttB,QAAA,CAAArB,KAAA,EACA,IAAA0uB,KAAA,CAAAX,QAAA,CAAA1sB,QAAA,CAAArB,KAAA,EACA,OACAqB,QAAA,CAAAA,QAAA,IACArB,KAAA,CAAAA,KAAA,IACA0uB,KAAA,CAAAA,KAAA,CACAxlB,KAAA,IAAAwlB,KAAA,GACA,CACA,CAjaAx1B,CAAA,CAAAA,CAAA,EAAAO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAV,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACAgC,EAAA,CAAAA,EAAA,EAAAzB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAsB,EAAA,YAAAA,EAAA,YAAAA,EAAA,CACAwxB,MAAA,CAAAA,MAAA,EAAAjzB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA8yB,MAAA,YAAAA,MAAA,YAAAA,MAAA,CACAtlB,SAAA,CAAAA,SAAA,EAAA3N,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAwN,SAAA,YAAAA,SAAA,YAAAA,SAAA,IA6DA,CAAAwgB,aAAA,EACAxkB,KAAA,QACA0kB,SAAA,cACAwG,SAAA,IACApsB,UAAA,GACA,EAMAmoB,MAAA,EACAtuB,IAAA,EACAwyB,IAAA,CAAArzB,EAAA,kBACAszB,KAAA,CAAAtzB,EAAA,WACA,EACAyF,OAAA,EACA4tB,IAAA,CAAArzB,EAAA,qBACAszB,KAAA,CAAAtzB,EAAA,cACA,CACA,EAMA0zB,MAAA,EAUAt1B,IAAA,UAAAA,KAAAkiB,OAAA,CAAAD,WAAA,CAAApe,MAAA,KACA,CAAA6F,KAAA,CAAAoqB,gBAAA,CAAA5R,OAAA,CAAAD,WAAA,CAAApe,MAAA,SACApB,IAAA,CAAAqL,SAAA,CAAAtF,SAAA,CAAA0Z,OAAA,CAAAD,WAAA,CAAAe,YAAA,EAEA,MADA,CAAAtZ,KAAA,CAAA3B,QAAA,CAAAtF,IAAA,CAAAsF,QAAA,GACA2B,KACA,EAUA8Y,QAAA,UAAAA,SAAAN,OAAA,CAAAD,WAAA,CAAApe,MAAA,KACA,CAAA6F,KAAA,CAAAoqB,gBAAA,CAAA5R,OAAA,CAAAD,WAAA,CAAApe,MAAA,aACApB,IAAA,CAAAqL,SAAA,CAAAtF,SAAA,CAAA0Z,OAAA,CAAAD,WAAA,CAAAe,YAAA,EAEA,MADA,CAAAtZ,KAAA,CAAA3B,QAAA,CAAAtF,IAAA,CAAAkL,cAAA,GACAjE,KACA,EAUA6rB,WAAA,UAAAA,YAAArT,OAAA,CAAAD,WAAA,CAAApe,MAAA,KACA,CAAA6F,KAAA,CAAAoqB,gBAAA,CAAA5R,OAAA,CAAAD,WAAA,CAAApe,MAAA,gBACApB,IAAA,CAAAqL,SAAA,CAAAtF,SAAA,CAAA0Z,OAAA,CAAAD,WAAA,CAAAe,YAAA,EAEA,MADA,CAAAtZ,KAAA,CAAA3B,QAAA,CAAAtF,IAAA,CAAAmL,iBAAA,GACAlE,KACA,CACA,EAMA8rB,UAAA,EAMAC,UAAA,UAAAA,WAAA/rB,KAAA,EACA,OAAA2rB,mBAAA,CAAA3rB,KAAA,CAAA/G,QAAA,CAAA+G,KAAA,CAAAjD,SAAA,CACA,EASAsB,QAAA,UAAAA,SAAA2B,KAAA,CAAA7F,MAAA,EACA,OAAAsxB,sBAAA,CAAAzrB,KAAA,CAAA3B,QAAA,CAAA2B,KAAA,CAAAhD,KAAA,QAAA7C,MAAA,CACA,EASA4C,SAAA,UAAAA,UAAAiD,KAAA,CAAA7F,MAAA,EACA,OAAAsxB,sBAAA,CAAAzrB,KAAA,CAAA/C,eAAA,CAAA+C,KAAA,CAAAjD,SAAA,QAAA5C,MAAA,CACA,EASAuD,QAAA,UAAAA,SAAAsC,KAAA,CAAA7F,MAAA,EACA,OAAAsxB,sBAAA,CAAAzrB,KAAA,CAAA0qB,kBAAA,CAAAX,OAAA,CAAA/pB,KAAA,CAAA0qB,kBAAA,CAAA1tB,KAAA,WAAA7C,MAAA,CACA,EASA+E,UAAA,UAAAA,WAAAc,KAAA,CAAA7F,MAAA,EACA,OAAAsxB,sBAAA,CAAAzrB,KAAA,CAAAwqB,iBAAA,CAAAnsB,QAAA,CAAA2B,KAAA,CAAAwqB,iBAAA,CAAAxtB,KAAA,QAAA7C,MAAA,CACA,CACA,EA+NA6xB,QAAA,EAOAC,mBAAA,UAAAC,gBAAAhtB,UAAA,CAAA0rB,kBAAA,KACA,CAAAL,iBAAA,CAAAL,oBAAA,CAAAU,kBAAA,EACAT,SAAA,CAAAS,kBAAA,EAAAA,kBAAA,CAAAjzB,MAAA,CACA,OAAAgzB,eAAA,CAAAzrB,UAAA,CAAAqrB,iBAAA,CAAAJ,SAAA,CACA,EAUAnoB,aAAAwW,OAAA,CAAAD,WAAA,CAAApe,MAAA,OACA,CAAA2e,QAAA,CAAA1U,SAAA,CAAA9F,OAAA,CAAAka,OAAA,CAAAD,WAAA,CAAApW,UAAA,EACAgqB,aAAA,CAAAhyB,MAAA,CAAAiG,KAAA,EAAAwrB,MAAA,CAAAzxB,MAAA,CAAAiG,KAAA,GAAAwrB,MAAA,CAAAt1B,IAAA,CACA0J,KAAA,CAAAmsB,aAAA,CAAA3T,OAAA,CAAAD,WAAA,CAAApe,MAAA,EAAAyqB,aAAA,EAOA,MANA,CAAA5kB,KAAA,CAAAosB,OAAA,CAAA5T,OAAA,CAAAxY,KAAA,CAAAhD,KAAA,CAEAgD,KAAA,CAAAqsB,gBAAA,CADAvT,QAAA,EAAAA,QAAA,CAAAvY,QAAA,CACAiY,OAAA,CAAAxY,KAAA,CAAA/G,QAAA,GAEAuf,OAAA,CAAAxY,KAAA,CAAA/G,QAAA,CAEA+G,KACA,EASAssB,gBAAA,UAAAA,iBAAAtsB,KAAA,CAAA8T,IAAA,CAAA3Z,MAAA,EACA,IAAAoyB,iBAAA,CAAAzY,IAAA,EAAAgY,UAAA,CAAAhY,IAAA,GAAAgY,UAAA,CAAAC,UAAA,CACA,OAAAQ,iBAAA,CAAAvsB,KAAA,KAAA7F,MAAA,EAAAyqB,aAAA,CACA,EAWA4H,eAAA,UAAAA,gBAAAhU,OAAA,CAAAD,WAAA,CAAApe,MAAA,EACA,IAAAsyB,YAAA,CAGA,MAFA,CAAAtyB,MAAA,CAAAjE,CAAA,CAAAmE,QAAA,CAAAF,MAAA,KAAAyqB,aAAA,EACA6H,YAAA,MAAAzqB,YAAA,CAAAwW,OAAA,CAAAD,WAAA,CAAApe,MAAA,EACA,KAAAmyB,gBAAA,CAAAG,YAAA,CAAAtyB,MAAA,CAAA2qB,SAAA,CAAA3qB,MAAA,CACA,CACA,EAEA,OAAA6xB,QAEA,GAEA/1B,MCveA,uJAAAuD,SAAA,CAAAC,UAAA,CAAAC,QAAA,CAAAgzB,WAAA,eAiBA,SAAAC,cAAA/yB,IAAA,CAAAC,OAAA,CAAAC,QAAA,EACA,IAAAC,IAAA,CAAAC,QAAA,CAAAJ,IAAA,CAAAC,OAAA,EACA,OAAAC,QAAA,KAAAC,IAAA,CAAAE,CAAA,CAAAF,IAAA,CACA,CAkCA,SAAA6yB,4BAAAzyB,MAAA,CAAAsyB,YAAA,EACA,IAAAI,WAAA,EAKA7kB,MAAA,UAAAA,OAAApO,IAAA,EACA6yB,YAAA,CAAA7yB,IAAA,CACA,KAAAP,EAAA,mBAAAyzB,QAAA,GACA,KAAAA,QAAA,CAAAC,MAAA,CAAAtkB,IAAA,CAAAgkB,YAAA,CAAAvmB,KAAA,EACA,KAAA4mB,QAAA,CAAAE,IAAA,CAAAN,WAAA,SAAAD,YAAA,CAAAf,KAAA,GAQA,KAAA1wB,OAAA,UAAApB,IAAA,CACA,CACA,EACA,OAAAJ,SAAA,CAAAqzB,WAAA,CAAAxyB,QAAA,EAAAiB,WAAA,CAAAqxB,aAAA,EAAAryB,EAAA,qBAEA,KAAAwyB,QAAA,EACAC,MAAA,MAAAjyB,UAAA,GAAAxD,IAAA,sCACA01B,IAAA,MAAAlyB,UAAA,GAAAxD,IAAA,mCACA,EAGA,KAAA6C,MAAA,CAAA8yB,SAAA,EACA,KAAAH,QAAA,CAAAC,MAAA,CAAA1X,IAAA,GAIA,KAAAyX,QAAA,CAAAE,IAAA,CAAAN,WAAA,GAGAD,YAAA,EACA,KAAAzkB,MAAA,CAAAykB,YAAA,EAIA,KAAApzB,EAAA,YACA,KAAAgc,IAAA,EAEA,GAAA/a,EAAA,sBACA,KAAAwyB,QAAA,KACA,GAAA/1B,IAAA,CAAAoD,MAAA,CACA,CApGAX,SAAA,CAAAA,SAAA,EAAA/C,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA4C,SAAA,YAAAA,SAAA,YAAAA,SAAA,CACAC,UAAA,CAAAA,UAAA,EAAAhD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6C,UAAA,YAAAA,UAAA,YAAAA,UAAA,CACAC,QAAA,CAAAA,QAAA,EAAAjD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA8C,QAAA,YAAAA,QAAA,YAAAA,QAAA,CAEAA,QAAA,CAAA8B,aAAA,GACA9B,QAAA,CAAAD,UAAA,EACAC,QAAA,CAAA8B,aAAA,QAEA,CAAAxB,QAAA,CAAAP,UAAA,CAAAgC,QAAA,UAAAhC,UAAA,CAAAiC,MAAA,CAAAC,OAAA,CAAAC,QAAA,CAAAhC,IAAA,EAKA,MAJA,MAAAkC,YAAA,gBACAH,OAAA,MAAAI,KAAA,CAAAJ,OAAA,CAAAlC,UAAA,CAAAkC,OAAA,EAGA,uMACA,GA4BAtB,QAAA,EACA4yB,SAAA,GACA,EA0DA,OAAAL,2BAEA,GAEA32B,MC5GA,6IAAAC,CAAA,CAAAsD,SAAA,CAAAC,UAAA,CAAAC,QAAA,eAkBA,SAAAwzB,YAAAtzB,IAAA,CAAAC,OAAA,CAAAC,QAAA,EACA,IAAAC,IAAA,CAAAC,QAAA,CAAAJ,IAAA,CAAAC,OAAA,EACA,OAAAC,QAAA,KAAAC,IAAA,CAAAE,CAAA,CAAAF,IAAA,CACA,CAwBA,SAAAozB,SAAAvzB,IAAA,CAAAC,OAAA,CAAAC,QAAA,EACA,IAAAC,IAAA,CAAAqzB,UAAA,CAAAxzB,IAAA,CAAAC,OAAA,EACA,OAAAC,QAAA,KAAAC,IAAA,CAAAE,CAAA,CAAAF,IAAA,CACA,CAkCA,SAAAszB,0BAAAlzB,MAAA,CAAAsyB,YAAA,KACA,CAAAa,KAAA,GACAT,WAAA,EAKA7kB,MAAA,UAAAA,OAAApO,IAAA,EACA6yB,YAAA,CAAA7yB,IAAA,CACA,KAAAP,EAAA,mBAAAyzB,QAAA,GACAQ,KAAA,GAAAb,YAAA,CAAAzvB,KAAA,GAEAswB,KAAA,CAAAb,YAAA,CAAAzvB,KAAA,CACA,KAAA8vB,QAAA,CAAAE,IAAA,CAAAxI,KAAA,GAAA1b,MAAA,CAAAqkB,QAAA,CAAAj3B,CAAA,CAAAq3B,KAAA,CAAAD,KAAA,KAEA,KAAAR,QAAA,CAAAC,MAAA,CAAAtkB,IAAA,CAAAgkB,YAAA,CAAAvmB,KAAA,EACA,KAAA4mB,QAAA,CAAAE,IAAA,CAEAQ,QAAA,GAAAllB,WAAA,oBAEAlH,KAAA,GAAAqrB,YAAA,CAAApuB,QAAA,EAAAkK,QAAA,YAEAnH,KAAA,KAAAmH,QAAA,aAQA,KAAAvN,OAAA,UAAApB,IAAA,CACA,CACA,EACA,OAAAJ,SAAA,CAAAqzB,WAAA,CAAAxyB,QAAA,EAAAiB,WAAA,CAAA4xB,WAAA,EAAA5yB,EAAA,qBAEA,KAAAwyB,QAAA,EACAC,MAAA,MAAAjyB,UAAA,GAAAxD,IAAA,sCACA01B,IAAA,MAAAlyB,UAAA,GAAAxD,IAAA,uDACA,EAGA,KAAA6C,MAAA,CAAA8yB,SAAA,EACA,KAAAH,QAAA,CAAAC,MAAA,CAAA1X,IAAA,GAIAoX,YAAA,EACA,KAAAzkB,MAAA,CAAAykB,YAAA,EAIA,KAAApzB,EAAA,YACA,KAAAgc,IAAA,EAEA,GAAA/a,EAAA,sBACA,KAAAwyB,QAAA,KACA,GAAA/1B,IAAA,CAAAoD,MAAA,CACA,CAzIAjE,CAAA,CAAAA,CAAA,EAAAO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAV,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACAsD,SAAA,CAAAA,SAAA,EAAA/C,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA4C,SAAA,YAAAA,SAAA,YAAAA,SAAA,CACAC,UAAA,CAAAA,UAAA,EAAAhD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6C,UAAA,YAAAA,UAAA,YAAAA,UAAA,CACAC,QAAA,CAAAA,QAAA,EAAAjD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA8C,QAAA,YAAAA,QAAA,YAAAA,QAAA,CAEAA,QAAA,CAAA8B,aAAA,GACA9B,QAAA,CAAAD,UAAA,EACAC,QAAA,CAAA8B,aAAA,KAEA,IAAAxB,QAAA,CAAAP,UAAA,CAAAgC,QAAA,UAAAhC,UAAA,CAAAiC,MAAA,CAAAC,OAAA,CAAAC,QAAA,CAAAhC,IAAA,EAKA,MAJA,MAAAkC,YAAA,gBACAH,OAAA,MAAAI,KAAA,CAAAJ,OAAA,CAAAlC,UAAA,CAAAkC,OAAA,EAGA,0PACA,GAMAjC,QAAA,CAAA8B,aAAA,GACA9B,QAAA,CAAAD,UAAA,EACAC,QAAA,CAAA8B,aAAA,QAEA,CAAA4xB,UAAA,CAAA3zB,UAAA,CAAAgC,QAAA,UAAAhC,UAAA,CAAAiC,MAAA,CAAAC,OAAA,CAAAC,QAAA,CAAAhC,IAAA,EAKA,SAAAiC,SAAAH,MAAA,CAAA9B,IAAA,EAEA,IAAAoC,MAAA,IAIA,MAHA,CAAAA,MAAA,sDACAE,gBAAA,qBAAAR,MAAA,CAAAA,MAAA,CAAAif,KAAA,CAAAjf,MAAA,EAAAA,MAAA,EACA,eACAM,MACA,CAXA,KAAAF,YAAA,gBACAH,OAAA,MAAAI,KAAA,CAAAJ,OAAA,CAAAlC,UAAA,CAAAkC,OAAA,EAAA/B,IAAA,CAAAA,IAAA,KACA,IAAAuC,YAAA,YAAAD,gBAAA,MAAAA,gBAAA,CAAAlF,IAAA,MAAAoF,MAAA,OAWA,CAAAA,MAAA,CAAAT,OAAA,CAAA6G,IAAA,CAAA5L,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAY,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA2F,IAAA,CAAAC,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,GAAAhB,QAAA,CAAAjC,IAAA,EAAAA,IAAA,CAAAA,IAAA,GACAwC,MAAA,MAAAA,MAAA,CAAAA,MAAA,CACA,EACA,GA4BA/B,QAAA,EACA4yB,SAAA,GACA,EAmEA,OAAAI,yBAEA,GAEAp3B,MCjJA,oUAAAE,aAAA,CAAAiO,SAAA,CAAAqpB,cAAA,CAAAC,yBAAA,CAAAC,uBAAA,eAEAx3B,aAAA,CAAAA,aAAA,EAAAM,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAT,aAAA,YAAAA,aAAA,YAAAA,aAAA,CACAiO,SAAA,CAAAA,SAAA,EAAA3N,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAwN,SAAA,YAAAA,SAAA,YAAAA,SAAA,CACAqpB,cAAA,CAAAA,cAAA,EAAAh3B,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA62B,cAAA,YAAAA,cAAA,YAAAA,cAAA,CACAC,yBAAA,CAAAA,yBAAA,EAAAj3B,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA82B,yBAAA,YAAAA,yBAAA,YAAAA,yBAAA,CACAC,uBAAA,CAAAA,uBAAA,EAAAl3B,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA+2B,uBAAA,YAAAA,uBAAA,YAAAA,uBAAA,IAwBA,CAAAC,SAAA,EACA7B,UAAA,CAAA2B,yBAAA,CACArvB,QAAA,CAAAsvB,uBACA,EAKAjB,WAAA,CAAAv2B,aAAA,EACAW,IAAA,eAIAC,IAAA,UAAAA,KAAA,OACA,CAAAqC,UAAA,MAAAnC,aAAA,GACA42B,gBAAA,CAAAz0B,UAAA,CAAAsL,UAAA,GACAvK,MAAA,CAAA1D,MAAA,CAAAkL,MAAA,IAAAksB,gBAAA,CAAAC,iBAAA,UAAA1kB,SAAA,IACApS,IAAA,SACA,CAAA+2B,eAAA,CAAAH,SAAA,CAAAzzB,MAAA,CAAA6zB,QAAA,GAAAJ,SAAA,CAAA7B,UAAA,CACAkC,cAAA,EACAnJ,SAAA,CAAA3qB,MAAA,CAAA2Z,IAAA,eACA1T,KAAA,CAAAjG,MAAA,CAAAiG,KAAA,SACA6sB,SAAA,CAAA9yB,MAAA,CAAA8yB,SAAA,CACA3B,SAAA,CAAAnxB,MAAA,CAAAmxB,SAAA,CACApsB,UAAA,CAAA/E,MAAA,CAAA+E,UACA,EACAgvB,iBAAA,UAAAA,kBAAAn1B,IAAA,EACA,OAAAA,IAAA,EAAAA,IAAA,CAAA8J,aAAA,gBAAAorB,cAAA,CAAAnJ,SACA,EACAqJ,kBAAA,SAAAA,CAAAp1B,IAAA,EACA,OAAAA,IAAA,iBAAAk1B,cAAA,CAAAnJ,SAAA,GAAA2I,cAAA,CAAAxB,mBAAA,CAAAlzB,IAAA,CAAAmG,UAAA,CAAA+uB,cAAA,CAAA/uB,UAAA,CACA,EAKAkvB,mBAAA,UAAAA,oBAAAr1B,IAAA,EACA,OAAAm1B,iBAAA,CAAAn1B,IAAA,GAAAo1B,kBAAA,CAAAp1B,IAAA,CACA,EAKAiP,MAAA,UAAAA,OAAA,KACA,CAAAuQ,WAAA,CAAAnf,UAAA,CAAAoL,cAAA,GACAgU,OAAA,CAAApf,UAAA,CAAAmL,UAAA,GACAxL,IAAA,CAAAqL,SAAA,CAAAtF,SAAA,CAAA0Z,OAAA,CAAAD,WAAA,CAAAe,YAAA,EACA8U,mBAAA,CAAAr1B,IAAA,EACA/B,IAAA,CAAAg3B,QAAA,CAAA3Y,IAAA,IAEAre,IAAA,CAAAg3B,QAAA,CAAA3Z,IAAA,GACArd,IAAA,CAAAg3B,QAAA,CAAAhmB,MAAA,CAAAylB,cAAA,CAAAjB,eAAA,CAAAhU,OAAA,CAAAD,WAAA,CAAA0V,cAAA,GAEA,EAGA,KAAAD,QAAA,CAAAD,eAAA,CAAAE,cAAA,EAGAjmB,MAAA,GACA5O,UAAA,CAAAkB,EAAA,kBAAA0N,MAAA,CACA,EAIAF,MAAA,UAAAA,OAAA,EACA,IAAA0M,UAAA,MAAApd,aAAA,GAAA2Q,cAAA,GACA,KAAAimB,QAAA,CAAAlmB,MAAA,CAAA0M,UAAA,CACA,EAIAxO,OAAA,UAAAA,QAAA,EACA,KAAAgoB,QAAA,EACA,KAAAA,QAAA,CAAAhoB,OAAA,GAEA,KAAAgoB,QAAA,KACA,EAIA3Z,IAAA,UAAAA,KAAA,EACA,KAAA2Z,QAAA,EACA,KAAAA,QAAA,CAAA3Z,IAAA,EAEA,EAIAgB,IAAA,UAAAA,KAAA,EACA,KAAA2Y,QAAA,EACA,KAAAA,QAAA,CAAA3Y,IAAA,EAEA,CACA,GAEA,OAAAqX,WAEA,GAEAz2B,MClIA,uGAAAC,CAAA,CAAAC,aAAA,eAEAD,CAAA,CAAAA,CAAA,EAAAO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAV,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACAC,aAAA,CAAAA,aAAA,EAAAM,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAT,aAAA,YAAAA,aAAA,YAAAA,aAAA,CAwBA,IAAAk4B,SAAA,CAAAl4B,aAAA,EACAW,IAAA,aAIAqgB,OAAA,UAAAA,QAAA,EACA,IAAA/d,UAAA,MAAAnC,aAAA,GAGAmC,UAAA,CAAA6rB,QAAA,GAAAqJ,GAAA,UAAAC,UAAAC,GAAA,CAAAC,GAAA,CAAArhB,IAAA,EACA,IAAAxT,IAAA,CAAA60B,GAAA,EAAAA,GAAA,CAAA70B,IAAA,OAGA,CAAAA,IAAA,EAAAA,IAAA,CAAAka,IAAA,gBAAAla,IAAA,CAAAka,IAAA,GAAA1a,UAAA,CAAA4a,QAAA,uBAEA5a,UAAA,CAAAijB,QAAA,8BACAjjB,UAAA,CAAA4a,QAAA,WAIA9d,CAAA,CAAA0iB,OAAA,CAAAhf,IAAA,CAAA80B,QAAA,IAAAx4B,CAAA,CAAAoB,IAAA,CAAAsC,IAAA,CAAA80B,QAAA,EACAC,OAAA,YACA,KACAv1B,UAAA,CAAA4B,OAAA,SAAApB,IAAA,EAJAR,UAAA,CAAA4B,OAAA,kBAUA,CAAAoS,IAAA,EACA,EACA,EAIArW,IAAA,UAAAA,KAAA,KACA,CAAAqC,UAAA,MAAAnC,aAAA,GACA23B,SAAA,IAGAx1B,UAAA,CAAA6rB,QAAA,GAAA0J,OAAA,sBAAA/0B,IAAA,EACAg1B,SAAA,GAAAh1B,IAAA,YAAAA,IAAA,CAAAka,IAAA,YAAAla,IAAA,CAAAka,IAAA,EAAA1a,UAAA,CAAA4a,QAAA,wBACA4a,SAAA,IACA,UAAAh1B,IAAA,CAAAka,IAAA,CACA1a,UAAA,CAAA4B,OAAA,SAAApB,IAAA,GAEAR,UAAA,CAAAijB,QAAA,yBACAjjB,UAAA,CAAA4B,OAAA,SAAApB,IAAA,GAGA,EACA,CACA,GAEA,OAAAy0B,SAEA,GAEAp4B,MCrFA,+DAAAiC,EAAA,eAQA,SAAA22B,gBAAAC,KAAA,CAAAC,OAAA,CAAAC,OAAA,CAAAC,mBAAA,CAAA7uB,KAAA,EACA,IAAA8uB,YAAA,MACA,CAAAC,OAAA,EAAAL,KAAA,CAAAC,OAAA,CAAAC,OAAA,EACAI,UAAA,IACA,CAAAl3B,EAAA,UAAAA,EAAA,YAAAA,EAAA,aAAAyC,OAAA,EAAA00B,IAAA,CAAAC,GAAA,IACA,EAAAH,OAAA,CAAAG,GAAA,GACAF,UAAA,CAAAtlB,IAAA,IAAAqlB,OAAA,CAAAG,GAAA,KAAAD,IAAA,GAEA,GACA,IAAAE,eAAA,CACA,IAAAN,mBAAA,WAAA7uB,KAAA,CACAmvB,eAAA,CAAAr3B,EAAA,6BACA,CACA,IAAAs3B,gBAAA,CAAAt3B,EAAA,cACA,IAAA+2B,mBAAA,GACAO,gBAAA,CAAAt3B,EAAA,cAEAq3B,eAAA,CAAAr3B,EAAA,mBAAA+2B,mBAAA,CAAAO,gBAAA,CACA,CAMA,MAJA,CAAAN,YAAA,CADA,IAAAE,UAAA,CAAAz3B,MAAA,CACAO,EAAA,kCAAAq3B,eAAA,EAEAr3B,EAAA,mBAAAk3B,UAAA,CAAAK,IAAA,OAAAF,eAAA,EAEAL,YACA,CAEA,MAjCA,CAAAh3B,EAAA,CAAAA,EAAA,EAAAzB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAsB,EAAA,YAAAA,EAAA,YAAAA,EAAA,CAiCA22B,eAEA,GCpCA54B,MAAA,yFACAA,MCFA,mTAAAsQ,GAAA,CAAArQ,CAAA,CAAAw5B,WAAA,CAAAl2B,SAAA,CAAAC,UAAA,CAAAC,QAAA,CAAAm1B,eAAA,CAAAc,OAAA,CAAAC,aAAA,CAAAC,MAAA,eAiDA,SAAAC,aAAAl2B,IAAA,CAAAC,OAAA,CAAAC,QAAA,EACA,IAAAC,IAAA,CAAAC,QAAA,CAAAJ,IAAA,CAAAC,OAAA,EACA,OAAAC,QAAA,KAAAC,IAAA,CAAAE,CAAA,CAAAF,IAAA,CACA,CA6DA,SAAAg2B,iBAAAvb,UAAA,CAAAra,MAAA,KACA,CAAA61B,KAAA,CACAC,iBAAA,CAKA,IAAAC,SAAA,CAAA12B,SAAA,EASAwO,MAAA,UAAAmoB,OAAAC,aAAA,CAAAnB,mBAAA,KACA,CAAAj4B,IAAA,MACAq5B,WAAA,CACAC,SAAA,CACAC,cAAA,CACA,SAAAl3B,EAAA,eAMA,GAJA,KAAA+2B,aAAA,CADA,GAAAA,aAAA,CACA,EAEAvW,QAAA,CAAAuW,aAAA,KAEA,KAAA/2B,EAAA,mBAAAA,EAAA,aAEA,GADAg3B,WAAA,CAAAX,WAAA,CAAAc,MAAA,MAAAJ,aAAA,OACAC,WAAA,QAAAA,WAAA,EACA,KAAAA,WAAA,CAAAA,WAAA,MACA,CAAAI,IAAA,CAAAZ,MAAA,CAAAxH,QAAA,MAAA+H,aAAA,iBACAtB,KAAA,CAAA2B,IAAA,CAAAnmB,GAAA,UACAykB,OAAA,CAAA0B,IAAA,CAAAnmB,GAAA,YACA0kB,OAAA,CAAAyB,IAAA,CAAAnmB,GAAA,YACA0lB,KAAA,CAAAvnB,IAAA,MAAA4nB,WAAA,EACAJ,iBAAA,CAAAxnB,IAAA,CAAAomB,eAAA,CAAAC,KAAA,CAAAC,OAAA,CAAAC,OAAA,CAAAC,mBAAA,MAAA90B,MAAA,CAAAiG,KAAA,EACA,CAuBA,GAtBA,KAAAswB,QAAA,GAEAJ,SAAA,CAAAp6B,CAAA,CAAAy6B,WAAA,MAAAD,QAAA,UAAAjU,OAAA,EACA,OAAAA,OAAA,GAAAA,OAAA,CAAAmU,KAAA,IAAAnU,OAAA,CAAAoU,SAAA,EAAApU,OAAA,CAAAoU,SAAA,EAAA75B,IAAA,CAAAo5B,aACA,GACAE,SAAA,GACA,KAAAI,QAAA,CAAAJ,SAAA,EAAAM,KAAA,IAEAL,cAAA,CADAr6B,CAAA,CAAAwM,UAAA,MAAAguB,QAAA,CAAAJ,SAAA,EAAAxa,OAAA,EACA,KAAA4a,QAAA,CAAAJ,SAAA,EAAAxa,OAAA,MAAAsa,aAAA,EAEA,KAAAM,QAAA,CAAAJ,SAAA,EAAAxa,OAAA,CASA,KAAA9a,OAAA,QAAAu1B,cAAA,MAAAG,QAAA,CAAAJ,SAAA,EAAAQ,KAAA,IAGA,KAAAC,uBAAA,EAEA,MAAAC,qBAAA,CAAA96B,CAAA,CAAAy6B,WAAA,MAAAI,uBAAA,CAAAtU,OAAA,EAAAA,OAAA,GAAAA,OAAA,CAAAmU,KAAA,IAAAnU,OAAA,CAAAoU,SAAA,EAAApU,OAAA,CAAAoU,SAAA,EAAA75B,IAAA,CAAAo5B,aAAA,EACAY,qBAAA,GACA,KAAAD,uBAAA,CAAAC,qBAAA,EAAAJ,KAAA,IASA,KAAA51B,OAAA,yBAAA+1B,uBAAA,CAAAC,qBAAA,EAAAlb,OAAA,CAAA9e,IAAA,CAAAo5B,aAAA,MAAAW,uBAAA,CAAAC,qBAAA,EAAA5wB,KAAA,EAEA,CAQA,KAAApF,OAAA,eAAAo1B,aAAA,CAAAC,WAAA,CACA,CACA,SAAAD,aAAA,EACA,KAAAa,QAAA,EAEA,CACA,WACA,EAMAxS,KAAA,UAAAA,MAAA,EAWA,MAVA,MAAAplB,EAAA,mBAAAA,EAAA,kBAAAA,EAAA,gBACA,KAAAgd,MAAA,GACA,KAAAgG,QAAA,eAMA,KAAArhB,OAAA,WAEA,IACA,EAMA0jB,IAAA,UAAAA,KAAA,EAUA,MATA,MAAArlB,EAAA,mBAAAA,EAAA,cACA,KAAAgjB,QAAA,eAMA,KAAArhB,OAAA,UAEA,IACA,EAUAi2B,QAAA,UAAAA,SAAA,EAYA,MAXA,MAAA53B,EAAA,mBAAAA,EAAA,mBAAAA,EAAA,gBACA,KAAAqlB,IAAA,GACA,KAAArC,QAAA,iBAOA,KAAArhB,OAAA,kBAEA,IACA,CACA,EAAAX,QAAA,EAAAC,EAAA,mBACA,KAAA81B,aAAA,MAAAj2B,MAAA,CAAAi2B,aAAA,CACA,KAAAnB,mBAAA,MAAA90B,MAAA,CAAA80B,mBAAA,CACA,KAAA90B,MAAA,CAAAu2B,QAAA,GACA,KAAAA,QAAA,CAAAx6B,CAAA,CAAA6N,MAAA,MAAA5J,MAAA,CAAAu2B,QAAA,eAEA,KAAAv2B,MAAA,CAAA42B,uBAAA,GACA,KAAAA,uBAAA,CAAA76B,CAAA,CAAA6N,MAAA,MAAA5J,MAAA,CAAA42B,uBAAA,eAIA,KAAAjpB,MAAA,CAAA0M,UAAA,CACA,GAAAla,EAAA,qBACA01B,KAAA,CAAAzpB,GAAA,cAAAzL,UAAA,IACAm1B,iBAAA,CAAA1pB,GAAA,4BAAAzL,UAAA,IACA,UAAAX,MAAA,CAAA+2B,eAAA,EACAlB,KAAA,CAAAvnB,IAAA,CAAAinB,WAAA,CAAAc,MAAA,MAAAJ,aAAA,OAEA,GAAA91B,EAAA,iBAAAwb,OAAA,CAAAgb,KAAA,EACA,IAAAK,gBAAA,CACAL,KAAA,CAAAA,KAAA,YACA,KAAAz3B,EAAA,mBAAAA,EAAA,aAAAnD,CAAA,CAAAk7B,QAAA,CAAAtb,OAAA,IAAA5f,CAAA,CAAA0iB,OAAA,CAAA9C,OAAA,IACAka,KAAA,CAAA1nB,WAAA,0DAAAC,QAAA,QAAAuoB,KAAA,IACA,UAAA32B,MAAA,CAAAk3B,cAAA,GACAF,gBAAA,CAAAxB,OAAA,CAAA2B,MAAA,MAAAx2B,UAAA,GAAAgb,OAAA,EACA9a,OAAA,UACAu2B,KAAA,CAAAT,KAAA,CACAU,SAAA,SACA,GACAL,gBAAA,CAAA9c,IAAA,GACAod,UAAA,YACAN,gBAAA,CAAA9b,IAAA,GACA8b,gBAAA,CAAAO,OAAA,EACA,EAAAC,cAAA,CAAAb,KAAA,SAGA,GAKA,MAJA,CAAAZ,SAAA,CAAA50B,WAAA,CAAAw0B,YAAA,EACA55B,CAAA,CAAAqF,KAAA,YACA20B,SAAA,CAAAn5B,IAAA,CAAAoD,MAAA,CACA,GACA+1B,SACA,CA9SA3pB,GAAA,CAAAA,GAAA,EAAA9P,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA2P,GAAA,YAAAA,GAAA,YAAAA,GAAA,CACArQ,CAAA,CAAAA,CAAA,EAAAO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAV,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACAw5B,WAAA,CAAAA,WAAA,EAAAj5B,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA84B,WAAA,YAAAA,WAAA,YAAAA,WAAA,CACAl2B,SAAA,CAAAA,SAAA,EAAA/C,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA4C,SAAA,YAAAA,SAAA,YAAAA,SAAA,CACAC,UAAA,CAAAA,UAAA,EAAAhD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6C,UAAA,YAAAA,UAAA,YAAAA,UAAA,CACAC,QAAA,CAAAA,QAAA,EAAAjD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA8C,QAAA,YAAAA,QAAA,YAAAA,QAAA,CACAm1B,eAAA,CAAAA,eAAA,EAAAp4B,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAi4B,eAAA,YAAAA,eAAA,YAAAA,eAAA,CACAc,OAAA,CAAAA,OAAA,EAAAl5B,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA+4B,OAAA,YAAAA,OAAA,YAAAA,OAAA,CACAE,MAAA,CAAAA,MAAA,EAAAp5B,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAi5B,MAAA,YAAAA,MAAA,YAAAA,MAAA,CAEAn2B,QAAA,CAAA8B,aAAA,GACA9B,QAAA,CAAAD,UAAA,EACAC,QAAA,CAAA8B,aAAA,QAEA,CAAAxB,QAAA,CAAAP,UAAA,CAAAgC,QAAA,UAAAhC,UAAA,CAAAiC,MAAA,CAAAC,OAAA,CAAAC,QAAA,CAAAhC,IAAA,EACA,KAAAkC,YAAA,gBACAH,OAAA,MAAAI,KAAA,CAAAJ,OAAA,CAAAlC,UAAA,CAAAkC,OAAA,EAAA/B,IAAA,CAAAA,IAAA,KACA,IAAAoC,MAAA,IAAAG,YAAA,YAAAD,gBAAA,MAAAA,gBAAA,CAAAE,MAAA,CAAAC,MAAA,CA4BA,MAzBA,CAAAL,MAAA,8CACAK,MAAA,CAAAV,OAAA,CAAAiC,EAAA,EAAAxB,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAkC,EAAA,CAAAxB,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,mBACAC,MAAA,CAAAV,OAAA,CAAAmY,IAAA,EAAA1X,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAoY,IAAA,CAAA1X,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,oBACAC,MAAA,CAAAV,OAAA,CAAAyE,KAAA,EAAAhE,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAA0E,KAAA,CAAAhE,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,eACAC,MAAA,CAAAV,OAAA,CAAAuK,KAAA,EAAA9J,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAwK,KAAA,CAAA9J,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,yCACAC,MAAA,CAAAV,OAAA,CAAAuK,KAAA,EAAA9J,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAwK,KAAA,CAAA9J,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,gCACAC,MAAA,CAAAV,OAAA,CAAAuK,KAAA,EAAA9J,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAwK,KAAA,CAAA9J,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,wIACAJ,MACA,GAyBA41B,SAAA,KAKAv3B,QAAA,EACA62B,eAAA,IACAG,cAAA,GACA,EAKAM,cAAA,EACAjV,IAAA,KACAmV,OAAA,KACApV,OAAA,KACAD,MAAA,KACAD,KAAA,IACA,EAsNA,OAAAwT,gBAEA,GCnTA95B,MAAA,wFACAA,MCFA,4SAAAsQ,GAAA,CAAArQ,CAAA,CAAAgC,EAAA,CAAAsB,SAAA,CAAAme,KAAA,CAAAoY,gBAAA,CAAAt2B,UAAA,CAAAC,QAAA,CAAAo4B,YAAA,eAuCA,SAAAC,YAAAn4B,IAAA,CAAAC,OAAA,CAAAC,QAAA,EACA,IAAAC,IAAA,CAAAC,QAAA,CAAAJ,IAAA,CAAAC,OAAA,EACA,OAAAC,QAAA,KAAAC,IAAA,CAAAE,CAAA,CAAAF,IAAA,CACA,CAyCA,SAAAi4B,gBAAA73B,MAAA,KAOA,CAAA83B,QAAA,CAAAz4B,SAAA,EAUAwO,MAAA,UAAAA,OAAAkqB,MAAA,KACA,CAAAl7B,IAAA,MACAm7B,QAAA,IAGAC,gBAAA,CAAAl8B,CAAA,CAAAm8B,UAAA,CAAAn8B,CAAA,CAAAo8B,IAAA,MAAAJ,MAAA,EAAAh8B,CAAA,CAAAo8B,IAAA,CAAAJ,MAAA,GAeA,MAdA,CAAAE,gBAAA,CAAAz6B,MAAA,EACAzB,CAAA,CAAAyE,OAAA,CAAAy3B,gBAAA,UAAAG,OAAA,EACAJ,QAAA,CAAAroB,IAAA,CAAA9S,IAAA,CAAAw7B,WAAA,CAAAD,OAAA,EACA,GAIAr8B,CAAA,CAAAyE,OAAA,CAAAu3B,MAAA,UAAAO,KAAA,CAAA70B,EAAA,EACA,oBAAA5G,IAAA,CAAAk7B,MAAA,CAAAt0B,EAAA,EACAu0B,QAAA,CAAAroB,IAAA,CAAA9S,IAAA,CAAA07B,QAAA,CAAA90B,EAAA,CAAA60B,KAAA,GAEAN,QAAA,CAAAroB,IAAA,CAAA9S,IAAA,CAAA27B,WAAA,CAAA/0B,EAAA,CAAA60B,KAAA,EAEA,GACAjb,OAAA,CAAAob,GAAA,CAAAT,QAAA,EAAA5N,IAAA,UAAAsO,OAAA,EAcA,MAZA,GAAA38B,CAAA,CAAAqjB,IAAA,CAAAviB,IAAA,CAAAk7B,MAAA,EACAva,KAAA,CAAAtD,IAAA,CAAAye,eAAA,EAEAnb,KAAA,CAAAtC,IAAA,CAAAyd,eAAA,EAQA97B,IAAA,CAAAgE,OAAA,UAAA63B,OAAA,EACAA,OACA,EACA,EAKAE,SAAA,UAAAA,UAAA,EACA,YAAAb,MACA,EAcAQ,QAAA,UAAAA,SAAA90B,EAAA,CAAA60B,KAAA,EACA,IAAAz7B,IAAA,YACA,MAAAqC,EAAA,uCAAA64B,MAAA,CAAAt0B,EAAA,EACA,IAAA4Z,OAAA,UAAAC,OAAA,EACA,IAAAyY,SAAA,CAAAH,gBAAA,CAAAiD,mBAAA,CAAA98B,CAAA,CAAAmE,QAAA,CAAAo4B,KAAA,EACApB,cAAA,CAAAr6B,IAAA,CAAAmD,MAAA,CAAAk3B,cACA,IAAA/2B,EAAA,qBAGAtD,IAAA,CAAAk7B,MAAA,CAAAt0B,EAAA,EAAA1H,CAAA,CAAAosB,KAAA,CAAAmQ,KAAA,EACAz7B,IAAA,CAAAk7B,MAAA,CAAAt0B,EAAA,EAAAsyB,SAAA,MAQAl5B,IAAA,CAAAgE,OAAA,qBAAAhE,IAAA,CAAAk7B,MAAA,CAAAt0B,EAAA,GAOA5G,IAAA,CAAAgE,OAAA,YAAAhE,IAAA,CAAAk7B,MAAA,CAAAt0B,EAAA,GACA6Z,OAAA,CAAAzgB,IAAA,CAAAk7B,MAAA,CAAAt0B,EAAA,EACA,GAAAtD,EAAA,oBAMAtD,IAAA,CAAAgE,OAAA,cAAAhE,IAAA,CAAAk7B,MAAA,CAAAt0B,EAAA,EACA,GAAAtD,EAAA,mBAMAtD,IAAA,CAAAgE,OAAA,aAAAhE,IAAA,CAAAk7B,MAAA,CAAAt0B,EAAA,EACA,GAAAtD,EAAA,kBAMAtD,IAAA,CAAAgE,OAAA,YAAAhE,IAAA,CAAAk7B,MAAA,CAAAt0B,EAAA,EACA,GAAAtD,EAAA,mBAAAf,KAAA,EACAvC,IAAA,CAAAk7B,MAAA,CAAAt0B,EAAA,IACA5G,IAAA,CAAAgE,OAAA,kBAAAo1B,aAAA,CAAAp5B,IAAA,CAAAk7B,MAAA,CAAAt0B,EAAA,EAAAwC,KAAA,CAAApJ,IAAA,CAAAk7B,MAAA,CAAAt0B,EAAA,EAAAqxB,mBAAA,EAGAj4B,IAAA,CAAAk7B,MAAA,CAAAt0B,EAAA,EAAAwyB,aAAA,CAAA72B,KAAA,CAEA,GACA22B,SAAA,CAAA+C,MAAA,CAAAj8B,IAAA,8CACA,GAEAwgB,OAAA,CAAAC,OAAA,IACA,EAUAkb,WAAA,UAAAA,YAAA/0B,EAAA,CAAA60B,KAAA,QACA,MAAAp5B,EAAA,uCAAA64B,MAAA,CAAAt0B,EAAA,GACA,KAAAs0B,MAAA,CAAAt0B,EAAA,EAAAwyB,aAAA,CAAAqC,KAAA,CAAArC,aAAA,CACA,KAAA8B,MAAA,CAAAt0B,EAAA,EAAAqxB,mBAAA,CAAAwD,KAAA,CAAAxD,mBAAA,CACA,KAAAiD,MAAA,CAAAt0B,EAAA,EAAAs1B,SAAA,CAAAT,KAAA,CAAAS,SAAA,CACAh9B,CAAA,CAAAkjB,QAAA,CAAAqZ,KAAA,CAAAU,yBAAA,IACA,KAAAjB,MAAA,CAAAt0B,EAAA,EAAAu1B,yBAAA,CAAAV,KAAA,CAAAU,yBAAA,EAEA,KAAAjB,MAAA,CAAAt0B,EAAA,EAAAsyB,SAAA,EACA,KAAAgC,MAAA,CAAAt0B,EAAA,EAAAsyB,SAAA,CAAAloB,MAAA,CAAAyqB,KAAA,CAAArC,aAAA,CAAAqC,KAAA,CAAAxD,mBAAA,EAEA,KAAAj0B,OAAA,6BAAAk3B,MAAA,CAAAt0B,EAAA,GAOA,KAAA5C,OAAA,oBAAAk3B,MAAA,CAAAt0B,EAAA,GACA4Z,OAAA,CAAAC,OAAA,MAAAya,MAAA,CAAAt0B,EAAA,IAEA4Z,OAAA,CAAAC,OAAA,IACA,EASA+a,WAAA,UAAAA,YAAA50B,EAAA,EACA,IAAA5G,IAAA,YACA,MAAAqC,EAAA,uCAAA64B,MAAA,CAAAt0B,EAAA,EACA,IAAA4Z,OAAA,UAAAC,OAAA,EAIA,IAAA2b,OAAA,UAAAA,QAAA,EAEA,IAAApU,OAAA,CAAA9oB,CAAA,CAAAm9B,IAAA,CAAAr8B,IAAA,CAAAk7B,MAAA,CAAAt0B,EAAA,eAGA5G,IAAA,CAAAk7B,MAAA,CAAAh8B,CAAA,CAAAm9B,IAAA,CAAAr8B,IAAA,CAAAk7B,MAAA,CAAAt0B,EAAA,EACA5G,IAAA,CAAAgE,OAAA,wBAAAgkB,OAAA,EAOAhoB,IAAA,CAAAgE,OAAA,eAAAgkB,OAAA,EACAvH,OAAA,CAAAuH,OAAA,CACA,EACAhoB,IAAA,CAAAk7B,MAAA,CAAAt0B,EAAA,EAAAsyB,SAAA,CACAl5B,IAAA,CAAAk7B,MAAA,CAAAt0B,EAAA,EAAAsyB,SAAA,CAAA51B,EAAA,WAAA84B,OAAA,EAAAptB,OAAA,GAEAotB,OAAA,EAEA,GAEA5b,OAAA,CAAAC,OAAA,EACA,EAKAgH,KAAA,UAAAA,MAAA,EAMA,MALA,CAAAvoB,CAAA,CAAAyE,OAAA,MAAAu3B,MAAA,UAAAO,KAAA,EACAA,KAAA,CAAAvC,SAAA,EACAuC,KAAA,CAAAvC,SAAA,CAAAzR,KAAA,EAEA,GACA,IACA,EAKAC,IAAA,UAAAA,KAAA,EAMA,MALA,CAAAxoB,CAAA,CAAAyE,OAAA,MAAAu3B,MAAA,UAAAO,KAAA,EACAA,KAAA,CAAAvC,SAAA,EACAuC,KAAA,CAAAvC,SAAA,CAAAxR,IAAA,EAEA,GACA,IACA,EAMA4U,aAAA,UAAAA,cAAA,EAgBA,MAfA,MAAAj6B,EAAA,mBAAAc,MAAA,CAAAo5B,OAAA,CAAA3uB,OAAA,GACA,KAAAvL,EAAA,SACA,KAAAgjB,QAAA,WACAyW,eAAA,CAAAh7B,IAAA,SAAAI,EAAA,mBAEA,KAAAmkB,QAAA,WACAyW,eAAA,CAAAh7B,IAAA,SAAAI,EAAA,kBAOA,KAAA8C,OAAA,kBAAA3B,EAAA,UAEA,IACA,CACA,EAAAgB,QAAA,EAAAC,EAAA,mBAEA,KAAA43B,MAAA,GACA,GAAA53B,EAAA,wBACA,CAAAtD,IAAA,MACAmO,QAAA,MAAArK,UAAA,GAGAk4B,mBAAA,CAAAzsB,GAAA,kBAAApB,QAAA,EAGA,KAAAhL,MAAA,CAAAo5B,OAAA,CAAA3uB,OAAA,GACAkuB,eAAA,CAAAvsB,GAAA,kBAAApB,QAAA,EACAnO,IAAA,CAAAqlB,QAAA,SAAArlB,IAAA,CAAAmD,MAAA,CAAAo5B,OAAA,CAAAC,WAAA,EACAV,eAAA,CAAAx4B,EAAA,kBAAAgL,CAAA,EACAA,CAAA,CAAAoW,cAAA,GACA1kB,IAAA,CAAAs8B,aAAA,EACA,IAIA,KAAAn5B,MAAA,CAAA+3B,MAAA,EACA,KAAAlqB,MAAA,MAAA7N,MAAA,CAAA+3B,MAAA,CAEA,GArRAY,eAAA,CACAE,mBAAA,CAyRA,MAJA,CAAAf,QAAA,CAAA32B,WAAA,CAAAy2B,WAAA,EACA77B,CAAA,CAAAqF,KAAA,YACA02B,QAAA,CAAAl7B,IAAA,CAAAoD,MAAA,CACA,GACA83B,QACA,CA7WA1rB,GAAA,CAAAA,GAAA,EAAA9P,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA2P,GAAA,YAAAA,GAAA,YAAAA,GAAA,CACArQ,CAAA,CAAAA,CAAA,EAAAO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAV,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACAgC,EAAA,CAAAA,EAAA,EAAAzB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAsB,EAAA,YAAAA,EAAA,YAAAA,EAAA,CACAsB,SAAA,CAAAA,SAAA,EAAA/C,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA4C,SAAA,YAAAA,SAAA,YAAAA,SAAA,CACAme,KAAA,CAAAA,KAAA,EAAAlhB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA+gB,KAAA,YAAAA,KAAA,YAAAA,KAAA,CACAoY,gBAAA,CAAAA,gBAAA,EAAAt5B,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAm5B,gBAAA,YAAAA,gBAAA,YAAAA,gBAAA,CACAt2B,UAAA,CAAAA,UAAA,EAAAhD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6C,UAAA,YAAAA,UAAA,YAAAA,UAAA,CACAC,QAAA,CAAAA,QAAA,EAAAjD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA8C,QAAA,YAAAA,QAAA,YAAAA,QAAA,CAEAA,QAAA,CAAA8B,aAAA,GACA9B,QAAA,CAAAD,UAAA,EACAC,QAAA,CAAA8B,aAAA,QAEA,CAAAxB,QAAA,CAAAP,UAAA,CAAAgC,QAAA,UAAAhC,UAAA,CAAAiC,MAAA,CAAAC,OAAA,CAAAC,QAAA,CAAAhC,IAAA,EAKA,SAAAiC,SAAAH,MAAA,CAAA9B,IAAA,EAEA,IAAAoC,MAAA,IAAAK,MAAA,CAAAxC,OAAA,CAIA,MAHA,CAAAmC,MAAA,gEACAE,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,eAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,oBAAA7B,OAAA,IACA,kEACAmC,MACA,CAXA,KAAAF,YAAA,gBACAH,OAAA,MAAAI,KAAA,CAAAJ,OAAA,CAAAlC,UAAA,CAAAkC,OAAA,EAAA/B,IAAA,CAAAA,IAAA,KACA,IAAAoC,MAAA,IAAAC,aAAA,CAAAN,OAAA,CAAAM,aAAA,CAAAC,gBAAA,MAAAA,gBAAA,CAAAlF,IAAA,MAAAmF,YAAA,YAAAC,MAAA,CAAAC,MAAA,CAmBA,MARA,CAAAL,MAAA,oCACAI,MAAA,CAAAT,OAAA,OAAA/E,IAAA,CAAA8E,MAAA,EAAAU,MAAA,CAAAV,MAAA,EAAAA,MAAA,CAAA63B,OAAA,OAAAn3B,MAAA,OAAAA,MAAA,CAAAA,MAAA,CAAAA,MAAA,CAAAwI,OAAA,GAAAtI,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA2F,IAAA,CAAAC,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,GAAAhB,QAAA,CAAAjC,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,uDACAK,MAAA,CAAAV,OAAA,CAAA83B,UAAA,EAAAr3B,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAA+3B,UAAA,CAAAr3B,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,8BACAJ,MACA,GA2BA3B,QAAA,EACAk5B,OAAA,EACA3uB,OAAA,IACA4uB,WAAA,GACA,CACA,EA2SA,OAAAxB,eAEA,GAEA/7B,MCrXA,6FAoCA,SAAAy9B,qBAAAt6B,UAAA,CAAAq5B,KAAA,EACA,MAAA3Z,QAAA,CAAA1f,UAAA,CAAAu6B,cAAA,YACAlB,KAAA,UAAAA,KAAA,CAAA3e,IAAA,WAAA2e,KAAA,CAAAryB,KAAA,EAAA0Y,QAAA,EAAAA,QAAA,CAAAvY,QAAA,GACA,CACAzJ,IAAA,gBAIA88B,KAAA,UAAAA,MAAA,EACAx6B,UAAA,CAAAkB,EAAA,oCACAlB,UAAA,CAAA4B,OAAA,cACA,GACA5B,UAAA,CAAA4B,OAAA,cACA,EAIAi2B,QAAA,UAAAA,SAAA,EACA,KAAA4C,QAAA,GACAz6B,UAAA,CAAA4B,OAAA,aACA,EAIA64B,QAAA,UAAAA,SAAA,EACAz6B,UAAA,CAAA4V,GAAA,yBACA,CACA,CAGA,CAEA,OAAA0kB,oBAEA,GAEAz9B,MCxEA,mFAAAC,CAAA,mBAAA49B,QAAA,CA4CA7I,IAAA,CAAA8I,GAAA,CAdA,SAAAC,kBAAA56B,UAAA,CAAAq5B,KAAA,EAOA,IAAAwB,cAAA,UAAAA,eAAA,EACA/9B,CAAA,CAAAkjB,QAAA,CAAAqZ,KAAA,CAAAS,SAAA,KAAAT,KAAA,CAAAS,SAAA,GAAAT,KAAA,CAAAyB,cAAA,GACAzB,KAAA,CAAAyB,cAAA,IACA96B,UAAA,CAAA2d,MAAA,gEACA,CAAAod,iBAAA,GACA5b,WAAA,CAAAnf,UAAA,CAAAoL,cAAA,GACAiuB,KAAA,CAAArC,aAAA,CAAAqC,KAAA,CAAAS,SAAA,GACAiB,iBAAA,CAAAL,QAAA,CAAArB,KAAA,CAAAS,SAAA,CAAAT,KAAA,CAAArC,aAAA,SACAgE,qBAAA,CAAAN,QAAA,CAAAK,iBAAA,CAAAC,qBAAA,CAAA7b,WAAA,CAAA2a,SAAA,CAAAmB,QAAA,EACAj7B,UAAA,CAAA6rB,QAAA,GAAAsE,mBAAA,EACA4K,iBAAA,CAAAC,qBACA,GAEA,GAAAl9B,KAAA,6DACAk9B,qBAAA,EACA,GAEA,WACA3B,KAAA,UAAAA,KAAA,CAAA3e,IAAA,GACA,CACAhd,IAAA,aAIA88B,KAAA,UAAAA,MAAA,EACAK,cAAA,EACA,EAIAxV,KAAA,UAAAA,MAAA,EAEAwV,cAAA,EACA,EAIAJ,QAAA,UAAAA,SAAA,EACAz6B,UAAA,CAAA4V,GAAA,kDACA,CACA,CAGA,CA9EA9Y,CAAA,CAAAA,CAAA,EAAAO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAV,CAAA,YAAAA,CAAA,YAAAA,CAAA,IAmBA,CAAA07B,SAAA,KACAwC,qBAAA,GA4DA,OAAAJ,iBAEA,GAEA/9B,MCtFA,iGAsCA,SAAAq+B,yBAAAl7B,UAAA,CAAAq5B,KAAA,OACA,CAAA5rB,iBAAA,CAAAzN,UAAA,CAAAsL,UAAA,GACAoU,QAAA,CAAA1f,UAAA,CAAAu6B,cAAA,YACAlB,KAAA,aAAAA,KAAA,CAAA3e,IAAA,WAAA2e,KAAA,CAAAryB,KAAA,OAAAyG,iBAAA,CAAA0tB,gBAAA,EAAAzb,QAAA,EAAAA,QAAA,CAAAvY,QAAA,GACA,CACAzJ,IAAA,oBAIA88B,KAAA,UAAAA,MAAA,EACAx6B,UAAA,CAAA4B,OAAA,WACA,EAIAi2B,QAAA,UAAAA,SAAA,EACA73B,UAAA,CAAA4B,OAAA,mCACAy2B,UAAA,YACAr4B,UAAA,CAAA4B,OAAA,sBACA,MACA,CACA,CAGA,CAEA,OAAAs5B,wBAEA,GAEAr+B,MCpEA,wFAkCA,SAAAu+B,gBAAAp7B,UAAA,CAAAq5B,KAAA,WACAA,KAAA,UAAAA,KAAA,CAAA3e,IAAA,GACA,CACAhd,IAAA,WAIAm6B,QAAA,UAAAA,SAAA,EACA,GAAAwB,KAAA,CAAAgC,YAAA,EAAAhC,KAAA,CAAAzM,MAAA,CACA,OAAA5sB,UAAA,CAAAs7B,OAAA,CAAAjC,KAAA,CAAAgC,YAAA,CAAAhC,KAAA,CAAAzM,MAAA,CAAAyM,KAAA,CAEA,CACA,CAGA,CAEA,OAAA+B,eAEA,GAEAv+B,MCvDA,6DAAAC,CAAA,eAEAA,CAAA,CAAAA,CAAA,EAAAO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAV,CAAA,YAAAA,CAAA,YAAAA,CAAA,IAwBA,CAAAy+B,qBAAA,EACAC,MAAA,QACAC,QAAA,QACAC,OAAA,QACAC,MAAA,SACA,EAMAC,kCAAA,EACAC,gBAAA,mBACAC,iBAAA,cACAC,gBAAA,cACAC,oBAAA,mBACAC,kBAAA,cACAC,kBAAA,cACAC,uBAAA,cACAC,2BAAA,mBACAC,sBAAA,aACA,EAKAC,iBAAA,EAMAC,eAAA,UAAAA,gBAAAtxB,MAAA,EACA,IAAA2T,UAAA,CAAA3T,MAAA,CAAA2T,UAAA,CACA,OAAAA,UAAA,CAAAE,KAAA,EAAAF,UAAA,CAAAE,KAAA,CAAA0d,SACA,EAOAC,sBAAA,UAAAA,uBAAAxxB,MAAA,CAAAxF,UAAA,EACA,IAAAsgB,KAAA,MAQA,MAPA,CAAAjpB,CAAA,CAAAyE,OAAA,CAAA+6B,iBAAA,CAAAC,eAAA,CAAAtxB,MAAA,WAAAyxB,WAAA,EACA,IAAAC,UAAA,CAAAD,WAAA,CAAAC,UAAA,KACA,GAAAA,UAAA,CAAAl3B,UAAA,GAAAA,UAAA,CAEA,MADA,CAAAsgB,KAAA,CAAA2W,WAAA,GAGA,GACA3W,KACA,EAQA6W,UAAA,UAAAA,WAAAz8B,KAAA,CAAA08B,QAAA,CAAAC,WAAA,KACA,CAAAC,iBAAA,CAAAxB,qBAAA,CAAAuB,WAAA,EACAE,QAAA,KACAlgC,CAAA,CAAAk7B,QAAA,CAAA73B,KAAA,GAAArD,CAAA,CAAAkjB,QAAA,CAAA7f,KAAA,KACAA,KAAA,EAAAA,KAAA,GAEA,IAAA88B,SAAA,CAAAC,CAAA,EAAAA,CAAA,CA8BA,MA7BA,YAAAL,QAAA,CACAI,SAAA,CAAAC,CAAA,OAAAA,CAAA,WAAAA,CAAA,CACA,YAAAL,QAAA,CACAI,SAAA,CAAAC,CAAA,mBAAAA,CAAA,CAAAA,CAAA,CAAAzc,QAAA,CAAAyc,CAAA,EACA,UAAAL,QAAA,CACAI,SAAA,CAAAC,CAAA,mBAAAA,CAAA,CAAAA,CAAA,CAAA5Y,UAAA,CAAA4Y,CAAA,GACA,gBAAAL,QAAA,UAAAA,QAAA,IACAI,SAAA,CAAAC,CAAA,EACApgC,CAAA,CAAAk7B,QAAA,CAAAkF,CAAA,EACAA,CAAA,CAAAC,KAAA,MAEAD,CACA,EAEA/8B,KAAA,CAAArD,CAAA,CAAAgH,GAAA,CAAA3D,KAAA,KAAA88B,SAAA,EACAF,iBAAA,GACA,SAAAA,iBAAA,CACA,IAAA58B,KAAA,CAAA5B,MAAA,CAEAy+B,QAAA,CAAAI,IAAA,OAEAJ,QAAA,CAAAI,IAAA,IACAJ,QAAA,CAAAI,IAAA,CAAAP,QAAA,EAAA18B,KAAA,MAGA68B,QAAA,CAAAD,iBAAA,KACAC,QAAA,CAAAD,iBAAA,EAAAF,QAAA,EAAA18B,KAAA,GAGA68B,QACA,EAQAK,cAAA,UAAAA,eAAAl9B,KAAA,CAAA08B,QAAA,CAAAC,WAAA,EACA,IAAAC,iBAAA,CAAAxB,qBAAA,CAAAuB,WAAA,EACAhgC,CAAA,CAAAohB,QAAA,CAAA/d,KAAA,UAAAA,KAAA,CAAA48B,iBAAA,IACA58B,KAAA,OAEArD,CAAA,CAAAohB,QAAA,CAAA/d,KAAA,GAAAA,KAAA,CAAA48B,iBAAA,uBAAA58B,KAAA,CAAA48B,iBAAA,EAAAF,QAAA,IACA18B,KAAA,CAAAA,KAAA,CAAA48B,iBAAA,EAAAF,QAAA,GAEA,MAAAS,YAAA,YAAAT,QAAA,cAAAA,QAAA,YAAAA,QAAA,CACA,cAAA18B,KAAA,EAAAm9B,YAAA,OAAAn9B,KAAA,aAAA28B,WAAA,EAAAhgC,CAAA,CAAA0iB,OAAA,CAAArf,KAAA,CACA,EAUAo9B,kBAAA,UAAAA,mBAAAP,QAAA,CAAAH,QAAA,CAAAC,WAAA,CAAAU,YAAA,CAAAC,eAAA,KAEA,CAAAC,aAAA,IADA79B,QAAA,CAAA89B,kBAAA,CAAAnB,SAAA,CAeA,MAbA,CAAAgB,YAAA,CAAA1gC,CAAA,CAAA8gC,WAAA,CAAAJ,YAAA,OAAAA,YAAA,CACAC,eAAA,CAAAA,eAAA,IACAnB,iBAAA,CAAAe,cAAA,CAAAL,QAAA,CAAAH,QAAA,CAAAC,WAAA,EACAj9B,QAAA,KAEAA,QAAA,EAAA/C,CAAA,CAAA+gC,OAAA,CAAAb,QAAA,CAAAV,iBAAA,CAAAM,UAAA,CAAAY,YAAA,CAAAX,QAAA,CAAAC,WAAA,GACA,IAAAW,eAAA,GACAE,kBAAA,CAAApC,qBAAA,CAAAuB,WAAA,EACAN,SAAA,CAAAQ,QAAA,CAAAW,kBAAA,EAAAd,QAAA,MACAa,aAAA,CAAAlB,SAAA,EAAAA,SAAA,CAAAj+B,MAAA,EAAAk/B,eAAA,EAEA59B,QAAA,CAAAA,QAAA,EAAA69B,aAAA,EAEA79B,QACA,EACAi+B,gCAAA,UAAAA,iCAAA7yB,MAAA,KACA,CAAA2T,UAAA,CAAA3T,MAAA,CAAA2T,UAAA,CACAmf,QAAA,CAAAnf,UAAA,CAAAE,KAAA,EAAAF,UAAA,CAAAE,KAAA,CAAAkf,GAAA,KACAC,YAAA,CAAAF,QAAA,CAAA3xB,QAAA,KACA8xB,gBAAA,IAUA,MATA,CAAAphC,CAAA,CAAAyE,OAAA,CAAA08B,YAAA,UAAAE,WAAA,KACA,CAAAxB,UAAA,CAAAwB,WAAA,CAAAxB,UAAA,KACAyB,QAAA,CAAAD,WAAA,CAAAE,SAAA,CAAAD,QAAA,CACAE,kBAAA,CACAjhC,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAo+B,kCAAA,CAAAwC,QAAA,IACAE,kBAAA,CAAA1C,kCAAA,CAAAwC,QAAA,EACAF,gBAAA,CAAAvB,UAAA,CAAA4B,kBAAA,EAAA5B,UAAA,CAAA2B,kBAAA,EAEA,GACAJ,gBACA,EAQAM,UAAA,UAAAA,WAAAvzB,MAAA,CAAAwzB,SAAA,KACA,CAAA7f,UAAA,CAAA3T,MAAA,CAAA2T,UAAA,CACA4d,SAAA,CAAA5d,UAAA,EAAAA,UAAA,CAAA8f,YAAA,GACAxK,KAAA,GACA9I,KAAA,GACAuT,YAAA,CAAAT,gBAAA,OACA,CAAAtf,UAAA,GACA+f,YAAA,CAAArC,iBAAA,CAAAC,eAAA,CAAAtxB,MAAA,EACAizB,gBAAA,CAAA5B,iBAAA,CAAAwB,gCAAA,CAAA7yB,MAAA,EACAnO,CAAA,CAAAyE,OAAA,CAAAo9B,YAAA,UAAAjC,WAAA,KACA,CAAAC,UAAA,CAAAD,WAAA,CAAAC,UAAA,KACAK,QAAA,CAAAR,SAAA,CAAAG,UAAA,CAAAl3B,UAAA,EACAo3B,QAAA,CAAAF,UAAA,CAAAE,QAAA,CACAC,WAAA,CAAAH,UAAA,CAAAG,WAAA,CACA5I,KAAA,GACAoI,iBAAA,CAAAiB,kBAAA,CAAAP,QAAA,CAAAH,QAAA,CAAAC,WAAA,CAAAJ,WAAA,CAAAc,YAAA,CAAAU,gBAAA,CAAAvB,UAAA,CAAAl3B,UAAA,IACA2lB,KAAA,EAEA,IAEA,KAAAqT,SAAA,CACA,EAAAvK,KAAA,MAAA9I,KAAA,CAEA,EAAA8I,KAAA,EAAA9I,KAAA,CAAA8I,KACA,EAOA0K,eAAA,UAAAA,gBAAA3zB,MAAA,KACA,CAAA2T,UAAA,CAAA3T,MAAA,CAAA2T,UAAA,CACAmf,QAAA,CAAAnf,UAAA,CAAAE,KAAA,EAAAF,UAAA,CAAAE,KAAA,CAAAkf,GAAA,KACAC,YAAA,CAAAF,QAAA,CAAA3xB,QAAA,KACA,OAAAtP,CAAA,CAAAmhC,YAAA,EAAA52B,MAAA,GAAAC,MAAA,UAAAsJ,OAAA,EACA,kBAAAA,OAAA,CAAAwtB,QACA,GAAAS,KAAA,eAAAA,KAAA,SAAA1+B,KAAA,EACA,EAOA2+B,mBAAA,UAAAA,oBAAA7zB,MAAA,KACA,CAAA8zB,OAAA,MAAAH,eAAA,CAAA3zB,MAAA,EACA+zB,WAAA,OACA,GAAAD,OAAA,CAAAxgC,MAAA,EAEAygC,WAAA,CAAAD,OAAA,CAAAz3B,MAAA,UAAA23B,YAAA,EACA,IAAAC,OAAA,CAAAnlB,QAAA,CAAAolB,aAAA,4BAAAF,YAAA,MACA,OAAAniC,CAAA,CAAAoiC,OAAA,CAAAE,UAAA,EAAA34B,IAAA,UAAA44B,KAAA,EACA,OAAAA,KAAA,CAAAC,QAAA,GAAAD,KAAA,CAAAE,SACA,EACA,GACAP,WAAA,EAEA,EACA,CACA,EAEA,OAAA1C,iBAEA,GAEAz/B,MClQA,+HAAAC,CAAA,CAAAkO,SAAA,CAAAsxB,iBAAA,eAEAx/B,CAAA,CAAAA,CAAA,EAAAO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAV,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACAkO,SAAA,CAAAA,SAAA,EAAA3N,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAwN,SAAA,YAAAA,SAAA,YAAAA,SAAA,CACAsxB,iBAAA,CAAAA,iBAAA,EAAAj/B,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA8+B,iBAAA,YAAAA,iBAAA,YAAAA,iBAAA,CAmBA,IAAA11B,KAAA,EAQA44B,gBAAAx4B,KAAA,CAAAiE,MAAA,CAAAw0B,IAAA,OACA,CAAA37B,GAAA,CAAAmH,MAAA,CAAAE,UAAA,GACArC,OAAA,CAAAmC,MAAA,CAAAG,cAAA,GACAzL,IAAA,CAAAsL,MAAA,CAAAuC,cAAA,GACAkS,QAAA,CAAAzU,MAAA,CAAAsvB,cAAA,GACA3zB,KAAA,CAAA9J,CAAA,CAAAosB,KAAA,CAAAle,SAAA,CAAAjE,aAAA,CAAAjD,GAAA,CAAAgF,OAAA,CAAAoX,YAAA,CAAAlZ,KAAA,GACAvG,OAAA,CAAAwK,MAAA,CAAAK,UAAA,OACA,IAAAo0B,2BAAA,CAIA,GAHAj/B,OAAA,CAAA8K,MAAA,GACAm0B,2BAAA,CAAAj/B,OAAA,CAAA8K,MAAA,CAAAm0B,2BAAA,EAEA,CAAA//B,IAAA,CAAA8J,aAAA,EACA,MAAAk2B,uBAAA,CAAArD,iBAAA,CAAAkC,UAAA,CAAAvzB,MAAA,CAAAy0B,2BAAA,EACA,CAAAC,uBAAA,EAAAhgC,IAAA,CAAAE,QAAA,CACA+G,KAAA,CAAA/G,QAAA,GACA,CAAA8/B,uBAAA,EAAAF,IAAA,IAAA9/B,IAAA,CAAAE,QAAA,CACA+G,KAAA,CAAA/G,QAAA,GAEA4/B,IAAA,GAAAE,uBAAA,EAAAhgC,IAAA,CAAAE,QAAA,EAAA6f,QAAA,CAAAvY,QAAA,EACAP,KAAA,CAAA/G,QAAA,EAEA,CACA,OAAA+G,KACA,CACA,EAEA,OAAAA,KAEA,GAEA/J,MC7DA,gIAAAiC,EAAA,CAAA8gC,WAAA,CAAAv/B,UAAA,CAAAC,QAAA,eA+BA,SAAAu/B,iBAAAr/B,IAAA,CAAAC,OAAA,CAAAC,QAAA,EACA,IAAAC,IAAA,CAAAC,QAAA,CAAAJ,IAAA,CAAAC,OAAA,EACA,OAAAC,QAAA,KAAAC,IAAA,CAAAE,CAAA,CAAAF,IAAA,CACA,CA6BA,SAAAm/B,eAAA94B,KAAA,CAAAiE,MAAA,KACA,CAAAyR,OAAA,GAAAxW,SAAA,CAAA3H,MAAA,WAAA2H,SAAA,IAAAA,SAAA,OACAu5B,IAAA,GAAAv5B,SAAA,CAAA3H,MAAA,CAAA2H,SAAA,WACA65B,iBAAA,GAAA75B,SAAA,CAAA3H,MAAA,CAAA2H,SAAA,WACA85B,iBAAA,SACA,CAAAvyB,iBAAA,CAAAxC,MAAA,CAAAK,UAAA,GACA20B,cAAA,CAAAxyB,iBAAA,CAAAyyB,4BAAA,CAOA,MANA,CAAAD,cAAA,GACAD,iBAAA,CAAAG,yBAAA,CAAAn5B,KAAA,CAAAiE,MAAA,CAAAw0B,IAAA,EAAAW,IAAA,GACAJ,iBAAA,GACAA,iBAAA,QAGA,GAAAK,SAAA,CAAAr5B,KAAA,IAAAg5B,iBAAA,IAAAM,gBAAA,CAAAt5B,KAAA,CAAA+4B,iBAAA,IAAArjB,OAAA,GAAA0jB,IAAA,EACA,CAOA,SAAAC,UAAAr5B,KAAA,EACA,IAAA8T,MAAA,IAQA,MAPA,YAAA9T,KAAA,kBAAAA,KAAA,CACA8T,MAAA,CAAAhc,EAAA,yCACA,SAAAkI,KAAA,mCAAAA,KAAA,CACA8T,MAAA,CAAAhc,EAAA,sCACA,SAAAkI,KAAA,GACA8T,MAAA,CAAAhc,EAAA,6CAEA+gC,gBAAA,EACA/kB,MAAA,CAAAA,MAAA,CAAAslB,IAAA,EACA,EACA,CAQA,SAAAE,iBAAAt5B,KAAA,EACA,IAAA+4B,iBAAA,GAAA75B,SAAA,CAAA3H,MAAA,EAAA2H,SAAA,aAAAA,SAAA,IAAApH,EAAA,OACA,IAAA8e,GAAA,OAEA,YADA5W,KAAA,EAEA,gBAFAA,KAAA,EAGA,SAHAA,KAAA,CAIAlI,EAAA,6BAAAihC,iBAAA,EAAAK,IAAA,GACA,SALAp5B,KAAA,EAMA,iCANAA,KAAA,EAOA4W,GAAA,CAAA9e,EAAA,0GAAAihC,iBAAA,EACA,GAAAniB,GAAA,IAEA,EACA,CAQA,SAAA2iB,uBAAA35B,KAAA,EACA,IAAA8V,OAAA,GAAAxW,SAAA,CAAA3H,MAAA,EAAA2H,SAAA,aAAAA,SAAA,OACA,MAAAs6B,YAAA,CAAA55B,KAAA,EAAAA,KAAA,CAAAhH,OAAA,OACA,CAAA4gC,YAAA,CAGA9jB,OAAA,CACA,GAAAA,OAAA,IAAA5d,EAAA,sDAAA0hC,YAAA,CAAAC,QAAA,MAEA3hC,EAAA,kDAAA0hC,YAAA,CAAAC,QAAA,IALA/jB,OAMA,CASA,SAAAyjB,0BAAAn5B,KAAA,CAAAiE,MAAA,CAAAw0B,IAAA,OACA,CAAA74B,KAAA,CAAAg5B,WAAA,CAAAJ,eAAA,CAAAx4B,KAAA,CAAAiE,MAAA,CAAAw0B,IAAA,EACAiB,eAAA,CAAA95B,KAAA,EAAAA,KAAA,CAAAjD,SAAA,CAAAiD,KAAA,CAAA/G,QAAA,CACA2gC,YAAA,CAAA55B,KAAA,EAAAA,KAAA,CAAAhH,OAAA,CACA,IAAAogC,iBAAA,IA0BA,MAzBA,YAAAh5B,KAAA,kBAAAA,KAAA,EACAg5B,iBAAA,CAAAlhC,EAAA,kEAAA8H,KAAA,CAAA/G,QAAA,CAAA4gC,QAAA,GAAA75B,KAAA,CAAAjD,SAAA,CAAA88B,QAAA,IACAD,YAAA,GACAR,iBAAA,OAAAlhC,EAAA,0BAAA0hC,YAAA,CAAAC,QAAA,QAEA,SAAAz5B,KAAA,mCAAAA,KAAA,EACA,EAAA05B,eAAA,CACAV,iBAAA,CAAAlhC,EAAA,qCAAA4hC,eAAA,CAAAD,QAAA,IACA,IAAAC,eAAA,GACAV,iBAAA,CAAAlhC,EAAA,mCAAA4hC,eAAA,CAAAD,QAAA,KAEAD,YAAA,GACAR,iBAAA,CAAAO,sBAAA,CAAA35B,KAAA,CAAAo5B,iBAAA,IAEA,SAAAh5B,KAAA,GACA,EAAA05B,eAAA,CACAV,iBAAA,CAAAlhC,EAAA,8DAAA4hC,eAAA,CAAAD,QAAA,IACA,IAAAC,eAAA,GACAV,iBAAA,CAAAlhC,EAAA,4DAAA4hC,eAAA,CAAAD,QAAA,KAEAD,YAAA,GACAR,iBAAA,CAAAO,sBAAA,CAAA35B,KAAA,CAAAo5B,iBAAA,IAGAA,iBAAA,CAAAA,iBAAA,CAAAI,IAAA,GACAJ,iBACA,CA9KAlhC,EAAA,CAAAA,EAAA,EAAAzB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAsB,EAAA,YAAAA,EAAA,YAAAA,EAAA,CACA8gC,WAAA,CAAAA,WAAA,EAAAviC,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAoiC,WAAA,YAAAA,WAAA,YAAAA,WAAA,CACAv/B,UAAA,CAAAA,UAAA,EAAAhD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6C,UAAA,YAAAA,UAAA,YAAAA,UAAA,CACAC,QAAA,CAAAA,QAAA,EAAAjD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA8C,QAAA,YAAAA,QAAA,YAAAA,QAAA,CAEAA,QAAA,CAAA8B,aAAA,GACA9B,QAAA,CAAAD,UAAA,EACAC,QAAA,CAAA8B,aAAA,QAEA,CAAAxB,QAAA,CAAAP,UAAA,CAAAgC,QAAA,UAAAhC,UAAA,CAAAiC,MAAA,CAAAC,OAAA,CAAAC,QAAA,CAAAhC,IAAA,EAKA,SAAAiC,SAAAH,MAAA,CAAA9B,IAAA,EAEA,IAAAoC,MAAA,IAAAI,MAAA,CAAAC,MAAA,CAMA,MALA,CAAAL,MAAA,SACAK,MAAA,CAAAV,OAAA,CAAAuY,MAAA,EAAA9X,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAwY,MAAA,CAAA9X,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,eACAJ,MACA,CAbA,KAAAF,YAAA,gBACAH,OAAA,MAAAI,KAAA,CAAAJ,OAAA,CAAAlC,UAAA,CAAAkC,OAAA,EAAA/B,IAAA,CAAAA,IAAA,KACA,IAAAuC,YAAA,YAAAD,gBAAA,MAAAA,gBAAA,CAAAlF,IAAA,MAAAoF,MAAA,OAaA,CAAAA,MAAA,CAAAT,OAAA,OAAA/E,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAAwY,MAAA,EAAA5X,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA2F,IAAA,CAAAC,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,GAAAhB,QAAA,CAAAjC,IAAA,EAAAA,IAAA,CAAAA,IAAA,GACAwC,MAAA,MAAAA,MAAA,CAAAA,MAAA,CACA,EACA,GAmJAsyB,QAAA,EACAwK,cAAA,CAAAA,cACA,EAEA,OAAAxK,QAEA,GAEAz4B,MCzLA,8DAwBA,IAAA8jC,MAAA,EAEAC,WAAA,CAAAvjC,MAAA,CAAAwjC,MAAA,EACAC,OAAA,GACAC,WAAA,GACA1a,aAAA,GACA2a,SAAA,GACAC,MAAA,EACA,GAEAC,WAAA,CAAA7jC,MAAA,CAAAwjC,MAAA,EACAC,OAAA,GACAC,WAAA,GACA1a,aAAA,GACA2a,SAAA,GACAC,MAAA,GACAE,QAAA,GACAC,WAAA,IACA,EACA,EAEA,OAAAT,MAEA,GAEA9jC,MCjDA,iPAAAC,CAAA,CAAAgC,EAAA,CAAAw2B,QAAA,CAAArW,gBAAA,CAAA0hB,MAAA,CAAA31B,SAAA,eAsCA,SAAAq2B,2BAAArhC,UAAA,CAAAq5B,KAAA,EAQA,IAAAiI,iBAAA,UAAAA,kBAAAjiB,SAAA,CAAArY,KAAA,CAAA/B,QAAA,KACA,CAAA6D,OAAA,CAAA9I,UAAA,CAAAoL,cAAA,GACAtH,GAAA,CAAA9D,UAAA,CAAAmL,UAAA,WACArC,OAAA,CAAAy4B,SAAA,EAAAz4B,OAAA,CAAA04B,gBAAA,GAAAb,MAAA,CAAAO,WAAA,CAAAD,MAAA,EAAAn4B,OAAA,CAAAhE,SAAA,GAAAu0B,KAAA,CAAAzM,MAAA,GACA3N,gBAAA,CAAAC,gBAAA,CAAApW,OAAA,CAAAhF,GAAA,CAAAub,SAAA,CAAArY,KAAA,CAAA/B,QAAA,CAGA,WACAo0B,KAAA,cAAAA,KAAA,CAAAryB,KAAA,UAAAqyB,KAAA,CAAA3e,IAAA,GACA,CACAhd,IAAA,sBAIA88B,KAAA,UAAAA,MAAA,EACAx6B,UAAA,CAAA4V,GAAA,gDAAA+H,MAAA,wDAAAzR,CAAA,CAAAwO,IAAA,CAAA1T,KAAA,CAAA/B,QAAA,OACA,CAAAka,WAAA,CAAAnf,UAAA,CAAAoL,cAAA,GACAgU,OAAA,CAAApf,UAAA,CAAAmL,UAAA,GACAsC,iBAAA,CAAAzN,UAAA,CAAAsL,UAAA,GACAm2B,WAAA,CAAAh0B,iBAAA,CAAA4rB,KAAA,KACA9zB,cAAA,CAAA4Z,WAAA,CAAA5Z,cAAA,CACAqa,MAAA,CAAAX,gBAAA,CAAAW,MAAA,CAAAR,OAAA,CAAA7Z,cAAA,EACAm8B,cAAA,CAAA12B,SAAA,CAAAjF,eAAA,CAAAqZ,OAAA,CAAA7Z,cAAA,sBACAo8B,yBAAA,CAAA32B,SAAA,CAAAjF,eAAA,CAAAqZ,OAAA,CAAA7Z,cAAA,iCACA,IAAAq8B,WAAA,KAAAxjB,OAAA,UAAAC,OAAA,CAAA1B,MAAA,EAEA,GAAAiD,MAAA,EAAA8hB,cAAA,CACArjB,OAAA,OAEA,IAAAijB,iBAAA,CAAA5mB,IAAA,SAAA1T,KAAA,CAAA/B,QAAA,IAAA08B,yBAAA,GAAAF,WAAA,CAAAI,eAAA,EACA,MAAA9B,iBAAA,CAAAjhC,EAAA,uBACAkB,UAAA,CAAA4B,OAAA,qBAAA0zB,QAAA,CAAAwK,cAAA,WAAA9/B,UAAA,CAAA8hC,WAAA,IAAA/B,iBAAA,EAAA1hB,OAAA,CAAA1B,MAAA,EACAqR,OAAA,EACAC,MAAA,EACAC,EAAA,CAAA6R,iBAAA,CACA5R,MAAA,CAAArvB,EAAA,qBACA,CACA,CACA,EACA,KACA,CAAAuf,OAAA,EAEA,GASA,MARA,CAAAujB,WAAA,CAAApV,KAAA,UAAAuV,WAAA,EAIAjlC,CAAA,CAAAqF,KAAA,YACAnC,UAAA,CAAA4B,OAAA,wBACA,EACA,GACAggC,WACA,EACA,EAIA/J,QAAA,UAAAA,SAAA,EACA,YAAA4C,QAAA,EACA,EAIAA,QAAA,UAAAA,SAAA,EACAz6B,UAAA,CAAA4V,GAAA,+CACA,CACA,CAGA,CAjHA9Y,CAAA,CAAAA,CAAA,EAAAO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAV,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACAgC,EAAA,CAAAA,EAAA,EAAAzB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAsB,EAAA,YAAAA,EAAA,YAAAA,EAAA,CACAw2B,QAAA,CAAAA,QAAA,EAAAj4B,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA83B,QAAA,YAAAA,QAAA,YAAAA,QAAA,CACArW,gBAAA,CAAAA,gBAAA,EAAA5hB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAyhB,gBAAA,YAAAA,gBAAA,YAAAA,gBAAA,CACA0hB,MAAA,CAAAA,MAAA,EAAAtjC,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAmjC,MAAA,YAAAA,MAAA,YAAAA,MAAA,CACA31B,SAAA,CAAAA,SAAA,EAAA3N,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAwN,SAAA,YAAAA,SAAA,YAAAA,SAAA,CAuBA,IAAA82B,WAAA,CAAAhjC,EAAA,iFAuFA,OAAAuiC,0BAEA,GAEAxkC,MCzHA,gaAAAC,CAAA,CAAA89B,iBAAA,CAAAN,oBAAA,CAAAY,wBAAA,CAAAE,eAAA,CAAAiG,0BAAA,eAuCA,SAAAW,mBAAAhiC,UAAA,CAAA6X,UAAA,KAMA,CAAAoqB,OAAA,IAOAC,iBAAA,UAAAA,kBAAA/I,OAAA,CAAAlY,MAAA,EACA,IAAAkhB,GAAA,CAAArlC,CAAA,CAAAo8B,IAAA,CAAAkJ,eAAA,EACA,GAAAtlC,CAAA,CAAA0iB,OAAA,CAAA2Z,OAAA,GAAAr8B,CAAA,CAAA0iB,OAAA,CAAAyB,MAAA,IAAAnkB,CAAA,CAAAulC,QAAA,CAAAF,GAAA,CAAAlhB,MAAA,EACA,UAAAjX,SAAA,4CACA,MACA,CAAAlN,CAAA,CAAA+I,OAAA,CAAAo8B,OAAA,CAAA9I,OAAA,GAGA/a,OAAA,CAAAob,GAAA,CAAA18B,CAAA,CAAAgH,GAAA,CAAAm+B,OAAA,CAAA9I,OAAA,WAAAphB,QAAA,EACA,GAAAjb,CAAA,CAAAwM,UAAA,CAAAyO,QAAA,CAAAkJ,MAAA,GACA,OAAAlJ,QAAA,CAAAkJ,MAAA,GAEA,IANA7C,OAAA,CAAAC,OAAA,EAOA,EACAikB,mBAAA,CAAAzqB,UAAA,EAAA0qB,0BAAA,CA1BAH,eAAA,CA6BA,IAAApiC,UAAA,GAAAlD,CAAA,CAAAwM,UAAA,CAAAtJ,UAAA,CAAAkB,EAAA,IAAApE,CAAA,CAAAwM,UAAA,CAAAtJ,UAAA,CAAAoL,cAAA,EACA,UAAApB,SAAA,oDAoEA,MA9DA,CAAAo4B,eAAA,EAMA5H,KAAA,UAAAA,MAAAnB,KAAA,EAQA,MAPA,CAAAv8B,CAAA,CAAAyE,OAAA,CAAA+gC,mBAAA,UAAAE,iBAAA,EACA,IAAAzqB,QAAA,CAAAyqB,iBAAA,CAAAxiC,UAAA,CAAAq5B,KAAA,EACA,KAAAthB,QAAA,GACAkqB,OAAA,CAAA5I,KAAA,CAAA70B,EAAA,EAAAy9B,OAAA,CAAA5I,KAAA,CAAA70B,EAAA,MACAy9B,OAAA,CAAA5I,KAAA,CAAA70B,EAAA,EAAAkM,IAAA,CAAAqH,QAAA,EAEA,GACAmqB,iBAAA,CAAA7I,KAAA,CAAA70B,EAAA,SACA,EAKAi+B,UAAA,UAAAA,WAAApJ,KAAA,QACA,CAAAA,KAAA,EAAAA,KAAA,CAAA70B,EAAA,EAAA1H,CAAA,CAAA+I,OAAA,CAAAo8B,OAAA,CAAA5I,KAAA,CAAA70B,EAAA,GACAy9B,OAAA,CAAA5I,KAAA,CAAA70B,EAAA,EAEA,EACA,EAMA6gB,KAAA,UAAAA,MAAAgU,KAAA,EACA,OAAA6I,iBAAA,CAAA7I,KAAA,CAAA70B,EAAA,SACA,EAMA8gB,IAAA,UAAAA,KAAA+T,KAAA,EACA,OAAA6I,iBAAA,CAAA7I,KAAA,CAAA70B,EAAA,QACA,EAMAqzB,QAAA,UAAAA,SAAAwB,KAAA,EACA,OAAA6I,iBAAA,CAAA7I,KAAA,CAAA70B,EAAA,YACA,EAOAi2B,QAAA,UAAAA,SAAApB,KAAA,EACA,OAAA6I,iBAAA,CAAA7I,KAAA,CAAA70B,EAAA,aAAA2mB,IAAA,YACA8W,OAAA,CAAAnlC,CAAA,CAAAm9B,IAAA,CAAAgI,OAAA,CAAA5I,KAAA,CAAA70B,EAAA,CACA,EACA,CACA,EACA49B,eACA,CAzIAtlC,CAAA,CAAAA,CAAA,EAAAO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAV,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACA89B,iBAAA,CAAAA,iBAAA,EAAAv9B,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAo9B,iBAAA,YAAAA,iBAAA,YAAAA,iBAAA,CACAN,oBAAA,CAAAA,oBAAA,EAAAj9B,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA88B,oBAAA,YAAAA,oBAAA,YAAAA,oBAAA,CACAY,wBAAA,CAAAA,wBAAA,EAAA79B,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA09B,wBAAA,YAAAA,wBAAA,YAAAA,wBAAA,CACAE,eAAA,CAAAA,eAAA,EAAA/9B,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA49B,eAAA,YAAAA,eAAA,YAAAA,eAAA,CACAiG,0BAAA,CAAAA,0BAAA,EAAAhkC,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6jC,0BAAA,YAAAA,0BAAA,YAAAA,0BAAA,CAwBA,IAAAkB,0BAAA,EAAA3H,iBAAA,CAAAN,oBAAA,CAAAY,wBAAA,CAAAE,eAAA,CAAAiG,0BAAA,EA8GA,OAAAW,kBAEA,GAEAnlC,MCjJA,mHAAAC,CAAA,CAAAgC,EAAA,CAAA23B,MAAA,CAAAnG,MAAA,CAAAvB,aAAA,eA2FA,SAAA4K,UAAA+I,eAAA,CAAAv7B,QAAA,CAAApG,MAAA,KACA,CAAA+3B,MAAA,IAKA6J,mBAAA,CAAA7lC,CAAA,CAAAoL,MAAA,CAAAnH,MAAA,CAAAu2B,QAAA,UAAAnvB,GAAA,CAAAmvB,QAAA,CAAAsL,QAAA,EACA,IAAA57B,KAAA,CAAA67B,QAAA,CAAAD,QAAA,EAYA,MAXA,CAAAz6B,GAAA,CAAAnB,KAAA,EAAAlK,CAAA,CAAAgH,GAAA,CAAAwzB,QAAA,UAAAn3B,KAAA,CAAAud,GAAA,EACA,OACA+Z,SAAA,MAAAhX,QAAA,CAAA/C,GAAA,KACAhB,OAAA,UAAAomB,aAAA9L,aAAA,EACA,IAAA+L,gBAAA,CAAAtM,MAAA,CAAAxH,QAAA,CAAA+H,aAAA,iBAAAgM,QAAA,GACA,OAAA1S,MAAA,CAAA2S,eAAA,CAAAj8B,KAAA,EAAA+7B,gBAAA,CACA,EACArL,KAAA,CAAAv3B,KAAA,CACAq3B,KAAA,GACA,CACA,GACArvB,GACA,MAKA,MAAA+6B,kCAAA,CAAApmC,CAAA,CAAAoL,MAAA,CAAAnH,MAAA,CAAA42B,uBAAA,EAAAxvB,GAAA,CAAAmvB,QAAA,CAAAsL,QAAA,IACA,MAAA57B,KAAA,CAAA67B,QAAA,CAAAD,QAAA,EAUA,MATA,CAAAz6B,GAAA,CAAAnB,KAAA,EAAAlK,CAAA,CAAAgH,GAAA,CAAAwzB,QAAA,CAAAn3B,KAAA,IACAs3B,SAAA,MAAAhX,QAAA,CAAAtgB,KAAA,KACAuc,OAAA,UAAAomB,aAAA9L,aAAA,CAAAnB,mBAAA,EACA,MAAAkN,gBAAA,CAAAtM,MAAA,CAAAxH,QAAA,CAAA+H,aAAA,iBAAAgM,QAAA,GACA,OAAA1S,MAAA,CAAA6S,8BAAA,CAAAn8B,KAAA,EAAA+7B,gBAAA,CAAAlN,mBAAA,CACA,EACA7uB,KAAA,CACAwwB,KAAA,GACA,IACArvB,GACA,MAQA,IAAAi7B,UAAA,UAAAA,WAAA1oB,IAAA,CAAA2oB,cAAA,EAeA,IAAAhK,KAAA,CAAAv8B,CAAA,CAAAwmC,IAAA,CAAAD,cAAA,wDACAhK,KAAA,CAAA3e,IAAA,CAAAA,IAAA,CACA2e,KAAA,CAAAkK,mBAAA,CAAAF,cAAA,CAAAE,mBAAA,CACA,QAAA7oB,IAAA,EACA2e,KAAA,CAAA70B,EAAA,IAAAkW,IAAA,IAAA2oB,cAAA,CAAAr8B,KAAA,IAAAq8B,cAAA,CAAAzW,MAAA,GACAyM,KAAA,CAAAmK,YAAA,MAAAH,cAAA,CAAAI,OAAA,CACApK,KAAA,CAAArC,aAAA,MAAAqM,cAAA,CAAAK,gBAAA,GAEArK,KAAA,CAAA70B,EAAA,CAAA6+B,cAAA,CAAAzW,MAAA,CACAyM,KAAA,CAAAmK,YAAA,MAAAH,cAAA,CAAAM,OAAA,CACAtK,KAAA,CAAArC,aAAA,MAAAqM,cAAA,CAAAO,gBAAA,EAEAvK,KAAA,CAAAU,yBAAA,CAAAV,KAAA,CAAArC,aAAA,CACAqC,KAAA,CAAAS,SAAA,UAAAT,KAAA,CAAA3e,IAAA,GACA2e,KAAA,CAAAS,SAAA,CAAAmB,QAAA,OACA5B,KAAA,CAAAS,SAAA,CAAA+J,SAAA,OACAxK,KAAA,CAAAS,SAAA,CAAAl2B,KAAA,OACAy1B,KAAA,CAAAz1B,KAAA,CAAAy1B,KAAA,CAAAmK,YAAA,CAAAnK,KAAA,CAAAS,SAAA,CAAAl2B,KAAA,CACAy1B,KAAA,CAAArC,aAAA,EAAAqC,KAAA,CAAAS,SAAA,CAAA+J,SAAA,EAIA,QAAAnpB,IAAA,EAAA5d,CAAA,CAAA+I,OAAA,CAAA88B,mBAAA,CAAAtJ,KAAA,CAAAryB,KAAA,KACAqyB,KAAA,CAAA/B,QAAA,CAAAqL,mBAAA,CAAAtJ,KAAA,CAAAryB,KAAA,GAEAlK,CAAA,CAAA+I,OAAA,CAAAq9B,kCAAA,CAAA7J,KAAA,CAAAryB,KAAA,KACAqyB,KAAA,CAAA1B,uBAAA,CAAAuL,kCAAA,CAAA7J,KAAA,CAAAryB,KAAA,GAEA,MAAAJ,KAAA,CAAA7F,MAAA,CAAA+iC,cAAA,CAAAzK,KAAA,CAAAryB,KAAA,EAEA,MADA,CAAAqyB,KAAA,CAAAxD,mBAAA,CAAAjvB,KAAA,EAAAA,KAAA,CAAAjD,SAAA,CAAAiD,KAAA,CAAA/G,QAAA,CACAw5B,KACA,EA6BA,MA5BA,CAAAv8B,CAAA,CAAAyE,OAAA,CAAAmhC,eAAA,UAAAqB,cAAA,KACA,CAAAV,cAAA,CAAAvmC,CAAA,CAAAosB,KAAA,CAAA6a,cAAA,EACAC,QAAA,CACAX,cAAA,CAAAr8B,KAAA,CAAA67B,QAAA,CAAAkB,cAAA,CAAA/8B,KAAA,EAAA+8B,cAAA,CAAA1I,YAAA,EACAgI,cAAA,CAAAr8B,KAAA,CAEA,KAAAq8B,cAAA,CAAAI,OAAA,OAAAJ,cAAA,CAAAM,OAAA,CACA3U,MAAA,CAAAiB,IAAA,mDAGAlvB,MAAA,CAAAo6B,gBAAA,EAAAh0B,QAAA,EAAAk8B,cAAA,CAAAM,OAAA,EAAAN,cAAA,CAAAI,OAAA,EAAAJ,cAAA,CAAAI,OAAA,GAAAJ,cAAA,CAAAM,OAAA,IAAAN,cAAA,CAAAM,OAAA,EACAK,QAAA,CAAAZ,UAAA,UAAAC,cAAA,EACAvK,MAAA,CAAAkL,QAAA,CAAAx/B,EAAA,EAAAw/B,QAAA,GAGA78B,QAAA,EAAAk8B,cAAA,CAAAI,OAAA,IAAAJ,cAAA,CAAAI,OAAA,GACAO,QAAA,CAAAZ,UAAA,OAAAC,cAAA,EACAvK,MAAA,CAAAkL,QAAA,CAAAx/B,EAAA,EAAAw/B,QAAA,EAIAX,cAAA,CAAAM,OAAA,IAAAN,cAAA,CAAAM,OAAA,GACAK,QAAA,CAAAZ,UAAA,OAAAC,cAAA,EACAvK,MAAA,CAAAkL,QAAA,CAAAx/B,EAAA,EAAAw/B,QAAA,GAlBAhV,MAAA,CAAAiB,IAAA,yEAqBA,GACAjB,MAAA,CAAAiV,KAAA,qCAAAnL,MAAA,EACAA,MACA,CAlNAh8B,CAAA,CAAAA,CAAA,EAAAO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAV,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACAgC,EAAA,CAAAA,EAAA,EAAAzB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAsB,EAAA,YAAAA,EAAA,YAAAA,EAAA,CACA23B,MAAA,CAAAA,MAAA,EAAAp5B,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAi5B,MAAA,YAAAA,MAAA,YAAAA,MAAA,CACAnG,MAAA,CAAAA,MAAA,EAAAjzB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA8yB,MAAA,YAAAA,MAAA,YAAAA,MAAA,CACAvB,aAAA,CAAAA,aAAA,EAAA1xB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAuxB,aAAA,YAAAA,aAAA,YAAAA,aAAA,IAmBA,CAAAC,MAAA,CAAAD,aAAA,oDAKAyJ,SAAA,KAKAhG,MAAA,sCAKA0R,YAAA,EACAC,cAAA,QACAC,iBAAA,WACAC,iBAAA,OACA,EAOAxB,QAAA,UAAAA,SAAA1iC,KAAA,QACA,CAAA+jC,YAAA,CAAA/jC,KAAA,EACA+jC,YAAA,CAAA/jC,KAAA,EAEArD,CAAA,CAAAulC,QAAA,CAAA7P,MAAA,CAAAryB,KAAA,EACAA,KAAA,CAEA,IACA,EAMA8iC,eAAA,EACAtjC,IAAA,CAAAb,EAAA,gEACAyF,OAAA,CAAAzF,EAAA,mEACA4gB,QAAA,CAAA5gB,EAAA,qEACA5B,IAAA,CAAA4B,EAAA,+DACA,EAKA,MAAAqkC,8BAAA,EACAxjC,IAAA,CAAAb,EAAA,wDACAyF,OAAA,CAAAzF,EAAA,uDACA4gB,QAAA,CAAA5gB,EAAA,uDACA5B,IAAA,CAAA4B,EAAA,sDACA,EAsIA,OAAA66B,SAEA,GAEA98B,MC1NA,sZAAAsQ,GAAA,CAAArQ,CAAA,CAAAC,aAAA,CAAAilC,kBAAA,CAAApJ,eAAA,CAAA0L,aAAA,CAAAjhC,oBAAA,CAAAu8B,WAAA,CAAAv/B,UAAA,CAAAC,QAAA,eAwBA,SAAAikC,4BAAA/jC,IAAA,CAAAC,OAAA,CAAAC,QAAA,EACA,IAAAC,IAAA,CAAAC,QAAA,CAAAJ,IAAA,CAAAC,OAAA,EACA,OAAAC,QAAA,KAAAC,IAAA,CAAAE,CAAA,CAAAF,IAAA,CACA,CAzBAwM,GAAA,CAAAA,GAAA,EAAA9P,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA2P,GAAA,YAAAA,GAAA,YAAAA,GAAA,CACArQ,CAAA,CAAAA,CAAA,EAAAO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAV,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACAC,aAAA,CAAAA,aAAA,EAAAM,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAT,aAAA,YAAAA,aAAA,YAAAA,aAAA,CACAilC,kBAAA,CAAAA,kBAAA,EAAA3kC,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAwkC,kBAAA,YAAAA,kBAAA,YAAAA,kBAAA,CACApJ,eAAA,CAAAA,eAAA,EAAAv7B,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAo7B,eAAA,YAAAA,eAAA,YAAAA,eAAA,CACA0L,aAAA,CAAAA,aAAA,EAAAjnC,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA8mC,aAAA,YAAAA,aAAA,YAAAA,aAAA,CACAjhC,oBAAA,CAAAA,oBAAA,EAAAhG,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6F,oBAAA,YAAAA,oBAAA,YAAAA,oBAAA,CACAu8B,WAAA,CAAAA,WAAA,EAAAviC,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAoiC,WAAA,YAAAA,WAAA,YAAAA,WAAA,CACAv/B,UAAA,CAAAA,UAAA,EAAAhD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6C,UAAA,YAAAA,UAAA,YAAAA,UAAA,CACAC,QAAA,CAAAA,QAAA,EAAAjD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA8C,QAAA,YAAAA,QAAA,YAAAA,QAAA,CAEAA,QAAA,CAAA8B,aAAA,GACA9B,QAAA,CAAAD,UAAA,EACAC,QAAA,CAAA8B,aAAA,KAEA,IAAAxB,QAAA,CAAAP,UAAA,CAAAgC,QAAA,UAAAhC,UAAA,CAAAiC,MAAA,CAAAC,OAAA,CAAAC,QAAA,CAAAhC,IAAA,EAKA,MAJA,MAAAkC,YAAA,gBACAH,OAAA,MAAAI,KAAA,CAAAJ,OAAA,CAAAlC,UAAA,CAAAkC,OAAA,EAGA,6DACA,GAyBA,MAAAiiC,+BAAA,KAKA,IAAAj3B,MAAA,CAAAxQ,aAAA,EACAW,IAAA,SAIAqgB,QAAA,EACA,MAAA/d,UAAA,MAAAnC,aAAA,GAQA,KAAA4mC,UAAA,UAAAA,WAAAC,SAAA,CAAA3jC,MAAA,OACA,CAAAoe,WAAA,CAAAnf,UAAA,CAAAoL,cAAA,GACAsU,QAAA,CAAA1f,UAAA,CAAAu6B,cAAA,GACApzB,QAAA,CAAAuY,QAAA,EAAAA,QAAA,CAAAvY,QAAA,CACAu7B,eAAA,CAAAvjB,WAAA,CAAAujB,eAAA,CACA5J,MAAA,CAAAwL,aAAA,CAAA5B,eAAA,CAAAv7B,QAAA,CAAApG,MAAA,EACA,OAAAqd,OAAA,CAAAob,GAAA,CAAA18B,CAAA,CAAAgH,GAAA,CAAAg1B,MAAA,UAAAO,KAAA,EACA,OAAAqL,SAAA,CAAAp/B,OAAA,aAAA+zB,KAAA,CAAA70B,EAAA,IAAA2mB,IAAA,UAAAwZ,iBAAA,EACA7nC,CAAA,CAAAkjB,QAAA,CAAA2kB,iBAAA,MAAAA,iBAAA,EAAA5jC,MAAA,CAAA6jC,sBAAA,GACAvL,KAAA,CAAArC,aAAA,CAAAqC,KAAA,CAAAmK,YAAA,CAAAnK,KAAA,CAAAS,SAAA,CAAAl2B,KAAA,CAAA+gC,iBAAA,CAEA,EACA,IAAAxZ,IAAA,YACA,OAAA2N,MACA,EACA,EAQA,KAAA+L,UAAA,UAAAA,WAAAH,SAAA,CAAA5L,MAAA,EACA,OAAA1a,OAAA,CAAAob,GAAA,CAAA18B,CAAA,CAAAgH,GAAA,CAAAg1B,MAAA,UAAAO,KAAA,EACA,OAAAqL,SAAA,CAAA1U,OAAA,aAAAqJ,KAAA,CAAA70B,EAAA,GAAA60B,KAAA,CAAAmK,YAAA,CAAAnK,KAAA,CAAAS,SAAA,CAAAl2B,KAAA,CAAAy1B,KAAA,CAAArC,aAAA,CACA,GACA,EAGAh3B,UAAA,CAAAkvB,YAAA,GAAAC,WAAA,MAAAxhB,OAAA,GACA,EAMAhQ,IAAA,UAAAA,KAAA,EAoDA,SAAAmnC,gBAAAJ,SAAA,EACA,MAAAvlB,WAAA,CAAAnf,UAAA,CAAAoL,cAAA,GAEA,GAAAxN,IAAA,CAAAi7B,QAAA,EAAA1Z,WAAA,CAAAujB,eAAA,CACA,OAAA9kC,IAAA,CAAA6mC,UAAA,CAAAC,SAAA,CAAA3jC,MAAA,EAAAoqB,IAAA,UAAA2N,MAAA,EACA,OAAAl7B,IAAA,CAAAi7B,QAAA,CAAAjqB,MAAA,CAAAkqB,MAAA,CACA,GAAAtM,KAAA,CAAAuY,WAAA,CAEA,MA3DA,CAAAnnC,IAAA,MACAoC,UAAA,MAAAnC,aAAA,GACA4P,iBAAA,CAAAzN,UAAA,CAAAsL,UAAA,GACA,IAAA05B,gCAAA,CACA,MAAAp+B,KAAA,IACA,qCAAArF,OAAA,CAAAyF,KAAA,EAAA3J,MAAA,CAAAkL,MAAA,CAAA3B,KAAA,EACA,CAAAI,KAAA,EAAA44B,WAAA,CAAAJ,eAAA,CAAAx4B,KAAA,CAAAhH,UAAA,CACA,SAKA,CAAAe,MAAA,CAAA1D,MAAA,CAAAkL,MAAA,EAIA08B,kBAAA,IAIA3N,QAAA,CAAA7pB,iBAAA,CAAAy3B,YAAA,KAIAvN,uBAAA,CAAAlqB,iBAAA,CAAA03B,2BAAA,KAIAhK,gBAAA,CAAA1tB,iBAAA,CAAA0tB,gBAAA,CAIAyJ,sBAAA,CAAAn3B,iBAAA,CAAA4rB,KAAA,EAAA5rB,iBAAA,CAAA4rB,KAAA,CAAAuL,sBAAA,CAIAd,cAAA,CAAAl9B,KACA,OAAAoJ,SAAA,IAKAoyB,eAAA,CAAAJ,kBAAA,CAAAhiC,UAAA,EAMA+kC,WAAA,CAAA7hB,GAAA,GACAljB,UAAA,CAAA4B,OAAA,SAAAshB,GAAA,CACA,EAUA,WAAA9E,OAAA,UAAAC,OAAA,EAEA,OAAAre,UAAA,CAAAwvB,cAAA,CAAA5xB,IAAA,CAAA+P,OAAA,IAAAwd,IAAA,UAAAuZ,SAAA,EACA1kC,UAAA,CAAA2d,MAAA,yBACA,OAAAmnB,eAAA,CAAAJ,SAAA,CACA,GAAA/mB,MAAA,yBACA,GAAA5c,MAAA,CAAA6jC,sBAAA,CACA,OAAAE,eAAA,CAAAJ,SAAA,CAEA,GAAAxjC,EAAA,iBAAA4uB,OAAA,EACA,GAAAlyB,IAAA,CAAAi7B,QAAA,OACA,CAAAC,MAAA,CAAAl7B,IAAA,CAAAi7B,QAAA,CAAAc,SAAA,GACAyL,aAAA,CAAA/nC,MAAA,CAAA67B,IAAA,CAAAJ,MAAA,EAAA5wB,MAAA,EAAAC,GAAA,CAAAk9B,SAAA,SACA,CAAAC,UAAA,CAAA1F,WAAA,CAAAJ,eAAA,CAAA1G,MAAA,CAAAuM,SAAA,EAAAr+B,KAAA,CAAAhH,UAAA,EACA61B,mBAAA,CAAAyP,UAAA,EAAAA,UAAA,CAAA3hC,SAAA,CAAA2hC,UAAA,CAAAzlC,QAAA,CAKA,MAJA,CAAAsI,GAAA,CAAAk9B,SAAA,EAAAhoC,MAAA,CAAAkL,MAAA,IAAAuwB,MAAA,CAAAuM,SAAA,GACArO,aAAA,CAAA8B,MAAA,CAAAuM,SAAA,EAAArO,aAAA,CAAAlH,OAAA,CACA+F,mBACA,GACA1tB,GACA,MACAvK,IAAA,CAAAi7B,QAAA,CAAAjqB,MAAA,CAAAw2B,aAAA,EAAA5Y,KAAA,CAAAuY,WAAA,CACA,CACA,GAAAjnC,KAAA,yBACAF,IAAA,CAAAi7B,QAAA,GACA1rB,GAAA,CAAAvP,IAAA,CAAAi7B,QAAA,CAAAn3B,UAAA,IAAAxD,IAAA,mBAAAQ,IAAA,eAAA2E,oBAAA,CAAArD,UAAA,GACApC,IAAA,CAAAi7B,QAAA,CAAAxT,KAAA,IAEAznB,IAAA,CAAA2nC,6BAAA,CAAAl2B,IAAA,IACA,GAAAvR,KAAA,yBACAF,IAAA,CAAAi7B,QAAA,EAAA93B,MAAA,CAAA6jC,sBAAA,EAEAhnC,IAAA,CAAAi7B,QAAA,CAAAxT,KAAA,EAEA,GAAAnkB,EAAA,wBACAtD,IAAA,CAAAi7B,QAAA,EAEAj7B,IAAA,CAAAi7B,QAAA,CAAAvT,IAAA,EAEA,GAAApkB,EAAA,0BACAtD,IAAA,CAAAi7B,QAAA,EAAA93B,MAAA,CAAA6jC,sBAAA,EAEAhnC,IAAA,CAAAi7B,QAAA,CAAAvT,IAAA,EAEA,GACAof,SAAA,CAAAp/B,OAAA,aAAA6lB,IAAA,UAAAqa,QAAA,EAEA5nC,IAAA,CAAAi7B,QAAA,CAAAD,eAAA,EACAyB,UAAA,CAAAh3B,oBAAA,CAAArD,UAAA,EACAm6B,OAAA,EACA3uB,OAAA,IACA4uB,WAAA,GAAAoL,QACA,EACAvN,cAAA,CAAAl3B,MAAA,CAAAkkC,kBACA,GAAA/jC,EAAA,UAAApE,CAAA,CAAA4tB,QAAA,YAEA9sB,IAAA,CAAAinC,UAAA,CAAAH,SAAA,MAAA/K,SAAA,GACA,QAAAz4B,EAAA,qBAAAm4B,KAAA,EACA+I,eAAA,CAAA5H,KAAA,CAAAnB,KAAA,EAAA7M,KAAA,CAAAuY,WAAA,CACA,GAAA7jC,EAAA,wBAAAm4B,KAAA,EACA+I,eAAA,CAAA3H,QAAA,CAAApB,KAAA,EAAA7M,KAAA,CAAAuY,WAAA,CACA,GAAA7jC,EAAA,uBAAAm4B,KAAA,EACA+I,eAAA,CAAA/c,KAAA,CAAAgU,KAAA,EAAA7M,KAAA,CAAAuY,WAAA,CACA,GAAA7jC,EAAA,sBAAAm4B,KAAA,EACA+I,eAAA,CAAA9c,IAAA,CAAA+T,KAAA,EAAA7M,KAAA,CAAAuY,WAAA,CACA,GAAA7jC,EAAA,qBAAAm4B,KAAA,EACA+I,eAAA,CAAAvK,QAAA,CAAAwB,KAAA,EAAA7M,KAAA,CAAAuY,WAAA,CACA,GAAA7jC,EAAA,wBAAA+f,MAAA,CAAAoY,KAAA,EAEAz7B,IAAA,CAAAgE,OAAA,IAAAqf,MAAA,QAAAoY,KAAA,CAAAgC,YAAA,CAAAhC,KAAA,CACA,GAAAn4B,EAAA,sBAAAukC,KAAA,EACAf,SAAA,CAAA1U,OAAA,cAAAyV,KAAA,CACA,GAAAvkC,EAAA,QAAAmd,OAAA,EAAAnd,EAAA,SAAA6jC,WAAA,EAGAnnC,IAAA,CAAAi7B,QAAA,CAAAgB,MAAA,CAAA75B,UAAA,cACAe,MAAA,CAAAkkC,kBAAA,GACArnC,IAAA,CAAAi7B,QAAA,CAAA33B,EAAA,iBAAAwb,OAAA,CAAAgb,KAAA,EACAA,KAAA,EAAAhb,OAAA,EACA1c,UAAA,CAAA4B,OAAA,CAAA81B,KAAA,CAAAhb,OAAA,CAEA,GAGA9e,IAAA,CAAAi7B,QAAA,CAAA33B,EAAA,oBAAApE,CAAA,CAAA4oC,QAAA,EAAAhpB,OAAA,CAAAsa,aAAA,CAAAhwB,KAAA,SACA,CAAAs+B,UAAA,CAAA1F,WAAA,CAAAJ,eAAA,CAAAx4B,KAAA,CAAAhH,UAAA,EACA61B,mBAAA,CAAAyP,UAAA,EAAAA,UAAA,CAAA3hC,SAAA,CAAA2hC,UAAA,CAAAzlC,QAAA,CACAmlC,gCAAA,EACAW,YAAA,CAAAX,gCAAA,EAEApnC,IAAA,CAAA2nC,6BAAA,CAAAl2B,IAAA,CAAAqN,OAAA,CAAAsa,aAAA,CAAAnB,mBAAA,GACAmP,gCAAA,CAAA3M,UAAA,KAAAz6B,IAAA,CAAA2nC,6BAAA,CAAAl2B,IAAA,KAAAm1B,+BAAA,CACA,OACAoB,OAAA,IACAC,QAAA,GACA,IAEA,GAAArZ,KAAA,CAAAuY,WAAA,CACA,EACA,EACA,EAIAr2B,MAAA,UAAAA,OAAA,EACA,MAAA0M,UAAA,MAAApd,aAAA,GAAA2Q,cAAA,GACA,KAAA42B,6BAAA,CAAAp4B,GAAA,CAAAo3B,2BAAA,IACA,KAAA1L,QAAA,CAAAnqB,MAAA,CAAA0M,UAAA,EACAA,UAAA,CAAA1L,MAAA,MAAA61B,6BAAA,CACA,EAIA34B,OAAA,UAAAA,QAAA,EACA,KAAAisB,QAAA,EACA,KAAAA,QAAA,CAAAvT,IAAA,GAAA1Y,OAAA,EAEA,EAIAqO,IAAA,UAAAA,KAAA,EACA,KAAA4d,QAAA,EACA,KAAAA,QAAA,CAAA5d,IAAA,EAEA,EAIAgB,IAAA,UAAAA,KAAA,EACA,KAAA4c,QAAA,EACA,KAAAA,QAAA,CAAA5c,IAAA,EAEA,CACA,GAEA,OAAA1O,MAEA,GAEA1Q,MCjTA,qQAAAsQ,GAAA,CAAArQ,CAAA,CAAAC,aAAA,CAAAsD,UAAA,CAAAC,QAAA,CAAA0K,SAAA,CAAAyqB,eAAA,CAAAgB,MAAA,CAAAmJ,WAAA,eA8CA,SAAAkG,SAAAtlC,IAAA,CAAAC,OAAA,CAAAC,QAAA,EACA,IAAAC,IAAA,CAAAC,QAAA,CAAAJ,IAAA,CAAAC,OAAA,EACA,OAAAC,QAAA,KAAAC,IAAA,CAAAE,CAAA,CAAAF,IAAA,CACA,CA/CAwM,GAAA,CAAAA,GAAA,EAAA9P,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA2P,GAAA,YAAAA,GAAA,YAAAA,GAAA,CACArQ,CAAA,CAAAA,CAAA,EAAAO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAV,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACAC,aAAA,CAAAA,aAAA,EAAAM,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAT,aAAA,YAAAA,aAAA,YAAAA,aAAA,CACAsD,UAAA,CAAAA,UAAA,EAAAhD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6C,UAAA,YAAAA,UAAA,YAAAA,UAAA,CACAC,QAAA,CAAAA,QAAA,EAAAjD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA8C,QAAA,YAAAA,QAAA,YAAAA,QAAA,CACA0K,SAAA,CAAAA,SAAA,EAAA3N,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAwN,SAAA,YAAAA,SAAA,YAAAA,SAAA,CACAyqB,eAAA,CAAAA,eAAA,EAAAp4B,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAi4B,eAAA,YAAAA,eAAA,YAAAA,eAAA,CACAgB,MAAA,CAAAA,MAAA,EAAAp5B,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAi5B,MAAA,YAAAA,MAAA,YAAAA,MAAA,CACAmJ,WAAA,CAAAA,WAAA,EAAAviC,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAoiC,WAAA,YAAAA,WAAA,YAAAA,WAAA,CAEAt/B,QAAA,CAAA8B,aAAA,GACA9B,QAAA,CAAAD,UAAA,EACAC,QAAA,CAAA8B,aAAA,KAEA,IAAAxB,QAAA,CAAAP,UAAA,CAAAgC,QAAA,UAAAhC,UAAA,CAAAiC,MAAA,CAAAC,OAAA,CAAAC,QAAA,CAAAhC,IAAA,EAKA,SAAAiC,SAAAH,MAAA,CAAA9B,IAAA,EAEA,IAAAoC,MAAA,IAAAI,MAAA,CAAAC,MAAA,CAcA,MAbA,CAAAL,MAAA,qCACAK,MAAA,CAAAV,OAAA,CAAAwjC,SAAA,EAAA/iC,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAyjC,SAAA,CAAA/iC,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,4BACAC,MAAA,CAAAV,OAAA,CAAA8e,SAAA,EAAAre,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAA+e,SAAA,CAAAre,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,4CACAC,MAAA,CAAAV,OAAA,CAAAwjC,SAAA,EAAA/iC,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAyjC,SAAA,CAAA/iC,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,iDACAJ,MACA,CArBA,KAAAF,YAAA,gBACAH,OAAA,MAAAI,KAAA,CAAAJ,OAAA,CAAAlC,UAAA,CAAAkC,OAAA,EAAA/B,IAAA,CAAAA,IAAA,KACA,IAAAoC,MAAA,IAAAG,YAAA,YAAAD,gBAAA,MAAAA,gBAAA,CAAAlF,IAAA,MAAAoF,MAAA,CAyBA,MAJA,CAAAJ,MAAA,+EACAI,MAAA,CAAAT,OAAA,CAAA6G,IAAA,CAAA5L,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAA0jC,MAAA,EAAA9iC,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA2F,IAAA,CAAAC,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,GAAAhB,QAAA,CAAAjC,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,eACAA,MACA,GAuBA,MAAA41B,SAAA,KACA,IAAA3W,KAAA,CAAA9kB,aAAA,EACAW,IAAA,SACAC,IAAA,UAAAA,KAAA,OACA,CAAAqC,UAAA,MAAAnC,aAAA,GACAuhB,OAAA,CAAApf,UAAA,CAAAmL,UAAA,GACA86B,YAAA,CAAAA,CAAA,SACA,CAAA9mB,WAAA,CAAAnf,UAAA,CAAAoL,cAAA,GACA86B,WAAA,CAAAl7B,SAAA,CAAAhC,WAAA,CAAAoW,OAAA,CAAAD,WAAA,CAAAe,YAAA,EACA5Q,WAAA,CAAAtE,SAAA,CAAA1F,OAAA,CAAA8Z,OAAA,CAAAD,WAAA,CAAA5Z,cAAA,EAeA,GAZA6Z,OAAA,CAAAyC,KAAA,EACA,KAAAmkB,MAAA,CAAA9oC,IAAA,CAAA8d,MAAA,CAAA3L,IAAA,CAAA+P,OAAA,CAAAyC,KAAA,EAAA5G,IAAA,GAIAirB,WAAA,EAAAA,WAAA,CAAAp5B,KAAA,EACA,KAAAk5B,MAAA,CAAAtmB,QAAA,CAAA1E,MAAA,CAAA3L,IAAA,OAAA62B,WAAA,CAAAp5B,KAAA,IAAAmO,IAAA,GAMAkE,WAAA,CAAAgnB,uBAAA,EACA,MAAA5hC,OAAA,CAAAyG,SAAA,CAAA/B,cAAA,CAAAmW,OAAA,CAAAD,WAAA,CAAAe,YAAA,EAGA,KAAA8lB,MAAA,CAAAzhC,OAAA,CAAAyW,MAAA,CAAA3L,IAAA,OAAA9K,OAAA,CAAAuI,KAAA,EAAAqS,WAAA,CAAAinB,YAAA,IAAAnrB,IAAA,EACA,CAGA3L,WAAA,CAAAxC,KAAA,EACA,KAAAk5B,MAAA,CAAArmC,IAAA,CAAAqb,MAAA,CAAA3L,IAAA,OAAAC,WAAA,CAAAxC,KAAA,IAAAmO,IAAA,EAEA,EACAjb,UAAA,CAAAlC,KAAA,mBACAhB,CAAA,CAAA2tB,MAAA,MAAAub,MAAA,EAAAvlC,OAAA,CAAAuG,KAAA,IACA,KAAAg/B,MAAA,CAAAh/B,KAAA,EAAAgU,MAAA,CAAA3L,IAAA,KACA,KAAA22B,MAAA,CAAAh/B,KAAA,EAAAq/B,MAAA,CAAAh3B,IAAA,KACA,SAAArI,KAAA,GACA,KAAAg/B,MAAA,CAAAh/B,KAAA,EAAAJ,KAAA,CAAAg5B,WAAA,CAAAJ,eAAA,CAAAx4B,KAAA,CAAAhH,UAAA,EAEA,GACAimC,YAAA,EACA,GAAA/kC,EAAA,cAAA81B,aAAA,CAAAhwB,KAAA,IACA,MAAA6a,KAAA,MAAAmkB,MAAA,CAAAh/B,KAAA,EACA,IAAA6a,KAAA,CACA,OACA,KACA,CACAwkB,MAAA,CACAz/B,KACA,OAAAo/B,MAAA,CAAAh/B,KAAA,EACAqwB,IAAA,CAAAZ,MAAA,CAAAxH,QAAA,CAAA+H,aAAA,CAAAwB,SAAA,YACA9C,KAAA,CAAA2B,IAAA,CAAAnmB,GAAA,UACAykB,OAAA,CAAA0B,IAAA,CAAAnmB,GAAA,YACA0kB,OAAA,CAAAyB,IAAA,CAAAnmB,GAAA,YACA2kB,mBAAA,CAAAjvB,KAAA,EAAAA,KAAA,CAAAjD,SAAA,CAAAiD,KAAA,CAAA/G,QAAA,CAGAwmC,MAAA,EACAA,MAAA,CAAAh3B,IAAA,CAAAomB,eAAA,CAAAC,KAAA,CAAAC,OAAA,CAAAC,OAAA,CAAAC,mBAAA,EAEA,GAAA30B,EAAA,mBACAiM,GAAA,sBAAApB,QAAA,EAAAkQ,IAAA,EACA,EACA,EACAvN,MAAA,UAAAA,OAAA,EACA,MAAA0M,UAAA,MAAApd,aAAA,GAAA2Q,cAAA,GACA,KAAAq3B,MAAA,EACA9oC,IAAA,EACA6oC,SAAA,kBACA1kB,SAAA,GACA,EACA3B,QAAA,EACAqmB,SAAA,uBACA1kB,SAAA,iBACA,EACA9c,OAAA,EACAwhC,SAAA,qBACA1kB,SAAA,GACA,EACA1hB,IAAA,EACAomC,SAAA,uBACA1kB,SAAA,iBACA,CACA,EACA,KAAAtV,QAAA,CAAAoB,GAAA,CAAA24B,QAAA,EACAE,MAAA,CAAAlpC,CAAA,CAAAuK,MAAA,MAAA2+B,MAAA,CACA,IAGA74B,GAAA,sBAAApB,QAAA,EAAAkQ,IAAA,GACAb,UAAA,CAAA1L,MAAA,MAAA3D,QAAA,EACAjP,CAAA,CAAA2tB,MAAA,MAAAub,MAAA,EAAAz+B,IAAA,CAAAP,KAAA,IACA,IACA++B,SACA,EAAAx+B,IAAA,CACA,KAAAy+B,MAAA,CAAAh/B,KAAA,EAAAgU,MAAA,CAAAI,UAAA,CAAAld,IAAA,mBAAA6nC,SAAA,MACA,KAAAC,MAAA,CAAAh/B,KAAA,EAAAq/B,MAAA,CAAAjrB,UAAA,CAAAld,IAAA,mBAAA6nC,SAAA,WACA,EACA,CACA,GAEA,OAAAlkB,KAEA,GAEAhlB,MCjLA,qHAAAC,CAAA,CAAA25B,MAAA,CAAA15B,aAAA,eAkCA,SAAAupC,UAAA,EACA,OAAAC,IAAA,CAAAC,GAAA,OACA,CAlCA1pC,CAAA,CAAAA,CAAA,EAAAO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAV,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACA25B,MAAA,CAAAA,MAAA,EAAAp5B,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAi5B,MAAA,YAAAA,MAAA,YAAAA,MAAA,CACA15B,aAAA,CAAAA,aAAA,EAAAM,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAT,aAAA,YAAAA,aAAA,YAAAA,aAAA,IAwBA,CAAAy7B,SAAA,KAaAiO,kBAAA,CAAA1pC,aAAA,EACAW,IAAA,sBAIAqgB,OAAA,UAAAA,QAAA,EAIA,KAAAlgB,aAAA,GAAAqxB,YAAA,GAAAC,WAAA,SACA,EAIAxxB,IAAA,UAAAA,KAAA,EAGA,SAAA+oC,QAAAxjB,GAAA,EACAljB,UAAA,CAAA4B,OAAA,SAAAshB,GAAA,CACA,IAJA,CAAAljB,UAAA,MAAAnC,aAAA,GACA8oC,SAAA,IAIA,OAAA3mC,UAAA,CAAAwvB,cAAA,UAAArE,IAAA,UAAAyb,WAAA,EACA5mC,UAAA,CAAAlC,KAAA,oCACA,IAAAgL,OAAA,CAAA9I,UAAA,CAAAoL,cAAA,GACAu7B,SAAA,EACAE,sBAAA,CAAAP,SAAA,EACA,EACAM,WAAA,CAAAthC,OAAA,CAAAwD,OAAA,CAAAvD,cAAA,EAAA4lB,IAAA,UAAA3qB,IAAA,EAIA,MAHA,CAAAA,IAAA,EACA1D,CAAA,CAAA6F,KAAA,CAAAgkC,SAAA,CAAAnmC,IAAA,EAEAomC,WAAA,CAAA5W,OAAA,CAAAlnB,OAAA,CAAAvD,cAAA,CAAAohC,SAAA,CACA,GAAAna,KAAA,CAAAka,OAAA,CACA,GAAA/oB,MAAA,qCACA,IAAA7U,OAAA,CAAA9I,UAAA,CAAAoL,cAAA,GAGA,MAFA,CAAAu7B,SAAA,CAAAG,oBAAA,CAAAR,SAAA,GACAK,SAAA,CAAAI,aAAA,CAAAtQ,MAAA,GAAAuQ,SAAA,CAAAvQ,MAAA,GAAAuQ,SAAA,IAAA1W,MAAA,MACAsW,WAAA,CAAA5W,OAAA,CAAAlnB,OAAA,CAAAvD,cAAA,CAAAohC,SAAA,EAAAna,KAAA,CAAAka,OAAA,CACA,GAAA/oB,MAAA,yBACA,IAAA7U,OAAA,CAAA9I,UAAA,CAAAoL,cAAA,GACA,OAAApL,UAAA,CAAA6rB,QAAA,GAAAob,cAAA,CAAAn+B,OAAA,CAAAvD,cAAA,mBACA2hC,SAAA,CAAAC,IAAA,CAAAC,SAAA,CAAAT,SAAA,CACA,KACA,EACA,EACA,CACA,GAEA,OAAAF,kBAEA,GAEA5pC,MC5FA,kJAAAC,CAAA,CAAAgC,EAAA,CAAA/B,aAAA,CAAAu/B,iBAAA,eAEAx/B,CAAA,CAAAA,CAAA,EAAAO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAV,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACAgC,EAAA,CAAAA,EAAA,EAAAzB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAsB,EAAA,YAAAA,EAAA,YAAAA,EAAA,CACA/B,aAAA,CAAAA,aAAA,EAAAM,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAT,aAAA,YAAAA,aAAA,YAAAA,aAAA,CACAu/B,iBAAA,CAAAA,iBAAA,EAAAj/B,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA8+B,iBAAA,YAAAA,iBAAA,YAAAA,iBAAA,IAwBA,CAAAr7B,QAAA,EACAomC,YAAA,GACA,EAMAC,aAAA,CAAAvqC,aAAA,EAKAW,IAAA,iBAKAC,KAAA,OACA,CAAAqC,UAAA,MAAAnC,aAAA,GACA4P,iBAAA,CAAAzN,UAAA,CAAAsL,UAAA,GACAmP,YAAA,CAAApd,MAAA,CAAAkL,MAAA,IAAAtH,QAAA,MAAA+O,SAAA,IACAhQ,UAAA,CAAA2d,MAAA,2BACA,CAAAwB,WAAA,CAAAnf,UAAA,CAAAoL,cAAA,GACAm8B,aAAA,EAAAvnC,UAAA,CAAAwnC,YAAA,CAAAroB,WAAA,CAAA5Z,cAAA,aACA8d,OAAA,CAAA5I,YAAA,CAAA4sB,YAAA,CAAAvoC,EAAA,yCAAAA,EAAA,2DACA,GAAAyoC,aAAA,EAAA95B,iBAAA,CAAAg6B,mBAAA,OACA,CAAAC,UAAA,CAAA1nC,UAAA,CAAAwN,cAAA,GAEA85B,aAAA,mBAAAI,UAAA,CAAAJ,aAAA,CAAAI,UAAA,CAAAJ,aAAA,CAAAnoB,WAAA,CAAAmoB,aAAA,CACA,IAAAA,aAAA,CACA,WAAAlpB,OAAA,EAAAC,OAAA,CAAA1B,MAAA,GACA,IAAA7f,CAAA,CAAAqjB,IAAA,CAAAmc,iBAAA,CAAAC,eAAA,CAAAv8B,UAAA,GACAqe,OAAA,GAEAie,iBAAA,CAAAkC,UAAA,CAAAx+B,UAAA,CAAAya,YAAA,CAAA4sB,YAAA,EACAhpB,OAAA,QAEA,CAAAre,UAAA,CAAA4a,QAAA,yBAGA5a,UAAA,CAAAijB,QAAA,0BACAjjB,UAAA,CAAA4B,OAAA,oBAAAyhB,OAAA,MACArjB,UAAA,CAAA4B,OAAA,eACA+a,MAAA,GACA3c,UAAA,CAAAijB,QAAA,yBACA,IAEA,CAEA,CACA,EACA,CACA,GAEA,OAAAqkB,aAEA,GAEAzqC,MCxFA,6FAiCA,CAAA8qC,SAAA,UAAAA,UAAAxnC,KAAA,CAAAq9B,YAAA,QACA,oBAAAr9B,KAAA,CACAq9B,YAAA,CAEA,KAAAr9B,KAAA,WAAAA,KAEA,EAgBAynC,iBAAA,UAAAA,kBAAAnnC,OAAA,EAoBA,SAAAonC,qBAAA,EACA,OAAAC,eAAA,GAAAC,oBAAA,EAEA,CAKA,SAAAA,qBAAA,EACA,WAAAnoB,MAAA,EAEA,KAAAzY,QAAA,EAEA,KAAA6gC,iBAAA,EAEA,CAAAC,sBAAA,EAEA,CAKA,SAAAA,uBAAA,EACA,OAAAC,QAAA,sBAAAA,QAAA,CAAA/gC,QAAA,EAAAghC,YAAA,SAAAD,QAAA,CAAA/gC,QACA,CAKA,SAAAihC,oBAAA,EACA,OAAAC,mBAAA,EACA,CAKA,SAAAC,wBAAA,EACA,OAAAC,sBAAA,EACA,CAMA,SAAAF,oBAAA,EACA,OAAAzoB,MAAA,GAAA8hB,cAAA,EAEA8G,cAAA,GAEAC,4BAAA,EACA,CAOA,SAAAA,6BAAA,EACA,IAAAC,aAAA,CAAA9hC,KAAA,KAAAA,KAAA,CAAAjD,SAAA,CAAAiD,KAAA,CAAA/G,QAAA,CACA8oC,UAAA,CAAA/hC,KAAA,MAAAA,KAAA,CAAAhH,OAAA,QACAgpC,cAAA,EACAF,aAAA,EAAAC,UAIA,CAMA,SAAAJ,uBAAA,EACA,OAAAM,eAAA,EAAAV,YAAA,IAAAM,4BAAA,EACA,CAMA,SAAAN,aAAA,EACA,OAAAD,QAAA,EAAAA,QAAA,CAAA1jC,EAAA,EAAAuE,UAAA,GAAAm/B,QAAA,CAAA1jC,EACA,CApGA,IAAAk9B,cAAA,CAAAiG,SAAA,CAAAlnC,OAAA,CAAAihC,cAAA,KACA9hB,MAAA,CAAA+nB,SAAA,CAAAlnC,OAAA,CAAAmf,MAAA,KACAzY,QAAA,CAAAwgC,SAAA,CAAAlnC,OAAA,CAAA0G,QAAA,KACA2gC,eAAA,CAAAH,SAAA,CAAAlnC,OAAA,CAAAqnC,eAAA,KACAe,eAAA,CAAAlB,SAAA,CAAAlnC,OAAA,CAAAooC,eAAA,KACAjiC,KAAA,CAAAnG,OAAA,CAAAmG,KAAA,CACAshC,QAAA,CAAAznC,OAAA,CAAAynC,QAAA,KACAF,iBAAA,qBAAAvnC,OAAA,CAAAunC,iBAAA,IAAAvnC,OAAA,CAAAunC,iBAAA,CACAj/B,UAAA,CAAAtI,OAAA,CAAAsI,UAAA,KACA6/B,cAAA,CAAAjB,SAAA,CAAAlnC,OAAA,CAAAmoC,cAAA,KACAJ,cAAA,CAAAX,oBAAA,GACAiB,aAAA,CAAAV,mBAAA,GACAW,iBAAA,CAAAT,uBAAA,GA6FA,OACAA,uBAAA,SAAAA,CAAA,EACA,OAAAS,iBACA,EACAX,mBAAA,SAAAA,CAAA,EACA,OAAAU,aACA,EACAjB,oBAAA,SAAAA,CAAA,EACA,OAAAW,cACA,CACA,CACA,EAEA,OAAAZ,iBAEA,GAEA/qC,MClLA,+XAAAsQ,GAAA,CAAArO,EAAA,CAAAyf,KAAA,CAAAxhB,aAAA,CAAA6qC,iBAAA,CAAAtS,QAAA,CAAAtqB,SAAA,CAAAiU,gBAAA,CAAA2gB,WAAA,CAAA3yB,QAAA,CAAAI,eAAA,CAAAhN,UAAA,CAAAC,QAAA,eAkGA,SAAA8gB,UAAA5gB,IAAA,CAAAC,OAAA,CAAAC,QAAA,EACA,IAAAC,IAAA,CAAAC,QAAA,CAAAJ,IAAA,CAAAC,OAAA,EACA,OAAAC,QAAA,KAAAC,IAAA,CAAAE,CAAA,CAAAF,IAAA,CACA,CAnGAwM,GAAA,CAAAA,GAAA,EAAA9P,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA2P,GAAA,YAAAA,GAAA,YAAAA,GAAA,CACArO,EAAA,CAAAA,EAAA,EAAAzB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAsB,EAAA,YAAAA,EAAA,YAAAA,EAAA,CACAyf,KAAA,CAAAA,KAAA,EAAAlhB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA+gB,KAAA,YAAAA,KAAA,YAAAA,KAAA,CACAxhB,aAAA,CAAAA,aAAA,EAAAM,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAT,aAAA,YAAAA,aAAA,YAAAA,aAAA,CACA6qC,iBAAA,CAAAA,iBAAA,EAAAvqC,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAoqC,iBAAA,YAAAA,iBAAA,YAAAA,iBAAA,CACAtS,QAAA,CAAAA,QAAA,EAAAj4B,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA83B,QAAA,YAAAA,QAAA,YAAAA,QAAA,CACAtqB,SAAA,CAAAA,SAAA,EAAA3N,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAwN,SAAA,YAAAA,SAAA,YAAAA,SAAA,CACAiU,gBAAA,CAAAA,gBAAA,EAAA5hB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAyhB,gBAAA,YAAAA,gBAAA,YAAAA,gBAAA,CACA2gB,WAAA,CAAAA,WAAA,EAAAviC,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAoiC,WAAA,YAAAA,WAAA,YAAAA,WAAA,CACA3yB,QAAA,CAAAA,QAAA,EAAA5P,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAyP,QAAA,YAAAA,QAAA,YAAAA,QAAA,CACAI,eAAA,CAAAA,eAAA,EAAAhQ,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6P,eAAA,YAAAA,eAAA,YAAAA,eAAA,CACAhN,UAAA,CAAAA,UAAA,EAAAhD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6C,UAAA,YAAAA,UAAA,YAAAA,UAAA,CACAC,QAAA,CAAAA,QAAA,EAAAjD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA8C,QAAA,YAAAA,QAAA,YAAAA,QAAA,CAEAA,QAAA,CAAA8B,aAAA,GACA9B,QAAA,CAAAD,UAAA,EACAC,QAAA,CAAA8B,aAAA,KAEA,IAAAxB,QAAA,CAAAP,UAAA,CAAAgC,QAAA,UAAAhC,UAAA,CAAAiC,MAAA,CAAAC,OAAA,CAAAC,QAAA,CAAAhC,IAAA,EAKA,SAAAiC,SAAAH,MAAA,CAAA9B,IAAA,EAEA,IAAAoC,MAAA,IAAAI,MAAA,CAAAC,MAAA,CAKA,MAJA,CAAAL,MAAA,OACAK,MAAA,CAAAV,OAAA,CAAA8e,SAAA,EAAAre,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAA+e,SAAA,CAAAre,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACAJ,MACA,CAEA,SAAA0e,SAAAhf,MAAA,CAAA9B,IAAA,EAEA,IAAAoC,MAAA,IAAAI,MAAA,CAMA,MALA,CAAAJ,MAAA,oBACAE,gBAAA,EAAAE,MAAA,OAAAxC,IAAA,OAAAA,IAAA,CAAAA,IAAA,CAAAA,IAAA,CAAAkd,GAAA,qBAAA1a,MAAA,CAAAA,MAAA,CAAAue,KAAA,CAAAjf,MAAA,EAAAU,MAAA,GACA,MACAF,gBAAA,qBAAAR,MAAA,CAAAA,MAAA,CAAAif,KAAA,CAAAjf,MAAA,EAAAA,MAAA,EACA,WACAM,MACA,CAEA,SAAA4e,SAAAlf,MAAA,CAAA9B,IAAA,EAEA,IAAAoC,MAAA,IAAAI,MAAA,CAAAC,MAAA,CAQA,MAPA,CAAAL,MAAA,8BACAK,MAAA,CAAAV,OAAA,CAAAkf,IAAA,EAAAze,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAmf,IAAA,CAAAze,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACAA,MAAA,CAAAT,OAAA,CAAAa,MAAA,CAAA5F,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAA+M,IAAA,EAAAnM,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA2F,IAAA,CAAAC,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,GAAAie,QAAA,CAAAlhB,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,eACAA,MACA,CACA,SAAA8e,SAAApf,MAAA,CAAA9B,IAAA,EAGA,iBACA,CAEA,SAAAmhB,SAAArf,MAAA,CAAA9B,IAAA,EAEA,IAAAoC,MAAA,IAAAI,MAAA,CAAAC,MAAA,CAMA,MALA,CAAAL,MAAA,2BACAK,MAAA,CAAAV,OAAA,CAAA8M,IAAA,EAAArM,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAA+M,IAAA,CAAArM,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,UACAJ,MACA,CApDA,KAAAF,YAAA,gBACAH,OAAA,MAAAI,KAAA,CAAAJ,OAAA,CAAAlC,UAAA,CAAAkC,OAAA,EAAA/B,IAAA,CAAAA,IAAA,KACA,IAAAoC,MAAA,IAAAG,YAAA,YAAAD,gBAAA,MAAAA,gBAAA,CAAAlF,IAAA,MAAAoF,MAAA,CAAAC,MAAA,CAyEA,MArBA,CAAAL,MAAA,8BACAK,MAAA,CAAAV,OAAA,CAAAqf,OAAA,EAAA5e,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAsf,OAAA,CAAA5e,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,wCACAA,MAAA,CAAAT,OAAA,OAAA/E,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAA+e,SAAA,EAAAne,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA2F,IAAA,CAAAC,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,GAAAhB,QAAA,CAAAjC,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,sBACAK,MAAA,CAAAV,OAAA,CAAAsf,KAAA,EAAA7e,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAuf,KAAA,CAAA7e,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,gCACAA,MAAA,CAAAT,OAAA,CAAA6G,IAAA,CAAA5L,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAAwf,IAAA,EAAA5e,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA2F,IAAA,CAAAC,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,GAAA6d,QAAA,CAAA9gB,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,wGACAI,MAAA,CAAAT,OAAA,OAAA/E,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAAmf,IAAA,EAAAve,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA2F,IAAA,CAAAC,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,GAAA+d,QAAA,CAAAhhB,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,eACAI,MAAA,CAAAT,OAAA,OAAA/E,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAA+M,IAAA,EAAAnM,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA2F,IAAA,CAAAC,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,GAAAke,QAAA,CAAAnhB,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,wBACAA,MACA,QA2BA,CAAAmf,UAAA,EACA/N,IAAA,EACA4N,OAAA,gBACAC,KAAA,CAAA/iB,EAAA,mCACAkqC,aAAA,CAAAlqC,EAAA,iCACA2iB,IAAA,WACApS,IAAA,CAAAvQ,EAAA,QACA,EACAkjB,GAAA,EACAJ,OAAA,YACAC,KAAA,CAAA/iB,EAAA,yCACA2iB,IAAA,gBACApS,IAAA,CAAAvQ,EAAA,YACA,CACA,EAOAqjB,aAAA,SAAAA,CAAA,EACA,IAAAvC,MAAA,MAAA1Z,SAAA,CAAA3H,MAAA,EAAA2H,SAAA,eAAAA,SAAA,IACA,MAAAkc,QAAA,CAAAxC,MAAA,cACA,OAAAzS,GAAA,CAAAiU,SAAA,CAAAW,UAAA,CAAAK,QAAA,GACA,EAOA6mB,aAAA,CAAAl9B,QAAA,EAAAA,QAAA,CAAA2W,UAAA,aAAAxT,WAAA,aAOAg6B,cAAA,CAAAn9B,QAAA,EAAAA,QAAA,CAAA4W,IAAA,gBAAAxT,QAAA,aAQAg6B,aAAA,SAAAA,CAAAp9B,QAAA,CAAA/L,UAAA,EACA,IAAA4f,MAAA,MAAA1Z,SAAA,CAAA3H,MAAA,EAAA2H,SAAA,eAAAA,SAAA,SACA,CAAAkc,QAAA,CAAAxC,MAAA,cACAT,WAAA,CAAAnf,UAAA,CAAAoL,cAAA,GACA,WAAAgX,QAAA,GAAAjD,WAAA,CAAAiqB,UAAA,GAAAjqB,WAAA,CAAAkqB,aAAA,OACA,CAAAjqB,OAAA,CAAApf,UAAA,CAAAmL,UAAA,GACAm+B,QAAA,CAAArqB,gBAAA,CAAA6B,WAAA,CAAA1B,OAAA,CAAAD,WAAA,CAAAe,YAAA,EACAnU,QAAA,CAAArN,IAAA,SAAAI,EAAA,CAAAijB,UAAA,CAAA/N,IAAA,CAAAg1B,aAAA,CAAAM,QAAA,CAAAx8B,KAAA,EACA,KACA,CAAAf,QAAA,CAAArN,IAAA,SAAAqjB,UAAA,CAAAK,QAAA,EAAAP,KAAA,EAEA9V,QAAA,CAAArN,IAAA,mBAAAqjB,UAAA,CAAAK,QAAA,EAAAR,OAAA,GACA7V,QAAA,CAAArN,IAAA,gBAAAqjB,UAAA,CAAAK,QAAA,EAAAR,OAAA,EAAA1jB,IAAA,UAAAmR,IAAA,CAAA0S,UAAA,CAAAK,QAAA,EAAA/S,IAAA,EACA,SAAA+S,QAAA,CACArW,QAAA,CAAA7N,IAAA,UAAA6jB,UAAA,CAAAC,GAAA,CAAAP,IAAA,IAAAvS,WAAA,SAAA6S,UAAA,CAAAC,GAAA,CAAAP,IAAA,IAAAtS,QAAA,SAAA4S,UAAA,CAAA/N,IAAA,CAAAyN,IAAA,IAEA1V,QAAA,CAAA7N,IAAA,UAAA6jB,UAAA,CAAA/N,IAAA,CAAAyN,IAAA,IAAAvS,WAAA,SAAA6S,UAAA,CAAA/N,IAAA,CAAAyN,IAAA,IAAAtS,QAAA,SAAA4S,UAAA,CAAAC,GAAA,CAAAP,IAAA,IAGA,EAKA,IAAAzN,IAAA,CAAAjX,aAAA,EACAW,IAAA,QAIAC,KAAA,OACA,CAAAqC,UAAA,MAAAnC,aAAA,GACA4P,iBAAA,CAAAzN,UAAA,CAAAsL,UAAA,GACAoC,eAAA,EAAAD,iBAAA,CAAAV,SAAA,WAAAY,OAAA,QAMA47B,UAAA,CAAAA,CAAA,SACA,CAAApqB,WAAA,CAAAnf,UAAA,CAAAoL,cAAA,GACAgU,OAAA,CAAApf,UAAA,CAAAmL,UAAA,GACA5F,cAAA,CAAA4Z,WAAA,CAAA5Z,cAAA,CACA,OAAA0Z,gBAAA,CAAAW,MAAA,CAAAR,OAAA,CAAA7Z,cAAA,CACA,EAOAikC,MAAA,CAAA1B,eAAA,QACA,CAAA3oB,WAAA,CAAAnf,UAAA,CAAAoL,cAAA,GACAgU,OAAA,CAAApf,UAAA,CAAAmL,UAAA,GACAuU,QAAA,CAAA1f,UAAA,CAAAu6B,cAAA,GACAkP,gBAAA,CAAAtqB,WAAA,CAAAe,YAAA,GACA3a,cAAA,CAAA4Z,WAAA,CAAA5Z,cAAA,CAGAmkC,iBAAA,CAAA1+B,SAAA,CAAAjF,eAAA,CAAAqZ,OAAA,CAAA7Z,cAAA,yBAGAsjC,eAAA,CAAA79B,SAAA,CAAAjF,eAAA,CAAAqZ,OAAA,CAAA7Z,cAAA,wBAAAmkC,iBAAA,CACAhI,cAAA,CAAA12B,SAAA,CAAAjF,eAAA,CAAAqZ,OAAA,CAAA7Z,cAAA,sBAIAqjC,cAAA,EAAAlH,cAAA,EAAAgI,iBAAA,CACAC,YAAA,CAAAd,eAAA,eACAe,SAAA,CAAAA,CAAA,GAAA5pC,UAAA,CAAA4B,OAAA,cACAioC,iBAAA,CAAAA,CAAA,IACAN,UAAA,IACA,KAAA3nC,OAAA,QAEA5B,UAAA,CAAAgU,IAAA,EACA,EAEA,GADAhU,UAAA,CAAA4B,OAAA,eACA,UAAAgZ,QAAA,aACA,MAAAkvB,aAAA,CAAAlC,iBAAA,EACAlG,cAAA,CAAAA,cAAA,CACA9hB,MAAA,CAAA2pB,UAAA,GACApiC,QAAA,CAAAuY,QAAA,CAAAvY,QAAA,CACA2gC,eAAA,CAAAA,eAAA,CACAe,eAAA,CAAAA,eAAA,CACAX,QAAA,CAAAl9B,SAAA,CAAAhC,WAAA,CAAAoW,OAAA,CAAAqqB,gBAAA,EACAzB,iBAAA,CAAA7oB,WAAA,CAAA6oB,iBAAA,CACAj/B,UAAA,CAAAoW,WAAA,CAAApW,UAAA,CACA2gC,iBAAA,CAAAA,iBAAA,CACA9iC,KAAA,CAAAg5B,WAAA,CAAAJ,eAAA,CAAAmK,YAAA,CAAA3pC,UAAA,EACA4oC,cAAA,CAAAA,cACA,GACA,GAAAkB,aAAA,CAAAxB,uBAAA,IACA,MAAAvI,iBAAA,CAAAjhC,EAAA,qBACAkB,UAAA,CAAA4B,OAAA,uBAAA0zB,QAAA,CAAAwK,cAAA,CAAA6J,YAAA,CAAA3pC,UAAA,OAAA+/B,iBAAA,EAAA8J,iBAAA,CAEAD,SAAA,CAEA,CACA5b,OAAA,EACAC,MAAA,EACAC,EAAA,CAAA6R,iBAAA,CACA5R,MAAA,CAAArvB,EAAA,UACA,CACA,CACA,EACA,SAAAgrC,aAAA,CAAA1B,mBAAA,IACA,MAAArI,iBAAA,CAAAjhC,EAAA,oBACAkB,UAAA,CAAA4B,OAAA,mBAAA0zB,QAAA,CAAAwK,cAAA,CAAA6J,YAAA,CAAA3pC,UAAA,OAAA+/B,iBAAA,EAAA8J,iBAAA,CAEAD,SAAA,CAEA,CACA5b,OAAA,EACAC,MAAA,EACAC,EAAA,CAAA6R,iBAAA,CACA5R,MAAA,CAAArvB,EAAA,UACA,CACA,CACA,EACA,MAAAgrC,aAAA,CAAAjC,oBAAA,GACA7nC,UAAA,CAAA4B,OAAA,gBAAA9C,EAAA,wFAAA+qC,iBAAA,CAEAD,SACA,EAEAC,iBAAA,EAEA,CACA,EAGA,KAAA99B,QAAA,CAAAoW,aAAA,CAAAonB,UAAA,IAGA,KAAAx9B,QAAA,CAAA7K,EAAA,SAAAgL,CAAA,GACAA,CAAA,CAAAoW,cAAA,GACA4mB,cAAA,MAAAn9B,QAAA,EACA/L,UAAA,CAAA4B,OAAA,YACA,GACA,MAAAmoC,gBAAA,CAAAC,WAAA,GACAv8B,iBAAA,CAAAQ,cAAA,EAAA+7B,WAAA,EACA/8B,QAAA,CAAAkB,GAAA,CAAAd,eAAA,CAAAe,YAAA,CAAA47B,WAAA,MAAAr8B,OAAA,YACA,UAAAiN,QAAA,aACA5a,UAAA,CAAA4B,OAAA,eAEA,GACAyM,UAAA,IACAC,OAAA,GACA,EAEA,EACAy7B,gBAAA,CAAAr8B,eAAA,CAAA9L,OAAA,EAGA,KAAAmb,OAAA,GAGA/c,UAAA,CAAAkB,EAAA,iBACAioC,aAAA,MAAAp9B,QAAA,CAAA/L,UAAA,CAAAupC,UAAA,GACA,GAAAroC,EAAA,sBAAA+b,MAAA,IAAA/b,EAAA,uBAAA6b,OAAA,IAAA7b,EAAA,oBAAA+a,IAAA,IAAA/a,EAAA,oBAAA+Z,IAAA,IAAA/Z,EAAA,YAAA4mC,eAAA,EAAA0B,MAAA,CAAA1B,eAAA,GAAA5mC,EAAA,gCACA,MAAA8oC,WAAA,CAAAt8B,eAAA,CAAAu8B,oBAAA,CACAD,WAAA,QAAApvB,QAAA,yBACA3N,QAAA,CAAAJ,MAAA,UAAAc,OAAA,MACAo8B,gBAAA,CAAAC,WAAA,EACA,KAAA/mB,QAAA,uBAEA,EACA,EAIAvU,OAAA,EAEA,MAAA0M,UAAA,MAAApd,aAAA,GAAAqB,iBAAA,GACA+b,UAAA,CAAA1L,MAAA,MAAA3D,QAAA,CACA,EAIAa,QAAA,EACAK,QAAA,CAAAJ,MAAA,UAAAc,OAAA,MACA,KAAA5B,QAAA,CAAAc,MAAA,EACA,EAIAoQ,OAAA,EACAgsB,aAAA,MAAAl9B,QAAA,CACA,EAIAgR,QAAA,EACAmsB,cAAA,MAAAn9B,QAAA,CACA,EAIAkP,KAAA,EACAsD,KAAA,CAAAtD,IAAA,MAAAlP,QAAA,CACA,EAIAkQ,KAAA,EACAsC,KAAA,CAAAtC,IAAA,MAAAlQ,QAAA,CACA,CACA,GAEA,OAAAiI,IAEA,GAEAnX,MC/XA,qJAAAsQ,GAAA,CAAArQ,CAAA,CAAAgC,EAAA,CAAAid,MAAA,CAAA1b,UAAA,CAAAC,QAAA,eA8CA,SAAA4pC,YAAA1pC,IAAA,CAAAC,OAAA,CAAAC,QAAA,EACA,IAAAC,IAAA,CAAAC,QAAA,CAAAJ,IAAA,CAAAC,OAAA,EACA,OAAAC,QAAA,KAAAC,IAAA,CAAAE,CAAA,CAAAF,IAAA,CACA,CAiCA,SAAAwpC,kBAAAC,OAAA,CAAA1tB,OAAA,CAAAN,MAAA,CAAAiuB,MAAA,CAAAC,cAAA,CAAAC,aAAA,KACA,CAAAC,QAAA,IAEAC,OAAA,MADAC,GAAA,CAmDA,MAjDA,CAAAJ,cAAA,OAAAA,cAAA,CAAAt0B,OAAA,GACAy0B,OAAA,CAAAP,WAAA,EACAl0B,OAAA,IACA3G,IAAA,mCACA7K,EAAA,kBACA,IAEA+lC,aAAA,CAAAztC,CAAA,CAAAmE,QAAA,EACAmpC,OAAA,CAAAA,OAAA,CACA1tB,OAAA,CAAAA,OAAA,CACA+tB,OAAA,CAAAA,OAAA,CACAE,UAAA,IACAC,WAAA,IACA5c,OAAA,GACAxpB,EAAA,UACAkW,IAAA,WACA5N,KAAA,CAAAhO,EAAA,WACAkkB,KAAA,GACA,GACAxe,EAAA,MACAkW,IAAA,QACA5N,KAAA,CAAAhO,EAAA,oBACAkkB,KAAA,GACA,GACA6nB,OAAA,UAAAA,QAAA,EACA,IAAAC,SAAA,CACAN,QAAA,IACA1tC,CAAA,CAAAwM,UAAA,CAAA8S,MAAA,IACAA,MAAA,CAAA5e,IAAA,OACA8sC,cAAA,GAEAQ,SAAA,CAAA39B,GAAA,yCACA29B,SAAA,CAAAnoB,IAAA,aAAA7lB,CAAA,CAAAwM,UAAA,CAAAghC,cAAA,CAAAS,aAAA,EACAT,cAAA,CAAAS,aAAA,GACA,CAAAD,SAAA,CAAAnoB,IAAA,aAAA7lB,CAAA,CAAAwM,UAAA,CAAAghC,cAAA,CAAAU,eAAA,GACAV,cAAA,CAAAU,eAAA,IAIA,CACA,EAAAT,aAAA,EACAG,GAAA,CAAA3uB,MAAA,CAAAwuB,aAAA,EACAztC,CAAA,CAAAwM,UAAA,CAAA+gC,MAAA,GACAK,GAAA,CAAAxpC,EAAA,2BACAspC,QAAA,EACAH,MAAA,CAAA7sC,IAAA,MAEA,GAEAktC,GACA,CAtIAv9B,GAAA,CAAAA,GAAA,EAAA9P,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA2P,GAAA,YAAAA,GAAA,YAAAA,GAAA,CACArQ,CAAA,CAAAA,CAAA,EAAAO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAV,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACAgC,EAAA,CAAAA,EAAA,EAAAzB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAsB,EAAA,YAAAA,EAAA,YAAAA,EAAA,CACAid,MAAA,CAAAA,MAAA,EAAA1e,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAue,MAAA,YAAAA,MAAA,YAAAA,MAAA,CACA1b,UAAA,CAAAA,UAAA,EAAAhD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6C,UAAA,YAAAA,UAAA,YAAAA,UAAA,CACAC,QAAA,CAAAA,QAAA,EAAAjD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA8C,QAAA,YAAAA,QAAA,YAAAA,QAAA,CAEAA,QAAA,CAAA8B,aAAA,GACA9B,QAAA,CAAAD,UAAA,EACAC,QAAA,CAAA8B,aAAA,KAEA,IAAAxB,QAAA,CAAAP,UAAA,CAAAgC,QAAA,UAAAhC,UAAA,CAAAiC,MAAA,CAAAC,OAAA,CAAAC,QAAA,CAAAhC,IAAA,EAKA,SAAAiC,SAAAH,MAAA,CAAA9B,IAAA,EAGA,eACA,CARA,KAAAkC,YAAA,gBACAH,OAAA,MAAAI,KAAA,CAAAJ,OAAA,CAAAlC,UAAA,CAAAkC,OAAA,EAAA/B,IAAA,CAAAA,IAAA,KACA,IAAAoC,MAAA,IAAAG,YAAA,YAAAD,gBAAA,MAAAA,gBAAA,CAAAlF,IAAA,MAAAoF,MAAA,CAAAC,MAAA,CA4BA,MApBA,CAAAL,MAAA,mBACAK,MAAA,CAAAV,OAAA,CAAAiC,EAAA,EAAAxB,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAkC,EAAA,CAAAxB,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,2CACAC,MAAA,CAAAV,OAAA,CAAAiC,EAAA,EAAAxB,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAkC,EAAA,CAAAxB,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,cACAC,MAAA,CAAAV,OAAA,CAAAiC,EAAA,EAAAxB,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAkC,EAAA,CAAAxB,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,MACAA,MAAA,CAAAT,OAAA,OAAA/E,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAA0T,OAAA,EAAA9S,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA2F,IAAA,CAAAC,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,GAAAhB,QAAA,CAAAjC,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,0DACAK,MAAA,CAAAV,OAAA,CAAA8M,IAAA,EAAArM,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAA+M,IAAA,CAAArM,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,aACAJ,MACA,GA6FA,OAAAunC,iBAEA,GAEAttC,MC9IA,2RAAAiC,EAAA,CAAA/B,aAAA,CAAAiO,SAAA,CAAAsxB,iBAAA,CAAA6N,iBAAA,CAAAlrB,gBAAA,eAEAngB,EAAA,CAAAA,EAAA,EAAAzB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAsB,EAAA,YAAAA,EAAA,YAAAA,EAAA,CACA/B,aAAA,CAAAA,aAAA,EAAAM,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAT,aAAA,YAAAA,aAAA,YAAAA,aAAA,CACAiO,SAAA,CAAAA,SAAA,EAAA3N,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAwN,SAAA,YAAAA,SAAA,YAAAA,SAAA,CACAsxB,iBAAA,CAAAA,iBAAA,EAAAj/B,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA8+B,iBAAA,YAAAA,iBAAA,YAAAA,iBAAA,CACA6N,iBAAA,CAAAA,iBAAA,EAAA9sC,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA2sC,iBAAA,YAAAA,iBAAA,YAAAA,iBAAA,CACAlrB,gBAAA,CAAAA,gBAAA,EAAA5hB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAyhB,gBAAA,YAAAA,gBAAA,YAAAA,gBAAA,CAuBA,IAAAgsB,qBAAA,CAAAluC,aAAA,EACAW,IAAA,yBAIAC,KAAA,EAWA,SAAAutC,sBAAA,OACA,CAAA/rB,WAAA,CAAAnf,UAAA,CAAAoL,cAAA,GACAgU,OAAA,CAAApf,UAAA,CAAAmL,UAAA,GACA,OACA09B,eAAA,CAAA79B,SAAA,CAAAjF,eAAA,CAAAqZ,OAAA,CAAAD,WAAA,CAAA5Z,cAAA,uBACA4lC,kBAAA,CAAAngC,SAAA,CAAAjF,eAAA,CAAAqZ,OAAA,CAAAD,WAAA,CAAA5Z,cAAA,yBACA,CACA,CAOA,SAAA6lC,qBAAAnqB,MAAA,KAEA,CAAAoqB,qBAAA,CAAA/O,iBAAA,CAAAkC,UAAA,CAAAx+B,UAAA,KADAsrC,iBAAA,CAYA,MAPA,CAAAA,iBAAA,CAHAD,qBAAA,CAEA,SAAApqB,MAAA,CACAniB,EAAA,0GACA,SAAAmiB,MAAA,CACAniB,EAAA,+HAGAA,EAAA,mFAPAA,EAAA,yGASAwsC,iBACA,CASA,SAAAC,cAAAtqB,MAAA,EAIA,MAHA,CAAAjhB,UAAA,CAAA4B,OAAA,eAGA4pC,SAAA,CAAAC,QAAA,CAAA7tC,IAAA,CAAA+P,OAAA,IAAAwd,IAAA,UAAAugB,KAAA,EACA,OAAAA,KAAA,CAAApmC,OAAA,kCAAA6lB,IAAA,UAAAwgB,aAAA,EACA,IAAArB,cAAA,MAGA,QAAAqB,aAAA,CAaA,MAXA,CAAAl+B,iBAAA,CAAAm+B,mCAAA,GACAtB,cAAA,EACAt0B,OAAA,CAAA21B,aAAA,CACAZ,aAAA,SAAAA,CAAA,EACAW,KAAA,CAAA1b,OAAA,oCACA,EACAgb,eAAA,SAAAA,CAAA,EACAU,KAAA,CAAA1b,OAAA,oCACA,CACA,GAEA,IAAA5R,OAAA,UAAAC,OAAA,CAAA1B,MAAA,EAEAwtB,iBAAA,CAAArrC,EAAA,yBAAAssC,oBAAA,CAAAnqB,MAAA,EAAA5C,OAAA,CAEA,SAAA8P,OAAA,EAEAxR,MAAA,EACAwR,MAAA,GACA,EACA,EAAAmc,cAAA,CACA,EAEA,EACA,GAAA9d,KAAA,UAAAtJ,GAAA,EAEA,GAAAA,GAAA,EAAAA,GAAA,YAAA0M,KAAA,CACA,MAAA1M,GAAA,CACA,MACA,CAAAA,GAAA,OAAAA,GAAA,CAAAiL,MAAA,EACAnuB,UAAA,CAAA4B,OAAA,cACAwc,OAAA,CAAAzB,MAAA,UAEA,EACA,MA5FA,CAAA/e,IAAA,MACAoC,UAAA,MAAAnC,aAAA,GACA4P,iBAAA,CAAAzN,UAAA,CAAAsL,UAAA,GACAkgC,SAAA,CAAAxrC,UAAA,CAAAkvB,YAAA,GACAsc,SAAA,CAAArc,WAAA,CAAAvxB,IAAA,CAAA+P,OAAA,IA2FA3N,UAAA,CAAAkB,EAAA,mBAEAsqC,SAAA,CAAAC,QAAA,CAAA7tC,IAAA,CAAA+P,OAAA,IAAAwd,IAAA,UAAAugB,KAAA,EACAA,KAAA,CAAA1b,OAAA,sCACA,EACA,GAAArS,MAAA,sBAAAzR,CAAA,CAAAwO,IAAA,CAAA1T,KAAA,OACA,CAAA8B,OAAA,CAAA9I,UAAA,CAAAoL,cAAA,GACAtH,GAAA,CAAA9D,UAAA,CAAAmL,UAAA,GACAxL,IAAA,CAAAK,UAAA,CAAAwN,cAAA,GACA04B,WAAA,CAAAlmC,UAAA,CAAAu6B,cAAA,GACAz0B,UAAA,CAAAolC,qBAAA,GACAtrB,MAAA,CAAAX,gBAAA,CAAAW,MAAA,CAAA9b,GAAA,CAAAgF,OAAA,CAAAvD,cAAA,EACA,GAAA2gC,WAAA,EAAAA,WAAA,CAAA/+B,QAAA,EAEA,eAAAH,KAAA,EAAAlB,UAAA,CAAAqlC,kBAAA,CACA,OAEA,GAAArlC,UAAA,CAAA+iC,eAAA,CACA,OAEA,GAAAlpC,IAAA,CAAA8J,aAAA,CACA,OAEA,YAAAiR,IAAA,GAAAkF,MAAA,EAAAnS,iBAAA,CAAAo+B,gCAAA,CACA,OAAAN,aAAA,SACA,YAAAr/B,CAAA,CAAAxO,IAAA,GAAAkiB,MAAA,EAAAnS,iBAAA,CAAAo+B,gCAAA,CACA,OAAAN,aAAA,QAEA,CACA,EACA,CACA,GAEA,OAAAN,qBAEA,GAEApuC,MCxKA,uOAAAsQ,GAAA,CAAArQ,CAAA,CAAAgC,EAAA,CAAAyf,KAAA,CAAAxhB,aAAA,CAAAu4B,QAAA,CAAAj1B,UAAA,CAAAC,QAAA,CAAA0K,SAAA,eA8FA,SAAAoW,UAAA5gB,IAAA,CAAAC,OAAA,CAAAC,QAAA,EACA,IAAAC,IAAA,CAAAC,QAAA,CAAAJ,IAAA,CAAAC,OAAA,EACA,OAAAC,QAAA,KAAAC,IAAA,CAAAE,CAAA,CAAAF,IAAA,CACA,CA/FAwM,GAAA,CAAAA,GAAA,EAAA9P,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA2P,GAAA,YAAAA,GAAA,YAAAA,GAAA,CACArQ,CAAA,CAAAA,CAAA,EAAAO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAV,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACAgC,EAAA,CAAAA,EAAA,EAAAzB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAsB,EAAA,YAAAA,EAAA,YAAAA,EAAA,CACAyf,KAAA,CAAAA,KAAA,EAAAlhB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA+gB,KAAA,YAAAA,KAAA,YAAAA,KAAA,CACAxhB,aAAA,CAAAA,aAAA,EAAAM,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAT,aAAA,YAAAA,aAAA,YAAAA,aAAA,CACAu4B,QAAA,CAAAA,QAAA,EAAAj4B,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA83B,QAAA,YAAAA,QAAA,YAAAA,QAAA,CACAj1B,UAAA,CAAAA,UAAA,EAAAhD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6C,UAAA,YAAAA,UAAA,YAAAA,UAAA,CACAC,QAAA,CAAAA,QAAA,EAAAjD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA8C,QAAA,YAAAA,QAAA,YAAAA,QAAA,CACA0K,SAAA,CAAAA,SAAA,EAAA3N,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAwN,SAAA,YAAAA,SAAA,YAAAA,SAAA,CAEA1K,QAAA,CAAA8B,aAAA,GACA9B,QAAA,CAAAD,UAAA,EACAC,QAAA,CAAA8B,aAAA,QAEA,CAAAxB,QAAA,CAAAP,UAAA,CAAAgC,QAAA,UAAAhC,UAAA,CAAAiC,MAAA,CAAAC,OAAA,CAAAC,QAAA,CAAAhC,IAAA,EAKA,SAAAiC,SAAAH,MAAA,CAAA9B,IAAA,EAEA,IAAAoC,MAAA,IAAAI,MAAA,CAAAC,MAAA,CAKA,MAJA,CAAAL,MAAA,OACAK,MAAA,CAAAV,OAAA,CAAA8e,SAAA,EAAAre,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAA+e,SAAA,CAAAre,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACAJ,MACA,CAEA,SAAA0e,SAAAhf,MAAA,CAAA9B,IAAA,EAEA,IAAAoC,MAAA,IAAAI,MAAA,CAMA,MALA,CAAAJ,MAAA,oBACAE,gBAAA,EAAAE,MAAA,OAAAxC,IAAA,OAAAA,IAAA,CAAAA,IAAA,CAAAA,IAAA,CAAAkd,GAAA,qBAAA1a,MAAA,CAAAA,MAAA,CAAAue,KAAA,CAAAjf,MAAA,EAAAU,MAAA,GACA,MACAF,gBAAA,qBAAAR,MAAA,CAAAA,MAAA,CAAAif,KAAA,CAAAjf,MAAA,EAAAA,MAAA,EACA,WACAM,MACA,CAEA,SAAA4e,SAAAlf,MAAA,CAAA9B,IAAA,EAEA,IAAAoC,MAAA,IAAAI,MAAA,CAAAC,MAAA,CAQA,MAPA,CAAAL,MAAA,8BACAK,MAAA,CAAAV,OAAA,CAAAkf,IAAA,EAAAze,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAmf,IAAA,CAAAze,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACAA,MAAA,CAAAT,OAAA,CAAAa,MAAA,CAAA5F,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAA+M,IAAA,EAAAnM,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA2F,IAAA,CAAAC,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,GAAAie,QAAA,CAAAlhB,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,eACAA,MACA,CACA,SAAA8e,SAAApf,MAAA,CAAA9B,IAAA,EAGA,iBACA,CAEA,SAAAmhB,SAAArf,MAAA,CAAA9B,IAAA,EAEA,IAAAoC,MAAA,IAAAI,MAAA,CAAAC,MAAA,CAMA,MALA,CAAAL,MAAA,2BACAK,MAAA,CAAAV,OAAA,CAAA8M,IAAA,EAAArM,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAA+M,IAAA,CAAArM,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,UACAJ,MACA,CApDA,KAAAF,YAAA,gBACAH,OAAA,MAAAI,KAAA,CAAAJ,OAAA,CAAAlC,UAAA,CAAAkC,OAAA,EAAA/B,IAAA,CAAAA,IAAA,KACA,IAAAoC,MAAA,IAAAG,YAAA,YAAAD,gBAAA,MAAAA,gBAAA,CAAAlF,IAAA,MAAAoF,MAAA,CAAAC,MAAA,CAyEA,MArBA,CAAAL,MAAA,8BACAK,MAAA,CAAAV,OAAA,CAAAqf,OAAA,EAAA5e,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAsf,OAAA,CAAA5e,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,wCACAA,MAAA,CAAAT,OAAA,OAAA/E,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAA+e,SAAA,EAAAne,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA2F,IAAA,CAAAC,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,GAAAhB,QAAA,CAAAjC,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,sBACAK,MAAA,CAAAV,OAAA,CAAAsf,KAAA,EAAA7e,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAuf,KAAA,CAAA7e,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,gCACAA,MAAA,CAAAT,OAAA,CAAA6G,IAAA,CAAA5L,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAAwf,IAAA,EAAA5e,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA2F,IAAA,CAAAC,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,GAAA6d,QAAA,CAAA9gB,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,wGACAI,MAAA,CAAAT,OAAA,OAAA/E,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAAmf,IAAA,EAAAve,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA2F,IAAA,CAAAC,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,GAAA+d,QAAA,CAAAhhB,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,eACAI,MAAA,CAAAT,OAAA,OAAA/E,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAA+M,IAAA,EAAAnM,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA2F,IAAA,CAAAC,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,GAAAke,QAAA,CAAAnhB,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,wBACAA,MACA,GAuBAkpC,WAAA,CAAA/uC,aAAA,EACAW,IAAA,eACAC,KAAA,EASA,SAAAouC,yBAAA,OACA,CAAA5sB,WAAA,CAAAnf,UAAA,CAAAoL,cAAA,GACAgU,OAAA,CAAApf,UAAA,CAAAmL,UAAA,GACA,OACA2gC,WAAA,CAAA9gC,SAAA,CAAAjF,eAAA,CAAAqZ,OAAA,CAAAD,WAAA,CAAA5Z,cAAA,mBACA4lC,kBAAA,CAAAngC,SAAA,CAAAjF,eAAA,CAAAqZ,OAAA,CAAAD,WAAA,CAAA5Z,cAAA,0BACAo8B,yBAAA,CAAA32B,SAAA,CAAAjF,eAAA,CAAAqZ,OAAA,CAAAD,WAAA,CAAA5Z,cAAA,gCACA,CACA,CACA,SAAAymC,OAAA,EACA,MAAAlmC,UAAA,CAAAimC,wBAAA,GACAt+B,iBAAA,CAAAq+B,WAAA,GAAAhmC,UAAA,CAAAgmC,WAAA,EAAAhmC,UAAA,CAAAqlC,kBAAA,EACAvtC,IAAA,CAAAqd,IAAA,GAEArd,IAAA,CAAAqe,IAAA,EAEA,CACA,SAAA6vB,YAAA,EACA9rC,UAAA,CAAAgU,IAAA,WACA,MA3BA,CAAApW,IAAA,MACAoC,UAAA,MAAAnC,aAAA,GACA4P,iBAAA,CAAAzN,UAAA,CAAAsL,UAAA,GA+BA2gC,0BAAA,CAAAA,CAAA,SACA,CAAA9sB,WAAA,CAAAnf,UAAA,CAAAoL,cAAA,GACAtF,UAAA,CAAAimC,wBAAA,GACArJ,eAAA,CAAAvjB,WAAA,CAAAujB,eAAA,KACA,OAAAA,eAAA,CAAAj8B,IAAA,CAAAc,IAAA,GACA,IACAqlB,MACA,EAAArlB,IAAA,CACA,OAAAqlB,MAAA,GAAAzN,WAAA,CAAAra,SACA,KAAAgB,UAAA,CAAA67B,yBAAA,IAAAl0B,iBAAA,CAAA4rB,KAAA,MAAAwI,eACA,EACA,KAAA91B,QAAA,CAAAoB,GAAA,CAAAiU,SAAA,EACAQ,OAAA,gBACAC,KAAA,CAAA/iB,EAAA,6BACA2iB,IAAA,gBACApS,IAAA,CAAAvQ,EAAA,gBACA,IACA,KAAAiN,QAAA,CAAA7K,EAAA,kBAAAgL,CAAA,OACA,CAAA+Q,MAAA,CAAAngB,CAAA,CAAAovC,IAAA,CAAAtuC,IAAA,CAAAqf,MAAA,CAAArf,IAAA,EACAkI,UAAA,CAAAimC,wBAAA,GAEA,GADA7/B,CAAA,CAAAoW,cAAA,GACA,KAAA1kB,IAAA,CAAAgd,QAAA,YAEA,GADAhd,IAAA,CAAAmf,OAAA,GACAjX,UAAA,CAAAqlC,kBAAA,GAAAc,0BAAA,IACA,MAAAlM,iBAAA,CAAAjhC,EAAA,iCACAkB,UAAA,CAAA4B,OAAA,uBAAA0zB,QAAA,CAAAwK,cAAA,WAAA9/B,UAAA,OAAA+/B,iBAAA,EAAA+L,WAAA,CAEA7uB,MAAA,CAEA,CACA+Q,OAAA,EACAC,MAAA,EACAC,EAAA,CAAA6R,iBAAA,CACA5R,MAAA,CAAArvB,EAAA,UACA,CACA,CACA,EACA,KACA,CAAAgtC,WAAA,EAGA,GACA,KAAA/uB,OAAA,GACAivB,MAAA,GACAhsC,UAAA,CAAAkB,EAAA,YAAA8qC,MAAA,EAAA9qC,EAAA,wBACAtD,IAAA,CAAAqf,MAAA,EACA,GAAA/b,EAAA,yBACAtD,IAAA,CAAAmf,OAAA,EACA,GAAA7b,EAAA,sBACAtD,IAAA,CAAAqe,IAAA,EACA,GAAA/a,EAAA,sBACAtD,IAAA,CAAAqd,IAAA,EACA,EACA,EAIAvM,MAAA,UAAAA,OAAA,EAEA,IAAA0M,UAAA,MAAApd,aAAA,GAAAqB,iBAAA,GACA+b,UAAA,CAAA1L,MAAA,MAAA3D,QAAA,CACA,EAIAa,OAAA,UAAAA,QAAA,EACA,KAAAb,QAAA,CAAAc,MAAA,EACA,EAIAoQ,MAAA,UAAAA,OAAA,EACA,KAAAlR,QAAA,CAAA2W,UAAA,aAAAxT,WAAA,YACA,EAIA6N,OAAA,UAAAA,QAAA,EACA,KAAAhR,QAAA,CAAA4W,IAAA,gBAAAxT,QAAA,YACA,EAIA8L,IAAA,UAAAA,KAAA,EACAsD,KAAA,CAAAtD,IAAA,MAAAlP,QAAA,CACA,EAIAkQ,IAAA,UAAAA,KAAA,EACAsC,KAAA,CAAAtC,IAAA,MAAAlQ,QAAA,CACA,CACA,GAEA,OAAA+/B,WAEA,GAEAjvC,MC1PA,uQAAAsQ,GAAA,CAAArQ,CAAA,CAAAgC,EAAA,CAAAyf,KAAA,CAAAxhB,aAAA,CAAAkQ,QAAA,CAAAI,eAAA,CAAA4R,gBAAA,CAAAjU,SAAA,CAAA3K,UAAA,CAAAC,QAAA,eAgGA,SAAA8gB,UAAA5gB,IAAA,CAAAC,OAAA,CAAAC,QAAA,EACA,IAAAC,IAAA,CAAAC,QAAA,CAAAJ,IAAA,CAAAC,OAAA,EACA,OAAAC,QAAA,KAAAC,IAAA,CAAAE,CAAA,CAAAF,IAAA,CACA,CAjGAwM,GAAA,CAAAA,GAAA,EAAA9P,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA2P,GAAA,YAAAA,GAAA,YAAAA,GAAA,CACArQ,CAAA,CAAAA,CAAA,EAAAO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAV,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACAgC,EAAA,CAAAA,EAAA,EAAAzB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAsB,EAAA,YAAAA,EAAA,YAAAA,EAAA,CACAyf,KAAA,CAAAA,KAAA,EAAAlhB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA+gB,KAAA,YAAAA,KAAA,YAAAA,KAAA,CACAxhB,aAAA,CAAAA,aAAA,EAAAM,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAT,aAAA,YAAAA,aAAA,YAAAA,aAAA,CACAkQ,QAAA,CAAAA,QAAA,EAAA5P,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAyP,QAAA,YAAAA,QAAA,YAAAA,QAAA,CACAI,eAAA,CAAAA,eAAA,EAAAhQ,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6P,eAAA,YAAAA,eAAA,YAAAA,eAAA,CACA4R,gBAAA,CAAAA,gBAAA,EAAA5hB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAyhB,gBAAA,YAAAA,gBAAA,YAAAA,gBAAA,CACAjU,SAAA,CAAAA,SAAA,EAAA3N,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAwN,SAAA,YAAAA,SAAA,YAAAA,SAAA,CACA3K,UAAA,CAAAA,UAAA,EAAAhD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6C,UAAA,YAAAA,UAAA,YAAAA,UAAA,CACAC,QAAA,CAAAA,QAAA,EAAAjD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA8C,QAAA,YAAAA,QAAA,YAAAA,QAAA,CAEAA,QAAA,CAAA8B,aAAA,GACA9B,QAAA,CAAAD,UAAA,EACAC,QAAA,CAAA8B,aAAA,QAEA,CAAAxB,QAAA,CAAAP,UAAA,CAAAgC,QAAA,UAAAhC,UAAA,CAAAiC,MAAA,CAAAC,OAAA,CAAAC,QAAA,CAAAhC,IAAA,EAKA,SAAAiC,SAAAH,MAAA,CAAA9B,IAAA,EAEA,IAAAoC,MAAA,IAAAI,MAAA,CAAAC,MAAA,CAKA,MAJA,CAAAL,MAAA,OACAK,MAAA,CAAAV,OAAA,CAAA8e,SAAA,EAAAre,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAA+e,SAAA,CAAAre,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACAJ,MACA,CAEA,SAAA0e,SAAAhf,MAAA,CAAA9B,IAAA,EAEA,IAAAoC,MAAA,IAAAI,MAAA,CAMA,MALA,CAAAJ,MAAA,oBACAE,gBAAA,EAAAE,MAAA,OAAAxC,IAAA,OAAAA,IAAA,CAAAA,IAAA,CAAAA,IAAA,CAAAkd,GAAA,qBAAA1a,MAAA,CAAAA,MAAA,CAAAue,KAAA,CAAAjf,MAAA,EAAAU,MAAA,GACA,MACAF,gBAAA,qBAAAR,MAAA,CAAAA,MAAA,CAAAif,KAAA,CAAAjf,MAAA,EAAAA,MAAA,EACA,WACAM,MACA,CAEA,SAAA4e,SAAAlf,MAAA,CAAA9B,IAAA,EAEA,IAAAoC,MAAA,IAAAI,MAAA,CAAAC,MAAA,CAQA,MAPA,CAAAL,MAAA,8BACAK,MAAA,CAAAV,OAAA,CAAAkf,IAAA,EAAAze,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAmf,IAAA,CAAAze,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACAA,MAAA,CAAAT,OAAA,CAAAa,MAAA,CAAA5F,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAA+M,IAAA,EAAAnM,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA2F,IAAA,CAAAC,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,GAAAie,QAAA,CAAAlhB,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,eACAA,MACA,CACA,SAAA8e,SAAApf,MAAA,CAAA9B,IAAA,EAGA,iBACA,CAEA,SAAAmhB,SAAArf,MAAA,CAAA9B,IAAA,EAEA,IAAAoC,MAAA,IAAAI,MAAA,CAAAC,MAAA,CAMA,MALA,CAAAL,MAAA,2BACAK,MAAA,CAAAV,OAAA,CAAA8M,IAAA,EAAArM,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAA+M,IAAA,CAAArM,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,UACAJ,MACA,CApDA,KAAAF,YAAA,gBACAH,OAAA,MAAAI,KAAA,CAAAJ,OAAA,CAAAlC,UAAA,CAAAkC,OAAA,EAAA/B,IAAA,CAAAA,IAAA,KACA,IAAAoC,MAAA,IAAAG,YAAA,YAAAD,gBAAA,MAAAA,gBAAA,CAAAlF,IAAA,MAAAoF,MAAA,CAAAC,MAAA,CAyEA,MArBA,CAAAL,MAAA,8BACAK,MAAA,CAAAV,OAAA,CAAAqf,OAAA,EAAA5e,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAsf,OAAA,CAAA5e,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,wCACAA,MAAA,CAAAT,OAAA,OAAA/E,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAA+e,SAAA,EAAAne,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA2F,IAAA,CAAAC,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,GAAAhB,QAAA,CAAAjC,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,sBACAK,MAAA,CAAAV,OAAA,CAAAsf,KAAA,EAAA7e,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAuf,KAAA,CAAA7e,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,gCACAA,MAAA,CAAAT,OAAA,CAAA6G,IAAA,CAAA5L,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAAwf,IAAA,EAAA5e,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA2F,IAAA,CAAAC,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,GAAA6d,QAAA,CAAA9gB,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,wGACAI,MAAA,CAAAT,OAAA,OAAA/E,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAAmf,IAAA,EAAAve,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA2F,IAAA,CAAAC,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,GAAA+d,QAAA,CAAAhhB,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,eACAI,MAAA,CAAAT,OAAA,OAAA/E,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAA+M,IAAA,EAAAnM,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA2F,IAAA,CAAAC,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,GAAAke,QAAA,CAAAnhB,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,wBACAA,MACA,GA2BAqR,QAAA,CAAAlX,aAAA,EACAW,IAAA,YAIAC,KAAA,EAwEA,SAAAwuC,WAAAC,mBAAA,EAEA,SAAAxC,UAAA,EACA5pC,UAAA,CAAA4B,OAAA,aACA,CACA,SAAAyqC,cAAA,EACArsC,UAAA,CAAAiU,QAAA,EACA,CANA,IAAAnL,OAAA,CAAA9I,UAAA,CAAAoL,cAAA,GAOApL,UAAA,CAAA4B,OAAA,eACA,KAAAhE,IAAA,CAAAgd,QAAA,cACAwxB,mBAAA,OAAAtjC,OAAA,CAAAk/B,iBAAA,CACAhoC,UAAA,CAAA4B,OAAA,oBAAA9C,EAAA,gGAAAutC,aAAA,CAEAzC,SACA,EAEAyC,aAAA,GAGA,MA1FA,CAAAzuC,IAAA,MACAoC,UAAA,MAAAnC,aAAA,GACA4P,iBAAA,CAAAzN,UAAA,CAAAsL,UAAA,GACAoC,eAAA,EAAAD,iBAAA,CAAAV,SAAA,WAAAY,OAAA,WAKA,CAAA2+B,aAAA,UAAAA,cAAA,OACA,CAAAltB,OAAA,CAAApf,UAAA,CAAAmL,UAAA,GACArC,OAAA,CAAA9I,UAAA,CAAAoL,cAAA,GACAmhC,cAAA,CAAAvsC,UAAA,CAAAwsC,iBAAA,GACA7K,yBAAA,CAAA32B,SAAA,CAAAjF,eAAA,CAAAqZ,OAAA,CAAAtW,OAAA,CAAAvD,cAAA,iCACA2gC,WAAA,CAAAlmC,UAAA,CAAAu6B,cAAA,MACA,CAAAkS,eAAA,CACAC,YAAA,CAGA,GAAA5vC,CAAA,CAAAiN,aAAA,CAAAqV,OAAA,OAAAtiB,CAAA,CAAAqjB,IAAA,CAAAf,OAAA,EACA,SAIA,GAAAH,gBAAA,CAAAa,OAAA,CAAAV,OAAA,CAAAtW,OAAA,CAAAvD,cAAA,EACA,SAIA,GAAA0Z,gBAAA,CAAAc,SAAA,CAAAX,OAAA,CAAAtW,OAAA,CAAAvD,cAAA,aAGA,GAAAgnC,cAAA,CAAAlD,aAAA,CACA,SAKA,GADAoD,eAAA,CAAAzhC,SAAA,CAAA/B,cAAA,CAAAmW,OAAA,CAAAtW,OAAA,CAAAoX,YAAA,IACAusB,eAAA,CAAApD,aAAA,EAAAoD,eAAA,CAAA1I,cAAA,GAAApC,yBAAA,CACA,QAEA,SACA1iB,gBAAA,CAAAc,SAAA,CAAAX,OAAA,CAAAtW,OAAA,CAAAvD,cAAA,WAEAmnC,YAAA,CAAA1hC,SAAA,CAAAhC,WAAA,CAAAoW,OAAA,CAAAtW,OAAA,CAAAoX,YAAA,IACAwsB,YAAA,CAAAvlC,QAAA,IAIA,KAAA++B,WAAA,CAAA/+B,QAAA,OAAA2B,OAAA,CAAA6jC,eACA,EAKAX,MAAA,UAAAA,OAAA,EACAM,aAAA,GACA1uC,IAAA,CAAAqd,IAAA,GAEArd,IAAA,CAAAqe,IAAA,EAEA,EAGA,KAAAlQ,QAAA,CAAAoB,GAAA,CAAAiU,SAAA,EACAQ,OAAA,iBACAC,KAAA,CAAA/iB,EAAA,uCACA2iB,IAAA,YACApS,IAAA,CAAAvQ,EAAA,YACA,IAuBA,KAAAiN,QAAA,CAAA7K,EAAA,kBAAAgL,CAAA,EACAA,CAAA,CAAAoW,cAAA,GACAtiB,UAAA,CAAA4B,OAAA,gBACA,GACA,MAAAmoC,gBAAA,CAAAC,WAAA,GACAv8B,iBAAA,CAAAQ,cAAA,EAAA+7B,WAAA,EACA/8B,QAAA,CAAAkB,GAAA,CAAAd,eAAA,CAAAe,YAAA,CAAA47B,WAAA,MAAAr8B,OAAA,kBACA2+B,aAAA,SAAA1uC,IAAA,CAAAgd,QAAA,aACA5a,UAAA,CAAA4B,OAAA,qBAEA,GACAyM,UAAA,IACAC,OAAA,GACA,EAEA,EACAy7B,gBAAA,CAAAr8B,eAAA,CAAA9L,OAAA,EAGAoqC,MAAA,GACApuC,IAAA,CAAAmf,OAAA,GAGA/c,UAAA,CAAAkB,EAAA,YAAA8qC,MAAA,EAAA9qC,EAAA,wBACAtD,IAAA,CAAAqf,MAAA,EACA,GAAA/b,EAAA,yBACAtD,IAAA,CAAAmf,OAAA,EACA,GAAA7b,EAAA,sBACAtD,IAAA,CAAAqe,IAAA,EACA,GAAA/a,EAAA,sBACAtD,IAAA,CAAAqd,IAAA,EACA,GAAA/Z,EAAA,yBAAAkrC,mBAAA,EACAD,UAAA,CAAAC,mBAAA,CACA,GAAAlrC,EAAA,gCACA,MAAA8oC,WAAA,CAAAt8B,eAAA,CAAAu8B,oBAAA,CACAD,WAAA,QAAApvB,QAAA,yBACA3N,QAAA,CAAAJ,MAAA,UAAAc,OAAA,MACAo8B,gBAAA,CAAAC,WAAA,EACA,KAAA/mB,QAAA,uBAEA,EACA,EAIAvU,MAAA,UAAAA,OAAA,EACA,IAAA0M,UAAA,MAAApd,aAAA,GAAAqB,iBAAA,GACA+b,UAAA,CAAA1L,MAAA,MAAA3D,QAAA,CACA,EAIAa,OAAA,UAAAA,QAAA,EACAK,QAAA,CAAAJ,MAAA,UAAAc,OAAA,MACA,KAAA5B,QAAA,CAAAc,MAAA,EACA,EAIAoQ,MAAA,UAAAA,OAAA,EACA,KAAAlR,QAAA,CAAA2W,UAAA,aAAAxT,WAAA,YACA,EAIA6N,OAAA,UAAAA,QAAA,EACA,KAAAhR,QAAA,CAAA4W,IAAA,gBAAAxT,QAAA,YACA,EAIA8L,IAAA,UAAAA,KAAA,EACAsD,KAAA,CAAAtD,IAAA,MAAAlP,QAAA,CACA,EAIAkQ,IAAA,UAAAA,KAAA,EACAsC,KAAA,CAAAtC,IAAA,MAAAlQ,QAAA,CACA,CACA,GAEA,OAAAkI,QAEA,GAEApX,MCjTA,2LAAAsQ,GAAA,CAAArQ,CAAA,CAAAsD,SAAA,CAAAslB,UAAA,CAAA1a,SAAA,CAAA3K,UAAA,CAAAC,QAAA,eA4HA,SAAAssC,aAAApsC,IAAA,CAAAC,OAAA,CAAAC,QAAA,EACA,IAAAC,IAAA,CAAAC,QAAA,CAAAJ,IAAA,CAAAC,OAAA,EACA,OAAAC,QAAA,KAAAC,IAAA,CAAAE,CAAA,CAAAF,IAAA,CACA,CAyLA,SAAAksC,iBAAArsC,IAAA,CAAAC,OAAA,CAAAC,QAAA,EACA,IAAAC,IAAA,CAAAqzB,UAAA,CAAAxzB,IAAA,CAAAC,OAAA,EACA,OAAAC,QAAA,KAAAC,IAAA,CAAAE,CAAA,CAAAF,IAAA,CACA,CAwdA,SAAAmsC,iBAAA/rC,MAAA,EAOA,SAAAgsC,SAAA7oB,KAAA,KACA,CAAAjf,QAAA,CAAAif,KAAA,CAAA1jB,IAAA,aACAZ,OAAA,EAAAskB,KAAA,CAAA3R,QAAA,CAAAy6B,OAAA,CAAAptC,OAAA,EAGAzC,SAAA,CAAA8vC,WAAA,CAAAhoC,QAAA,CAAArF,OAAA,EAQAzC,SAAA,CAAAyE,OAAA,QAAAqD,QAAA,CAAArF,OAAA,CACA,CAOA,SAAA4F,KAAA0e,KAAA,EACA,IAAAjf,QAAA,CAAAif,KAAA,CAAA1jB,IAAA,aAOArD,SAAA,CAAAyE,OAAA,QAAAqD,QAAA,CACA,CApCA,IAAA9H,SAAA,CAqLA,MAhJA,CAAAA,SAAA,CAAAiD,SAAA,CAAA8sC,YAAA,CAAAC,SAAA,EAAAjrC,WAAA,CAAA0qC,YAAA,EAGA1rC,EAAA,sBACA,KAAAwyB,QAAA,KACA,GAGAxyB,EAAA,mBACA,KAAAksC,UAAA,EACA,GAGAlsC,EAAA,wBACA,CAAAtD,IAAA,MAGAyvC,UAAA,MAAA3rC,UAAA,GACA4rC,UAAA,CAAAD,UAAA,CAAAnvC,IAAA,CAAAqvC,UAAA,CAAAC,SAAA,EACAh6B,QAAA,CAAA85B,UAAA,CAAApvC,IAAA,OACAuvC,KAAA,CAAAJ,UAAA,CAAAnvC,IAAA,CAAAqvC,UAAA,CAAAG,IAAA,EAGA,KAAAha,QAAA,EAGAia,aAAA,CAAAN,UAAA,CAAAnvC,IAAA,CAAAqvC,UAAA,CAAAK,YAAA,EACAC,WAAA,CAAAR,UAAA,CAAAnvC,IAAA,CAAAqvC,UAAA,CAAAO,UAAA,EACAC,QAAA,CAAAV,UAAA,CAAAnvC,IAAA,CAAAqvC,UAAA,CAAAS,UAAA,EACAC,eAAA,MAAAltC,MAAA,CAAAmtC,UAAA,CAAAb,UAAA,CAAAnvC,IAAA,CAAAqvC,UAAA,CAAAY,cAAA,EAAAd,UAAA,CAAAnvC,IAAA,CAAAqvC,UAAA,CAAAa,iBAAA,EACAC,YAAA,MAAAttC,MAAA,CAAAmtC,UAAA,CAAAb,UAAA,CAAAnvC,IAAA,CAAAqvC,UAAA,CAAAe,WAAA,EAAAjB,UAAA,CAAAnvC,IAAA,CAAAqvC,UAAA,CAAAgB,cAAA,EAEAjB,UAAA,CAAAA,UAAA,CACA95B,QAAA,CAAAA,QAAA,CAEAi6B,KAAA,CAAAA,KAAA,CAEAe,YAAA,CAAAnB,UAAA,CAAAnvC,IAAA,CAAAqvC,UAAA,CAAAkB,WAAA,CACA,EAGA,KAAAC,YAAA,GAGArB,UAAA,CAAAnsC,EAAA,SAAAqsC,UAAA,CAAAntC,SAAA,GAAAmtC,UAAA,CAAAoB,cAAA,YACA/wC,IAAA,CAAAqC,EAAA,eACAotC,UAAA,CAAAuB,WAAA,CAAA5B,OAAA,CAAA6B,SAAA,EACAxB,UAAA,CAAA96B,QAAA,CAAAy6B,OAAA,CAAA6B,SAAA,GACAjxC,IAAA,CAAAkxC,YAAA,GAGA,GAGAzB,UAAA,CAAAnsC,EAAA,SAAAqsC,UAAA,CAAAntC,SAAA,GAAAmtC,UAAA,CAAAwB,eAAA,YACAnxC,IAAA,CAAAqC,EAAA,cACArC,IAAA,CAAAoxC,WAAA,CAAA7hC,GAAA,OAAA7O,OAAA,CAAAivC,UAAA,CAAA0B,SAAA,EAAA1B,UAAA,CAAA0B,SAAA,CAEA,GAGAxB,KAAA,CAAAvsC,EAAA,SAAAqsC,UAAA,CAAAntC,SAAA,GAAAmtC,UAAA,CAAA2B,UAAA,YACA,IAAAr9B,MAAA,CACAjU,IAAA,CAAAqC,EAAA,eACA4R,MAAA,CAAA1E,GAAA,OAAA7O,OAAA,CAAAivC,UAAA,CAAArpC,KAAA,EACAtG,IAAA,CAAAoxC,WAAA,CAAAn9B,MAAA,CAAA07B,UAAA,CAAArpC,KAAA,IACA2N,MAAA,CAAAU,QAAA,CAAAy6B,OAAA,CAAAroC,MAAA,EACA/G,IAAA,CAAAkxC,YAAA,GAEAlxC,IAAA,CAAAuxC,QAAA,CAAAt9B,MAAA,CAAA3T,IAAA,CAAAqvC,UAAA,CAAAjpC,QAAA,EAAAlG,KAAA,GAAAyT,MAAA,GAIA,GAGA47B,KAAA,CAAAvsC,EAAA,SAAAqsC,UAAA,CAAAntC,SAAA,GAAAmtC,UAAA,CAAA6B,aAAA,YACAxxC,IAAA,CAAAqC,EAAA,cACArC,IAAA,CAAAoxC,WAAA,CAAA7hC,GAAA,OAAA7O,OAAA,CAAAivC,UAAA,CAAAjpC,QAAA,EAAAipC,UAAA,CAAAjpC,QAAA,CAEA,GAGAmpC,KAAA,CAAAvsC,EAAA,SAAAqsC,UAAA,CAAAntC,SAAA,GAAAmtC,UAAA,CAAA8B,UAAA,UAAAvtC,KAAA,EACA,IAAAoiB,KAAA,CAAAorB,OAAA,CACA1xC,IAAA,CAAAqC,EAAA,eACAikB,KAAA,CAAA/W,GAAA,OAAA7O,OAAA,CAAAivC,UAAA,CAAA3oC,KAAA,EACA,CAAAsf,KAAA,CAAA3R,QAAA,CAAAy6B,OAAA,CAAAuC,QAAA,IACAD,OAAA,CAAAniC,GAAA,CAAArL,KAAA,CAAAqK,MAAA,EACAvO,IAAA,CAAAmD,MAAA,CAAAyuC,OAAA,EAAAF,OAAA,CAAArvC,EAAA,CAAAstC,UAAA,CAAAkC,KAAA,IAAApC,UAAA,CAAA96B,QAAA,CAAAy6B,OAAA,CAAA6B,SAAA,EAEA,CAAA3qB,KAAA,CAAA3R,QAAA,CAAAy6B,OAAA,CAAA0C,MAAA,IAAAxrB,KAAA,CAAA3R,QAAA,CAAAy6B,OAAA,CAAA1pB,IAAA,GACAypB,QAAA,CAAA7oB,KAAA,EAEA,CAAAA,KAAA,CAAA3R,QAAA,CAAAy6B,OAAA,CAAAroC,MAAA,IAEA/G,IAAA,CAAA+xC,MAAA,CAAAzrB,KAAA,EACA1e,IAAA,CAAA0e,KAAA,IAIA,GAGAupB,KAAA,CAAAvsC,EAAA,SAAAqsC,UAAA,CAAAntC,SAAA,GAAAmtC,UAAA,CAAAqC,WAAA,YACA,IAAAvtB,IAAA,CACAzkB,IAAA,CAAAqC,EAAA,eACAoiB,IAAA,CAAAlV,GAAA,OAGA,CAAAkV,IAAA,CAAA9P,QAAA,CAAAy6B,OAAA,CAAAuC,QAAA,IACAltB,IAAA,CAAAlT,QAAA,CAAA69B,OAAA,CAAAuC,QAAA,EACA/pC,IAAA,CAAA6c,IAAA,GAGA,GAGAirB,UAAA,CAAApsC,EAAA,SAAAqsC,UAAA,CAAAntC,SAAA,GAAAmtC,UAAA,CAAAjmC,MAAA,YACA,IAAA+a,IAAA,CAAA7I,IAAA,CACA5b,IAAA,CAAAqC,EAAA,eACAoiB,IAAA,CAAAlV,GAAA,OACAqM,IAAA,CAAA6I,IAAA,CAAA7hB,IAAA,SAGAgT,QAAA,CAAAtE,WAAA,CAAA89B,OAAA,CAAAroC,MAAA,EACA6O,QAAA,CAAA9U,IAAA,qBACA2uC,UAAA,CAAAn+B,WAAA,CAAA89B,OAAA,CAAA6B,SAAA,EACAxsB,IAAA,CAAAlT,QAAA,CAAA69B,OAAA,CAAAroC,MAAA,EACA0d,IAAA,CAAA3jB,IAAA,qBAGAd,IAAA,CAAA0J,MAAA,CAAAkS,IAAA,EAGA5b,IAAA,CAAAwvC,UAAA,GAEA,EACA,GAGAjwC,SAAA,CAAAoW,aAAA,OAGApW,SAAA,CAAAQ,IAAA,CAAAoD,MAAA,CACA,CAx8BAoM,GAAA,CAAAA,GAAA,EAAA9P,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA2P,GAAA,YAAAA,GAAA,YAAAA,GAAA,CACArQ,CAAA,CAAAA,CAAA,EAAAO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAV,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACAsD,SAAA,CAAAA,SAAA,EAAA/C,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA4C,SAAA,YAAAA,SAAA,YAAAA,SAAA,CACAslB,UAAA,CAAAA,UAAA,EAAAroB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAkoB,UAAA,YAAAA,UAAA,YAAAA,UAAA,CACA1a,SAAA,CAAAA,SAAA,EAAA3N,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAwN,SAAA,YAAAA,SAAA,YAAAA,SAAA,CACA3K,UAAA,CAAAA,UAAA,EAAAhD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6C,UAAA,YAAAA,UAAA,YAAAA,UAAA,CACAC,QAAA,CAAAA,QAAA,EAAAjD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA8C,QAAA,YAAAA,QAAA,YAAAA,QAAA,CAEAA,QAAA,CAAA8B,aAAA,GACA9B,QAAA,CAAAD,UAAA,EACAC,QAAA,CAAA8B,aAAA,KAEA,IAAAxB,QAAA,CAAAP,UAAA,CAAAgC,QAAA,UAAAhC,UAAA,CAAAiC,MAAA,CAAAC,OAAA,CAAAC,QAAA,CAAAhC,IAAA,EAKA,SAAAiC,SAAAH,MAAA,CAAA9B,IAAA,EAGA,eACA,CAEA,SAAA8gB,SAAAhf,MAAA,CAAA9B,IAAA,EAEA,IAAAoC,MAAA,IAAAK,MAAA,CAAAxC,OAAA,CAoBA,MAnBA,CAAAmC,MAAA,wKACAE,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,eAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,oBAAA7B,OAAA,IACA,wPACAqC,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,gBAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,qBAAA7B,OAAA,IACA,yNACAqC,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,UAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,eAAA7B,OAAA,IACA,uMACAqC,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,mBAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,wBAAA7B,OAAA,IACA,2NACAqC,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,YAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,iBAAA7B,OAAA,IACA,yMACAqC,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,oBAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,yBAAA7B,OAAA,IACA,6NACAqC,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,cAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,mBAAA7B,OAAA,IACA,sMACAqC,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,iCAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,sCAAA7B,OAAA,IACA,0NACAqC,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,WAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,gBAAA7B,OAAA,IACA,6KACAmC,MACA,CAEA,SAAA4e,SAAAlf,MAAA,CAAA9B,IAAA,EAGA,wDACA,CAEA,SAAAqvC,SAAAvtC,MAAA,CAAA9B,IAAA,EAGA,wBACA,CAEA,SAAAsvC,SAAAxtC,MAAA,CAAA9B,IAAA,EAEA,IAAAoC,MAAA,IAAAK,MAAA,CAAAxC,OAAA,CAGA,MAFA,CAAAmC,MAAA,EAAAE,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,cAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,mBAAA7B,OAAA,IACA,oDACAmC,MACA,CAEA,SAAAmtC,UAAAztC,MAAA,CAAA9B,IAAA,EAGA,qBACA,CAEA,SAAAwvC,UAAA1tC,MAAA,CAAA9B,IAAA,EAEA,IAAAoC,MAAA,IAAAK,MAAA,CAAAxC,OAAA,CAGA,MAFA,CAAAmC,MAAA,EAAAE,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,WAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,gBAAA7B,OAAA,IACA,oDACAmC,MACA,CAnEA,KAAAF,YAAA,gBACAH,OAAA,MAAAI,KAAA,CAAAJ,OAAA,CAAAlC,UAAA,CAAAkC,OAAA,EAAA/B,IAAA,CAAAA,IAAA,KACA,IAAAoC,MAAA,IAAAC,aAAA,CAAAN,OAAA,CAAAM,aAAA,CAAAC,gBAAA,MAAAA,gBAAA,CAAAlF,IAAA,MAAAoF,MAAA,CAAAC,MAAA,CAAAxC,OAAA,CAyGA,MAtCA,CAAAmC,MAAA,+DACAI,MAAA,CAAAT,OAAA,OAAA/E,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAA2tC,MAAA,EAAA/sC,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA2F,IAAA,CAAAC,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,GAAAhB,QAAA,CAAAjC,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,+HACAE,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,6BAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,kCAAA7B,OAAA,IACA,oFACAqC,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,2BAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,gCAAA7B,OAAA,IACA,+BACAuC,MAAA,CAAAT,OAAA,OAAA/E,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAA4rC,UAAA,EAAAhrC,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA2F,IAAA,CAAAC,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,GAAA6d,QAAA,CAAA9gB,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,0PACAE,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,iBAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,sBAAA7B,OAAA,IACA,kCACAqC,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,OAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,YAAA7B,OAAA,IACA,yBACAuC,MAAA,CAAAT,OAAA,CAAAa,MAAA,CAAA5F,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAA4rC,UAAA,EAAAhrC,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA2F,IAAA,CAAAC,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,GAAA+d,QAAA,CAAAhhB,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,0KACAI,MAAA,CAAAT,OAAA,OAAA/E,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAA4rC,UAAA,EAAAhrC,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA2F,IAAA,CAAAC,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,GAAAosC,QAAA,CAAArvC,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,iCACAE,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,qCAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,0CAAA7B,OAAA,IACA,4BACAuC,MAAA,CAAAT,OAAA,CAAAa,MAAA,CAAA5F,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAA4rC,UAAA,EAAAhrC,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA2F,IAAA,CAAAC,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,GAAAqsC,QAAA,CAAAtvC,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,uKACAI,MAAA,CAAAT,OAAA,OAAA/E,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAA4rC,UAAA,EAAAhrC,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA2F,IAAA,CAAAC,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,IAAAssC,SAAA,CAAAvvC,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,iCACAE,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,4CAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,iDAAA7B,OAAA,IACA,4BACAuC,MAAA,CAAAT,OAAA,CAAAa,MAAA,CAAA5F,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAA4rC,UAAA,EAAAhrC,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA2F,IAAA,CAAAC,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,IAAAusC,SAAA,CAAAxvC,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,qPACAE,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,uDAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,4DAAA7B,OAAA,IACA,wEACAqC,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,uDAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,4DAAA7B,OAAA,IACA,uCACAmC,MACA,GAMAtC,QAAA,CAAA8B,aAAA,GACA9B,QAAA,CAAAD,UAAA,EACAC,QAAA,CAAA8B,aAAA,QAEA,CAAA4xB,UAAA,CAAA3zB,UAAA,CAAAgC,QAAA,UAAAhC,UAAA,CAAAiC,MAAA,CAAAC,OAAA,CAAAC,QAAA,CAAAhC,IAAA,EAKA,SAAAiC,SAAAH,MAAA,CAAA9B,IAAA,EAEA,IAAAoC,MAAA,IAAAI,MAAA,CAAAC,MAAA,CAoBA,MAnBA,CAAAL,MAAA,sDACAI,MAAA,CAAAT,OAAA,OAAA/E,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAAqC,MAAA,EAAAzB,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA6F,OAAA,GAAAysC,QAAA,CAAA1vC,IAAA,EAAAgD,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,GAAAuJ,QAAA,CAAAxM,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,mBACAK,MAAA,CAAAV,OAAA,CAAAiC,EAAA,EAAAxB,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAkC,EAAA,CAAAxB,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,6DACAC,MAAA,CAAAV,OAAA,CAAAuK,KAAA,EAAA9J,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAwK,KAAA,CAAA9J,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,wDACAC,MAAA,CAAAV,OAAA,CAAAuK,KAAA,EAAA9J,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAwK,KAAA,CAAA9J,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,iIACAA,MAAA,CAAAT,OAAA,OAAA/E,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAA6E,QAAA,EAAAjE,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA6F,OAAA,GAAAke,QAAA,CAAAnhB,IAAA,EAAAgD,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,GAAAie,QAAA,CAAAlhB,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,sBACAA,MACA,CACA,SAAAoK,SAAA1K,MAAA,CAAA9B,IAAA,EAGA,cACA,CAEA,SAAA0vC,SAAA5tC,MAAA,CAAA9B,IAAA,EAGA,iBACA,CAEA,SAAAkhB,SAAApf,MAAA,CAAA9B,IAAA,EAEA,IAAAoC,MAAA,IAAAI,MAAA,CAAAC,MAAA,CAAAxC,OAAA,CAcA,MAbA,CAAAmC,MAAA,+HACAE,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,uDAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,4DAAA7B,OAAA,IACA,gFACAqC,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,uDAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,4DAAA7B,OAAA,IACA,0IACAwC,MAAA,CAAAV,OAAA,CAAA0C,QAAA,EAAAjC,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAA2C,QAAA,CAAAjC,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,cACAF,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,mBAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,wBAAA7B,OAAA,IACA,+DACAqC,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,mBAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,wBAAA7B,OAAA,IACA,0IACAmC,MACA,CAEA,SAAA+e,SAAArf,MAAA,CAAA9B,IAAA,EAEA,IAAAoC,MAAA,IAAAI,MAAA,CAAAC,MAAA,CASA,MARA,CAAAL,MAAA,iCACAK,MAAA,CAAAV,OAAA,CAAAuK,KAAA,EAAA9J,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAwK,KAAA,CAAA9J,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,6EACAA,MAAA,CAAAT,OAAA,CAAA6G,IAAA,CAAA5L,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAAgC,QAAA,EAAApB,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA2F,IAAA,CAAAC,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,GAAAqsC,QAAA,CAAAtvC,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,8BACAA,MACA,CACA,SAAAktC,SAAAxtC,MAAA,CAAA9B,IAAA,EAEA,IAAAoC,MAAA,IAAAI,MAAA,CAAAC,MAAA,CA4BA,MA3BA,CAAAL,MAAA,iEACAI,MAAA,CAAAT,OAAA,OAAA/E,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAAqC,MAAA,EAAAzB,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA6F,OAAA,GAAAysC,QAAA,CAAA1vC,IAAA,EAAAgD,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,GAAAuJ,QAAA,CAAAxM,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,mBACAK,MAAA,CAAAV,OAAA,CAAAiC,EAAA,EAAAxB,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAkC,EAAA,CAAAxB,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,qEACAC,MAAA,CAAAV,OAAA,CAAAuK,KAAA,EAAA9J,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAwK,KAAA,CAAA9J,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,gEACAC,MAAA,CAAAV,OAAA,CAAAuK,KAAA,EAAA9J,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAwK,KAAA,CAAA9J,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,sEACAF,gBAAA,EAAAE,MAAA,EAAAA,MAAA,CAAAV,MAAA,EAAAA,MAAA,CAAAsE,KAAA,OAAA5D,MAAA,OAAAA,MAAA,CAAAA,MAAA,CAAAA,MAAA,CAAAnD,QAAA,sBAAAmD,MAAA,CAAAA,MAAA,CAAAue,KAAA,CAAAjf,MAAA,EAAAU,MAAA,GACA,IACAF,gBAAA,EAAAE,MAAA,EAAAA,MAAA,CAAAV,MAAA,EAAAA,MAAA,CAAAsE,KAAA,OAAA5D,MAAA,OAAAA,MAAA,CAAAA,MAAA,CAAAA,MAAA,CAAAY,KAAA,sBAAAZ,MAAA,CAAAA,MAAA,CAAAue,KAAA,CAAAjf,MAAA,EAAAU,MAAA,GACA,uEACAC,MAAA,CAAAV,OAAA,CAAAuK,KAAA,EAAA9J,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAwK,KAAA,CAAA9J,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,kFACAA,MAAA,CAAAT,OAAA,CAAA6G,IAAA,CAAA5L,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAAsC,KAAA,EAAA1B,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA2F,IAAA,CAAAC,EAAA,CAAA5F,IAAA,CAAAuyC,gBAAA,IAAAC,SAAA,CAAA5vC,IAAA,CAAA8B,MAAA,EAAA9B,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,6DACAA,MACA,CACA,SAAAwtC,UAAA9tC,MAAA,CAAA9B,IAAA,CAAA6vC,MAAA,EAEA,IAAAztC,MAAA,IAAAI,MAAA,CAAAC,MAAA,CA8CA,MA7CA,CAAAL,MAAA,2DACAK,MAAA,CAAAV,OAAA,CAAA+tC,GAAA,EAAAttC,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAguC,GAAA,CAAAttC,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,iBACAC,MAAA,CAAAV,OAAA,CAAAiC,EAAA,EAAAxB,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAkC,EAAA,CAAAxB,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,uBACAC,MAAA,CAAAV,OAAA,CAAA0C,QAAA,EAAAjC,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAA2C,QAAA,CAAAjC,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,sFACAC,MAAA,CAAAV,OAAA,CAAAuK,KAAA,EAAA9J,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAwK,KAAA,CAAA9J,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,mEACAA,MAAA,CAAAT,OAAA,OAAA/E,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAAxC,MAAA,EAAAoD,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA6F,OAAA,IAAAusC,SAAA,CAAAxvC,IAAA,EAAAgD,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,IAAAssC,SAAA,CAAAvvC,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,uCACAI,MAAA,CAAAT,OAAA,OAAA/E,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAAqC,MAAA,EAAAzB,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA2F,IAAA,CAAAC,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,IAAA8sC,SAAA,CAAA/vC,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,mDACAK,MAAA,CAAAV,OAAA,CAAAqI,KAAA,EAAA5H,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAsI,KAAA,CAAA5H,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,OACAF,gBAAA,EAAAE,MAAA,EAAAA,MAAA,CAAAqtC,MAAA,EAAAA,MAAA,CAAAzpC,KAAA,OAAA5D,MAAA,OAAAA,MAAA,CAAAA,MAAA,CAAAA,MAAA,CAAAY,KAAA,sBAAAZ,MAAA,CAAAA,MAAA,CAAAue,KAAA,CAAAjf,MAAA,EAAAU,MAAA,GACA,KACAC,MAAA,CAAAV,OAAA,CAAAkf,IAAA,EAAAze,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAmf,IAAA,CAAAze,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,2EACAC,MAAA,CAAAV,OAAA,CAAAkf,IAAA,EAAAze,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAmf,IAAA,CAAAze,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,iFACAC,MAAA,CAAAV,OAAA,CAAAqI,KAAA,EAAA5H,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAsI,KAAA,CAAA5H,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,yCACAC,MAAA,CAAAV,OAAA,CAAAuK,KAAA,EAAA9J,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAwK,KAAA,CAAA9J,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,qFACAJ,MACA,CACA,SAAAmtC,UAAAztC,MAAA,CAAA9B,IAAA,EAGA,aACA,CAEA,SAAAwvC,UAAA1tC,MAAA,CAAA9B,IAAA,EAGA,YACA,CAEA,SAAA+vC,UAAAjuC,MAAA,CAAA9B,IAAA,EAGA,6BACA,CA1KA,KAAAkC,YAAA,gBACAH,OAAA,MAAAI,KAAA,CAAAJ,OAAA,CAAAlC,UAAA,CAAAkC,OAAA,EAAA/B,IAAA,CAAAA,IAAA,KACA,IAAAoC,MAAA,IAAAC,aAAA,CAAAN,OAAA,CAAAM,aAAA,CAAAC,gBAAA,MAAAA,gBAAA,CAAAC,YAAA,YAAAnF,IAAA,MAAAoF,MAAA,CA8KA,MAJA,CAAAJ,MAAA,mDACAI,MAAA,CAAAT,OAAA,CAAA6G,IAAA,CAAA5L,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAA4B,KAAA,EAAAhB,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA2F,IAAA,CAAAC,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,GAAAhB,QAAA,CAAAjC,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,cACAA,MACA,GA6BAuqC,SAAA,EACAnmC,KAAA,QACAwpC,WAAA,IACAC,cAAA,IACAR,MAAA,GACA,EAOAjD,OAAA,EACAroC,MAAA,UACAkqC,SAAA,aACA6B,WAAA,eACAT,MAAA,UACAV,QAAA,YACA3vC,OAAA,WACAC,QAAA,YACAC,MAAA,UACA4vC,MAAA,UACApsB,IAAA,QACA7B,IAAA,sBACAza,KAAA,EACA9J,IAAA,cACAwiB,QAAA,mBACA+S,WAAA,qBACA,CACA,EAOAke,QAAA,EAAA3D,OAAA,CAAA1pB,IAAA,CAAA0pB,OAAA,CAAAptC,OAAA,CAAAotC,OAAA,CAAAntC,QAAA,CAAAmtC,OAAA,CAAAltC,MAAA,EAOAytC,UAAA,EACAntC,SAAA,kBACAotC,SAAA,0BACAlmC,MAAA,yBACAomC,IAAA,uBACAiB,cAAA,8BACAF,WAAA,yBACAb,YAAA,kDACAE,UAAA,gDACAK,cAAA,oDACAG,WAAA,iDACAW,SAAA,uBACAF,eAAA,8CACAf,UAAA,8CACAI,iBAAA,qDACAG,cAAA,kDACArqC,KAAA,uBACAgrC,UAAA,8CACA5qC,QAAA,0BACA8qC,aAAA,iDACAxqC,KAAA,uBACAyqC,UAAA,8CACAuB,SAAA,6CACAC,UAAA,8BACApB,KAAA,uBACAG,WAAA,qCACAkB,QAAA,0BACA7O,OAAA,WACAyO,WAAA,gBACAK,iBAAA,sBACArB,MAAA,WACA7vC,QAAA,aACAD,OAAA,YACAoxC,UAAA,kBACAC,WAAA,mBACAC,gBAAA,eACAznC,aAAA,SACAwmC,MAAA,WACAV,QAAA,YACA,EAQA4B,UAAA,EACA3X,GAAA,IACA4X,UAAA,EAAA7D,UAAA,CAAA1tC,QAAA,CAAA0tC,UAAA,CAAA9jC,aAAA,EAAA4sB,IAAA,MACAz2B,OAAA,CAAA2tC,UAAA,CAAAyD,UAAA,CACAnxC,QAAA,CAAA0tC,UAAA,CAAA0D,WAAA,CACAI,QAAA,CAAA9D,UAAA,CAAA0C,MACA,EAMA/C,YAAA,EAMArc,WAAA,UAAAA,YAAA5rB,QAAA,CAAAqsC,IAAA,KACA,CAAAxtC,GAAA,MAAAA,GAAA,CACAnE,IAAA,CACAmE,GAAA,GACAnE,IAAA,CAAAqL,SAAA,CAAAtF,SAAA,CAAA5B,GAAA,CAAAmB,QAAA,EACAtF,IAAA,GACAA,IAAA,CAAAC,OAAA,CAAA0xC,IAAA,CACAtmC,SAAA,CAAAzB,eAAA,CAAAzF,GAAA,CAAAmB,QAAA,GAGA,EAOAssC,mBAAA,UAAAA,oBAAAC,WAAA,CAAArlC,MAAA,EACA,IAAAvI,KAAA,CAMA,MAJA,CAAAA,KAAA,CADA,cAAAuI,MAAA,CACAqlC,WAAA,CAAA7tC,SAAA,CAEA6tC,WAAA,CAAA5tC,KAAA,CAEAA,KACA,EAMAqpC,WAAA,UAAAA,YAAAhoC,QAAA,CAAAqsC,IAAA,KACA,CAAAptB,KAAA,CAAAjf,QAAA,EAAAA,QAAA,CAAAwsC,MAAA,CAAAxsC,QAAA,MAAAyuB,QAAA,CAAA+Z,KAAA,CAAAvvC,IAAA,mBAAA+G,QAAA,KACAusC,WAAA,MAAAA,WAAA,CACA/vB,IAAA,CAGA,KAAAoP,WAAA,CAAA5rB,QAAA,CAAAqsC,IAAA,EAGAptB,KAAA,CAAA0qB,WAAA,CAAA5B,OAAA,CAAAptC,OAAA,CAAA0xC,IAAA,EAGA7vB,IAAA,CAAA3kB,CAAA,CAAAoB,IAAA,CAAAyyC,QAAA,CAAA7zC,CAAA,CAAAovC,IAAA,CAAAhoB,KAAA,CAAA3R,QAAA,CAAA2R,KAAA,IAAA8oB,OAAA,CAAA0C,MAAA,CACAxrB,KAAA,CAAAhmB,IAAA,CAAAqvC,UAAA,CAAAkC,KAAA,EAAA/wC,IAAA,YAAAsuC,OAAA,CAAAvrB,IAAA,SAAAA,IAAA,IAGA+vB,WAAA,CAAA5xC,OAAA,MAAA8zB,QAAA,CAAA+Z,KAAA,CAAAvvC,IAAA,CAAAqvC,UAAA,CAAA3tC,OAAA,EAAArB,MAAA,CACA,KAAAmzC,UAAA,MAAAhe,QAAA,CAAA2a,YAAA,CAAAmD,WAAA,CAAA5xC,OAAA,MAAA2xC,mBAAA,CAAAC,WAAA,eAGA,KAAAlqC,MAAA,MAAAiM,aAAA,CACA,EAKAjM,MAAA,UAAAA,OAAAqqC,QAAA,KACA,CAAA/zC,IAAA,MAGAg0C,MAAA,MAAAle,QAAA,CAAA+Z,KAAA,CAAAvvC,IAAA,CAAAqvC,UAAA,CAAA3oC,KAAA,EAAAsK,WAAA,CAAA89B,OAAA,CAAAiD,MAAA,EAGA4B,QAAA,CAAAV,UAAA,CAAAQ,QAAA,EACAE,QAAA,EACAD,MAAA,CAAAtqC,MAAA,CAAAuqC,QAAA,EAAA1iC,QAAA,CAAA69B,OAAA,CAAAiD,MAAA,EAIA,KAAAvc,QAAA,CAAA+Z,KAAA,CAAAvvC,IAAA,CAAAqvC,UAAA,CAAAjpC,QAAA,EAAA8E,IAAA,eACA,CAAA0oC,QAAA,CAAA3kC,GAAA,OACA4kC,WAAA,CAAAD,QAAA,CAAA5zC,IAAA,CAAAqvC,UAAA,CAAA3oC,KAAA,EAAAzG,GAAA,CAAAovC,UAAA,CAAA0C,MAAA,EACA+B,SAAA,CAAAD,WAAA,CAAA5zC,GAAA,CAAAovC,UAAA,CAAAgC,QAAA,EACA3xC,IAAA,CAAA8zC,UAAA,CAAAI,QAAA,CAAA5zC,IAAA,CAAAqvC,UAAA,CAAAuD,QAAA,EAAAkB,SAAA,CAAAzzC,MAAA,CAAAwzC,WAAA,CAAAxzC,MAAA,CACA,GACA,KAAAgV,aAAA,CAAAo+B,QACA,EAMAjD,YAAA,UAAAA,aAAA3tC,MAAA,KACA,CAAAssC,UAAA,MAAA3rC,UAAA,GACAuwC,UAAA,CAAAjF,OAAA,CAAAhmC,KAAA,MAAAjG,MAAA,CAAAiG,KAAA,EAAAmmC,SAAA,CAAAnmC,KAAA,EAYA,MATA,CAAAjG,MAAA,CAAAjE,CAAA,CAAA6F,KAAA,MAAA5B,MAAA,CAAAA,MAAA,MAGAssC,UAAA,CAAAuB,WAAA,CAAA5B,OAAA,CAAA0D,WAAA,CAAA3vC,MAAA,CAAAyvC,WAAA,EAGAnD,UAAA,CAAAn+B,WAAA,CAAA+iC,UAAA,EACAA,UAAA,CAAAjF,OAAA,CAAAhmC,KAAA,MAAAjG,MAAA,CAAAiG,KAAA,EAAAmmC,SAAA,CAAAnmC,KAAA,EACAqmC,UAAA,CAAAl+B,QAAA,CAAA8iC,UAAA,EACA,IACA,EAIA7E,UAAA,UAAAA,WAAA,EACA1nB,UAAA,MAAAgO,QAAA,CAAA+Z,KAAA,CAAAvvC,IAAA,CAAAqvC,UAAA,CAAAsD,UAAA,OAAAnd,QAAA,CAAA+Z,KAAA,CACA,EAQA7+B,OAAA9K,GAAA,CAAAgF,OAAA,OACA,CAAAooB,SAAA,MAAAghB,YAAA,CAAApuC,GAAA,CAAAgF,OAAA,EACA4W,QAAA,CAAA1U,SAAA,CAAA9F,OAAA,CAAApB,GAAA,CAAAgF,OAAA,CAAAC,UAAA,EACAyoC,WAAA,CAAAtgB,SAAA,CAAAtqB,KAAA,GACAjD,SAAA,GACA9D,QAAA,GACAD,OAAA,GACAE,MAAA,GACA8D,KAAA,EACA,EACAuuC,cAAA,MAAAZ,mBAAA,CAAAC,WAAA,cAYA,GAXA,KAAA1tC,GAAA,CAAAA,GAAA,CACA,KAAA0tC,WAAA,CAAAA,WAAA,CAGA,KAAAE,UAAA,MAAAhe,QAAA,CAAAia,aAAA,CAAA6D,WAAA,CAAA3xC,QAAA,CAAAsyC,cAAA,EACA,KAAAT,UAAA,MAAAhe,QAAA,CAAAua,eAAA,CAAAkE,cAAA,CAAAX,WAAA,CAAA3xC,QAAA,CAAAsyC,cAAA,EACA,KAAAT,UAAA,MAAAhe,QAAA,CAAAma,WAAA,CAAA2D,WAAA,CAAA1xC,MAAA,MAAAyxC,mBAAA,CAAAC,WAAA,WACA,KAAAE,UAAA,MAAAhe,QAAA,CAAA2a,YAAA,CAAAmD,WAAA,CAAA5xC,OAAA,CAAAuyC,cAAA,EACA,KAAAT,UAAA,MAAAhe,QAAA,CAAAqa,QAAA,CAAAoE,cAAA,OAGA,CAAAzyB,QAAA,CAAAvY,QAAA,EACA,KAAAusB,QAAA,CAAA4Z,UAAA,CAAAryB,IAAA,GACA,KAAAyY,QAAA,CAAA8a,YAAA,CAAAvyB,IAAA,GACA,KAAAyX,QAAA,CAAA+Z,KAAA,CAAA9sC,IAAA,CAAAksC,gBAAA,CAAA3b,SAAA,GACA,KAAAkc,UAAA,GACA,MAAAyD,UAAA,CAAA7lC,SAAA,CAAAvG,aAAA,CAAAysB,SAAA,EACA,KAAAjO,QAAA,wBAAAliB,MAAA,CAAA0vC,cAAA,EACA,MAAA2B,kBAAA,CAAAvB,UAAA,EAAAA,UAAA,CAAA/qC,UAAA,KAAAhJ,CAAA,CAAAkR,OAAA,CAAA6iC,UAAA,CAAA/qC,UAAA,kCACA,KAAAmd,QAAA,qBAAAmvB,kBAAA,EACA,KAAArxC,MAAA,CAAA0vC,cAAA,GAAA2B,kBAAA,EAEA,KAAA1e,QAAA,CAAA+Z,KAAA,CAAAvvC,IAAA,CAAAqvC,UAAA,CAAAmC,MAAA,EAAAvgC,QAAA,CAAA69B,OAAA,CAAAuC,QAAA,CAEA,KACA,MAAA7b,QAAA,CAAA4Z,UAAA,CAAArxB,IAAA,GACA,KAAAyX,QAAA,CAAA8a,YAAA,CAAAvzB,IAAA,GACA,KAAAyY,QAAA,CAAA+Z,KAAA,CAAAriB,KAAA,GAUA,MANA,MAAA9jB,MAAA,MAAAosB,QAAA,CAAAlgB,QAAA,CAAAlM,MAAA,CAAAimC,UAAA,CAAAtL,OAAA,EAAAzhC,IAAA,UAKA,KAAAoB,OAAA,WACA,IACA,EAOAswC,YAAA,UAAAA,aAAApuC,GAAA,CAAAgF,OAAA,KACA,CAAAooB,SAAA,CAAAlmB,SAAA,CAAAnC,sBAAA,CAAA/E,GAAA,CAAAgF,OAAA,MAAA/H,MAAA,CAAAiG,KAAA,EACA0Y,QAAA,CAAA1U,SAAA,CAAA9F,OAAA,CAAAgsB,SAAA,CAAApoB,OAAA,CAAAC,UAAA,MACAxE,OAAA,CAAAyG,SAAA,CAAA5F,UAAA,CAAA8rB,SAAA,CAAApoB,OAAA,CAAAhE,SAAA,MACAnF,IAAA,CAAAqL,SAAA,CAAA1F,OAAA,CAAA4rB,SAAA,CAAApoB,OAAA,CAAAvD,cAAA,MAGAma,QAAA,CAAA/a,MAAA,IACAJ,OAAA,CAAAI,MAAA,IACAhF,IAAA,CAAAgF,MAAA,IAGA,IAAA0tC,OAAA,GAGA,OAAArnC,SAAA,CAAA5B,IAAA,CAAA8nB,SAAA,UAAAohB,GAAA,KACA,CAAAhC,GAAA,IACA7uB,IAAA,IACA6wB,GAAA,CAAA3tC,MAAA,EACA2rC,GAAA,CAAA5/B,IAAA,WAEA4hC,GAAA,CAAA7oC,aAAA,GACA6mC,GAAA,CAAA5/B,IAAA,SACA+Q,IAAA,CAAAA,IAAA,UAEA6wB,GAAA,CAAA1yC,OAAA,GACA0wC,GAAA,CAAA5/B,IAAA,YACA+Q,IAAA,CAAAA,IAAA,aAEA6wB,GAAA,CAAAzyC,QAAA,GACAywC,GAAA,CAAA5/B,IAAA,aACA+Q,IAAA,CAAAA,IAAA,cAEA6wB,GAAA,CAAAxyC,MAAA,EACAwwC,GAAA,CAAA5/B,IAAA,WACA+Q,IAAA,CAAAA,IAAA,aAEA6uB,GAAA,CAAA5/B,IAAA,WACA+Q,IAAA,CAAAA,IAAA,YAEA6wB,GAAA,CAAA7oC,aAAA,GACA4oC,OAAA,IACAC,GAAA,CAAAC,UAAA,CAAAF,OAAA,EAGAC,GAAA,CAAAhC,GAAA,CAAAA,GAAA,CAAAja,IAAA,MACAic,GAAA,CAAA7wB,IAAA,CAAAA,IACA,EACA,EAQAiwB,UAAA,UAAAA,WAAAc,MAAA,CAAAte,KAAA,CAAAtwB,KAAA,EACA,IAAA6uC,OAAA,GACAD,MAAA,CAAAvjC,MAAA,GAAAsD,QAAA,sBACAkgC,OAAA,CAAA5gB,IAAA,CAAA8I,GAAA,CAAAzG,KAAA,IACA,EAAAtwB,KAAA,GACA6uC,OAAA,IAAA5gB,IAAA,CAAA6gB,GAAA,CAAAxe,KAAA,CAAAtwB,KAAA,KAAAA,KAAA,IAEA4uC,MAAA,CAAAnjC,IAAA,CAAAojC,OAAA,CACA,EAOA9C,MAAA,UAAAA,OAAA1qC,QAAA,CAAA0tC,IAAA,KAEA,CAAAlF,KAAA,MAAA/Z,QAAA,CAAA+Z,KAAA,CACAmF,QAAA,CAAA3tC,QAAA,EAAAA,QAAA,CAAAwsC,MAAA,CAAAxsC,QAAA,CAAAwoC,KAAA,CAAAvvC,IAAA,mBAAA+G,QAAA,KACA4tC,SAAA,CAAAD,QAAA,CAAAE,YAAA,CAAArF,KAAA,EACAsF,gBAAA,GACAC,SAAA,CAAAvF,KAAA,CAAAvvC,IAAA,CAAAqvC,UAAA,CAAAsD,UAAA,EAuBA,MAtBA,CAAAmC,SAAA,CAAAz0C,MAAA,GACAw0C,gBAAA,CAAAC,SAAA,CAAAxyC,IAAA,cAIAmyC,IAAA,EACA,KAAAxD,QAAA,CAAA0D,SAAA,EAIApF,KAAA,CAAAvvC,IAAA,CAAAqvC,UAAA,CAAAtL,OAAA,EAAA/yB,WAAA,CAAA89B,OAAA,CAAAroC,MAAA,EACAkuC,SAAA,CAAA1kC,GAAA,CAAAykC,QAAA,EAAAzjC,QAAA,CAAA69B,OAAA,CAAAroC,MAAA,EACAM,QAAA,CAAA2tC,QAAA,CAAApyC,IAAA,aASA,KAAAoB,OAAA,YAAAqD,QAAA,CAAA8tC,gBAAA,EACAH,QACA,EAKA9D,YAAA,UAAAA,aAAA,KAEA,CAAArB,KAAA,MAAA/Z,QAAA,CAAA+Z,KAAA,CACAmF,QAAA,CAAAnF,KAAA,CAAAvvC,IAAA,CAAAqvC,UAAA,CAAA3oC,KAAA,CAAA2oC,UAAA,CAAAtL,OAAA,EACA4Q,SAAA,CAAAD,QAAA,CAAAE,YAAA,CAAArF,KAAA,EAIA,MADA,MAAA0B,QAAA,CAAA0D,SAAA,EACAD,QACA,EAMAzD,QAAA,UAAAA,SAAA7yB,MAAA,CAAA22B,IAAA,EACA,CAAAA,IAAA,OAAAvf,QAAA,CAAA+Z,KAAA,EAAAvvC,IAAA,CAAAqvC,UAAA,CAAAmD,WAAA,EAAAvhC,QAAA,CAAA69B,OAAA,CAAA6B,SAAA,EACAvyB,MAAA,CAAApN,WAAA,CAAA89B,OAAA,CAAA6B,SAAA,CACA,EAOAG,WAAA,UAAAA,YAAAkE,KAAA,CAAAC,gBAAA,EACA,IAAAtE,SAAA,CAAAqE,KAAA,CAAA3gC,QAAA,CAAAy6B,OAAA,CAAA6B,SAAA,EASA,MARA,CAAAsE,gBAAA,EACA,KAAAzf,QAAA,CAAA+Z,KAAA,CAAAvvC,IAAA,CAAAi1C,gBAAA,EAAAhkC,QAAA,CAAA69B,OAAA,CAAA6B,SAAA,EAEAA,SAAA,CACAqE,KAAA,CAAAhkC,WAAA,CAAA89B,OAAA,CAAA6B,SAAA,EAEAqE,KAAA,CAAA/jC,QAAA,CAAA69B,OAAA,CAAA6B,SAAA,EAEAA,SACA,EAMA7C,MAAA,UAAAA,OAAA/wB,IAAA,EASA,MARA,oBAAAA,IAAA,GACAA,IAAA,MAAAhb,EAAA,YAEAgb,IAAA,CACA,KAAAA,IAAA,GAEA,KAAAgB,IAAA,GAEA,IACA,CACA,EAqMA,OAAA6wB,gBAEA,GAEAjwC,MCh9BA,kMAAAC,CAAA,CAAAgC,EAAA,CAAAs0C,gBAAA,CAAAC,qBAAA,CAAAroC,SAAA,CAAA3K,UAAA,CAAAC,QAAA,eAmCA,SAAAssC,aAAApsC,IAAA,CAAAC,OAAA,CAAAC,QAAA,EACA,IAAAC,IAAA,CAAAC,QAAA,CAAAJ,IAAA,CAAAC,OAAA,EACA,OAAAC,QAAA,KAAAC,IAAA,CAAAE,CAAA,CAAAF,IAAA,CACA,CAwDA,SAAAksC,iBAAArsC,IAAA,CAAAC,OAAA,CAAAC,QAAA,EACA,IAAAC,IAAA,CAAAqzB,UAAA,CAAAxzB,IAAA,CAAAC,OAAA,EACA,OAAAC,QAAA,KAAAC,IAAA,CAAAE,CAAA,CAAAF,IAAA,CACA,CAiDA,SAAAmsC,iBAAA/rC,MAAA,EAOA,SAAAuyC,YAAAlzB,MAAA,OACA,CAAAzgB,IAAA,CAAAqL,SAAA,CAAA1F,OAAA,CAAAlF,SAAA,CAAA0D,GAAA,CAAAsc,MAAA,EACAywB,UAAA,CAAA7lC,SAAA,CAAA1F,OAAA,CAAAlF,SAAA,CAAA0D,GAAA,CAAA1D,SAAA,CAAA+e,WAAA,CAAA5Z,cAAA,EACA,CAAA5F,IAAA,GAAAA,IAAA,CAAA6E,EAAA,EAAApE,SAAA,CAAAH,EAAA,cACAG,SAAA,CAAAmzC,kBAAA,GAAA5zC,IAAA,CAAAG,MAAA,EAAA+wC,UAAA,EAAAlxC,IAAA,CAAAsF,QAAA,GAAA4rC,UAAA,CAAA5rC,QAAA,GACA7E,SAAA,CAAAuvC,MAAA,CAAAhwC,IAAA,CAAAsF,QAAA,EAMA7E,SAAA,CAAAwB,OAAA,QAAAjC,IAAA,CAAAsF,QAAA,EAGA,CAOA,SAAAuuC,+BAAAC,kBAAA,CAAAC,YAAA,EACAtzC,SAAA,CAAAuzC,wBAAA,CAAApyC,OAAA,CAAAqyC,CAAA,EAAAA,CAAA,CAAAhnC,OAAA,IACAxM,SAAA,CAAAuzC,wBAAA,IACAvzC,SAAA,CAAAszB,QAAA,CAAA+Z,KAAA,CAAAvvC,IAAA,CAAAqvC,UAAA,CAAAsG,uBAAA,EAAAzqC,IAAA,EAAAwB,KAAA,CAAAkpC,2BAAA,IACA,MAAAC,uBAAA,CAAAV,qBAAA,EACAzuC,KAAA,CAAA6uC,kBAAA,CAAAnvC,QAAA,CAAAsG,KAAA,EAAAhG,KAAA,CACAovC,eAAA,CAAA5zC,SAAA,CAAAszB,QAAA,CAAA+Z,KACA,GAAA/+B,MAAA,CAAAolC,2BAAA,EAAA5yC,EAAA,SAAAqG,IAAA,GACA,IACA/C,EACA,EAAA+C,IAAA,CACA,OAAA+rC,WAAA,CAAA9uC,EAAA,CACA,GACApE,SAAA,CAAAuzC,wBAAA,CAAAjjC,IAAA,CAAAqjC,uBAAA,CACA,GACA3zC,SAAA,CAAAuzC,wBAAA,CAAApyC,OAAA,CAAAqyC,CAAA,EAAAA,CAAA,CAAAK,aAAA,CAAAP,YAAA,EACA,CAQA,SAAAQ,sBAAAhjB,SAAA,CAAAqiB,kBAAA,EACA,MACAY,oBAAA,CACAC,kBACA,EAAAh0C,SAAA,CAAA4P,SAAA,GACA,IAAAqkC,qBAAA,GACA,MAAAC,QAAA,EACAhwC,QAAA,GACA,EAwDA,MAvDA,CAAAxH,CAAA,CAAAyE,OAAA,CAAA2vB,SAAA,CAAAhtB,KAAA,UAAAG,IAAA,EACAvH,CAAA,CAAAyE,OAAA,CAAA8C,IAAA,CAAAC,QAAA,UAAAiwC,WAAA,EACA,IAAAC,YAAA,CACAL,oBAAA,EACAK,YAAA,EACA1nC,KAAA,CAAAynC,WAAA,CAAAznC,KAAA,CACAlI,KAAA,GACA,EACA0vC,QAAA,CAAAhwC,QAAA,CAAAoM,IAAA,CAAA8jC,YAAA,GAEAF,QAAA,CAAAhwC,QAAA,CAAA/F,MAAA,CACAi2C,YAAA,CAAAF,QAAA,CAAAhwC,QAAA,KAEAkwC,YAAA,EACA5vC,KAAA,GACA,EACA0vC,QAAA,CAAAhwC,QAAA,CAAAoM,IAAA,CAAA8jC,YAAA,GAGA13C,CAAA,CAAAyE,OAAA,CAAAgzC,WAAA,CAAA3vC,KAAA,UAAA6vC,QAAA,EACAA,QAAA,CAAAhrC,aAAA,EACA4qC,qBAAA,GAEA,MAAAK,SAAA,EACAlwC,EAAA,CAAAiwC,QAAA,CAAAjwC,EAAA,CACAS,QAAA,CAAAwvC,QAAA,CAAAxvC,QACA,EACAuvC,YAAA,CAAA5vC,KAAA,CAAA8L,IAAA,CAAAgkC,SAAA,EACAA,SAAA,CAAAC,YAAA,CAAAF,QAAA,CAAAhrC,aAAA,OAAA4qC,qBAAA,GACAI,QAAA,CAAAhrC,aAAA,EACAirC,SAAA,CAAAjzB,IAAA,QACAizB,SAAA,CAAAE,SAAA,CAAA91C,EAAA,wBACA21C,QAAA,CAAA70C,OAAA,EACA80C,SAAA,CAAAjzB,IAAA,WACAizB,SAAA,CAAAE,SAAA,CAAA91C,EAAA,0BAAAu1C,qBAAA,IAEAK,SAAA,CAAAjzB,IAAA,MACAizB,SAAA,CAAAE,SAAA,CAAA91C,EAAA,eAAAu1C,qBAAA,GAGAK,SAAA,CAAAG,MAAA,CADAJ,QAAA,CAAA50C,QAAA,CACA,WACA40C,QAAA,CAAA30C,MAAA,CACA,SAEA,SAEAyzC,kBAAA,GAAAkB,QAAA,CAAA30C,MAAA,CAEA40C,SAAA,CAAAnF,QAAA,IACA6E,kBAAA,GACAM,SAAA,CAAA7yB,KAAA,CAAA4yB,QAAA,CAAA3nC,KAAA,CAEA,EACA,EACA,GACAwnC,QACA,CApHA,IAAAl0C,SAAA,CA0HA,MAAA8sC,YAAA,EAMAD,YAAAhoC,QAAA,CAAAqsC,IAAA,OACA,CAAAwD,UAAA,CAAAh4C,CAAA,CAAA4L,SAAA,MAAA5E,GAAA,EACAixC,WAAA,CAAA/pC,SAAA,CAAAtF,SAAA,CAAAovC,UAAA,CAAA7vC,QAAA,EACA,GAAA8vC,WAAA,EAAAA,WAAA,CAAAvwC,EAAA,EACAuwC,WAAA,CAAAn1C,OAAA,CAAA0xC,IAAA,MACA,CAAA0D,eAAA,CAAAhqC,SAAA,CAAAnC,sBAAA,CAAAisC,UAAA,MAAA31B,WAAA,MAAApe,MAAA,CAAAiG,KAAA,EACAiuC,eAAA,CAAAf,qBAAA,CAAAc,eAAA,MAAAzB,kBAAA,EACA,IAAA2B,eAAA,CACAp4C,CAAA,CAAAyE,OAAA,CAAA0zC,eAAA,CAAA3wC,QAAA,CAAAkwC,YAAA,GAEA,GADAU,eAAA,CAAAp4C,CAAA,CAAAoB,IAAA,CAAAs2C,YAAA,CAAA5vC,KAAA,CAAA8vC,SAAA,EAAAA,SAAA,CAAAlwC,EAAA,GAAAuwC,WAAA,CAAAvwC,EAAA,EACA0wC,eAAA,CACA,QAEA,GACA,KAAAvB,wBAAA,CAAApyC,OAAA,CAAAqyC,CAAA,EAAAA,CAAA,CAAAuB,UAAA,CAAAJ,WAAA,CAAAvwC,EAAA,CAAA0wC,eAAA,EACA,CACA,EAKAxG,aAAA,EAEA,WACA,EAQA9/B,OAAA9K,GAAA,CAAAgF,OAAA,EACA,MAAAooB,SAAA,CAAAlmB,SAAA,CAAAnC,sBAAA,CAAA/E,GAAA,CAAAgF,OAAA,MAAA/H,MAAA,CAAAiG,KAAA,EACAkqB,SAAA,CAAAijB,oBAAA,MAAAnkC,SAAA,GAAAmkC,oBAAA,MACA,CAAAT,YAAA,CAAA5qC,OAAA,CAAAvD,cAAA,CACA6sC,kBAAA,CAAApnC,SAAA,CAAAjF,eAAA,CAAAjC,GAAA,CAAA4vC,YAAA,kCACA,KAAA5vC,GAAA,CAAAA,GAAA,CACA,KAAAqb,WAAA,CAAArW,OAAA,CACA,KAAAyqC,kBAAA,MAAAxyC,MAAA,CAAA0vC,cAAA,GAAA2B,kBAAA,CAGA,MAAA1yB,QAAA,CAAA1U,SAAA,CAAA9F,OAAA,CAAApB,GAAA,CAAAgF,OAAA,CAAAC,UAAA,EACA,IAAA2W,QAAA,CAAAvY,QAAA,EACA,KAAA8b,QAAA,qBAAAmvB,kBAAA,EACA,KAAAnvB,QAAA,wBAAAliB,MAAA,CAAA0vC,cAAA,EACA,KAAA/c,QAAA,CAAA8a,YAAA,CAAAvyB,IAAA,GACA,KAAAyX,QAAA,CAAA+Z,KAAA,CAAA9sC,IAAA,CAAAksC,gBAAA,CAAA3b,SAAA,GACA,MAAAuiB,kBAAA,CAAAS,qBAAA,CAAAhjB,SAAA,MAAAqiB,kBAAA,EACAC,8BAAA,CAAAC,kBAAA,CAAAC,YAAA,CACA,KACA,MAAAhgB,QAAA,CAAA8a,YAAA,CAAAvzB,IAAA,GACA,KAAAyY,QAAA,CAAA+Z,KAAA,CAAAriB,KAAA,GAOA,MADA,MAAAxpB,OAAA,WACA,IACA,EAKA+tC,OAAA1qC,QAAA,EACA,IAAA8tC,gBAAA,GACA,MAAAqC,YAAA,CAAApqC,SAAA,CAAA1F,OAAA,MAAAxB,GAAA,MAAAqb,WAAA,CAAA5Z,cAAA,EACA6vC,YAAA,EAAAA,YAAA,CAAA5wC,EAAA,GACAuuC,gBAAA,CAAAqC,YAAA,CAAAnwC,QAAA,EAEA,MAAAtF,IAAA,CAAAqL,SAAA,CAAAtF,SAAA,MAAA5B,GAAA,CAAA2c,QAAA,CAAAxb,QAAA,GACAtF,IAAA,EAAAA,IAAA,CAAA6E,EAAA,EACA,KAAAmvC,wBAAA,CAAApyC,OAAA,CAAAqyC,CAAA,EAAAA,CAAA,CAAAK,aAAA,CAAAt0C,IAAA,CAAA6E,EAAA,GASA,KAAA5C,OAAA,YAAAqD,QAAA,CAAA8tC,gBAAA,CACA,CACA,EA2BA,MA1BA,CAAA3yC,SAAA,CAAAgzC,gBAAA,CAAAlG,YAAA,CAAAC,SAAA,EAAAjrC,WAAA,CAAA0qC,YAAA,EAAA1rC,EAAA,mBACA,KAAAyyC,wBAAA,GACA,GAAAzyC,EAAA,sBACA,KAAAwyB,QAAA,MACA,KAAAigB,wBAAA,CAAApyC,OAAA,CAAAqyC,CAAA,EAAAA,CAAA,CAAAhnC,OAAA,IACA,KAAA+mC,wBAAA,GACA,GAAAzyC,EAAA,qBACA,MAAAmsC,UAAA,MAAA3rC,UAAA,GACA,KAAAgyB,QAAA,EACA+Z,KAAA,CAAAJ,UAAA,CAAAnvC,IAAA,CAAAqvC,UAAA,CAAAG,IAAA,EACAc,YAAA,CAAAnB,UAAA,CAAAnvC,IAAA,CAAAqvC,UAAA,CAAAkB,WAAA,EACA4G,YAAA,CAAAhI,UAAA,CAAAnvC,IAAA,CAAAqvC,UAAA,CAAA+H,WAAA,CACA,EACA,KAAA5hB,QAAA,CAAA2hB,YAAA,CAAAn0C,EAAA,kBAAAgL,CAAA,EACAA,CAAA,CAAAoW,cAAA,GAKAliB,SAAA,CAAAwB,OAAA,SACA,EACA,GAAAV,EAAA,qBACA,KAAAyyC,wBAAA,CAAApyC,OAAA,CAAAqyC,CAAA,EAAAA,CAAA,CAAA32B,MAAA,GACA,GAAA/b,EAAA,sBACA,KAAAyyC,wBAAA,CAAApyC,OAAA,CAAAqyC,CAAA,EAAAA,CAAA,CAAA72B,OAAA,GACA,GACA3c,SAAA,CAAAzC,IAAA,CAAAoD,MAAA,CACA,CAjYAjE,CAAA,CAAAA,CAAA,EAAAO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAV,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACAgC,EAAA,CAAAA,EAAA,EAAAzB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAsB,EAAA,YAAAA,EAAA,YAAAA,EAAA,CACAs0C,gBAAA,CAAAA,gBAAA,EAAA/1C,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA41C,gBAAA,YAAAA,gBAAA,YAAAA,gBAAA,CACAC,qBAAA,CAAAA,qBAAA,EAAAh2C,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA61C,qBAAA,YAAAA,qBAAA,YAAAA,qBAAA,CACAroC,SAAA,CAAAA,SAAA,EAAA3N,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAwN,SAAA,YAAAA,SAAA,YAAAA,SAAA,CACA3K,UAAA,CAAAA,UAAA,EAAAhD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6C,UAAA,YAAAA,UAAA,YAAAA,UAAA,CACAC,QAAA,CAAAA,QAAA,EAAAjD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA8C,QAAA,YAAAA,QAAA,YAAAA,QAAA,CAEAA,QAAA,CAAA8B,aAAA,GACA9B,QAAA,CAAAD,UAAA,EACAC,QAAA,CAAA8B,aAAA,KAEA,IAAAxB,QAAA,CAAAP,UAAA,CAAAgC,QAAA,UAAAhC,UAAA,CAAAiC,MAAA,CAAAC,OAAA,CAAAC,QAAA,CAAAhC,IAAA,EAKA,SAAAiC,SAAAH,MAAA,CAAA9B,IAAA,EAGA,eACA,CARA,KAAAkC,YAAA,gBACAH,OAAA,MAAAI,KAAA,CAAAJ,OAAA,CAAAlC,UAAA,CAAAkC,OAAA,EAAA/B,IAAA,CAAAA,IAAA,KACA,IAAAoC,MAAA,IAAAhF,IAAA,MAAAiF,aAAA,CAAAN,OAAA,CAAAM,aAAA,CAAAC,gBAAA,MAAAA,gBAAA,CAAAE,MAAA,CAAAC,MAAA,CAAAxC,OAAA,CAgBA,MARA,CAAAmC,MAAA,yCACAI,MAAA,CAAAT,OAAA,OAAA/E,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAA2tC,MAAA,EAAA/sC,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA2F,IAAA,CAAAC,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,GAAAhB,QAAA,CAAAjC,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,kHACAE,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,iBAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,sBAAA7B,OAAA,IACA,mSACAqC,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,uDAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,4DAAA7B,OAAA,IACA,uCACAmC,MACA,GAMAtC,QAAA,CAAA8B,aAAA,GACA9B,QAAA,CAAAD,UAAA,EACAC,QAAA,CAAA8B,aAAA,KAEA,IAAA4xB,UAAA,CAAA3zB,UAAA,CAAAgC,QAAA,UAAAhC,UAAA,CAAAiC,MAAA,CAAAC,OAAA,CAAAC,QAAA,CAAAhC,IAAA,EAKA,SAAAiC,SAAAH,MAAA,CAAA9B,IAAA,EAEA,IAAAoC,MAAA,IAAAI,MAAA,CAKA,MAJA,CAAAJ,MAAA,WACAI,MAAA,CAAAT,OAAA,CAAA6G,IAAA,CAAA5L,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAA4B,KAAA,EAAAhB,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA2F,IAAA,CAAAC,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,GAAAuJ,QAAA,CAAAxM,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,OACAA,MACA,CACA,SAAAoK,SAAA1K,MAAA,CAAA9B,IAAA,EAEA,IAAAoC,MAAA,IAAAI,MAAA,CAKA,MAJA,CAAAJ,MAAA,eACAI,MAAA,CAAAT,OAAA,CAAA6G,IAAA,CAAA5L,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAAgC,QAAA,EAAApB,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA2F,IAAA,CAAAC,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,GAAA6d,QAAA,CAAA9gB,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,WACAA,MACA,CACA,SAAA0e,SAAAhf,MAAA,CAAA9B,IAAA,EAEA,IAAAoC,MAAA,IAAAI,MAAA,CAAAC,MAAA,CAUA,MATA,CAAAL,MAAA,qHACAK,MAAA,CAAAV,OAAA,CAAAuK,KAAA,EAAA9J,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAwK,KAAA,CAAA9J,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,6BACAC,MAAA,CAAAV,OAAA,CAAAuK,KAAA,EAAA9J,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAwK,KAAA,CAAA9J,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,mHACAJ,MACA,CAEA,SAAA4e,SAAAlf,MAAA,CAAA9B,IAAA,EAGA,kHACA,CAzCA,KAAAkC,YAAA,gBACAH,OAAA,MAAAI,KAAA,CAAAJ,OAAA,CAAAlC,UAAA,CAAAkC,OAAA,EAAA/B,IAAA,CAAAA,IAAA,KACA,IAAAoC,MAAA,IAAAG,YAAA,YAAAD,gBAAA,MAAAA,gBAAA,CAAAlF,IAAA,MAAAoF,MAAA,CA6CA,MAJA,CAAAJ,MAAA,kDACAI,MAAA,CAAAT,OAAA,OAAA/E,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAA6xC,oBAAA,EAAAjxC,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA6F,OAAA,GAAA+d,QAAA,CAAAhhB,IAAA,EAAAgD,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,GAAAhB,QAAA,CAAAjC,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,cACAA,MACA,QA6BA,CAAAuqC,SAAA,EACAnmC,KAAA,QACAypC,cAAA,GACA,EAOAlD,UAAA,EACAntC,SAAA,kBACAstC,IAAA,uBACAe,WAAA,yBACA6G,WAAA,eACAzB,uBAAA,uBACA,EA2PA,OAAA/G,gBAEA,GAEAjwC,MCzYA,2SAAAC,CAAA,CAAAgC,EAAA,CAAAyf,KAAA,CAAAtR,QAAA,CAAAI,eAAA,CAAAtQ,aAAA,CAAAiO,SAAA,CAAAuqC,uBAAA,CAAAC,qBAAA,eAyFA,SAAAC,cAAAr2B,OAAA,CAAAna,QAAA,EACA,MAAAtF,IAAA,CAAAqL,SAAA,CAAAtF,SAAA,CAAA0Z,OAAA,CAAAna,QAAA,EACA,QAAAtF,IAAA,CAAAC,OACA,CAOA,SAAA81C,aAAAC,MAAA,CAAAn1C,IAAA,EACA,IAAA+hB,OAAA,CAAAozB,MAAA,CAAAj0C,UAAA,GACAi0C,MAAA,CAAA11C,EAAA,cACAsiB,OAAA,CAAA/hB,IAAA,cAAAA,IAAA,CAAAohB,OAAA,GACAW,OAAA,CAAA/hB,IAAA,WAAAA,IAAA,CAAAohB,OAAA,EAAAljB,IAAA,SAAA8B,IAAA,CAAAqhB,KAAA,EACAU,OAAA,CAAArkB,IAAA,UAAAQ,IAAA,sBAAA8B,IAAA,CAAAihB,IAAA,IACAc,OAAA,CAAArkB,IAAA,UAAAmR,IAAA,CAAA7O,IAAA,CAAA6O,IAAA,GACA7O,IAAA,CAAAohB,OAAA,CAAA5f,QAAA,UAAAxB,IAAA,CAAAohB,OAAA,CAAA5f,QAAA,gBACA2zC,MAAA,CAAA11C,EAAA,WACA01C,MAAA,CAAAC,OAAA,GAEAD,MAAA,CAAAE,MAAA,IAKA,CAOA,SAAArG,QAAAxvC,UAAA,OACA,CAAAmf,WAAA,CAAAnf,UAAA,CAAAoL,cAAA,GACAgU,OAAA,CAAApf,UAAA,CAAAmL,UAAA,GACAxL,IAAA,CAAAK,UAAA,CAAAwN,cAAA,GACAkS,QAAA,CAAA1f,UAAA,CAAAu6B,cAAA,GACAub,kBAAA,CAAA9qC,SAAA,CAAAjF,eAAA,CAAAqZ,OAAA,CAAAD,WAAA,CAAA5Z,cAAA,kBACA,QAAAma,QAAA,CAAAvY,QAAA,GAAA2uC,kBAAA,EAAAn2C,IAAA,EAAAA,IAAA,CAAA8J,aAAA,CACA,CA/HA3M,CAAA,CAAAA,CAAA,EAAAO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAV,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACAgC,EAAA,CAAAA,EAAA,EAAAzB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAsB,EAAA,YAAAA,EAAA,YAAAA,EAAA,CACAmO,QAAA,CAAAA,QAAA,EAAA5P,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAyP,QAAA,YAAAA,QAAA,YAAAA,QAAA,CACAI,eAAA,CAAAA,eAAA,EAAAhQ,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6P,eAAA,YAAAA,eAAA,YAAAA,eAAA,CACAtQ,aAAA,CAAAA,aAAA,EAAAM,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAT,aAAA,YAAAA,aAAA,YAAAA,aAAA,CACAiO,SAAA,CAAAA,SAAA,EAAA3N,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAwN,SAAA,YAAAA,SAAA,YAAAA,SAAA,CACAuqC,uBAAA,CAAAA,uBAAA,EAAAl4C,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA+3C,uBAAA,YAAAA,uBAAA,YAAAA,uBAAA,CACAC,qBAAA,CAAAA,qBAAA,EAAAn4C,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAg4C,qBAAA,YAAAA,qBAAA,YAAAA,qBAAA,IAuBA,CAAAzzB,UAAA,EACAg0B,OAAA,EACAn0B,OAAA,iBACAC,KAAA,CAAA/iB,EAAA,2CACA2iB,IAAA,UACApS,IAAA,CAAAvQ,EAAA,mBACA,EACAk3C,SAAA,EACAp0B,OAAA,mBACAC,KAAA,CAAA/iB,EAAA,kDACA2iB,IAAA,UACApS,IAAA,CAAAvQ,EAAA,qBACA,EACAm3C,iBAAA,EACAr0B,OAAA,iBACAC,KAAA,CAAA/iB,EAAA,mDACA2iB,IAAA,YACApS,IAAA,CAAAvQ,EAAA,qBACA,EACAo3C,mBAAA,EACAt0B,OAAA,mBACAC,KAAA,CAAA/iB,EAAA,0DACA2iB,IAAA,oBACApS,IAAA,CAAAvQ,EAAA,qBACA,EACAq3C,UAAA,EACAv0B,OAAA,eACAC,KAAA,CAAA/iB,EAAA,2BACA2iB,IAAA,SACApS,IAAA,CAAAvQ,EAAA,eACA,EACAs3C,UAAA,EACAx0B,OAAA,eACAC,KAAA,CAAA/iB,EAAA,2BACA2iB,IAAA,QACApS,IAAA,CAAAvQ,EAAA,eACA,EACAu3C,gBAAA,EACAz0B,OAAA,sBACAC,KAAA,CAAA/iB,EAAA,6BACA2iB,IAAA,mBACApS,IAAA,CAAAvQ,EAAA,iBACA,EACAw3C,gBAAA,EACA10B,OAAA,sBACAC,KAAA,CAAA/iB,EAAA,6BACA2iB,IAAA,mBACApS,IAAA,CAAAvQ,EAAA,iBACA,CACA,EAqDAyM,MAAA,CAAAxO,aAAA,EACAW,IAAA,UAIAC,IAAA,UAAAA,KAAA,EAoBA,SAAA44C,sBAAAjF,IAAA,EACA,IAAAlvB,QAAA,CAAAkvB,IAAA,uBAIA,MAHA,CAAA1zC,IAAA,CAAAkV,aAAA,GACAsP,QAAA,CAAAkvB,IAAA,4CAEAvvB,UAAA,CAAAK,QAAA,CACA,CAOA,SAAAo0B,oBAAAr5C,SAAA,EACA,IAAAilB,QAAA,CAAAjlB,SAAA,CAAA8C,EAAA,qCAIA,MAHA,CAAArC,IAAA,CAAAkV,aAAA,GACAsP,QAAA,CAAAjlB,SAAA,CAAA8C,EAAA,kDAEA8hB,UAAA,CAAAK,QAAA,CACA,CAMA,SAAAq0B,oBAAA,OACA,CAAAC,cAAA,CAAA12C,UAAA,CAAAoL,cAAA,GACAxB,UAAA,CAAA5J,UAAA,CAAAmL,UAAA,GACA,OACAwrC,YAAA,CAAA3rC,SAAA,CAAAjF,eAAA,CAAA6D,UAAA,CAAA8sC,cAAA,CAAAnxC,cAAA,oBACAqxC,UAAA,CAAA5rC,SAAA,CAAAjF,eAAA,CAAA6D,UAAA,CAAA8sC,cAAA,CAAAnxC,cAAA,iBACA,CACA,CAMA,SAAAsxC,gBAAA,EACA,MAAA/wC,UAAA,CAAA2wC,mBAAA,GACA,OAAAK,eAAA,CAAAtrC,OAAA,EAAA1F,UAAA,CAAA6wC,YACA,CAQA,SAAA5J,SAAA9nC,QAAA,CAAAqsC,IAAA,EAEA,MADA,CAAA1zC,IAAA,CAAAmf,OAAA,GACA/c,UAAA,CAAA6rB,QAAA,GAAAkrB,cAAA,aACA9xC,QAAA,CACAqsC,IACA,GAAAnmB,IAAA,YACA,MAAAxrB,IAAA,CAAAqL,SAAA,CAAAtF,SAAA,CAAA1F,UAAA,CAAAmL,UAAA,GAAAlG,QAAA,EAGAtF,IAAA,CAAAC,OAAA,CAAA0xC,IAAA,CAGAoE,YAAA,CAAA93C,IAAA,CAAAo5C,cAAA,CAAAT,qBAAA,CAAAjF,IAAA,GAGA1zC,IAAA,CAAAT,SAAA,CAAA8vC,WAAA,CAAAhoC,QAAA,CAAAqsC,IAAA,EACA1zC,IAAA,CAAAqf,MAAA,EACA,GAAAuP,KAAA,YAEA5uB,IAAA,CAAAT,SAAA,CAAA8vC,WAAA,CAAAhoC,QAAA,EAAAqsC,IAAA,EACA1zC,IAAA,CAAAqf,MAAA,EACA,EACA,CAKA,SAAAg6B,gBAAA,EACA,QAAAr5C,IAAA,CAAAgd,QAAA,kBACA,CAAAsF,YAAA,CAAAlgB,UAAA,CAAAoL,cAAA,GAAA8U,YAAA,CACAg3B,UAAA,CAAAzB,aAAA,CAAAz1C,UAAA,CAAAmL,UAAA,GAAA+U,YAAA,EACA6sB,QAAA,CAAA7sB,YAAA,EAAAg3B,UAAA,CACA,CACA,CAOA,SAAAlI,YAAAmI,WAAA,EACA,IAAAC,QAAA,CAAAt6C,CAAA,CAAA8gC,WAAA,CAAAuZ,WAAA,EAAAv5C,IAAA,CAAAT,SAAA,CAAA8C,EAAA,WAAAk3C,WAAA,CACAC,QAAA,EACAx5C,IAAA,CAAAy5C,gBAAA,IACAz5C,IAAA,CAAAT,SAAA,CAAA8d,IAAA,KAEArd,IAAA,CAAAy5C,gBAAA,IACAz5C,IAAA,CAAAT,SAAA,CAAA8e,IAAA,IAEAy5B,YAAA,CAAA93C,IAAA,CAAA05C,YAAA,CAAAd,mBAAA,CAAA54C,IAAA,CAAAT,SAAA,EACA,MAtHA,CAAAS,IAAA,MACAoC,UAAA,MAAAnC,aAAA,GACAshB,WAAA,CAAAnf,UAAA,CAAAoL,cAAA,GACAgU,OAAA,CAAApf,UAAA,CAAAmL,UAAA,GACAsC,iBAAA,CAAAzN,UAAA,CAAAsL,UAAA,GACAoC,eAAA,EAAAD,iBAAA,CAAAV,SAAA,WAAAY,OAAA,QACA8M,YAAA,MAAAzK,SAAA,GACA,IAAA8mC,eAAA,CAAArpC,iBAAA,CAAAlC,MAAA,GACAgsC,WAAA,GACA,EACAT,eAAA,CAAAz5C,MAAA,CAAAkL,MAAA,IAAAuuC,eAAA,CAAAr8B,YAAA,EACA,KAAA3H,aAAA,CAAAgkC,eAAA,YAAAA,eAAA,CAAAU,YAAA,CACA,IAAAC,oBAAA,CA2GA,MAAA3K,gBAAA,MAAAh6B,aAAA,CAAA0iC,qBAAA,CAAAD,uBAAA,CACA,KAAAp4C,SAAA,CAAA2vC,gBAAA,CAAAgK,eAAA,EAAA51C,EAAA,qBAAA+D,QAAA,CAAA8tC,gBAAA,EACA0E,oBAAA,CAAA1E,gBACA,GAAA7xC,EAAA,iBAAA+D,QAAA,EACA,KAAArH,IAAA,CAAAgd,QAAA,cACAhd,IAAA,CAAAmf,OAAA,GACA/c,UAAA,CAAAwF,IAAA,CAAAP,QAAA,SAEA,GAAA/D,EAAA,iBAAA+D,QAAA,CAAAqsC,IAAA,EACA,KAAA1zC,IAAA,CAAAgd,QAAA,aACAmyB,QAAA,CAAA9nC,QAAA,CAAAqsC,IAAA,CAEA,GAAApwC,EAAA,oBACAlB,UAAA,CAAA4B,OAAA,oBACA,GAAA8M,MAAA,GAGA1O,UAAA,CAAAkB,EAAA,+BACAtD,IAAA,CAAAT,SAAA,CAAAwyC,MAAA,CAAA8H,oBAAA,CACA,GACA,KAAAJ,gBAAA,IAGA,KAAAC,YAAA,MAAAt5C,aAAA,GAAA05C,UAAA,GAAAC,WAAA,CAAAnB,mBAAA,MAAAr5C,SAAA,GACA,KAAAm6C,YAAA,CAAAp2C,EAAA,kBAAAgL,CAAA,EACAA,CAAA,CAAAoW,cAAA,GACAtiB,UAAA,CAAA4B,OAAA,oBACA,GACA,KAAAo1C,cAAA,MAAAh5C,aAAA,GAAA05C,UAAA,GAAAC,WAAA,CAAApB,qBAAA,CAAAd,aAAA,CAAAr2B,OAAA,CAAAD,WAAA,CAAAe,YAAA,IACA,KAAA82B,cAAA,CAAA91C,EAAA,kBAAAgL,CAAA,EACAA,CAAA,CAAAoW,cAAA,GACAtiB,UAAA,CAAA4B,OAAA,iBACA,GACA6L,iBAAA,CAAAQ,cAAA,GACAP,eAAA,CAAA4jC,IAAA,EACArkC,QAAA,CAAAkB,GAAA,CAAAd,eAAA,CAAAe,YAAA,CAAAV,eAAA,CAAA4jC,IAAA,MAAA3jC,OAAA,kBACA3N,UAAA,CAAA4B,OAAA,iBACA,GACAyM,UAAA,GACA,GAEAX,eAAA,CAAAs+B,MAAA,EACA/+B,QAAA,CAAAkB,GAAA,CAAAd,eAAA,CAAAe,YAAA,CAAAV,eAAA,CAAAs+B,MAAA,MAAAr+B,OAAA,kBACA3N,UAAA,CAAA4B,OAAA,oBACA,GACAyM,UAAA,GACA,IAGAwoC,eAAA,IACA,KAAA56B,IAAA,GAIA,KAAAc,OAAA,GACAiyB,WAAA,CAAA8H,eAAA,CAAAS,WAAA,EAGAv3C,UAAA,CAAAkB,EAAA,qBACA21C,eAAA,IACAj5C,IAAA,CAAAqd,IAAA,GACAy6B,YAAA,CAAA93C,IAAA,CAAA05C,YAAA,CAAAd,mBAAA,CAAA54C,IAAA,CAAAT,SAAA,IAEAS,IAAA,CAAAqe,IAAA,EAEA,GAAA/a,EAAA,4BACA,CAAA4H,OAAA,CAAA9I,UAAA,CAAAoL,cAAA,GACAtH,GAAA,CAAA9D,UAAA,CAAAmL,UAAA,GACAuU,QAAA,CAAA1f,UAAA,CAAAu6B,cAAA,GACAz0B,UAAA,CAAA2wC,mBAAA,GACAI,eAAA,IACAnB,YAAA,CAAA93C,IAAA,CAAAo5C,cAAA,CAAAT,qBAAA,CAAAd,aAAA,CAAA3xC,GAAA,CAAAgF,OAAA,CAAAoX,YAAA,IACAtiB,IAAA,CAAAT,SAAA,CAAAyR,MAAA,CAAA9K,GAAA,CAAAgF,OAAA,EAAA4lC,YAAA,EACAc,OAAA,EAAA9vB,QAAA,CAAAvY,QAAA,EAAArB,UAAA,CAAA8wC,UACA,GACAh5C,IAAA,CAAAqd,IAAA,GACAy6B,YAAA,CAAA93C,IAAA,CAAA05C,YAAA,CAAAd,mBAAA,CAAA54C,IAAA,CAAAT,SAAA,IAEAS,IAAA,CAAAqe,IAAA,EAEA,GAAA/a,EAAA,oCACA21C,eAAA,IACAj5C,IAAA,CAAAqf,MAAA,EAEA,GAAA/b,EAAA,sCACA21C,eAAA,IACAj5C,IAAA,CAAAmf,OAAA,EAEA,GAAA7b,EAAA,sBACAtD,IAAA,CAAAqe,IAAA,EACA,GAAA/a,EAAA,sBACA21C,eAAA,IACAj5C,IAAA,CAAAqd,IAAA,EAEA,GAAA/Z,EAAA,4BACA21C,eAAA,IAAArH,OAAA,CAAAxvC,UAAA,GACAi3C,eAAA,EAEA,GAAA/1C,EAAA,+BACA21C,eAAA,IAAAj5C,IAAA,CAAAgd,QAAA,aACAo0B,WAAA,EAEA,EACA,EAIAtgC,MAAA,UAAAA,OAAA,KACA,CAAAd,UAAA,MAAA5P,aAAA,GACA45C,eAAA,CAAAhqC,UAAA,CAAAnO,YAAA,GACAm4C,eAAA,CAAAloC,MAAA,MAAAvS,SAAA,CAAAuE,UAAA,GACA,EAIAkL,OAAA,UAAAA,QAAA,EACAK,QAAA,CAAAJ,MAAA,UAAAc,OAAA,MACA,KAAAxQ,SAAA,CAAAyP,OAAA,EACA,EAIAqQ,MAAA,UAAAA,OAAA,OACA,CAAAjd,UAAA,MAAAnC,aAAA,GACAshB,WAAA,CAAAnf,UAAA,CAAAoL,cAAA,GACAgU,OAAA,CAAApf,UAAA,CAAAmL,UAAA,GACA,KAAA6rC,cAAA,CAAA/5B,MAAA,GACA,KAAAq6B,YAAA,CAAAr6B,MAAA,GACA,KAAA9f,SAAA,CAAA8f,MAAA,GACAw4B,aAAA,CAAAr2B,OAAA,CAAAD,WAAA,CAAAe,YAAA,EACA,KAAA82B,cAAA,CAAAnB,MAAA,GAEA,KAAAmB,cAAA,CAAApB,OAAA,GAEA,KAAA9iC,aAAA,GACA,KAAAukC,gBAAA,CAGA,KAAAC,YAAA,CAAA1B,OAAA,GAFA,KAAA0B,YAAA,CAAAzB,MAAA,GAKA,EAIA94B,OAAA,UAAAA,QAAA,EACA,KAAAi6B,cAAA,CAAAj6B,OAAA,GACA,KAAAi6B,cAAA,CAAApB,OAAA,GACA,KAAA0B,YAAA,CAAAv6B,OAAA,GACA,KAAAjK,aAAA,EACA,KAAAwkC,YAAA,CAAA1B,OAAA,GAEA,KAAAz4C,SAAA,CAAA4f,OAAA,EACA,EAIA9B,IAAA,UAAAA,KAAA,EACA,IAAAjb,UAAA,MAAAnC,aAAA,GACA2xC,OAAA,CAAAxvC,UAAA,EACA,KAAAg3C,cAAA,CAAA/7B,IAAA,GAEA,KAAA+7B,cAAA,CAAA/6B,IAAA,GAEA,KAAAq7B,YAAA,CAAAr8B,IAAA,GACA,KAAAo8B,gBAAA,CAGA,KAAAl6C,SAAA,CAAA8e,IAAA,GAFA,KAAA9e,SAAA,CAAA8d,IAAA,EAIA,EAIAgB,IAAA,UAAAA,KAAA,EACA,KAAA+6B,cAAA,CAAA/6B,IAAA,GACA,KAAAq7B,YAAA,CAAAr7B,IAAA,GACA,KAAA9e,SAAA,CAAA8e,IAAA,EACA,CACA,GAEA,OAAA1Q,MAEA,GAEA1O,MC5bA,8PAAAsQ,GAAA,CAAArO,EAAA,CAAAyf,KAAA,CAAAxhB,aAAA,CAAAu4B,QAAA,CAAAj1B,UAAA,CAAAC,QAAA,CAAA2e,gBAAA,CAAAjU,SAAA,eA8FA,SAAAoW,UAAA5gB,IAAA,CAAAC,OAAA,CAAAC,QAAA,EACA,IAAAC,IAAA,CAAAC,QAAA,CAAAJ,IAAA,CAAAC,OAAA,EACA,OAAAC,QAAA,KAAAC,IAAA,CAAAE,CAAA,CAAAF,IAAA,CACA,CA/FAwM,GAAA,CAAAA,GAAA,EAAA9P,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA2P,GAAA,YAAAA,GAAA,YAAAA,GAAA,CACArO,EAAA,CAAAA,EAAA,EAAAzB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAsB,EAAA,YAAAA,EAAA,YAAAA,EAAA,CACAyf,KAAA,CAAAA,KAAA,EAAAlhB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA+gB,KAAA,YAAAA,KAAA,YAAAA,KAAA,CACAxhB,aAAA,CAAAA,aAAA,EAAAM,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAT,aAAA,YAAAA,aAAA,YAAAA,aAAA,CACAu4B,QAAA,CAAAA,QAAA,EAAAj4B,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA83B,QAAA,YAAAA,QAAA,YAAAA,QAAA,CACAj1B,UAAA,CAAAA,UAAA,EAAAhD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6C,UAAA,YAAAA,UAAA,YAAAA,UAAA,CACAC,QAAA,CAAAA,QAAA,EAAAjD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA8C,QAAA,YAAAA,QAAA,YAAAA,QAAA,CACA2e,gBAAA,CAAAA,gBAAA,EAAA5hB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAyhB,gBAAA,YAAAA,gBAAA,YAAAA,gBAAA,CACAjU,SAAA,CAAAA,SAAA,EAAA3N,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAwN,SAAA,YAAAA,SAAA,YAAAA,SAAA,CAEA1K,QAAA,CAAA8B,aAAA,GACA9B,QAAA,CAAAD,UAAA,EACAC,QAAA,CAAA8B,aAAA,QAEA,CAAAxB,QAAA,CAAAP,UAAA,CAAAgC,QAAA,UAAAhC,UAAA,CAAAiC,MAAA,CAAAC,OAAA,CAAAC,QAAA,CAAAhC,IAAA,EAKA,SAAAiC,SAAAH,MAAA,CAAA9B,IAAA,EAEA,IAAAoC,MAAA,IAAAI,MAAA,CAAAC,MAAA,CAKA,MAJA,CAAAL,MAAA,OACAK,MAAA,CAAAV,OAAA,CAAA8e,SAAA,EAAAre,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAA+e,SAAA,CAAAre,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACAJ,MACA,CAEA,SAAA0e,SAAAhf,MAAA,CAAA9B,IAAA,EAEA,IAAAoC,MAAA,IAAAI,MAAA,CAMA,MALA,CAAAJ,MAAA,oBACAE,gBAAA,EAAAE,MAAA,OAAAxC,IAAA,OAAAA,IAAA,CAAAA,IAAA,CAAAA,IAAA,CAAAkd,GAAA,qBAAA1a,MAAA,CAAAA,MAAA,CAAAue,KAAA,CAAAjf,MAAA,EAAAU,MAAA,GACA,MACAF,gBAAA,qBAAAR,MAAA,CAAAA,MAAA,CAAAif,KAAA,CAAAjf,MAAA,EAAAA,MAAA,EACA,WACAM,MACA,CAEA,SAAA4e,SAAAlf,MAAA,CAAA9B,IAAA,EAEA,IAAAoC,MAAA,IAAAI,MAAA,CAAAC,MAAA,CAQA,MAPA,CAAAL,MAAA,8BACAK,MAAA,CAAAV,OAAA,CAAAkf,IAAA,EAAAze,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAmf,IAAA,CAAAze,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACAA,MAAA,CAAAT,OAAA,CAAAa,MAAA,CAAA5F,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAA+M,IAAA,EAAAnM,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA2F,IAAA,CAAAC,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,GAAAie,QAAA,CAAAlhB,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,eACAA,MACA,CACA,SAAA8e,SAAApf,MAAA,CAAA9B,IAAA,EAGA,iBACA,CAEA,SAAAmhB,SAAArf,MAAA,CAAA9B,IAAA,EAEA,IAAAoC,MAAA,IAAAI,MAAA,CAAAC,MAAA,CAMA,MALA,CAAAL,MAAA,2BACAK,MAAA,CAAAV,OAAA,CAAA8M,IAAA,EAAArM,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAA+M,IAAA,CAAArM,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,UACAJ,MACA,CApDA,KAAAF,YAAA,gBACAH,OAAA,MAAAI,KAAA,CAAAJ,OAAA,CAAAlC,UAAA,CAAAkC,OAAA,EAAA/B,IAAA,CAAAA,IAAA,KACA,IAAAoC,MAAA,IAAAG,YAAA,YAAAD,gBAAA,MAAAA,gBAAA,CAAAlF,IAAA,MAAAoF,MAAA,CAAAC,MAAA,CAyEA,MArBA,CAAAL,MAAA,8BACAK,MAAA,CAAAV,OAAA,CAAAqf,OAAA,EAAA5e,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAsf,OAAA,CAAA5e,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,wCACAA,MAAA,CAAAT,OAAA,OAAA/E,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAA+e,SAAA,EAAAne,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA2F,IAAA,CAAAC,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,GAAAhB,QAAA,CAAAjC,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,sBACAK,MAAA,CAAAV,OAAA,CAAAsf,KAAA,EAAA7e,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAuf,KAAA,CAAA7e,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,gCACAA,MAAA,CAAAT,OAAA,CAAA6G,IAAA,CAAA5L,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAAwf,IAAA,EAAA5e,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA2F,IAAA,CAAAC,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,GAAA6d,QAAA,CAAA9gB,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,wGACAI,MAAA,CAAAT,OAAA,OAAA/E,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAAmf,IAAA,EAAAve,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA2F,IAAA,CAAAC,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,GAAA+d,QAAA,CAAAhhB,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,eACAI,MAAA,CAAAT,OAAA,OAAA/E,IAAA,CAAA8E,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAA+M,IAAA,EAAAnM,IAAA,IAAAI,OAAA,CAAA1F,IAAA,CAAA2F,IAAA,CAAAC,EAAA,CAAA5F,IAAA,CAAA6F,OAAA,GAAAke,QAAA,CAAAnhB,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAwC,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,wBACAA,MACA,GA2BAmf,UAAA,EACA81B,IAAA,EACAj2B,OAAA,QACAC,KAAA,CAAA/iB,EAAA,iCACA2iB,IAAA,YACApS,IAAA,CAAAvQ,EAAA,QACA,EACAkjB,GAAA,EACAJ,OAAA,YACAC,KAAA,CAAA/iB,EAAA,uCACA2iB,IAAA,YACApS,IAAA,CAAAvQ,EAAA,qBACA,CACA,EAOAqjB,aAAA,UAAAA,cAAAniB,UAAA,OACA,CAAAmf,WAAA,CAAAnf,UAAA,CAAAoL,cAAA,GACAgU,OAAA,CAAApf,UAAA,CAAAmL,UAAA,GACAyU,MAAA,CAAAX,gBAAA,CAAAW,MAAA,CAAAR,OAAA,CAAAD,WAAA,CAAA5Z,cAAA,EACA6c,QAAA,CAAAxC,MAAA,cACA,OAAAzS,GAAA,CAAAiU,SAAA,CAAAW,UAAA,CAAAK,QAAA,GACA,EAOA,MAAA+mB,aAAA,UAAAA,cAAAp9B,QAAA,EACA,IAAA6T,MAAA,MAAA1Z,SAAA,CAAA3H,MAAA,EAAA2H,SAAA,eAAAA,SAAA,SACA,CAAAkc,QAAA,CAAAxC,MAAA,cACA+1B,MAAA,CAAA5zB,UAAA,CAAAK,QAAA,EACAuzB,MAAA,EAAA5pC,QAAA,CAAArN,IAAA,mBAAAi3C,MAAA,CAAA/zB,OAAA,EACA7V,QAAA,CAAArN,IAAA,gBAAAi3C,MAAA,CAAA/zB,OAAA,EAAAljB,IAAA,SAAAi3C,MAAA,CAAA9zB,KAAA,EAAA3jB,IAAA,UAAAmR,IAAA,CAAAsmC,MAAA,CAAAtmC,IAAA,CAEA,EAKA,IAAAwoC,IAAA,CAAA96C,aAAA,EACAW,IAAA,QAIAC,KAAA,EAWA,SAAAm6C,OAAA,EACA93C,UAAA,CAAA63C,IAAA,EACA,MAZA,CAAA73C,UAAA,MAAAnC,aAAA,GACAmuC,MAAA,CAAAA,CAAA,IACA,MAAA7sB,WAAA,CAAAnf,UAAA,CAAAoL,cAAA,SACA,KAAA+T,WAAA,CAAAmoB,aAAA,EACA,KAAArsB,IAAA,QAGA,KAAAgB,IAAA,MAEA,EAIA,KAAAlQ,QAAA,CAAAoW,aAAA,CAAAniB,UAAA,EACA,KAAA+L,QAAA,CAAA7K,EAAA,SAAAgL,CAAA,QACA,CAAA+Q,MAAA,MAAAA,MAAA,CAAAivB,IAAA,OACA/sB,WAAA,CAAAnf,UAAA,CAAAoL,cAAA,GACAgU,OAAA,CAAApf,UAAA,CAAAmL,UAAA,GACAyU,MAAA,CAAAX,gBAAA,CAAAW,MAAA,CAAAR,OAAA,CAAAD,WAAA,CAAA5Z,cAAA,EACAm8B,cAAA,CAAA12B,SAAA,CAAAjF,eAAA,CAAAqZ,OAAA,CAAAD,WAAA,CAAA5Z,cAAA,sBACA2G,CAAA,CAAAoW,cAAA,GACA,UAAA1H,QAAA,cACA,KAAAmC,OAAA,GACA2kB,cAAA,EAAA9hB,MAAA,CACA5f,UAAA,CAAA4B,OAAA,mBAAA0zB,QAAA,CAAAwK,cAAA,QAAA9/B,UAAA,EAAA83C,MAAA,CAEA76B,MACA,EAEA66B,MAAA,GAGA,GACA9L,MAAA,GACA,KAAAjvB,OAAA,GACA/c,UAAA,CAAAkB,EAAA,iBACA,GAAA8qC,MAAA,SACA,CAAA7sB,WAAA,CAAAnf,UAAA,CAAAoL,cAAA,GACAgU,OAAA,CAAApf,UAAA,CAAAmL,UAAA,GACAyU,MAAA,CAAAX,gBAAA,CAAAW,MAAA,CAAAR,OAAA,CAAAD,WAAA,CAAA5Z,cAAA,EACA4jC,aAAA,MAAAp9B,QAAA,CAAA6T,MAAA,CACA,CACA,GAAA1e,EAAA,sBAAA+b,MAAA,IAAA/b,EAAA,uBAAA6b,OAAA,IAAA7b,EAAA,oBAAA+a,IAAA,IAAA/a,EAAA,oBAAA+Z,IAAA,GACA,EAIAvM,MAAA,UAAAA,OAAA,EACA,IAAA0M,UAAA,MAAApd,aAAA,GAAAqB,iBAAA,GACA+b,UAAA,CAAA1L,MAAA,MAAA3D,QAAA,CACA,EAIAa,OAAA,UAAAA,QAAA,EACA,KAAAb,QAAA,CAAAc,MAAA,EACA,EAIAoQ,MAAA,UAAAA,OAAA,EACA,KAAAlR,QAAA,CAAA2W,UAAA,aAAAxT,WAAA,YACA,EAIA6N,OAAA,UAAAA,QAAA,EACA,KAAAhR,QAAA,CAAA4W,IAAA,gBAAAxT,QAAA,YACA,EAIA8L,IAAA,UAAAA,KAAA,EACAsD,KAAA,CAAAtD,IAAA,MAAAlP,QAAA,CACA,EAIAkQ,IAAA,UAAAA,KAAA,EACAsC,KAAA,CAAAtC,IAAA,MAAAlQ,QAAA,CACA,CACA,GAEA,OAAA8rC,IAEA,GAEAh7C,MClQA,sJAAAC,CAAA,CAAAgC,EAAA,CAAA/B,aAAA,CAAAu/B,iBAAA,eAEAx/B,CAAA,CAAAA,CAAA,EAAAO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAV,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACAgC,EAAA,CAAAA,EAAA,EAAAzB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAsB,EAAA,YAAAA,EAAA,YAAAA,EAAA,CACA/B,aAAA,CAAAA,aAAA,EAAAM,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAT,aAAA,YAAAA,aAAA,YAAAA,aAAA,CACAu/B,iBAAA,CAAAA,iBAAA,EAAAj/B,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA8+B,iBAAA,YAAAA,iBAAA,YAAAA,iBAAA,IAmBA,CAAA5gB,UAAA,qBAMAq8B,iBAAA,CAAAh7C,aAAA,EAKAW,IAAA,qBAKAC,KAAA,OACA,CAAAqC,UAAA,MAAAnC,aAAA,GACA4P,iBAAA,CAAAzN,UAAA,CAAAsL,UAAA,GACAmP,YAAA,MAAAzK,SAAA,GAgCA,MA/BA,CAAAhQ,UAAA,CAAA2d,MAAA,SAAAzR,CAAA,CAAAmT,SAAA,SACA,CAAAF,WAAA,CAAAnf,UAAA,CAAAoL,cAAA,GACAm8B,aAAA,EAAAvnC,UAAA,CAAAwnC,YAAA,CAAAroB,WAAA,CAAA5Z,cAAA,aACA,IAAAkV,YAAA,CAAAu9B,sBAAA,eAAA34B,SAAA,CACA,OAAAjB,OAAA,CAAAC,OAAA,GAEA,GAAAkpB,aAAA,EAAA95B,iBAAA,CAAAwqC,uBAAA,OACA,CAAAvQ,UAAA,CAAA1nC,UAAA,CAAAwN,cAAA,GAEAuqC,iBAAA,mBAAArQ,UAAA,CAAAqQ,iBAAA,CAAArQ,UAAA,CAAAqQ,iBAAA,CAAA54B,WAAA,CAAA44B,iBAAA,CACA,GAAAA,iBAAA,CACA,WAAA35B,OAAA,EAAAC,OAAA,CAAA1B,MAAA,GACA,IAAA7f,CAAA,CAAAqjB,IAAA,CAAAmc,iBAAA,CAAAC,eAAA,CAAAv8B,UAAA,GACAqe,OAAA,GAEAie,iBAAA,CAAAkC,UAAA,CAAAx+B,UAAA,KACAqe,OAAA,QAEA,CAAAre,UAAA,CAAA4a,QAAA,yBAEA5a,UAAA,CAAAijB,QAAA,0BACAjjB,UAAA,CAAA4B,OAAA,oBAAA9C,EAAA,oDACAkB,UAAA,CAAA4B,OAAA,eACA+a,MAAA,GACA3c,UAAA,CAAAijB,QAAA,yBACA,IAEA,CAEA,CACA,GACA,IACA,CACA,GAEA,OAAA80B,iBAEA,GAEAl7C,MCnFA,qGAAAiC,EAAA,CAAA/B,aAAA,eAEA+B,EAAA,CAAAA,EAAA,EAAAzB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAsB,EAAA,YAAAA,EAAA,YAAAA,EAAA,CACA/B,aAAA,CAAAA,aAAA,EAAAM,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAT,aAAA,YAAAA,aAAA,YAAAA,aAAA,IAyBA,CAAAm7C,WAAA,CAAAp5C,EAAA,+CAOAq5C,YAAA,UAAAA,aAAAjsC,CAAA,EAEA,MADA,CAAAA,CAAA,CAAAksC,WAAA,CAAAF,WAAA,CACAA,WACA,EAMAG,iBAAA,CAAAt7C,aAAA,EAKAW,IAAA,qBAIAC,IAAA,UAAAA,KAAA,EACA,KAAAsf,MAAA,EACA,EAIArQ,OAAA,UAAAA,QAAA,EACA,KAAAmQ,OAAA,EACA,EAIAE,MAAA,UAAAA,OAAA,EACA4H,MAAA,CAAAyzB,gBAAA,gBAAAH,YAAA,CACA,EAIAp7B,OAAA,UAAAA,QAAA,EACA8H,MAAA,CAAA0zB,mBAAA,gBAAAJ,YAAA,CACA,CACA,GAEA,OAAAE,iBAEA,GAEAx7C,MChFA,4FAAAE,aAAA,eAEAA,aAAA,CAAAA,aAAA,EAAAM,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAT,aAAA,YAAAA,aAAA,YAAAA,aAAA,CAmBA,IAAAy7C,iBAAA,CAAAz7C,aAAA,EACAW,IAAA,qBAIAC,IAAA,UAAAA,KAAA,EACA,IAAA86C,gBAAA,uCACAA,gBAAA,CAAAl3C,OAAA,UAAAF,SAAA,EACAwjB,MAAA,CAAA9K,QAAA,CAAAu+B,gBAAA,CAAAj3C,SAAA,UAAAm3C,kBAAA12C,KAAA,EACA,IAAAA,KAAA,CAAA6zC,MAAA,EACA7zC,KAAA,CAAAwgB,cAAA,EAEA,EACA,EACA,CACA,GAEA,OAAAk2B,iBAEA,GAEA37C,MC1CA,gMAAAC,CAAA,CAAAgC,EAAA,CAAAyf,KAAA,CAAAtR,QAAA,CAAAI,eAAA,CAAArC,SAAA,CAAAjO,aAAA,eAEAD,CAAA,CAAAA,CAAA,EAAAO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAV,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACAgC,EAAA,CAAAA,EAAA,EAAAzB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAsB,EAAA,YAAAA,EAAA,YAAAA,EAAA,CACAmO,QAAA,CAAAA,QAAA,EAAA5P,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAyP,QAAA,YAAAA,QAAA,YAAAA,QAAA,CACAI,eAAA,CAAAA,eAAA,EAAAhQ,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6P,eAAA,YAAAA,eAAA,YAAAA,eAAA,CACArC,SAAA,CAAAA,SAAA,EAAA3N,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAwN,SAAA,YAAAA,SAAA,YAAAA,SAAA,CACAjO,aAAA,CAAAA,aAAA,EAAAM,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAT,aAAA,YAAAA,aAAA,YAAAA,aAAA,IAwBA,CAAA2e,UAAA,cAMAC,YAAA,yBAMA6P,aAAA,EAEAktB,yBAAA,IAEAC,yBAAA,GACA,EAKAC,UAAA,CAAA77C,aAAA,EACAW,IAAA,cAIAC,KAAA,EAoBA,SAAAk7C,gBAAA,EAEA,OAAA7tC,SAAA,CAAAjF,eAAA,CAAA/F,UAAA,CAAAmL,UAAA,GAAAnL,UAAA,CAAAoL,cAAA,GAAA7F,cAAA,iBACA,CAKA,SAAAuzC,mBAAA,EACAD,eAAA,GACAj7C,IAAA,CAAAqd,IAAA,GAEArd,IAAA,CAAAqe,IAAA,EAEA,CACA,SAAA88B,aAAA,EACAn7C,IAAA,CAAAo7C,mBAAA,GAGAp7C,IAAA,CAAAo7C,mBAAA,CAAApK,WAAA,eACAqK,YAAA,GACAC,gBAAA,GAEAC,iBAAA,GAEA,CACA,SAAAF,aAAA,QACA,CAAAr7C,IAAA,CAAAo7C,mBAAA,CAGAp7C,IAAA,CAAAo7C,mBAAA,CAAAzmC,QAAA,qBACA,CACA,SAAA2mC,iBAAA,EACA,IAAAE,QAAA,CACAx7C,IAAA,CAAAo7C,mBAAA,GAGAI,QAAA,CAAAx7C,IAAA,CAAAo7C,mBAAA,CAAA96C,IAAA,gBACAN,IAAA,CAAA+3C,MAAA,CAAAE,MAAA,GACAj4C,IAAA,CAAAgE,OAAA,UACAb,MAAA,CAAA43C,yBAAA,EACAS,QAAA,CAAAhwC,IAAA,YACA,IAAA2M,KAAA,MAAAopB,aAAA,sBACA,KAAA7U,OAAA,CAAA+uB,aAAA,GACA,KAAA/uB,OAAA,CAAA+uB,aAAA,MACA,KAAAC,SAAA,CAAAnrC,GAAA,eACA4H,KAAA,CAAAwjC,YAAA,wBACAxjC,KAAA,CAAAC,OAAA,IAEA,GAEA,CACA,SAAAmjC,kBAAA,EACA,IAAAC,QAAA,CACAx7C,IAAA,CAAAo7C,mBAAA,GAGAI,QAAA,CAAAx7C,IAAA,CAAAo7C,mBAAA,CAAA96C,IAAA,gBACAN,IAAA,CAAAo7C,mBAAA,CAAA9pC,WAAA,eACAtR,IAAA,CAAA+3C,MAAA,CAAAC,OAAA,GACAh4C,IAAA,CAAAgE,OAAA,QACAw3C,QAAA,CAAAhwC,IAAA,YACA,KAAAkwC,SAAA,CAAAjX,QAAA,iBACA,KAAA/X,OAAA,CAAA+uB,aAAA,IACA,KAAAC,SAAA,CAAAzsC,MAAA,eACA,KAAAsyB,aAAA,sBAAAqa,eAAA,aAEA,GACA,MAvFA,CAAA57C,IAAA,MACAoC,UAAA,MAAAnC,aAAA,GACAud,UAAA,CAAApb,UAAA,CAAAhC,aAAA,GAAAC,cAAA,GAAAgR,MAAA,GACAxB,iBAAA,CAAAzN,UAAA,CAAAsL,UAAA,GACAoC,eAAA,EAAAD,iBAAA,CAAAV,SAAA,MAAA6rC,UAAA,KACA73C,MAAA,CAAA1D,MAAA,CAAAkL,MAAA,IAAAijB,aAAA,MAAAxb,SAAA,IAGA,KAAA2lC,MAAA,MAAA33C,aAAA,GAAA05C,UAAA,GAAAC,WAAA,EACA/1B,OAAA,cACAC,KAAA,CAAA/iB,EAAA,sBACA2iB,IAAA,aACApS,IAAA,CAAAvQ,EAAA,qBACA,GA6EA,KAAA62C,MAAA,CAAAz0C,EAAA,kBAAAgL,CAAA,EACAA,CAAA,CAAAoW,cAAA,GACAtiB,UAAA,CAAA4B,OAAA,IAAA+Z,YAAA,SACA,GAGAlO,iBAAA,CAAAQ,cAAA,EACAnR,CAAA,CAAAyE,OAAA,CAAAmM,eAAA,UAAA+P,OAAA,CAAAC,GAAA,EACAzQ,QAAA,CAAAkB,GAAA,CAAAd,eAAA,CAAAe,YAAA,CAAAqP,OAAA,6BAEAzd,UAAA,CAAA4B,OAAA,CAAA+Z,YAAA,CAAA+B,GAAA,CACA,GACArP,UAAA,GACA,EACA,GAIA,KAAA0O,OAAA,GAGA/c,UAAA,CAAAkB,EAAA,YAAA43C,kBAAA,EAAA53C,EAAA,uBAAAu4C,gBAAA,QAEA,CAAA77C,IAAA,CAAAo7C,mBAAA,CAAA59B,UAAA,CAAAld,IAAA,2BACAN,IAAA,CAAAo7C,mBAAA,CAAAz6C,MAAA,MAIAs6C,eAAA,IACAj7C,IAAA,CAAAqd,IAAA,QAJA,CAAArd,IAAA,CAAAqe,IAAA,EAMA,GAAA/a,EAAA,qCACAtD,IAAA,CAAAqf,MAAA,EACA,GAAA/b,EAAA,sCACAtD,IAAA,CAAAmf,OAAA,GACAo8B,iBAAA,EACA,GAGAj4C,EAAA,IAAAya,YAAA,oBACAk9B,eAAA,IACAE,YAAA,EAEA,GAEA73C,EAAA,yCACA+3C,YAAA,IACAE,iBAAA,EAEA,EACA,EAIAvsC,OAAA,UAAAA,QAAA,EACAK,QAAA,CAAAJ,MAAA,oBACA,EAIAoQ,MAAA,UAAAA,OAAA,EACA,KAAA04B,MAAA,CAAA14B,MAAA,EACA,EAIAF,OAAA,UAAAA,QAAA,EACA,KAAA44B,MAAA,CAAA54B,OAAA,EACA,EAIA9B,IAAA,UAAAA,KAAA,EACA,KAAA06B,MAAA,CAAA16B,IAAA,EACA,EAIAgB,IAAA,UAAAA,KAAA,EACA,KAAA05B,MAAA,CAAA15B,IAAA,EACA,CACA,GAEA,OAAA28B,UAEA,GAEA/7C,MC5OA,kKAAAC,CAAA,CAAAqQ,GAAA,CAAAusC,SAAA,CAAAtG,gBAAA,CAAA/yC,UAAA,CAAAC,QAAA,eAoBA,SAAAq5C,QAAAn5C,IAAA,CAAAC,OAAA,CAAAC,QAAA,EACA,IAAAC,IAAA,CAAAC,QAAA,CAAAJ,IAAA,CAAAC,OAAA,EACA,OAAAC,QAAA,KAAAC,IAAA,CAAAE,CAAA,CAAAF,IAAA,CACA,CAwBA,SAAAi5C,qBAAAj2B,YAAA,EA4CA,SAAAk2B,WAAAz+B,UAAA,EACA,OAAAg4B,gBAAA,CAAA0G,OAAA,EAAA53C,WAAA,CAAAy3C,OAAA,EAAAz4C,EAAA,qBACA,IAAAtD,IAAA,MACAyvC,UAAA,MAAA3rC,UAAA,GACA2rC,UAAA,CAAAnsC,EAAA,qCAAAgL,CAAA,EACAA,CAAA,CAAA+a,eAAA,GACA/a,CAAA,CAAAoW,cAAA,GACA1kB,IAAA,CAAAouC,MAAA,EACA,EACA,GAAA9qC,EAAA,sBACA,IAAAmsC,UAAA,MAAA3rC,UAAA,GACA2rC,UAAA,CAAAz3B,GAAA,kBACA,GAAAjY,IAAA,GAAA+Q,MAAA,CAAA0M,UAAA,EAAA2+B,IAAA,EACA,CAxDA,GACA,CAAAC,QAAA,IACAF,OAAA,EAKA9N,MAAA,UAAAA,OAAA,QACA,MAAA/rC,EAAA,WACA,KAAAg6C,MAAA,GAEA,KAAAF,IAAA,EAEA,EAKAE,MAAA,UAAAA,OAAA,EACA,IAAA7+B,UAAA,MAAAlc,YAAA,GAIA,MAHA,CAAAkc,UAAA,CAAAlM,WAAA,WACAkM,UAAA,CAAAld,IAAA,UAAAsW,UAAA,aACA,KAAAyO,QAAA,cACA,IACA,EAKA82B,IAAA,UAAAA,KAAA,EACA,IAAA3+B,UAAA,MAAAlc,YAAA,GAIA,MAHA,CAAAkc,UAAA,CAAAjM,QAAA,WACAiM,UAAA,CAAAld,IAAA,UAAAQ,IAAA,wBACA,KAAAukB,QAAA,cACA,IACA,CACA,EApCAi3B,aAAA,CAkHA,MArDA,CAAAA,aAAA,EAIAj9B,MAAA,UAAAA,OAAA,EACA,IAAA+7B,mBAAA,CAAAr1B,YAAA,CAAAzlB,IAAA,2BACAiY,WAAA,CAAAwN,YAAA,CAAAzlB,IAAA,gBACA87C,QAAA,IACAhB,mBAAA,CAAA7pC,QAAA,aACAgH,WAAA,CAAA/M,IAAA,YACA,IAAA+wC,OAAA,CAAAhtC,GAAA,OACA6sC,QAAA,CAAAtpC,IAAA,CAAAmpC,UAAA,CAAAM,OAAA,EACA,GACA,KAAAl3B,QAAA,cACA,EAIAlG,OAAA,UAAAA,QAAA,EACA,IAAAi8B,mBAAA,CAAAr1B,YAAA,CAAAzlB,IAAA,2BACA86C,mBAAA,CAAA9pC,WAAA,aACA8qC,QAAA,CAAAz4C,OAAA,UAAAw4C,IAAA,EACAA,IAAA,CAAAE,MAAA,GACAF,IAAA,CAAAntC,OAAA,EACA,GACAotC,QAAA,IACA,KAAA/2B,QAAA,cACA,EAKAm3B,aAAA,UAAAA,cAAA,EACA,IAAAv/B,KAAA,CAAAm/B,QAAA,CAAAl2C,GAAA,UAAAi2C,IAAA,EACA,OAAAA,IAAA,CAAA95C,EAAA,UACA,GACA,OAAA4a,KACA,EAKAw/B,aAAA,UAAAA,cAAAx/B,KAAA,EACAA,KAAA,CAAAA,KAAA,KACAA,KAAA,CAAAtZ,OAAA,UAAA+4C,MAAA,CAAA1vC,KAAA,EACA,IAAAmvC,IAAA,CAAAC,QAAA,CAAApvC,KAAA,EACA9N,CAAA,CAAAohB,QAAA,CAAA67B,IAAA,GAAAj9C,CAAA,CAAAwM,UAAA,CAAAywC,IAAA,CAAAE,MAAA,IAAAK,MAAA,EACAP,IAAA,CAAAE,MAAA,EAEA,EACA,CACA,EACAP,SAAA,CAAAQ,aAAA,EACAA,aACA,CAjKAp9C,CAAA,CAAAA,CAAA,EAAAO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAV,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACAqQ,GAAA,CAAAA,GAAA,EAAA9P,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA2P,GAAA,YAAAA,GAAA,YAAAA,GAAA,CACAusC,SAAA,CAAAA,SAAA,EAAAr8C,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAk8C,SAAA,YAAAA,SAAA,YAAAA,SAAA,CACAtG,gBAAA,CAAAA,gBAAA,EAAA/1C,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA41C,gBAAA,YAAAA,gBAAA,YAAAA,gBAAA,CACA/yC,UAAA,CAAAA,UAAA,EAAAhD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6C,UAAA,YAAAA,UAAA,YAAAA,UAAA,CACAC,QAAA,CAAAA,QAAA,EAAAjD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA8C,QAAA,YAAAA,QAAA,YAAAA,QAAA,CAEAA,QAAA,CAAA8B,aAAA,GACA9B,QAAA,CAAAD,UAAA,EACAC,QAAA,CAAA8B,aAAA,QAEA,CAAAxB,QAAA,CAAAP,UAAA,CAAAgC,QAAA,UAAAhC,UAAA,CAAAiC,MAAA,CAAAC,OAAA,CAAAC,QAAA,CAAAhC,IAAA,EAKA,MAJA,MAAAkC,YAAA,gBACAH,OAAA,MAAAI,KAAA,CAAAJ,OAAA,CAAAlC,UAAA,CAAAkC,OAAA,EAGA,qFACA,GAuBA+kB,EAAA,kBA2HA,OAAAsyB,oBAEA,GAEA/8C,MCzKA,6OAAAiC,EAAA,CAAA/B,aAAA,CAAAwhB,KAAA,CAAAtR,QAAA,CAAAI,eAAA,CAAArC,SAAA,CAAA4uC,oBAAA,eAEA96C,EAAA,CAAAA,EAAA,EAAAzB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAsB,EAAA,YAAAA,EAAA,YAAAA,EAAA,CACA/B,aAAA,CAAAA,aAAA,EAAAM,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAT,aAAA,YAAAA,aAAA,YAAAA,aAAA,CACAkQ,QAAA,CAAAA,QAAA,EAAA5P,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAyP,QAAA,YAAAA,QAAA,YAAAA,QAAA,CACAI,eAAA,CAAAA,eAAA,EAAAhQ,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6P,eAAA,YAAAA,eAAA,YAAAA,eAAA,CACArC,SAAA,CAAAA,SAAA,EAAA3N,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAwN,SAAA,YAAAA,SAAA,YAAAA,SAAA,CACA4uC,oBAAA,CAAAA,oBAAA,EAAAv8C,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAo8C,oBAAA,YAAAA,oBAAA,YAAAA,oBAAA,IAyBA,CAAAl+B,UAAA,kBAMAC,YAAA,6BAMA4+B,UAAA,IAKA/uB,aAAA,EACAgvB,oBAAA,IACAC,kBAAA,GACA,EAKAltC,MAAA,CAAAxQ,aAAA,EACAW,IAAA,kBAIAC,IAAA,UAAAA,KAAA,EAQA,SAAAk7C,gBAAA,EAEA,MAAA6B,qBAAA,CAAA1vC,SAAA,CAAAjF,eAAA,CAAA/F,UAAA,CAAAmL,UAAA,GAAAnL,UAAA,CAAAoL,cAAA,GAAA7F,cAAA,qBACA,OAAAm1C,qBAAA,EAAAC,6BAAA,EACA,CACA,SAAAA,8BAAA,EACA,IAAAv/B,UAAA,CAAAxd,IAAA,CAAAI,aAAA,GAAAC,cAAA,GAAAgR,MAAA,GACA,OAAAmM,UAAA,CAAAld,IAAA,2BAAAK,MACA,CACA,SAAAu6C,mBAAA,EACAD,eAAA,GACAj7C,IAAA,CAAAqd,IAAA,GAEArd,IAAA,CAAAqe,IAAA,EAEA,CACA,SAAA88B,aAAA,EACAmB,aAAA,CAAAt/B,QAAA,YAGAggC,cAAA,GAFAC,aAAA,EAIA,CACA,SAAAA,cAAA,EACA,IAAA17B,WAAA,CAAAnf,UAAA,CAAAoL,cAAA,GACAgV,MAAA,CAAAjB,WAAA,CAAA5Z,cAAA,CACA20C,aAAA,CAAAj9B,MAAA,GACAxC,YAAA,CAAA+/B,oBAAA,EACAN,aAAA,CAAAG,aAAA,CAAAE,UAAA,CAAAn6B,MAAA,GAEAxiB,IAAA,CAAA+3C,MAAA,CAAAE,MAAA,GACAj4C,IAAA,CAAAgE,OAAA,SACA,CACA,SAAAg5C,eAAA,EACA,IAAAz7B,WAAA,CAAAnf,UAAA,CAAAoL,cAAA,GACAgV,MAAA,CAAAjB,WAAA,CAAA5Z,cAAA,CACA20C,aAAA,CAAAt/B,QAAA,cACA2/B,UAAA,CAAAn6B,MAAA,EAAA85B,aAAA,CAAAE,aAAA,IAEAF,aAAA,CAAAn9B,OAAA,GACAnf,IAAA,CAAA+3C,MAAA,CAAAC,OAAA,GACAh4C,IAAA,CAAAgE,OAAA,OACA,MAjDA,CAAAhE,IAAA,MACAoC,UAAA,MAAAnC,aAAA,GACA4P,iBAAA,CAAAzN,UAAA,CAAAsL,UAAA,GACAmP,YAAA,CAAApd,MAAA,CAAAkL,MAAA,IAAAijB,aAAA,MAAAxb,SAAA,IACAtC,eAAA,EAAAD,iBAAA,CAAAV,SAAA,4BACA4W,YAAA,MAAA3lB,aAAA,GAAAC,cAAA,GACA,IAAAi8C,aAAA,CAAAN,oBAAA,CAAAj2B,YAAA,EA8CA,KAAAgyB,MAAA,MAAA33C,aAAA,GAAA05C,UAAA,GAAAC,WAAA,EACA91B,KAAA,CAAA/iB,EAAA,mBACA2iB,IAAA,cACAG,OAAA,kBACAvS,IAAA,CAAAvQ,EAAA,kBACA,GAGA,KAAA62C,MAAA,CAAAz0C,EAAA,kBAAAgL,CAAA,EACAA,CAAA,CAAAoW,cAAA,GACAtiB,UAAA,CAAA4B,OAAA,IAAA+Z,YAAA,SACA,GACAlO,iBAAA,CAAAQ,cAAA,EACAP,eAAA,CAAAs+B,MAAA,EACA/+B,QAAA,CAAAkB,GAAA,CAAAd,eAAA,CAAAe,YAAA,CAAAV,eAAA,CAAAs+B,MAAA,MAAAr+B,OAAA,kBACA3N,UAAA,CAAA4B,OAAA,IAAA+Z,YAAA,SACA,GACAtN,UAAA,IACAC,OAAA,GACA,GAKA,KAAAyO,OAAA,GAGA/c,UAAA,CAAAkB,EAAA,uBACA,IAAAie,WAAA,CAAAnf,UAAA,CAAAoL,cAAA,GACAgV,MAAA,CAAAjB,WAAA,CAAA5Z,cAAA,CACAkV,YAAA,CAAAggC,kBAAA,GACAF,UAAA,CAAAn6B,MAAA,MAEA04B,kBAAA,EACA,GAAA53C,EAAA,qCACA43C,kBAAA,GACAl7C,IAAA,CAAAqf,MAAA,EACA,GAAA/b,EAAA,+BACA05C,cAAA,EACA,GAAA15C,EAAA,sCACAtD,IAAA,CAAAmf,OAAA,GACA69B,cAAA,EACA,GAAA15C,EAAA,IAAAya,YAAA,oBACAk9B,eAAA,IACAE,YAAA,EAEA,GAEA73C,EAAA,qCACA05C,cAAA,EACA,EACA,EAIAhuC,OAAA,UAAAA,QAAA,EACAK,QAAA,CAAAJ,MAAA,UAAAc,OAAA,KACA,EAIAsP,MAAA,UAAAA,OAAA,EACA,KAAA04B,MAAA,CAAA14B,MAAA,EACA,EAIAF,OAAA,UAAAA,QAAA,EACA,KAAA44B,MAAA,CAAA54B,OAAA,EACA,EAIA9B,IAAA,UAAAA,KAAA,EACA,KAAA06B,MAAA,CAAA16B,IAAA,EACA,EAIAgB,IAAA,UAAAA,KAAA,EACA,KAAA05B,MAAA,CAAA15B,IAAA,EACA,CACA,GAEA,OAAA1O,MAEA,GAEA1Q,MC3MA,yOAAAsQ,GAAA,CAAArO,EAAA,CAAAuB,UAAA,CAAAC,QAAA,CAAAF,SAAA,CAAA06C,QAAA,CAAAC,aAAA,CAAAC,aAAA,CAAAn4B,QAAA,CAAAo4B,UAAA,eAuCA,SAAAC,YAAA16C,IAAA,CAAAC,OAAA,CAAAC,QAAA,EACA,IAAAC,IAAA,CAAAC,QAAA,CAAAJ,IAAA,CAAAC,OAAA,EACA,OAAAC,QAAA,KAAAC,IAAA,CAAAE,CAAA,CAAAF,IAAA,CACA,CA8CA,SAAAw6C,wBAAAl8C,SAAA,CAAA8B,MAAA,EACA,MAAAq6C,KAAA,KAAAC,KAAA,IACA,CAAAC,eAAA,IAEAC,gBAAA,IADAjsC,WAAA,CAEAksC,YAAA,MAGA,CAAAC,SAAA,CAAA52B,MAAA,CAAA62B,YAAA,EAAA72B,MAAA,CAAA62B,YAAA,GAGAC,IAAA,EAIAC,kBAAA,OACA,CACAC,YACA,OAAA96C,MAAA,CACA+6C,aAAA,CAAA3uC,GAAA,CAAAouC,gBAAA,CAAAz3C,GAAA,CAAAyD,IAAA,GACA,IACAnG,QACA,EAAAmG,IAAA,CACA,OAAAnG,QACA,GAAAi1B,IAAA,OAAAp3B,SAAA,EACA68C,aAAA,CAAA5sC,WAAA,CAAA2sC,YAAA,EACAC,aAAA,CAAAlmC,GAAA,cAAAmmC,sBAAA,CACA,EAMA/4B,MAAA,EACA,KAAAg5B,sBAAA,eACA,KAAAA,sBAAA,eACA,KAAA/4B,QAAA,gBACA,KAAAqC,IAAA,GACA,KAAA1jB,OAAA,SACA,EAMA4L,eAAA,EACA,OAAA8B,WACA,EAMAysC,uBAAA7vC,CAAA,EACA,MAAAojC,OAAA,CAAAniC,GAAA,CAAAjB,CAAA,CAAAC,MAAA,EAGA,GAAAmjC,OAAA,CAAA/8B,QAAA,mBAAA+8B,OAAA,CAAA/8B,QAAA,gBAAA+8B,OAAA,CAAArvC,EAAA,UACA,OAMA,GAFAiM,CAAA,CAAA+a,eAAA,GACA/a,CAAA,CAAAoW,cAAA,GACA,MAAAriB,EAAA,YACA,OACA,KACA,CAAAg8C,cAAA,CAAA9uC,GAAA,CAAAjB,CAAA,CAAAgwC,aAAA,EAEAC,iBAAA,CAAAZ,gBAAA,CAAA1zC,SAAA,CAAAC,KAAA,GACA,IACA1G,QACA,EAAA0G,KAAA,CACA,OAAAm0C,cAAA,CAAAh8C,EAAA,CAAAmB,QAAA,CACA,GACAk6C,eAAA,CAAAC,gBAAA,CAAAvzC,KAAA,CAAAm0C,iBAAA,EACA,KAAA72B,IAAA,GACA,KAAA82B,YAAA,GACA,KAAAC,cAAA,EACA,EAIAC,oBAAA,EACA,KAAAC,yBAAA,GACAjtC,WAAA,EACA,KAAAktC,uBAAA,EAEA,EAIAD,0BAAA,EAEA,QAAAt8C,EAAA,cAAAw7C,SAAA,GAAAA,SAAA,CAAAhb,QAAA,GACA,OACA,KAGA,CAAAgc,gBAAA,CAAAhB,SAAA,CAAAiB,UAAA,IACA,CACAC,uBACA,EAAAF,gBAAA,CACAG,YAAA,CAAArB,gBAAA,CAAAr9C,IAAA,CAAAkK,KAAA,GACA,IACAhH,QACA,EAAAgH,KAAA,CACA,MAAA8b,KAAA,CAAA/W,GAAA,CAAA/L,QAAA,CAAAnC,SAAA,EACA,OAAAilB,KAAA,CAAAjkB,EAAA,CAAA08C,uBAAA,GAAAxvC,GAAA,CAAAk1B,QAAA,CAAAne,KAAA,IAAAy4B,uBAAA,CACA,GACAC,YAAA,EAAAA,YAAA,GAAAttC,WAAA,GACAgsC,eAAA,EAAAsB,YAAA,EACA,KAAAR,YAAA,GAEA,EAQAA,aAAA,EACA,MACAS,kBACA,OAAA97C,MAAA,CAGA,GAFAuO,WAAA,EAAAnC,GAAA,CAAAmC,WAAA,CAAAlO,QAAA,CAAAnC,SAAA,EAAAiQ,WAAA,CAAA2tC,kBAAA,EACAvtC,WAAA,CAAAgsC,eAAA,CAAAjyB,KAAA,GACA/Z,WAAA,EACA,MACAlO,QAAA,CACA07C,GACA,EAAAxtC,WAAA,CASA,MARA,CAAAnC,GAAA,CAAA/L,QAAA,CAAAnC,SAAA,EAAAkQ,QAAA,CAAA0tC,kBAAA,EACAzB,KAAA,CAAA7B,YAAA,OAAAuD,GAAA,EACA1B,KAAA,CAAA2B,IAAA,GACA3B,KAAA,CAAAI,YAAA,CAAAA,YAAA,CACA,KAAAv7C,EAAA,aACAm7C,KAAA,CAAA4B,IAAA,OAEA,MAAAp7C,OAAA,QAEA,CACA,KAAAA,OAAA,WACA,KAAA0jB,IAAA,EACA,EAIAk3B,wBAAA,EACAlB,eAAA,KAAAC,gBAAA,EACA,KAAAa,YAAA,EACA,EAMAa,oBAAAz8C,IAAA,EACA,KAAAo7C,iBAAA,GACA,MACAC,YACA,OAAA96C,MAAA,CACAw6C,gBAAA,CAAA/6C,IAAA,CACA,MAAAs7C,aAAA,CAAA3uC,GAAA,CAAAouC,gBAAA,CAAAz3C,GAAA,CAAAwE,KAAA,GACA,IACAlH,QACA,EAAAkH,KAAA,CACA,OAAAlH,QACA,GAAAi1B,IAAA,OAAAp3B,SAAA,EACA68C,aAAA,CAAA3sC,QAAA,CAAA0sC,YAAA,EACAC,aAAA,CAAA56C,EAAA,cAAA66C,sBAAA,EACA,KAAAz2B,IAAA,EACA,EAOA43B,gBAAAhxC,CAAA,CAAA/L,KAAA,EACAq7C,YAAA,CAAAr7C,KAAA,CACAi7C,KAAA,CAAAI,YAAA,CAAAr7C,KACA,EAOA67C,uBAAAt+C,IAAA,CAAAyC,KAAA,EACA,KAAA8iB,QAAA,CAAAvlB,IAAA,CAAAyC,KAAA,EACAgN,GAAA,CAAAlO,SAAA,EAAA2vC,WAAA,QAAAlxC,IAAA,GAAAyC,KAAA,CACA,EAIAmlB,KAAA,EACA,MACAu3B,kBACA,OAAA97C,MAAA,CACAq6C,KAAA,CAAA+B,KAAA,GACA/B,KAAA,CAAAgC,WAAA,GACA9tC,WAAA,EAAAnC,GAAA,CAAAmC,WAAA,CAAAlO,QAAA,CAAAnC,SAAA,EAAAiQ,WAAA,CAAA2tC,kBAAA,EACAvtC,WAAA,MACA,KAAA0sC,sBAAA,cACA,EAMAK,eAAAnwC,CAAA,EACAA,CAAA,EAAAA,CAAA,CAAAoW,cAAA,GACA,MAAA+6B,SAAA,MAAAp9C,EAAA,YACA,KAAAq8C,mBAAA,GACA,CAAAe,SAAA,EAAA/tC,WAAA,EACA8rC,KAAA,CAAA4B,IAAA,GACA,KAAAhB,sBAAA,iBAEAZ,KAAA,CAAA+B,KAAA,GACA,KAAAnB,sBAAA,eAEA,EAIAsB,cAAA,EACA,MAAAC,SAAA,MAAAt9C,EAAA,YACA,KAAA+7C,sBAAA,YAAAuB,SAAA,EACA,KAAAj4B,IAAA,EACA,EAIAk4B,eAAA,EACA,MAAAC,UAAA,MAAAx9C,EAAA,aACA,KAAAgjB,QAAA,aAAAw6B,UAAA,EAGAA,UAAA,EACA,KAAAC,YAAA,EAEA,EAIAA,aAAA,OAEA,CAAAC,eAAA,IACA,CACAC,CAAA,CACAC,CACA,OAAAC,WAAA,GACAC,YAAA,CAAAl5B,MAAA,CAAAm5B,UAAA,MAAAt8C,UAAA,GAAAkoB,KAAA,MACA,KAAAq0B,MAAA,CAAAL,CAAA,CAAAG,YAAA,CAAAA,YAAA,CAAAH,CAAA,CAAAC,CAAA,CACA,CACA,EACAK,YAAA,CAAA99C,SAAA,CAAAu7C,IAAA,CAAAnwB,aAAA,EA8FA,MA7FA,CAAAwvB,aAAA,CAAAkD,YAAA,EACAnD,aAAA,CAAAmD,YAAA,CAAAC,eAAA,EACAD,YAAA,CAAAh8C,WAAA,CAAAg5C,WAAA,EAAAh6C,EAAA,mBACA,GAAAjC,SAAA,CAAAsT,QAAA,4BACA,UAAAqd,KAAA,4DAEA3wB,SAAA,CAAAkQ,QAAA,4BACA,KAAAT,MAAA,CAAAzP,SAAA,CACA,GAAAiC,EAAA,qBACA,IACAk9C,IAAA,CACAC,eAAA,CACAC,eAAA,CACA9C,YAAA,CAAA+C,mBAAA,CACAv/B,GACA,OAAAhP,SAAA,GACA,EAAAouC,IAAA,GACAA,IAAA,CAAAv5B,MAAA,CAAAm5B,UAAA,MAAAt8C,UAAA,GAAAkoB,KAAA,GAAAw0B,IAAA,OAEA,CAAAryC,QAAA,MAAArK,UAAA,GACA88C,aAAA,CAAArxC,GAAA,sBAAApB,QAAA,EACA0yC,YAAA,CAAAtxC,GAAA,qBAAApB,QAAA,EACA2yC,gBAAA,CAAAvxC,GAAA,yBAAApB,QAAA,EACA4yC,eAAA,CAAAxxC,GAAA,qBAAApB,QAAA,EACA6yC,cAAA,CAAAzxC,GAAA,eAAApB,QAAA,EACA8yC,gBAAA,CAAA1xC,GAAA,yBAAApB,QAAA,EACAyvC,YAAA,CAAA+C,mBAAA,CACAxyC,QAAA,CAAAyY,GAAA,wBAGA,MAAAs6B,eAAA,CAAAhE,QAAA,CAAA/uC,QAAA,EAAAgzC,SAAA,EACA3R,UAAA,IACA4R,WAAA,IACAC,QAAA,EACAC,WAAA,CAAAjgD,SAAA,IACAkgD,WAAA,EACAf,IAAA,GACAgB,KAAA,GACApgC,GAAA,GACAqgC,MAAA,EACA,CACA,EACAC,MAAA,CAAAx9C,KAAA,OAAAy9C,UAAA,CACA1tB,IAAA,CAAA2tB,KAAA,OAAAC,OAAA,CAAAF,UAAA,CAAAz9C,KAAA,CAAA49C,EAAA,EACAC,OAAA,CAAAJ,UAAA,CAAAz9C,KAAA,CAAA89C,EAAA,EACA,KAAAC,MAAA,CAAAJ,OAAA,CAAAE,OAAA,CACA,CACA,GACA7E,QAAA,CAAA2D,YAAA,KAAAv9C,EAAA,QAAAY,KAAA,GACA,MAAAq8B,WAAA,CAAAr8B,KAAA,CAAAq8B,WAAA,CACAA,WAAA,CAAA9Y,KAAA,EACA3nB,IAAA,OACA,EAAAohD,eAAA,CAAA/yC,QAAA,IACA,GAGA6yC,cAAA,CAAAkB,UAAA,EACAC,OAAA,IACAC,SAAA,IACA7rB,KAAA,EACAue,GAAA,CAAA4L,eAAA,CACA3jB,GAAA,CAAA0jB,eACA,EACAh5B,KAAA,CAAAk5B,mBAAA,CACA0B,IAAA,GACA,GAAA/+C,EAAA,eAAAg8C,eAAA,EAGAsB,aAAA,CAAAt9C,EAAA,cAAA8hB,KAAA,EAEA07B,gBAAA,CAAAx9C,EAAA,6BAAAm7C,cAAA,EACAsC,eAAA,CAAAz9C,EAAA,cAAAo8C,aAAA,EACAuB,gBAAA,CAAA39C,EAAA,cAAAs8C,cAAA,EACApC,KAAA,CAAA9C,gBAAA,cAAA8D,YAAA,EACAhB,KAAA,CAAA9C,gBAAA,cACAz1B,QAAA,GAAAM,KAAA,CAAArkB,EAAA,kCACA,KAAAs9C,YAAA,EACA,GACAv3B,MAAA,CAAAyzB,gBAAA,eAAAoF,YAAA,EAGA,KAAAO,MAAA,CAAAG,IAAA,CAAAp/B,GAAA,CACA,GAAA9d,EAAA,mBACA,KAAA86C,sBAAA,cACA,GAAA96C,EAAA,mBACA,KAAA86C,sBAAA,cACA,GAAA96C,EAAA,sBACAjC,SAAA,CAAAiQ,WAAA,4BACA,KAAA0sC,iBAAA,GACA,KAAAt2B,IAAA,GACAT,MAAA,CAAA0zB,mBAAA,eAAAmF,YAAA,CACA,GACAQ,YAAA,CAAAvgD,IAAA,CAAAoD,MAAA,EACAm9C,YACA,CAvbA/wC,GAAA,CAAAA,GAAA,EAAA9P,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA2P,GAAA,YAAAA,GAAA,YAAAA,GAAA,CACArO,EAAA,CAAAA,EAAA,EAAAzB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAsB,EAAA,YAAAA,EAAA,YAAAA,EAAA,CACAuB,UAAA,CAAAA,UAAA,EAAAhD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6C,UAAA,YAAAA,UAAA,YAAAA,UAAA,CACAC,QAAA,CAAAA,QAAA,EAAAjD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA8C,QAAA,YAAAA,QAAA,YAAAA,QAAA,CACAF,SAAA,CAAAA,SAAA,EAAA/C,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA4C,SAAA,YAAAA,SAAA,YAAAA,SAAA,CACA06C,QAAA,CAAAA,QAAA,EAAAz9C,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAs9C,QAAA,YAAAA,QAAA,YAAAA,QAAA,CACAC,aAAA,CAAAA,aAAA,EAAA19C,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAu9C,aAAA,YAAAA,aAAA,YAAAA,aAAA,CACAC,aAAA,CAAAA,aAAA,EAAA39C,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAw9C,aAAA,YAAAA,aAAA,YAAAA,aAAA,CACAn4B,QAAA,CAAAA,QAAA,EAAAxlB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAqlB,QAAA,YAAAA,QAAA,YAAAA,QAAA,CAEAviB,QAAA,CAAA8B,aAAA,GACA9B,QAAA,CAAAD,UAAA,EACAC,QAAA,CAAA8B,aAAA,KAEA,IAAAxB,QAAA,CAAAP,UAAA,CAAAgC,QAAA,UAAAhC,UAAA,CAAAiC,MAAA,CAAAC,OAAA,CAAAC,QAAA,CAAAhC,IAAA,EACA,KAAAkC,YAAA,gBACAH,OAAA,MAAAI,KAAA,CAAAJ,OAAA,CAAAlC,UAAA,CAAAkC,OAAA,EAAA/B,IAAA,CAAAA,IAAA,KACA,IAAAoC,MAAA,IAAAC,aAAA,CAAAN,OAAA,CAAAM,aAAA,CAAAC,gBAAA,MAAAA,gBAAA,CAAAG,MAAA,CAAAxC,OAAA,CAkBA,MAfA,CAAAmC,MAAA,oLACAE,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,SAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,cAAA7B,OAAA,IACA,yNACAqC,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,QAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,aAAA7B,OAAA,IACA,4IACAqC,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,kBAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,uBAAA7B,OAAA,IACA,iLACAqC,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,mBAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,wBAAA7B,OAAA,IACA,gRACAqC,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,+BAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,oCAAA7B,OAAA,IACA,iOACAqC,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,YAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,iBAAA7B,OAAA,IACA,qKACAqC,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,SAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,cAAA7B,OAAA,IACA,6FACAmC,MACA,QAuBA,CAAA4oB,aAAA,EACAqxB,kBAAA,2BACAhB,YAAA,oBACAuC,IAAA,KACAC,eAAA,GACAC,eAAA,IACA9C,YAAA,GACAx8B,GAAA,GACA,EACAm/B,eAAA,EACA+B,aAAA,cACA,EAmXA,OAAA/E,uBAEA,GAEAt+C,MC/bA,wGA4BA,CAAAsjD,cAAA,CAAAC,WAAA,QACA,CACA36C,UACA,EAAA26C,WAAA,gBACA,CACAC,eAAA,EACAC,aAAA,GACA,EACAC,kBAAA,EACAC,MAAA,EACAC,aAAA,GACA,IACA,IACA,EAAAL,WAAA,CACA,CACAM,QAAA,GACA,EAAAD,aAAA,CAAAviD,IAAA,CAAAyiD,SAAA,iBAAAA,SAAA,gBAAAC,QAAA,MACAC,SAAA,CAAAR,eAAA,gBAAAS,oBAAA,CACA,OACAr7C,UAAA,CACArE,QAAA,CAAAy/C,SAAA,MAAAA,SAAA,GACA/D,GAAA,CAAA4D,QAAA,CAAA/hD,OAAA,cACA,CACA,EASAoiD,eAAA,CAAAA,CAAAt7C,UAAA,CAAAu7C,YAAA,IACA,MACA52B,KACA,EAAA42B,YAAA,CAAA9iD,IAAA,CAAA+iD,gBAAA,EAAAA,gBAAA,gBAAAC,aAAA,GAAAz7C,UAAA,MACA,OAAAgb,QAAA,CAAA2J,KAAA,GAAA+2B,MAAA,CAAAC,iBACA,EAOA,IAAAC,mBAAA,CAAAC,QAAA,GACA,MACAC,iBAAA,EACAC,aAAA,GACA,KACAC,cAAA,EACAC,wBAAA,EACAV,YAAA,GACA,IACA,IACA,EAAAM,QAAA,CACA,OAAAE,aAAA,CAAA19C,GAAA,CAAAq8C,cAAA,EAAA74C,MAAA,CAAAC,IAAA,GACA,IACAu1C,GACA,EAAAv1C,IAAA,CACA,QAAAu1C,GACA,GAAAr1C,IAAA,EAAAC,CAAA,CAAAC,CAAA,GAAAo5C,eAAA,CAAAr5C,CAAA,CAAAjC,UAAA,CAAAu7C,YAAA,EAAAD,eAAA,CAAAp5C,CAAA,CAAAlC,UAAA,CAAAu7C,YAAA,EACA,EAEA,OAAAK,mBAEA,GAEAxkD,MC/FA,sYAAAC,CAAA,CAAAgC,EAAA,CAAAyf,KAAA,CAAAtR,QAAA,CAAAI,eAAA,CAAAtQ,aAAA,CAAAiO,SAAA,CAAAS,YAAA,CAAAC,mBAAA,CAAAi2C,mBAAA,CAAAN,mBAAA,eAEAvkD,CAAA,CAAAA,CAAA,EAAAO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAV,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACAgC,EAAA,CAAAA,EAAA,EAAAzB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAsB,EAAA,YAAAA,EAAA,YAAAA,EAAA,CACAmO,QAAA,CAAAA,QAAA,EAAA5P,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAyP,QAAA,YAAAA,QAAA,YAAAA,QAAA,CACAI,eAAA,CAAAA,eAAA,EAAAhQ,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6P,eAAA,YAAAA,eAAA,YAAAA,eAAA,CACAtQ,aAAA,CAAAA,aAAA,EAAAM,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAT,aAAA,YAAAA,aAAA,YAAAA,aAAA,CACAiO,SAAA,CAAAA,SAAA,EAAA3N,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAwN,SAAA,YAAAA,SAAA,YAAAA,SAAA,CACAS,YAAA,CAAAA,YAAA,EAAApO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAiO,YAAA,YAAAA,YAAA,YAAAA,YAAA,CACAC,mBAAA,CAAAA,mBAAA,EAAArO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAkO,mBAAA,YAAAA,mBAAA,YAAAA,mBAAA,CACAi2C,mBAAA,CAAAA,mBAAA,EAAAtkD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAmkD,mBAAA,YAAAA,mBAAA,YAAAA,mBAAA,CACAN,mBAAA,CAAAA,mBAAA,EAAAhkD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6jD,mBAAA,YAAAA,mBAAA,YAAAA,mBAAA,MAqBA,CAAA3lC,UAAA,WACAC,YAAA,sBAKA,IAAApO,MAAA,CAAAxQ,aAAA,EACAW,IAAA,WAIAC,KAAA,OACA,CAAAqC,UAAA,MAAAnC,aAAA,GACA4P,iBAAA,CAAAzN,UAAA,CAAAsL,UAAA,GACAoC,eAAA,EAAAD,iBAAA,CAAAV,SAAA,WAAAY,OAAA,WACA,CAAAuwC,YAAA,CACA0D,WAAA,MACA,CAAAC,qBAAA,CAAAA,CAAA,SACA,CAAAzmC,UAAA,CAAApb,UAAA,CAAAhC,aAAA,GAAAkB,YAAA,GACA4iD,uBAAA,MAAAnM,MAAA,CAAAj0C,UAAA,GACAqgD,iBAAA,IAAArmC,UAAA,oBACAsmC,mBAAA,CAAA5mC,UAAA,CAAAld,IAAA,CAAA0jD,WAAA,CAAA99C,GAAA,CAAAyD,IAAA,GACA,IACAnG,QACA,EAAAmG,IAAA,CACA,OAAAnG,QACA,GAAAi1B,IAAA,QACA,KAAA4rB,eAAA,CAAAx2C,YAAA,EACAjH,EAAA,CAAAu9C,iBAAA,CACA3xC,KAAA,CAAA0xC,uBAAA,CACA11C,QAAA,CAAAV,mBAAA,CAAAW,cAAA,CAAA21C,mBAAA,CAAA7zC,GAAA,CAAA2zC,uBAAA,GACAx1C,YAAA,IACA+F,IAAA,IACAa,SAAA,GACA,GAAAhS,EAAA,YACAg9C,YAAA,CAAAj+C,EAAA,cACA,KAAAgiD,eAAA,CAAAjuC,IAAA,GACAhU,UAAA,CAAA4B,OAAA,IAAA+Z,YAAA,QAEA,GAAAza,EAAA,kBACAg9C,YAAA,CAAAj+C,EAAA,cACA,KAAAgiD,eAAA,CAAAhuC,QAAA,GACAjU,UAAA,CAAA4B,OAAA,IAAA+Z,YAAA,YAEA,GAAAza,EAAA,iBACAg9C,YAAA,CAAAj+C,EAAA,aACAD,UAAA,CAAA4B,OAAA,IAAA+Z,YAAA,iBAEA,GAAAza,EAAA,aACAm3B,UAAA,MACA,KAAA4pB,eAAA,CAAAz1C,SAAA,IACA,KAAAy1C,eAAA,CAAArjD,KAAA,EAEA,IACA,GAAA2N,WAAA,CAAAy1C,mBAAA,CAAAzjD,MAAA,EACA2/C,YAAA,CAAAh9C,EAAA,oBACA,GAAAg9C,YAAA,CAAAj+C,EAAA,kBACA,CAAAiiD,eAAA,MAAAD,eAAA,CAAA9pC,SAAA,GAAAzL,SAAA,CAAAhL,UAAA,GACA,CACAN,QACA,EAAA88C,YAAA,CAAA1wC,cAAA,OACApM,QAAA,EAAA8gD,eAAA,CAAAjiD,EAAA,CAAAmB,QAAA,GACA,KAAA6gD,eAAA,CAAAjuC,IAAA,EAEA,CACA,EACA,EAMAmuC,eAAA,CAAAA,CAAA,IACA,IAAAjE,YAAA,EACA,MAAA9iC,UAAA,CAAApb,UAAA,CAAAhC,aAAA,GAAAkB,YAAA,GACAg/C,YAAA,CAAAyD,mBAAA,CAAAvmC,UAAA,KAAAla,EAAA,cACA,KAAA0Z,QAAA,YACA5a,UAAA,CAAA4B,OAAA,IAAA+Z,YAAA,SAEA,GAAAM,IAAA,EACA,CACA,OAAAiiC,YACA,EAQAkE,YAAA,CAAAA,CAAA,GAAAp3C,SAAA,CAAAjF,eAAA,CAAA/F,UAAA,CAAAmL,UAAA,GAAAnL,UAAA,CAAAoL,cAAA,GAAA7F,cAAA,eAKAwzC,YAAA,CAAAA,CAAA,IACAqJ,YAAA,GACA,KAAAnnC,IAAA,GAEA,KAAAgB,IAAA,EAEA,EAOAomC,YAAA,CAAAA,CAAA,IACAR,qBAAA,GACA,KAAAlM,MAAA,CAAAE,MAAA,GACA,KAAA5yB,QAAA,cACA,KAAArhB,OAAA,SACAs8C,YAAA,CAAAj+C,EAAA,YACAi+C,YAAA,CAAAjjC,IAAA,EAEA,EAOAqnC,aAAA,CAAAA,CAAA,IACA,KAAA1nC,QAAA,aACA,KAAAqnC,eAAA,CAAApgD,IAAA,GACA,KAAAogD,eAAA,CAAAr1C,OAAA,GACA,KAAAqW,QAAA,cACA,KAAA0yB,MAAA,CAAAC,OAAA,GACA,KAAAh0C,OAAA,UACAs8C,YAAA,GAAAA,YAAA,CAAAj+C,EAAA,aACAi+C,YAAA,CAAAl7B,KAAA,GACAk7B,YAAA,CAAAjiC,IAAA,IAGA,EAKAsmC,UAAA,CAAAA,CAAA,IACA,KAAA3nC,QAAA,cACA,KAAAA,QAAA,YACA0nC,aAAA,GACA,KAAAr/B,QAAA,eAEAo/B,YAAA,GACA,KAAAp/B,QAAA,cAGA,EAGA,KAAA0yB,MAAA,MAAA33C,aAAA,GAAA05C,UAAA,GAAAC,WAAA,EACAt2B,SAAA,SAAA1T,OAAA,YACAiU,OAAA,MAAAjU,OAAA,GACA8T,IAAA,cACApS,IAAA,CAAAvQ,EAAA,mBACA+iB,KAAA,CAAA/iB,EAAA,yBACA,GAGA,KAAA62C,MAAA,CAAAz0C,EAAA,SAAAgL,CAAA,GACAA,CAAA,CAAAoW,cAAA,GACAtiB,UAAA,CAAA4B,OAAA,IAAA+Z,YAAA,SACA,GAGAlO,iBAAA,CAAAQ,cAAA,EACAnR,CAAA,CAAAyE,OAAA,CAAAmM,eAAA,EAAA+P,OAAA,CAAAC,GAAA,IACAzQ,QAAA,CAAAkB,GAAA,CAAAd,eAAA,CAAAe,YAAA,CAAAqP,OAAA,CAAA/B,UAAA,UACA,6BAAAgC,GAAA,EAAAwgC,YAAA,EAAAA,YAAA,CAAAj+C,EAAA,cAGA,MAAAuiD,QAAA,CAAA9kC,GAAA,CAAA+kC,QAAA,oCAAA/kC,GAAA,CACA1d,UAAA,CAAA4B,OAAA,CAAA+Z,YAAA,CAAA6mC,QAAA,EACA,GACAn0C,UAAA,GACA,EACA,GAIA0qC,YAAA,GACA,KAAAh8B,OAAA,GACA,KAAAd,IAAA,GAGAjc,UAAA,CAAAkB,EAAA,iBACA63C,YAAA,GACA,KAAAh8B,OAAA,EACA,GAAA7b,EAAA,+BACA,KAAA+b,MAAA,EACA,GAAA/b,EAAA,gCACAohD,aAAA,GACA,KAAAvlC,OAAA,EACA,GAAA7b,EAAA,IAAAya,YAAA,cACAymC,YAAA,IACAG,UAAA,EAEA,GAAArhD,EAAA,IAAAya,YAAA,sBACA,QAAAf,QAAA,aACA,KAAAA,QAAA,YACA,GAAAsjC,YAAA,CAAAj+C,EAAA,kBACA,CAAAiiD,eAAA,MAAAD,eAAA,CAAA9pC,SAAA,GAAAzL,SAAA,CAAAhL,UAAA,GACA,CACAN,QACA,EAAA88C,YAAA,CAAA1wC,cAAA,OACA,IAAA00C,eAAA,CAAAjiD,EAAA,CAAAmB,QAAA,EAIA,YAHA,KAAAu0C,MAAA,CAAAj0C,UAAA,QAAAwgD,eAAA,KACAA,eAAA,CAAAtgD,OAAA,UAIA,CACAs8C,YAAA,CAAA7B,cAAA,EACA,CAEA,GAAAn7C,EAAA,mBACA,GAAAkhD,YAAA,SAGA,CAAAR,WAAA,CAAAP,mBAAA,CAAArhD,UAAA,CAAA4e,UAAA,CAAA8jC,OAAA,GAAAC,iBAAA,MAAA7+C,GAAA,CAAA8+C,YAAA,EAAAvlD,MAAA,CAAAkL,MAAA,IAAAq6C,YAAA,EACA9F,GAAA,CAAA98C,UAAA,CAAA4e,UAAA,CAAAikC,YAAA,CAAAxkC,OAAA,CAAAukC,YAAA,CAAA9F,GAAA,CACA,IACA8E,WAAA,CAAArjD,MAAA,MAKA4jD,eAAA,GAAAlF,mBAAA,CAAA2E,WAAA,EACA,KAAA3mC,IAAA,GACA,MAAAL,QAAA,YACA,KAAAqI,QAAA,eACAs/B,UAAA,MARAD,aAAA,OACA,MAAArmC,IAAA,GASA,EACA,EAIArP,QAAA,EACAK,QAAA,CAAAJ,MAAA,UAAAc,OAAA,KACA,EAIAsP,OAAA,EACA,KAAA04B,MAAA,CAAA14B,MAAA,EACA,EAIAF,QAAA,EACA,KAAA44B,MAAA,CAAA54B,OAAA,EACA,EAIA9B,KAAA,EACA,KAAA06B,MAAA,CAAA16B,IAAA,EACA,EAIAgB,KAAA,EACA,KAAA05B,MAAA,CAAA15B,IAAA,EACA,CACA,GAEA,OAAA1O,MAEA,GAEA1Q,MClTA,oIAAAC,CAAA,CAAAuD,UAAA,CAAAC,QAAA,CAAAwiD,gBAAA,eAwBA,SAAAC,eAAAviD,IAAA,CAAAC,OAAA,CAAAC,QAAA,EACA,IAAAC,IAAA,CAAAC,QAAA,CAAAJ,IAAA,CAAAC,OAAA,EACA,OAAAC,QAAA,KAAAC,IAAA,CAAAE,CAAA,CAAAF,IAAA,CACA,CAsCA,SAAAw6C,wBAAA,EACA,IAAA6H,wBAAA,CAqCA,MAhCA,CAAAA,wBAAA,CAAAF,gBAAA,EAOAG,OAAA,UAAAA,QAAA,KACA,CAAArlD,IAAA,MACAY,KAAA,MAAAuC,MAAA,CAAAmiD,YAAA,MAQA,MAPA,MAAAjjD,EAAA,mBAAAA,EAAA,mBAAAA,EAAA,iBACA,KAAAgjB,QAAA,kBACA,KAAArhB,OAAA,YACA9E,CAAA,CAAA0B,KAAA,YACAZ,IAAA,CAAAqlB,QAAA,iBACA,EAAAzkB,KAAA,GAEA,IACA,CACA,EAAAgtB,aAAA,EAAAtqB,EAAA,0BAAA0T,QAAA,KACA,CAAAhX,IAAA,MACAmO,QAAA,MAAArK,UAAA,GACAkT,QAAA,CAAAlF,MAAA,CAAAqzC,cAAA,MACAh3C,QAAA,CAAAoD,QAAA,mBACApD,QAAA,CAAA7K,EAAA,qCAAAgL,CAAA,EACAA,CAAA,CAAAoW,cAAA,GACA1kB,IAAA,CAAAqlD,OAAA,EACA,GAAA/hD,EAAA,oCAAAgL,CAAA,EACAA,CAAA,CAAAoW,cAAA,GACA1kB,IAAA,CAAAgP,OAAA,EACA,EACA,GAAAjP,IAAA,GACAqlD,wBACA,CAtGAlmD,CAAA,CAAAA,CAAA,EAAAO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAV,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACAuD,UAAA,CAAAA,UAAA,EAAAhD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6C,UAAA,YAAAA,UAAA,YAAAA,UAAA,CACAC,QAAA,CAAAA,QAAA,EAAAjD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA8C,QAAA,YAAAA,QAAA,YAAAA,QAAA,CACAwiD,gBAAA,CAAAA,gBAAA,EAAAzlD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAslD,gBAAA,YAAAA,gBAAA,YAAAA,gBAAA,CAEAxiD,QAAA,CAAA8B,aAAA,GACA9B,QAAA,CAAAD,UAAA,EACAC,QAAA,CAAA8B,aAAA,QAEA,CAAAxB,QAAA,CAAAP,UAAA,CAAAgC,QAAA,UAAAhC,UAAA,CAAAiC,MAAA,CAAAC,OAAA,CAAAC,QAAA,CAAAhC,IAAA,EACA,KAAAkC,YAAA,gBACAH,OAAA,MAAAI,KAAA,CAAAJ,OAAA,CAAAlC,UAAA,CAAAkC,OAAA,EAAA/B,IAAA,CAAAA,IAAA,KACA,IAAAoC,MAAA,IAAAC,aAAA,CAAAN,OAAA,CAAAM,aAAA,CAAAC,gBAAA,MAAAA,gBAAA,CAAAG,MAAA,CAAAxC,OAAA,CAQA,MALA,CAAAmC,MAAA,sIACAE,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,4BAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,iCAAA7B,OAAA,IACA,8FACAqC,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,kBAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,uBAAA7B,OAAA,IACA,sEACAmC,MACA,GAuBA4oB,aAAA,EACAuzB,SAAA,IACAoE,SAAA,IACAC,mBAAA,IACAx5B,KAAA,KACAy5B,QAAA,KACAC,QAAA,KACAC,SAAA,IACA7+B,MAAA,KACAw7B,aAAA,eACAlhC,GAAA,IACAo/B,IAAA,IACA8E,YAAA,IACA,EA+CA,OAAA/H,uBAEA,GAEAt+C,MC9GA,8OAAAC,CAAA,CAAAgC,EAAA,CAAAyf,KAAA,CAAAtR,QAAA,CAAAI,eAAA,CAAAtQ,aAAA,CAAAymD,aAAA,CAAAx4C,SAAA,eAEAlO,CAAA,CAAAA,CAAA,EAAAO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAV,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACAgC,EAAA,CAAAA,EAAA,EAAAzB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAsB,EAAA,YAAAA,EAAA,YAAAA,EAAA,CACAmO,QAAA,CAAAA,QAAA,EAAA5P,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAyP,QAAA,YAAAA,QAAA,YAAAA,QAAA,CACAI,eAAA,CAAAA,eAAA,EAAAhQ,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6P,eAAA,YAAAA,eAAA,YAAAA,eAAA,CACAtQ,aAAA,CAAAA,aAAA,EAAAM,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAT,aAAA,YAAAA,aAAA,YAAAA,aAAA,CACAymD,aAAA,CAAAA,aAAA,EAAAnmD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAgmD,aAAA,YAAAA,aAAA,YAAAA,aAAA,CACAx4C,SAAA,CAAAA,SAAA,EAAA3N,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAwN,SAAA,YAAAA,SAAA,YAAAA,SAAA,IAwBA,CAAA0Q,UAAA,gBAMAC,YAAA,2BAMA6P,aAAA,EACAmP,GAAA,GACA8oB,GAAA,GACA,EAKAC,WAAA,CAAA3mD,aAAA,EACAW,IAAA,gBAIAC,KAAA,EAOA,SAAAgmD,QAAA,EACAH,aAAA,GAAAtiD,EAAA,qBACAtD,IAAA,CAAAgmD,KAAA,CAAAlzC,IAAA,OACA9S,IAAA,CAAA+3C,MAAA,CAAAE,MAAA,GAKAj4C,IAAA,CAAAgE,OAAA,WACA,GAAAV,EAAA,sBACAtD,IAAA,CAAAgmD,KAAA,CAAA9mD,CAAA,CAAA+mD,OAAA,CAAAjmD,IAAA,CAAAgmD,KAAA,OACAhmD,IAAA,CAAAgmD,KAAA,CAAArlD,MAAA,CAAAwC,MAAA,CAAA45B,GAAA,EACA/8B,IAAA,CAAAqf,MAAA,GAEA,IAAArf,IAAA,CAAAgmD,KAAA,CAAArlD,MAAA,GACAX,IAAA,CAAA+3C,MAAA,CAAAC,OAAA,GACAh4C,IAAA,CAAAgE,OAAA,WAMAhE,IAAA,CAAAgE,OAAA,aACA,GAAAjE,IAAA,EACAmmD,QAAA,CAAA1oC,UAAA,CACA2oC,kBAAA,CAAA3oC,UACA,EACA,CAsCA,SAAAxE,UAAA,EAEA,OAAA5L,SAAA,CAAAjF,eAAA,CAAA/F,UAAA,CAAAmL,UAAA,GAAAnL,UAAA,CAAAoL,cAAA,GAAA7F,cAAA,kBACA,CAKA,SAAAwzC,aAAA,EACAniC,SAAA,GACAhZ,IAAA,CAAAqd,IAAA,GAEArd,IAAA,CAAAqe,IAAA,EAEA,MArFA,CAAAre,IAAA,MACAoC,UAAA,MAAAnC,aAAA,GACAud,UAAA,CAAApb,UAAA,CAAAhC,aAAA,GAAAC,cAAA,GAAAgR,MAAA,GACAxB,iBAAA,CAAAzN,UAAA,CAAAsL,UAAA,GACAvK,MAAA,CAAA1D,MAAA,CAAAkL,MAAA,IAAAijB,aAAA,MAAAxb,SAAA,IACAtC,eAAA,EAAAD,iBAAA,CAAAV,SAAA,0BA+BA,KAAA62C,KAAA,IAGA,KAAAjO,MAAA,MAAA33C,aAAA,GAAA05C,UAAA,GAAAC,WAAA,EACA/1B,OAAA,gBACAvS,IAAA,CAAAvQ,EAAA,YACA+iB,KAAA,CAAA/iB,EAAA,6BACA2iB,IAAA,YACA,GAGA,KAAAk0B,MAAA,CAAAz0C,EAAA,kBAAAgL,CAAA,EACAA,CAAA,CAAAoW,cAAA,GACAtiB,UAAA,CAAA4B,OAAA,IAAA+Z,YAAA,SACA,GAGAlO,iBAAA,CAAAQ,cAAA,EACAnR,CAAA,CAAAyE,OAAA,CAAAmM,eAAA,UAAA+P,OAAA,CAAAC,GAAA,EACAzQ,QAAA,CAAAkB,GAAA,CAAAd,eAAA,CAAAe,YAAA,CAAAqP,OAAA,+BAEAzd,UAAA,CAAA4B,OAAA,CAAA+Z,YAAA,CAAA+B,GAAA,CACA,GACArP,UAAA,GACA,EACA,GAIA,KAAA0O,OAAA,GAsBA/c,UAAA,CAAAkB,EAAA,YAAA63C,YAAA,EAAA73C,EAAA,qCACAtD,IAAA,CAAAqf,MAAA,EACA,GAAA/b,EAAA,sCACAtD,IAAA,CAAAmf,OAAA,GAEAjgB,CAAA,CAAAknD,MAAA,CAAApmD,IAAA,CAAAgmD,KAAA,WACA,GAEA1iD,EAAA,IAAAya,YAAA,oBACA/E,SAAA,KACA,IAAAhZ,IAAA,CAAAgmD,KAAA,CAAArlD,MAAA,EACAX,IAAA,CAAAgE,OAAA,SAEAhE,IAAA,CAAAgmD,KAAA,CAAArlD,MAAA,CAAAwC,MAAA,CAAA45B,GAAA,CACAgpB,OAAA,GACA,IAAA5iD,MAAA,CAAA45B,GAAA,EACA79B,CAAA,CAAAknD,MAAA,CAAApmD,IAAA,CAAAgmD,KAAA,YAGA,EACA,EAIAh3C,OAAA,UAAAA,QAAA,EACAK,QAAA,CAAAJ,MAAA,sBACA,EAIAoQ,MAAA,UAAAA,OAAA,EACA,KAAA04B,MAAA,CAAA14B,MAAA,EACA,EAIAF,OAAA,UAAAA,QAAA,EACA,KAAA44B,MAAA,CAAA54B,OAAA,EACA,EAIA9B,IAAA,UAAAA,KAAA,EACA,KAAA06B,MAAA,CAAA16B,IAAA,EACA,EAIAgB,IAAA,UAAAA,KAAA,EACA,KAAA05B,MAAA,CAAA15B,IAAA,EACA,CACA,GAEA,OAAAynC,WAEA,GAEA7mD,MC1MA,8TAAAsQ,GAAA,CAAArQ,CAAA,CAAAgC,EAAA,CAAAyf,KAAA,CAAA0lC,iBAAA,CAAAC,sBAAA,CAAAC,2BAAA,CAAAl3C,QAAA,CAAAI,eAAA,CAAAtQ,aAAA,CAAAiO,SAAA,CAAA3K,UAAA,CAAAC,QAAA,eA0BA,SAAA8jD,cAAA5jD,IAAA,CAAAC,OAAA,CAAAC,QAAA,EACA,IAAAC,IAAA,CAAAC,QAAA,CAAAJ,IAAA,CAAAC,OAAA,EACA,OAAAC,QAAA,KAAAC,IAAA,CAAAE,CAAA,CAAAF,IAAA,CACA,CA3BAwM,GAAA,CAAAA,GAAA,EAAA9P,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA2P,GAAA,YAAAA,GAAA,YAAAA,GAAA,CACArQ,CAAA,CAAAA,CAAA,EAAAO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAV,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACAgC,EAAA,CAAAA,EAAA,EAAAzB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAsB,EAAA,YAAAA,EAAA,YAAAA,EAAA,CACAmlD,iBAAA,CAAAA,iBAAA,EAAA5mD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAymD,iBAAA,YAAAA,iBAAA,YAAAA,iBAAA,CACAC,sBAAA,CAAAA,sBAAA,EAAA7mD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA0mD,sBAAA,YAAAA,sBAAA,YAAAA,sBAAA,CACAC,2BAAA,CAAAA,2BAAA,EAAA9mD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA2mD,2BAAA,YAAAA,2BAAA,YAAAA,2BAAA,CACAl3C,QAAA,CAAAA,QAAA,EAAA5P,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAyP,QAAA,YAAAA,QAAA,YAAAA,QAAA,CACAI,eAAA,CAAAA,eAAA,EAAAhQ,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6P,eAAA,YAAAA,eAAA,YAAAA,eAAA,CACAtQ,aAAA,CAAAA,aAAA,EAAAM,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAT,aAAA,YAAAA,aAAA,YAAAA,aAAA,CACAiO,SAAA,CAAAA,SAAA,EAAA3N,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAwN,SAAA,YAAAA,SAAA,YAAAA,SAAA,CACA3K,UAAA,CAAAA,UAAA,EAAAhD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6C,UAAA,YAAAA,UAAA,YAAAA,UAAA,CACAC,QAAA,CAAAA,QAAA,EAAAjD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA8C,QAAA,YAAAA,QAAA,YAAAA,QAAA,CAEAA,QAAA,CAAA8B,aAAA,GACA9B,QAAA,CAAAD,UAAA,EACAC,QAAA,CAAA8B,aAAA,QAEA,CAAAxB,QAAA,CAAAP,UAAA,CAAAgC,QAAA,UAAAhC,UAAA,CAAAiC,MAAA,CAAAC,OAAA,CAAAC,QAAA,CAAAhC,IAAA,EAKA,MAJA,MAAAkC,YAAA,gBACAH,OAAA,MAAAI,KAAA,CAAAJ,OAAA,CAAAlC,UAAA,CAAAkC,OAAA,EAGA,qDACA,GA4BA8hD,iBAAA,EACA3/B,MAAA,KACAkF,KAAA,KACA5K,GAAA,IACAo/B,IAAA,IACA8B,aAAA,eACAoE,kBAAA,GACA,EAMAC,gBAAA,CAAAznD,CAAA,CAAAmE,QAAA,EACAyjB,MAAA,KACAkF,KAAA,IACA,EAAAy6B,iBAAA,EAMAG,oBAAA,CAAA1nD,CAAA,CAAAmE,QAAA,EACA2oB,KAAA,KACAlF,MAAA,KACA+/B,UAAA,EACAC,KAAA,EACAC,MAAA,GACA,CACA,CACA,EAAAN,iBAAA,EAKAI,UAAA,CAAA1nD,aAAA,EACAW,IAAA,cAIAC,IAAA,UAAAA,KAAA,EAYA,SAAAinD,wBAAA,OACA,CAAAzlC,WAAA,CAAAnf,UAAA,CAAAoL,cAAA,GACA7F,cAAA,CAAA4Z,WAAA,CAAA5Z,cAAA,CACA6Z,OAAA,CAAApf,UAAA,CAAAmL,UAAA,GACA,OACAs5C,UAAA,CAAAz5C,SAAA,CAAAjF,eAAA,CAAAqZ,OAAA,CAAA7Z,cAAA,kBACAs/C,MAAA,CAAA75C,SAAA,CAAAjF,eAAA,CAAAqZ,OAAA,CAAA7Z,cAAA,yBACAu/C,UAAA,CAAA95C,SAAA,CAAAjF,eAAA,CAAAqZ,OAAA,CAAA7Z,cAAA,4BACA,CACA,CAMA,SAAAqR,UAAA,EAKA,MAAA9Q,UAAA,CAAA8+C,uBAAA,GACA,OAAA9+C,UAAA,CAAA2+C,UAAA,EAAA3+C,UAAA,CAAA++C,MAAA,EAAA/+C,UAAA,CAAAg/C,UACA,CAKA,SAAA/L,aAAA,EACAniC,SAAA,GAEAhZ,IAAA,CAAAqd,IAAA,GAEArd,IAAA,CAAAqe,IAAA,EAEA,CAOA,SAAA8oC,gBAAAC,OAAA,EACA,MAAAl/C,UAAA,CAAA8+C,uBAAA,GACA,IAAAK,OAAA,CAAAC,UAAA,CACAp/C,UAAA,CAAAg/C,UAAA,EACAG,OAAA,CAAAd,2BAAA,CACAe,UAAA,CAAAV,oBAAA,CACAU,UAAA,CAAAT,UAAA,CAAAC,KAAA,CAAAC,MAAA,CAAA7nD,CAAA,CAAA8gC,WAAA,CAAA78B,MAAA,CAAA4jD,MAAA,EAAAH,oBAAA,CAAAC,UAAA,CAAAC,KAAA,CAAAC,MAAA,CAAA5jD,MAAA,CAAA4jD,MAAA,EACA7+C,UAAA,CAAA++C,MAAA,EACAI,OAAA,CAAAf,sBAAA,CACAgB,UAAA,CAAAX,gBAAA,GAEAU,OAAA,CAAAhB,iBAAA,CACAiB,UAAA,CAAAb,iBAAA,EAEAzmD,IAAA,CAAA6mD,UAAA,CAAAQ,OAAA,CAAAnoD,CAAA,CAAAmE,QAAA,EACA6iD,QAAA,CAAAlmD,IAAA,CAAAunD,oBAAA,CACAxmD,OAAA,IACAolD,kBAAA,CAAAn2C,UAAA,CAAA1O,YAAA,GACAkmD,mBAAA,CAAAJ,OAAA,MACA,EAAAE,UAAA,GAAAhkD,EAAA,mBACAtD,IAAA,CAAAgE,OAAA,SACAhE,IAAA,CAAA+3C,MAAA,CAAAE,MAAA,EACA,GAAA30C,EAAA,mBACAtD,IAAA,CAAAgE,OAAA,UACAhE,IAAA,CAAA+3C,MAAA,CAAAC,OAAA,EACA,GAAA93C,KAAA,qBACA,KAAAmd,IAAA,EACA,EACA,CAKA,SAAAoqC,iBAAA,EACA,KAAAznD,IAAA,CAAAgd,QAAA,cACAhd,IAAA,CAAA6mD,UAAA,CAEA7mD,IAAA,CAAA6mD,UAAA,CAAAxkD,EAAA,WACArC,IAAA,CAAA6mD,UAAA,CAAAxpC,IAAA,GAEArd,IAAA,CAAA6mD,UAAA,CAAAxoC,IAAA,GAIAlb,MAAA,CAAAsB,QAAA,CACAwoB,OAAA,SAAA9pB,MAAA,CAAAsB,QAAA,CAAA1D,OAAA,0BAAAqmD,OAAA,EACAD,eAAA,CAAAC,OAAA,CACA,aAEAD,eAAA,EACA,GAEAA,eAAA,GAIA,MA5GA,CAAAnnD,IAAA,MACAoC,UAAA,MAAAnC,aAAA,GACA+P,UAAA,MAAA5P,aAAA,GACAyP,iBAAA,CAAAzN,UAAA,CAAAsL,UAAA,GACAvK,MAAA,MAAAiP,SAAA,GACAtC,eAAA,EAAAD,iBAAA,CAAAV,SAAA,WAAAY,OAAA,QA0GA,KAAAgoC,MAAA,MAAA33C,aAAA,GAAA05C,UAAA,GAAAC,WAAA,EACA/1B,OAAA,cACAC,KAAA,CAAA/iB,EAAA,oBACA2iB,IAAA,SACApS,IAAA,CAAAvQ,EAAA,cACA,GACA,KAAAqmD,oBAAA,CAAAh4C,GAAA,CAAAi3C,aAAA,IAGA,KAAAK,UAAA,MAGA,KAAA9O,MAAA,CAAAz0C,EAAA,kBAAAgL,CAAA,EAEAiB,GAAA,CAAAjB,CAAA,CAAAC,MAAA,EAAA7N,OAAA,uBAAAC,MAAA,GAGA2N,CAAA,CAAAoW,cAAA,GACAtiB,UAAA,CAAA4B,OAAA,oBACA,GACA6L,iBAAA,CAAAQ,cAAA,EACAP,eAAA,CAAAs+B,MAAA,EACA/+B,QAAA,CAAAkB,GAAA,CAAAd,eAAA,CAAAe,YAAA,CAAAV,eAAA,CAAAs+B,MAAA,MAAAr+B,OAAA,kBACA3N,UAAA,CAAA4B,OAAA,mBACA,GACAyM,UAAA,IACAi3C,OAAA,qBACA,GAKAvM,YAAA,GACA,KAAAh8B,OAAA,GAGA/c,UAAA,CAAAkB,EAAA,YAAA63C,YAAA,EAAA73C,EAAA,qCACAtD,IAAA,CAAAqf,MAAA,EACA,GAAA/b,EAAA,sCACAtD,IAAA,CAAAmf,OAAA,GACAnf,IAAA,CAAA6mD,UAAA,GAEA7mD,IAAA,CAAA6mD,UAAA,CAAA73C,OAAA,GACAhP,IAAA,CAAA6mD,UAAA,MAEA,GAAAvjD,EAAA,8BACA0V,SAAA,IACAyuC,gBAAA,EAEA,EACA,EAIA32C,MAAA,UAAAA,OAAA,EACA,IAAAd,UAAA,MAAA5P,aAAA,GACA4P,UAAA,CAAA1O,YAAA,GAAAwQ,MAAA,MAAAy1C,oBAAA,CACA,EAIAv4C,OAAA,UAAAA,QAAA,EACAK,QAAA,CAAAJ,MAAA,UAAAc,OAAA,MACA,KAAAw3C,oBAAA,CAAAt4C,MAAA,GACA,KAAA43C,UAAA,EACA,KAAAA,UAAA,CAAA73C,OAAA,EAEA,EAIAqQ,MAAA,UAAAA,OAAA,EACA,KAAA04B,MAAA,CAAA14B,MAAA,EACA,EAIAF,OAAA,UAAAA,QAAA,EACA,KAAA44B,MAAA,CAAA54B,OAAA,GACA,KAAA0nC,UAAA,EACA,KAAAA,UAAA,CAAAxoC,IAAA,EAEA,EAIAhB,IAAA,UAAAA,KAAA,EACA,KAAA06B,MAAA,CAAA16B,IAAA,EACA,EAIAgB,IAAA,UAAAA,KAAA,EACA,KAAA05B,MAAA,CAAA15B,IAAA,GACA,KAAAwoC,UAAA,EACA,KAAAA,UAAA,CAAAxoC,IAAA,EAEA,CACA,GAEA,OAAAwoC,UAEA,GAEA5nD,MCrTA,sMAAAsQ,GAAA,CAAArO,EAAA,CAAA/B,aAAA,CAAAwhB,KAAA,CAAAgnC,cAAA,CAAAt4C,QAAA,CAAAI,eAAA,CAAAhN,UAAA,CAAAC,QAAA,eA+BA,SAAAklD,WAAAhlD,IAAA,CAAAC,OAAA,CAAAC,QAAA,EACA,IAAAC,IAAA,CAAAC,QAAA,CAAAJ,IAAA,CAAAC,OAAA,EACA,OAAAC,QAAA,KAAAC,IAAA,CAAAE,CAAA,CAAAF,IAAA,CACA,CAhCAwM,GAAA,CAAAA,GAAA,EAAA9P,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA2P,GAAA,YAAAA,GAAA,YAAAA,GAAA,CACArO,EAAA,CAAAA,EAAA,EAAAzB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAsB,EAAA,YAAAA,EAAA,YAAAA,EAAA,CACA/B,aAAA,CAAAA,aAAA,EAAAM,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAT,aAAA,YAAAA,aAAA,YAAAA,aAAA,CACAwhB,KAAA,CAAAA,KAAA,EAAAlhB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA+gB,KAAA,YAAAA,KAAA,YAAAA,KAAA,CACAgnC,cAAA,CAAAA,cAAA,EAAAloD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA+nD,cAAA,YAAAA,cAAA,YAAAA,cAAA,CACAt4C,QAAA,CAAAA,QAAA,EAAA5P,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAyP,QAAA,YAAAA,QAAA,YAAAA,QAAA,CACAI,eAAA,CAAAA,eAAA,EAAAhQ,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6P,eAAA,YAAAA,eAAA,YAAAA,eAAA,CACAhN,UAAA,CAAAA,UAAA,EAAAhD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6C,UAAA,YAAAA,UAAA,YAAAA,UAAA,CACAC,QAAA,CAAAA,QAAA,EAAAjD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA8C,QAAA,YAAAA,QAAA,YAAAA,QAAA,CAEAA,QAAA,CAAA8B,aAAA,GACA9B,QAAA,CAAAD,UAAA,EACAC,QAAA,CAAA8B,aAAA,QAEA,CAAAxB,QAAA,CAAAP,UAAA,CAAAgC,QAAA,UAAAhC,UAAA,CAAAiC,MAAA,CAAAC,OAAA,CAAAC,QAAA,CAAAhC,IAAA,EACA,KAAAkC,YAAA,gBACAH,OAAA,MAAAI,KAAA,CAAAJ,OAAA,CAAAlC,UAAA,CAAAkC,OAAA,EAAA/B,IAAA,CAAAA,IAAA,KACA,IAAAoC,MAAA,IAAAC,aAAA,CAAAN,OAAA,CAAAM,aAAA,CAAAC,gBAAA,MAAAA,gBAAA,CAAAG,MAAA,CAAAxC,OAAA,CAUA,MAPA,CAAAmC,MAAA,wHACAE,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,sBAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,2BAAA7B,OAAA,IACA,mGACAqC,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,UAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,eAAA7B,OAAA,IACA,qFACAqC,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,QAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,aAAA7B,OAAA,IACA,sBACAmC,MACA,GA2BAwqB,OAAA,CAAArwB,aAAA,EACAW,IAAA,WAIAC,KAAA,EAWA,SAAAiZ,UAAA,EACA,MAAAtH,WAAA,CAAAtP,UAAA,CAAAwN,cAAA,GACA,qBAAA8B,WAAA,CAAAm2C,YAAA,CACA,OAAAn2C,WAAA,CAAAm2C,YAAA,CACA,KAGA,CAAAtmC,WAAA,CAAAnf,UAAA,CAAAoL,cAAA,GACAs6C,cAAA,CAAAvmC,WAAA,CAAA1e,OAAA,KACA,QAAAilD,cAAA,CAAAD,YACA,CAKA,SAAA1M,aAAA,EACAniC,SAAA,GACAhZ,IAAA,CAAAqd,IAAA,GAEArd,IAAA,CAAAqe,IAAA,EAEA,CAKA,SAAA0pC,cAAA,EACA,KAAA/nD,IAAA,CAAAgd,QAAA,cAEA2D,KAAA,CAAAytB,MAAA,CAAApuC,IAAA,CAAAgoD,KAAA,EACArnC,KAAA,CAAA64B,QAAA,CAAAx5C,IAAA,CAAAgoD,KAAA,EAMAhoD,IAAA,CAAA+3C,MAAA,CAAAC,OAAA,IAJAh4C,IAAA,CAAAG,MAAA,CAAA8nD,GAAA,KAAAjnD,KAAA,GACAhB,IAAA,CAAA+3C,MAAA,CAAAE,MAAA,GACAiQ,OAAA,CAAAC,YAAA,CAAAnoD,IAAA,CAAAgoD,KAAA,GAKA,MAjDA,CAAAhoD,IAAA,MACAoC,UAAA,MAAAnC,aAAA,GACA4P,iBAAA,CAAAzN,UAAA,CAAAsL,UAAA,GACAoC,eAAA,EAAAD,iBAAA,CAAAV,SAAA,WAAAY,OAAA,QACAm4C,OAAA,CAAAP,cAAA,gBAgDA,KAAA5P,MAAA,MAAA33C,aAAA,GAAA05C,UAAA,GAAAC,WAAA,EACA/1B,OAAA,WACAC,KAAA,CAAA/iB,EAAA,oBACA2iB,IAAA,OACApS,IAAA,CAAAvQ,EAAA,WACA,GAGA,KAAA62C,MAAA,CAAAz0C,EAAA,qBACAtD,IAAA,CAAA2kB,OAAA,CAAA3kB,IAAA,CAAA+3C,MAAA,CAAAj0C,UAAA,GACA9D,IAAA,CAAAgoD,KAAA,CAAAz4C,GAAA,CAAAq4C,UAAA,IAAAQ,QAAA,CAAApoD,IAAA,CAAA2kB,OAAA,EACA3kB,IAAA,CAAAG,MAAA,CAAAH,IAAA,CAAA2kB,OAAA,CAAArkB,IAAA,wCACAN,IAAA,CAAAqoD,OAAA,CAAAroD,IAAA,CAAA2kB,OAAA,CAAArkB,IAAA,0CACAN,IAAA,CAAAsoD,OAAA,CAAAtoD,IAAA,CAAA2kB,OAAA,CAAArkB,IAAA,wCACA4nD,OAAA,CAAAK,gBAAA,CAAAvoD,IAAA,CAAAgoD,KAAA,EAGAhoD,IAAA,CAAAqoD,OAAA,CAAA/kD,EAAA,oBACAqd,KAAA,CAAAtC,IAAA,CAAAre,IAAA,CAAAgoD,KAAA,EACAhoD,IAAA,CAAA+3C,MAAA,CAAAC,OAAA,EACA,GAGAh4C,IAAA,CAAAsoD,OAAA,CAAAhlD,EAAA,oBACA,IAAAksB,OAAA,CAAAxvB,IAAA,CAAAG,MAAA,CAAA8nD,GAAA,GACAz4B,OAAA,GACAxvB,IAAA,CAAAmf,OAAA,GACAnf,IAAA,CAAA+3C,MAAA,CAAAC,OAAA,GACA51C,UAAA,CAAA6rB,QAAA,GAAAkrB,cAAA,YACA3pB,OAAA,CAAAA,OACA,GAAAjC,IAAA,YACA5M,KAAA,CAAAtC,IAAA,CAAAre,IAAA,CAAAgoD,KAAA,EACAhoD,IAAA,CAAAqf,MAAA,EACA,GAAAuP,KAAA,YACAjO,KAAA,CAAAtC,IAAA,CAAAre,IAAA,CAAAgoD,KAAA,EACAhoD,IAAA,CAAAqf,MAAA,EACA,GAEA,EACA,GAGA,KAAA04B,MAAA,CAAAz0C,EAAA,kBAAAgL,CAAA,EAEAiB,GAAA,CAAAjB,CAAA,CAAAC,MAAA,EAAA7N,OAAA,mCAAAC,MAAA,GAGA2N,CAAA,CAAAoW,cAAA,GACAtiB,UAAA,CAAA4B,OAAA,iBACA,GACA6L,iBAAA,CAAAQ,cAAA,EACAP,eAAA,CAAAs+B,MAAA,EACA/+B,QAAA,CAAAkB,GAAA,CAAAd,eAAA,CAAAe,YAAA,CAAAV,eAAA,CAAAs+B,MAAA,MAAAr+B,OAAA,kBACA3N,UAAA,CAAA4B,OAAA,gBACA,GACAyM,UAAA,GACA,GAKA0qC,YAAA,GACA,KAAAh8B,OAAA,GAGA/c,UAAA,CAAAkB,EAAA,YAAA63C,YAAA,EAAA73C,EAAA,qCACAtD,IAAA,CAAAqf,MAAA,EACA,GAAA/b,EAAA,sCACAtD,IAAA,CAAAmf,OAAA,EACA,GAAA7b,EAAA,2BACA0V,SAAA,IACA+uC,aAAA,EAEA,EACA,EAIA/4C,OAAA,UAAAA,QAAA,EACAK,QAAA,CAAAJ,MAAA,UAAAc,OAAA,KACA,EAIAsP,MAAA,UAAAA,OAAA,EACA,KAAA04B,MAAA,CAAA14B,MAAA,EACA,EAIAF,OAAA,UAAAA,QAAA,EACA,KAAA6oC,KAAA,EACArnC,KAAA,CAAAtC,IAAA,MAAA2pC,KAAA,EAEA,KAAAjQ,MAAA,CAAA54B,OAAA,GACA,KAAA44B,MAAA,CAAAC,OAAA,EACA,EAIA36B,IAAA,UAAAA,KAAA,EACA,KAAA06B,MAAA,CAAA16B,IAAA,EACA,EAIAgB,IAAA,UAAAA,KAAA,EACA,KAAA2pC,KAAA,EACArnC,KAAA,CAAAtC,IAAA,MAAA2pC,KAAA,EAEA,KAAAjQ,MAAA,CAAA15B,IAAA,EACA,CACA,GAEA,OAAAmR,OAEA,GAEAvwB,MCzOA,oOAAAsQ,GAAA,CAAArQ,CAAA,CAAAyhB,KAAA,CAAA6nC,aAAA,CAAAC,SAAA,CAAAtpD,aAAA,CAAAsD,UAAA,CAAAC,QAAA,eAgCA,SAAAgmD,SAAA9lD,IAAA,CAAAC,OAAA,CAAAC,QAAA,EACA,IAAAC,IAAA,CAAAC,QAAA,CAAAJ,IAAA,CAAAC,OAAA,EACA,OAAAC,QAAA,KAAAC,IAAA,CAAAE,CAAA,CAAAF,IAAA,CACA,CA+BA,SAAA4lD,UAAAh5C,MAAA,EACAgR,KAAA,CAAAtD,IAAA,CAAA1N,MAAA,CAAAmmB,QAAA,CAAA7hB,MAAA,EACAtE,MAAA,CAAA3L,OAAA,cACAuL,GAAA,CAAA0X,MAAA,EAAA3jB,EAAA,WAAAqM,MAAA,CAAAI,OAAA,KAAA7Q,CAAA,CAAA4oC,QAAA,CAAA5oC,CAAA,CAAA0pD,OAAA,CAAAC,YAAA,CAAAl5C,MAAA,MACA,CAOA,SAAAm5C,UAAAn5C,MAAA,EACAgR,KAAA,CAAAtC,IAAA,CAAA1O,MAAA,CAAAmmB,QAAA,CAAA7hB,MAAA,EACAtE,MAAA,CAAA3L,OAAA,cACAuL,GAAA,CAAA0X,MAAA,EAAAjP,GAAA,WAAArI,MAAA,CAAAI,OAAA,KACA,CAQA,SAAAg5C,cAAAp5C,MAAA,EACA,IAAAq5C,SAAA,EAAAroC,KAAA,CAAA64B,QAAA,CAAA7pC,MAAA,CAAAmmB,QAAA,CAAA7hB,MAAA,KAIA,MAHA,CAAA+0C,SAAA,EACAF,SAAA,CAAAn5C,MAAA,EAEAq5C,SACA,CAOA,SAAAC,gBAAAt5C,MAAA,EAIA,SAAA0Z,gBAAA/a,CAAA,EACAA,CAAA,CAAA8a,wBAAA,GACA9a,CAAA,CAAA+a,eAAA,EACA,IANA,CAAAzK,SAAA,KAAAjP,MAAA,CAAAI,OAAA,KACAm5C,UAAA,qGAAAzwB,IAAA,IAAA7Z,SAAA,KAAAA,SAAA,CACAuqC,UAAA,CAAAjqD,CAAA,CAAA0pD,OAAA,CAAAE,SAAA,CAAAn5C,MAAA,EAKAA,MAAA,CAAAmmB,QAAA,CAAAszB,QAAA,CAAApxC,GAAA,CAAA4G,SAAA,EAAAtb,EAAA,SAAAsb,SAAA,GAAAuqC,UAAA,EAAA7lD,EAAA,CAAA4lD,UAAA,CAAA7/B,eAAA,EACA1Z,MAAA,CAAAmmB,QAAA,CAAA7hB,MAAA,CAAA+D,GAAA,CAAA4G,SAAA,EAAAtb,EAAA,SAAAsb,SAAA,iBAAAuqC,UAAA,EAAA7lD,EAAA,CAAA4lD,UAAA,CAAA7/B,eAAA,CACA,CAMA,SAAAw/B,aAAAl5C,MAAA,EACA,IAAAqH,QAAA,CAAArH,MAAA,CAAAmmB,QAAA,CAAA9e,QAAA,CACArH,MAAA,CAAA05C,MAAA,CAAAC,OAAA,CAAAtyC,QAAA,CAAAgV,KAAA,GAAAhV,QAAA,CAAA8P,MAAA,GACA,CAvHAvX,GAAA,CAAAA,GAAA,EAAA9P,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA2P,GAAA,YAAAA,GAAA,YAAAA,GAAA,CACArQ,CAAA,CAAAA,CAAA,EAAAO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAV,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACAyhB,KAAA,CAAAA,KAAA,EAAAlhB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA+gB,KAAA,YAAAA,KAAA,YAAAA,KAAA,CACA6nC,aAAA,CAAAA,aAAA,EAAA/oD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA4oD,aAAA,YAAAA,aAAA,YAAAA,aAAA,CACAC,SAAA,CAAAA,SAAA,EAAAhpD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6oD,SAAA,YAAAA,SAAA,YAAAA,SAAA,CACAtpD,aAAA,CAAAA,aAAA,EAAAM,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAT,aAAA,YAAAA,aAAA,YAAAA,aAAA,CACAsD,UAAA,CAAAA,UAAA,EAAAhD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6C,UAAA,YAAAA,UAAA,YAAAA,UAAA,CACAC,QAAA,CAAAA,QAAA,EAAAjD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA8C,QAAA,YAAAA,QAAA,YAAAA,QAAA,CAEAA,QAAA,CAAA8B,aAAA,GACA9B,QAAA,CAAAD,UAAA,EACAC,QAAA,CAAA8B,aAAA,QAEA,CAAAxB,QAAA,CAAAP,UAAA,CAAAgC,QAAA,UAAAhC,UAAA,CAAAiC,MAAA,CAAAC,OAAA,CAAAC,QAAA,CAAAhC,IAAA,EACA,KAAAkC,YAAA,gBACAH,OAAA,MAAAI,KAAA,CAAAJ,OAAA,CAAAlC,UAAA,CAAAkC,OAAA,EAAA/B,IAAA,CAAAA,IAAA,KACA,IAAAoC,MAAA,IAAAG,YAAA,YAAAD,gBAAA,MAAAA,gBAAA,CAAAE,MAAA,CAAAC,MAAA,CAYA,MATA,CAAAL,MAAA,iNACAK,MAAA,CAAAV,OAAA,CAAAsf,KAAA,EAAA7e,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAuf,KAAA,CAAA7e,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,wHACAC,MAAA,CAAAV,OAAA,CAAAkoC,OAAA,EAAAznC,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAmoC,OAAA,CAAAznC,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,GACAD,MAAA,MAAAA,MAAA,IAAAJ,MAAA,EAAAI,MAAA,EACAJ,MAAA,8EACAA,MACA,GA4BA8Y,UAAA,kBAiEA0qC,aAAA,CAAAnuC,gBAAA,OAAAouC,SAAA,EAKA,IAAAc,cAAA,CAAApqD,aAAA,EACAW,IAAA,CAAAge,UAAA,CAIA/d,IAAA,UAAAA,KAAA,EAUA,SAAAypD,cAAA5mD,IAAA,EACA,KAAA5C,IAAA,CAAAgd,QAAA,cACA2rC,SAAA,CAAA3oD,IAAA,EACAA,IAAA,CAAA81B,QAAA,CAAA1Y,MAAA,CAAA3L,IAAA,CAAA7O,IAAA,CAAAsM,KAAA,EACA25C,YAAA,CAAA7oD,IAAA,EACAA,IAAA,CAAAqpD,MAAA,CAAAlK,IAAA,CAAAv8C,IAAA,CAAAuZ,QAAA,QAEA,IAhBA,CAAAnc,IAAA,MACAoC,UAAA,MAAAnC,aAAA,GACAgU,MAAA,CAAA1E,GAAA,CAAAm5C,QAAA,IAeA,KAAA5yB,QAAA,EACA7hB,MAAA,CAAAA,MAAA,CACAm1C,QAAA,CAAAn1C,MAAA,CAAA3T,IAAA,oBACA8c,MAAA,CAAAnJ,MAAA,CAAA3T,IAAA,kBACA0W,QAAA,CAAA/C,MAAA,CAAA3T,IAAA,mBACA,EACA,KAAA+oD,MAAA,CAAAb,aAAA,EACAtC,QAAA,MAAApwB,QAAA,CAAA9e,QAAA,CACAjW,OAAA,IACA0oD,UAAA,IACAC,WAAA,GACA,GAGAtnD,UAAA,CAAAkB,EAAA,qCACAtD,IAAA,CAAAqf,MAAA,EACA,GAAA/b,EAAA,yBACAtD,IAAA,CAAAI,aAAA,GAAAC,cAAA,GAAAyR,MAAA,CAAA9R,IAAA,CAAA81B,QAAA,CAAA7hB,MAAA,EAAA+D,GAAA,KAAAhY,IAAA,CAAA+P,OAAA,MAAAzM,EAAA,iBAAAtD,IAAA,CAAA+P,OAAA,cAAA7L,KAAA,EACA,IAAAtB,IAAA,CAAAsB,KAAA,CAAAylD,aAAA,CAAAC,MAAA,CACAJ,aAAA,CAAA5mD,IAAA,CACA,GACAqmD,eAAA,CAAAjpD,IAAA,CACA,GAAAsD,EAAA,mBACAylD,aAAA,CAAA/oD,IAAA,CACA,GAAAsD,EAAA,mBACAylD,aAAA,CAAA/oD,IAAA,CACA,GAAAsD,EAAA,sCACAtD,IAAA,CAAAmf,OAAA,EACA,GAAA7b,EAAA,gCAAAV,IAAA,EACA4mD,aAAA,CAAA5mD,IAAA,CACA,EACA,EAIAkO,MAAA,UAAAA,OAAA,IAIA9B,OAAA,UAAAA,QAAA,EACA,KAAA5O,aAAA,GAAAC,cAAA,GAAA2X,GAAA,UAAAjI,OAAA,MACA,KAAAs5C,MAAA,EACA,KAAAA,MAAA,CAAAr6C,OAAA,GAEA,KAAA8mB,QAAA,CAAA7hB,MAAA,EACA,KAAA6hB,QAAA,CAAA7hB,MAAA,CAAAhF,MAAA,GAEA,KAAAo6C,MAAA,MACA,KAAAvzB,QAAA,GACA,EAIAzW,MAAA,UAAAA,OAAA,IAIAF,OAAA,UAAAA,QAAA,EACA4pC,aAAA,MACA,EAIA1rC,IAAA,UAAAA,KAAA,IAIAgB,IAAA,UAAAA,KAAA,EACA0qC,aAAA,MACA,CACA,GAEA,OAAAQ,cAEA,GAEAtqD,MCpOA,2HAAAC,CAAA,CAAA+D,CAAA,CAAA4mD,UAAA,CAAAC,kBAAA,eAoCA,SAAAC,aAAA,EACA,GACA,CAAAC,SAAA,IADAp2C,CAAA,CAEA,IAAAA,CAAA,GAAAA,CAAA,CAAAiqC,SAAA,CAAAoM,UAAA,CAAAr2C,CAAA,GACAo2C,SAAA,CAAAl3C,IAAA,CAAA+qC,SAAA,CAAAiB,UAAA,CAAAlrC,CAAA,GAEA,OAAAo2C,SACA,CAKA,SAAAE,iBAAA,EAEAzvB,UAAA,YACAojB,SAAA,CAAAsM,eAAA,EACA,MACA,CAWA,SAAAC,uBAAAvnD,OAAA,KAKA,CAAA+K,OAAA,IAOAy8C,cAAA,IAKAC,eAAA,CAAAR,kBAAA,EACArmC,SAAA,CAAA5gB,OAAA,CAAA4gB,SAAA,uBACA8mC,iBAAA,CAAA1nD,OAAA,CAAA0nD,iBAAA,kBACAC,mBAAA,CAAA3nD,OAAA,CAAA2nD,mBAAA,KACAC,YAAA,GACA,GAgCA,MA7BA,CAAAxnD,CAAA,CAAAkZ,QAAA,EAAA7Y,EAAA,kCACA+mD,cAAA,GAAAxM,SAAA,CAAA6M,WAAA,GACAJ,eAAA,CAAAK,eAAA,CAAAZ,YAAA,IACAG,gBAAA,GAEA,GAIAjnD,CAAA,CAAAkZ,QAAA,EAAA7Y,EAAA,mCACA+mD,cAAA,GAAAxM,SAAA,CAAA6M,WAAA,EACAJ,eAAA,CAAAK,eAAA,CAAAZ,YAAA,GAEA,GAKA,mBAAAzqD,IAAA,CAAAC,SAAA,CAAAC,SAAA,IAAAynB,MAAA,CAAA2jC,QAAA,EACA3nD,CAAA,CAAAkZ,QAAA,EAAA7Y,EAAA,8BACA+mD,cAAA,GACAQ,aAAA,CAAA3rD,CAAA,CAAAosB,KAAA,CAAAy+B,YAAA,OAEA,GAMAF,UAAA,EAIAxqC,MAAA,UAAAA,OAAA,EACAzR,OAAA,GACA,EAIAuR,OAAA,UAAAA,QAAA,EACAvR,OAAA,GACA,EAKAoL,SAAA,UAAAA,UAAA,EACA,OAAApL,OACA,EAKAk9C,kBAAA,UAAAA,mBAAAC,IAAA,EASA,MARA,CAAAV,cAAA,CAAAU,IAAA,CACAV,cAAA,EACA,KAAArmD,OAAA,UACAf,CAAA,kBAAA+tC,WAAA,4BAEA,KAAAhtC,OAAA,QACAf,CAAA,kBAAA+tC,WAAA,2BAEA,IACA,EAIAga,SAAA,UAAAA,UAAA,EACAX,cAAA,CAeA,KAAAS,kBAAA,KAdAjN,SAAA,CAAA6M,WAAA,CAKAG,aAAA,MAAAA,aAAA,IAAA5Z,SAAA,EACA,KAAA6Z,kBAAA,KACAR,eAAA,CAAAK,eAAA,CAAAE,aAAA,EACA,KAAAC,kBAAA,KACAZ,gBAAA,IAEA,KAAAY,kBAAA,MAVA,KAAAA,kBAAA,KACAR,eAAA,CAAAK,eAAA,CAAAZ,YAAA,IACA,KAAAe,kBAAA,KACAZ,gBAAA,GAYA,EAKAe,YAAA,UAAAA,aAAAj+C,KAAA,EACAA,KAAA,IAAAA,KAAA,CAAArM,MAAA,EACA2pD,eAAA,CAAAY,kBAAA,CAAAl+C,KAAA,CAEA,EAKAm+C,QAAA,UAAAA,SAAA,EACA,OAAAb,eAAA,CAAAc,iBAAA,EACA,EAIAC,eAAA,UAAAA,gBAAA,EACAf,eAAA,CAAAe,eAAA,GACAxN,SAAA,CAAAsM,eAAA,EACA,EAKAmB,KAAA,UAAAA,MAAA,EACA,OAAAzoD,OAAA,CAAA+D,EACA,CACA,EACA,CA5MA1H,CAAA,CAAAA,CAAA,EAAAO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAV,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACA+D,CAAA,CAAAA,CAAA,EAAAxD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAqD,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACA4mD,UAAA,CAAAA,UAAA,EAAApqD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAiqD,UAAA,YAAAA,UAAA,YAAAA,UAAA,CACAC,kBAAA,CAAAA,kBAAA,EAAArqD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAkqD,kBAAA,YAAAA,kBAAA,YAAAA,kBAAA,IAmBA,CAAAe,aAAA,IACAhN,SAAA,CACA,IAAA52B,MAAA,CAAA62B,YAAA,WAAA9rB,KAAA,4CAsLA,MArLA,CAAA6rB,SAAA,CAAA52B,MAAA,CAAA62B,YAAA,GAqLAsM,sBAEA,GAEAnrD,MCpNA,+HAAA6qD,kBAAA,eAEAA,kBAAA,CAAAA,kBAAA,EAAArqD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAkqD,kBAAA,YAAAA,kBAAA,YAAAA,kBAAA,IA0BA,CAAAyB,YAAA,IAMAC,qBAAA,UAAAA,sBAAA,EACA,OAUAC,cAAA,UAAAA,eAAA5oD,OAAA,EACA,IAAA6oD,EAAA,CAAA5B,kBAAA,CAAAjnD,OAAA,EAEA,MADA,CAAA0oD,YAAA,CAAAz4C,IAAA,CAAA44C,EAAA,EACAA,EACA,EAMAC,kBAAA,UAAAA,mBAAA/kD,EAAA,EACA,OAAA2kD,YAAA,CAAAjrD,IAAA,UAAAorD,EAAA,EACA,OAAAA,EAAA,CAAAJ,KAAA,KAAA1kD,EACA,EACA,EAKAglD,kBAAA,UAAAA,mBAAA,EACA,OAAAL,YACA,EAKAM,kBAAA,UAAAA,mBAAA,EACA,OAAAN,YAAA,GACA,EAKAO,sBAAA,UAAAA,uBAAA,EACA,OAAAP,YAAA,CAAAnhD,KAAA,GACA,EAKA2hD,SAAA,UAAAA,UAAA,EACA,OAAAR,YAAA,CAAA5qD,MACA,EAKA6sB,KAAA,UAAAA,MAAA,EAEA,MADA,CAAA+9B,YAAA,IACA,IACA,CACA,CACA,EAEA,OAAAC,qBAEA,GAEAvsD,MCvGA,mSAAAgE,CAAA,CAAA/D,CAAA,CAAAgC,EAAA,CAAAiwB,aAAA,CAAAhyB,aAAA,CAAAkQ,QAAA,CAAAI,eAAA,CAAAu8C,UAAA,CAAAR,qBAAA,CAAAp+C,SAAA,eAEAnK,CAAA,CAAAA,CAAA,EAAAxD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAqD,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACA/D,CAAA,CAAAA,CAAA,EAAAO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAV,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACAgC,EAAA,CAAAA,EAAA,EAAAzB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAsB,EAAA,YAAAA,EAAA,YAAAA,EAAA,CACAiwB,aAAA,CAAAA,aAAA,EAAA1xB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAuxB,aAAA,YAAAA,aAAA,YAAAA,aAAA,CACAhyB,aAAA,CAAAA,aAAA,EAAAM,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAT,aAAA,YAAAA,aAAA,YAAAA,aAAA,CACAkQ,QAAA,CAAAA,QAAA,EAAA5P,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAyP,QAAA,YAAAA,QAAA,YAAAA,QAAA,CACAI,eAAA,CAAAA,eAAA,EAAAhQ,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6P,eAAA,YAAAA,eAAA,YAAAA,eAAA,CACAu8C,UAAA,CAAAA,UAAA,EAAAvsD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAosD,UAAA,YAAAA,UAAA,YAAAA,UAAA,CACAR,qBAAA,CAAAA,qBAAA,EAAA/rD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA4rD,qBAAA,YAAAA,qBAAA,YAAAA,qBAAA,CACAp+C,SAAA,CAAAA,SAAA,EAAA3N,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAwN,SAAA,YAAAA,SAAA,YAAAA,SAAA,CAuBA,IAAAuC,MAAA,CAAAxQ,aAAA,EACAW,IAAA,eAKAqgB,OAAA,UAAAA,QAAA,EACA,IAAA/d,UAAA,MAAAnC,aAAA,GAGAmC,UAAA,CAAAkvB,YAAA,GAAAC,WAAA,MAAAxhB,OAAA,GACA,EAKAhQ,IAAA,UAAAA,KAAA,EA0FA,SAAAk7C,gBAAA,EAEA,OAAA7tC,SAAA,CAAAjF,eAAA,CAAA/F,UAAA,CAAAmL,UAAA,GAAAnL,UAAA,CAAAoL,cAAA,GAAA7F,cAAA,kBACA,CAKA,SAAAwzC,aAAA,EACAF,eAAA,GACAj7C,IAAA,CAAAqd,IAAA,GAEArd,IAAA,CAAAqe,IAAA,EAEA,CAOA,SAAAwvB,SAAA,EACA,OAAAzrC,UAAA,CAAAkvB,YAAA,GAAAuc,QAAA,CAAA7tC,IAAA,CAAA+P,OAAA,GACA,MAhHA,CAAA/P,IAAA,MACAoC,UAAA,MAAAnC,aAAA,GACA4P,iBAAA,CAAAzN,UAAA,CAAAsL,UAAA,GACAoC,eAAA,EAAAD,iBAAA,CAAAV,SAAA,WAAAY,OAAA,QACA,IAAAk8C,aAAA,IACA,MAAA76B,MAAA,CAAAD,aAAA,sBAMA,IAAAo6B,YAAA,CAAAC,qBAAA,GA0GA,MAvGA,CAAAD,YAAA,CAAAE,cAAA,EACAhoC,SAAA,sBACA8mC,iBAAA,iBACAC,mBAAA,kBACA5jD,EAAA,mBACA,GAGA,KAAAslD,UAAA,MAAA9rD,aAAA,GAAA05C,UAAA,GAAAC,WAAA,EACA91B,KAAA,CAAA/iB,EAAA,mBACA2iB,IAAA,eACAG,OAAA,qBACAE,IAAA,EACAioC,OAAA,SACAj9C,KAAA,CAAAhO,EAAA,2BACA,EACAuQ,IAAA,CAAAvQ,EAAA,aACA,GACA,KAAAkrD,YAAA,MAAAhsD,aAAA,GAAA05C,UAAA,GAAAC,WAAA,EACA91B,KAAA,CAAA/iB,EAAA,gCACA2iB,IAAA,cACAG,OAAA,mBACAE,IAAA,EACAhV,KAAA,CAAAhO,EAAA,wCACA,EACAuQ,IAAA,CAAAvQ,EAAA,oBACA,GAGA,KAAAgrD,UAAA,CAAA5oD,EAAA,sBAAAgL,CAAA,EAEAA,CAAA,CAAAoW,cAAA,GACAu2B,eAAA,IACA/7C,CAAA,CAAAyE,OAAA,CAAA4nD,YAAA,CAAAK,kBAAA,YAAA/vC,QAAA,EACAA,QAAA,CAAA7C,SAAA,IACA6C,QAAA,CAAAmvC,SAAA,EAEA,EAEA,GACA,KAAAoB,YAAA,CAAA9oD,EAAA,kBAAAgL,CAAA,EACAA,CAAA,CAAAoW,cAAA,GACAu2B,eAAA,KACA/7C,CAAA,CAAAyE,OAAA,CAAA4nD,YAAA,CAAAK,kBAAA,YAAA/vC,QAAA,EACAA,QAAA,CAAA7C,SAAA,IACA6C,QAAA,CAAAwvC,eAAA,EAEA,GACAjpD,UAAA,CAAA4B,OAAA,UAEA,GACA6L,iBAAA,CAAAQ,cAAA,EACAP,eAAA,CAAAs+B,MAAA,EACA/+B,QAAA,CAAAkB,GAAA,CAAAd,eAAA,CAAAe,YAAA,CAAAV,eAAA,CAAAs+B,MAAA,MAAAr+B,OAAA,kBACAkrC,eAAA,IACA/7C,CAAA,CAAAyE,OAAA,CAAA4nD,YAAA,CAAAK,kBAAA,YAAA/vC,QAAA,EACAA,QAAA,CAAA7C,SAAA,IACA6C,QAAA,CAAAmvC,SAAA,EAEA,EAEA,GACAv6C,UAAA,IACAC,OAAA,GACA,GAKA,KAAAyO,OAAA,GAkCA0uB,QAAA,GAAAtgB,IAAA,UAAA8+B,gBAAA,EAQA,SAAAC,cAAA9pC,MAAA,CAAA1C,GAAA,KACA,CAAAjE,QAAA,CACA0wC,eAAA,QACA/pC,MAAA,EAGA1C,GAAA,CAAA0C,MAAA,CACA3G,QAAA,CAAA0vC,YAAA,CAAAM,kBAAA,IAHAhwC,QAAA,CAAA0vC,YAAA,CAAAI,kBAAA,CAAA7rC,GAAA,EAKA,CAAAjE,QAAA,EAAA2E,OAAA,CAAAC,OAAA,MACA8rC,eAAA,CAAA1wC,QAAA,CAAAsvC,QAAA,MACAlQ,eAAA,IAAAgR,aAAA,EAAAnsC,GAAA,IACAsR,MAAA,CAAAiV,KAAA,WAAAkmB,eAAA,CAAA5rD,MAAA,sBAAAmf,GAAA,IACAusC,gBAAA,CAAAj6B,OAAA,CAAAtS,GAAA,CAAAysC,eAAA,GAGA,CAOA,SAAAC,QAAA,EACA,IAAAC,mBAAA,CAAAlB,YAAA,CAAAO,sBAAA,GACA,OAAAtrC,OAAA,CAAAob,GAAA,CAAA18B,CAAA,CAAAutD,mBAAA,EAAA/iD,MAAA,UAAAmS,QAAA,EACA,OAAAA,QAAA,CAAA7C,SAAA,EACA,GAAA9S,GAAA,UAAA2V,QAAA,EACA,IAAAiE,GAAA,CAAAjE,QAAA,CAAAyvC,KAAA,GACA,OAAAgB,aAAA,MAAAxsC,GAAA,CACA,GAAAvd,KAAA,IAAAgrB,IAAA,UAAAsO,OAAA,EAGA,IAAArZ,MAAA,CAAApgB,UAAA,CAAAoL,cAAA,GAAA7F,cAAA,CACA,OAAA2kD,aAAA,CAAA9pC,MAAA,GAAAtjB,CAAA,CAAAwtD,KAAA,CAAA7wB,OAAA,CACA,EACA,CASA,SAAA8wB,cAAAnqC,MAAA,CAAA1C,GAAA,EACA,IAAAjE,QAAA,OACA,CAAA2G,MAAA,EAGA1C,GAAA,CAAA0C,MAAA,CACA3G,QAAA,CAAA0vC,YAAA,CAAAM,kBAAA,IAHAhwC,QAAA,CAAA0vC,YAAA,CAAAI,kBAAA,CAAA7rC,GAAA,EAKAjE,QAAA,CACAwwC,gBAAA,CAAA3kD,OAAA,CAAAoY,GAAA,EAAAyN,IAAA,UAAAvgB,KAAA,EACAA,KAAA,GACAokB,MAAA,CAAAiV,KAAA,YAAAr5B,KAAA,CAAArM,MAAA,uBAAAmf,GAAA,IACAmsC,aAAA,IACApwC,QAAA,CAAAovC,YAAA,CAAAj+C,KAAA,EAEA,GAAAugB,IAAA,YAGA1R,QAAA,CAAAvY,EAAA,uBACA,OAAAgpD,aAAA,CAAA9pC,MAAA,CAAA1C,GAAA,CACA,EACA,GAbAU,OAAA,CAAAC,OAAA,IAcA,CAGAre,UAAA,CAAAkB,EAAA,YAAA63C,YAAA,EAAA73C,EAAA,qCACAtD,IAAA,CAAAqf,MAAA,GACA47B,eAAA,IACA/7C,CAAA,CAAAyE,OAAA,CAAA4nD,YAAA,CAAAK,kBAAA,YAAA/vC,QAAA,EACAA,QAAA,CAAA7C,SAAA,IACA6C,QAAA,CAAAvY,EAAA,UAAAwnD,kBAAA,KAAAzrC,MAAA,EAEA,EAEA,GAAA/b,EAAA,4BAEA,CAAAkf,MAAA,CAAApgB,UAAA,CAAAoL,cAAA,GAAA7F,cAAA,CADAy5B,WAAA,CAEA5e,MAAA,EAAAy4B,eAAA,KACAgR,aAAA,IACAV,YAAA,CAAAM,kBAAA,GAAAxsC,MAAA,GAEAstC,aAAA,CAAAnqC,MAAA,EAGA4e,WAAA,CAAA4qB,UAAA,CAAA9qB,mBAAA,CAAA9+B,UAAA,EAGAlD,CAAA,CAAAyE,OAAA,CAAAy9B,WAAA,UAAAwrB,gBAAA,EACA,IAAAC,eAAA,CAAAtB,YAAA,CAAAI,kBAAA,CAAAiB,gBAAA,EAEAC,eAAA,GACAA,eAAA,CAAAtB,YAAA,CAAAE,cAAA,EACAhoC,SAAA,sBACA8mC,iBAAA,4BAAAqC,gBAAA,KACAhmD,EAAA,CAAAgmD,gBACA,IAEAC,eAAA,CAAAxtC,MAAA,GAEAstC,aAAA,MAAAC,gBAAA,CACA,GAEA,GAAA1sD,KAAA,yBAEA,MAAA2b,QAAA,CAAA0vC,YAAA,CAAAM,kBAAA,GACAhwC,QAAA,CAAA7C,SAAA,IACA6C,QAAA,CAAAvY,EAAA,oBACAtD,IAAA,CAAAksD,UAAA,CAAAjU,MAAA,GACAj4C,IAAA,CAAAksD,UAAA,CAAAzc,UAAA,CAAA3uC,IAAA,wBACAd,IAAA,CAAAgE,OAAA,UACAioD,aAAA,GACA,GAAA3oD,EAAA,kBACAtD,IAAA,CAAAksD,UAAA,CAAAlU,OAAA,GACAh4C,IAAA,CAAAksD,UAAA,CAAAzc,UAAA,CAAA3uC,IAAA,yBACAd,IAAA,CAAAgE,OAAA,OACA,EAEA,GAAA9D,KAAA,gCACAssD,OAAA,EACA,GAAAzsC,MAAA,gCACA,OAAAysC,OAAA,EACA,GAAAlpD,EAAA,sCACAtD,IAAA,CAAAmf,OAAA,GACA87B,eAAA,IACA/7C,CAAA,CAAAyE,OAAA,CAAA4nD,YAAA,CAAAK,kBAAA,YAAA/vC,QAAA,EACAA,QAAA,CAAA7C,SAAA,IACA6C,QAAA,CAAA7D,GAAA,uBAAA8yC,kBAAA,KAAA3rC,OAAA,EAEA,EAEA,EACA,EACA,EAIAnQ,OAAA,UAAAA,QAAA,EACAK,QAAA,CAAAJ,MAAA,UAAAc,OAAA,MACA9M,CAAA,CAAAkZ,QAAA,EAAAnE,GAAA,gBACA,EAIAqH,MAAA,UAAAA,OAAA,EACA,KAAA6sC,UAAA,CAAA7sC,MAAA,GACA,KAAA+sC,YAAA,CAAA/sC,MAAA,EACA,EAIAF,OAAA,UAAAA,QAAA,EACA,KAAA+sC,UAAA,CAAA/sC,OAAA,GACA,KAAAitC,YAAA,CAAAjtC,OAAA,EACA,EAIA9B,IAAA,UAAAA,KAAA,EACA,KAAA6uC,UAAA,CAAA7uC,IAAA,GACA,KAAA+uC,YAAA,CAAA/uC,IAAA,EACA,EAIAgB,IAAA,UAAAA,KAAA,EACA,KAAA6tC,UAAA,CAAA7tC,IAAA,GACA,KAAA+tC,YAAA,CAAA/tC,IAAA,EACA,CACA,GAEA,OAAA1O,MAEA,GAEA1Q,MCnWA,6MAAAgE,CAAA,CAAA/D,CAAA,CAAAgC,EAAA,CAAA/B,aAAA,CAAAwhB,KAAA,CAAAmsC,YAAA,CAAAz9C,QAAA,CAAAI,eAAA,CAAAs9C,WAAA,eAEA9pD,CAAA,CAAAA,CAAA,EAAAxD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAqD,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACA/D,CAAA,CAAAA,CAAA,EAAAO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAV,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACAgC,EAAA,CAAAA,EAAA,EAAAzB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAsB,EAAA,YAAAA,EAAA,YAAAA,EAAA,CACA/B,aAAA,CAAAA,aAAA,EAAAM,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAT,aAAA,YAAAA,aAAA,YAAAA,aAAA,CACA2tD,YAAA,CAAAA,YAAA,EAAArtD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAktD,YAAA,YAAAA,YAAA,YAAAA,YAAA,CACAz9C,QAAA,CAAAA,QAAA,EAAA5P,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAyP,QAAA,YAAAA,QAAA,YAAAA,QAAA,CACAI,eAAA,CAAAA,eAAA,EAAAhQ,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6P,eAAA,YAAAA,eAAA,YAAAA,eAAA,CACAs9C,WAAA,CAAAA,WAAA,EAAAttD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAmtD,WAAA,YAAAA,WAAA,YAAAA,WAAA,CAuBA,IAAAC,iBAAA,CAAA7tD,aAAA,EACAW,IAAA,qBAIAqgB,OAAA,UAAAA,QAAA,EAEA,KAAAlgB,aAAA,GAAAqxB,YAAA,GAAAC,WAAA,MAAAxhB,OAAA,GACA,EAIAhQ,IAAA,UAAAA,KAAA,EA0BA,SAAAk5C,gBAAA,EACA,OAAAgU,YAAA,IAAA/tD,CAAA,CAAAqjB,IAAA,CAAA0qC,YAAA,CAAAC,SAAA,CACA,CAKA,SAAAC,aAAA,EACA,IAAAC,WAAA,CAAAN,YAAA,CAAAx5C,GAAA,UACAy5C,WAAA,CAAAK,WAAA,EAAAjO,IAAA,GACAliC,KAAA,EAAAA,KAAA,CAAAowC,aAAA,CACAC,WAAA,CAAArwC,KAAA,CAAAowC,aAAA,EAEAC,WAAA,CAAAF,WAAA,CAAAG,OAAA,CAEA,CAMA,SAAAD,YAAAE,OAAA,KACA,CAAAC,QAAA,CAAAxqD,CAAA,cACAyqD,aAAA,CAAAzwC,KAAA,CAAAowC,aAAA,CACApwC,KAAA,CAAAowC,aAAA,CAAAG,OAAA,CACAC,QAAA,EACAvuD,CAAA,CAAAqF,KAAA,YACAkpD,QAAA,CAAAzpD,OAAA,gBAAAiZ,KAAA,CAAAowC,aAAA,EACA,GAEArtD,IAAA,CAAA2tD,OAAA,EACA3tD,IAAA,CAAA2tD,OAAA,CAAAv7B,OAAA,eAAAo7B,OAAA,EAEAE,aAAA,GAAAzwC,KAAA,CAAAowC,aAAA,EACAjrD,UAAA,CAAA4B,OAAA,eAAAiZ,KAAA,CAAAowC,aAAA,CAAAK,aAAA,EAEAE,cAAA,CAAAjqD,OAAA,UAAAkqD,SAAA,EACAA,SAAA,CAAAvC,KAAA,KAAAkC,OAAA,CACAK,SAAA,CAAA5V,MAAA,GAEA4V,SAAA,CAAA7V,OAAA,EAEA,EACA,IApEA,CAAAh4C,IAAA,MACA8d,UAAA,MAAA/N,OAAA,GACA3N,UAAA,MAAAnC,aAAA,GACA4P,iBAAA,CAAAzN,UAAA,CAAAsL,UAAA,GACAoC,eAAA,EAAAD,iBAAA,CAAAV,SAAA,WAAAY,OAAA,QACA,MAAA8M,YAAA,MAAAzK,SAAA,GACA,KAAA07C,YAAA,CAAAhB,YAAA,CAAAiB,kBAAA,QACA,CAAA9wC,KAAA,EACA+wC,eAAA,IACAC,YAAA,IACAZ,aAAA,GACA,EACAO,cAAA,IACA/wC,YAAA,CAAAqxC,eAAA,EACApB,YAAA,CAAAqB,kBAAA,CAAAtxC,YAAA,CAAAqxC,eAAA,EAEA,MAAAjB,YAAA,CAAAH,YAAA,CAAAx5C,GAAA,cAuJA,MAtJA,CAAAuJ,YAAA,CAAAqxC,eAAA,QAAAJ,YAAA,EAAA5uD,CAAA,CAAA0iB,OAAA,CAAAqrC,YAAA,GACAE,YAAA,GAqDAF,YAAA,GACAA,YAAA,CAAAM,OAAA,GACAtwC,KAAA,CAAAgxC,YAAA,CAAAhB,YAAA,CAAAM,OAAA,CACAtwC,KAAA,CAAAowC,aAAA,CAAAJ,YAAA,CAAAM,OAAA,CACAD,WAAA,CAAAL,YAAA,CAAAM,OAAA,GAEAN,YAAA,CAAAC,SAAA,EACAhuD,CAAA,CAAAyE,OAAA,CAAAspD,YAAA,CAAAC,SAAA,UAAA3yB,KAAA,EACAtd,KAAA,CAAA+wC,eAAA,CAAAl7C,IAAA,EACAlM,EAAA,CAAA2zB,KAAA,CAAA3zB,EAAA,CACAsI,KAAA,CAAAhO,EAAA,CAAAq5B,KAAA,CAAAz6B,IAAA,CACA,EACA,IAKA,KAAAsuD,UAAA,MAAAhuD,aAAA,GAAA05C,UAAA,GAAAuU,UAAA,EACArqC,OAAA,kBACAC,KAAA,CAAA/iB,EAAA,oCACA2iB,IAAA,YACApS,IAAA,CAAAvQ,EAAA,YACA,GAAAhB,KAAA,eACA+4C,eAAA,IACAj5C,IAAA,CAAAqe,IAAA,EAEA,GAAA/a,EAAA,kBAAAgL,CAAA,EACAA,CAAA,CAAAoW,cAAA,GACAtiB,UAAA,CAAA4B,OAAA,6BACA,GAAAV,EAAA,uBACAlB,UAAA,CAAA4B,OAAA,gBAAA8Z,UAAA,GAAAb,KAAA,CAAAowC,aAAA,CACA,GAAA/pD,EAAA,wBACAlB,UAAA,CAAA4B,OAAA,iBAAA8Z,UAAA,GAAAb,KAAA,CAAAowC,aAAA,CACA,GAGApwC,KAAA,CAAA+wC,eAAA,CAAArqD,OAAA,UAAA42B,KAAA,EACA,IAAA+zB,UAAA,CAAAtuD,IAAA,CAAAI,aAAA,GAAA05C,UAAA,GAAAC,WAAA,EACAwU,IAAA,UACAvqC,OAAA,CAAAuW,KAAA,CAAA3zB,EAAA,CACAqd,KAAA,CAAAsW,KAAA,CAAArrB,KAAA,CACA2U,IAAA,WACApS,IAAA,CAAAvQ,EAAA,CAAAq5B,KAAA,CAAArrB,KAAA,CACA,GACAo/C,UAAA,CAAAE,SAAA,mBACAF,UAAA,CAAAhrD,EAAA,kBAAAgL,CAAA,EACA,IAAAk/C,OAAA,MAAArqD,MAAA,CAAA6gB,OAAA,CACA1V,CAAA,CAAAoW,cAAA,GACA1kB,IAAA,CAAAouD,UAAA,CAAAK,UAAA,GACA,KAAAxW,MAAA,GACAqV,WAAA,CAAAE,OAAA,CACA,GACAvwC,KAAA,CAAAgxC,YAAA,GAAA1zB,KAAA,CAAA3zB,EAAA,EACA0nD,UAAA,CAAAhrD,EAAA,qBACA,KAAA20C,MAAA,EACA,GAEA2V,cAAA,CAAA96C,IAAA,CAAAw7C,UAAA,CACA,GACAz+C,iBAAA,CAAAQ,cAAA,EACAP,eAAA,CAAAs+B,MAAA,EACA/+B,QAAA,CAAAkB,GAAA,CAAAd,eAAA,CAAAe,YAAA,CAAAV,eAAA,CAAAs+B,MAAA,MAAAr+B,OAAA,kBACA3N,UAAA,CAAA4B,OAAA,6BACA,GACAyM,UAAA,GACA,GAGAwoC,eAAA,IACA,KAAA56B,IAAA,GAIA,KAAAc,OAAA,GAGA/c,UAAA,CAAAkB,EAAA,uBACA21C,eAAA,GACAj5C,IAAA,CAAAqd,IAAA,GAEArd,IAAA,CAAAqe,IAAA,EAEA,GAAA/a,EAAA,yBACAtD,IAAA,CAAAqf,MAAA,GACAiuC,WAAA,CAAArwC,KAAA,CAAAowC,aAAA,CACA,GAAA/pD,EAAA,0BACAtD,IAAA,CAAAqf,MAAA,EACA,GAAA/b,EAAA,sCACAtD,IAAA,CAAAmf,OAAA,EACA,GAAA7b,EAAA,wCACA,KAAAtD,IAAA,CAAAgd,QAAA,aACAhd,IAAA,CAAAouD,UAAA,CAAAM,UAAA,EAEA,GAAAprD,EAAA,0CAAAwZ,IAAA,EACA9c,IAAA,CAAAouD,UAAA,CAAAO,iBAAA,CAAA7xC,IAAA,CACA,GACA1a,UAAA,CAAAwvB,cAAA,MAAA7hB,OAAA,IAAAwd,IAAA,UAAAqhC,eAAA,EACA5uD,IAAA,CAAA2tD,OAAA,CAAAiB,eAAA,CACA5uD,IAAA,CAAA2tD,OAAA,CAAAjmD,OAAA,gBAAA6lB,IAAA,UAAAshC,WAAA,EACAA,WAAA,EAAA5xC,KAAA,CAAAowC,aAAA,GAAAwB,WAAA,EACAvB,WAAA,CAAAuB,WAAA,CAEA,EACA,EACA,EAIA7/C,OAAA,UAAAA,QAAA,EAGA,MAFA,CAAA89C,YAAA,CAAAqB,kBAAA,MAAAL,YAAA,EACAz+C,QAAA,CAAAJ,MAAA,UAAAc,OAAA,MACA,KAAA9P,aAAA,GAAA2xB,cAAA,MAAA7hB,OAAA,IAAAwd,IAAA,UAAAqhC,eAAA,EACA,OAAAA,eAAA,CAAAE,UAAA,eACA,EACA,EAIAzvC,MAAA,UAAAA,OAAA,EACA,KAAA+uC,UAAA,CAAA/uC,MAAA,EACA,EAIAF,OAAA,UAAAA,QAAA,EACA,KAAAivC,UAAA,CAAAjvC,OAAA,EACA,EAIA9B,IAAA,UAAAA,KAAA,EACA,KAAA+wC,UAAA,CAAA/wC,IAAA,EACA,EAIAgB,IAAA,UAAAA,KAAA,EACA,KAAA+vC,UAAA,CAAA/vC,IAAA,EACA,CACA,GAEA,OAAA2uC,iBAEA,GAEA/tD,MCrQA,8OAAAgE,CAAA,CAAA/D,CAAA,CAAA48C,SAAA,CAAA+N,UAAA,CAAArU,gBAAA,CAAA4H,aAAA,CAAA2R,aAAA,CAAAC,aAAA,CAAA7R,aAAA,eAqEA,SAAA8R,oBAAApsD,OAAA,CAAAqsD,UAAA,CAAA7nD,QAAA,EAyBA,SAAA40C,WAAAkT,UAAA,EACA,GACA,CAAAC,OAAA,EACAC,KAAA,CAAAF,UAAA,CAAAE,KAAA,CACAC,YAAA,CAAAH,UAAA,CAAAG,YAAA,CACAC,mBAAA,UAAAA,oBAAA,EACA,IAAAphD,QAAA,MAAArK,UAAA,GACA5E,CAAA,CAAA2tB,MAAA,MAAA1pB,MAAA,CAAAqsD,YAAA,UAAAC,WAAA,CAAAC,MAAA,EACAD,WAAA,EACAthD,QAAA,CAAAoD,QAAA,WAAAm+C,MAAA,GAEA,EACA,EACAC,iBAAA,UAAAA,kBAAA,KACA,CAAAxhD,QAAA,MAAArK,UAAA,GACA8rD,eAAA,CAAA3sD,CAAA,UACA4sD,KAAA,iBACA,GACA1hD,QAAA,CAAA2D,MAAA,CAAA89C,eAAA,CACA,CACA,EAnBAzT,IAAA,CAuBA,MAHA,CAAAA,IAAA,CAAA3G,gBAAA,CAAA4Z,OAAA,CAAAD,UAAA,EACAH,aAAA,CAAA7S,IAAA,EACAgB,aAAA,CAAAhB,IAAA,CAAAoE,eAAA,EACApE,IAAA,CAAA74C,EAAA,qBACA,IAAA6K,QAAA,MAAArK,UAAA,GACA,KAAAyrD,mBAAA,GACA,KAAApsD,MAAA,CAAA2sD,cAAA,EACA,KAAAH,iBAAA,GAEAxhD,QAAA,CAAAoD,QAAA,qBAAA49C,UAAA,CAAAvoD,EAAA,IAAAtD,EAAA,mCACAysD,eAAA,EACA,EAIA,GAAAzsD,EAAA,0BACA0sD,SAAA,CAAA3xC,IAAA,GACA4xC,MAAA,CAAA5xC,IAAA,GACA6xC,gBAAA,SACAC,aAAA,6BACA,KAAA9qC,QAAA,cACA,GAAA/hB,EAAA,gBAAA6rD,UAAA,CAAAiB,YAAA,EAAAlxD,CAAA,CAAAyG,IAAA,EAAArC,EAAA,UAAA6rD,UAAA,CAAAkB,QAAA,EAAAnxD,CAAA,CAAAyG,IAAA,EAAArC,EAAA,wBACAgtD,yBAAA,GACAC,0BAAA,GACAC,uBAAA,GACAL,aAAA,6BACAD,gBAAA,SACAF,SAAA,CAAA3yC,IAAA,GACA4yC,MAAA,CAAA5yC,IAAA,GACA,KAAAgI,QAAA,cACA,GAAAtlB,IAAA,EACA,CAUA,SAAA0wD,cAAAjnC,aAAA,EACA,GACA,CAAAknC,UAAA,EACAC,gBAAA,UAAAA,iBAAA,EACA,IAAAxiD,QAAA,MAAArK,UAAA,GACA,KAAA8sD,WAAA,MAAAC,OAAA,GACA,KAAAC,UAAA,MAAA5Q,WAAA,GACA,KAAAoJ,OAAA,CAAA4F,UAAA,CAAAnkC,UAAA,CAAAmkC,UAAA,CAAA7nC,WAAA,EAAAg5B,MAAA,CAAAh5C,QAAA,CAAA0pD,MAAA,CAAA1pD,QAAA,CAAA2pD,MAAA,EACA7iD,QAAA,CAAAoD,QAAA,WACA,KAAA8T,QAAA,kBACA,EACA4rC,cAAA,UAAAA,eAAA,EACA,IAAA9iD,QAAA,MAAArK,UAAA,GACA,KAAAzB,EAAA,kBACA,KAAAinD,OAAA,MAAAsH,WAAA,CAAA5kC,KAAA,MAAA4kC,WAAA,CAAA9pC,MAAA,EAAAu5B,MAAA,MAAAyQ,UAAA,CAAA9Q,CAAA,MAAA8Q,UAAA,CAAA7Q,CAAA,EACA9xC,QAAA,CAAAmD,WAAA,WACA,KAAAs/C,WAAA,MACA,KAAAE,UAAA,MACA,KAAAzrC,QAAA,mBAEA,EACA6rC,kBAAA,UAAAA,mBAAA,EACA,IAAA/iD,QAAA,MAAArK,UAAA,GACAqtD,WAAA,GAEAC,YAAA,GACAjjD,QAAA,CAAA2D,MAAA,CAAAu/C,YAAA,CAAAC,OAAA,EACAnjD,QAAA,CAAA2D,MAAA,CAAAu/C,YAAA,CAAAE,YAAA,EACAF,YAAA,CAAAC,OAAA,CAAA1qC,GAAA,EACAoF,KAAA,CAAAkjC,UAAA,CAAAnkC,UAAA,GACAjE,MAAA,CAAAooC,UAAA,CAAA7nC,WAAA,GACAmqC,kBAAA,CAAAtC,UAAA,CAAAuC,SAAA,GACAC,oBAAA,CAAAxC,UAAA,CAAAyC,UAAA,GACAC,qBAAA,CAAA1C,UAAA,CAAA2C,YAAA,GACAC,mBAAA,CAAA5C,UAAA,CAAA6C,SAAA,EACA,GACAV,YAAA,CAAAE,YAAA,CAAA3qC,GAAA,EACAoF,KAAA,CAAAkjC,UAAA,CAAA9O,UAAA,CACAt5B,MAAA,CAAAooC,UAAA,CAAA8C,WAAA,CACAxR,IAAA,CAAA0O,UAAA,CAAA6C,SAAA,GACA3wC,GAAA,CAAA8tC,UAAA,CAAAuC,SAAA,EACA,EACA,EACAQ,kBAAA,UAAAA,mBAAA,EACAZ,YAAA,CAAAC,OAAA,CAAAriD,MAAA,GACAoiD,YAAA,CAAAE,YAAA,CAAAtiD,MAAA,EACA,CACA,EA9CAka,OAAA,CAkDA,MAHA,CAAAA,OAAA,CAAAqsB,gBAAA,CAAAkb,UAAA,CAAAlnC,aAAA,EACAulC,aAAA,CAAA5lC,OAAA,EACAg0B,aAAA,CAAAh0B,OAAA,CAAAo3B,eAAA,EACAp3B,OAAA,CAAA7lB,EAAA,qBACA,IAAAtD,IAAA,MACAmO,QAAA,MAAArK,UAAA,GAGAouD,mBAAA,CAAAjrC,MAAA,CAAAkrC,YAAA,mBACAC,SAAA,CAAAnvD,CAAA,UACA4sD,KAAA,wBACA,GACA1hD,QAAA,CAAAoD,QAAA,wBAAAiY,aAAA,CAAA5iB,EAAA,IAAAtD,EAAA,IAAA4uD,mBAAA,gCACAnC,eAAA,GACA/vD,IAAA,CAAA2wD,gBAAA,EACA,GAAArtD,EAAA,IAAA4uD,mBAAA,4BACAlyD,IAAA,CAAAixD,cAAA,EACA,GAAAh/C,OAAA,CAAAmgD,SAAA,CACA,GAAA9uD,EAAA,wBACA0sD,SAAA,CAAA3xC,IAAA,GACA4xC,MAAA,CAAA5xC,IAAA,GACA8xC,aAAA,SACA,KAAAe,kBAAA,EACA,GAAA5tD,EAAA,qBAAA+uD,qBAAAC,eAAA,CAAAC,eAAA,EAEAlrD,QAAA,CAAA0pD,MAAA,EAAAuB,eAAA,CACAjrD,QAAA,CAAA2pD,MAAA,EAAAuB,eAAA,CACAlrD,QAAA,CAAAmrD,MAAA,EAAAF,eAAA,CACAjrD,QAAA,CAAAorD,MAAA,EAAAF,eACA,GAAAjvD,EAAA,sBACA,KAAA2uD,kBAAA,GAGAS,WAAA,SACA1C,SAAA,CAAA3yC,IAAA,GACA4yC,MAAA,CAAA5yC,IAAA,GAGAs1C,eAAA,EACA,GAAA5yD,IAAA,EACA,CAWA,SAAA6yD,sBAAA,EAIA5C,SAAA,CAAAxa,gBAAA,GACA2H,aAAA,CAAA6S,SAAA,CAAAzP,eAAA,EACAwO,aAAA,CAAAiB,SAAA,EACA6C,eAAA,UAAAA,gBAAA,EACA,IAAAC,OAAA,CAAAC,QAAA,CAAAC,EAAA,CAAA7W,IAAA,CAAAr4C,UAAA,GAAA4I,MAAA,GACAumD,IAAA,CAYA,MAXA,CAAAA,IAAA,EACAjT,CAAA,CAAA8S,OAAA,CAAAtS,IAAA,CAAA0S,UAAA,CAAAzN,QAAA,CACAxF,CAAA,CAAA6S,OAAA,CAAA1xC,GAAA,EAAA8xC,UAAA,CAAAC,YAAA,CAAAjE,UAAA,CAAA8C,WAAA,CAAAnvD,OAAA,CAAAuwD,gBAAA,EACApnC,KAAA,CAAAkjC,UAAA,CAAAnkC,UAAA,GAAAmoC,UAAA,CAAAzN,QAAA,CACA3+B,MAAA,CAAAooC,UAAA,CAAA7nC,WAAA,EAAA6nC,UAAA,CAAA8C,WAAA,CAAAkB,UAAA,CAAAC,YAAA,CAAAD,UAAA,CAAAG,eAAA,CAAAxwD,OAAA,CAAAywD,eAAA,CACA,EAMAL,IACA,CACA,GAAA3vD,EAAA,qBACA,IAAA6K,QAAA,MAAArK,UAAA,GACAyvD,SAAA,CAAAtwD,CAAA,UACA4sD,KAAA,iBACA,GACA1hD,QAAA,CAAAyY,GAAA,wBACAzY,QAAA,CAAAoD,QAAA,2BACApD,QAAA,CAAAyY,GAAA,EACA4sC,UAAA,OACA,GACArlD,QAAA,CAAA2D,MAAA,CAAAyhD,SAAA,CACA,GAAAjwD,EAAA,wBACA2sD,MAAA,CAAA5xC,IAAA,GACA0xC,eAAA,GACAI,aAAA,4BACA,GAAA7sD,EAAA,qBAAAgvD,eAAA,CAAAC,eAAA,EACAlrD,QAAA,CAAAmrD,MAAA,EAAAF,eAAA,CACAjrD,QAAA,CAAAorD,MAAA,EAAAF,eAAA,CACArD,UAAA,CAAA6C,SAAA,EAAAO,eAAA,CACApD,UAAA,CAAAuC,SAAA,EAAAc,eAAA,CACArD,UAAA,CAAAyC,UAAA,EAAAW,eAAA,CACApD,UAAA,CAAA2C,YAAA,EAAAU,eAAA,CACAkB,sBAAA,EACA,GAAAnwD,EAAA,sBACA0sD,SAAA,CAAA7H,YAAA,GACA8H,MAAA,CAAA5yC,IAAA,GACA8yC,aAAA,6BACAG,yBAAA,EACA,GAAAvwD,IAAA,EACA,CAKA,SAAA2zD,aAAA,EACAzD,MAAA,CAAAza,gBAAA,GACA2H,aAAA,CAAA8S,MAAA,CAAA1P,eAAA,EACAnD,aAAA,CAAA6S,MAAA,EAAA3sD,EAAA,qBACA,IAAAtD,IAAA,MACAmO,QAAA,MAAArK,UAAA,GACA6vD,UAAA,CAAA1wD,CAAA,UACA4sD,KAAA,uBACA,GACA1hD,QAAA,CAAA2D,MAAA,CAAA6hD,UAAA,EACAxlD,QAAA,CAAAoD,QAAA,uBACApD,QAAA,CAAA7K,EAAA,mCACAysD,eAAA,EACA,GACA5hD,QAAA,CAAA7K,EAAA,kBAAAgL,CAAA,EACAA,CAAA,CAAA+a,eAAA,GACArpB,IAAA,CAAAgE,OAAA,SACA,EACA,GAAAjE,IAAA,EACA,CAOA,SAAAgwD,gBAAA,EACA2C,WAAA,iBACA1C,SAAA,CAAA7H,YAAA,GACA8H,MAAA,CAAA9H,YAAA,EACA,CACA,SAAAuK,YAAA9sD,EAAA,CAAAmqB,IAAA,EACAogC,aAAA,CAAAvqD,EAAA,CAAAmqB,IAAA,EACAmgC,gBAAA,CAAAtqD,EAAA,CAAAmqB,IAAA,CACA,CACA,SAAAogC,cAAAvqD,EAAA,CAAAmqB,IAAA,EACA6jC,QAAA,QAAAhuD,EAAA,CAAAmqB,IAAA,CACA,CACA,SAAAmgC,iBAAAtqD,EAAA,CAAAmqB,IAAA,EACA6jC,QAAA,WAAAhuD,EAAA,CAAAmqB,IAAA,CACA,CAQA,SAAA6jC,SAAArlD,MAAA,CAAA3I,EAAA,CAAAmqB,IAAA,EACA7wB,CAAA,CAAA2tB,MAAA,CAAAkmC,QAAA,UAAAtsD,IAAA,EACAvH,CAAA,CAAAohB,QAAA,CAAA7Z,IAAA,CAAA8H,MAAA,IAAArP,CAAA,CAAAwM,UAAA,CAAAjF,IAAA,CAAA8H,MAAA,EAAA3I,EAAA,IACAa,IAAA,CAAA8H,MAAA,EAAA3I,EAAA,MAAAmqB,IAAA,MAEA,EACA,CAQA,SAAA4iC,gBAAA,EACAc,sBAAA,GACAnD,yBAAA,GACAC,0BAAA,GACAC,uBAAA,EACA,CACA,SAAAiD,uBAAA,EACAtD,aAAA,SACA,CACA,SAAAG,0BAAA,EACApxD,CAAA,CAAA2tB,MAAA,CAAAkmC,QAAA,UAAAtsD,IAAA,EACAA,IAAA,CAAA0iB,OAAA,EACA1iB,IAAA,CAAA01C,IAAA,CAAAmT,YAAA,CAAA7oD,IAAA,CAAA0iB,OAAA,CAEA,EACA,CACA,SAAAonC,2BAAA,EACAP,SAAA,EACAA,SAAA,CAAA1G,OAAA,CAAA4F,UAAA,CAAA9O,UAAA,IAAAv9C,OAAA,CAAAywD,eAAA,EAAAjT,MAAA,CAAAh5C,QAAA,CAAAmrD,MAAA,IAAAnrD,QAAA,CAAAorD,MAAA,CAAAvD,UAAA,CAAA8C,WAAA,CAAAnvD,OAAA,CAAAuwD,gBAAA,CAEA,CACA,SAAA5C,wBAAA,EACAP,MAAA,EACAA,MAAA,CAAA3G,OAAA,CAAA4J,UAAA,CAAAzN,QAAA,CAAA5iD,OAAA,CAAAuwD,gBAAA,CAAAF,UAAA,CAAAvN,SAAA,CAAA9iD,OAAA,CAAAuwD,gBAAA,EAAA/S,MAAA,CAAAh5C,QAAA,CAAA0pD,MAAA,CAAA7B,UAAA,CAAAnkC,UAAA,CAAAmoC,UAAA,CAAAzN,QAAA,GAEAp+C,QAAA,CAAA2pD,MAAA,CAAAnuD,OAAA,CAAAuwD,gBAAA,GAEA,CAMA,SAAAS,kBAAA,EACA3E,UAAA,CAAAuC,SAAA,CAAAyB,UAAA,CAAAC,YAAA,GACAjE,UAAA,CAAAuC,SAAA,CAAAyB,UAAA,CAAAC,YAAA,CACA9rD,QAAA,CAAAorD,MAAA,CAAAprD,QAAA,CAAA2pD,MAAA,CAAAkC,UAAA,CAAAC,YAAA,EAEAjE,UAAA,CAAA8C,WAAA,CAAAkB,UAAA,CAAAvN,SAAA,GACAuJ,UAAA,CAAA8C,WAAA,CAAAkB,UAAA,CAAAvN,SAAA,EAEAuJ,UAAA,CAAA2C,YAAA,CAAAqB,UAAA,CAAAG,eAAA,GACAnE,UAAA,CAAA2C,YAAA,CAAAqB,UAAA,CAAAG,eAAA,EAEAnE,UAAA,CAAA7nC,WAAA,CAAA6nC,UAAA,CAAAuC,SAAA,CAAAvC,UAAA,CAAA8C,WAAA,CAAA9C,UAAA,CAAA2C,YAAA,CACA3C,UAAA,CAAA6C,SAAA,CAAAmB,UAAA,CAAAzN,QAAA,GACAyJ,UAAA,CAAA6C,SAAA,CAAAmB,UAAA,CAAAzN,QAAA,CACAp+C,QAAA,CAAAmrD,MAAA,CAAAnrD,QAAA,CAAA0pD,MAAA,CAAAmC,UAAA,CAAAzN,QAAA,EAEAyJ,UAAA,CAAA9O,UAAA,CAAA8S,UAAA,CAAAzN,QAAA,GACAyJ,UAAA,CAAA9O,UAAA,CAAA8S,UAAA,CAAAzN,QAAA,EAEAyJ,UAAA,CAAAyC,UAAA,CAAAuB,UAAA,CAAAzN,QAAA,GACAyJ,UAAA,CAAAyC,UAAA,CAAAuB,UAAA,CAAAzN,QAAA,EAEAyJ,UAAA,CAAAnkC,UAAA,CAAAmkC,UAAA,CAAA6C,SAAA,CAAA7C,UAAA,CAAA9O,UAAA,CAAA8O,UAAA,CAAAyC,UACA,CAQA,SAAAmC,aAAAC,SAAA,CAAAC,IAAA,CAAAC,OAAA,EACA/E,UAAA,CAAAuC,SAAA,CAAAsC,SAAA,CACAE,OAAA,EACA/E,UAAA,CAAA7nC,WAAA,CAAA0sC,SAAA,CAAA7E,UAAA,CAAA8C,WAAA,CAAA9C,UAAA,CAAA2C,YAAA,CACAxqD,QAAA,CAAA2pD,MAAA,CAAAgD,IAAA,GAEA9E,UAAA,CAAA8C,WAAA,CAAA9C,UAAA,CAAA7nC,WAAA,CAAA0sC,SAAA,CAAA7E,UAAA,CAAA2C,YAAA,CACAxqD,QAAA,CAAAorD,MAAA,CAAAprD,QAAA,CAAA2pD,MAAA,CAAA+C,SAAA,CAEA,CAQA,SAAAG,cAAAC,QAAA,CAAAC,IAAA,CAAAC,QAAA,EACAnF,UAAA,CAAAyC,UAAA,CAAAwC,QAAA,CACAE,QAAA,CACAnF,UAAA,CAAA9O,UAAA,CAAAgU,IAAA,CAAA/sD,QAAA,CAAAmrD,MAAA,CAEAtD,UAAA,CAAAnkC,UAAA,CAAAmkC,UAAA,CAAA6C,SAAA,CAAA7C,UAAA,CAAA9O,UAAA,CAAA+T,QAEA,CAQA,SAAAG,gBAAAP,SAAA,CAAAC,IAAA,CAAAC,OAAA,EACA/E,UAAA,CAAA2C,YAAA,CAAAkC,SAAA,CACAE,OAAA,EACA/E,UAAA,CAAA8C,WAAA,CAAAgC,IAAA,CAAA3sD,QAAA,CAAAorD,MAAA,CACAvD,UAAA,CAAA2C,YAAA,CAAAkC,SAAA,EAEA7E,UAAA,CAAA7nC,WAAA,CAAA6nC,UAAA,CAAAuC,SAAA,CAAAvC,UAAA,CAAA8C,WAAA,CAAA+B,SAEA,CAQA,SAAAQ,aAAAJ,QAAA,CAAAC,IAAA,CAAAC,QAAA,EACAnF,UAAA,CAAA6C,SAAA,CAAAoC,QAAA,CACAE,QAAA,EACAnF,UAAA,CAAAnkC,UAAA,CAAAopC,QAAA,CAAAjF,UAAA,CAAA9O,UAAA,CAAA8O,UAAA,CAAAyC,UAAA,CACAtqD,QAAA,CAAA0pD,MAAA,CAAAqD,IAAA,GAEAlF,UAAA,CAAA9O,UAAA,CAAA8O,UAAA,CAAAnkC,UAAA,CAAAopC,QAAA,CAAAjF,UAAA,CAAAyC,UAAA,CACAtqD,QAAA,CAAAmrD,MAAA,CAAAnrD,QAAA,CAAA0pD,MAAA,CAAAoD,QAAA,CAEA,CAgBA,SAAAK,mBAAA,EAEAC,UAAA,EACA7tD,EAAA,KACA8tD,KAAA,EACAtzC,GAAA,IACAogC,KAAA,IACAC,MAAA,IACAjB,IAAA,GACA,EACAgP,YAAA,EACApuC,GAAA,IACAogC,KAAA,IACAC,MAAA,IACAjB,IAAA,GACA,EACAmU,UAAA,IACAhP,SAAA,CAAAuN,UAAA,CAAAC,YAAA,CAEA9D,KAAA,UAAAA,MAAA,EACA,KAAAhP,MAAA,CAAAh5C,QAAA,CAAAmrD,MAAA,CAAAnrD,QAAA,CAAA2pD,MAAA,EAAA1H,OAAA,CAAA4F,UAAA,CAAA9O,UAAA,CAAA8O,UAAA,CAAAuC,SAAA,CACA,EAEAnC,YAAA,UAAAA,aAAAnmC,OAAA,EACA,IAAAzV,GAAA,MAAAwsC,WAAA,GACA39B,IAAA,MAAAsuC,OAAA,GACA1nC,OAAA,CAAAk3B,MAAA,CAAAh5C,QAAA,CAAA0pD,MAAA,CAAAr9C,GAAA,CAAAusC,CAAA,EAAAqJ,OAAA,CAAA4F,UAAA,CAAAnkC,UAAA,CAAAxI,IAAA,CAAAuE,MAAA,CACA,EAGAspC,YAAA,UAAAA,aAAApkC,KAAA,CAAAlF,MAAA,CAAAutC,QAAA,CAAAJ,OAAA,EACA,KAAA9wD,MAAA,CAAAyxD,SAAA,CAAAX,OAAA,MAAA/E,UAAA,CAAAuC,SAAA,EAAAvC,UAAA,CAAA8C,WAAA,CAAAkB,UAAA,CAAAvN,SAAA,CACA,EAEA0K,QAAA,UAAAA,SAAArkC,KAAA,CAAAlF,MAAA,CAAAutC,QAAA,CAAAJ,OAAA,CAAAjU,CAAA,CAAAC,CAAA,EACA6T,YAAA,CAAAhtC,MAAA,CAAAm5B,CAAA,CAAAgU,OAAA,EACAR,sBAAA,EACA,CACA,GAGAgB,UAAA,EACA7tD,EAAA,MACA8tD,KAAA,EACAtzC,GAAA,IACAogC,KAAA,IACAC,MAAA,IACAjB,IAAA,GACA,EACAgP,YAAA,EACApuC,GAAA,IACAogC,KAAA,IACAC,MAAA,IACAjB,IAAA,GACA,EACAmF,SAAA,CAAAuN,UAAA,CAAAC,YAAA,CACA9D,KAAA,UAAAA,MAAA,EACA,KAAAhP,MAAA,CAAAh5C,QAAA,CAAAmrD,MAAA,CAAAtD,UAAA,CAAA9O,UAAA,CAAA/4C,QAAA,CAAA2pD,MAAA,EAAA1H,OAAA,CAAA4F,UAAA,CAAAyC,UAAA,CAAAzC,UAAA,CAAAuC,SAAA,CACA,EACAnC,YAAA,UAAAA,aAAAnmC,OAAA,EACA,IAAAzV,GAAA,MAAAwsC,WAAA,GACA39B,IAAA,MAAAsuC,OAAA,GACA1nC,OAAA,CAAAk3B,MAAA,CAAA3sC,GAAA,CAAAssC,CAAA,CAAAtsC,GAAA,CAAAusC,CAAA,CAAAp9C,OAAA,CAAAuwD,gBAAA,EAAA9J,OAAA,CAAA/mC,IAAA,CAAAyJ,KAAA,CAAAnpB,OAAA,CAAAuwD,gBAAA,CAAA7wC,IAAA,CAAAuE,MAAA,GAAAjkB,OAAA,CAAAuwD,gBAAA,CACA,EACA/C,QAAA,UAAAA,SAAArkC,KAAA,CAAAlF,MAAA,CAAAutC,QAAA,CAAAJ,OAAA,CAAAjU,CAAA,CAAAC,CAAA,EACA6T,YAAA,CAAAhtC,MAAA,CAAAm5B,CAAA,CAAAgU,OAAA,EACAC,aAAA,CAAAloC,KAAA,CAAAg0B,CAAA,CAAAqU,QAAA,EACAZ,sBAAA,EACA,CACA,GAGAgB,UAAA,EACA7tD,EAAA,MACA8tD,KAAA,EACAtzC,GAAA,IACAogC,KAAA,mBACAC,MAAA,mBACAjB,IAAA,GACA,EACAgP,YAAA,EACApuC,GAAA,IACAogC,KAAA,IACAC,MAAA,IACAjB,IAAA,GACA,EACAmF,SAAA,CAAAuN,UAAA,CAAAG,eAAA,CACAvD,cAAA,IACAT,KAAA,UAAAA,MAAA,EACA,KAAAhP,MAAA,CAAAh5C,QAAA,CAAAmrD,MAAA,CAAAtD,UAAA,CAAA9O,UAAA,CAAA/4C,QAAA,CAAAorD,MAAA,CAAAvD,UAAA,CAAA8C,WAAA,EAAA1I,OAAA,CAAA4F,UAAA,CAAAyC,UAAA,CAAAzC,UAAA,CAAA2C,YAAA,CACA,EACAvC,YAAA,UAAAA,aAAAnmC,OAAA,EACA,IAAAzV,GAAA,MAAAwsC,WAAA,GACA39B,IAAA,MAAAsuC,OAAA,GACA1nC,OAAA,CAAAk3B,MAAA,CAAA3sC,GAAA,CAAAssC,CAAA,CAAAtsC,GAAA,CAAAusC,CAAA,CAAAp9C,OAAA,CAAAuwD,gBAAA,EAAA9J,OAAA,CAAA/mC,IAAA,CAAAyJ,KAAA,CAAAnpB,OAAA,CAAAuwD,gBAAA,CAAA7wC,IAAA,CAAAuE,MAAA,GAAAjkB,OAAA,CAAAuwD,gBAAA,CACA,EACA/C,QAAA,UAAAA,SAAArkC,KAAA,CAAAlF,MAAA,CAAAutC,QAAA,CAAAJ,OAAA,CAAAjU,CAAA,CAAAC,CAAA,EACAiU,aAAA,CAAAloC,KAAA,CAAAg0B,CAAA,CAAAqU,QAAA,EACAC,eAAA,CAAAxtC,MAAA,CAAAm5B,CAAA,CAAAgU,OAAA,EACAR,sBAAA,EACA,CACA,GAGAgB,UAAA,EACA7tD,EAAA,KACA8tD,KAAA,EACAtzC,GAAA,IACAogC,KAAA,IACAC,MAAA,IACAjB,IAAA,GACA,EACAgP,YAAA,EACApuC,GAAA,IACAogC,KAAA,IACAC,MAAA,IACAjB,IAAA,GACA,EACAmF,SAAA,CAAAuN,UAAA,CAAAG,eAAA,CACAhE,KAAA,UAAAA,MAAA,EACA,KAAAhP,MAAA,CAAAh5C,QAAA,CAAAmrD,MAAA,CAAAnrD,QAAA,CAAAorD,MAAA,CAAAvD,UAAA,CAAA8C,WAAA,EAAA1I,OAAA,CAAA4F,UAAA,CAAA9O,UAAA,CAAA8O,UAAA,CAAA2C,YAAA,CACA,EACAvC,YAAA,UAAAA,aAAAnmC,OAAA,EACA,IAAAzV,GAAA,MAAAwsC,WAAA,GACA39B,IAAA,MAAAsuC,OAAA,GACA1nC,OAAA,CAAAk3B,MAAA,CAAA3sC,GAAA,CAAAssC,CAAA,CAAAtsC,GAAA,CAAAusC,CAAA,CAAAp9C,OAAA,CAAAuwD,gBAAA,EAAA9J,OAAA,CAAA/mC,IAAA,CAAAyJ,KAAA,CAAAzJ,IAAA,CAAAuE,MAAA,GAAAjkB,OAAA,CAAAuwD,gBAAA,CACA,EACAhD,YAAA,UAAAA,aAAApkC,KAAA,CAAAlF,MAAA,CAAAutC,QAAA,CAAAJ,OAAA,EACA,KAAA9wD,MAAA,CAAAyxD,SAAA,CAAAX,OAAA,CAAA/E,UAAA,CAAA2C,YAAA,EAAA3C,UAAA,CAAA8C,WAAA,CAAAkB,UAAA,CAAAvN,SAAA,MACA,EACA0K,QAAA,UAAAA,SAAArkC,KAAA,CAAAlF,MAAA,CAAAutC,QAAA,CAAAJ,OAAA,CAAAjU,CAAA,CAAAC,CAAA,EACAqU,eAAA,CAAAxtC,MAAA,CAAAm5B,CAAA,CAAAgU,OAAA,EACAR,sBAAA,EACA,CACA,GAGAgB,UAAA,EACA7tD,EAAA,KACA8tD,KAAA,EACAtzC,GAAA,IACAogC,KAAA,IACAC,MAAA,mBACAjB,IAAA,kBACA,EACAgP,YAAA,EACApuC,GAAA,IACAogC,KAAA,IACAC,MAAA,IACAjB,IAAA,GACA,EACAsP,cAAA,IACAT,KAAA,UAAAA,MAAA,EACA,KAAAhP,MAAA,CAAAh5C,QAAA,CAAAmrD,MAAA,CAAAtD,UAAA,CAAA9O,UAAA,CAAA/4C,QAAA,CAAAorD,MAAA,EAAAnJ,OAAA,CAAA4F,UAAA,CAAAyC,UAAA,CAAAzC,UAAA,CAAA8C,WAAA,CACA,EACA1C,YAAA,UAAAA,aAAAnmC,OAAA,EACA,IAAAzV,GAAA,MAAAwsC,WAAA,GACA39B,IAAA,MAAAsuC,OAAA,GACA1nC,OAAA,CAAAk3B,MAAA,CAAA3sC,GAAA,CAAAssC,CAAA,CAAAn9C,OAAA,CAAAuwD,gBAAA,CAAA1/C,GAAA,CAAAusC,CAAA,CAAAp9C,OAAA,CAAAuwD,gBAAA,EAAA9J,OAAA,CAAA/mC,IAAA,CAAAyJ,KAAA,GAAAnpB,OAAA,CAAAuwD,gBAAA,CAAA7wC,IAAA,CAAAuE,MAAA,GAAAjkB,OAAA,CAAAuwD,gBAAA,CACA,EAEAhD,YAAA,UAAAA,aAAApkC,KAAA,CAAAlF,MAAA,CAAAutC,QAAA,EACA,KAAAlxD,MAAA,CAAAuiD,QAAA,CAAAwJ,UAAA,CAAAyC,UAAA,EAAAzC,UAAA,CAAA9O,UAAA,CAAA8S,UAAA,CAAAzN,QAAA,EACA,KAAAtiD,MAAA,CAAAsiD,QAAA,CAAAyN,UAAA,CAAAzN,QAAA,CACA,KAAAtiD,MAAA,CAAAyxD,SAAA,CAAA1F,UAAA,CAAA7nC,WAAA,CAAA6nC,UAAA,CAAAuC,SAAA,CAAAyB,UAAA,CAAAG,eACA,EACAhD,QAAA,UAAAA,SAAArkC,KAAA,CAAAlF,MAAA,CAAAutC,QAAA,CAAAJ,OAAA,CAAAjU,CAAA,EACAkU,aAAA,CAAAloC,KAAA,CAAAg0B,CAAA,CAAAqU,QAAA,EACAQ,cAAA,CAAA/tC,MAAA,EACA2sC,sBAAA,EACA,CACA,GAGAgB,UAAA,EACA7tD,EAAA,MACA8tD,KAAA,EACAtzC,GAAA,IACAogC,KAAA,IACAC,MAAA,IACAjB,IAAA,GACA,EACAgP,YAAA,EACApuC,GAAA,IACAogC,KAAA,IACAC,MAAA,IACAjB,IAAA,GACA,EACAmF,SAAA,CAAAuN,UAAA,CAAAG,eAAA,CACAhE,KAAA,UAAAA,MAAA,EACA,KAAAhP,MAAA,CAAAh5C,QAAA,CAAA0pD,MAAA,CAAA1pD,QAAA,CAAAorD,MAAA,CAAAvD,UAAA,CAAA8C,WAAA,EAAA1I,OAAA,CAAA4F,UAAA,CAAA6C,SAAA,CAAA7C,UAAA,CAAA2C,YAAA,CACA,EACAvC,YAAA,UAAAA,aAAAnmC,OAAA,EACA,IAAAzV,GAAA,MAAAwsC,WAAA,GACA39B,IAAA,MAAAsuC,OAAA,GACA1nC,OAAA,CAAAk3B,MAAA,CAAA3sC,GAAA,CAAAssC,CAAA,CAAAn9C,OAAA,CAAAuwD,gBAAA,CAAA1/C,GAAA,CAAAusC,CAAA,CAAAp9C,OAAA,CAAAuwD,gBAAA,EAAA9J,OAAA,CAAA/mC,IAAA,CAAAyJ,KAAA,CAAAnpB,OAAA,CAAAuwD,gBAAA,CAAA7wC,IAAA,CAAAuE,MAAA,GAAAjkB,OAAA,CAAAuwD,gBAAA,CACA,EACA/C,QAAA,UAAAA,SAAArkC,KAAA,CAAAlF,MAAA,CAAAutC,QAAA,CAAAJ,OAAA,CAAAjU,CAAA,CAAAC,CAAA,EACAqU,eAAA,CAAAxtC,MAAA,CAAAm5B,CAAA,CAAAgU,OAAA,EACAM,YAAA,CAAAvoC,KAAA,CAAAg0B,CAAA,CAAAqU,QAAA,EACAZ,sBAAA,EACA,CACA,GAGAgB,UAAA,EACA7tD,EAAA,KACA8tD,KAAA,EACAtzC,GAAA,IACAogC,KAAA,IACAC,MAAA,IACAjB,IAAA,GACA,EACAgP,YAAA,EACApuC,GAAA,IACAogC,KAAA,IACAC,MAAA,IACAjB,IAAA,GACA,EACA6O,KAAA,UAAAA,MAAA,EACA,KAAAhP,MAAA,CAAAh5C,QAAA,CAAA0pD,MAAA,CAAA1pD,QAAA,CAAAorD,MAAA,EAAAnJ,OAAA,CAAA4F,UAAA,CAAA6C,SAAA,CAAA7C,UAAA,CAAA8C,WAAA,CACA,EACA1C,YAAA,UAAAA,aAAAnmC,OAAA,EACA,IAAAzV,GAAA,MAAAwsC,WAAA,GACA39B,IAAA,MAAAsuC,OAAA,GACA1nC,OAAA,CAAAk3B,MAAA,CAAA3sC,GAAA,CAAAssC,CAAA,CAAAn9C,OAAA,CAAAuwD,gBAAA,CAAA1/C,GAAA,CAAAusC,CAAA,CAAAp9C,OAAA,CAAAuwD,gBAAA,EAAA9J,OAAA,CAAA/mC,IAAA,CAAAyJ,KAAA,GAAAnpB,OAAA,CAAAuwD,gBAAA,CAAA7wC,IAAA,CAAAuE,MAAA,GAAAjkB,OAAA,CAAAuwD,gBAAA,CACA,EACAhD,YAAA,UAAAA,aAAApkC,KAAA,CAAAlF,MAAA,CAAAutC,QAAA,EACA,KAAAlxD,MAAA,CAAAuiD,QAAA,CAAA2O,QAAA,MAAAnF,UAAA,CAAA6C,SAAA,EAAA7C,UAAA,CAAA9O,UAAA,CAAA8S,UAAA,CAAAzN,QAAA,CACA,EACA4K,QAAA,UAAAA,SAAArkC,KAAA,CAAAlF,MAAA,CAAAutC,QAAA,CAAAJ,OAAA,CAAAjU,CAAA,EACAuU,YAAA,CAAAvoC,KAAA,CAAAg0B,CAAA,CAAAqU,QAAA,EACAZ,sBAAA,EACA,CACA,GAGAgB,UAAA,EACA7tD,EAAA,MACA8tD,KAAA,EACAtzC,GAAA,IACAogC,KAAA,IACAC,MAAA,IACAjB,IAAA,GACA,EACAgP,YAAA,EACApuC,GAAA,IACAogC,KAAA,IACAC,MAAA,IACAjB,IAAA,GACA,EACAmF,SAAA,CAAAuN,UAAA,CAAAC,YAAA,CACA9D,KAAA,UAAAA,MAAA,EACA,KAAAhP,MAAA,CAAAh5C,QAAA,CAAA0pD,MAAA,CAAA1pD,QAAA,CAAA2pD,MAAA,EAAA1H,OAAA,CAAA4F,UAAA,CAAA6C,SAAA,CAAA7C,UAAA,CAAAuC,SAAA,CACA,EACAnC,YAAA,UAAAA,aAAAnmC,OAAA,EACA,IAAAzV,GAAA,MAAAwsC,WAAA,GACA39B,IAAA,MAAAsuC,OAAA,GACA1nC,OAAA,CAAAk3B,MAAA,CAAA3sC,GAAA,CAAAssC,CAAA,CAAAn9C,OAAA,CAAAuwD,gBAAA,CAAA1/C,GAAA,CAAAusC,CAAA,CAAAp9C,OAAA,CAAAuwD,gBAAA,EAAA9J,OAAA,CAAA/mC,IAAA,CAAAyJ,KAAA,CAAAnpB,OAAA,CAAAuwD,gBAAA,CAAA7wC,IAAA,CAAAuE,MAAA,GAAAjkB,OAAA,CAAAuwD,gBAAA,CACA,EACA/C,QAAA,UAAAA,SAAArkC,KAAA,CAAAlF,MAAA,CAAAutC,QAAA,CAAAJ,OAAA,CAAAjU,CAAA,CAAAC,CAAA,EACA6T,YAAA,CAAAhtC,MAAA,CAAAm5B,CAAA,CAAAgU,OAAA,EACAM,YAAA,CAAAvoC,KAAA,CAAAg0B,CAAA,CAAAqU,QAAA,EACAZ,sBAAA,EACA,CACA,EACA,CACA,SAAAgB,WAAAK,UAAA,EACA/B,QAAA,CAAA+B,UAAA,CAAAluD,EAAA,GACAu1C,IAAA,CAAAF,UAAA,CAAA/8C,CAAA,CAAAyL,MAAA,IAAAuoD,UAAA,CAAA4B,UAAA,GACA3rC,OAAA,CAAA2rC,UAAA,CAAAH,UAAA,CAAAlE,aAAA,CAAAqE,UAAA,MACA,CACA,CACA,SAAAC,mBAAA,EACA1D,YAAA,CAAAC,OAAA,CAAAruD,CAAA,UACA4sD,KAAA,UACA,GACAwB,YAAA,CAAAE,YAAA,CAAAtuD,CAAA,UACA4sD,KAAA,eACA,EACA,CAjtBA,GACA,CAAAkD,QAAA,IAGA1B,YAAA,IAJA2D,YAAA,CAEAhF,SAAA,CACAC,MAAA,CA4aA,MAAA4E,cAAA,CAAAd,SAAA,GACA7E,UAAA,CAAA8C,WAAA,CAAA+B,SAAA,CACA7E,UAAA,CAAA2C,YAAA,CAAA3C,UAAA,CAAA7nC,WAAA,CAAA6nC,UAAA,CAAA8C,WAAA,CAAA9C,UAAA,CAAAuC,SACA,EAgYA,MAzFA,CAAAvC,UAAA,CAAAhwD,CAAA,CAAAmE,QAAA,CAAA6rD,UAAA,KAAA+F,iBAAA,EACA5tD,QAAA,CAAAnI,CAAA,CAAAmE,QAAA,CAAAgE,QAAA,KAAAqL,eAAA,EACA7P,OAAA,CAAA3D,CAAA,CAAAmE,QAAA,CAAAR,OAAA,KAAAmb,cAAA,EACAk1C,UAAA,EACAzN,QAAA,GAAA5iD,OAAA,CAAAuwD,gBAAA,CAAAvwD,OAAA,CAAAqyD,YAAA,CACAvP,SAAA,GAAA9iD,OAAA,CAAAuwD,gBAAA,CAAAvwD,OAAA,CAAAsyD,aAAA,CACA9B,eAAA,GAAAxwD,OAAA,CAAAuwD,gBAAA,CAAAvwD,OAAA,CAAAywD,eAAA,CACAH,YAAA,GAAAtwD,OAAA,CAAAuwD,gBAAA,GACA,EAEA4B,YAAA,EACAj1D,IAAA,UAAAA,KAAA,EACA,IAAAC,IAAA,MAUA,MATA,MAAAo1D,aAAA,CAAAlG,UAAA,CAAA7nD,QAAA,EACAmtD,kBAAA,GACAO,kBAAA,GACAnC,qBAAA,GACAc,YAAA,GACAzD,MAAA,CAAA3sD,EAAA,oBACAtD,IAAA,CAAAqe,IAAA,GACAre,IAAA,CAAAgE,OAAA,SACA,GACA,IACA,EACA8M,MAAA,UAAAA,OAAA0M,UAAA,EAKA,MAJA,CAAAk1C,WAAA,WAAAl1C,UAAA,GACAwyC,SAAA,CAAAl/C,MAAA,CAAA0M,UAAA,EACAyyC,MAAA,CAAAn/C,MAAA,CAAA0M,UAAA,EACAm1C,eAAA,GACA,IACA,EACA3jD,OAAA,UAAAA,QAAA,EAKA,MAJA,CAAA0jD,WAAA,YACArB,YAAA,MACArB,SAAA,MACAC,MAAA,MACA,IACA,EACA5yC,IAAA,UAAAA,KAAA,EAKA,MAJA,CAAAq1C,WAAA,SACA1C,SAAA,CAAA3yC,IAAA,GACA4yC,MAAA,CAAA5yC,IAAA,GACA,KAAAgI,QAAA,cACA,IACA,EACAhH,IAAA,UAAAA,KAAA,EAKA,MAJA,CAAAq0C,WAAA,SACA1C,SAAA,CAAA3xC,IAAA,GACA4xC,MAAA,CAAA5xC,IAAA,GACA,KAAAgH,QAAA,cACA,IACA,EAcA+vC,aAAA,UAAAA,cAAAC,GAAA,CAAA3hD,GAAA,EACAw7C,UAAA,CAAAhwD,CAAA,CAAAmE,QAAA,CAAAgyD,GAAA,KAAAnG,UAAA,EACA7nD,QAAA,CAAAnI,CAAA,CAAAmE,QAAA,CAAAqQ,GAAA,KAAArM,QAAA,EAGA6nD,UAAA,CAAAuC,SAAA,CAAA/9C,GAAA,CAAA++C,MAAA,CAAA/+C,GAAA,CAAAs9C,MAAA,CACA9B,UAAA,CAAAyC,UAAA,CAAA0D,GAAA,CAAAtqC,UAAA,EAAArX,GAAA,CAAA8+C,MAAA,CAAA9+C,GAAA,CAAAq9C,MAAA,EAAAsE,GAAA,CAAAjV,UAAA,CACA8O,UAAA,CAAA2C,YAAA,CAAAwD,GAAA,CAAAhuC,WAAA,EAAA3T,GAAA,CAAA++C,MAAA,CAAA/+C,GAAA,CAAAs9C,MAAA,EAAAqE,GAAA,CAAArD,WAAA,CACA9C,UAAA,CAAA6C,SAAA,CAAAr+C,GAAA,CAAA8+C,MAAA,CAAA9+C,GAAA,CAAAq9C,MAAA,CACA8C,iBAAA,GACAlB,eAAA,EACA,EACA2C,aAAA,UAAAA,cAAA,EACA,OAAApG,UACA,EACAhP,WAAA,UAAAA,YAAA,EACA,OAAA74C,QACA,EACAhB,QAAA,UAAAA,SAAA,EACA,OAAA0sD,QACA,CACA,EACAjX,SAAA,CAAAkZ,YAAA,EACAnL,UAAA,CAAAmL,YAAA,EACAA,YACA,CAv3BA/xD,CAAA,CAAAA,CAAA,EAAAxD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAqD,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACA/D,CAAA,CAAAA,CAAA,EAAAO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAV,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACA48C,SAAA,CAAAA,SAAA,EAAAr8C,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAk8C,SAAA,YAAAA,SAAA,YAAAA,SAAA,CACA+N,UAAA,CAAAA,UAAA,EAAApqD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAiqD,UAAA,YAAAA,UAAA,YAAAA,UAAA,CACArU,gBAAA,CAAAA,gBAAA,EAAA/1C,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA41C,gBAAA,YAAAA,gBAAA,YAAAA,gBAAA,CACA4H,aAAA,CAAAA,aAAA,EAAA39C,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAw9C,aAAA,YAAAA,aAAA,YAAAA,aAAA,CACA2R,aAAA,CAAAA,aAAA,EAAAtvD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAmvD,aAAA,YAAAA,aAAA,YAAAA,aAAA,CACAC,aAAA,CAAAA,aAAA,EAAAvvD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAovD,aAAA,YAAAA,aAAA,YAAAA,aAAA,CACA7R,aAAA,CAAAA,aAAA,EAAA19C,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAu9C,aAAA,YAAAA,aAAA,YAAAA,aAAA,IAmBA,CAAA8X,iBAAA,EACAlqC,UAAA,KACA1D,WAAA,KACA+4B,UAAA,KACA4R,WAAA,GACA,EACAt/C,eAAA,EACAq+C,MAAA,GACAC,MAAA,GACAwB,MAAA,IACAC,MAAA,GACA,EACAz0C,cAAA,EACAk3C,YAAA,IACAC,aAAA,IACA/B,gBAAA,IACAE,eAAA,GACA,EACA/S,eAAA,EACA+B,aAAA,cACA,EACA4Q,UAAA,CAy0BA,OAAAjE,mBAEA,GAEAhwD,MC/3BA,+OAAAC,CAAA,CAAAgC,EAAA,CAAA/B,aAAA,CAAAwhB,KAAA,CAAAtR,QAAA,CAAAI,eAAA,CAAArC,SAAA,CAAA6hD,mBAAA,eA6DA,SAAAqG,cAAA93C,UAAA,EACA,IAAA8J,WAAA,CAAA9J,UAAA,CAAAld,IAAA,iBACAmtD,QAAA,CAAAnmC,WAAA,CAAAhnB,IAAA,cACAi1D,UAAA,CAAAthC,IAAA,CAAAuhC,IAAA,CAAA9uC,UAAA,CAAAY,WAAA,CAAAV,GAAA,sBAEA,OACAmE,UAAA,CAAA0iC,QAAA,CAAAzhC,KAAA,KAAAypC,WAAA,CAAArC,gBAAA,GAAAqC,WAAA,CAAAP,YAAA,CACA7tC,WAAA,KAEA+4B,UAAA,CAAAqN,QAAA,CAAAzhC,KAAA,GACAgmC,WAAA,CAAAuD,UACA,CACA,CACA,SAAArV,YAAA1iC,UAAA,EACA,IAAA8J,WAAA,CAAA9J,UAAA,CAAAld,IAAA,iBACAmtD,QAAA,CAAAnmC,WAAA,CAAAhnB,IAAA,cACAgiB,YAAA,CAAAmrC,QAAA,CAAApmD,QAAA,OACAquD,WAAA,CAAA7yC,QAAA,CAAA4qC,QAAA,CAAA7mC,GAAA,qBACA+uC,UAAA,CAAA9yC,QAAA,CAAA4qC,QAAA,CAAA7mC,GAAA,oBACAgvC,WAAA,GAEApD,MAAA,CAAA3vC,QAAA,CAAAP,YAAA,CAAAk+B,IAAA,KAAAkV,WAAA,GACAjD,MAAA,CAAA5vC,QAAA,CAAAP,YAAA,CAAAlB,GAAA,KAAAu0C,UAAA,GACA,OACA5E,MAAA,CAAAyB,MAAA,GAAAiD,WAAA,CAAArC,gBAAA,CAAAqC,WAAA,CAAAP,YAAA,CACAlE,MAAA,GACAwB,MAAA,CAAAA,MAAA,CACAC,MAAA,CAAAA,MACA,CACA,CACA,SAAAoD,yBAAAr4C,UAAA,EACA,IAAAs4C,aAAA,CAAAR,aAAA,CAAA93C,UAAA,EACA,OAAAs4C,aAAA,CAAA/qC,UAAA,GAAAmkC,UAAA,CAAAnkC,UACA,CA5FA7rB,CAAA,CAAAA,CAAA,EAAAO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAV,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACAgC,EAAA,CAAAA,EAAA,EAAAzB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAsB,EAAA,YAAAA,EAAA,YAAAA,EAAA,CACA/B,aAAA,CAAAA,aAAA,EAAAM,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAT,aAAA,YAAAA,aAAA,YAAAA,aAAA,CACAkQ,QAAA,CAAAA,QAAA,EAAA5P,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAyP,QAAA,YAAAA,QAAA,YAAAA,QAAA,CACAI,eAAA,CAAAA,eAAA,EAAAhQ,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6P,eAAA,YAAAA,eAAA,YAAAA,eAAA,CACArC,SAAA,CAAAA,SAAA,EAAA3N,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAwN,SAAA,YAAAA,SAAA,YAAAA,SAAA,CACA6hD,mBAAA,CAAAA,mBAAA,EAAAxvD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAqvD,mBAAA,YAAAA,mBAAA,YAAAA,mBAAA,IAwBA,CAAAnxC,UAAA,eAMAC,YAAA,0BAMA03C,WAAA,EACAP,YAAA,IACAC,aAAA,GACA/B,gBAAA,GACAE,eAAA,GACA,EAkDA3jD,MAAA,CAAAxQ,aAAA,EACAW,IAAA,eAIAC,IAAA,UAAAA,KAAA,EAcA,SAAAiZ,UAAA,EAEA,OAAA5L,SAAA,CAAAjF,eAAA,CAAA/F,UAAA,CAAAmL,UAAA,GAAAnL,UAAA,CAAAoL,cAAA,GAAA7F,cAAA,iBACA,CACA,SAAA+xC,aAAA,EACA1gC,SAAA,GACAhZ,IAAA,CAAAqd,IAAA,GAEArd,IAAA,CAAAqe,IAAA,EAEA,CACA,SAAA03C,WAAA,EACA/1D,IAAA,CAAAg1D,YAAA,CAAAh4C,QAAA,YACA64C,wBAAA,CAAAr4C,UAAA,GACAw4C,aAAA,CAAAx4C,UAAA,EAEAy4C,QAAA,IAEAC,SAAA,EAEA,CACA,SAAAD,SAAA,EACAj2D,IAAA,CAAAg1D,YAAA,CAAA33C,IAAA,GACArd,IAAA,CAAAgE,OAAA,UACAhE,IAAA,CAAA+3C,MAAA,CAAAE,MAAA,EACA,CACA,SAAAie,UAAA,EACAl2D,IAAA,CAAAg1D,YAAA,CAAAh4C,QAAA,YACAhd,IAAA,CAAAg1D,YAAA,CAAA32C,IAAA,GAEAre,IAAA,CAAAgE,OAAA,QACAhE,IAAA,CAAA+3C,MAAA,CAAAC,OAAA,EACA,CACA,SAAAge,cAAAG,cAAA,EACAjH,UAAA,CAAAoG,aAAA,CAAAa,cAAA,EACA9uD,QAAA,CAAA64C,WAAA,CAAAiW,cAAA,EACAn2D,IAAA,CAAAg1D,YAAA,CAAAI,aAAA,CAAAl2D,CAAA,CAAAosB,KAAA,CAAA4jC,UAAA,EAAAhwD,CAAA,CAAAosB,KAAA,CAAAjkB,QAAA,EACA,MAlDA,CAAArH,IAAA,MACAoC,UAAA,MAAAnC,aAAA,GACA4P,iBAAA,CAAAzN,UAAA,CAAAsL,UAAA,GACAoC,eAAA,EAAAD,iBAAA,CAAAV,SAAA,yBACAqO,UAAA,CAAApb,UAAA,CAAAhC,aAAA,GAAAC,cAAA,GAAAgR,MAAA,GACA,KAAA2jD,YAAA,CAAA/F,mBAAA,CAAAwG,WAAA,EAAA11D,IAAA,GAAA+Q,MAAA,CAAA0M,UAAA,EAAAla,EAAA,oBACA4yD,SAAA,EACA,GAAA73C,IAAA,GA8CA,KAAA05B,MAAA,MAAA33C,aAAA,GAAA05C,UAAA,GAAAC,WAAA,EACA91B,KAAA,CAAA/iB,EAAA,gBACA2iB,IAAA,0BACAG,OAAA,eACAvS,IAAA,CAAAvQ,EAAA,eACA,GAGA,KAAA62C,MAAA,CAAAz0C,EAAA,kBAAAgL,CAAA,EACAA,CAAA,CAAAoW,cAAA,GACAtiB,UAAA,CAAA4B,OAAA,IAAA+Z,YAAA,SACA,GACAlO,iBAAA,CAAAQ,cAAA,EACAP,eAAA,CAAAs+B,MAAA,EACA/+B,QAAA,CAAAkB,GAAA,CAAAd,eAAA,CAAAe,YAAA,CAAAV,eAAA,CAAAs+B,MAAA,MAAAr+B,OAAA,kBACA3N,UAAA,CAAA4B,OAAA,IAAA+Z,YAAA,SACA,GACAtN,UAAA,IACAC,OAAA,GACA,GAKA,KAAAyO,OAAA,GAGA/c,UAAA,CAAAkB,EAAA,YAAAo2C,YAAA,EAAAp2C,EAAA,yBACA0yD,aAAA,CAAAx4C,UAAA,CACA,GAAAla,EAAA,qCACAtD,IAAA,CAAAqf,MAAA,EACA,GAAA/b,EAAA,sCACAtD,IAAA,CAAAmf,OAAA,GACA+2C,SAAA,EACA,GAAA5yD,EAAA,IAAAya,YAAA,oBACA/E,SAAA,IACA+8C,UAAA,EAEA,EACA,EAIA/mD,OAAA,UAAAA,QAAA,EACA,KAAAgmD,YAAA,CAAAhmD,OAAA,GACAK,QAAA,CAAAJ,MAAA,UAAAc,OAAA,KACA,EAIAsP,MAAA,UAAAA,OAAA,EACA,KAAA04B,MAAA,CAAA14B,MAAA,EACA,EAIAF,OAAA,UAAAA,QAAA,EACA,KAAA44B,MAAA,CAAA54B,OAAA,EACA,EAIA9B,IAAA,UAAAA,KAAA,EACA,KAAA06B,MAAA,CAAA16B,IAAA,EACA,EAIAgB,IAAA,UAAAA,KAAA,EACA,KAAA05B,MAAA,CAAA15B,IAAA,EACA,CACA,GAnLA6wC,UAAA,CAAA7nD,QAAA,CAqLA,OAAAsI,MAEA,GAEA1Q,MC3OA,oKAAAsQ,GAAA,CAAArQ,CAAA,CAAAsD,SAAA,CAAAC,UAAA,CAAAC,QAAA,CAAAwiD,gBAAA,mBAAAkR,QAAA,CA8aAniC,IAAA,CAAA6gB,GAAA,CAAAuhB,SAAA,CAAApiC,IAAA,CAAA8I,GAAA,CA9YA,SAAAu5B,kBAAA1zD,IAAA,CAAAC,OAAA,CAAAC,QAAA,EACA,IAAAC,IAAA,CAAAC,QAAA,CAAAJ,IAAA,CAAAC,OAAA,EACA,OAAAC,QAAA,KAAAC,IAAA,CAAAE,CAAA,CAAAF,IAAA,CACA,CAmGA,SAAAwzD,sBAAApzD,MAAA,EAoNA,SAAAqzD,cAAAC,UAAA,EACA,IAAAC,aAAA,CACA5gC,QAAA,EAAAA,QAAA,CAAA6gC,MAAA,EAAAF,UAAA,EAAAA,UAAA,CAAA7vD,EAAA,GACA8vD,aAAA,CAAA5gC,QAAA,CAAA6gC,MAAA,CAAAr2D,IAAA,2BAAAm2D,UAAA,CAAA7vD,EAAA,KACA8vD,aAAA,CAAA/1D,MAAA,GACAzB,CAAA,CAAAkjB,QAAA,CAAAq0C,UAAA,CAAAG,SAAA,IACAF,aAAA,IAAAE,SAAA,CAAAH,UAAA,CAAAG,SAAA,EAEA13D,CAAA,CAAAkjB,QAAA,CAAAq0C,UAAA,CAAAI,UAAA,IACAH,aAAA,IAAAG,UAAA,CAAAJ,UAAA,CAAAI,UAAA,GAIA,CAKA,SAAAC,sBAAA,EACA,IAAAhhC,QAAA,GAAAA,QAAA,CAAA4b,OAAA,CACA,OAEA,MAAAljC,QAAA,EAAAsnB,QAAA,CAAA4b,OAAA,EACA,IAAAqlB,oBAAA,SACAvoD,QAAA,CAAA7N,MAAA,QACA,CAAA2jD,eAAA,CAAA/0C,GAAA,CAAAf,QAAA,CAAAid,KAAA,IACAorC,UAAA,CAAAvS,eAAA,CAAAuS,UAAA,GACAD,SAAA,CAAAtS,eAAA,CAAAsS,SAAA,GACA,IAAAI,QAAA,CAAA1S,eAAA,CAAA1hD,IAAA,qBAEA,GADA4L,QAAA,CAAAsE,IAAA,IAAA9K,KAAA,CAAAsS,IAAA,CAAAgqC,eAAA,CAAA9tB,QAAA,KACA,EAAAqgC,UAAA,IAAAD,SAAA,EAAAI,QAAA,CAEA,GADAD,oBAAA,IACAC,QAAA,EACA,MAAAP,UAAA,CAAAv3D,CAAA,CAAAoB,IAAA,CAAA22D,SAAA,EACArwD,EAAA,CAAAowD,QACA,GACAP,UAAA,CAAAG,SAAA,CAAAA,SAAA,CACAH,UAAA,CAAAI,UAAA,CAAAA,UACA,KACA,CAAAG,QAAA,CAAA93D,CAAA,CAAAg4D,QAAA,eACA5S,eAAA,CAAAxjD,IAAA,yBAAAk2D,QAAA,EACAC,SAAA,CAAAnkD,IAAA,EACAlM,EAAA,CAAAowD,QAAA,CACAJ,SAAA,CACAC,UACA,EAGA,CAGAE,oBAAA,EACAI,cAAA,CAAAnmD,MAAA,EAEA,CAKA,SAAAomD,qBAAA,EACAN,qBAAA,GACA7vC,MAAA,CAAAyzB,gBAAA,UAAA2c,yBAAA,IACA,CAKA,SAAAC,wBAAA,EACArwC,MAAA,CAAA0zB,mBAAA,UAAA0c,yBAAA,IACA,CAKA,SAAAE,eAAA,EACAr4D,CAAA,CAAAyE,OAAA,CAAAszD,SAAA,CAAAT,aAAA,CACA,CAOA,SAAAgB,gBAAA19B,KAAA,EACA,OAAAu8B,SAAA,CAAAoB,YAAA,CAAArB,QAAA,CAAA1vC,UAAA,CAAAoT,KAAA,EAAA49B,YAAA,EACA,CAKA,SAAAC,eAAA,EACA7hC,QAAA,EACAA,QAAA,CAAA8hC,MAAA,CAAAhxC,GAAA,EACAyY,SAAA,UAAAw4B,SAAA,GACA,EAEA,CAKA,SAAAC,cAAA,EACA,IAAAC,aAAA,CACAjiC,QAAA,GACAiiC,aAAA,CAAAjiC,QAAA,CAAAkiC,UAAA,CAAA1sC,KAAA,KAAAvoB,IAAA,CAAA80D,SAAA,EACA/hC,QAAA,CAAAkiC,UAAA,CAAAj4C,MAAA,CAAAg4C,aAAA,EAAA9oD,MAAA,GACA6mB,QAAA,CAAAkiC,UAAA,CAAAD,aAAA,CAEA,CAKA,SAAAE,cAAA,EACA,GAAA7S,wBAAA,EAGA,MAAAh7B,OAAA,CAAA7a,GAAA,CAAA0X,MAAA,EACAm+B,wBAAA,CAAAjiD,MAAA,CAAAuiD,QAAA,CAAAt7B,OAAA,CAAA4B,KAAA,GAAAksC,QAAA,CACA9S,wBAAA,CAAAjiD,MAAA,CAAAyxD,SAAA,CAAAxqC,OAAA,CAAAtD,MAAA,GAAAoxC,QAAA,CACA,CAKA,SAAAC,UAAA,EACAriC,QAAA,EAAAA,QAAA,CAAA6gC,MAAA,GACAyB,WAAA,CAAAtiC,QAAA,CAAA4b,OAAA,CAAA1lB,KAAA,GACAqsC,YAAA,CAAAviC,QAAA,CAAA4b,OAAA,CAAA5qB,MAAA,GACAgP,QAAA,CAAA6gC,MAAA,CAAA3qC,KAAA,CAAAosC,WAAA,EAAAtxC,MAAA,CAAAuxC,YAAA,EAEA,CAKA,SAAAC,WAAA,EACA,IAAAjxD,QAAA,CACAyuB,QAAA,EAAAA,QAAA,CAAA4b,OAAA,GACArqC,QAAA,CAAA+9C,wBAAA,CAAA/9C,QAAA,CACAA,QAAA,CAAA24C,CAAA,EAAA8B,EAAA,CAAAhsB,QAAA,CAAA4b,OAAA,CAAAmlB,UAAA,GACAxvD,QAAA,CAAA44C,CAAA,EAAA+B,EAAA,CAAAlsB,QAAA,CAAA4b,OAAA,CAAAklB,SAAA,GACAO,cAAA,CAAAoB,MAAA,CAAAlxD,QAAA,CAAA24C,CAAA,CAAA34C,QAAA,CAAA44C,CAAA,EAEA,CAKA,SAAAuY,eAAA,EACAC,QAAA,KAAAxxC,MAAA,CAAAyxC,gBAAA,CAAAC,eAAA,CACA,CAKA,SAAAC,cAAA,EACA9iC,QAAA,EAAAA,QAAA,CAAA4b,OAAA,EACA+mB,QAAA,CAAAI,OAAA,CAAA/iC,QAAA,CAAA4b,OAAA,CAAAp+B,GAAA,KACAwlD,SAAA,IAEA/5B,UAAA,IAEAg6B,aAAA,IAEAC,OAAA,GACA,GAGA5B,oBAAA,EACA,CAKA,SAAA6B,aAAA,EACAR,QAAA,CAAA1pC,UAAA,GACAuoC,uBAAA,EACA,CASA,SAAA4B,mBAAAC,UAAA,CAAAC,UAAA,CAAAC,aAAA,KACA,CAAAC,KAAA,GACA5kC,KAAA,CAAAmjC,SAAA,CAKA,MAJA,CAAAuB,UAAA,GACAE,KAAA,CAAAF,UAAA,EAAAvB,SAAA,MACAnjC,KAAA,EAAA0kC,UAAA,CAAAvB,SAAA,CAAAwB,aAAA,GAAAD,UAAA,CAAAC,aAAA,GAEAF,UAAA,CAAAzkC,KAAA,CAAA4kC,KACA,CAQA,SAAAC,oBAAAvZ,CAAA,CAAAC,CAAA,EACA,IAAA1pC,EAAA,CAYA,MATA,CAAAypC,CAAA,CAAAA,CAAA,IACAC,CAAA,CAAAA,CAAA,IACAnqB,QAAA,EACAA,QAAA,CAAAszB,QAAA,CAAA73C,QAAA,WAEAgF,EAAA,CAAA4F,QAAA,CAAAq9C,gBAAA,CAAAxZ,CAAA,CAAAC,CAAA,EACAnqB,QAAA,EACAA,QAAA,CAAAszB,QAAA,CAAA93C,WAAA,WAEAiF,EACA,CASA,SAAAkjD,eAAAniD,IAAA,CAAA+9B,IAAA,CAAA9mC,MAAA,KACA,CAAAmrD,KAAA,CAAAnqD,GAAA,CAAA+H,IAAA,EACAqiD,KAAA,CAAApqD,GAAA,CAAA8lC,IAAA,EACA3D,OAAA,CAAAniC,GAAA,CAAAhB,MAAA,EACAqrD,OAAA,EAAAF,KAAA,CAAA1sD,KAAA,IA4BA,MAzBA,CAAA0sD,KAAA,CAAAniD,OAAA,GAAA/L,IAAA,YACA,IAAAquD,KAAA,CAAAtqD,GAAA,cACAsqD,KAAA,CAAAx3D,EAAA,CAAAs3D,KAAA,OACA,CAAAC,OAAA,CAAA9mD,IAAA,CAAA+mD,KAAA,CAAA7sD,KAAA,GAIA,GAGA4sD,OAAA,CAAAE,GAAA,GAGAF,OAAA,CAAAj5D,MAAA,EACA+4D,KAAA,CAAAhoB,OAAA,CACAxyC,CAAA,CAAAysB,YAAA,CAAAiuC,OAAA,UAAA5sD,KAAA,EAEA,GADA0sD,KAAA,CAAAA,KAAA,CAAAljC,QAAA,GAAAujC,EAAA,CAAA/sD,KAAA,EACA,CAAA0sD,KAAA,CAAA/4D,MAAA,CACA,QAEA,IAGA+4D,KAAA,CAAAnqD,GAAA,GAEAmqD,KACA,IAtdA,CAAAM,UAAA,CAAA96D,CAAA,CAAAmE,QAAA,CAAAF,MAAA,KAAAyqB,aAAA,EACA6pC,YAAA,CAAA/wC,UAAA,CAAAszC,UAAA,CAAAC,QAAA,EACAvC,YAAA,CAAAhxC,UAAA,CAAAszC,UAAA,CAAAE,QAAA,EACAC,aAAA,CAAAzzC,UAAA,CAAAszC,UAAA,CAAAI,SAAA,EACAvC,SAAA,CAAAL,eAAA,CAAAwC,UAAA,CAAAlgC,KAAA,EACAo+B,QAAA,CAAAxxC,UAAA,CAAAszC,UAAA,CAAA9B,QAAA,EACAmC,WAAA,MACAvkC,QAAA,MACA2iC,QAAA,MAEAxB,SAAA,IAEAqD,sBAAA,CAAAp7D,CAAA,CAAAmE,QAAA,CAAAF,MAAA,CAAAA,MAAA,CAAAX,SAAA,QAAA+3D,6BAAA,EAKApD,cAAA,CAAA30D,SAAA,EAKAg4D,YAAA,UAAAA,aAAA,EACA,OAAA3C,SACA,EAKA4C,SAAA,UAAAA,UAAA,EACA,OAAA3kC,QAAA,EAAAA,QAAA,CAAA4b,OACA,EAQAgpB,SAAA,UAAAA,UAAAC,UAAA,EAeA,MAdA,CAAA7kC,QAAA,EACAA,QAAA,CAAA4b,OAAA,CAAAipB,UAAA,CACA7kC,QAAA,CAAA8kC,WAAA,MACAxD,oBAAA,GAMA,KAAApzD,OAAA,gBAAA8xB,QAAA,CAAA4b,OAAA,EACA,KAAA1gC,MAAA,IAEAqpD,WAAA,CAAAM,UAAA,CAEA,IACA,EAOAE,MAAA,UAAAA,OAAA/gC,KAAA,EAcA,MAbA,CAAAA,KAAA,EAAA56B,CAAA,CAAAqM,QAAA,CAAAuuB,KAAA,IACA+9B,SAAA,CAAAL,eAAA,CAAA19B,KAAA,GAEA69B,cAAA,GACAG,aAAA,GACAG,aAAA,GACAK,UAAA,GAMA,KAAAt0D,OAAA,QAAA6zD,SAAA,EACA,IACA,EAOAiD,MAAA,UAAAA,OAAAzY,IAAA,EAIA,MAHA,CAAAA,IAAA,EAAAnjD,CAAA,CAAAqM,QAAA,CAAA82C,IAAA,GACA,KAAAwY,MAAA,CAAAhD,SAAA,CAAAnxC,UAAA,CAAA27B,IAAA,GAEA,IACA,EAMA0Y,MAAA,UAAAA,OAAA,EACA,YAAAD,MAAA,CAAAX,aAAA,CACA,EAMAa,OAAA,UAAAA,QAAA,EACA,YAAAF,MAAA,EAAAX,aAAA,CACA,EAOA5B,MAAA,UAAAA,OAAAvY,CAAA,CAAAC,CAAA,EACA,IAAA54C,QAAA,CACAyuB,QAAA,GACAzuB,QAAA,MAAA4zD,SAAA,CAAAjb,CAAA,CAAAC,CAAA,EACAnqB,QAAA,CAAA8hC,MAAA,CAAAhxC,GAAA,EACAxF,GAAA,EAAA/Z,QAAA,CAAA+Z,GAAA,CACAo/B,IAAA,EAAAn5C,QAAA,CAAAm5C,IACA,GAEA,EAOAya,SAAA,UAAAA,UAAAjb,CAAA,CAAAC,CAAA,EACA,OACA7+B,GAAA,CAAA83C,kBAAA,CAAAjZ,CAAA,CAAAoY,YAAA,CAAAjT,wBAAA,CAAA/9C,QAAA,CAAAyf,MAAA,EACA05B,IAAA,CAAA0Y,kBAAA,CAAAlZ,CAAA,CAAAoY,WAAA,CAAAhT,wBAAA,CAAA/9C,QAAA,CAAA2kB,KAAA,CACA,CACA,EAMAhb,MAAA,UAAAA,OAAA,EAkBA,MAjBA,CAAA8kB,QAAA,EAAAA,QAAA,CAAA4b,OAAA,GACA5b,QAAA,CAAA6gC,MAAA,CAAA7gC,QAAA,CAAA4b,OAAA,CAAApmB,KAAA,GAAA1U,UAAA,OACAkf,QAAA,CAAA6gC,MAAA,CAAAr2D,IAAA,WAAA2O,MAAA,GACA6mB,QAAA,CAAA6gC,MAAA,CAAAr2D,IAAA,8BAAAsW,UAAA,wBACAkf,QAAA,CAAA8hC,MAAA,CAAApqC,KAAA,GAAA1b,MAAA,CAAAgkB,QAAA,CAAA6gC,MAAA,EACA7gC,QAAA,CAAA6gC,MAAA,CAAAr2D,IAAA,UAAAykB,IAAA,aACAozC,SAAA,GACAR,cAAA,GACAW,UAAA,GACAL,aAAA,GACAV,cAAA,GAKA,KAAAvzD,OAAA,YAEA,IACA,CACA,EAAA4pB,aAAA,EAMA+qC,eAAA,CAAAz5D,CAAA,CAAA4oC,QAAA,CAAA5oC,CAAA,CAAAovC,IAAA,CAAA6oB,cAAA,CAAAnmD,MAAA,CAAAmmD,cAAA,MAMAE,yBAAA,CAAAn4D,CAAA,CAAA4tB,QAAA,UAAA5oB,KAAA,KACA,CAAAwtC,OAAA,CAAAniC,GAAA,CAAArL,KAAA,CAAAqK,MAAA,EACA2sD,YAAA,CAAAh3D,KAAA,CAAAqK,MAAA,CAAAqoD,SAAA,CACAC,UAAA,CAAA3yD,KAAA,CAAAqK,MAAA,CAAAsoD,UAAA,CACAG,QAAA,CAAAP,UAAA,CAGA3gC,QAAA,EAAAA,QAAA,CAAA6gC,MAAA,EAAAjlB,OAAA,CAAA9uC,IAAA,sBACAo0D,QAAA,CAAAtlB,OAAA,CAAA9uC,IAAA,qBACA6zD,UAAA,CAAAv3D,CAAA,CAAAoB,IAAA,CAAA22D,SAAA,EACArwD,EAAA,CAAAowD,QACA,GACAP,UAAA,CAAAG,SAAA,CAAAsE,YAAA,CACAzE,UAAA,CAAAI,UAAA,CAAAA,UAAA,CAGAL,aAAA,CAAAC,UAAA,IAGAO,QAAA,CAAA93D,CAAA,CAAAg4D,QAAA,eACAxlB,OAAA,CAAA5wC,IAAA,yBAAAk2D,QAAA,EACAC,SAAA,CAAAnkD,IAAA,EACAlM,EAAA,CAAAowD,QAAA,CACAJ,SAAA,CAAAsE,YAAA,CACArE,UAAA,CAAAA,UACA,GAGAM,cAAA,CAAAnmD,MAAA,GAEA,MAhMAonD,WAAA,CAAAC,YAAA,CAAAvW,EAAA,CAAAE,EAAA,CAEAoD,wBAAA,CA8gBA,MAlEA,CAAAA,wBAAA,CAAAF,gBAAA,KAAA5hD,EAAA,0BAAA0T,QAAA,KAEA,CAAAmkD,uBAAA,MACAhtD,QAAA,MAAArK,UAAA,GACAqK,QAAA,CAAAoD,QAAA,wBACA4lD,cAAA,CAAA7yD,WAAA,CAAAgyD,iBAAA,EAAAhzD,EAAA,wBACA,CAAAtD,IAAA,MACAyvC,UAAA,MAAA3rC,UAAA,GACA,KAAAuhB,QAAA,cAGAy8B,EAAA,EAAArS,UAAA,CAAA1kB,UAAA,GAAA0kB,UAAA,CAAAzjB,KAAA,MACAg2B,EAAA,EAAAvS,UAAA,CAAApoB,WAAA,GAAAooB,UAAA,CAAA3oB,MAAA,MACAgP,QAAA,EACA4b,OAAA,CAAA2oB,WAAA,CACAzC,MAAA,CAAAroD,GAAA,UAAAkgC,UAAA,EACAuoB,UAAA,CAAAzoD,GAAA,UAAAkgC,UAAA,EACA2Z,QAAA,CAAA75C,GAAA,YAAAkgC,UAAA,CACA,EACA4qB,WAAA,MAGA5qB,UAAA,CAAAnsC,EAAA,kEAAAY,KAAA,EACAA,KAAA,CAAAwgB,cAAA,GACA1kB,IAAA,CAAAg7D,OAAA,EACA,GAGAvrB,UAAA,CAAAnsC,EAAA,iEAAAY,KAAA,EACAA,KAAA,CAAAwgB,cAAA,GACA1kB,IAAA,CAAA+6D,MAAA,EACA,GAGAtrB,UAAA,CAAAnsC,EAAA,+CAAAY,KAAA,EACAA,KAAA,CAAAwgB,cAAA,GACA1kB,IAAA,CAAAqe,IAAA,GACAre,IAAA,CAAAgE,OAAA,SACA,GAGAyrC,UAAA,CAAAnsC,EAAA,wCAAAY,KAAA,EACAu1D,cAAA,CAAAF,mBAAA,CAAAr1D,KAAA,CAAAk3D,KAAA,CAAAl3D,KAAA,CAAAm3D,KAAA,EAAAvlC,QAAA,CAAA8hC,MAAA,CAAA9hC,QAAA,CAAA4b,OAAA,EAAA3iC,KAAA,GAAA/N,KAAA,EACA,GACAw3D,cAAA,GACAP,aAAA,GACAN,cAAA,EACA,GAAAr0D,EAAA,mBACAq1D,eAAA,GACAC,aAAA,GACAuC,uBAAA,CAAA99C,IAAA,EACA,GAAA/Z,EAAA,mBACA21D,YAAA,GACAkC,uBAAA,CAAA98C,IAAA,EACA,GAAA/a,EAAA,sBACA21D,YAAA,GACAoB,WAAA,MACAvkC,QAAA,MACA2iC,QAAA,MACA0C,uBAAA,CAAAnsD,OAAA,EACA,GAAAjP,IAAA,CAAAi6D,UAAA,EAAAlpD,MAAA,CAAAkG,QAAA,CACA,GAAA1T,EAAA,+BACAg1D,UAAA,EACA,GAAAh1D,EAAA,qBACA20D,aAAA,EACA,GAAAl4D,IAAA,CAAAu6D,sBAAA,EACAnD,cACA,CA/pBA5nD,GAAA,CAAAA,GAAA,EAAA9P,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA2P,GAAA,YAAAA,GAAA,YAAAA,GAAA,CACArQ,CAAA,CAAAA,CAAA,EAAAO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAV,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACAsD,SAAA,CAAAA,SAAA,EAAA/C,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA4C,SAAA,YAAAA,SAAA,YAAAA,SAAA,CACAC,UAAA,CAAAA,UAAA,EAAAhD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6C,UAAA,YAAAA,UAAA,YAAAA,UAAA,CACAC,QAAA,CAAAA,QAAA,EAAAjD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA8C,QAAA,YAAAA,QAAA,YAAAA,QAAA,CACAwiD,gBAAA,CAAAA,gBAAA,EAAAzlD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAslD,gBAAA,YAAAA,gBAAA,YAAAA,gBAAA,CAEAxiD,QAAA,CAAA8B,aAAA,GACA9B,QAAA,CAAAD,UAAA,EACAC,QAAA,CAAA8B,aAAA,QAEA,CAAAxB,QAAA,CAAAP,UAAA,CAAAgC,QAAA,UAAAhC,UAAA,CAAAiC,MAAA,CAAAC,OAAA,CAAAC,QAAA,CAAAhC,IAAA,EACA,KAAAkC,YAAA,gBACAH,OAAA,MAAAI,KAAA,CAAAJ,OAAA,CAAAlC,UAAA,CAAAkC,OAAA,EAAA/B,IAAA,CAAAA,IAAA,KACA,IAAAoC,MAAA,IAAAG,YAAA,YAAAD,gBAAA,MAAAA,gBAAA,CAAAD,aAAA,CAAAN,OAAA,CAAAM,aAAA,CAAAG,MAAA,CAAAC,MAAA,CAAAxC,OAAA,CAcA,MAXA,CAAAmC,MAAA,0DACAK,MAAA,CAAAV,OAAA,CAAAm1B,KAAA,EAAA10B,MAAA,CAAAC,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,IACAyC,MAAA,CAAAX,MAAA,EAAAA,MAAA,CAAAo1B,KAAA,CAAA10B,MAAA,qBAAAC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,EAAAY,IAAA,IAAA1C,IAAA,CAAAA,IAAA,GAAAyC,MAAA,EACAL,MAAA,EAAAE,gBAAA,CAAAE,MAAA,EACA,2LACAF,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,gBAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,qBAAA7B,OAAA,IACA,sHACAqC,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,gBAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,qBAAA7B,OAAA,IACA,sIACAqC,gBAAA,EAAAG,MAAA,CAAAV,OAAA,CAAAzD,EAAA,EAAAwD,MAAA,EAAAA,MAAA,CAAAxD,EAAA,CAAA2B,OAAA,EAAAyC,IAAA,IAAA1C,IAAA,CAAAA,IAAA,EAAAyC,MAAA,CAAAA,MAAA,CAAAzF,IAAA,CAAA8E,MAAA,mBAAA7B,OAAA,EAAAoC,aAAA,CAAArF,IAAA,CAAA8E,MAAA,wBAAA7B,OAAA,IACA,uEACAmC,MACA,GA4BAs2D,WAAA,CAAAr0C,MAAA,CAAAs0C,MAAA,CAAAvvC,KAAA,CAAA/E,MAAA,CAAAs0C,MAAA,CAAAz0C,MAAA,CAMA00C,aAAA,IAOAC,cAAA,IAMAC,eAAA,KAMAC,eAAA,GAMAC,eAAA,GAMAC,YAAA,CAAAF,eAAA,CAMA/tC,aAAA,EACAkM,KAAA,CAAA+hC,YAAA,CACA5B,QAAA,CAAA0B,eAAA,CACAzB,QAAA,CAAA0B,eAAA,CACAxB,SAAA,IACA0B,QAAA,CAAAJ,eAAA,CACAxD,QAAA,GACA,EACAqC,6BAAA,EACApZ,SAAA,IACAoE,SAAA,IACAC,mBAAA,IACAx5B,KAAA,CAAA0vC,eAAA,CAAAG,YAAA,CACA/0C,MAAA,CAAA40C,eAAA,CAAAG,YAAA,CAAAP,WAAA,CACA7V,QAAA,CAAAiW,eAAA,CAAAC,eAAA,CACAhW,SAAA,CAAA+V,eAAA,CAAAC,eAAA,CAAAL,WAAA,CACAhZ,aAAA,eACAlhC,GAAA,IACAo/B,IAAA,GACA,EA0iBA,OAAA+V,qBAEA,GAEAt3D,MCvqBA,kPAAAC,CAAA,CAAAgC,EAAA,CAAA/B,aAAA,CAAAwhB,KAAA,CAAAtR,QAAA,CAAAI,eAAA,CAAA8mD,qBAAA,CAAAnpD,SAAA,eAEAlO,CAAA,CAAAA,CAAA,EAAAO,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAV,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACAgC,EAAA,CAAAA,EAAA,EAAAzB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAsB,EAAA,YAAAA,EAAA,YAAAA,EAAA,CACA/B,aAAA,CAAAA,aAAA,EAAAM,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAT,aAAA,YAAAA,aAAA,YAAAA,aAAA,CACAkQ,QAAA,CAAAA,QAAA,EAAA5P,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAyP,QAAA,YAAAA,QAAA,YAAAA,QAAA,CACAI,eAAA,CAAAA,eAAA,EAAAhQ,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6P,eAAA,YAAAA,eAAA,YAAAA,eAAA,CACA8mD,qBAAA,CAAAA,qBAAA,EAAA92D,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA22D,qBAAA,YAAAA,qBAAA,YAAAA,qBAAA,CACAnpD,SAAA,CAAAA,SAAA,EAAA3N,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAwN,SAAA,YAAAA,SAAA,YAAAA,SAAA,IAwBA,CAAA0Q,UAAA,aAMAC,YAAA,wBAMAC,cAAA,EACA+9C,OAAA,GAEAC,OAAA,GAEAC,QAAA,GACA,EAKAC,SAAA,CAAA/8D,aAAA,EACAW,IAAA,aAIAC,IAAA,UAAAA,KAAA,EAaA,SAAAo8D,kBAAA,EACA,IAAA3+C,UAAA,CAoCA,MAnCA,CAAA25C,cAAA,GACA35C,UAAA,CAAApb,UAAA,CAAAhC,aAAA,GAAAkB,YAAA,GACA61D,cAAA,CAAAZ,qBAAA,EACA0D,QAAA,CAAAp9C,YAAA,CAAAk/C,OAAA,CACA7B,QAAA,CAAAr9C,YAAA,CAAAm/C,OAAA,CACA5B,SAAA,CAAAv9C,YAAA,CAAAo/C,QAAA,CACAz5D,SAAA,EACA0jD,QAAA,CAAA1oC,UAAA,CAAAnM,MAAA,GACA80C,kBAAA,CAAA3oC,UAAA,CAAAnM,MAAA,EACA,CACA,GAAA/N,EAAA,mBAIAtD,IAAA,CAAAgE,OAAA,kBACA,GAAAV,EAAA,mBAIAtD,IAAA,CAAAgE,OAAA,kBACA,GAAAV,EAAA,iBAAAw2B,KAAA,EAKA95B,IAAA,CAAAgE,OAAA,kBAAA81B,KAAA,CACA,GAAAx2B,EAAA,oBACA84D,aAAA,EACA,GAAA1B,SAAA,CAAAl9C,UAAA,EAKAxd,IAAA,CAAAgE,OAAA,sBAEAmzD,cACA,CAMA,SAAAn+C,UAAA,EAEA,OAAA5L,SAAA,CAAAjF,eAAA,CAAA/F,UAAA,CAAAmL,UAAA,GAAAnL,UAAA,CAAAoL,cAAA,GAAA7F,cAAA,gBACA,CAKA,SAAAwzC,aAAA,EACAniC,SAAA,GACAhZ,IAAA,CAAAqd,IAAA,GAEArd,IAAA,CAAAqe,IAAA,EAEA,CAKA,SAAAg+C,gBAAA,EACAr8D,IAAA,CAAAgd,QAAA,cACAhd,IAAA,CAAAgd,QAAA,WACAo/C,aAAA,GAEAE,aAAA,GAGA,CAMA,SAAAA,cAAA,EACAH,iBAAA,GACAhF,cAAA,CAAA90D,EAAA,YACA80D,cAAA,CAAA95C,IAAA,GAEArd,IAAA,CAAA+3C,MAAA,CAAAE,MAAA,GACA71C,UAAA,CAAA4B,OAAA,+BACAhE,IAAA,CAAAqlB,QAAA,aACA,CAMA,SAAA+2C,cAAA,EACAp8D,IAAA,CAAAqlB,QAAA,cACArlB,IAAA,CAAA+3C,MAAA,CAAAC,OAAA,GACA51C,UAAA,CAAA4B,OAAA,gCACAmzD,cAAA,GAAAA,cAAA,CAAA90D,EAAA,YACA80D,cAAA,CAAA94C,IAAA,EAEA,MA9GA,CAAAre,IAAA,MACAoC,UAAA,MAAAnC,aAAA,GACA4P,iBAAA,CAAAzN,UAAA,CAAAsL,UAAA,GACAmP,YAAA,CAAApd,MAAA,CAAAkL,MAAA,IAAAqT,cAAA,MAAA5L,SAAA,IACAtC,eAAA,EAAAD,iBAAA,CAAAV,SAAA,MAAA+sD,SAAA,KACA,IAAA/E,cAAA,MA4GA,KAAApf,MAAA,MAAA33C,aAAA,GAAA05C,UAAA,GAAAC,WAAA,EACA/1B,OAAA,WACAC,KAAA,CAAA/iB,EAAA,sCACAuQ,IAAA,CAAAvQ,EAAA,qBACA2iB,IAAA,OACA,GAGA,KAAAk0B,MAAA,CAAAz0C,EAAA,kBAAAY,KAAA,EACAA,KAAA,CAAAwgB,cAAA,GACAtiB,UAAA,CAAA4B,OAAA,IAAA+Z,YAAA,SACA,GAGAlO,iBAAA,CAAAQ,cAAA,EACAnR,CAAA,CAAAyE,OAAA,CAAAmM,eAAA,UAAA+P,OAAA,CAAAC,GAAA,EACAzQ,QAAA,CAAAkB,GAAA,CAAAd,eAAA,CAAAe,YAAA,CAAAqP,OAAA,4BAEAzd,UAAA,CAAA4B,OAAA,CAAA+Z,YAAA,CAAA+B,GAAA,CACA,GACArP,UAAA,GACA,EACA,GAIA0qC,YAAA,GACA,KAAAh8B,OAAA,GAGA/c,UAAA,CAEAkB,EAAA,uBACA63C,YAAA,GACAn7C,IAAA,CAAAmf,OAAA,EACA,GAAA7b,EAAA,yBACA6zD,cAAA,EACAA,cAAA,CAAAnmD,MAAA,GAAA6pD,MAAA,CAAAh+C,YAAA,CAAAk/C,OAAA,CAEA,GAAAz4D,EAAA,qCACAtD,IAAA,CAAAqf,MAAA,EACA,GAAA/b,EAAA,sCACAtD,IAAA,CAAAgd,QAAA,YACAo/C,aAAA,GAEAp8D,IAAA,CAAAmf,OAAA,EACA,GAAA7b,EAAA,sBACA6zD,cAAA,EACAA,cAAA,CAAAnoD,OAAA,GAEAmoD,cAAA,KACA,GAGA7zD,EAAA,IAAAya,YAAA,oBACA/E,SAAA,IACAqjD,eAAA,EAEA,GAAA/4D,EAAA,IAAAya,YAAA,gBACA/E,SAAA,IAAAhZ,IAAA,CAAAgd,QAAA,aAAAhd,IAAA,CAAAgd,QAAA,YACAm/C,iBAAA,GAAApB,MAAA,EAEA,GAAAz3D,EAAA,IAAAya,YAAA,iBACA/E,SAAA,IAAAhZ,IAAA,CAAAgd,QAAA,aAAAhd,IAAA,CAAAgd,QAAA,YACAm/C,iBAAA,GAAAnB,OAAA,EAEA,GAAA13D,EAAA,IAAAya,YAAA,mBACA/d,IAAA,CAAAgd,QAAA,YACAo/C,aAAA,EAEA,EACA,EAIAptD,OAAA,UAAAA,QAAA,EACAK,QAAA,CAAAJ,MAAA,mBACA,EAIAoQ,MAAA,UAAAA,OAAA,EACA,KAAA04B,MAAA,CAAA14B,MAAA,EACA,EAIAF,OAAA,UAAAA,QAAA,EACA,KAAA44B,MAAA,CAAA54B,OAAA,EACA,EAIA9B,IAAA,UAAAA,KAAA,EACA,KAAA06B,MAAA,CAAA16B,IAAA,EACA,EAIAgB,IAAA,UAAAA,KAAA,EACA,KAAA05B,MAAA,CAAA15B,IAAA,EACA,CACA,GAEA,OAAA69C,SAEA,GAEAj9D,MC1RA,yLAAAgE,CAAA,CAAA/B,EAAA,CAAAyf,KAAA,CAAA47C,WAAA,CAAAltD,QAAA,CAAAI,eAAA,CAAAtQ,aAAA,CAAAiO,SAAA,mBAAAovD,SAAA,CAsIAvoC,IAAA,CAAA8I,GAAA,CApIA95B,CAAA,CAAAA,CAAA,EAAAxD,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAqD,CAAA,YAAAA,CAAA,YAAAA,CAAA,CACA/B,EAAA,CAAAA,EAAA,EAAAzB,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAsB,EAAA,YAAAA,EAAA,YAAAA,EAAA,CACAq7D,WAAA,CAAAA,WAAA,EAAA98D,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA28D,WAAA,YAAAA,WAAA,YAAAA,WAAA,CACAltD,QAAA,CAAAA,QAAA,EAAA5P,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAyP,QAAA,YAAAA,QAAA,YAAAA,QAAA,CACAI,eAAA,CAAAA,eAAA,EAAAhQ,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAA6P,eAAA,YAAAA,eAAA,YAAAA,eAAA,CACAtQ,aAAA,CAAAA,aAAA,EAAAM,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAT,aAAA,YAAAA,aAAA,YAAAA,aAAA,CACAiO,SAAA,CAAAA,SAAA,EAAA3N,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAwN,SAAA,YAAAA,SAAA,YAAAA,SAAA,MA2BA,CAAAqvD,QAAA,KAMAC,SAAA,IAMA7iC,SAAA,EACA8iC,KAAA,IACAC,KAAA,IACA,EAOAC,aAAA,CAAAA,CAAAnrB,OAAA,CAAA5X,KAAA,SACA,CAAAplB,OAAA,CAAAg9B,OAAA,CAAArgC,MAAA,GACAyrD,QAAA,CAAAhjC,KAAA,CAAA2iC,QAAA,CACAM,UAAA,CAAAroD,OAAA,CAAAqW,UAAA,KAAA2mB,OAAA,CAAA1lB,KAAA,GAAA8wC,QAAA,CACAC,UAAA,EACAR,WAAA,CAAAS,kBAAA,CAAAtrB,OAAA,QACAh9B,OAAA,CAAAkS,GAAA,sBAEA21C,WAAA,CAAAS,kBAAA,CAAAtrB,OAAA,UACAh9B,OAAA,CAAAkS,GAAA,oBAEA21C,WAAA,CAAAU,KAAA,CAAAvrB,OAAA,CAAAorB,QAAA,CACA,EAMAI,UAAA,CAAAxrB,OAAA,GACA6qB,WAAA,CAAAY,KAAA,CAAAzrB,OAAA,CACA,EAOA0rB,YAAA,CAAA1rB,OAAA,GACA,MAAA2rB,GAAA,CAAA3rB,OAAA,IACA2rB,GAAA,GACAA,GAAA,CAAAC,KAAA,CAAAzoB,OAAA,QACAwoB,GAAA,CAAAE,YAAA,CACAF,GAAA,CAAAC,KAAA,CAAAzoB,OAAA,IAEA,EAKA,IAAA2oB,IAAA,CAAAr+D,aAAA,EACAW,IAAA,QAIAC,KAAA,OACA,CAAAqC,UAAA,MAAAnC,aAAA,GACA4P,iBAAA,CAAAzN,UAAA,CAAAsL,UAAA,GACAoC,eAAA,EAAAD,iBAAA,CAAAV,SAAA,WAAAY,OAAA,QACA0tD,mBAAA,MAAAr9D,aAAA,GAAAkB,YAAA,GAAAgS,GAAA,IAMAkxC,YAAA,CAAAA,CAAA,GAEAp3C,SAAA,CAAAjF,eAAA,CAAA/F,UAAA,CAAAmL,UAAA,GAAAnL,UAAA,CAAAoL,cAAA,GAAA7F,cAAA,WACA,CAKAwzC,YAAA,CAAAA,CAAA,IACAqJ,YAAA,GAEA,KAAAnnC,IAAA,GAEA,KAAAgB,IAAA,EAEA,EACAq/C,UAAA,CAAAC,GAAA,GACA,MAAAC,GAAA,CAAAlB,SAAA,CAAAiB,GAAA,CACA,QAAAE,WAAA,OACA,CAAAtnD,EAAA,MAAAsnD,WAAA,IACA99C,MAAA,CAAAxJ,EAAA,CAAAyQ,qBAAA,MACA,CAAA82C,EAAA,MAAAtgD,UAAA,CAAAq5C,UAAA,GACAkH,EAAA,MAAAvgD,UAAA,CAAAo5C,SAAA,GACA,KAAA4G,IAAA,CAAAhB,SAAA,CAAA3iC,SAAA,CAAA8iC,KAAA,CAAA1oC,IAAA,CAAA6gB,GAAA,CAAAjb,SAAA,CAAA+iC,KAAA,MAAAY,IAAA,CAAAI,GAAA,GACA,KAAAJ,IAAA,GAAAf,QAAA,CACAS,UAAA,MAAAW,WAAA,EAEAhB,aAAA,MAAAgB,WAAA,MAAAL,IAAA,EAEAC,mBAAA,CAAAH,KAAA,CAAAU,WAAA,0BAAAR,IAAA,CAAAf,QAAA,EAGAW,YAAA,MAAAS,WAAA,EACA,MAAA39D,KAAA,CAAAqW,EAAA,CAAAyQ,qBAAA,GACA82C,EAAA,CAAAtB,SAAA,GAAAsB,EAAA,EAAA59D,KAAA,CAAA8rB,KAAA,CAAAjM,MAAA,CAAAiM,KAAA,KACA+xC,EAAA,CAAAvB,SAAA,GAAAuB,EAAA,EAAA79D,KAAA,CAAA4mB,MAAA,CAAA/G,MAAA,CAAA+G,MAAA,KACA,KAAAtJ,UAAA,CAAAq5C,UAAA,CAAAiH,EAAA,EAAAlH,SAAA,CAAAmH,EAAA,CACA,CACA,EACAhD,MAAA,CAAAA,CAAA,IACA,UAAA/9C,QAAA,aACA0gD,UAAA,GAEA,EACA1C,OAAA,CAAAA,CAAA,IACA,UAAAh+C,QAAA,aACA0gD,UAAA,IAEA,EAMAO,WAAA,CAAAA,CAAA,IACA,KAAAT,IAAA,GAAAf,QAAA,EACAI,aAAA,MAAAgB,WAAA,MAAAL,IAAA,CAEA,EAGA,KAAAU,aAAA,MAAA99D,aAAA,GAAA05C,UAAA,GAAAC,WAAA,EACA/1B,OAAA,WACAC,KAAA,CAAA/iB,EAAA,aACA2iB,IAAA,SACA,GACA,KAAAs6C,YAAA,MAAA/9D,aAAA,GAAA05C,UAAA,GAAAC,WAAA,EACA/1B,OAAA,UACAC,KAAA,CAAA/iB,EAAA,YACA2iB,IAAA,MACA,GAGA,KAAAs6C,YAAA,CAAA76D,EAAA,SAAAgL,CAAA,GACAA,CAAA,CAAAoW,cAAA,GACAtiB,UAAA,CAAA4B,OAAA,eACA,GAGA,KAAAk6D,aAAA,CAAA56D,EAAA,SAAAgL,CAAA,GACAA,CAAA,CAAAoW,cAAA,GACAtiB,UAAA,CAAA4B,OAAA,gBACA,GACA6L,iBAAA,CAAAQ,cAAA,GACAP,eAAA,CAAAsuD,EAAA,EACA/uD,QAAA,CAAAkB,GAAA,CAAAd,eAAA,CAAAe,YAAA,CAAAV,eAAA,CAAAsuD,EAAA,MAAAruD,OAAA,YACA3N,UAAA,CAAA4B,OAAA,eACA,GACAyM,UAAA,GACA,GAEAX,eAAA,CAAAuuD,GAAA,EACAhvD,QAAA,CAAAkB,GAAA,CAAAd,eAAA,CAAAe,YAAA,CAAAV,eAAA,CAAAuuD,GAAA,MAAAtuD,OAAA,YACA3N,UAAA,CAAA4B,OAAA,gBACA,GACAyM,UAAA,GACA,IAKA0qC,YAAA,GACA,KAAAh8B,OAAA,GAGA/c,UAAA,CAAAkB,EAAA,iBACA,KAAAk6D,IAAA,CAAAf,QAAA,CACAthB,YAAA,GACA,KAAAh8B,OAAA,EACA,GAAA7b,EAAA,mBACA,KAAAka,UAAA,CAAAva,CAAA,iBACA,KAAA46D,WAAA,CAAA56D,CAAA,cACA,KAAAoc,MAAA,EACA,GAAA/b,EAAA,oBACA,KAAA+b,MAAA,EACA,GAAA/b,EAAA,gCACA,KAAA6b,OAAA,EACA,GAAA7b,EAAA,eAAAy3D,MAAA,EAAAz3D,EAAA,gBAAA03D,OAAA,EAAA13D,EAAA,oBAAA26D,WAAA,CACA,EAIAjvD,QAAA,EACAK,QAAA,CAAAJ,MAAA,UAAAc,OAAA,KACA,EAIAsP,OAAA,EACA,KAAA8+C,YAAA,CAAA9+C,MAAA,GACA,KAAA6+C,aAAA,CAAA7+C,MAAA,EACA,EAIAF,QAAA,EACA,KAAAg/C,YAAA,CAAAh/C,OAAA,GACA,KAAA++C,aAAA,CAAA/+C,OAAA,EACA,EAIA9B,KAAA,EACA,KAAA8gD,YAAA,CAAA9gD,IAAA,GACA,KAAA6gD,aAAA,CAAA7gD,IAAA,EACA,EAIAgB,KAAA,EACA,KAAA8/C,YAAA,CAAA9/C,IAAA,GACA,KAAA6/C,aAAA,CAAA7/C,IAAA,EACA,CACA,GAEA,OAAAm/C,IAEA,GC3QA,SAAAxnB,CAAA,MAAAsoB,CAAA,CAAAniD,QAAA,CAAArS,CAAA,eAAA8J,CAAA,cAAA2qD,CAAA,CAAAD,CAAA,CAAA/5C,aAAA,UAAAg6C,CAAA,CAAAzhD,IAAA,YAAAwhD,CAAA,CAAAE,oBAAA,YAAAC,WAAA,CAAAF,CAAA,EAAAA,CAAA,CAAAG,UAAA,CAAAH,CAAA,CAAAG,UAAA,CAAAC,OAAA,CAAA3oB,CAAA,CAAAuoB,CAAA,CAAAE,WAAA,CAAAH,CAAA,CAAAM,cAAA,CAAA5oB,CAAA,IACA,koOCDA/2C,MAAA"} \ No newline at end of file +{"version":3,"names":["define","_","pluginFactory","ckEditor","isIOSDevice","test","navigator","userAgent","Object","prototype","hasOwnProperty","call","focusOnFirstField","name","init","self","getTestRunner","after","$input","getAreaBroker","getContentArea","find","not","first","$cke","closest","length","delay","instances","attr","replace","focus","exports","__","getJumpElementFactory","broker","container","getContainer","question","navigation","getNavigationArea","toolbox","getToolboxArea","teststatus","getPanelArea","getItemStatus","item","flagged","answered","viewed","isReviewPanelHidden","testRunner","is","defineProperty","value","component","Handlebars","Helpers0","jumplinksTpl","data","options","asString","html","Template","$","jumplinksFactory","config","jumplinksBox","defaults","on","behavior","selector","eventName","eventParam","forEach","linkDescription","$link","getElement","handleLink","trigger","blur","event","activationKeys","includes","keyCode","setTemplate","defer","__initialized","template","depth0","helpers","partials","program1","compilerInfo","merge","buffer","helperMissing","escapeExpression","functionType","stack1","helper","hash","questionStatus","unless","isReviewPanelEnabled","inverse","noop","fn","program","getEmptyStats","questions","total","questionsViewed","map","getJumps","jumps","getParts","parts","getSections","result","part","sections","section","id","getActiveItem","mapWithActive","active","items","getNextSections","sectionId","canList","getJump","position","getPart","partName","getSection","sectionName","getItem","itemIdentifier","jump","identifier","getItemAt","getItemCategories","Array","isArray","categories","hasItemCategory","category","fuzzyMatch","arguments","taoPrefix","exactMatch","startsWith","normalize","elt","toLowerCase","some","itemCategory","getTestStats","stats","getPartStats","getSectionStats","getScopeStats","scope","testStats","currentPartPosition","isLinear","isCurrentPartLinear","values","filter","_ref","partPosition","sort","a","b","linearPartIndex","findIndex","_ref2","inaccessibleParts","slice","countOfInaccessibleUnasweredQestions","reduce","acc","_ref3","countOfInaccessibleFlaggedQestions","_ref4","assign","getScopeMap","scopeMap","cloneDeep","computeItemStats","computeStats","getScopeMapFromContext","context","testPartId","getItemPart","getItemSection","getItemIdentifier","isFinite","each","callback","isFunction","updateItemStats","accStats","informational","collection","patch","currentMap","partialMap","targetMap","isPlainObject","TypeError","partialPart","targetPartId","partialSection","targetSectionId","reindex","offset","offsetPart","offsetSection","lastPartId","lastSectionId","sortBy","index","positionInPart","positionInSection","createJumpTable","mapHelper","runner","reviewEnabled","getTestMap","getTestContext","itemReviewEnabled","getOptions","review","enabled","keyNavigator","navigableDomElement","shortcutsTpl","shortcutsBoxFactory","ESK_KEY_CODE","shortcutsBox","$element","$closeBtn","$keyNavigationItems","e","target","elements","createFromDoms","propagateTab","setCursorAt","isFocused","cursor","navigable","click","destroy","remove","label","shortcuts","program2","shortcut","shortcutsGroups","$$1","shortcutsFactory","namespaceHelper","containerTpl","plugin","getCurrentItem","testRunnerOptions","pluginShortcuts","getName","areaBroker","getJumpElement","shortcutsConfig","appVersion","indexOf","allowShortcuts","goToTop","add","namespaceAll","avoidInput","prevent","goToQuestion","jumplinks","jumpTo","render","getControlArea","update","params","changeReviewPanel","elem","panelJumplink","parent","removeClass","addClass","changeQuesitionStatus","text","currentItem","updatedConfig","announcedText","$announce","append","wasHidden","jumplinksContainer","prepend","groupId","headerNavigation","getConfig","$headerBar","$headerElements","registerHeaderNavigator","group","$elements","defaultPosition","setupItemsNavigator","setupClickableNavigator","keyNavigators","push","flatNavigation","element","getNavigators","toolbarNavigation","$navigationBar","$toolbarElements","reverseBottomToolbar","get","reverse","registerToolbarNavigator","navigableElements","pos","autoFocus","i","topToolbarNavigation","$topToolbar","registerTopToolbarNavigator","initFizzy","$panel","$navigator","managedNavigators","itemsNavigator","$navigatorTree","$enabledItems","navigableItems","getItemFromNavigable","loop","$parent","hasClass","keyNextItem","keyPrevItem","selectors","filters","enabledItems","navigatorNavigation","isFizzyLayout","$testStatusHeader","navigableTestStatus","testStatusNavigation","keepState","keyNextTab","keyPrevTab","itemListingVisited","filtersNavigator","currentFilter","$filters","navigableFilters","keyNextContent","allowedToNavigateFrom","keyPrevContent","last","$trees","navigableTrees","next","previous","pageNavigation","el","rubricsNavigation","scrollHelper","addLabelledByAttribute","removeLabelledByAttribute","removeAttr","manageLabelledByAttribute","itemNavigation","_this","$content","getQtiChoice","addNavigator","addInputsNavigator","scrollTo","$qtiInteractions","node","parents","itemPos","itemElement","$itemElement","$choiceInput","choiceType","navPos","nav","$nav","off","$inputs","flatRadioNavigation","input","checked","wcagBehavior","linearItemNavigation","$qtiChoices","$lastParent","list","setupListNavigator","choicesNavigators","choiceNavigator","stimulusNavigation","isEnabledDecorator","originalIsEnabled","isEnabled","scrollHeight","clientHeight","jumpLinks","$jumpLinksBox","$links","headerNavigationStrategy","toolbarNavigationStrategy","topToolbarNavigationStrategy","navigatorNavigationStrategy","pageNavigationStrategy","rubricsNavigationStrategy","itemNavigationStrategy","linearItemNavigationStrategy","stimulusNavigationStrategy","jumpLinksNavigationStrategy","providerRegistry","strategies","strategyFactory","strategy","getProvider","registerProvider","from","getCursor","ignoredClass","navigateToNextItem","navigateToPrevItem","activateItem","$elt","mousedown","getStrategies","navigationMode","area","flatten","defaultMode","keyNextGroup","keyPrevGroup","linearMode","nativeMode","defaultModeProvider","linearModeProvider","nativeModeProvider","modes","modeFactory","mode","instance","keyNavigationFactory","contentNavigatorType","groupNavigator","navigationConfig","navigators","document","activeElement","eventNS","setMode","newMode","getMode","isActive","keyNavigatorFactory","keyNavigation_css","defaultPluginConfig","pluginConfig","type","headerTpl","getState","state","header","updateTitle","$title","show","updateState","$state","$container","getArea","dialogAlert","dialogConfirm","shortcutRegistry","globalShortcut","pluginName","actionPrefix","defaultOptions","alert","confirm","dialog","closeAccept","hide","closeReject","closeLast","accept","handle","opened","addHandle","namespace","stack","message","reject","doAccept","reason","doReject","disable","dialogShortcut","enable","removeHandle","closeDialogs","alerts","confirms","testOptions","propagate","set","command","key","before","msg","clear","exitMessages","install","leave","dataIsObject","isObject","skipExitMessage","Promise","resolve","disableItem","hider","itemAlertMessage","getContent","dom","modal","itemRunner","$modalsContainer","_item","startClosed","top","navigationHelper","isLeavingSection","testContext","testMap","direction","sectionStats","nbItems","isEmpty","isLeavingTestPart","testPart","testPartStats","isLast","isLastOf","isFirst","isFirstOf","isNumber","getSiblingItems","itemPosition","size","itemId","siblings","itemChain","ref","directions","parseInt","walkDirection","link","times","getNeighbor","getNextItem","getPreviousItem","isMovingToNextItem","action","isMovingToPreviousItem","isJumpingToItem","buttonTpl","className","program3","apply","program5","icon","program6","program8","control","title","aria","buttonData","end","itemInlineMessage","createOkButton","createElement","dataType","$btn","preventDefault","$button","$navigationContainer","$inlineContainer","removeProp","prop","feedback$1","feedback","closeCurrent","currentFeedback","close","setState","err","error","danger","warning","info","typeCaster","itemScrolling","adaptItemHeight","$itemContainer","$contentArea","contentHeight","getItemRunnerHeight","getExtraGridRowHeight","getSpaceAboveQtiContent","gridRowBottomMargin","qtiItemPadding","$item","isScrollable","strToBool","selectedHeight","parseFloat","containerParent","css","\"overflow-y\"","height","$testRunnerSections","getBoundingClientRect","window","$gridRows","extraHeight","$gridRow","outerHeight","$qtiContent","loadingBar","loading","start","stop","module","inlineMessage","alertMessage","autoscroll","destroyFeedback","removed","renderedFeedbacks","storedFeedback","found","nextStep","defineMode","inline","inlineMode","messagePlugin","modalFeedback","inlineModalFeedback","createMessages","renderingQueue","bInlineMode","isDestroyed","isBoolean","renderingToken","done","tFeedbacks","overlay","stopImmediatePropagation","stopPropagation","shield","unshield","overlayConfig","full","ns","noLabelCls","noLabelHoverCls","labelHiddenCls","separatorCls","collapseTools","collapseNavigation","collapseInOrder","hover","collapseOrder","$window","collapser","buildCollapsiblesList","allCollapsibles","getCollapsiblesFromConfig","getSortedCollapsiblesFromDom","getUnsortedCollapsiblesFromDom","getExtraWidth","expandedWidth","collapsedWidth","collapseCls","outerWidth","toggleCollapsibles","availableWidth","getAvailableWidth","previousAvailableWidth","expandInOrder","collapsiblesCopy","clone","toCollapse","collapseNeeded","shift","getToolbarWidth","forEachRight","toExpand","expandPossible","extraWidth","$actionsBar","width","$toolbox","$navigation","getControlsFromDom","$controls","compact","$controlElements","_allCollapsibles","order","ctrl","dataset","substring","search","forOwn","throttle","blankifyLinks","mathify","require","MathJax","Hub","Queue","rubricBlock","rubrics","then","empty","pollingFactory","waitingDialog","connectivityTpl","defaultConfig","checkInterval","indicator","connectivity","proxy","getProxy","isOnline","polling","setInterval","waiting","displayWaitingDialog","pauseResolve","waitContent","proceedContent","endWait","telemetry","catch","interval","autoStart","disconnect","source","reconnect","isOffline","generalErr","isConnectivityError","loadItem","finish","reasons","comment","itemRef","flags","hasFeedbacks","containsNonPreloadedAssets","hasPci","_len","args","_key","dialogTpl","dialogMessage","dialogConfig","buttons","labels","ok","cancel","pauseContext","subCategory","originalMessage","pauseOnError","returnToHome","reloadPage","processError","location","reload","code","originalCode","loggerFactory","logger","duration","getTestStore","setVolatile","currentUpdatePromise","getItemAttempt","attempt","getPositiveNumber","getPluginStore","durationStore","getItemDuration","attemptId","Error","updateDuration","elapsed","itemAttemptId","setItem","warn","addDurationToCallActionParams","addCallActionParams","itemDuration","getDuration","format","getFixedMap","currentTestPart","fixedTestMap","fixedCurrentItem","reached","completed","updateStats","getCategoriesToMatch","matchSize","getProgressStats","fixedMap","scopedMap","categoriesToMatch","matchedCategories","answerableParts","answerableSections","matchCategories","expectedCategories","minWanted","matched","getRatio","_Mathfloor","Math","floor","getProgressionLabel","patterns","pattern","showTotal","long","short","getPositionProgression","ratio","getRatioProgression","scopes","testSection","indicators","percentage","progress","isMatchedCategories","validCategories","statsComputer","overall","overallCompleted","computeIndicator","indicatorComputer","computeProgress","progressData","progressbar","percentageTpl","percentageIndicatorRenderer","rendererApi","controls","$label","$bar","showLabel","positionTpl","pointTpl","Template$1","positionIndicatorRenderer","count","range","children","progressHelper","percentageRendererFactory","positionRendererFactory","renderers","testRunnerConfig","progressIndicator","rendererFactory","renderer","progressConfig","hiddenByQuestions","hiddenByCategories","isProgressbarHidden","testState","use","qtiFilter","req","res","messages","channel","isLeaving","getTimerMessage","hours","minutes","seconds","unansweredQuestions","timerMessage","timeArr","timeArgArr","unit","idx","answeredMessage","questionsMessage","join","timeEncoder","tooltip","countdown_css","moment","countdownTpl","countdownFactory","$time","$timeScreenreader","countdown","udpate","remainingTime","encodedTime","warningId","warningMessage","encode","time","warnings","findLastKey","shown","threshold","level","warningsForScreenreader","screenreaderWarningId","complete","showBeforeStart","countdownTooltip","isString","displayWarning","create","theme","placement","setTimeout","dispose","warningTimeout","precision","success","timerbox_css","timerboxTpl","timerboxFactory","timerbox","timers","updating","timerIdsToRemove","difference","keys","timerId","removeTimer","timer","addTimer","updateTimer","all","results","$zenModeToggler","getTimers","$countdownContainer","spread","extraTime","remainingWithoutExtraTime","deindex","omit","toggleZenMode","zenMode","startHidden","ariaHidden","enforcedStayStrategy","getCurrentPart","setUp","tearDown","_Mathmax","max","extraTimeStrategy","applyExtraTime","extraTimeSetup","consumedExtraTime","lastConsumedExtraTime","consumed","guidedNavigationStrategy","guidedNavigation","timeoutStrategy","qtiClassName","timeout","responseCardinalities","single","multiple","ordered","record","interactionMinConstraintProperties","matchInteraction","choiceInteraction","orderInteraction","associateInteraction","hottextInteraction","hotspotInteraction","graphicOrderInteraction","graphicAssociateInteraction","selectPointInteraction","currentItemHelper","getDeclarations","responses","getResponseDeclaration","declaration","attributes","toResponse","baseType","cardinality","mappedCardinality","response","transform","v","split","base","isQtiValueNull","stringyValue","isQuestionAnswered","defaultValue","constraintValue","fullyAnswered","currentCardinality","isUndefined","isEqual","guessInteractionConstraintValues","itemBody","bdy","interactions","constraintValues","interaction","qtiClass","__proto__","constraintProperty","responseIdentifier","isAnswered","partially","getResponses","declarations","getStimuliHrefs","val","href","getTextStimuliHrefs","stimuli","textStimuli","stimulusHref","domNode","querySelector","childNodes","child","nodeType","TEXT_NODE","getInstantStats","sync","partiallyAnsweredIsAnswered","isItemCurrentlyAnswered","statsHelper","messageHeaderTpl","getExitMessage","submitButtonLabel","itemsCountMessage","messageEnabled","enableUnansweredItemsWarning","getUnansweredItemsWarning","trim","getHeader","getActionMessage","getFlaggedItemsWarning","flaggedCount","toString","unansweredCount","states","testSession","freeze","initial","interacting","suspended","closed","itemSession","solution","notSelected","warnSectionLeavingStrategy","leaveTimedSection","isTimeout","itemSessionState","timerConfig","endTestWarning","noExitTimedSectionWarning","movePromise","keepUpToTimeout","exitMessage","cancelMove","getStrategyHandler","actives","applyToStrategies","api","strategyHandler","availableStrategies","defaultAvailableStrategies","availableStrategy","getActives","timeConstraints","constraintsWarnings","qtiScope","getScope","applyMessage","displayRemaining","humanize","warningMessages","constraintsWarningsForScreenreader","warningMessagesForScreenraeder","buildTimer","constraintData","pick","allowLateSubmission","originalTime","minTime","minTimeRemaining","maxTime","maxTimeRemaining","remaining","questionsStats","timeConstraint","newTimer","debug","scopeMapping","assessmentTest","assessmentSection","assessmentItemRef","timersFactory","screenreaderNotificationTpl","screenreaderNotificationTimeout","loadTimers","timeStore","savedConsumedTime","restoreTimerFromClient","saveTimers","loadSavedTimers","handleError","screenreaderNotifcationTimeoutId","contextualWarnings","timerWarning","timerWarningForScreenreader","updatedTimers","timerName","statsScope","$screenreaderWarningContainer","startZen","isZen","debounce","clearTimeout","leading","trailing","titleTpl","attribute","titles","updateTitles","currentPart","isDeepestSectionVisible","sectionTitle","$timer","timestamp","Date","now","itemTraceVariables","onError","variables","tracesStore","ITEM_START_TIME_CLIENT","ITEM_END_TIME_CLIENT","ITEM_TIMEZONE","utcOffset","callItemAction","traceData","JSON","stringify","allowPartial","allowSkipping","isInteracting","getItemState","enableAllowSkipping","currenItem","toBoolean","nextWarningHelper","shouldWarnBeforeNext","nextItemWarning","itemCanBeTriedAtWill","remainingAttempts","isNextItemInLinearPart","nextPart","isLastOfPart","shouldWarnBeforeEnd","shouldWarnOnTestEnd","shouldWarnBeforeEndPart","shouldWarnOnPartChange","warnBeforeNext","shouldWarnForUnansweredItems","hasUnanswered","hasFlagged","unansweredOnly","nextPartWarning","warnBeforeEnd","warnBeforeEndPart","specificTitle","enableElement","disableElement","updateElement","isAdaptive","isCatAdaptive","nextItem","isLastItem","doNext","nextItemPosition","unansweredWarning","warningScope","enableNav","triggerNextAction","warningHelper","registerShortcut","kbdShortcut","triggerAccessibility","checkboxTpl","dialogConfirmNext","heading","refuse","checkboxParams","dialogOptions","accepted","content","dlg","autoRender","autoDestroy","onOkBtn","$checkbox","submitChecked","submitUnchecked","linearNextItemWarning","getNextItemCategories","nextSectionWarning","getCustomNextMessage","itemPartiallyAnswered","customNextMessage","doNextWarning","testStore","getStore","store","checkboxValue","enableLinearNextItemWarningCheckbox","forceEnableLinearNextItemWarning","nextSection","getNextSectionCategories","toggle","isWarnSectionLeavingEabled","bind","doPrevious","previousItemWarning","triggerAction","canDoPrevious","currentSection","getCurrentSection","previousSection","previousPart","canMoveBackward","navigatorTpl","navigatorTreeTpl","navigatorFactory","flagItem","_cssCls","setItemFlag","navigatorApi","_defaults","autoScroll","$component","$filterBar","_selectors","filterBar","$tree","tree","$infoAnswered","infoAnswered","$infoViewed","infoViewed","$infoAll","tabInfoAll","$infoUnanswered","showLegend","infoUnanswered","tabInfoUnanswered","$infoFlagged","infoFlagged","tabInfoFlagged","$linearState","linearState","updateConfig","collapseHandle","toggleClass","collapsed","openSelected","infoPanelLabels","togglePanel","infoPanel","partLabels","openOnly","sectionLabels","itemLabels","$target","disabled","canFlag","icons","unseen","select","linearStart","program7","program9","program11","program13","hidden","program4","programWithDepth","program10","depth1","cls","program15","canCollapse","preventsUnseen","collapsible","_iconCls","itemIcons","activeItem","counters","collapsiblePanels","notFlagged","notAnswered","notInformational","_filterMap","unanswered","filtered","flag","getProgressionTotal","progression","jquery","writeCount","criteria","$items","filterCb","$section","$itemsFound","$filtered","scopeClass","getScopedMap","totalQuestions","isSkipaheadEnabled","counter","itm","numberTest","$place","display","min","open","selected","hierarchy","parentsUntil","previousPosition","$previous","root","panel","collapseSelector","componentFactory","itemButtonListFactory","onItemClick","disableUnseenItems","renderItemButtonListComponents","fizzyItemButtonMap","activeItemId","itemButtonListComponents","c","itemButtonListContainer","itemButtonListContainerElem","itemButtonListComponent","scrollContainer","setActiveItem","getFizzyItemButtonMap","displaySectionTitles","displayItemTooltip","nonInformationalCount","fizzyMap","dataSection","fizzySection","dataItem","fizzyItem","numericLabel","ariaLabel","status","updatedMap","updatedItem","updatedScopeMap","updatedFizzyMap","updatedItemData","updateItem","previousItem","$closeButton","closeButton","defaultNavigatorFactory","fizzyNavigatorFactory","isItemFlagged","updateButton","button","turnOff","turnOn","markReviewCategory","setFlag","unsetFlag","setFlagBookmarked","unsetFlagBookmarked","showReview","hideReview","showTestOverview","hideTestOverview","getFlagItemButtonData","getToggleButtonData","getReviewCategories","currentContext","reviewScreen","markReview","isPluginAllowed","navigatorConfig","callTestAction","flagItemButton","flagCurrentItem","flagStatus","forcedState","isHidden","explicitlyHidden","toggleButton","defaultOpen","reviewLayout","previousItemPosition","getToolbox","createEntry","$panelContainer","skip","doSkip","validateResponses","validateOnPreviousMove","enableValidateResponses","warnMessage","warnListener","returnValue","warnBeforeLeaving","addEventListener","removeEventListener","disableRightClick","rightClickEvents","removeEliminationsOnClose","restoreEliminationsOnOpen","eliminator","isPluginEnabled","togglePluginButton","togglePlugin","$choiceInteractions","isEliminable","enableEliminator","disableEliminator","$choices","wasEliminated","classList","setAttribute","contains","removeAttribute","conditionalInit","statifier","maskTpl","answerMaskingFactory","createMask","maskApi","mask","allMasks","reveal","answerMasking","$choice","getMasksState","setMasksState","masked","itemStates","restoreStateOnToggle","restoreStateOnMove","answerMaskingCategory","itemContainsChoiceInteraction","disableMasking","enableMasking","interact","makeStackable","makePlaceable","nouislider","ttsTemplate","maskingComponentFactory","audio","Audio","currentPlayback","mediaContentData","playbackRate","selection","getSelection","spec","clearAPIPElements","elementClass","$contentNodes","handleContentNodeClick","setTTSStateOnContainer","$currentTarget","currentTarget","selectedItemIndex","initNextItem","togglePlayback","initDefaultModeItem","initItemWithTextSelection","initDefaultModePlayback","currentSelection","getRangeAt","commonAncestorContainer","selectedItem","activeElementClass","url","load","play","setMediaContentData","setPlaybackRate","pause","currentTime","isPlaying","toggleSFHMode","isSFHMode","toggleSettings","isSettings","handleResize","offsetFromRight","x","y","getPosition","maxXPosition","innerWidth","moveTo","ttsComponent","stackingOptions","left","maxPlaybackRate","minPlaybackRate","defaultPlaybackRate","$closeElement","$dragElement","$playbackElement","$sfhModeElement","$sliderElement","$settingsElement","interactElement","draggable","manualStart","restrict","restriction","elementRect","right","bottom","onmove","_Mathround","round","xOffset","dx","yOffset","dy","moveBy","noUiSlider","animate","connected","step","stackingScope","getTTSItemData","apipElement","contentLinkInfo","\"@attributes\"","relatedElementInfo","spoken","audioFileInfo","fileHref","audioFile","mimeType","elementId","qtiLinkIdentifierRef","getTTSItemOrder","elementOrder","apipElementOrder","identifierRef","Number","POSITIVE_INFINITY","ttsApipDataProvider","apipData","accessibilityInfo","accessElement","inclusionOrder","textGraphicsDefaultOrder","ttsComponentFactory","ttsApipData","createNavigationGroup","$navigationGroupElement","groupNavigationId","$navigationElements","navigationGroup","$currentElement","getTTSComponent","isConfigured","enablePlugin","disablePlugin","toggleTool","eventKey","endsWith","getData","apipAccessibility","apipItemData","assetManager","dynamicComponent","areaMaskingTpl","dynamicComponentInstance","preview","previewDelay","resizable","preserveAspectRatio","minWidth","maxWidth","minHeight","maskComponent","foo","areaMasking","addMask","masks","without","renderTo","draggableContainer","calculatorFactory","basicCalculatorFactory","scientificCalculatorFactory","calculatorTpl","defaultCalcConfig","proportionalResize","bodmasCalcConfig","scientificCalcConfig","calculator","maths","degree","getCalculatorCategories","bodmas","scientific","buildCalculator","calcTpl","factory","calcConfig","$calculatorContainer","alternativeTemplate","toggleCalculator","allowIn","stackerFactory","commentTpl","allowComment","contextOptions","toggleComment","$form","stacker","bringToFront","appendTo","$cancel","$submit","autoBringToFront","viewerFactory","pdfViewer","panelTpl","showPanel","partial","resizeViewer","hidePanel","hideIfVisible","isVisible","initPanelEvents","stopEvents","hideViewer","$overlay","viewer","setSize","documentViewer","displayViewer","fitToWidth","allowSearch","originalEvent","detail","eventifier","highlighterFactory","getAllRanges","allRanges","rangeCount","discardSelection","removeAllRanges","testHighlighterFactory","isHighlighting","highlightHelper","containerSelector","containersBlackList","clearOnClick","isCollapsed","highlightRanges","MSStream","prevSelection","toggleHighlighting","bool","highlight","restoreIndex","highlightFromIndex","getIndex","getHighlightIndex","clearHighlights","getId","highlighters","highlighterCollection","addHighlighter","hl","getHighlighterById","getAllHighlighters","getItemHighlighter","getNonItemHighlighters","getLength","itemHelper","hasHighlights","buttonMain","pressed","buttonRemove","highlighterStore","saveHighlight","highlightsIndex","saveAll","nonItemHighlighters","every","loadHighlight","textStimulusHref","stimHighlighter","themeHandler","themeLoader","itemThemeSwitcher","themesConfig","available","reloadThemes","themeConfig","selectedTheme","changeTheme","default","themeId","$qtiItem","previousTheme","storage","allMenuEntries","menuEntry","oldNamespace","getActiveNamespace","availableThemes","defaultTheme","activeNamespace","setActiveNamespace","menuButton","createMenu","themeEntry","role","setMenuId","turnOffAll","toggleMenu","setNavigationType","itemThemesStore","itemThemeId","removeItem","makeDraggable","makeResizable","compoundMaskFactory","dimensions","maskConfig","maskAPI","place","placeOverlay","styleResizableEdges","edgesBorders","isResizable","edgeId","addResizeControll","$resizeControll","class","resizeControll","bringAllToFront","innerDrag","closer","invokeOnOverlays","invokeOnMasks","beforeResize","onResize","applyTransformsToOverlays","applyTransformsToInnerDrag","applyTransformsToCloser","createOverlay","overlayAPI","transformOverlay","_sizeBackup","getSize","_posBackup","outerX","outerY","restoreOverlay","appendVisualGuides","borderWidth","borderOffset","visualGuides","$maskBg","$innerWindow","\"border-top-width\"","topHeight","\"border-right-width\"","rightWidth","\"border-bottom-width\"","bottomHeight","\"border-left-width\"","leftWidth","innerHeight","removeVisualGuides","pointerEventsPrefix","PointerEvent","$moveIcon","moveAllPartsTogether","xOffsetRelative","yOffsetRelative","innerX","innerY","invokeOnAll","applyTransforms","createInnerDragHandle","dragRestriction","fixedXY","allParts","nw","rect","constrains","minTopHeight","resizeHandleSize","minBottomHeight","innerDragHeight","$dragIcon","background","applyTransformsToMasks","createCloser","$closeIcon","invokeOn","correctTransforms","setTopHeight","newHeight","newY","fromTop","setRightWidth","newWidth","newX","fromLeft","setBottomHeight","setLeftWidth","createCompoundMask","createPart","edges","addOverlay","maxHeight","setInnerHeight","partConfig","createVisualGuides","compoundMask","defaultDimensions","dragMinWidth","dragMinHeight","setTransforms","dim","getDimensions","lineHeight","ceil","maskOptions","paddingLeft","paddingTop","textPadding","containerWidthHasChanged","newDimensions","toggleMask","transformMask","openMask","closeMask","$maskContainer","_Mathmin","_Mathmax2","magnifierPanelTpl","magnifierPanelFactory","scrollInClone","scrollData","$clonedTarget","$clone","scrollTop","scrollLeft","updateScrollPositions","scrollOffsetsChanged","scrollId","scrolling","uniqueId","magnifierPanel","setScrollingListener","scrollingListenerCallback","removeScrollingListener","applyScrolling","adjustZoomLevel","zoomLevelMin","zoomLevelMax","applyZoomLevel","$inner","zoomLevel","showZoomLevel","$newZoomLevel","$zoomLevel","updateMaxSize","maxRatio","applySize","targetWidth","targetHeight","updateZoom","zoomAt","createObserver","observer","MutationObserver","updateMagnifier","startObserver","observe","childList","characterData","subtree","stopObserver","translateMagnifier","coordinate","actualSize","magnifierSize","delta","getElementFromPoint","elementFromPoint","findSourceNode","$node","$root","indexes","$this","pop","eq","initConfig","levelMin","levelMax","zoomLevelStep","levelStep","$initTarget","dynamicComponentConfig","dynamicComponentDefaultConfig","getZoomLevel","getTarget","setTarget","$newTarget","$viewTarget","zoomTo","zoomBy","zoomIn","zoomOut","translate","scrollingTop","dynamicComponentContext","pageX","pageY","screenRatio","screen","debounceDelay","scrollingDelay","defaultBaseSize","defaultLevelMin","defaultLevelMax","defaultLevel","baseSize","zoomMin","zoomMax","zoomStep","magnifier","getMagnifierPanel","hideMagnifier","toggleMagnifier","showMagnifier","transformer","_Mathmax3","standard","increment","lower","upper","_setZoomLevel","newScale","isOverZoom","setTransformOrigin","scale","_resetZoom","reset","forceRepaint","sel","style","offsetHeight","zoom","testRunnerContainer","zoomAction","dir","inc","$zoomTarget","sx","sy","setProperty","zoomReApply","buttonZoomOut","buttonZoomIn","in","out","d","s","getElementsByTagName","appendChild","styleSheet","cssText","createTextNode"],"sources":["../runner/plugins/content/accessibility/focusOnFirstField.js","../runner/plugins/content/accessibility/jumplinks/helpers.js","../runner/plugins/content/accessibility/jumplinks/jumplinks.js","../runner/helpers/map.js","../runner/helpers/isReviewPanelEnabled.js","../runner/plugins/content/accessibility/jumplinks/shortcuts.js","../runner/plugins/content/accessibility/jumplinks/plugin.js","../runner/plugins/content/accessibility/keyNavigation/strategies/headerNavigation.js","../runner/plugins/content/accessibility/keyNavigation/strategies/toolbarNavigation.js","../runner/plugins/content/accessibility/keyNavigation/strategies/topToolbarNavigation.js","../runner/plugins/content/accessibility/keyNavigation/strategies/navigatorNavigation.js","../runner/plugins/content/accessibility/keyNavigation/strategies/pageNavigation.js","../runner/plugins/content/accessibility/keyNavigation/strategies/rubricsNavigation.js","../runner/plugins/content/accessibility/keyNavigation/strategies/itemNavigation.js","../runner/plugins/content/accessibility/keyNavigation/strategies/linearItemNavigation.js","../runner/plugins/content/accessibility/keyNavigation/strategies/stimulusNavigation.js","../runner/plugins/content/accessibility/keyNavigation/strategies/jumpLinks.js","../runner/plugins/content/accessibility/keyNavigation/strategies/index.js","../runner/plugins/content/accessibility/keyNavigation/strategiesManager.js","../runner/plugins/content/accessibility/keyNavigation/helpers.js","../runner/plugins/content/accessibility/keyNavigation/modes/defaultMode.js","../runner/plugins/content/accessibility/keyNavigation/modes/linearMode.js","../runner/plugins/content/accessibility/keyNavigation/modes/nativeMode.js","../runner/plugins/content/accessibility/keyNavigation/modes/index.js","../runner/plugins/content/accessibility/keyNavigation/modesManager.js","../runner/plugins/content/accessibility/keyNavigation/keyNavigation.js","css!taoQtiTest/runner/plugins/content/accessibility/css/key-navigation","../runner/plugins/content/accessibility/keyNavigation/plugin.js","../runner/plugins/content/accessibility/mainLandmark/header.js","../runner/plugins/content/dialog/dialog.js","../runner/plugins/content/dialog/exitMessages.js","../runner/plugins/content/dialog/itemAlertMessage.js","../runner/helpers/navigation.js","../runner/plugins/content/dialog/itemInlineMessage.js","../runner/plugins/content/feedback/feedback.js","../runner/plugins/content/itemScrolling/itemScrolling.js","../runner/plugins/content/loading/loading.js","../runner/plugins/content/modalFeedback/modalFeedback.js","../runner/plugins/content/overlay/overlay.js","../runner/plugins/content/responsiveness/collapser.js","../runner/plugins/content/rubricBlock/rubricBlock.js","../runner/plugins/controls/connectivity/connectivity.js","../runner/plugins/controls/connectivity/pauseOnError.js","../runner/plugins/controls/duration/duration.js","../runner/plugins/controls/progressbar/progress.js","../runner/plugins/controls/progressbar/renderer/percentage.js","../runner/plugins/controls/progressbar/renderer/position.js","../runner/plugins/controls/progressbar/progressbar.js","../runner/plugins/controls/testState/testState.js","../runner/helpers/getTimerMessage.js","../runner/plugins/controls/timer/component/css/countdown!css","../runner/plugins/controls/timer/component/countdown.js","../runner/plugins/controls/timer/component/css/timerbox!css","../runner/plugins/controls/timer/component/timerbox.js","../runner/plugins/controls/timer/strategy/enforcedStay.js","../runner/plugins/controls/timer/strategy/extraTime.js","../runner/plugins/controls/timer/strategy/guidedNavigation.js","../runner/plugins/controls/timer/strategy/timeout.js","../runner/helpers/currentItem.js","../runner/helpers/stats.js","../runner/helpers/messages.js","../runner/config/states.js","../runner/plugins/controls/timer/strategy/warnSectionLeaving.js","../runner/plugins/controls/timer/strategy/strategyHandler.js","../runner/plugins/controls/timer/timers.js","../runner/plugins/controls/timer/plugin.js","../runner/plugins/controls/title/title.js","../runner/plugins/controls/trace/itemTraceVariables.js","../runner/plugins/navigation/allowSkipping.js","../runner/plugins/navigation/next/nextWarningHelper.js","../runner/plugins/navigation/next.js","../runner/plugins/navigation/next/dialogConfirmNext.js","../runner/plugins/navigation/next/linearNextItemWarning.js","../runner/plugins/navigation/nextSection.js","../runner/plugins/navigation/previous.js","../runner/plugins/navigation/review/navigator.js","../runner/plugins/navigation/review/navigatorFizzy.js","../runner/plugins/navigation/review/review.js","../runner/plugins/navigation/skip.js","../runner/plugins/navigation/validateResponses.js","../runner/plugins/navigation/warnBeforeLeaving.js","../runner/plugins/security/disableRightClick.js","../runner/plugins/tools/answerElimination/eliminator.js","../runner/plugins/tools/answerMasking/answerMasking.js","../runner/plugins/tools/answerMasking/plugin.js","../runner/plugins/tools/apipTextToSpeech/textToSpeech.js","../runner/plugins/tools/apipTextToSpeech/ttsApipDataProvider.js","../runner/plugins/tools/apipTextToSpeech/plugin.js","../runner/plugins/tools/areaMasking/mask.js","../runner/plugins/tools/areaMasking/areaMasking.js","../runner/plugins/tools/calculator.js","../runner/plugins/tools/comment/comment.js","../runner/plugins/tools/documentViewer/documentViewer.js","../runner/plugins/tools/highlighter/highlighter.js","../runner/plugins/tools/highlighter/collection.js","../runner/plugins/tools/highlighter/plugin.js","../runner/plugins/tools/itemThemeSwitcher/itemThemeSwitcher.js","../runner/plugins/tools/lineReader/compoundMask.js","../runner/plugins/tools/lineReader/plugin.js","../runner/plugins/tools/magnifier/magnifierPanel.js","../runner/plugins/tools/magnifier/magnifier.js","../runner/plugins/tools/zoom.js","onLayerEnd0.js","module-create.js"],"sourcesContent":["define('taoQtiTest/runner/plugins/content/accessibility/focusOnFirstField',['lodash', 'taoTests/runner/plugin', 'ckeditor'], function (_, pluginFactory, ckEditor) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n ckEditor = ckEditor && Object.prototype.hasOwnProperty.call(ckEditor, 'default') ? ckEditor['default'] : ckEditor;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2018 (original work) Open Assessment Technologies SA;\n */\n\n /**\n * Check if client uses the iOS device.\n *\n * @returns {*|boolean}\n */\n function isIOSDevice() {\n return /(iPhone|iPad)/i.test(navigator.userAgent);\n }\n\n /**\n * Returns the configured plugin\n */\n var focusOnFirstField = pluginFactory({\n name: 'focusOnFirstField',\n /**\n * Initialize the plugin (called during runner's init)\n */\n init: function init() {\n var self = this;\n\n /**\n * When an Item is loaded - if we set the focus on any input then the ipad sets the focus on the\n * keyboard, so the windows lose focus\n * and we get an error message for the test in fullscreen mode\n */\n if (!isIOSDevice()) {\n this.getTestRunner().after('renderitem', function () {\n var $input = self.getAreaBroker().getContentArea().find('.qti-itemBody').find('input, textarea, select').not(':input[type=button], :input[type=submit], :input[type=reset]').first();\n var $cke = $input.closest('.qti-interaction').find('.cke');\n if ($cke.length) {\n _.delay(function () {\n ckEditor.instances[$cke.attr('id').replace(/^cke_/, '')].focus();\n }, 100);\n } else {\n $input.focus();\n }\n });\n }\n }\n });\n\n return focusOnFirstField;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/accessibility/jumplinks/helpers',['exports', 'i18n'], function (exports, __) { 'use strict';\n\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Returns factory-like object.\n *\n * @param {AreaBroker} broker\n *\n * @returns {Object} - when you access properties it returns the corresponding element and move the focus on it.\n * List of availiable properties\n * - question\n * - navigation\n * - toolbox\n * - teststatus\n */\n const getJumpElementFactory = broker => ({\n get container() {\n return broker.getContainer();\n },\n get question() {\n return broker.getContainer().find('.content-wrapper').first();\n },\n get navigation() {\n return broker.getNavigationArea().find(':not(.hidden)[tabindex]').first();\n },\n get toolbox() {\n return broker.getToolboxArea().find(':not(.hidden)[tabindex]').first();\n },\n get teststatus() {\n return broker.getPanelArea().find(':not(.hidden)[tabindex]').first();\n }\n });\n\n /**\n * Returns testrunner item status.\n *\n * @param {Object} item - testrunner item\n *\n * @returns {String} - localized string.\n */\n const getItemStatus = item => {\n if (item.flagged) {\n return __('Flagged for review');\n }\n if (item.answered) {\n return __('Answered');\n }\n if (item.viewed) {\n return __('Not answered');\n }\n return __('Not seen');\n };\n\n /**\n * Detects if review panel hidden or not.\n *\n * @param {TestRunner} testRunner\n *\n * @returns {Boolean}\n */\n const isReviewPanelHidden = testRunner => testRunner.getAreaBroker().getPanelArea().find('.qti-navigator').is('.hidden');\n\n exports.getItemStatus = getItemStatus;\n exports.getJumpElementFactory = getJumpElementFactory;\n exports.isReviewPanelHidden = isReviewPanelHidden;\n\n Object.defineProperty(exports, '__esModule', { value: true });\n\n});\n\n","define('taoQtiTest/runner/plugins/content/accessibility/jumplinks/jumplinks',['lodash', 'ui/component', 'handlebars', 'lib/handlebars/helpers'], function (_, component, Handlebars, Helpers0) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n component = component && Object.prototype.hasOwnProperty.call(component, 'default') ? component['default'] : component;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, options, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, functionType=\"function\", self=this;\n\n function program1(depth0,data) {\n \n \n return \"hidden\";\n }\n\n buffer += \"\\n\";\n return buffer;\n });\n function jumplinksTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Default config values, see below.\n */\n const defaults = {};\n\n /**\n * Creates and initialize the jumplinks component.\n * Please not the component IS NOT rendered.\n * You'll have to render it by yourself.\n *\n * @returns {jumplinks} the component, initialized and rendered\n */\n function jumplinksFactory(config) {\n /**\n * @typedef {Object} jumplinksBox\n */\n const jumplinksBox = component({}, defaults).on('render', function () {\n // handle related Jump Links\n const behavior = [{\n selector: '[data-jump=question] ',\n eventName: 'jump',\n eventParam: 'question'\n }, {\n selector: '[data-jump=navigation]',\n eventName: 'jump',\n eventParam: 'navigation'\n }, {\n selector: '[data-jump=toolbox]',\n eventName: 'jump',\n eventParam: 'toolbox'\n }, {\n selector: '[data-jump=teststatus]',\n eventName: 'jump',\n eventParam: 'teststatus'\n }, {\n selector: '[data-jump=shortcuts]',\n eventName: 'shortcuts',\n eventParam: 'shortcuts'\n }];\n _.forEach(behavior, linkDescription => {\n const $link = this.getElement().find(linkDescription.selector);\n const handleLink = () => {\n this.trigger(linkDescription.eventName, linkDescription.eventParam);\n this.getElement().find(':focus').blur();\n };\n if ($link) {\n $link.on('click', handleLink);\n $link.on('keyup', event => {\n const activationKeys = [32, 13]; // link can be activated by click or enter/space keys\n if (activationKeys.includes(event.keyCode)) {\n handleLink();\n }\n });\n }\n });\n });\n jumplinksBox.setTemplate(jumplinksTpl);\n _.defer(() => {\n jumplinksBox.init(config);\n });\n return jumplinksBox;\n }\n\n return jumplinksFactory;\n\n});\n\n","define('taoQtiTest/runner/helpers/map',['lodash'], function (_) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * @typedef {Object} itemStats\n * @property {Number} questions - the number of questions items\n * @property {Number} answered - the number of answered questions\n * @property {Number} flagged - the number of items flagged for review\n * @property {Number} viewed - the number of viewed items\n * @property {Number} total - the total number of items\n * @property {Number} questionsViewed - the number of viewed questions\n */\n\n /**\n * Gets an empty stats record\n * @returns {itemStats}\n */\n function getEmptyStats() {\n return {\n questions: 0,\n answered: 0,\n flagged: 0,\n viewed: 0,\n total: 0,\n questionsViewed: 0\n };\n }\n\n /**\n * Defines a helper that provides extractors for an assessment test map\n */\n var map = {\n /**\n * Gets the jumps table\n * @param {Object} map - The assessment test map\n * @returns {Object}\n */\n getJumps: function getJumps(map) {\n return map && map.jumps;\n },\n /**\n * Gets the parts table\n * @param {Object} map - The assessment test map\n * @returns {Object}\n */\n getParts: function getParts(map) {\n return map && map.parts;\n },\n /**\n * Get sections table\n * @param {Object} map - The assessment test map\n * @returns {Object} the sections\n */\n getSections: function getSections(map) {\n var parts = this.getParts(map),\n result = {};\n _.forEach(parts, function (part) {\n var sections = part.sections;\n if (sections) {\n _.forEach(sections, function (section) {\n result[section.id] = section;\n });\n }\n });\n return result;\n },\n /**\n * Get active item from the test map\n * @param {Object} mapWithActive - The assessment test map which has active part/section/item marked\n * @returns {Object} the active item\n */\n getActiveItem: function getActiveItem(mapWithActive) {\n var parts = this.getParts(mapWithActive),\n result = {};\n _.forEach(parts, function (part) {\n var sections = part.sections;\n if (sections) {\n _.forEach(sections, function (section) {\n if (section.active) {\n const items = section.items;\n _.forEach(items, function (item) {\n if (item.active) {\n result = item;\n }\n });\n }\n });\n }\n });\n return result;\n },\n /**\n * Return the list of remaining sections.\n * @param {Object} map - The assessment test map\n * @param {String} sectionId - The next sections will be gathered once this sectionId has been reached\n * @returns {Object} the next sections\n */\n getNextSections: function getNextSections(map, sectionId) {\n var sections = this.getSections(map),\n result = {},\n canList = false;\n _.forEach(sections, function (section) {\n if (canList) {\n result[section.id] = section;\n }\n if (section.id === sectionId) {\n canList = true;\n }\n });\n return result;\n },\n /**\n * Gets the jump at a particular position\n * @param {Object} map - The assessment test map\n * @param {Number} position - The position of the item\n * @returns {Object}\n */\n getJump: function getJump(map, position) {\n var jumps = this.getJumps(map);\n return jumps && jumps[position];\n },\n /**\n * Gets a test part by its identifier\n * @param {Object} map - The assessment test map\n * @param {String} partName - The identifier of the test part\n * @returns {Object}\n */\n getPart: function getPart(map, partName) {\n var parts = this.getParts(map);\n return parts && parts[partName];\n },\n /**\n * Gets a test section by its identifier\n * @param {Object} map - The assessment test map\n * @param {String} sectionName - The identifier of the test section\n * @returns {Object}\n */\n getSection: function getSection(map, sectionName) {\n var parts = this.getParts(map);\n var section = null;\n _.forEach(parts, function (part) {\n var sections = part.sections;\n if (sections && sections[sectionName]) {\n section = sections[sectionName];\n return false;\n }\n });\n return section;\n },\n /**\n * Gets a test item by its identifier\n * @param {Object} map - The assessment test map\n * @param {String} itemIdentifier - The identifier of the test item\n * @returns {Object}\n */\n getItem(map, itemIdentifier) {\n const jump = _.find(this.getJumps(map), {\n identifier: itemIdentifier\n });\n return this.getItemAt(map, jump && jump.position);\n },\n /**\n * Gets a test item by its identifier\n * @param {Object} map - The assessment test map\n * @param {String} itemIdentifier - The identifier of the test item\n * @returns {String[]} the raw list of categories\n */\n getItemCategories(map, itemIdentifier) {\n const item = this.getItem(map, itemIdentifier);\n if (item && Array.isArray(item.categories)) {\n return item.categories;\n }\n return [];\n },\n /**\n * Check if an item has a category\n * @param {Object} map - The assessment test map\n * @param {String} itemIdentifier - The identifier of the test item\n * @param {String} category - the category to check\n * @param {Boolean} [fuzzyMatch=false] - if true the prefix or the case doesn't matter\n * @returns {String[]} the raw list of categories\n */\n hasItemCategory(map, itemIdentifier, category) {\n let fuzzyMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n const taoPrefix = 'x-tao-option-';\n const categories = this.getItemCategories(map, itemIdentifier);\n if (!category || !category.length) {\n return false;\n }\n const exactMatch = categories.includes(category);\n if (exactMatch) {\n return true;\n }\n if (fuzzyMatch) {\n //check by adding the prefix first\n if (!category.startsWith(taoPrefix) && category.includes(`${taoPrefix}${category}`)) {\n return true;\n }\n\n //compare without the prefix and any case system\n const normalize = elt => elt.replace(taoPrefix, '').replace(/[-_\\s]/g, '').toLowerCase();\n return categories.some(itemCategory => normalize(itemCategory) === normalize(category));\n }\n return false;\n },\n /**\n * Gets the global stats of the assessment test\n * @param {Object} map - The assessment test map\n * @returns {itemStats}\n */\n getTestStats: function getTestStats(map) {\n return map && map.stats;\n },\n /**\n * Gets the stats of the test part containing a particular position\n * @param {Object} map - The assessment test map\n * @param {String} partName - The identifier of the test part\n * @returns {itemStats}\n */\n getPartStats: function getPartStats(map, partName) {\n var part = this.getPart(map, partName);\n return part && part.stats;\n },\n /**\n * Gets the stats of the test section containing a particular position\n * @param {Object} map - The assessment test map\n * @param {String} sectionName - The identifier of the test section\n * @returns {itemStats}\n */\n getSectionStats: function getSectionStats(map, sectionName) {\n var section = this.getSection(map, sectionName);\n return section && section.stats;\n },\n /**\n * Gets the stats related to a particular scope\n * @param {Object} map - The assessment test map\n * @param {Number} position - The current position\n * @param {String} [scope] - The name of the scope. Can be: test, part, section (default: test)\n * @returns {itemStats}\n */\n getScopeStats: function getScopeStats(map, position, scope) {\n var jump = this.getJump(map, position);\n switch (scope) {\n case 'section':\n case 'testSection':\n return this.getSectionStats(map, jump && jump.section);\n case 'part':\n case 'testPart':\n return this.getPartStats(map, jump && jump.part);\n\n // During calculation stats for this case,\n // we are considiring all unanswered inaccessible items as answered\n case 'testWithoutInaccessibleItems':\n {\n const testStats = this.getTestStats(map);\n const {\n position: currentPartPosition,\n isLinear: isCurrentPartLinear\n } = this.getPart(map, jump && jump.part);\n const parts = Object.values(this.getParts(map)).filter(_ref => {\n let {\n position: partPosition\n } = _ref;\n return partPosition < currentPartPosition;\n }).sort((a, b) => b - a);\n\n // Find the neirest part to which test taker can not navigate\n const linearPartIndex = isCurrentPartLinear ? 0 : parts.findIndex(_ref2 => {\n let {\n isLinear\n } = _ref2;\n return isLinear;\n });\n if (linearPartIndex === -1) {\n return testStats;\n }\n\n // Calculate all unanswered and flagged questions in inaccessible parts\n const inaccessibleParts = parts.slice(linearPartIndex);\n const countOfInaccessibleUnasweredQestions = inaccessibleParts.reduce((acc, _ref3) => {\n let {\n stats: {\n questions,\n answered\n }\n } = _ref3;\n return acc + (questions - answered);\n }, 0);\n const countOfInaccessibleFlaggedQestions = inaccessibleParts.reduce((acc, _ref4) => {\n let {\n stats: {\n flagged\n }\n } = _ref4;\n return acc + flagged;\n }, 0);\n return Object.assign({}, testStats, {\n answered: testStats.answered + countOfInaccessibleUnasweredQestions,\n flagged: testStats.flagged - countOfInaccessibleFlaggedQestions\n });\n }\n default:\n case 'test':\n return this.getTestStats(map);\n }\n },\n /**\n * Gets the map of a particular scope from a particular position\n * @param {Object} map - The assessment test map\n * @param {Number} position - The current position\n * @param {String} [scope] - The name of the scope. Can be: test, part, section (default: test)\n * @returns {object} The scoped map\n */\n getScopeMap: function getScopeMap(map, position, scope) {\n // need a clone of the map as we will change some properties\n var scopeMap = _.cloneDeep(map || {});\n\n // gets the current part and section\n var jump = this.getJump(scopeMap, position);\n var part = this.getPart(scopeMap, jump && jump.part);\n var section = this.getSection(scopeMap, jump && jump.section);\n\n // reduce the map to the scope part\n if (scope && scope !== 'test') {\n scopeMap.parts = {};\n if (part) {\n scopeMap.parts[jump.part] = part;\n }\n }\n\n // reduce the map to the scope section\n if (part && (scope === 'section' || scope === 'testSection')) {\n part.sections = {};\n if (section) {\n part.sections[jump.section] = section;\n }\n }\n\n // update the stats to reflect the scope\n if (section) {\n section.stats = this.computeItemStats(section.items);\n }\n if (part) {\n part.stats = this.computeStats(part.sections);\n }\n scopeMap.stats = this.computeStats(scopeMap.parts);\n return scopeMap;\n },\n /**\n * Gets the map of a particular scope from a current context\n * @param {Object} map - The assessment test map\n * @param {Object} context - The current session context\n * @param {String} [scope] - The name of the scope. Can be: test, part, section (default: test)\n * @returns {object} The scoped map\n */\n getScopeMapFromContext: function getScopeMapFromContext(map, context, scope) {\n // need a clone of the map as we will change some properties\n var scopeMap = _.cloneDeep(map || {});\n var part;\n var section;\n\n // gets the current part and section\n if (context && context.testPartId) {\n part = this.getPart(scopeMap, context.testPartId);\n }\n if (context && context.sectionId) {\n section = this.getSection(scopeMap, context.sectionId);\n }\n\n // reduce the map to the scope part\n if (scope && scope !== 'test') {\n scopeMap.parts = {};\n if (part) {\n scopeMap.parts[context.testPartId] = part;\n }\n }\n\n // reduce the map to the scope section\n if (part && (scope === 'section' || scope === 'testSection')) {\n part.sections = {};\n if (section) {\n part.sections[context.sectionId] = section;\n }\n }\n\n // update the stats to reflect the scope\n if (section) {\n section.stats = this.computeItemStats(section.items);\n }\n if (part) {\n part.stats = this.computeStats(part.sections);\n }\n scopeMap.stats = this.computeStats(scopeMap.parts);\n return scopeMap;\n },\n /**\n * Gets the test part containing a particular position\n * @param {Object} map - The assessment test map\n * @param {Number} position - The position of the item\n * @returns {Object}\n */\n getItemPart: function getItemPart(map, position) {\n var jump = this.getJump(map, position);\n return this.getPart(map, jump && jump.part);\n },\n /**\n * Gets the test section containing a particular position\n * @param {Object} map - The assessment test map\n * @param {Number} position - The position of the item\n * @returns {Object}\n */\n getItemSection: function getItemSection(map, position) {\n var jump = this.getJump(map, position);\n var part = this.getPart(map, jump && jump.part);\n var sections = part && part.sections;\n return sections && sections[jump && jump.section];\n },\n /**\n * Gets the item located at a particular position\n * @param {Object} map - The assessment test map\n * @param {Number} position - The position of the item\n * @returns {Object}\n */\n getItemAt: function getItemAt(map, position) {\n var jump = this.getJump(map, position);\n var part = this.getPart(map, jump && jump.part);\n var sections = part && part.sections;\n var section = sections && sections[jump && jump.section];\n var items = section && section.items;\n return items && items[jump && jump.identifier];\n },\n /**\n * Gets the identifier of an existing item\n * @param {Object} map - The assessment test map\n * @param {Number|String} position - The position of the item, can already be the identifier\n * @returns {String}\n */\n getItemIdentifier: function getItemIdentifier(map, position) {\n var item;\n if (_.isFinite(position)) {\n item = this.getItemAt(map, position);\n } else {\n item = this.getItem(map, position);\n }\n return item && item.id;\n },\n /**\n * Applies a callback on each item of the provided map\n * @param {Object} map - The assessment test map\n * @param {Function} callback(item, section, part, map) - A callback to apply on each item\n * @returns {Object}\n */\n each: function each(map, callback) {\n if (_.isFunction(callback)) {\n _.forEach(map && map.parts, function (part) {\n _.forEach(part && part.sections, function (section) {\n _.forEach(section && section.items, function (item) {\n callback(item, section, part, map);\n });\n });\n });\n }\n return map;\n },\n /**\n * Update the map stats from a particular item\n * @param {Object} map - The assessment test map\n * @param {Number} position - The position of the item\n * @returns {Object}\n */\n updateItemStats: function updateItemStats(map, position) {\n var jump = this.getJump(map, position);\n var part = this.getPart(map, jump && jump.part);\n var sections = part && part.sections;\n var section = sections && sections[jump && jump.section];\n if (section) {\n section.stats = this.computeItemStats(section.items);\n }\n if (part) {\n part.stats = this.computeStats(part.sections);\n }\n if (map) {\n map.stats = this.computeStats(map.parts);\n }\n return map;\n },\n /**\n * Computes the stats for a list of items\n * @param {Object} items\n * @returns {itemStats}\n */\n computeItemStats: function computeItemStats(items) {\n return _.reduce(items, function accStats(acc, item) {\n if (!item.informational) {\n acc.questions++;\n if (item.answered) {\n acc.answered++;\n }\n if (item.viewed) {\n acc.questionsViewed++;\n }\n }\n if (item.flagged) {\n acc.flagged++;\n }\n if (item.viewed) {\n acc.viewed++;\n }\n acc.total++;\n return acc;\n }, getEmptyStats());\n },\n /**\n * Computes the global stats of a collection of stats\n * @param {Object} collection\n * @returns {itemStats}\n */\n computeStats: function computeStats(collection) {\n return _.reduce(collection, function accStats(acc, item) {\n acc.questions += item.stats.questions;\n acc.answered += item.stats.answered;\n acc.flagged += item.stats.flagged;\n acc.viewed += item.stats.viewed;\n acc.total += item.stats.total;\n acc.questionsViewed += item.stats.questionsViewed;\n return acc;\n }, getEmptyStats());\n },\n /**\n * Patch a testMap with a partial testMap.\n *\n * If the currentMap is null or the scope is test,\n * we just use the partialMap as it is.\n *\n * Indexes, position and stats will be (re)built.\n *\n * @param {Object} currentMap - the map to patch\n * @param {Object} partialMap - the patch\n * @param {String} partialMap.scope - indicate the scope of the patch (test, part or section)\n * @returns {Object} the patched testMap\n * @throws {TypeError} if the partialMap is no a map\n */\n patch: function patch(currentMap, partialMap) {\n var self = this;\n var targetMap;\n if (!_.isPlainObject(partialMap) || !partialMap.parts) {\n throw new TypeError('Invalid test map format');\n }\n if (!currentMap || partialMap.scope === 'test') {\n targetMap = _.cloneDeep(partialMap);\n } else {\n targetMap = _.cloneDeep(currentMap);\n _.forEach(partialMap.parts, function (partialPart, targetPartId) {\n if (partialMap.scope === 'part') {\n //replace the target part\n targetMap.parts[targetPartId] = _.cloneDeep(partialPart);\n }\n if (partialMap.scope === 'section') {\n _.forEach(partialPart.sections, function (partialSection, targetSectionId) {\n //replace the target section\n targetMap.parts[targetPartId].sections[targetSectionId] = _.cloneDeep(partialSection);\n\n //compte new section stats\n targetMap.parts[targetPartId].sections[targetSectionId].stats = self.computeItemStats(targetMap.parts[targetPartId].sections[targetSectionId].items);\n });\n }\n //compte new/updated part stats\n targetMap.parts[targetPartId].stats = self.computeStats(targetMap.parts[targetPartId].sections);\n });\n //compte updated test stats\n targetMap.stats = this.computeStats(targetMap.parts);\n }\n\n //the updated map can have a different size than the original\n targetMap = this.reindex(targetMap);\n return targetMap;\n },\n /**\n * Rebuild the indexes, positions of all map parts.\n * Then recreate the jump table.\n *\n * @param {Object} map - the map to reindex\n * @returns {Object} the brand new map\n * @throws {TypeError} if the map is no a map\n */\n reindex: function reindex(map) {\n var offset = 0;\n var offsetPart = 0;\n var offsetSection = 0;\n var lastPartId;\n var lastSectionId;\n if (!_.isPlainObject(map) || !map.parts) {\n throw new TypeError('Invalid test map format');\n }\n\n //remove the jump table\n map.jumps = [];\n\n //browse the test map, by position\n _.sortBy(map && map.parts, 'position').forEach(function (part) {\n _.sortBy(part && part.sections, 'position').forEach(function (section) {\n _.sortBy(section && section.items, 'position').forEach(function (item) {\n if (lastPartId !== part.id) {\n offsetPart = 0;\n lastPartId = part.id;\n part.position = offset;\n }\n if (lastSectionId !== section.id) {\n offsetSection = 0;\n lastSectionId = section.id;\n section.position = offset;\n }\n item.position = offset;\n item.index = offsetSection + 1;\n item.positionInPart = offsetPart;\n item.positionInSection = offsetSection;\n map.jumps[offset] = {\n identifier: item.id,\n section: section.id,\n part: part.id,\n position: offset\n };\n offset++;\n offsetSection++;\n offsetPart++;\n });\n });\n });\n return map;\n },\n /**\n * Create the jump table for a test map\n *\n * @param {Object} map - the map\n * @returns {Object} the brand new map with a jump table\n * @throws {TypeError} if the map is no a map\n */\n createJumpTable: function createJumpTable(map) {\n if (!_.isPlainObject(map) || !map.parts) {\n throw new TypeError('Invalid test map format');\n }\n map.jumps = [];\n this.each(map, function (item, section, part) {\n var offset = item.position;\n map.jumps[offset] = {\n identifier: item.id,\n section: section.id,\n part: part.id,\n position: offset\n };\n });\n return map;\n }\n };\n\n return map;\n\n});\n\n","define('taoQtiTest/runner/helpers/isReviewPanelEnabled',['taoQtiTest/runner/helpers/map'], function (mapHelper) { 'use strict';\n\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n\n /**\n * Tells if the review panel is enabled\n * @returns {Boolean}\n */\n function isReviewPanelEnabled(runner) {\n const reviewEnabled = mapHelper.hasItemCategory(runner.getTestMap(), runner.getTestContext().itemIdentifier, 'reviewScreen', true);\n const itemReviewEnabled = runner.getOptions().review.enabled;\n return reviewEnabled && itemReviewEnabled;\n }\n\n return isReviewPanelEnabled;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/accessibility/jumplinks/shortcuts',['i18n', 'lodash', 'ui/component', 'ui/keyNavigation/navigator', 'ui/keyNavigation/navigableDomElement', 'handlebars', 'lib/handlebars/helpers'], function (__, _, component, keyNavigator, navigableDomElement, Handlebars, Helpers0) { 'use strict';\n\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n component = component && Object.prototype.hasOwnProperty.call(component, 'default') ? component['default'] : component;\n keyNavigator = keyNavigator && Object.prototype.hasOwnProperty.call(keyNavigator, 'default') ? keyNavigator['default'] : keyNavigator;\n navigableDomElement = navigableDomElement && Object.prototype.hasOwnProperty.call(navigableDomElement, 'default') ? navigableDomElement['default'] : navigableDomElement;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, options, functionType=\"function\", escapeExpression=this.escapeExpression, self=this, helperMissing=helpers.helperMissing;\n\n function program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\\n
          \\n

          \";\n if (helper = helpers.label) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.label); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"

          \\n
            \\n \";\n stack1 = helpers.each.call(depth0, (depth0 && depth0.shortcuts), {hash:{},inverse:self.noop,fn:self.program(2, program2, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n
          \\n
          \\n \";\n return buffer;\n }\n function program2(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\\n
        • \\n \\n \";\n if (helper = helpers.shortcut) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.shortcut); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\n \\n \\n \";\n if (helper = helpers.label) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.label); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\n \\n
        • \\n \";\n return buffer;\n }\n\n buffer += \"
          \\n
          \\n

          \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Keyboard Navigation\", options) : helperMissing.call(depth0, \"__\", \"Keyboard Navigation\", options)))\n + \"\\n

          \\n
          \\n

          \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Keyboard shortcuts for the Accessibility Tools are available to the Test-taker.\", options) : helperMissing.call(depth0, \"__\", \"Keyboard shortcuts for the Accessibility Tools are available to the Test-taker.\", options)))\n + \"\\n

          \\n

          \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"You can magnify the content by up to 200%. Check your browser settings to find out how to do it.\", options) : helperMissing.call(depth0, \"__\", \"You can magnify the content by up to 200%. Check your browser settings to find out how to do it.\", options)))\n + \"\\n

          \\n
          \\n \\n \";\n stack1 = helpers.each.call(depth0, (depth0 && depth0.shortcutsGroups), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n
          \\n
          \\n\";\n return buffer;\n });\n function shortcutsTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Default config values, see below.\n */\n const defaults = {\n shortcutsGroups: [{\n id: 'navigation-shortcuts',\n label: __('Navigation shortcuts'),\n shortcuts: [{\n id: 'next',\n shortcut: 'ALT + Shift + N',\n label: __('Go to the next question')\n }, {\n id: 'previous',\n shortcut: 'ALT + Shift + P',\n label: __('Go to the previous question')\n }, {\n id: 'current',\n shortcut: 'ALT + Shift + Q',\n label: __('Go to the current question')\n }, {\n id: 'top',\n shortcut: 'ALT + Shift + T',\n label: __('Go to the top of the page')\n }]\n }]\n };\n\n /**\n * Creates and initialize the shortcuts component.\n * Please not the component IS NOT rendered.\n * You'll have to render it by yourself.\n *\n * @param {Object} config\n * @returns {shortcutsBox} the component, initialized and rendered\n */\n function shortcutsBoxFactory(config) {\n const ESK_KEY_CODE = 27;\n const shortcutsBox = component({}, defaults).on('render', function () {\n const $element = this.getElement();\n const $closeBtn = $element.find('.btn-close');\n const $keyNavigationItems = this.getElement().find('.shortcuts-list, .btn-close');\n $closeBtn.on('click', () => this.trigger('close'));\n // handle overlay click\n $element.on('click', e => {\n if ($element.is(e.target)) {\n this.trigger('close');\n }\n });\n $element.on('keyup', e => {\n if (e.keyCode === ESK_KEY_CODE) {\n this.trigger('close');\n }\n });\n this.navigator = keyNavigator({\n elements: navigableDomElement.createFromDoms($keyNavigationItems),\n propagateTab: false\n })\n // keep cursor at close button\n .on('tab', function () {\n this.setCursorAt(1);\n }).on('shift+tab', function () {\n this.setCursorAt(1);\n })\n // prevent focus move from shortcuts modal\n .on('blur', () => {\n _.defer(() => {\n if (!this.navigator.isFocused()) {\n this.navigator.focus();\n }\n });\n }).on('activate', function (cursor) {\n cursor.navigable.getElement().click();\n });\n this.navigator.first();\n }).on('destroy', function () {\n this.navigator.destroy();\n this.getElement().remove();\n });\n shortcutsBox.setTemplate(shortcutsTpl);\n shortcutsBox.init(config);\n return shortcutsBox;\n }\n\n return shortcutsBoxFactory;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/accessibility/jumplinks/plugin',['i18n', 'jquery', 'taoTests/runner/plugin', 'taoQtiTest/runner/helpers/isReviewPanelEnabled', 'taoQtiTest/runner/plugins/content/accessibility/jumplinks/helpers', 'taoQtiTest/runner/plugins/content/accessibility/jumplinks/jumplinks', 'taoQtiTest/runner/plugins/content/accessibility/jumplinks/shortcuts', 'util/shortcut', 'util/namespace', 'handlebars', 'lib/handlebars/helpers'], function (__, $$1, pluginFactory, isReviewPanelEnabled, helpers, jumplinksFactory, shortcutsFactory, shortcut, namespaceHelper, Handlebars, Helpers0) { 'use strict';\n\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n isReviewPanelEnabled = isReviewPanelEnabled && Object.prototype.hasOwnProperty.call(isReviewPanelEnabled, 'default') ? isReviewPanelEnabled['default'] : isReviewPanelEnabled;\n jumplinksFactory = jumplinksFactory && Object.prototype.hasOwnProperty.call(jumplinksFactory, 'default') ? jumplinksFactory['default'] : jumplinksFactory;\n shortcutsFactory = shortcutsFactory && Object.prototype.hasOwnProperty.call(shortcutsFactory, 'default') ? shortcutsFactory['default'] : shortcutsFactory;\n shortcut = shortcut && Object.prototype.hasOwnProperty.call(shortcut, 'default') ? shortcut['default'] : shortcut;\n namespaceHelper = namespaceHelper && Object.prototype.hasOwnProperty.call(namespaceHelper, 'default') ? namespaceHelper['default'] : namespaceHelper;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); \n\n\n return \"\\n\";\n });\n function containerTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Creates the JumpLinks plugin.\n * adding jumplinks accessibility feature for quick navigation\n */\n var plugin = pluginFactory({\n name: 'jumplinks',\n /**\n * Initializes the plugin (called during runner's init)\n */\n init() {\n const testRunner = this.getTestRunner();\n const item = testRunner.getCurrentItem();\n const config = {\n isReviewPanelEnabled: isReviewPanelEnabled(testRunner),\n questionStatus: helpers.getItemStatus(item)\n };\n const testRunnerOptions = testRunner.getOptions();\n const pluginShortcuts = (testRunnerOptions.shortcuts || {})[this.getName()] || {};\n const areaBroker = this.getAreaBroker();\n const getJumpElement = helpers.getJumpElementFactory(areaBroker);\n const shortcutsConfig = navigator.appVersion.indexOf(\"Mac\") !== -1 ? {\n shortcutsGroups: [{\n id: 'navigation-shortcuts',\n label: __('Navigation shortcuts'),\n shortcuts: [{\n id: 'next',\n shortcut: 'OPTION + Shift + N',\n label: __('Go to the next question')\n }, {\n id: 'previous',\n shortcut: 'OPTION + Shift + P',\n label: __('Go to the previous question')\n }, {\n id: 'current',\n shortcut: 'OPTION + Shift + Q',\n label: __('Go to the current question')\n }, {\n id: 'top',\n shortcut: 'OPTION + Shift + T',\n label: __('Go to the top of the page')\n }]\n }]\n } : {};\n if (testRunnerOptions.allowShortcuts) {\n pluginShortcuts.goToTop && shortcut.add(namespaceHelper.namespaceAll(pluginShortcuts.goToTop, this.getName(), true), function () {\n $$1('[tabindex]').first().focus();\n }, {\n avoidInput: true,\n prevent: true\n });\n pluginShortcuts.goToQuestion && shortcut.add(namespaceHelper.namespaceAll(pluginShortcuts.goToQuestion, this.getName(), true), function () {\n getJumpElement.question.focus();\n }, {\n avoidInput: true,\n prevent: true\n });\n }\n this.jumplinks = jumplinksFactory(config).on('render', () => {\n this.jumplinks.on('jump', jumpTo => {\n const $element = getJumpElement[jumpTo];\n $element.focus();\n });\n this.jumplinks.on('shortcuts', () => {\n if (this.shortcuts) {\n return;\n }\n this.shortcuts = shortcutsFactory(shortcutsConfig);\n this.shortcuts.render(this.getAreaBroker().getControlArea());\n this.shortcuts.on('close', () => {\n this.shortcuts.destroy();\n this.shortcuts = null;\n });\n });\n }).on('update', function update(params) {\n this.trigger('changeReviewPanel', params.isReviewPanelEnabled);\n this.trigger('changeQuesitionStatus', params.questionStatus);\n }).on('changeReviewPanel', function changeReviewPanel(enabled) {\n const elem = this.getElement();\n const panelJumplink = elem.find('[data-jump=\"teststatus\"]').parent();\n if (enabled) {\n panelJumplink.removeClass('hidden');\n } else {\n panelJumplink.addClass('hidden');\n }\n }).on('changeQuesitionStatus', function changeQuesitionStatus(questionStatus) {\n const elem = this.getElement();\n const text = `${__('Question')} - ${questionStatus}`;\n elem.find('[data-jump=\"question\"] > b').text(text);\n });\n testRunner.on('renderitem', () => {\n const currentItem = testRunner.getCurrentItem();\n const updatedConfig = {\n isReviewPanelEnabled: !helpers.isReviewPanelHidden(testRunner) && isReviewPanelEnabled(testRunner),\n questionStatus: helpers.getItemStatus(currentItem)\n };\n const announcedText = __('Item %s loaded', currentItem.position);\n let $announce = $$1('[aria-live=polite][role=alert]').first();\n if ($announce.length !== 1) {\n $announce = $$1('
          ');\n $$1('main').first().append($announce);\n }\n $announce.text(announcedText);\n this.jumplinks.trigger('update', updatedConfig);\n }).on('tool-flagitem', () => {\n const currentItem = testRunner.getCurrentItem();\n const questionStatus = helpers.getItemStatus(Object.assign({}, currentItem, {\n flagged: !currentItem.flagged\n }));\n this.jumplinks.trigger('changeQuesitionStatus', questionStatus);\n }).on('tool-reviewpanel', () => {\n const wasHidden = helpers.isReviewPanelHidden(testRunner);\n this.jumplinks.trigger('changeReviewPanel', wasHidden);\n }).after('renderitem', () => {\n getJumpElement.question.attr('tabindex', '-1').focus();\n });\n },\n /**\n * Called during the runner's render phase\n */\n render: function render() {\n const jumplinksContainer = $$1(containerTpl());\n $$1('.content-wrap').prepend(jumplinksContainer);\n this.jumplinks.render(jumplinksContainer);\n }\n });\n\n return plugin;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/headerNavigation',['jquery', 'ui/keyNavigation/navigator', 'ui/keyNavigation/navigableDomElement', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/helpers'], function ($, keyNavigator, navigableDomElement, helpers) { 'use strict';\n\n $ = $ && Object.prototype.hasOwnProperty.call($, 'default') ? $['default'] : $;\n keyNavigator = keyNavigator && Object.prototype.hasOwnProperty.call(keyNavigator, 'default') ? keyNavigator['default'] : keyNavigator;\n navigableDomElement = navigableDomElement && Object.prototype.hasOwnProperty.call(navigableDomElement, 'default') ? navigableDomElement['default'] : navigableDomElement;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 Open Assessment Technologies SA ;\n */\n\n /**\n * The identifier the keyNavigator group\n * @type {String}\n */\n const groupId = 'header-toolbar';\n\n /**\n * Key navigator strategy applying onto the header bar.\n * @type {Object} keyNavigationStrategy\n */\n var headerNavigation = {\n name: 'header',\n /**\n * Builds the header navigation strategy.\n *\n * @returns {keyNavigationStrategy}\n */\n init() {\n const config = this.getConfig();\n // we need a global selector as there is currently no way to access the delivery frame from the test runner\n const $headerBar = $('header');\n const $headerElements = $headerBar.find('a:visible');\n const registerHeaderNavigator = (id, group, $elements) => {\n const elements = navigableDomElement.createFromDoms($elements);\n if (elements.length) {\n const navigator = keyNavigator({\n id,\n group,\n elements,\n propagateTab: false,\n defaultPosition: 0\n });\n helpers.setupItemsNavigator(navigator, config);\n helpers.setupClickableNavigator(navigator);\n this.keyNavigators.push(navigator);\n }\n };\n this.keyNavigators = [];\n if (config.flatNavigation) {\n $headerElements.each((index, element) => registerHeaderNavigator(`${groupId}-${index}`, $headerBar, $(element)));\n } else {\n registerHeaderNavigator(groupId, $headerBar, $headerElements);\n }\n return this;\n },\n /**\n * Gets the list of applied navigators\n * @returns {keyNavigator[]}\n */\n getNavigators() {\n return this.keyNavigators;\n },\n /**\n * Tears down the keyNavigator strategy\n * @returns {keyNavigationStrategy}\n */\n destroy() {\n this.keyNavigators.forEach(navigator => navigator.destroy());\n this.keyNavigators = [];\n return this;\n }\n };\n\n return headerNavigation;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/toolbarNavigation',['lodash', 'jquery', 'ui/keyNavigation/navigator', 'ui/keyNavigation/navigableDomElement', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/helpers'], function (_, $, keyNavigator, navigableDomElement, helpers) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n $ = $ && Object.prototype.hasOwnProperty.call($, 'default') ? $['default'] : $;\n keyNavigator = keyNavigator && Object.prototype.hasOwnProperty.call(keyNavigator, 'default') ? keyNavigator['default'] : keyNavigator;\n navigableDomElement = navigableDomElement && Object.prototype.hasOwnProperty.call(navigableDomElement, 'default') ? navigableDomElement['default'] : navigableDomElement;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 Open Assessment Technologies SA ;\n */\n\n /**\n * The identifier the keyNavigator group\n * @type {String}\n */\n const groupId = 'bottom-toolbar';\n\n /**\n * Key navigator strategy applying onto the tools bar\n * @type {Object} keyNavigationStrategy\n */\n var toolbarNavigation = {\n name: 'toolbar',\n /**\n * Builds the toolbar navigation strategy.\n *\n * @returns {keyNavigationStrategy}\n */\n init() {\n const config = this.getConfig();\n const $navigationBar = this.getTestRunner().getAreaBroker().getContainer().find('.bottom-action-bar');\n let $toolbarElements = $navigationBar.find('.action:not(.btn-group):visible, .action.btn-group .li-inner:visible');\n if (config.reverseBottomToolbar) {\n $toolbarElements = $($toolbarElements.get().reverse());\n }\n const registerToolbarNavigator = (id, group, $elements) => {\n const elements = navigableDomElement.createFromDoms($elements);\n if (elements.length) {\n const navigator = keyNavigator({\n id,\n group,\n elements,\n propagateTab: false,\n defaultPosition(navigableElements) {\n let pos = 0;\n\n // search for the position of the \"Next\" button if any,\n // otherwise take the position of the last element\n if (config.autoFocus) {\n pos = navigableElements.length - 1;\n _.forEach(navigableElements, (navigable, i) => {\n const $element = navigable.getElement();\n if ($element.data('control') === 'move-forward' || $element.data('control') === 'move-end') {\n pos = i;\n }\n });\n }\n return pos;\n }\n });\n helpers.setupItemsNavigator(navigator, config);\n helpers.setupClickableNavigator(navigator);\n this.keyNavigators.push(navigator);\n }\n };\n this.keyNavigators = [];\n if (config.flatNavigation) {\n $toolbarElements.each((index, element) => registerToolbarNavigator(`${groupId}-${index}`, $navigationBar, $(element)));\n } else {\n registerToolbarNavigator(groupId, $navigationBar, $toolbarElements);\n }\n return this;\n },\n /**\n * Gets the list of applied navigators\n * @returns {keyNavigator[]}\n */\n getNavigators() {\n return this.keyNavigators;\n },\n /**\n * Tears down the keyNavigator strategy\n * @returns {keyNavigationStrategy}\n */\n destroy() {\n this.keyNavigators.forEach(navigator => navigator.destroy());\n this.keyNavigators = [];\n return this;\n }\n };\n\n return toolbarNavigation;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/topToolbarNavigation',['jquery', 'ui/keyNavigation/navigator', 'ui/keyNavigation/navigableDomElement', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/helpers'], function ($, keyNavigator, navigableDomElement, helpers) { 'use strict';\n\n $ = $ && Object.prototype.hasOwnProperty.call($, 'default') ? $['default'] : $;\n keyNavigator = keyNavigator && Object.prototype.hasOwnProperty.call(keyNavigator, 'default') ? keyNavigator['default'] : keyNavigator;\n navigableDomElement = navigableDomElement && Object.prototype.hasOwnProperty.call(navigableDomElement, 'default') ? navigableDomElement['default'] : navigableDomElement;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 Open Assessment Technologies SA ;\n */\n\n /**\n * The identifier the keyNavigator group\n * @type {String}\n */\n const groupId = 'top-toolbar';\n\n /**\n * Key navigator strategy applying onto the top toolbar' bar.\n * @type {Object} keyNavigationStrategy\n */\n var topToolbarNavigation = {\n name: 'top-toolbar',\n /**\n * Builds the top toolbar navigation strategy.\n *\n * @returns {keyNavigationStrategy}\n */\n init() {\n const config = this.getConfig();\n const $topToolbar = this.getTestRunner().getAreaBroker().getContainer().find('.top-action-bar');\n const $toolbarElements = $topToolbar.find('.timer-toggler');\n const registerTopToolbarNavigator = (id, group, $elements) => {\n const elements = navigableDomElement.createFromDoms($elements);\n if (elements.length) {\n const navigator = keyNavigator({\n id,\n group,\n elements,\n propagateTab: false\n });\n helpers.setupItemsNavigator(navigator, config);\n helpers.setupClickableNavigator(navigator);\n this.keyNavigators.push(navigator);\n }\n };\n this.keyNavigators = [];\n $toolbarElements.each((index, element) => registerTopToolbarNavigator(`${groupId}-${index}`, $topToolbar, $(element)));\n return this;\n },\n /**\n * Gets the list of applied navigators\n * @returns {keyNavigator[]}\n */\n getNavigators() {\n return this.keyNavigators;\n },\n /**\n * Tears down the keyNavigator strategy\n * @returns {keyNavigationStrategy}\n */\n destroy() {\n this.keyNavigators.forEach(navigator => navigator.destroy());\n this.keyNavigators = [];\n return this;\n }\n };\n\n return topToolbarNavigation;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/navigatorNavigation',['lodash', 'ui/keyNavigation/navigator', 'ui/keyNavigation/navigableDomElement', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/helpers'], function (_, keyNavigator, navigableDomElement, helpers) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n keyNavigator = keyNavigator && Object.prototype.hasOwnProperty.call(keyNavigator, 'default') ? keyNavigator['default'] : keyNavigator;\n navigableDomElement = navigableDomElement && Object.prototype.hasOwnProperty.call(navigableDomElement, 'default') ? navigableDomElement['default'] : navigableDomElement;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 Open Assessment Technologies SA ;\n */\n\n /**\n * List of CSS selectors for the navigables\n * @type {Object}\n */\n const selectors = {\n filters: '.qti-navigator-filters .qti-navigator-filter',\n enabledItems: '.qti-navigator-tree .qti-navigator-item:not(.disabled) .qti-navigator-label'\n };\n\n /**\n * For 'fizzy' navigator layout, builds the navigator navigation strategy.\n *\n * @returns {keyNavigationStrategy}\n */\n function initFizzy(config, $panel, $navigator, keyNavigators, managedNavigators) {\n let itemsNavigator;\n const $navigatorTree = $panel.find('.qti-navigator-tree');\n const $enabledItems = $navigator.find('.qti-navigator-tree .buttonlist-item:not(.disabled) .buttonlist-btn');\n const navigableItems = navigableDomElement.createFromDoms($enabledItems);\n\n /**\n * Get item wrapper from navigable button\n * (`navigable`: '.buttonlist-btn'; `parent()`: '.buttonlist-item')\n * @returns {jQuery}\n */\n const getItemFromNavigable = navigable => {\n return navigable.getElement().parent();\n };\n if (navigableItems.length) {\n itemsNavigator = keyNavigator({\n id: 'navigator-items',\n elements: navigableItems,\n group: $navigatorTree,\n loop: true,\n defaultPosition(navigableElements) {\n let pos = _.findIndex(navigableElements, navigable => {\n const $parent = getItemFromNavigable(navigable);\n if ($parent.hasClass('buttonlist-item-active') && $parent.is(':visible')) {\n return true;\n }\n });\n return pos >= 0 ? pos : 0;\n }\n }).on('focus', cursor => {\n getItemFromNavigable(cursor.navigable).addClass('key-navigation-highlight');\n }).on('blur', cursor => {\n getItemFromNavigable(cursor.navigable).removeClass('key-navigation-highlight');\n });\n helpers.setupItemsNavigator(itemsNavigator, {\n keyNextItem: config.keyNextItem,\n keyPrevItem: config.keyPrevItem\n });\n helpers.setupClickableNavigator(itemsNavigator);\n keyNavigators.push(itemsNavigator);\n managedNavigators.push(itemsNavigator);\n }\n }\n\n /**\n * Key navigator strategy applying onto the navigation panel.\n * @type {Object} keyNavigationStrategy\n */\n var navigatorNavigation = {\n name: 'navigator',\n /**\n * Builds the navigator navigation strategy.\n *\n * @returns {keyNavigationStrategy}\n */\n init() {\n const config = this.getConfig();\n const $panel = this.getTestRunner().getAreaBroker().getPanelArea();\n const $navigator = $panel.find('.qti-navigator');\n const isFizzyLayout = $navigator.hasClass('qti-navigator-fizzy');\n this.managedNavigators = [];\n this.keyNavigators = [];\n if ($navigator.length && !$navigator.hasClass('disabled')) {\n if (isFizzyLayout) {\n initFizzy(config, $panel, $navigator, this.keyNavigators, this.managedNavigators);\n } else {\n const $testStatusHeader = $navigator.find('.qti-navigator-info.collapsible > .qti-navigator-label');\n const navigableTestStatus = navigableDomElement.createFromDoms($testStatusHeader);\n $testStatusHeader.addClass('key-navigation-actionable');\n if (navigableTestStatus.length) {\n const testStatusNavigation = keyNavigator({\n keepState: config.keepState,\n id: 'navigator-test-status',\n propagateTab: false,\n elements: navigableTestStatus,\n group: $testStatusHeader\n });\n helpers.setupItemsNavigator(testStatusNavigation, {\n keyNextItem: config.keyNextTab || config.keyNextItem,\n keyPrevItem: config.keyPrevTab || config.keyPrevItem\n });\n this.keyNavigators.push(testStatusNavigation);\n this.managedNavigators.push(testStatusNavigation);\n }\n let filtersNavigator;\n let itemsNavigator;\n //the tag to identify if the item listing has been browsed, to only \"smart jump\" to active item only on the first visit\n let itemListingVisited = false;\n //the position of the filter in memory, to only \"smart jump\" to active item only on the first visit\n let currentFilter;\n const $filters = $navigator.find(selectors.filters);\n const navigableFilters = navigableDomElement.createFromDoms($filters);\n if (navigableFilters.length) {\n filtersNavigator = keyNavigator({\n keepState: config.keepState,\n id: 'navigator-filters',\n propagateTab: false,\n elements: navigableFilters,\n group: $navigator.find('.qti-navigator-filters')\n });\n helpers.setupItemsNavigator(filtersNavigator, {\n keyNextItem: config.keyNextTab || config.keyNextItem,\n keyPrevItem: config.keyPrevTab || config.keyPrevItem\n });\n helpers.setupClickableNavigator(filtersNavigator);\n if (config.keepState) {\n filtersNavigator.on('focus', cursor => {\n if (config.keepState) {\n const $element = cursor.navigable.getElement();\n const filter = $element.data('mode');\n $element.click();\n if (currentFilter !== filter) {\n itemListingVisited = false;\n }\n currentFilter = filter;\n }\n });\n }\n if (config.keyNextContent) {\n filtersNavigator.on(config.keyNextContent, elem => {\n if (helpers.allowedToNavigateFrom(elem) && itemsNavigator) {\n _.defer(() => {\n if (itemListingVisited) {\n itemsNavigator.first();\n } else {\n itemsNavigator.focus();\n }\n });\n }\n });\n }\n if (config.keyPrevContent) {\n filtersNavigator.on(config.keyPrevContent, elem => {\n if (helpers.allowedToNavigateFrom(elem) && itemsNavigator) {\n _.defer(() => {\n itemsNavigator.last();\n });\n }\n });\n }\n this.keyNavigators.push(filtersNavigator);\n this.managedNavigators.push(filtersNavigator);\n }\n const $navigatorTree = $panel.find('.qti-navigator-tree');\n const $trees = $navigator.find(selectors.enabledItems);\n const navigableTrees = navigableDomElement.createFromDoms($trees);\n $trees.first().addClass('key-navigation-scrollable-up');\n $trees.last().addClass('key-navigation-scrollable-down');\n if (navigableTrees.length) {\n //instantiate a key navigator but do not add it to the returned list of navigators as this is not supposed to be reached with tab key\n itemsNavigator = keyNavigator({\n id: 'navigator-items',\n elements: navigableTrees,\n group: $navigatorTree,\n defaultPosition(navigableElements) {\n let pos = 0;\n if (config.flatNavigation || currentFilter !== 'flagged') {\n pos = _.findIndex(navigableElements, navigable => {\n const $parent = navigable.getElement().parent('.qti-navigator-item');\n if ($parent.hasClass('active') && $parent.is(':visible')) {\n return true;\n }\n });\n }\n return pos;\n }\n }).on('focus', cursor => {\n itemListingVisited = true;\n cursor.navigable.getElement().parent().addClass('key-navigation-highlight');\n }).on('blur', cursor => {\n cursor.navigable.getElement().parent().removeClass('key-navigation-highlight');\n });\n helpers.setupItemsNavigator(itemsNavigator, {\n keyNextItem: config.keyNextContent || config.keyNextItem,\n keyPrevItem: config.keyPrevContent || config.keyPrevItem\n });\n helpers.setupClickableNavigator(itemsNavigator);\n if (config.keepState) {\n itemsNavigator.on('lowerbound upperbound', () => {\n if (filtersNavigator) {\n filtersNavigator.focus();\n }\n });\n }\n if (config.keyNextTab && config.keyPrevTab) {\n itemsNavigator.on(config.keyNextTab, function (elem) {\n if (helpers.allowedToNavigateFrom(elem) && filtersNavigator) {\n filtersNavigator.focus().next();\n }\n });\n itemsNavigator.on(config.keyPrevTab, function (elem) {\n if (helpers.allowedToNavigateFrom(elem) && filtersNavigator) {\n filtersNavigator.focus().previous();\n }\n });\n } else {\n this.keyNavigators.push(itemsNavigator);\n }\n this.managedNavigators.push(itemsNavigator);\n }\n }\n }\n return this;\n },\n /**\n * Gets the list of applied navigators\n * @returns {keyNavigator[]}\n */\n getNavigators() {\n return this.keyNavigators;\n },\n /**\n * Tears down the keyNavigator strategy\n * @returns {keyNavigationStrategy}\n */\n destroy() {\n this.managedNavigators.forEach(navigator => navigator.destroy());\n this.managedNavigators = [];\n this.keyNavigators = [];\n return this;\n }\n };\n\n return navigatorNavigation;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/pageNavigation',['jquery', 'ui/keyNavigation/navigator', 'ui/keyNavigation/navigableDomElement', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/helpers'], function ($, keyNavigator, navigableDomElement, helpers) { 'use strict';\n\n $ = $ && Object.prototype.hasOwnProperty.call($, 'default') ? $['default'] : $;\n keyNavigator = keyNavigator && Object.prototype.hasOwnProperty.call(keyNavigator, 'default') ? keyNavigator['default'] : keyNavigator;\n navigableDomElement = navigableDomElement && Object.prototype.hasOwnProperty.call(navigableDomElement, 'default') ? navigableDomElement['default'] : navigableDomElement;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 Open Assessment Technologies SA ;\n */\n\n /**\n * The identifier the keyNavigator group\n * @type {String}\n */\n const groupId = 'item-content-wrapper';\n\n /**\n * Key navigator strategy applying onto the page.\n * @type {Object} keyNavigationStrategy\n */\n var pageNavigation = {\n name: 'page',\n /**\n * Builds the page navigation strategy.\n *\n * @returns {keyNavigationStrategy}\n */\n init() {\n const config = this.getConfig();\n this.keyNavigators = [];\n this.getTestRunner().getAreaBroker().getContainer().find('.content-wrapper').addClass('key-navigation-scrollable').each((i, el) => {\n const $element = $(el);\n const navigator = keyNavigator({\n id: `${groupId}-${this.keyNavigators.length}`,\n elements: navigableDomElement.createFromDoms($element),\n group: $element,\n propagateTab: false\n });\n helpers.setupItemsNavigator(navigator, config);\n this.keyNavigators.push(navigator);\n });\n return this;\n },\n /**\n * Gets the list of applied navigators\n * @returns {keyNavigator[]}\n */\n getNavigators() {\n return this.keyNavigators;\n },\n /**\n * Tears down the keyNavigator strategy\n * @returns {keyNavigationStrategy}\n */\n destroy() {\n this.keyNavigators.forEach(navigator => navigator.destroy());\n this.keyNavigators = [];\n return this;\n }\n };\n\n return pageNavigation;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/rubricsNavigation',['jquery', 'ui/keyNavigation/navigator', 'ui/keyNavigation/navigableDomElement', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/helpers'], function ($, keyNavigator, navigableDomElement, helpers) { 'use strict';\n\n $ = $ && Object.prototype.hasOwnProperty.call($, 'default') ? $['default'] : $;\n keyNavigator = keyNavigator && Object.prototype.hasOwnProperty.call(keyNavigator, 'default') ? keyNavigator['default'] : keyNavigator;\n navigableDomElement = navigableDomElement && Object.prototype.hasOwnProperty.call(navigableDomElement, 'default') ? navigableDomElement['default'] : navigableDomElement;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 Open Assessment Technologies SA ;\n */\n\n /**\n * The identifier the keyNavigator group\n * @type {String}\n */\n const groupId = 'rubric-element-navigation-group';\n\n /**\n * Key navigator strategy applying onto the rubric blocks.\n * @type {Object} keyNavigationStrategy\n */\n var rubricsNavigation = {\n name: 'rubrics',\n /**\n * Builds the rubric blocks navigation strategy.\n *\n * @returns {keyNavigationStrategy}\n */\n init() {\n const config = this.getConfig();\n this.keyNavigators = [];\n this.getTestRunner().getAreaBroker().getContainer().find('.qti-rubricBlock').addClass('key-navigation-scrollable').each((i, el) => {\n const $element = $(el);\n const navigator = keyNavigator({\n id: `${groupId}-${this.keyNavigators.length}`,\n elements: navigableDomElement.createFromDoms($element),\n group: $element,\n propagateTab: false\n });\n helpers.setupItemsNavigator(navigator, config);\n this.keyNavigators.push(navigator);\n });\n return this;\n },\n /**\n * Gets the list of applied navigators\n * @returns {keyNavigator[]}\n */\n getNavigators() {\n return this.keyNavigators;\n },\n /**\n * Tears down the keyNavigator strategy\n * @returns {keyNavigationStrategy}\n */\n destroy() {\n this.keyNavigators.forEach(navigator => navigator.destroy());\n this.keyNavigators = [];\n return this;\n }\n };\n\n return rubricsNavigation;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/itemNavigation',['jquery', 'ui/scroller', 'ui/keyNavigation/navigator', 'ui/keyNavigation/navigableDomElement', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/helpers'], function ($, scrollHelper, keyNavigator, navigableDomElement, helpers) { 'use strict';\n\n $ = $ && Object.prototype.hasOwnProperty.call($, 'default') ? $['default'] : $;\n scrollHelper = scrollHelper && Object.prototype.hasOwnProperty.call(scrollHelper, 'default') ? scrollHelper['default'] : scrollHelper;\n keyNavigator = keyNavigator && Object.prototype.hasOwnProperty.call(keyNavigator, 'default') ? keyNavigator['default'] : keyNavigator;\n navigableDomElement = navigableDomElement && Object.prototype.hasOwnProperty.call(navigableDomElement, 'default') ? navigableDomElement['default'] : navigableDomElement;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 Open Assessment Technologies SA ;\n */\n\n /**\n * Add aria-labelledby attribute to choice interaction\n *\n * @param {Navigator} cursor\n */\n const addLabelledByAttribute = cursor => {\n const $element = cursor.navigable.getElement();\n const value = $element.attr('value');\n const name = $element.attr('name');\n if (name) {\n $element.attr('aria-labelledby', `${name.replace('response-', 'choice-')}-${value}`);\n }\n };\n\n /**\n * Add aria-labelledby attribute from choice interaction\n *\n * @param {Navigator} cursor\n */\n const removeLabelledByAttribute = cursor => {\n const $element = cursor.navigable.getElement();\n $element.removeAttr('aria-labelledby', '');\n };\n\n /**\n * Adds attributes on navigation focus and blur\n *\n * @param {Navigator} navigator\n */\n const manageLabelledByAttribute = navigator => {\n if (navigator) {\n navigator.on('focus', addLabelledByAttribute);\n navigator.on('blur', removeLabelledByAttribute); // applies WCAG behavior for the radio buttons\n }\n };\n\n /**\n * Key navigator strategy applying inside the item.\n * Navigable item content are interaction choices and body element with the special class \"key-navigation-focusable\".\n * @type {Object} keyNavigationStrategy\n */\n var itemNavigation = {\n name: 'item',\n /**\n * Builds the item navigation strategy.\n *\n * @returns {keyNavigationStrategy}\n */\n init() {\n var _this = this;\n this.keyNavigators = [];\n const config = this.getConfig();\n const $content = this.getTestRunner().getAreaBroker().getContentArea();\n\n /**\n * Gets the QTI choice element from the current position in the keyNavigation\n * @param {Object} cursor - The cursor definition supplied by the keyNavigator\n * @returns {jQuery} - The selected choice element\n */\n const getQtiChoice = function (cursor) {\n return cursor && cursor.navigable.getElement().closest('.qti-choice');\n };\n\n /**\n * Creates and registers a keyNavigator for the supplied list of elements\n * @param {jQuery} $elements - The list of navigable elements\n * @param {jQuery} group - The group container\n * @param {Boolean} [loop=false] - Allow cycling the list when a boundary is reached\n * @param {Number|Function} [defaultPosition=0] - The default position the group should set the focus on\n * @returns {keyNavigator} - the created navigator, if the list of element is not empty\n */\n const addNavigator = function ($elements, group) {\n let loop = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let defaultPosition = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;\n const elements = navigableDomElement.createFromDoms($elements);\n if (elements.length) {\n const navigator = keyNavigator({\n elements,\n group,\n loop,\n defaultPosition,\n propagateTab: false\n });\n _this.keyNavigators.push(navigator);\n return navigator;\n }\n };\n\n /**\n * Creates and setups a keyNavigator for the interaction inputs.\n * @param {jQuery} $elements - The list of navigable elements\n * @param {jQuery} group - The group container\n * @param {Boolean} [loop=false] - Allow cycling the list when a boundary is reached\n * @param {Number|Function} [defaultPosition=0] - The default position the group should set the focus on\n * @returns {keyNavigator} - The supplied keyNavigator\n */\n const addInputsNavigator = function ($elements, group, loop) {\n let defaultPosition = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;\n const navigator = addNavigator($elements, group, loop, defaultPosition);\n if (navigator) {\n helpers.setupItemsNavigator(navigator, config);\n helpers.setupClickableNavigator(navigator);\n\n // each choice is represented by more than the input, the style must be spread to the actual element\n navigator.on('focus', cursor => scrollHelper.scrollTo(getQtiChoice(cursor).addClass('key-navigation-highlight'), $content.closest('.content-wrapper'))).on('blur', cursor => getQtiChoice(cursor).removeClass('key-navigation-highlight'));\n }\n return navigator;\n };\n\n // list the navigable areas inside the item. This could be either the interactions choices or the prompts\n const $qtiInteractions = $content.find('.key-navigation-focusable,.qti-interaction')\n //filter out interaction as it will be managed separately\n .filter((i, node) => !$(node).parents('.qti-interaction').length);\n\n // the item focusable body elements are considered scrollable\n $content.find('.key-navigation-focusable').addClass('key-navigation-scrollable');\n\n // each navigable area will get its own keyNavigator\n $qtiInteractions.each((itemPos, itemElement) => {\n const $itemElement = $(itemElement);\n\n // detect the type of choices: checkbox or radio\n const $choiceInput = $itemElement.find('.qti-choice input');\n const choiceType = $choiceInput.attr('type');\n if ($itemElement.hasClass('qti-interaction')) {\n //add navigable elements from prompt\n $itemElement.find('.key-navigation-focusable').each((navPos, nav) => {\n const $nav = $(nav);\n if (!$nav.closest('.qti-choice').length) {\n addNavigator($nav, $nav);\n }\n });\n\n //reset interaction custom key navigation to override the behaviour with the new one\n $itemElement.off('.keyNavigation');\n\n //search for inputs that represent the interaction focusable choices\n const $inputs = $itemElement.is(':input') ? $itemElement : $itemElement.find(':input');\n if (config.flatNavigation && (config.flatRadioNavigation || choiceType !== 'radio')) {\n $inputs.each((i, input) => {\n const navigator = addInputsNavigator($(input), $itemElement);\n manageLabelledByAttribute(navigator);\n });\n } else {\n const navigator = addInputsNavigator($inputs, $itemElement, true, () => {\n // keep default positioning for now\n let position = -1;\n\n // autofocus the selected radio button if any\n $inputs.each((index, input) => {\n if (input.checked) {\n position = index;\n }\n });\n return position;\n });\n manageLabelledByAttribute(navigator);\n\n // applies WCAG behavior for the radio buttons\n if (navigator && config.wcagBehavior) {\n navigator.on('focus', cursor => {\n const $element = cursor.navigable.getElement();\n if (!$element.is(':checked')) {\n $element.click();\n }\n });\n }\n }\n } else {\n addNavigator($itemElement, $itemElement);\n }\n });\n return this;\n },\n /**\n * Gets the list of applied navigators\n * @returns {keyNavigator[]}\n */\n getNavigators() {\n return this.keyNavigators;\n },\n /**\n * Tears down the keyNavigator strategy\n * @returns {keyNavigationStrategy}\n */\n destroy() {\n this.keyNavigators.forEach(navigator => navigator.destroy());\n this.keyNavigators = [];\n return this;\n }\n };\n\n return itemNavigation;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/linearItemNavigation',['jquery', 'ui/keyNavigation/navigator', 'ui/keyNavigation/navigableDomElement', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/helpers'], function ($, keyNavigator, navigableDomElement, helpers) { 'use strict';\n\n $ = $ && Object.prototype.hasOwnProperty.call($, 'default') ? $['default'] : $;\n keyNavigator = keyNavigator && Object.prototype.hasOwnProperty.call(keyNavigator, 'default') ? keyNavigator['default'] : keyNavigator;\n navigableDomElement = navigableDomElement && Object.prototype.hasOwnProperty.call(navigableDomElement, 'default') ? navigableDomElement['default'] : navigableDomElement;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 Open Assessment Technologies SA ;\n */\n\n /**\n * Key navigator strategy applying inside the item.\n * Navigable item content are interaction choices with the special class \"key-navigation-focusable\".\n * @type {Object} keyNavigationStrategy\n */\n var linearItemNavigation = {\n name: 'linearItem',\n /**\n * Builds the item navigation strategy.\n *\n * @returns {keyNavigationStrategy}\n */\n init() {\n const config = this.getConfig();\n const $content = this.getTestRunner().getAreaBroker().getContentArea();\n const $qtiInteractions = $content.find('.key-navigation-focusable,.qti-interaction')\n //filter out interaction as it will be managed separately\n .filter((i, node) => !$(node).parents('.qti-interaction').length);\n const $qtiChoices = $qtiInteractions.find('.qti-choice');\n let $lastParent = null;\n let list = [];\n const setupListNavigator = () => {\n const navigator = keyNavigator({\n elements: list,\n propagateTab: false\n });\n helpers.setupItemsNavigator(navigator, config);\n this.choicesNavigators.push(navigator);\n };\n\n // this strategy manages 2 navigators:\n // - keyNavigators lists all elements separately, allowing to navigate among them as identified groups\n // - choicesNavigators lists elements with the same parent, allowing to navigate \"horizontally\" among them\n this.keyNavigators = [];\n this.choicesNavigators = [];\n\n // the item focusable body elements are considered scrollable\n $content.find('.key-navigation-focusable').addClass('key-navigation-scrollable');\n $qtiChoices.each((i, el) => {\n const $itemElement = $(el);\n const $parent = $itemElement.parent();\n const choiceNavigator = keyNavigator({\n elements: navigableDomElement.createFromDoms($itemElement),\n group: $itemElement,\n propagateTab: false\n });\n helpers.setupClickableNavigator(choiceNavigator);\n if ($lastParent && !$parent.is($lastParent)) {\n setupListNavigator();\n list = [];\n }\n this.keyNavigators.push(choiceNavigator);\n list.push(choiceNavigator);\n $lastParent = $parent;\n });\n if (list.length) {\n setupListNavigator();\n list = [];\n }\n return this;\n },\n /**\n * Gets the list of applied navigators\n * @returns {keyNavigator[]}\n */\n getNavigators() {\n return this.keyNavigators;\n },\n /**\n * Tears down the keyNavigator strategy\n * @returns {keyNavigationStrategy}\n */\n destroy() {\n this.keyNavigators.forEach(navigator => navigator.destroy());\n this.choicesNavigators.forEach(navigator => navigator.destroy());\n this.choicesNavigators = [];\n this.keyNavigators = [];\n return this;\n }\n };\n\n return linearItemNavigation;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/stimulusNavigation',['jquery', 'i18n', 'ui/keyNavigation/navigator', 'ui/keyNavigation/navigableDomElement', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/helpers'], function ($, __, keyNavigator, navigableDomElement, helpers) { 'use strict';\n\n $ = $ && Object.prototype.hasOwnProperty.call($, 'default') ? $['default'] : $;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n keyNavigator = keyNavigator && Object.prototype.hasOwnProperty.call(keyNavigator, 'default') ? keyNavigator['default'] : keyNavigator;\n navigableDomElement = navigableDomElement && Object.prototype.hasOwnProperty.call(navigableDomElement, 'default') ? navigableDomElement['default'] : navigableDomElement;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 Open Assessment Technologies SA ;\n */\n\n /**\n * The identifier the keyNavigator group\n * @type {String}\n */\n const groupId = 'stimulus-element-navigation-group';\n\n /**\n * Key navigator strategy applying on stimulus items with scrollbar.\n * Navigable item content are body elements with the special class \"stimulus-container\".\n * @type {Object} keyNavigationStrategy\n */\n var stimulusNavigation = {\n name: 'stimulus',\n /**\n * Builds the item navigation strategy.\n *\n * @returns {keyNavigationStrategy}\n */\n init() {\n const config = this.getConfig();\n const $content = this.getTestRunner().getAreaBroker().getContentArea();\n this.keyNavigators = [];\n\n // decorate isEnabled navigableDomElement method to check for dom node height\n const isEnabledDecorator = element => {\n const originalIsEnabled = element.isEnabled;\n element.isEnabled = function isEnabled() {\n if (originalIsEnabled.call(this)) {\n const node = this.getElement().get(0);\n return node.scrollHeight > node.clientHeight;\n }\n return false;\n };\n return element;\n };\n $content.find('.stimulus-container').addClass('key-navigation-scrollable').each((i, el) => {\n const $element = $(el);\n const elements = navigableDomElement.createFromDoms($element).map(isEnabledDecorator);\n\n // assign aria attributes\n $element.attr('aria-label', __('Passage'));\n const navigator = keyNavigator({\n id: `${groupId}-${i}`,\n elements,\n group: $element,\n propagateTab: false\n });\n helpers.setupItemsNavigator(navigator, config);\n this.keyNavigators.push(navigator);\n });\n return this;\n },\n /**\n * Gets the list of applied navigators\n * @returns {keyNavigator[]}\n */\n getNavigators() {\n return this.keyNavigators;\n },\n /**\n * Tears down the keyNavigator strategy\n * @returns {keyNavigationStrategy}\n */\n destroy() {\n this.keyNavigators.forEach(navigator => navigator.destroy());\n this.keyNavigators = [];\n return this;\n }\n };\n\n return stimulusNavigation;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/jumpLinks',['jquery', 'ui/keyNavigation/navigator', 'ui/keyNavigation/navigableDomElement', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/helpers'], function ($, keyNavigator, navigableDomElement, helpers) { 'use strict';\n\n $ = $ && Object.prototype.hasOwnProperty.call($, 'default') ? $['default'] : $;\n keyNavigator = keyNavigator && Object.prototype.hasOwnProperty.call(keyNavigator, 'default') ? keyNavigator['default'] : keyNavigator;\n navigableDomElement = navigableDomElement && Object.prototype.hasOwnProperty.call(navigableDomElement, 'default') ? navigableDomElement['default'] : navigableDomElement;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 Open Assessment Technologies SA ;\n */\n\n /**\n * The identifier the keyNavigator group\n * @type {String}\n */\n const groupId = 'jump-links';\n\n /**\n * Key navigator strategy applying onto the top toolbar' bar.\n * @type {Object} keyNavigationStrategy\n */\n var jumpLinks = {\n name: 'jump-links',\n /**\n * Builds the top toolbar navigation strategy.\n *\n * @returns {keyNavigationStrategy}\n */\n init() {\n const config = this.getConfig();\n const $jumpLinksBox = $('.content-wrap');\n const $links = $jumpLinksBox.find('.jump-link');\n this.keyNavigators = [];\n const registerTopToolbarNavigator = (id, group, $elements) => {\n const elements = navigableDomElement.createFromDoms($elements);\n if (elements.length) {\n const navigator = keyNavigator({\n id,\n group,\n elements,\n propagateTab: false\n });\n helpers.setupItemsNavigator(navigator, config);\n helpers.setupClickableNavigator(navigator);\n this.keyNavigators.push(navigator);\n }\n };\n $links.each((index, element) => registerTopToolbarNavigator(`${groupId}-${index}`, $jumpLinksBox, $(element)));\n return this;\n },\n /**\n * Gets the list of applied navigators\n * @returns {keyNavigator[]}\n */\n getNavigators() {\n return this.keyNavigators;\n },\n /**\n * Tears down the keyNavigator strategy\n * @returns {keyNavigationStrategy}\n */\n destroy() {\n this.keyNavigators.forEach(navigator => navigator.destroy());\n this.keyNavigators = [];\n return this;\n }\n };\n\n return jumpLinks;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/index',['exports', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/headerNavigation', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/toolbarNavigation', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/topToolbarNavigation', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/navigatorNavigation', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/pageNavigation', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/rubricsNavigation', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/itemNavigation', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/linearItemNavigation', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/stimulusNavigation', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/jumpLinks'], function (exports, headerNavigation, toolbarNavigation, topToolbarNavigation, navigatorNavigation, pageNavigation, rubricsNavigation, itemNavigation, linearItemNavigation, stimulusNavigation, jumpLinks) { 'use strict';\n\n\theaderNavigation = headerNavigation && Object.prototype.hasOwnProperty.call(headerNavigation, 'default') ? headerNavigation['default'] : headerNavigation;\n\ttoolbarNavigation = toolbarNavigation && Object.prototype.hasOwnProperty.call(toolbarNavigation, 'default') ? toolbarNavigation['default'] : toolbarNavigation;\n\ttopToolbarNavigation = topToolbarNavigation && Object.prototype.hasOwnProperty.call(topToolbarNavigation, 'default') ? topToolbarNavigation['default'] : topToolbarNavigation;\n\tnavigatorNavigation = navigatorNavigation && Object.prototype.hasOwnProperty.call(navigatorNavigation, 'default') ? navigatorNavigation['default'] : navigatorNavigation;\n\tpageNavigation = pageNavigation && Object.prototype.hasOwnProperty.call(pageNavigation, 'default') ? pageNavigation['default'] : pageNavigation;\n\trubricsNavigation = rubricsNavigation && Object.prototype.hasOwnProperty.call(rubricsNavigation, 'default') ? rubricsNavigation['default'] : rubricsNavigation;\n\titemNavigation = itemNavigation && Object.prototype.hasOwnProperty.call(itemNavigation, 'default') ? itemNavigation['default'] : itemNavigation;\n\tlinearItemNavigation = linearItemNavigation && Object.prototype.hasOwnProperty.call(linearItemNavigation, 'default') ? linearItemNavigation['default'] : linearItemNavigation;\n\tstimulusNavigation = stimulusNavigation && Object.prototype.hasOwnProperty.call(stimulusNavigation, 'default') ? stimulusNavigation['default'] : stimulusNavigation;\n\tjumpLinks = jumpLinks && Object.prototype.hasOwnProperty.call(jumpLinks, 'default') ? jumpLinks['default'] : jumpLinks;\n\n\n\n\texports.headerNavigationStrategy = headerNavigation;\n\texports.toolbarNavigationStrategy = toolbarNavigation;\n\texports.topToolbarNavigationStrategy = topToolbarNavigation;\n\texports.navigatorNavigationStrategy = navigatorNavigation;\n\texports.pageNavigationStrategy = pageNavigation;\n\texports.rubricsNavigationStrategy = rubricsNavigation;\n\texports.itemNavigationStrategy = itemNavigation;\n\texports.linearItemNavigationStrategy = linearItemNavigation;\n\texports.stimulusNavigationStrategy = stimulusNavigation;\n\texports.jumpLinksNavigationStrategy = jumpLinks;\n\n\tObject.defineProperty(exports, '__esModule', { value: true });\n\n});\n\n","define('taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategiesManager',['core/providerRegistry', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategies/index'], function (providerRegistry, strategies) { 'use strict';\n\n providerRegistry = providerRegistry && Object.prototype.hasOwnProperty.call(providerRegistry, 'default') ? providerRegistry['default'] : providerRegistry;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 Open Assessment Technologies SA ;\n */\n\n /**\n * Defines the strategies API\n * @typedef {Object} keyNavigationStrategy\n * @property {Function} init\n * @property {Function} destroy\n * @property {Function} getNavigators\n * @property {Function} getName\n * @property {Function} getConfig\n * @property {Function} getTestRunner\n */\n\n /**\n * Defines the config structure for the navigation strategies\n * @typedef {Object} keyNavigationStrategyConfig\n * @property {Boolean} autoFocus - auto select the main action when available in a group\n * @property {Boolean} wcagBehavior - apply WCAG recommended behavior for radio buttons and similar elements\n * @property {Boolean} keepState - for strategies able to keep the state, allow to keep the position of the focused\n * element when moving away from the group and restore it when the group retrieves the focus\n * @property {Boolean} propagateTab - propagate the Tab key to the upper level\n * @property {Boolean} flatNavigation - flatten the navigation between groups, allowing to forward the focus to the\n * following group when a group boundary is reached. If disabled, the only way to move between groups is to use the\n * related key combination\n * @property {String} keyNextItem - the keyboard shortcut to move to the next item (inside the scope)\n * @property {String} keyPrevItem - the keyboard shortcut to move to the previous item (inside the scope)\n * @property {String} keyNextGroup - the keyboard shortcut to move to the next group (outside the scope)\n * @property {String} keyPrevGroup - the keyboard shortcut to move to the previous group (outside the scope)\n * @property {String} keyNextTab - the keyboard shortcut to move to the next tab of the bar\n * @property {String} keyPrevTab - the keyboard shortcut to move to the previous tab of the bar\n * @property {String} keyNextContent - the keyboard shortcut to move to the next content element\n * @property {String} keyPrevContent - the keyboard shortcut to move to the previous content element\n */\n\n /**\n * Builds a key navigator strategies manager.\n *\n * @param {String} name - the name of the strategy to build\n * @param {testRunner} testRunner - the test runner instance to control\n * @param {keyNavigationStrategyConfig} config - the config to apply\n * @returns {keyNavigationStrategy}\n */\n function strategyFactory(name, testRunner, config) {\n const strategy = strategyFactory.getProvider(name);\n\n /**\n * @type {Object} keyNavigationStrategy\n */\n return {\n /**\n * Setup the keyNavigator strategy\n * @returns {keyNavigationStrategy}\n */\n init() {\n strategy.init.call(this);\n return this;\n },\n /**\n * Gets the name of the applied strategy\n * @returns {String}\n */\n getName() {\n return name;\n },\n /**\n * Gets the config of the strategy\n * @returns {keyNavigationStrategyConfig}\n */\n getConfig() {\n return config;\n },\n /**\n * Gets the test runner\n * @returns {testRunner}\n */\n getTestRunner() {\n return testRunner;\n },\n /**\n * Gets the list of applied navigators\n * @returns {keyNavigator[]}\n */\n getNavigators() {\n if ('function' === typeof strategy.getNavigators) {\n return strategy.getNavigators.call(this);\n }\n return [];\n },\n /**\n * Tears down the keyNavigator strategy\n * @returns {keyNavigationStrategy}\n */\n destroy() {\n if ('function' === typeof strategy.destroy) {\n strategy.destroy.call(this);\n }\n return this;\n }\n };\n }\n\n // bootstrap the manager and register the strategies\n providerRegistry(strategyFactory);\n Object.values(strategies).forEach(strategy => strategyFactory.registerProvider(strategy.name, strategy));\n\n return strategyFactory;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/accessibility/keyNavigation/helpers',['exports', 'jquery', 'lodash', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/strategiesManager'], function (exports, $, _, strategyFactory) { 'use strict';\n\n $ = $ && Object.prototype.hasOwnProperty.call($, 'default') ? $['default'] : $;\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n strategyFactory = strategyFactory && Object.prototype.hasOwnProperty.call(strategyFactory, 'default') ? strategyFactory['default'] : strategyFactory;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2020 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * When either an element or its parents have this class - navigation from it would be disabled.\n *\n * @type {String}\n */\n const ignoredClass = 'no-key-navigation';\n\n /**\n * Checks whether element is navigable from\n *\n * @param {HTMLElement|keyNavigator} from\n * @returns {boolean}\n */\n function allowedToNavigateFrom(from) {\n let element = from;\n if (element && 'function' === typeof element.getCursor) {\n const {\n navigable\n } = element.getCursor();\n element = navigable;\n }\n if (element && 'function' === typeof element.getElement) {\n element = element.getElement();\n }\n const $element = $(element);\n if ($element.hasClass(ignoredClass) || $element.parents(`.${ignoredClass}`).length > 0) {\n return false;\n }\n return true;\n }\n\n /**\n * Applies an items' navigation scheme on a keyNavigator.\n * @param {keyNavigator} navigator\n * @param {keyNavigationStrategyConfig} config - the config to apply\n * @returns {keyNavigator}\n */\n function setupItemsNavigator(navigator, config) {\n return navigator.on(config.keyNextItem, function navigateToNextItem(elem) {\n if (allowedToNavigateFrom(elem)) {\n this.next();\n }\n }).on(config.keyPrevItem, function navigateToPrevItem(elem) {\n if (allowedToNavigateFrom(elem)) {\n this.previous();\n }\n });\n }\n\n /**\n * Applies an items' navigation scheme on a keyNavigator.\n * @param {keyNavigator} navigator\n * @returns {keyNavigator}\n */\n function setupClickableNavigator(navigator) {\n return navigator.on('activate', function activateItem(cursor) {\n const $elt = cursor.navigable.getElement();\n\n // jQuery <= 1.9.0\n // the checkbox values are set after the click event if triggered with jQuery\n if ($elt.is(':checkbox')) {\n $elt.each(function () {\n this.click();\n });\n } else {\n $elt.click().mousedown();\n }\n });\n }\n\n /**\n * Build the strategies related to a key navigation mode\n * @param {keyNavigationMode} navigationMode\n * @param {testRunner} testRunner\n * @returns {keyNavigationStrategy[]}\n */\n function getStrategies(navigationMode, testRunner) {\n return navigationMode.strategies.map(area => strategyFactory(area, testRunner, navigationMode.config).init());\n }\n\n /**\n * Gets the key navigators from the provided strategies\n * @param {keyNavigationStrategy[]} strategies\n * @returns {keyNavigator[]}\n */\n function getNavigators(strategies) {\n return _.flatten(strategies.map(strategy => strategy.getNavigators()));\n }\n\n exports.allowedToNavigateFrom = allowedToNavigateFrom;\n exports.getNavigators = getNavigators;\n exports.getStrategies = getStrategies;\n exports.setupClickableNavigator = setupClickableNavigator;\n exports.setupItemsNavigator = setupItemsNavigator;\n\n Object.defineProperty(exports, '__esModule', { value: true });\n\n});\n\n","define('taoQtiTest/runner/plugins/content/accessibility/keyNavigation/modes/defaultMode',[],function () { 'use strict';\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 Open Assessment Technologies SA ;\n */\n\n /**\n * Default key navigation mode\n */\n var defaultMode = {\n name: 'default',\n /**\n * Builds the key navigation config for the \"default\" mode\n * @param {keyNavigationStrategyConfig} config - additional config to set\n * @returns {keyNavigationMode}\n */\n init() {\n let config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n return {\n strategies: ['rubrics', 'stimulus', 'item', 'toolbar', 'header', 'top-toolbar', 'navigator', 'page'],\n config: Object.assign({\n autoFocus: true,\n wcagBehavior: false,\n keepState: true,\n propagateTab: false,\n flatNavigation: false,\n keyNextGroup: 'tab',\n keyPrevGroup: 'shift+tab',\n keyNextItem: 'right down',\n keyPrevItem: 'left up',\n keyNextTab: 'right',\n keyPrevTab: 'left',\n keyNextContent: 'down',\n keyPrevContent: 'up'\n }, config)\n };\n }\n };\n\n return defaultMode;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/accessibility/keyNavigation/modes/linearMode',[],function () { 'use strict';\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 Open Assessment Technologies SA ;\n */\n\n /**\n * Linear key navigation mode\n */\n var linearMode = {\n name: 'linear',\n /**\n * Builds the key navigation config for the \"linear\" mode\n * @param {keyNavigationStrategyConfig} config - additional config to set\n * @returns {keyNavigationMode}\n */\n init() {\n let config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n return {\n strategies: ['rubrics', 'stimulus', 'linearItem', 'toolbar', 'header', 'top-toolbar', 'navigator', 'page'],\n config: Object.assign({\n autoFocus: true,\n wcagBehavior: false,\n keepState: true,\n propagateTab: false,\n flatNavigation: false,\n keyNextGroup: 'tab',\n keyPrevGroup: 'shift+tab',\n keyNextItem: 'right down',\n keyPrevItem: 'left up',\n keyNextTab: 'right',\n keyPrevTab: 'left',\n keyNextContent: 'down',\n keyPrevContent: 'up'\n }, config)\n };\n }\n };\n\n return linearMode;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/accessibility/keyNavigation/modes/nativeMode',[],function () { 'use strict';\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 Open Assessment Technologies SA ;\n */\n\n /**\n * Native key navigation mode\n */\n var nativeMode = {\n name: 'native',\n /**\n * Builds the key navigation config for the \"native\" mode\n * @param {keyNavigationStrategyConfig} config - additional config to set\n * @returns {keyNavigationMode}\n */\n init() {\n let config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n return {\n // todo: add access to the page and the rubric blocks\n strategies: ['jump-links', 'header', 'top-toolbar', 'navigator', 'page', 'rubrics', 'stimulus', 'item', 'toolbar'],\n config: Object.assign({\n autoFocus: false,\n wcagBehavior: false,\n keepState: false,\n propagateTab: true,\n flatNavigation: true,\n keyNextGroup: 'tab',\n keyPrevGroup: 'shift+tab',\n keyNextItem: 'right down',\n keyPrevItem: 'left up',\n keyNextTab: '',\n keyPrevTab: '',\n keyNextContent: '',\n keyPrevContent: ''\n }, config)\n };\n }\n };\n\n return nativeMode;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/accessibility/keyNavigation/modes/index',['exports', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/modes/defaultMode', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/modes/linearMode', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/modes/nativeMode'], function (exports, defaultMode, linearMode, nativeMode) { 'use strict';\n\n\tdefaultMode = defaultMode && Object.prototype.hasOwnProperty.call(defaultMode, 'default') ? defaultMode['default'] : defaultMode;\n\tlinearMode = linearMode && Object.prototype.hasOwnProperty.call(linearMode, 'default') ? linearMode['default'] : linearMode;\n\tnativeMode = nativeMode && Object.prototype.hasOwnProperty.call(nativeMode, 'default') ? nativeMode['default'] : nativeMode;\n\n\n\n\texports.defaultModeProvider = defaultMode;\n\texports.linearModeProvider = linearMode;\n\texports.nativeModeProvider = nativeMode;\n\n\tObject.defineProperty(exports, '__esModule', { value: true });\n\n});\n\n","define('taoQtiTest/runner/plugins/content/accessibility/keyNavigation/modesManager',['core/providerRegistry', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/modes/index'], function (providerRegistry, modes) { 'use strict';\n\n providerRegistry = providerRegistry && Object.prototype.hasOwnProperty.call(providerRegistry, 'default') ? providerRegistry['default'] : providerRegistry;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 Open Assessment Technologies SA ;\n */\n\n /**\n * Defines the mode config\n * @typedef {Object} keyNavigationMode\n * @property {String[]} strategies\n * @property {keyNavigationStrategyConfig} config\n */\n\n /**\n * Builds a key navigator modes manager.\n *\n * @param {String} mode - the name of the mode to get\n * @param {keyNavigationStrategyConfig} config - additional config to set\n * @returns {keyNavigationMode}\n */\n function modeFactory(mode) {\n let config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n const instance = modeFactory.getProvider(mode);\n return instance.init(config);\n }\n\n // bootstrap the manager and register the strategies\n providerRegistry(modeFactory);\n Object.values(modes).forEach(mode => modeFactory.registerProvider(mode.name, mode));\n\n return modeFactory;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/accessibility/keyNavigation/keyNavigation',['ui/keyNavigation/navigator', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/helpers', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/modesManager', 'util/shortcut'], function (keyNavigator, helpers, modeFactory, shortcut) { 'use strict';\n\n keyNavigator = keyNavigator && Object.prototype.hasOwnProperty.call(keyNavigator, 'default') ? keyNavigator['default'] : keyNavigator;\n modeFactory = modeFactory && Object.prototype.hasOwnProperty.call(modeFactory, 'default') ? modeFactory['default'] : modeFactory;\n shortcut = shortcut && Object.prototype.hasOwnProperty.call(shortcut, 'default') ? shortcut['default'] : shortcut;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2020 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * The event namespace used to register removable listeners\n * @type {String}\n */\n const eventNS = '.keyNavigation';\n\n /**\n * Builds a key navigator that can apply onto a test runner\n * @param {testRunner} testRunner - the test runner instance to control\n * @param {Object} config - the config to apply\n * @param {String} config.contentNavigatorType - the keyboard navigation mode\n * @returns {testRunnerKeyNavigator}\n */\n function keyNavigationFactory(testRunner) {\n let config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n let {\n contentNavigatorType\n } = config;\n let groupNavigator = null;\n let strategies = [];\n\n /**\n * @typedef {Object} testRunnerKeyNavigator\n */\n return {\n /**\n * Setup the keyNavigator\n * @returns {testRunnerKeyNavigator}\n */\n init() {\n const navigationMode = modeFactory(contentNavigatorType, config);\n const navigationConfig = navigationMode.config;\n strategies = helpers.getStrategies(navigationMode, testRunner);\n const navigators = helpers.getNavigators(strategies);\n\n //blur current focused element, to reinitialize keyboard navigation\n if (document.activeElement) {\n document.activeElement.blur();\n }\n groupNavigator = keyNavigator({\n id: 'test-runner',\n loop: true,\n elements: navigators,\n propagateTab: navigationConfig.propagateTab\n });\n helpers.setupItemsNavigator(groupNavigator, {\n keyNextItem: navigationConfig.keyNextGroup,\n keyPrevItem: navigationConfig.keyPrevGroup\n });\n shortcut.remove(eventNS).add(`tab${eventNS} shift+tab${eventNS}`, function (e) {\n if (!helpers.allowedToNavigateFrom(e.target)) {\n return false;\n }\n if (!groupNavigator.isFocused()) {\n groupNavigator.focus();\n }\n });\n return this;\n },\n /**\n * Gets the attached testRunner\n * @returns {testRunner}\n */\n getTestRunner() {\n return testRunner;\n },\n /**\n * Switches the navigation mode\n * @param {String} newMode\n * @returns {testRunnerKeyNavigator}\n */\n setMode(newMode) {\n contentNavigatorType = newMode;\n return this;\n },\n /**\n * Gets the active navigation mode\n * @returns {String}\n */\n getMode() {\n return contentNavigatorType;\n },\n /**\n * Returns keyNavigation active state\n * @returns {Boolean}\n */\n isActive() {\n return groupNavigator !== null;\n },\n /**\n * Tears down the keyNavigator\n * @returns {testRunnerKeyNavigator}\n */\n destroy() {\n shortcut.remove(eventNS);\n strategies.forEach(strategy => strategy.destroy());\n if (groupNavigator) {\n groupNavigator.destroy();\n }\n groupNavigator = null;\n strategies = [];\n return this;\n }\n };\n }\n\n return keyNavigationFactory;\n\n});\n\n","\ndefine('css!taoQtiTest/runner/plugins/content/accessibility/css/key-navigation',[],function(){});\n","define('taoQtiTest/runner/plugins/content/accessibility/keyNavigation/plugin',['lodash', 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/keyNavigation', 'taoTests/runner/plugin', 'css!taoQtiTest/runner/plugins/content/accessibility/css/key-navigation.css'], function (_, keyNavigatorFactory, pluginFactory, keyNavigation_css) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n keyNavigatorFactory = keyNavigatorFactory && Object.prototype.hasOwnProperty.call(keyNavigatorFactory, 'default') ? keyNavigatorFactory['default'] : keyNavigatorFactory;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2020 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * If we have now config from backend side - we set this default dataset\n *\n * @typedef {object}\n * @properties {string} contentNavigatorType - ('default' | 'linear') - type of content navigation\n */\n const defaultPluginConfig = {\n contentNavigatorType: 'default'\n };\n\n /**\n * Returns the configured plugin\n */\n var plugin = pluginFactory({\n name: 'keyNavigation',\n /**\n * Initialize the plugin (called during runner's init)\n */\n init() {\n const testRunner = this.getTestRunner();\n const pluginConfig = _.defaults(this.getConfig(), defaultPluginConfig);\n const keyNavigator = keyNavigatorFactory(testRunner, pluginConfig);\n\n /**\n * Update plugin state based on changes\n */\n testRunner.after('renderitem', () => {\n // make sure that keyNavigator is destroyed\n // to preevent multiple instances to be active at the same time\n if (keyNavigator.isActive()) {\n keyNavigator.destroy();\n }\n keyNavigator.init();\n }).on('unloaditem', () => {\n keyNavigator.destroy();\n })\n\n /**\n * @param {string} type - type of content tab navigation,\n * can be: 'default', 'linear', 'native'\n */.on('setcontenttabtype', type => {\n keyNavigator.setMode(type);\n pluginConfig.contentNavigatorType = type;\n });\n }\n });\n\n return plugin;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/accessibility/mainLandmark/header',['jquery', 'i18n', 'taoTests/runner/plugin', 'handlebars', 'lib/handlebars/helpers'], function ($$1, __, pluginFactory, Handlebars, Helpers0) { 'use strict';\n\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); \n\n\n return \"\\n\\n\";\n });\n function headerTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 (original work) Open Assessment Technologies SA ;\n */\n function getState(item) {\n let state = __('Unseen');\n if (item.flagged) {\n state = __('Flagged');\n } else if (item.answered) {\n state = __('Answered');\n } else if (item.viewed) {\n state = __('Viewed');\n }\n return state;\n }\n var header = pluginFactory({\n name: 'mainLandmark',\n init() {\n const testRunner = this.getTestRunner();\n const updateTitle = item => {\n this.$title.text(`${item.label}`).show();\n };\n const updateState = item => {\n this.$state.text(`${getState(item)}`).show();\n };\n testRunner.after('renderitem', () => {\n const item = testRunner.getCurrentItem();\n updateTitle(item);\n updateState(item);\n }).on('tool-flagitem', () => {\n let item = testRunner.getCurrentItem();\n item = Object.assign({}, item, {\n flagged: !item.flagged\n });\n updateState(item);\n });\n },\n render() {\n const $container = this.getAreaBroker().getArea('mainLandmark');\n this.$element = $$1(headerTpl());\n $container.append(this.$element);\n this.$title = $container.find(`[data-control=\"qti-test-item-title\"]`);\n this.$state = $container.find(`[data-control=\"qti-test-item-state\"]`);\n }\n });\n\n return header;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/dialog/dialog',['jquery', 'lodash', 'taoTests/runner/plugin', 'ui/dialog/alert', 'ui/dialog/confirm', 'util/shortcut/registry', 'util/shortcut', 'util/namespace'], function ($, _, pluginFactory, dialogAlert, dialogConfirm, shortcutRegistry, globalShortcut, namespaceHelper) { 'use strict';\n\n $ = $ && Object.prototype.hasOwnProperty.call($, 'default') ? $['default'] : $;\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n dialogAlert = dialogAlert && Object.prototype.hasOwnProperty.call(dialogAlert, 'default') ? dialogAlert['default'] : dialogAlert;\n dialogConfirm = dialogConfirm && Object.prototype.hasOwnProperty.call(dialogConfirm, 'default') ? dialogConfirm['default'] : dialogConfirm;\n shortcutRegistry = shortcutRegistry && Object.prototype.hasOwnProperty.call(shortcutRegistry, 'default') ? shortcutRegistry['default'] : shortcutRegistry;\n globalShortcut = globalShortcut && Object.prototype.hasOwnProperty.call(globalShortcut, 'default') ? globalShortcut['default'] : globalShortcut;\n namespaceHelper = namespaceHelper && Object.prototype.hasOwnProperty.call(namespaceHelper, 'default') ? namespaceHelper['default'] : namespaceHelper;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * The public name of the plugin\n * @type {String}\n */\n var pluginName = 'dialog';\n\n /**\n * The prefix of actions triggered through the event loop\n * @type {String}\n */\n var actionPrefix = `tool-${pluginName}-`;\n\n /**\n * Some default options for the plugin\n * @type {Object}\n */\n var defaultOptions = {\n alert: {\n focus: 'ok'\n },\n confirm: {\n focus: 'ok'\n }\n };\n\n /**\n * Returns the configured plugin\n */\n var dialog = pluginFactory({\n name: pluginName,\n /**\n * Initialize the plugin (called during runner's init)\n */\n init: function init() {\n var testRunner = this.getTestRunner();\n var testOptions = testRunner.getOptions();\n var pluginConfig = Object.assign({}, defaultOptions, this.getConfig());\n var pluginShortcuts = (testOptions.shortcuts || {})[pluginName] || {};\n var alerts = [];\n var confirms = [];\n var opened = [];\n var dialogShortcut = shortcutRegistry($('body'), {\n propagate: false,\n prevent: true\n });\n\n /**\n * Closes a dialog with accept\n * @param {dialog} dialog - The instance of the dialog\n */\n function closeAccept(dialog) {\n // TODO: improve the dialog implementation in order to provide a better API\n dialog.trigger('okbtn.modal').hide();\n }\n\n /**\n * Closes a dialog with rejection\n * @param {dialog} dialog - The instance of the dialog\n */\n function closeReject(dialog) {\n dialog.hide();\n }\n\n /**\n * Closes the last opened dialog\n * @param {Boolean} accept Whether the dialog should be accepted or not\n * @param {String} [shortcut] The shortcut that caused the action\n */\n function closeLast(accept, shortcut) {\n var handle = opened.length && opened[opened.length - 1];\n if (handle) {\n handle.shortcut = shortcut;\n if (accept) {\n closeAccept(handle.dialog);\n } else {\n closeReject(handle.dialog);\n }\n }\n }\n\n /**\n * Add dialog on top of the provided stack\n * @param {String} namespace - The event namespace that scope the dialog\n * @param {Array} stack - The dialogs stack on which push the new instance\n * @param {Function} dialog - The constructor of the dialog\n * @param {String} message - The message to display\n * @param {Function} accept - The callback for accept\n * @param {Function} reject - The callback for reject\n * @param {Object} options - Dialog options\n */\n function addHandle(namespace, stack, dialog, message, accept, reject, options) {\n var handle = {\n context: namespace,\n dialog: dialog(message, doAccept, doReject, options)\n };\n function doAccept(e, reason) {\n if (_.isFunction(accept)) {\n accept(handle.shortcut || reason);\n }\n }\n function doReject(e, reason) {\n if (_.isFunction(reject)) {\n reject(handle.shortcut || reason);\n }\n }\n\n // prevents all registered shortcuts to be triggered\n // and brings back the dialog shortcuts\n globalShortcut.disable();\n dialogShortcut.enable();\n stack.push(handle);\n opened.push(handle);\n handle.dialog.focus(options.focus);\n handle.dialog.on('closed.modal', function () {\n removeHandle(stack, handle.dialog);\n removeHandle(opened, handle.dialog);\n\n // if all dialogs have been closed allows all registered shortcuts to be triggered\n // also disables the dialog shortcuts\n if (!opened.length) {\n globalShortcut.enable();\n dialogShortcut.disable();\n }\n });\n }\n\n /**\n * Remove a dialog from the provided stack\n * @param {Array} stack - The dialogs stack from which remove the dialog instance\n * @param {dialog} dialog - The instance of the dialog\n */\n function removeHandle(stack, dialog) {\n if (dialog) {\n _.remove(stack, function (handle) {\n if (handle && dialog === handle.dialog) {\n return true;\n }\n });\n }\n }\n\n /**\n * Closes all dialogs within the provided stack\n * @param {String} namespace - The event namespace that scope the dialogs to close\n * @param {Boolean} accept - Whether (`true`) or not (`false`) to close the dialogs with accept\n * @param {Array} stack - The dialogs stack in which close the dialogs\n */\n function closeDialogs(namespace, accept, stack) {\n if (stack) {\n _.forEach(stack, function (handle) {\n if (handle && (namespace === '@' || namespace === handle.context)) {\n if (accept) {\n closeAccept(handle.dialog);\n } else {\n closeReject(handle.dialog);\n }\n }\n });\n } else {\n closeDialogs(namespace, accept, alerts);\n closeDialogs(namespace, accept, confirms);\n }\n }\n\n // starts with shortcuts disabled, prevents the TAB key to be used to move outside the dialog box\n dialogShortcut.disable().set('Tab Shift+Tab');\n\n // handle the plugin's shortcuts\n if (testOptions.allowShortcuts) {\n _.forEach(pluginShortcuts, function (command, key) {\n dialogShortcut.add(namespaceHelper.namespaceAll(command, pluginName, true), function (e, shortcut) {\n // just fire the action using the event loop\n testRunner.trigger(actionPrefix + key, shortcut);\n });\n });\n }\n\n //change plugin state\n testRunner.before('alert.*', function (e, msg, accept, options) {\n addHandle(e.namespace, alerts, dialogAlert, msg, accept, accept, _.merge({}, pluginConfig.alert, options));\n }).before('confirm.*', function (e, msg, accept, reject, options) {\n addHandle(e.namespace, confirms, dialogConfirm, msg, accept, reject, _.merge({}, pluginConfig.confirm, options));\n }).before('closedialog.*', function (e, accept) {\n closeDialogs(e.namespace, accept);\n }).on(`${actionPrefix}accept`, function (shortcut) {\n closeLast(true, shortcut);\n }).on(`${actionPrefix}reject`, function (shortcut) {\n closeLast(false, shortcut);\n }).on('destroy', function () {\n closeDialogs('.@');\n dialogShortcut.clear();\n dialogShortcut = null;\n });\n }\n });\n\n return dialog;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/dialog/exitMessages',['lodash', 'taoTests/runner/plugin'], function (_, pluginFactory) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Creates the testState plugin.\n * Displays exit message, then leaves the runner once the user has acknowledged\n */\n var exitMessages = pluginFactory({\n name: 'exitMessages',\n /**\n * Initializes the plugin (called during runner's init)\n */\n init: function init() {\n // this function is mandatory\n },\n /**\n * Installs the plugin (called when the runner bind the plugin)\n */\n install: function install() {\n var testRunner = this.getTestRunner();\n\n // intercepts the `leave` event,\n // then if a message needs to be displayed displays it and waits the user acknowledges it\n testRunner.before('leave', function leave(e, data) {\n const dataIsObject = _.isObject(data);\n if (dataIsObject && data.skipExitMessage) {\n return;\n }\n if (dataIsObject && data.message) {\n return new Promise(function (resolve) {\n var context = testRunner.getTestContext();\n\n // the leave can occurs when the runner is in inconsistent state (i.e. error)\n // prevent side error with item disabling\n if (context && context.itemIdentifier) {\n testRunner.disableItem(context.itemIdentifier);\n }\n // wait for the message acknowledge before leaving the runner\n testRunner.trigger('disablefeedbackalerts').trigger('alert.leave', data.message, function () {\n testRunner.trigger('enablefeedbackalerts');\n resolve();\n });\n });\n }\n });\n }\n });\n\n return exitMessages;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/dialog/itemAlertMessage',['jquery', 'ui/hider', 'taoTests/runner/plugin'], function ($, hider, pluginFactory) { 'use strict';\n\n $ = $ && Object.prototype.hasOwnProperty.call($, 'default') ? $['default'] : $;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2019 (original work) Open Assessment Technologies SA;\n *\n * @author Alexander Zagovorichev \n */\n\n /**\n * Returns the configured plugin\n */\n var itemAlertMessage = pluginFactory({\n name: 'itemAlertMessage',\n /**\n * Initialize the plugin (called during runner's init)\n */\n init: function init() {\n var self = this;\n this.$element = $(this.getContent().dom);\n this.$element\n // for GUI actions\n .on('closed.modal', function () {\n $(this).modal('destroy');\n }).on('destroyed.modal', function () {\n self.$element = null;\n self.trigger('resume', self);\n });\n },\n /**\n * Called during the runner's render phase\n */\n render: function render() {\n var testRunner = this.getTestRunner();\n var itemRunner = testRunner.itemRunner;\n var $modalsContainer = this.getContent().$container;\n if (!$modalsContainer) {\n $modalsContainer = $('#modalFeedbacks', itemRunner._item.container);\n }\n $modalsContainer.append(this.$element);\n this.$element.modal({\n startClosed: false,\n top: 200\n });\n },\n /**\n * Called during the runner's destroy phase\n */\n destroy: function destroy() {\n if (this.$element && this.$element.length) {\n this.$element.modal('close');\n }\n }\n });\n\n return itemAlertMessage;\n\n});\n\n","define('taoQtiTest/runner/helpers/navigation',['lodash', 'taoQtiTest/runner/helpers/map'], function (_, mapHelper) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * @typedef {Object} navigationHelper\n */\n var navigationHelper = {\n /**\n * Check whether the test taker is leaving a section\n *\n * @param {Object} testContext - the actual test context\n * @param {String} testContext.itemIdentifier - the id of the current item\n * @param {String} testContext.sectionId - the id of the current section\n * @param {Object} testMap - the actual test map\n * @param {String} direction - the move direction (next, previous or jump)\n * @param {String} scope - the move scope (item, section, testPart)\n * @param {Number} [position] - the position in case of jump\n * @returns {Boolean} true if the action leads to a section leave\n * @throws {TypeError} if the context or the map are incorrect\n */\n isLeavingSection: function isLeavingSection(testContext, testMap, direction, scope, position) {\n var section;\n var sectionStats;\n var nbItems;\n var item;\n if (_.isPlainObject(testContext) && _.isPlainObject(testMap) && !_.isEmpty(testContext.sectionId) && !_.isEmpty(testContext.itemIdentifier)) {\n section = mapHelper.getSection(testMap, testContext.sectionId);\n sectionStats = mapHelper.getSectionStats(testMap, testContext.sectionId);\n nbItems = sectionStats && sectionStats.total;\n item = mapHelper.getItem(testMap, testContext.itemIdentifier);\n return scope === 'section' || scope === 'testPart' || direction === 'next' && item.positionInSection + 1 === nbItems || direction === 'previous' && item.positionInSection === 0 || direction === 'jump' && position > 0 && (position < section.position || position >= section.position + nbItems);\n }\n throw new TypeError('Invalid test context and test map');\n },\n /**\n * Check whether the test taker is leaving a test part\n *\n * @param {Object} testContext - the actual test context\n * @param {String} testContext.itemIdentifier - the id of the current item\n * @param {String} testContext.sectionId - the id of the current section\n * @param {String} testContext.testPartId - the id of the current testPart\n * @param {Object} testMap - the actual test map\n * @param {String} direction - the move direction (next, previous or jump)\n * @param {String} scope - the move scope (item, section, testPart)\n * @param {Number} [position] - the position in case of jump\n * @returns {Boolean} true if the action leads to a section leave\n * @throws {TypeError} if the context or the map are incorrect\n */\n isLeavingTestPart: function isLeavingTestPart(testContext, testMap, direction, scope, position) {\n var testPart;\n var testPartStats;\n var nbItems;\n var item;\n var section;\n var sectionStats;\n if (_.isPlainObject(testContext) && _.isPlainObject(testMap) && !_.isEmpty(testContext.testPartId) && !_.isEmpty(testContext.sectionId) && !_.isEmpty(testContext.itemIdentifier)) {\n testPart = mapHelper.getPart(testMap, testContext.testPartId);\n testPartStats = mapHelper.getPartStats(testMap, testContext.testPartId);\n nbItems = testPartStats && testPartStats.total;\n item = mapHelper.getItem(testMap, testContext.itemIdentifier);\n if (scope === 'section') {\n section = mapHelper.getSection(testMap, testContext.sectionId);\n sectionStats = mapHelper.getSectionStats(testMap, testContext.sectionId);\n }\n return scope === 'testPart' || direction === 'next' && scope === 'item' && item.positionInPart + 1 === nbItems || direction === 'next' && scope === 'section' && section.position + sectionStats.total >= nbItems || direction === 'previous' && scope === 'item' && item.positionInPart === 0 || direction === 'previous' && scope === 'section' && section.position === testPart.position || direction === 'jump' && position > 0 && (position < testPart.position || position >= testPart.position + nbItems);\n }\n throw new TypeError('Invalid test context and test map');\n },\n /**\n * Check if the given item is the last of the test\n * @param {Object} testMap - the test map\n * @param {String} itemIdentifier - the identifier of the item\n * @returns {Boolean} true if the item is the last one\n */\n isLast: function isLast(testMap, itemIdentifier) {\n return this.isLastOf(testMap, itemIdentifier, 'test');\n },\n /**\n * Check if the given item is the first of a test\n * @param {Object} testMap - the test map\n * @param {String} itemIdentifier - the identifier of the item\n * @returns {Boolean} true if the item is the first one\n */\n isFirst: function isFirst(testMap, itemIdentifier) {\n return this.isFirstOf(testMap, itemIdentifier, 'test');\n },\n /**\n * Check if the given item is the last of a the given scope\n * @param {Object} testMap - the test map\n * @param {String} itemIdentifier - the identifier of the item\n * @param {String} [scope = 'test'] - the target scope\n * @returns {Boolean} true if the item is the last one\n */\n isLastOf: function isLastOf(testMap, itemIdentifier, scope) {\n var item;\n var stats;\n if (!_.isPlainObject(testMap)) {\n throw new TypeError('Invalid test map');\n }\n if (_.isEmpty(itemIdentifier)) {\n throw new TypeError('Invalid item identifier');\n }\n scope = scope || 'test';\n item = mapHelper.getItem(testMap, itemIdentifier);\n stats = mapHelper.getScopeStats(testMap, item.position, scope);\n if (stats && _.isNumber(stats.total)) {\n if (scope === 'test') {\n return item.position + 1 === stats.total;\n }\n if (scope === 'section' || scope === 'assessmentSection' || scope === 'testSection') {\n return item.positionInSection + 1 === stats.total;\n }\n if (scope === 'part' || scope === 'testPart') {\n return item.positionInPart + 1 === stats.total;\n }\n }\n return false;\n },\n /**\n * Check if the given item is the first of a the given scope\n * @param {Object} testMap - the test map\n * @param {String} itemIdentifier - the identifier of the item\n * @param {String} [scope = 'test'] - the target scope\n * @returns {Boolean} true if the item is the first one\n */\n isFirstOf: function isFirstOf(testMap, itemIdentifier, scope) {\n var item;\n if (!_.isPlainObject(testMap)) {\n throw new TypeError('Invalid test map');\n }\n if (_.isEmpty(itemIdentifier)) {\n throw new TypeError('Invalid item identifier');\n }\n scope = scope || 'test';\n item = mapHelper.getItem(testMap, itemIdentifier);\n if (scope === 'test') {\n return item.position === 0;\n }\n if (scope === 'section' || scope === 'assessmentSection' || scope === 'testSection') {\n return item.positionInSection === 0;\n }\n if (scope === 'part' || scope === 'testPart') {\n return item.positionInPart === 0;\n }\n return false;\n },\n /**\n * Gets the map descriptors of the sibling items\n * @param {Object} testMap\n * @param {Number|String} itemPosition - (could be also the item id)\n * @param {String} [direction='both'] - previous/next/both\n * @param {Number} [size=3] - will be 2xsize if direction is both\n * @returns {Object[]} the collections of items\n */\n getSiblingItems: function getSiblingItems(testMap, itemPosition, direction, size) {\n var itemId = mapHelper.getItemIdentifier(testMap, itemPosition);\n var previous = null;\n var siblings = [];\n var directions;\n var itemChain = _.reduce(testMap && testMap.jumps, function (map, jump) {\n var ref = jump.identifier;\n if (previous) {\n map[previous].next = ref;\n }\n map[ref] = {\n identifier: ref,\n previous: previous,\n next: null\n };\n previous = ref;\n return map;\n }, {});\n size = _.isFinite(size) ? parseInt(size, 10) : 3;\n if (!direction || direction === 'both') {\n directions = ['previous', 'next'];\n } else {\n directions = [direction];\n }\n _.forEach(directions, function walkDirection(link) {\n var id = itemId;\n _.times(size, function getNeighbor() {\n id = itemChain[id] && itemChain[id][link];\n if (id) {\n siblings.push(mapHelper.getItem(testMap, id));\n } else {\n return false;\n }\n });\n });\n return siblings;\n },\n /**\n * Gets the map descriptor of the next item\n * @param {Object} testMap\n * @param {Number|String} itemPosition - (could be also the item id)\n * @returns {Object}\n */\n getNextItem: function getNextItem(testMap, itemPosition) {\n var siblings = navigationHelper.getSiblingItems(testMap, itemPosition, 'next', 1);\n if (siblings.length) {\n return siblings[0];\n }\n return null;\n },\n /**\n * Gets the map descriptor of the previous item\n * @param {Object} testMap\n * @param {Number|String} itemPosition - (could be also the item id)\n * @returns {Object}\n */\n getPreviousItem: function getPreviousItem(testMap, itemPosition) {\n var siblings = navigationHelper.getSiblingItems(testMap, itemPosition, 'previous', 1);\n if (siblings.length) {\n return siblings[0];\n }\n return null;\n },\n /**\n * Checks if an action will move forward.\n * @param {String} action - the name of the action that will be performed\n * @param {Object} [params] - some optional parameters that apply to the action\n * @returns {Boolean}\n */\n isMovingToNextItem: function isMovingToNextItem(action, params) {\n params = params || {};\n return action === 'timeout' || action === 'skip' || action === 'move' && params.direction === 'next' && params.scope === 'item';\n },\n /**\n * Checks if an action will move backward.\n * @param {String} action - the name of the action that will be performed\n * @param {Object} [params] - some optional parameters that apply to the action\n * @returns {Boolean}\n */\n isMovingToPreviousItem: function isMovingToPreviousItem(action, params) {\n params = params || {};\n return action === 'move' && params.direction === 'previous' && params.scope === 'item';\n },\n /**\n * Checks if an action will jump on another item.\n * @param {String} action - the name of the action that will be performed\n * @param {Object} [params] - some optional parameters that apply to the action\n * @returns {Boolean}\n */\n isJumpingToItem: function isJumpingToItem(action, params) {\n params = params || {};\n return action === 'move' && params.direction === 'jump' && params.scope === 'item';\n }\n };\n\n return navigationHelper;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/dialog/itemInlineMessage',['jquery', 'i18n', 'ui/hider', 'taoTests/runner/plugin', 'handlebars', 'lib/handlebars/helpers', 'taoQtiTest/runner/helpers/navigation'], function ($$1, __, hider, pluginFactory, Handlebars, Helpers0, navigationHelper) { 'use strict';\n\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n navigationHelper = navigationHelper && Object.prototype.hasOwnProperty.call(navigationHelper, 'default') ? navigationHelper['default'] : navigationHelper;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, functionType=\"function\", escapeExpression=this.escapeExpression, self=this;\n\n function program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \" \";\n if (helper = helpers.className) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.className); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1);\n return buffer;\n }\n\n function program3(depth0,data) {\n \n var buffer = \"\", stack1;\n buffer += \"\\n aria-\"\n + escapeExpression(((stack1 = (data == null || data === false ? data : data.key)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1))\n + \"=\\\"\"\n + escapeExpression((typeof depth0 === functionType ? depth0.apply(depth0) : depth0))\n + \"\\\"\\n \";\n return buffer;\n }\n\n function program5(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\";\n return buffer;\n }\n function program6(depth0,data) {\n \n \n return \" no-label\";\n }\n\n function program8(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\";\n if (helper = helpers.text) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.text); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\";\n return buffer;\n }\n\n buffer += \"\\n \\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.icon), {hash:{},inverse:self.noop,fn:self.program(5, program5, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.text), {hash:{},inverse:self.noop,fn:self.program(8, program8, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \\n\\n\";\n return buffer;\n });\n function buttonTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA;\n *\n * @author Alexander Zagovorichev \n */\n\n /**\n * The display of the next button\n */\n var buttonData = {\n next: {\n control: 'move-forward',\n title: __('Submit and go to the next item'),\n icon: 'forward',\n text: __('OK')\n },\n end: {\n control: 'move-end',\n title: __('Submit and go to the end of the test'),\n icon: 'fast-forward',\n text: __('OK & End test')\n }\n };\n\n /**\n * Returns the configured plugin\n */\n var itemInlineMessage = pluginFactory({\n name: 'itemInlineMessage',\n /**\n * Initialize the plugin (called during runner's init)\n */\n init: function init() {\n var self = this;\n var testRunner = this.getTestRunner();\n\n /**\n * Create the button based on the current context\n * @returns {*|jQuery|HTMLElement} the button\n */\n var createOkButton = function createElement() {\n const testContext = testRunner.getTestContext();\n const testMap = testRunner.getTestMap();\n const dataType = navigationHelper.isLast(testMap, testContext.itemIdentifier) ? 'end' : 'next';\n const $btn = $$1(buttonTpl(buttonData[dataType]));\n $btn.addClass('modalFeedback-button');\n\n //plugin behavior\n $btn.on('click', function (e) {\n e.preventDefault();\n self.disable();\n if ($$1(this).data('control') === 'move-end') {\n self.trigger('end');\n }\n $btn.remove();\n self.$element.remove();\n self.trigger('resume', self);\n });\n return $btn;\n };\n this.$button = createOkButton();\n this.$element = $$1(this.getContent().dom);\n },\n /**\n * Called during the runner's render phase\n */\n render: function render() {\n var $navigationContainer = this.getAreaBroker().getNavigationArea();\n var testRunner = this.getTestRunner();\n var itemRunner = testRunner.itemRunner;\n var $inlineContainer = this.getContent().$container;\n if (!$inlineContainer && itemRunner._item.container) {\n $inlineContainer = $$1('.qti-itemBody', itemRunner._item.container);\n }\n $inlineContainer.append(this.$element);\n\n // hide all navigation buttons, create new instead of\n if (!$$1('.modalFeedback-button', $navigationContainer).length) {\n $navigationContainer.append(this.$button);\n }\n },\n /**\n * Enable the button\n */\n enable: function enable() {\n this.$button.removeProp('disabled').removeClass('disabled');\n },\n disable: function disable() {\n this.$button.prop('disabled', true).addClass('disabled');\n },\n /**\n * Called during the runner's destroy phase\n */\n destroy: function destroy() {\n this.$button.click();\n }\n });\n\n return itemInlineMessage;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/feedback/feedback',['i18n', 'taoTests/runner/plugin', 'ui/feedback'], function (__, pluginFactory, feedback$1) { 'use strict';\n\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n feedback$1 = feedback$1 && Object.prototype.hasOwnProperty.call(feedback$1, 'default') ? feedback$1['default'] : feedback$1;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Returns the configured plugin\n */\n var feedback = pluginFactory({\n name: 'feedback',\n /**\n * Initialize the plugin (called during runner's init)\n */\n init: function init() {\n var self = this;\n\n //keep a ref of the feedbacks\n var currentFeedback;\n var testRunner = this.getTestRunner();\n\n /**\n * Close the current feedback\n */\n var closeCurrent = function closeCurrent() {\n if (currentFeedback) {\n currentFeedback.close();\n }\n };\n this.setState('enabled', true);\n\n //change plugin state\n testRunner.on('error', function (err) {\n var message = err;\n var type = 'error';\n if (self.getState('enabled')) {\n if ('object' === typeof err) {\n message = err.message;\n type = err.type;\n }\n if (!message) {\n switch (type) {\n case 'TestState':\n message = __('The test has been closed/suspended!');\n break;\n case 'FileNotFound':\n message = __('File not found!');\n break;\n default:\n message = __('An error occurred!');\n }\n }\n currentFeedback = feedback$1().error(message);\n }\n }).on('danger', function (message) {\n if (self.getState('enabled')) {\n currentFeedback = feedback$1().danger(message);\n }\n }).on('warning', function (message) {\n if (self.getState('enabled')) {\n currentFeedback = feedback$1().warning(message);\n }\n }).on('info', function (message) {\n if (self.getState('enabled')) {\n currentFeedback = feedback$1().info(message);\n }\n }).on('alert.* confirm.* unloaditem', closeCurrent).on('disablefeedbackalerts', function () {\n closeCurrent();\n self.setState('enabled', false);\n }).on('enablefeedbackalerts', function () {\n self.setState('enabled', true);\n });\n }\n });\n\n return feedback;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/itemScrolling/itemScrolling',['jquery', 'util/typeCaster', 'taoTests/runner/plugin'], function ($, typeCaster, pluginFactory) { 'use strict';\n\n $ = $ && Object.prototype.hasOwnProperty.call($, 'default') ? $['default'] : $;\n typeCaster = typeCaster && Object.prototype.hasOwnProperty.call(typeCaster, 'default') ? typeCaster['default'] : typeCaster;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 (original work) Open Assessment Technologies SA;\n */\n\n /**\n * Creates the loading bar plugin.\n * Displays a loading bar when a blocking task is running\n */\n var itemScrolling = pluginFactory({\n name: 'itemScrolling',\n /**\n * Initializes the plugin (called during runner's init)\n */\n init: function init() {\n const testRunner = this.getTestRunner();\n const $contentArea = testRunner.getAreaBroker().getContentArea();\n const gridRowBottomMargin = 12,\n qtiItemPadding = 30 * 2;\n testRunner.on('renderitem', function () {\n adaptItemHeight();\n $(window).off('resize.adaptItemHeight');\n $(window).on('resize.adaptItemHeight', adaptItemHeight);\n });\n function adaptItemHeight() {\n const $itemContainer = $contentArea.find('[data-scrolling=\"true\"]');\n const contentHeight = getItemRunnerHeight() - getExtraGridRowHeight() - getSpaceAboveQtiContent() - gridRowBottomMargin - qtiItemPadding;\n $itemContainer.each(function () {\n const $item = $(this);\n const isScrollable = typeCaster.strToBool($item.attr('data-scrolling') || 'false');\n const selectedHeight = parseFloat($item.attr('data-scrolling-height')) || 100;\n const containerParent = $item.parent().closest('[data-scrolling=\"true\"]');\n if ($item.length && isScrollable) {\n $item.data('scrollable', true);\n $item.css({\n 'overflow-y': 'scroll'\n });\n if (containerParent.length > 0) {\n $item.css('max-height', `${containerParent.height() * (selectedHeight * 0.01)}px`);\n } else {\n $item.css('max-height', `${contentHeight * (selectedHeight * 0.01)}px`);\n }\n }\n });\n }\n\n // depending on the context (item preview, new/old test runner...) available height is computed differently\n function getItemRunnerHeight() {\n var $testRunnerSections = $('.test-runner-sections');\n\n // exists only in the new test runner\n if ($testRunnerSections.length) {\n return $testRunnerSections.get(0).getBoundingClientRect().height;\n }\n // otherwise, we assume that we are in an iframe with all space available (= item preview, old test runner)\n return $(window).height();\n }\n\n // extra grid row are there in case of a vertical layout (item on top/bottom of the question)\n function getExtraGridRowHeight() {\n var $gridRows = $('.qti-itemBody > .grid-row'),\n extraHeight = 0;\n $gridRows.each(function () {\n var $gridRow = $(this),\n $itemContainer = $gridRow.find('[data-scrolling=\"true\"]');\n if (!$itemContainer.length) {\n extraHeight += $gridRow.outerHeight(true);\n }\n });\n return extraHeight;\n }\n\n // most of the time this will be rubrick's block height in the new test runner\n function getSpaceAboveQtiContent() {\n var $testRunnerSections = $('.test-runner-sections'),\n $qtiContent = $('#qti-content');\n if ($testRunnerSections.length && $qtiContent.length) {\n return $qtiContent.get(0).getBoundingClientRect().top - $testRunnerSections.get(0).getBoundingClientRect().top;\n }\n return 0;\n }\n }\n });\n\n return itemScrolling;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/loading/loading',['layout/loading-bar', 'taoTests/runner/plugin'], function (loadingBar, pluginFactory) { 'use strict';\n\n loadingBar = loadingBar && Object.prototype.hasOwnProperty.call(loadingBar, 'default') ? loadingBar['default'] : loadingBar;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Creates the loading bar plugin.\n * Displays a loading bar when a blocking task is running\n */\n var loading = pluginFactory({\n name: 'loading',\n /**\n * Initializes the plugin (called during runner's init)\n */\n init: function init() {\n var testRunner = this.getTestRunner();\n testRunner.on('unloaditem', function () {\n loadingBar.start();\n }).on('renderitem', function () {\n loadingBar.stop();\n });\n }\n });\n\n return loading;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/modalFeedback/modalFeedback',['jquery', 'lodash', 'module', 'taoTests/runner/plugin', 'taoQtiTest/runner/plugins/content/dialog/itemInlineMessage', 'taoQtiTest/runner/plugins/content/dialog/itemAlertMessage', 'ui/autoscroll'], function ($, _, module, pluginFactory, inlineMessage, alertMessage, autoscroll) { 'use strict';\n\n $ = $ && Object.prototype.hasOwnProperty.call($, 'default') ? $['default'] : $;\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n module = module && Object.prototype.hasOwnProperty.call(module, 'default') ? module['default'] : module;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n inlineMessage = inlineMessage && Object.prototype.hasOwnProperty.call(inlineMessage, 'default') ? inlineMessage['default'] : inlineMessage;\n alertMessage = alertMessage && Object.prototype.hasOwnProperty.call(alertMessage, 'default') ? alertMessage['default'] : alertMessage;\n autoscroll = autoscroll && Object.prototype.hasOwnProperty.call(autoscroll, 'default') ? autoscroll['default'] : autoscroll;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA;\n *\n * @author Alexander Zagovorichev \n */\n\n /**\n * Modal or inline type of the messages\n */\n var inlineMode;\n\n /**\n * Form of the feedback\n * by default dialog (modal) form\n */\n var messagePlugin;\n\n /**\n * All feedback messages\n */\n var renderedFeedbacks;\n\n /**\n * modalFeedback was resolved and all components were destroyed\n */\n var isDestroyed;\n\n /**\n * Method which should be halted after modalFeedbacks confirmation action\n */\n var nextStep;\n function destroyFeedback(feedback) {\n var removed = false;\n _.remove(renderedFeedbacks, function (storedFeedback) {\n var found = storedFeedback === feedback;\n if (found) {\n removed = true;\n }\n return found;\n });\n if (removed) {\n feedback.destroy();\n if (!renderedFeedbacks.length) {\n nextStep();\n }\n }\n }\n function defineMode(inline) {\n inlineMode = inline;\n messagePlugin = inlineMode ? inlineMessage : alertMessage;\n }\n\n /**\n * Returns the configured plugin\n */\n var modalFeedback = pluginFactory({\n name: 'QtiModalFeedback',\n /**\n * Initialize the plugin (called during runner's init)\n */\n init: function init() {\n nextStep = function () {};\n defineMode(!!module.config().inlineModalFeedback);\n },\n /**\n * Called during the runner's render phase\n */\n render: function render() {\n var self = this;\n var testRunner = this.getTestRunner();\n var createMessages = function createMessages(renderingQueue, inline) {\n var bInlineMode = inlineMode;\n isDestroyed = false;\n renderedFeedbacks = [];\n if (_.isBoolean(inline)) {\n defineMode(inline);\n }\n if (renderingQueue.length) {\n _.forEach(renderingQueue, function (renderingToken) {\n var feedback = messagePlugin(testRunner, testRunner.getAreaBroker());\n feedback.init({\n dom: renderingToken.feedback.render({\n inline: inlineMode\n }),\n // for alerts will be used #modalMessages container\n $container: inlineMode ? renderingToken.$container : null\n });\n feedback.render();\n renderedFeedbacks.push(feedback);\n });\n\n // auto scroll to the first feedback, only for the \"inline\" mode\n if (inlineMode && renderedFeedbacks) {\n autoscroll($('.qti-modalFeedback', testRunner.getAreaBroker().getContentArea()).first(), testRunner.getAreaBroker().getContentArea().parents('.content-wrapper'));\n }\n } else {\n nextStep();\n }\n\n // restore global feedback mode\n defineMode(bInlineMode);\n };\n if (inlineMode) {\n testRunner.off('plugin-resume.itemInlineMessage').on('plugin-resume.itemInlineMessage', function () {\n self.destroy();\n });\n } else {\n testRunner.off('plugin-resume.itemAlertMessage').on('plugin-resume.itemAlertMessage', function (feedback) {\n destroyFeedback(feedback);\n });\n }\n testRunner.on('modalFeedbacks', function (renderingQueue, done, inline) {\n nextStep = done;\n createMessages(renderingQueue, inline);\n });\n },\n /**\n * Called during the runner's destroy phase\n * allow to run that function only once\n */\n destroy: function destroy() {\n var tFeedbacks, i;\n if (!isDestroyed) {\n isDestroyed = true;\n if (!renderedFeedbacks) {\n nextStep();\n } else {\n tFeedbacks = renderedFeedbacks.slice(0);\n for (i in tFeedbacks) {\n destroyFeedback(tFeedbacks[i]);\n }\n }\n }\n }\n });\n\n return modalFeedback;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/overlay/overlay',['jquery', 'taoTests/runner/plugin'], function ($, pluginFactory) { 'use strict';\n\n $ = $ && Object.prototype.hasOwnProperty.call($, 'default') ? $['default'] : $;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Returns the configured plugin\n */\n var overlay = pluginFactory({\n name: 'overlay',\n /**\n * Initialize the plugin (called during runner's init)\n */\n init: function init() {\n var self = this;\n var testRunner = this.getTestRunner();\n this.$element = $('
          ');\n this.$element.on('click mousedown mouseup touchstart touchend keyup keydow keypress scroll drop', function (e) {\n e.stopImmediatePropagation();\n e.stopPropagation();\n });\n const shield = function shield() {\n self.enable();\n };\n const unshield = function unshield() {\n self.disable();\n };\n\n //change plugin state\n testRunner.on('disableitem', shield).on('enableitem unloaditem modalFeedbacks', unshield);\n },\n /**\n * Called during the runner's render phase\n */\n render: function render() {\n var $contentArea = this.getTestRunner().getAreaBroker().getContentArea();\n $contentArea.after(this.$element);\n },\n /**\n * Called during the runner's destroy phase\n */\n destroy: function destroy() {\n this.$element.remove();\n },\n /**\n * Enable the overlay\n */\n enable() {\n const overlayConfig = this.getConfig();\n this.$element.addClass('overlay');\n if (overlayConfig.full) {\n this.$element.addClass('overlay-full');\n }\n },\n /**\n * Disable the overlay\n */\n disable: function disable() {\n this.$element.removeClass('overlay overlay-full');\n },\n /**\n * Show the overlay\n */\n show: function show() {\n this.enable();\n },\n /**\n * Hide the overlay\n */\n hide: function hide() {\n this.disable();\n }\n });\n\n return overlay;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/responsiveness/collapser',['lodash', 'jquery', 'taoTests/runner/plugin'], function (_, $, pluginFactory) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n $ = $ && Object.prototype.hasOwnProperty.call($, 'default') ? $['default'] : $;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Event namespace\n * @type {String}\n */\n var ns = '.collapser';\n\n /**\n * Name of the CSS class used to collapse the buttons\n * @type {String}\n */\n var noLabelCls = 'tool-label-collapsed';\n\n /**\n * Name of the CSS class used to collapse the buttons and allow to expand on mouse over\n * @type {String}\n */\n var noLabelHoverCls = 'tool-label-collapsed-hover';\n\n /**\n * Name of the CSS class used to hide the label of the button independently of responsiveness\n * @type {string}\n */\n var labelHiddenCls = 'no-tool-label';\n\n /**\n * Name of the CSS class for separators\n * @type {string}\n */\n var separatorCls = 'separator';\n\n /**\n * Default plugin options\n * @type {Object}\n */\n var defaults = {\n collapseTools: true,\n // collapse the tools buttons\n collapseNavigation: false,\n // collapse the navigation buttons\n collapseInOrder: false,\n // collapse any button in the given order\n hover: false,\n // expand when the mouse is over a button,\n\n /**\n * Allow to set manually which buttons should collapse and in which order.\n * This can be set by triggering the \"collapser-set-order\" event on the testRunner.\n * Given as an array of jQuery selectors: first index will be the first to be collapsed, and so on.\n * If no selector is given for a button, then this one will never collapse.\n * ex:\n * var collapseOrder = [\n * '[data-control=\"highlight-clear\"],[data-control=\"highlight-trigger\"]', // those will collapse first...\n * '[data-control=\"hide-review\"]', // this one second...\n * '[data-control=\"set-item-flag\"]', // third...\n * ... // ...\n * ];\n * @type {String[]}\n */\n collapseOrder: []\n };\n var $window = $(window);\n\n /**\n * Creates the responsiveness collapser plugin.\n * Reduce the size of the action bar tools when the available space is below the needed one.\n */\n var collapser = pluginFactory({\n name: 'collapser',\n /**\n * Installs the plugin (called when the runner bind the plugin)\n */\n init: function init() {\n const testRunner = this.getTestRunner();\n const config = Object.assign({}, defaults, this.getConfig());\n const collapseCls = config.hover ? noLabelHoverCls : noLabelCls;\n var areaBroker = testRunner.getAreaBroker();\n var $actionsBar = areaBroker.getArea('actionsBar'),\n $toolbox = areaBroker.getToolboxArea(),\n $navigation = areaBroker.getNavigationArea();\n var allCollapsibles, availableWidth, previousAvailableWidth;\n\n /**\n * Get a reference of all collapsibles\n */\n function buildCollapsiblesList() {\n // use the given order to build the collapsibles list or generate on in natural order\n if (config.collapseInOrder && config.collapseOrder.length) {\n allCollapsibles = getCollapsiblesFromConfig();\n }\n // get values from DOM, grouped by prefix\n else if (config.collapseInOrder) {\n allCollapsibles = getSortedCollapsiblesFromDom();\n }\n // get all in one chunk\n else {\n allCollapsibles = getUnsortedCollapsiblesFromDom();\n }\n }\n\n /**\n * @param {jQuery} $element\n * @returns {number} Size difference, in pixels, between collapsed and expanded state of $element\n */\n function getExtraWidth($element) {\n var expandedWidth, collapsedWidth;\n $element.removeClass(collapseCls);\n expandedWidth = $element.outerWidth(true);\n $element.addClass(collapseCls);\n collapsedWidth = $element.outerWidth(true);\n $element.removeClass(collapseCls);\n return expandedWidth - collapsedWidth;\n }\n\n /**\n * Expand or collapse elements\n */\n function toggleCollapsibles() {\n availableWidth = getAvailableWidth();\n availableWidth < previousAvailableWidth ? collapseInOrder() : expandInOrder();\n previousAvailableWidth = availableWidth;\n }\n function collapseInOrder() {\n var collapsiblesCopy = _.clone(allCollapsibles),\n toCollapse;\n while (collapseNeeded() && collapsiblesCopy.length) {\n toCollapse = collapsiblesCopy.shift();\n toCollapse.$elements.addClass(collapseCls);\n }\n }\n function collapseNeeded() {\n return getToolbarWidth() > getAvailableWidth();\n }\n function expandInOrder() {\n _.forEachRight(allCollapsibles, function (toExpand) {\n if (toExpand.$elements.hasClass(collapseCls)) {\n if (expandPossible(toExpand.extraWidth)) {\n toExpand.$elements.removeClass(collapseCls);\n } else {\n return false;\n }\n }\n });\n }\n function expandPossible(extraWidth) {\n return getToolbarWidth() + extraWidth < getAvailableWidth();\n }\n function getAvailableWidth() {\n // Scrollbars are commonly between ~12px and ~18px in width. Subtracting 20px from the available width\n // makes sure that scrollbars are always taken in account. The worst case scenario is that the buttons\n // start to collapse, although they would still have had 20px available.\n return $actionsBar.width() - 20;\n }\n function getToolbarWidth() {\n return $toolbox.outerWidth(true) + $navigation.outerWidth(true);\n }\n\n /**\n * Parse DOM for controls that can be collapsed\n * @returns {*|jQuery|HTMLElement}\n */\n function getControlsFromDom() {\n var $controls = $(),\n selector = '>ul>[data-control]';\n if (config.collapseTools) {\n $controls = $controls.add($toolbox.find(selector).not(`.${labelHiddenCls}`).not(`.${separatorCls}`));\n }\n if (config.collapseNavigation) {\n $controls = $controls.add($navigation.find(selector).not(`.${labelHiddenCls}`).not(`.${separatorCls}`));\n }\n return $controls;\n }\n\n /**\n * Get allCollapsibles based on configuration\n *\n * @returns {Array}\n */\n function getCollapsiblesFromConfig() {\n return _.compact(config.collapseOrder.map(function (selector) {\n // some buttons are collapsed by configuration, some other are only separators: we should leave them alone\n var $elements = $(selector).not(`.${labelHiddenCls}`).not(`.${separatorCls}`);\n var extraWidth = 0;\n if ($elements.length) {\n $elements.each(function () {\n extraWidth += getExtraWidth($(this));\n });\n return {\n $elements: $elements,\n extraWidth: extraWidth\n };\n }\n return false;\n }));\n }\n\n /**\n * Get allCollapsibles based on DOM\n * Build the collapse order from the left to the right, related elements are grouped.\n *\n * @returns {Array}\n */\n function getSortedCollapsiblesFromDom() {\n var $controlElements = getControlsFromDom(),\n _allCollapsibles = [],\n order = {};\n\n // group items by prefix\n // eg. zoomIn and zoomOut -> zoom\n $controlElements.each(function () {\n var ctrl = this.dataset.control,\n // re makes group `foo` from `foo-bar`, `fooBar` and `foo_bar`\n // if we do not have a prefix use the control name as key to ensure uniqueness\n key = ctrl.substring(0, ctrl.search(/[A-Z-_]/)) || ctrl;\n order[key] = order[key] || $();\n order[key] = order[key].add($(this));\n });\n\n // move items to allCollapsibles\n _.forOwn(order, function ($elements) {\n var extraWidth = 0;\n $elements.each(function () {\n extraWidth += getExtraWidth($(this));\n });\n _allCollapsibles.push({\n $elements: $elements,\n extraWidth: extraWidth\n });\n });\n return _.compact(_allCollapsibles);\n }\n\n /**\n * Get allCollapsibles based on DOM, all buttons will be collapsed at once\n *\n * @returns {Array}\n */\n function getUnsortedCollapsiblesFromDom() {\n var $elements = getControlsFromDom(),\n _allCollapsibles = [],\n extraWidth = 0;\n $elements.each(function () {\n extraWidth += getExtraWidth($(this));\n });\n _allCollapsibles.push({\n $elements: $elements,\n extraWidth: extraWidth\n });\n return _.compact(_allCollapsibles);\n }\n $window.on(`resize${ns}`, _.throttle(function () {\n testRunner.trigger('collapseTools');\n }, 40));\n testRunner.after('renderitem loaditem', function () {\n previousAvailableWidth = Infinity;\n buildCollapsiblesList();\n testRunner.trigger('collapseTools');\n }).on(`collapseTools${ns}`, function () {\n toggleCollapsibles();\n });\n },\n destroy: function destroy() {\n $window.off(ns);\n }\n });\n\n return collapser;\n\n});\n\n","define('taoQtiTest/runner/plugins/content/rubricBlock/rubricBlock',['jquery', 'ui/hider', 'taoTests/runner/plugin', 'handlebars', 'lib/handlebars/helpers'], function ($$1, hider, pluginFactory, Handlebars, Helpers0) { 'use strict';\n\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n hider = hider && Object.prototype.hasOwnProperty.call(hider, 'default') ? hider['default'] : hider;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); \n\n\n return \"
          \\n\";\n });\n function containerTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Ensure the links opens to blank pages\n * @param {jQueryElement} $container - lookup scope\n */\n var blankifyLinks = function blankifyLinks($container) {\n $$1('a', $container).attr('target', '_blank');\n };\n\n /**\n * Apply mathjax\n */\n var mathify = function mathify($container) {\n return new Promise(function (resolve) {\n if ($$1('math', $container).length > 0) {\n //load mathjax only if necessary\n require(['mathJax'], function (MathJax) {\n if (MathJax) {\n MathJax.Hub.Queue(['Typeset', MathJax.Hub], $container[0]);\n MathJax.Hub.Queue(resolve);\n } else {\n resolve();\n }\n }, resolve);\n } else {\n resolve();\n }\n });\n };\n\n /**\n * Returns the configured plugin\n */\n var rubricBlock = pluginFactory({\n name: 'rubricBlock',\n /**\n * Initialize the plugin (called during runner's init)\n */\n init: function init() {\n var self = this;\n var testRunner = this.getTestRunner();\n this.$element = $$1(containerTpl());\n this.hide();\n\n //change plugin state\n testRunner.on('ready', function () {\n self.hide();\n }).on('loaditem', function () {\n var context = testRunner.getTestContext();\n if (context.rubrics) {\n self.$element.html(context.rubrics);\n blankifyLinks(self.$element);\n mathify(self.$element).then(function () {\n // notify that the rubric blocks are loaded\n testRunner.trigger('rubricblock');\n });\n }\n }).on('renderitem', function () {\n self.show();\n }).on('unloaditem', function () {\n self.hide();\n self.$element.empty();\n });\n },\n /**\n * Called during the runner's render phase\n */\n render: function render() {\n //attach the element before the content area\n var $container = this.getAreaBroker().getContentArea();\n $container.before(this.$element);\n },\n /**\n * Called during the runner's destroy phase\n */\n destroy: function destroy() {\n this.$element.remove();\n },\n /**\n * Enable the container\n */\n enable: function enable() {\n this.$element.removeProp('disabled').removeClass('disabled');\n },\n /**\n * Disable the container\n */\n disable: function disable() {\n this.$element.prop('disabled', true).addClass('disabled');\n },\n /**\n * Show the container\n */\n show: function show() {\n hider.show(this.$element);\n },\n /**\n * Hide the container\n */\n hide: function hide() {\n hider.hide(this.$element);\n }\n });\n\n return rubricBlock;\n\n});\n\n","define('taoQtiTest/runner/plugins/controls/connectivity/connectivity',['jquery', 'lodash', 'i18n', 'core/polling', 'ui/waitingDialog/waitingDialog', 'taoTests/runner/plugin', 'handlebars', 'lib/handlebars/helpers', 'util/namespace'], function ($$1, _, __, pollingFactory, waitingDialog, pluginFactory, Handlebars, Helpers0, namespaceHelper) { 'use strict';\n\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n pollingFactory = pollingFactory && Object.prototype.hasOwnProperty.call(pollingFactory, 'default') ? pollingFactory['default'] : pollingFactory;\n waitingDialog = waitingDialog && Object.prototype.hasOwnProperty.call(waitingDialog, 'default') ? waitingDialog['default'] : waitingDialog;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n namespaceHelper = namespaceHelper && Object.prototype.hasOwnProperty.call(namespaceHelper, 'default') ? namespaceHelper['default'] : namespaceHelper;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, options, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, functionType=\"function\", self=this;\n\n function program1(depth0,data) {\n \n \n return \" with-message\";\n }\n\n function program3(depth0,data) {\n \n var buffer = \"\", helper, options;\n buffer += \"\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Online\", options) : helperMissing.call(depth0, \"__\", \"Online\", options)))\n + \"\";\n return buffer;\n }\n\n function program5(depth0,data) {\n \n var buffer = \"\", helper, options;\n buffer += \"\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Offline\", options) : helperMissing.call(depth0, \"__\", \"Offline\", options)))\n + \"\";\n return buffer;\n }\n\n buffer += \"
          \\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.message), {hash:{},inverse:self.noop,fn:self.program(3, program3, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.message), {hash:{},inverse:self.noop,fn:self.program(5, program5, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n
          \\n\";\n return buffer;\n });\n function connectivityTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2021 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * The plugin default configuration\n * @type {Object}\n * @property {Number} checkInterval - when offline, interval to check if we're back online\n * @property {Boolean} indicator - do we display the indicator in the test UI\n * @property {Boolean} message - do we display the message in the test UI\n */\n var defaultConfig = {\n checkInterval: 30 * 1000,\n indicator: true,\n message: false\n };\n\n /**\n * Creates the connectivity plugin.\n * Detects connectivity issues\n */\n var connectivity = pluginFactory({\n name: 'connectivity',\n /**\n * Initializes the plugin (called during runner's init)\n */\n init: function init() {\n var self = this;\n var testRunner = this.getTestRunner();\n var proxy = testRunner.getProxy();\n var config = Object.assign({}, defaultConfig, this.getConfig());\n\n //Displays a connectivity indicator\n if (config && config.indicator) {\n //create the indicator\n this.$element = $$1(connectivityTpl({\n state: proxy.isOnline() ? 'connected' : 'disconnected',\n message: config.message\n }));\n testRunner.on('disconnect', function () {\n self.$element.removeClass('connected').addClass('disconnected');\n }).on('reconnect', function () {\n self.$element.removeClass('disconnected').addClass('connected');\n });\n }\n\n //update the interval, with the new value\n if (this.polling && _.isNumber(config.checkInterval)) {\n this.polling.setInterval(config.checkInterval);\n }\n },\n /**\n * Installs the plugin (called when the runner bind the plugin)\n * We do it before init to catch even offline during the init sequence\n */\n install: function install() {\n var self = this;\n var waiting = false;\n var testRunner = this.getTestRunner();\n var proxy = testRunner.getProxy();\n\n /**\n * Display the waiting dialog, while waiting the connection to be back\n * @param {String} [messsage] - additional message for the dialog\n * @returns {Promise} resolves once the wait is over and the user click on 'proceed'\n */\n this.displayWaitingDialog = function displayWaitingDialog() {\n let message = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var dialog;\n return new Promise(function (resolve) {\n if (!waiting) {\n waiting = true;\n\n //if a pause event occurs while waiting,\n //we also wait the connection to be back\n testRunner.before('pause.waiting', function () {\n return new Promise(function (pauseResolve) {\n proxy.off('reconnect.pausing').after('reconnect.pausing', pauseResolve);\n });\n });\n\n //creates the waiting modal dialog\n dialog = waitingDialog({\n message: __('You are encountering a prolonged connectivity loss. ') + message,\n waitContent: __('Please wait while we try to restore the connection.'),\n proceedContent: __('The connection seems to be back, please proceed')\n }).on('proceed', function () {\n resolve();\n }).on('render', function () {\n proxy.off('reconnect.waiting').after('reconnect.waiting', function () {\n testRunner.off('pause.waiting');\n waiting = false;\n dialog.endWait();\n });\n });\n }\n });\n };\n\n //Last chance to check the connection,\n //by regular polling on the \"up\" signal\n this.polling = pollingFactory({\n action: function action() {\n testRunner.getProxy().telemetry(testRunner.getTestContext().itemIdentifier, 'up').catch(_.noop);\n },\n interval: defaultConfig.checkInterval,\n autoStart: false\n });\n\n //the Proxy is the only one to know something about connectivity\n proxy.on('disconnect', function disconnect(source) {\n if (!testRunner.getState('disconnected')) {\n testRunner.setState('disconnected', true);\n testRunner.trigger('disconnect', source);\n self.polling.start();\n }\n }).on('reconnect', function reconnect() {\n if (testRunner.getState('disconnected')) {\n testRunner.setState('disconnected', false);\n testRunner.trigger('reconnect');\n self.polling.stop();\n }\n });\n\n //intercept tries to leave while offline\n //this could be caused by pauses for example.\n //If caused by an action like exitTest it will be handled\n //by navigation errors (see below)\n testRunner.before('leave', function (e, data) {\n if (proxy.isOffline()) {\n self.displayWaitingDialog(data.message).then(function () {\n testRunner.trigger('leave', data);\n }).catch(function (generalErr) {\n testRunner.trigger('error', generalErr);\n });\n return false;\n }\n });\n\n //intercept offline navigation errors\n testRunner.before('error.connectivity', function (e, err) {\n // detect and prevent connectivity errors\n if (proxy.isConnectivityError(err)) {\n return false;\n }\n if (proxy.isOffline()) {\n self.displayWaitingDialog().then(function () {\n if (err.type === 'nav') {\n testRunner.loadItem(testRunner.getTestContext().itemIdentifier);\n }\n if (err.type === 'finish') {\n testRunner.finish();\n }\n if (err.type === 'pause') {\n testRunner.trigger('pause', {\n reasons: err.data && err.data.reasons,\n message: err.data && err.data.comment\n });\n }\n }).catch(function (generalErr) {\n testRunner.trigger('error', generalErr);\n });\n return false;\n }\n });\n testRunner.before('loaditem.connectivity', function (e, itemRef, item) {\n const testContext = testRunner.getTestContext();\n const {\n flags\n } = item;\n if (!flags) {\n return true;\n }\n if (flags.hasFeedbacks) {\n testContext.hasFeedbacks = true;\n }\n if ((flags.containsNonPreloadedAssets || flags.hasPci) && proxy.isOffline()) {\n self.displayWaitingDialog().then(() => {\n testRunner.loadItem(itemRef);\n });\n return false;\n }\n });\n testRunner.before(namespaceHelper.namespaceAll('move skip timeout', 'connectivity'), function (e) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n var testContext = testRunner.getTestContext();\n var currentItem = testRunner.getCurrentItem();\n if (proxy.isOffline() && (currentItem.hasFeedbacks || testContext.hasFeedbacks)) {\n testRunner.trigger('disableitem');\n self.displayWaitingDialog().then(function () {\n testRunner.trigger('enableitem').trigger(e.name, ...args);\n });\n return false;\n }\n });\n },\n destroy() {\n this.getTestRunner().off('.connectivity');\n },\n /**\n * Called during the runner's render phase\n */\n render: function render() {\n var $container = this.getAreaBroker().getControlArea();\n if (this.$element) {\n $container.append(this.$element);\n }\n }\n });\n\n return connectivity;\n\n});\n\n","define('taoQtiTest/runner/plugins/controls/connectivity/pauseOnError',['i18n', 'taoTests/runner/plugin', 'handlebars', 'lib/handlebars/helpers'], function (__, pluginFactory, Handlebars, Helpers0) { 'use strict';\n\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, functionType=\"function\", escapeExpression=this.escapeExpression;\n\n\n buffer += \"\";\n if (helper = helpers.title) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.title); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"

          \\n\";\n if (helper = helpers.message) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.message); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1);\n return buffer;\n });\n function dialogTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 (original work) Open Assessment Technologies SA ;\n */\n const name = 'pauseOnError';\n const dialogMessage = {\n title: __('Something unexpected happened.'),\n message: __('Please try reloading the page or pause the test. If you pause, you will be able to resume the test from this page.')\n };\n const dialogConfig = {\n focus: 'cancel',\n buttons: {\n labels: {\n ok: __('Pause the test'),\n cancel: __('Reload the page')\n }\n }\n };\n const pauseContext = {\n reasons: {\n category: 'technical',\n subCategory: 'error'\n },\n originalMessage: 'Due to an unexpected issue the test has been suspended.'\n };\n var pauseOnError = pluginFactory({\n name,\n /**\n * Initialize the plugin (called during runner's init)\n */\n init() {\n const testRunner = this.getTestRunner();\n const returnToHome = () => testRunner.trigger('pause', pauseContext);\n const reloadPage = () => testRunner.trigger('reloadpage');\n const processError = error => {\n testRunner.on('reloadpage', () => window.location.reload()).trigger('disablenav disabletools hidenav').trigger(`confirm.${name}`, dialogTpl(dialogMessage), returnToHome, reloadPage, dialogConfig);\n if (error.code === 500) {\n error.originalCode = error.code;\n delete error.code;\n testRunner.trigger(`disablefeedbackalerts`);\n testRunner.after('error.pauseOnError', () => {\n testRunner.off('error.pauseOnError');\n testRunner.trigger(`enablefeedbackalerts`);\n });\n }\n };\n testRunner.before('error', (e, error) => processError(error));\n }\n });\n\n return pauseOnError;\n\n});\n\n","define('taoQtiTest/runner/plugins/controls/duration/duration',['lodash', 'taoTests/runner/plugin', 'core/logger'], function (_, pluginFactory, loggerFactory) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n loggerFactory = loggerFactory && Object.prototype.hasOwnProperty.call(loggerFactory, 'default') ? loggerFactory['default'] : loggerFactory;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 (original work) Open Assessment Technologies SA ;\n */\n const logger = loggerFactory('taoQtiTest/runner/plugins/controls/duration/duration');\n\n /**\n * Creates the timer plugin\n */\n var duration = pluginFactory({\n name: 'duration',\n /**\n * Install step, add behavior before the lifecycle.\n */\n install() {\n // define the \"duration\" store as \"volatile\" (removed on browser change).\n this.getTestRunner().getTestStore().setVolatile(this.getName());\n },\n /**\n * Initializes the plugin (called during runner's init)\n *\n * @returns {Promise}\n */\n init() {\n const testRunner = this.getTestRunner();\n let currentUpdatePromise = Promise.resolve();\n const getItemAttempt = () => {\n const context = testRunner.getTestContext();\n return `${context.itemIdentifier}#${context.attempt}`;\n };\n const getPositiveNumber = value => {\n if (!_.isNumber(value) || value < 0) {\n return 0;\n }\n return value;\n };\n\n //where the duration of attempts are stored\n return testRunner.getPluginStore(this.getName()).then(durationStore => {\n /**\n * Gets the duration of a particular item from the store\n *\n * @param {String} attemptId - the attempt id to get the duration for\n * @returns {Promise}\n */\n const getItemDuration = attemptId => {\n if (!/^(.*)+#+\\d+$/.test(attemptId)) {\n return Promise.reject(new Error('Is it really an attempt id, like \"itemid#attempt\"'));\n }\n return durationStore.getItem(attemptId);\n };\n\n /**\n * Updates the duration of a particular item\n *\n * @param {Number} elapsed - time elapsed since previous tick\n * @returns {Promise}\n */\n const updateDuration = elapsed => {\n const itemAttemptId = getItemAttempt();\n currentUpdatePromise = currentUpdatePromise.then(() => getItemDuration(itemAttemptId)).then(duration => durationStore.setItem(itemAttemptId, getPositiveNumber(duration) + getPositiveNumber(elapsed) / 1000)).catch(err => {\n logger.warn(`Error updating item duration! ${err && err.message}`);\n });\n return currentUpdatePromise;\n };\n\n /**\n * Adds the current duration to the next action request.\n * The duration will be sent to the server with the next request,\n * usually submitItem() or callItemAction()\n *\n * @returns {Promise}\n */\n const addDurationToCallActionParams = () => {\n const itemAttemptId = getItemAttempt();\n return currentUpdatePromise.then(() => getItemDuration(itemAttemptId)).then(duration => testRunner.getProxy().addCallActionParams({\n itemDuration: getPositiveNumber(duration)\n })).catch(err => {\n logger.warn(`Error retrieving item duration! ${err && err.message}`);\n });\n };\n\n //change plugin state\n testRunner.on('tick', updateDuration).before('move skip exit timeout pause', addDurationToCallActionParams)\n /**\n * @event duration.get\n * @param {String} attemptId - the attempt id to get the duration for\n * @param {getDuration} getDuration - a receiver callback\n */.on('plugin-get.duration', (attemptId, getDuration) => {\n if (_.isFunction(getDuration)) {\n getDuration(getItemDuration(attemptId));\n }\n });\n });\n }\n });\n\n return duration;\n\n});\n\n","define('taoQtiTest/runner/plugins/controls/progressbar/progress',['lodash', 'i18n', 'core/format', 'taoQtiTest/runner/helpers/map'], function (_, __, format, mapHelper) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n format = format && Object.prototype.hasOwnProperty.call(format, 'default') ? format['default'] : format;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2018-2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * @typedef {Object} progressDetails\n * @property {Number} position - the position in the current element\n * @property {Number} reached - the number of reached elements (at least one item viewed)\n * @property {Number} viewed - the number of viewed elements (all items viewed)\n * @property {Number} completed - the number of completed elements (all questions answered)\n * @property {Number} total - the total number of elements\n */\n\n /**\n * @typedef {itemStats} progressData\n * @property {Number} position - the position in the scope\n * @property {Number} overallCompleted - the number of completed items in the test\n * @property {Number} overall - the total number of items in the test\n * @property {progressDetails} sections - the details of testSections in the scope\n * @property {progressDetails} parts - the details of testParts in the scope\n * @property {progressDetails} answerableSections - the details of testSections that contain questions in the scope\n * @property {progressDetails} answerableParts - the details of testParts that contain questions in the scope\n * @property {progressDetails} matchedCategories - the details of items that match the expected categories in the scope\n */\n\n /**\n * @typedef {Object} progressIndicator\n * @property {Number} position - the position in the scope\n * @property {Number} total - the length of the scope\n * @property {Number} ratio - the progress ratio of the indicator\n * @property {String} label - the text to display for the indicator\n */\n\n /**\n * @typedef {Object} progressConfig\n * @property {String} scope - the scope of the progression\n * @property {String} indicator - the type of progression\n * @property {Bool} showTotal - display 'item x of y' (true) | 'item x'\n * @property {Array} categories - categories to count by them\n */\n\n /**\n * Default progress config\n * @type {Object}\n */\n var defaultConfig = {\n scope: 'test',\n indicator: 'percentage',\n showTotal: true,\n categories: []\n };\n\n /**\n * List of labels by types\n * @type {Object}\n */\n var labels = {\n item: {\n long: __('Item %d of %d'),\n short: __('Item %d')\n },\n section: {\n long: __('Section %d of %d'),\n short: __('Section %d')\n }\n };\n\n /**\n * Simple map of progress stats computers\n * @type {Object}\n */\n var scopes = {\n /**\n * Gets stats for the whole test\n * @param {Object} testMap - the actual test map\n * @param {Object} testContext - the actual test context\n * @param {progressConfig} config - a config object\n * @param {String} config.scope - the scope of the progression\n * @param {Array} config.categories - categories to count by them\n * @returns {progressData}\n */\n test: function test(testMap, testContext, config) {\n var stats = getProgressStats(testMap, testContext, config, 'test');\n var item = mapHelper.getItemAt(testMap, testContext.itemPosition);\n stats.position = item.position + 1;\n return stats;\n },\n /**\n * Gets stats for the current test part\n * @param {Object} testMap - the actual test map\n * @param {Object} testContext - the actual test context\n * @param {progressConfig} config - a config object\n * @param {String} config.scope - the scope of the progression\n * @param {Array} config.categories - categories to count by them\n * @returns {progressData}\n */\n testPart: function testPart(testMap, testContext, config) {\n var stats = getProgressStats(testMap, testContext, config, 'testPart');\n var item = mapHelper.getItemAt(testMap, testContext.itemPosition);\n stats.position = item.positionInPart + 1;\n return stats;\n },\n /**\n * Gets stats for the current test section\n * @param {Object} testMap - the actual test map\n * @param {Object} testContext - the actual test context\n * @param {progressConfig} config - a config object\n * @param {String} config.scope - the scope of the progression\n * @param {Array} config.categories - categories to count by them\n * @returns {progressData}\n */\n testSection: function testSection(testMap, testContext, config) {\n var stats = getProgressStats(testMap, testContext, config, 'testSection');\n var item = mapHelper.getItemAt(testMap, testContext.itemPosition);\n stats.position = item.positionInSection + 1;\n return stats;\n }\n };\n\n /**\n * Simple map of progress indicator computers\n * @type {Object}\n */\n var indicators = {\n /**\n * Indicator that shows the percentage of completed items\n * @param {progressData} stats\n * @returns {progressIndicator}\n */\n percentage: function percentage(stats) {\n return getRatioProgression(stats.answered, stats.questions);\n },\n /**\n * Indicator that shows the position of current item\n * @param {progressData} stats\n * @param {progressConfig} config\n * @param {String} config.scope - the scope of the progression\n * @param {Array} config.categories - categories to count by them\n * @returns {progressIndicator}\n */\n position: function position(stats, config) {\n return getPositionProgression(stats.position, stats.total, 'item', config);\n },\n /**\n * Indicator that shows the number of viewed questions\n * @param {progressData} stats\n * @param {progressConfig} config\n * @param {String} config.scope - the scope of the progression\n * @param {Array} config.categories - categories to count by them\n * @returns {progressIndicator}\n */\n questions: function questions(stats, config) {\n return getPositionProgression(stats.questionsViewed, stats.questions, 'item', config);\n },\n /**\n * Indicator that shows the number of reached answerable sections\n * @param {progressData} stats\n * @param {progressConfig} config\n * @param {String} config.scope - the scope of the progression\n * @param {Array} config.categories - categories to count by them\n * @returns {progressIndicator}\n */\n sections: function sections(stats, config) {\n return getPositionProgression(stats.answerableSections.reached, stats.answerableSections.total, 'section', config);\n },\n /**\n * Indicator that shows the number of viewed items which have categories from the configuration\n * (show all if categories are not set)\n * @param {progressData} stats\n * @param {progressConfig} config\n * @param {String} config.scope - the scope of the progression\n * @param {Array} config.categories - categories to count by them\n */\n categories: function categories(stats, config) {\n return getPositionProgression(stats.matchedCategories.position, stats.matchedCategories.total, 'item', config);\n }\n };\n\n /**\n * Fix the test map if the current test part is linear, as the current item should not be answered.\n * @param {Object} testMap - the actual test map\n * @param {Object} testContext - the actual test context\n * @returns {Object} The fixed test map\n */\n function getFixedMap(testMap, testContext) {\n const currentTestPart = mapHelper.getPart(testMap, testContext.testPartId);\n const currentItem = mapHelper.getItemAt(testMap, testContext.itemPosition);\n if (currentItem.answered && currentTestPart.isLinear) {\n const fixedTestMap = _.cloneDeep(testMap);\n const fixedCurrentItem = mapHelper.getItemAt(fixedTestMap, testContext.itemPosition);\n fixedCurrentItem.answered = false;\n return fixedTestMap;\n }\n return testMap;\n }\n\n /**\n * Gets an empty stats record\n * @returns {progressDetails}\n */\n function getEmptyStats() {\n return {\n position: 0,\n reached: 0,\n viewed: 0,\n completed: 0,\n total: 0\n };\n }\n\n /**\n * Updates the progress stats from the given element\n * @param {progressDetails} stats - The stats details to update\n * @param {Object} element - The element from which take the details\n * @param {Number} position - The current item position\n */\n function updateStats(stats, element, position) {\n if (element.position <= position) {\n stats.position++;\n }\n if (element.stats.viewed) {\n stats.reached++;\n if (element.stats.viewed === element.stats.total) {\n stats.viewed++;\n }\n }\n if (element.stats.answered) {\n if (element.stats.answered === element.stats.questions) {\n stats.completed++;\n }\n }\n stats.total++;\n }\n\n /**\n * Updates the progress stats from the given element\n * @param {progressDetails} stats - The stats details to update\n * @param {Object} element - The element from which take the details\n * @param {Number} position - The current item position\n */\n function updateItemStats(stats, element, position) {\n if (element.position <= position) {\n stats.position++;\n }\n if (element.viewed) {\n stats.reached++;\n stats.viewed++;\n }\n if (element.answered) {\n stats.completed++;\n }\n stats.total++;\n }\n\n /**\n * Convert list of the categories to the hashtable to improve performance\n * @param categories\n * @returns {*}\n */\n function getCategoriesToMatch(categories) {\n var matchSize = categories && categories.length;\n return matchSize && _.reduce(categories, function (map, category) {\n map[category] = true;\n return map;\n }, {});\n }\n\n /**\n * Completes the progression stats\n * @param {Object} testMap - the actual test map\n * @param {Object} testContext - the actual test context\n * @param {progressConfig} config\n * @param {String} config.scope - the scope of the progression\n * @param {Array} config.categories - categories to count by them\n * @param {String} [scope] - The name of the scope. Can be: test, part, section (default: test)\n * @returns {progressData}\n */\n function getProgressStats(testMap, testContext, config, scope) {\n var fixedMap = getFixedMap(testMap, testContext);\n var scopedMap = mapHelper.getScopeMap(fixedMap, testContext.itemPosition, scope);\n var stats = _.clone(scopedMap.stats);\n var categoriesToMatch;\n var matchSize;\n if (config.indicator === 'categories') {\n categoriesToMatch = getCategoriesToMatch(config.categories);\n matchSize = config.categories && config.categories.length;\n stats.matchedCategories = getEmptyStats();\n }\n stats.parts = getEmptyStats();\n stats.sections = getEmptyStats();\n stats.answerableParts = getEmptyStats();\n stats.answerableSections = getEmptyStats();\n _.forEach(scopedMap.parts, function (part) {\n updateStats(stats.parts, part, testContext.itemPosition);\n if (part.stats.questions > 0) {\n updateStats(stats.answerableParts, part, testContext.itemPosition);\n }\n _.forEach(part.sections, function (section) {\n updateStats(stats.sections, section, testContext.itemPosition);\n if (section.stats.questions > 0) {\n updateStats(stats.answerableSections, section, testContext.itemPosition);\n }\n if (config.indicator === 'categories') {\n _.forEach(section.items, function (item) {\n if (matchCategories(item.categories, categoriesToMatch, matchSize)) {\n updateItemStats(stats.matchedCategories, item, testContext.itemPosition);\n }\n });\n }\n });\n });\n return stats;\n }\n\n /**\n *\n * @param {Array} categories - List of categories to check\n * @param {Object} expectedCategories - Hashtable of expected categories\n * @param {Number} minWanted - Minimal number of expected categories that should match\n * @returns {Boolean}\n */\n function matchCategories(categories, expectedCategories, minWanted) {\n var matched = 0;\n if (expectedCategories) {\n _.forEach(categories, function (category) {\n if (expectedCategories[category]) {\n matched++;\n if (matched >= minWanted) {\n return false;\n }\n }\n });\n }\n return matched === minWanted;\n }\n\n /**\n * Gets the progression ratio\n * @param {Number} position\n * @param {Number} total\n * @returns {Number}\n */\n function getRatio(position, total) {\n if (position && total > 0) {\n return Math.floor(position / total * 100);\n }\n return 0;\n }\n\n /**\n * Gets the label of the progress bar for an item\n * @param {Number} position - the current position\n * @param {Number} total - the total number of items\n * @param {String} type - the type of element that is represented\n * @param {progressConfig} config - a config object\n * @param {String} config.scope - the scope of the progression\n * @param {Array} config.categories - categories to count by them\n * @returns {String}\n */\n function getProgressionLabel(position, total, type, config) {\n var patterns = labels[type] || labels.item;\n var pattern = config.showTotal ? patterns.long : patterns.short;\n return format(pattern, position || '0', total || '0');\n }\n\n /**\n * Gets the progression based on position\n * @param {Number} position - the current position\n * @param {Number} total - the total number of items\n * @param {String} type - the type of element that is represented\n * @param {progressConfig} config - a config object\n * @param {String} config.scope - the scope of the progression\n * @param {Array} config.categories - categories to count by them\n * @returns {progressIndicator}\n */\n function getPositionProgression(position, total, type, config) {\n return {\n position: position || 0,\n total: total || 0,\n ratio: getRatio(position, total),\n label: getProgressionLabel(position, total, type, config)\n };\n }\n\n /**\n * Gets the progression based on a ratio\n * @param {Number} position - the current position\n * @param {Number} total - the total number of items\n * @returns {progressIndicator}\n */\n function getRatioProgression(position, total) {\n var ratio = getRatio(position, total);\n return {\n position: position || 0,\n total: total || 0,\n ratio: ratio,\n label: `${ratio}%`\n };\n }\n var progress = {\n /**\n * Checks that categories matched\n * @param categories\n * @param expectedCategories\n * @returns {Boolean}\n */\n isMatchedCategories: function validCategories(categories, expectedCategories) {\n var categoriesToMatch = getCategoriesToMatch(expectedCategories);\n var matchSize = expectedCategories && expectedCategories.length;\n return matchCategories(categories, categoriesToMatch, matchSize);\n },\n /**\n * Computes the progress stats for the specified scope\n * @param {Object} testMap - the actual test map\n * @param {Object} testContext - the actual test context\n * @param {progressConfig} config - a config object\n * @param {String} config.scope - the scope of the progression\n * @param {Array} config.categories - categories to count by them\n * @returns {progressData}\n */\n computeStats(testMap, testContext, config) {\n const testPart = mapHelper.getPart(testMap, testContext.testPartId);\n const statsComputer = config.scope && scopes[config.scope] || scopes.test;\n const stats = statsComputer(testMap, testContext, config || defaultConfig);\n stats.overall = testMap.stats.total;\n if (testPart && testPart.isLinear) {\n stats.overallCompleted = testMap.stats.answered - 1;\n } else {\n stats.overallCompleted = testMap.stats.answered;\n }\n return stats;\n },\n /**\n * Computes the specified progress indicator\n * @param {progressData} stats - the progress stats\n * @param {String} type - the [type=\"percentage\"] of indicator to compute (could be: percentage, position, questions, sections)\n * @param {progressConfig} [config] - a config object\n * @param {Boolean} [config.showTotal] - display 'item x of y' (true) | 'item x'\n * @returns {progressIndicator}\n */\n computeIndicator: function computeIndicator(stats, type, config) {\n var indicatorComputer = type && indicators[type] || indicators.percentage;\n return indicatorComputer(stats || {}, config || defaultConfig);\n },\n /**\n *\n * @param {Object} testMap - the actual test map\n * @param {Object} testContext - the actual test context\n * @param {progressConfig} config - a config object\n * @param {String} config.indicator - the type of progression\n * @param {String} config.scope - the scope of the progression\n * @param {Array} config.categories - categories to count by them\n * @param {Boolean} [config.showTotal=true] - display 'item x of y' (true) | 'item x'\n */\n computeProgress: function computeProgress(testMap, testContext, config) {\n var progressData;\n config = _.defaults(config || {}, defaultConfig);\n progressData = this.computeStats(testMap, testContext, config);\n return this.computeIndicator(progressData, config.indicator, config);\n }\n };\n\n return progress;\n\n});\n\n","define('taoQtiTest/runner/plugins/controls/progressbar/renderer/percentage',['ui/component', 'handlebars', 'lib/handlebars/helpers', 'ui/progressbar'], function (component, Handlebars, Helpers0, progressbar) { 'use strict';\n\n component = component && Object.prototype.hasOwnProperty.call(component, 'default') ? component['default'] : component;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); \n\n\n return \"
          \\n
          \\n
          \\n
          \\n\";\n });\n function percentageTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2018 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Default config values\n * @type {Object}\n */\n var defaults = {\n showLabel: true\n };\n\n /**\n * Builds percentage indicator renderer\n * @param {Object} [config] - a config object\n * @param {Boolean} [config.showLabel=true] - show/hide the progress label\n * @param {Object} [progressData] - the initial dataset\n */\n function percentageIndicatorRenderer(config, progressData) {\n var rendererApi = {\n /**\n * Update the progress bar according to the provided indicator data\n * @param {progressIndicator} data\n */\n update: function update(data) {\n progressData = data;\n if (this.is('rendered') && this.controls) {\n this.controls.$label.text(progressData.label);\n this.controls.$bar.progressbar('value', progressData.ratio);\n }\n\n /**\n * Executes extra tasks on update\n * @event percentageIndicatorRenderer#update\n * @param {progressIndicator} data\n */\n this.trigger('update', data);\n }\n };\n return component(rendererApi, defaults).setTemplate(percentageTpl).on('render', function () {\n // get access to the controls\n this.controls = {\n $label: this.getElement().find('[data-control=\"progress-label\"]'),\n $bar: this.getElement().find('[data-control=\"progress-bar\"]')\n };\n\n // apply option\n if (!this.config.showLabel) {\n this.controls.$label.hide();\n }\n\n // and initialize the progress bar component\n this.controls.$bar.progressbar();\n\n // set the right progression according to init data\n if (progressData) {\n this.update(progressData);\n }\n\n // forward the hidden state if it has been set before render\n if (this.is('hidden')) {\n this.hide();\n }\n }).on('destroy', function () {\n this.controls = null;\n }).init(config);\n }\n\n return percentageIndicatorRenderer;\n\n});\n\n","define('taoQtiTest/runner/plugins/controls/progressbar/renderer/position',['lodash', 'ui/component', 'handlebars', 'lib/handlebars/helpers'], function (_, component, Handlebars, Helpers0) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n component = component && Object.prototype.hasOwnProperty.call(component, 'default') ? component['default'] : component;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); \n\n\n return \"
          \\n
          \\n
          \\n
          \\n
          \\n
          \\n\";\n });\n function positionTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template$1 = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var stack1, functionType=\"function\", escapeExpression=this.escapeExpression, self=this;\n\n function program1(depth0,data) {\n \n var buffer = \"\";\n buffer += \"\\n\\n\";\n return buffer;\n }\n\n stack1 = helpers.each.call(depth0, depth0, {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { return stack1; }\n else { return ''; }\n });\n function pointTpl(data, options, asString) {\n var html = Template$1(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2018 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Default config values\n * @type {Object}\n */\n var defaults = {\n showLabel: true\n };\n\n /**\n * Builds percentage indicator renderer\n * @param {Object} [config] - a config object\n * @param {Boolean} [config.showLabel=true] - show/hide the progress label\n * @param {Object} [progressData] - the initial dataset\n */\n function positionIndicatorRenderer(config, progressData) {\n var count = 0;\n var rendererApi = {\n /**\n * Update the progress bar according to the provided indicator data\n * @param {progressIndicator} data\n */\n update: function update(data) {\n progressData = data;\n if (this.is('rendered') && this.controls) {\n if (count !== progressData.total) {\n // the number of points have changed, regenerate the full bar\n count = progressData.total;\n this.controls.$bar.empty().append(pointTpl(_.range(count)));\n }\n this.controls.$label.text(progressData.label);\n this.controls.$bar\n // remove progression from all points\n .children().removeClass('reached current')\n // set progression to each reached point\n .slice(0, progressData.position).addClass('reached')\n // set current position\n .slice(-1).addClass('current');\n }\n\n /**\n * Executes extra tasks on update\n * @event positionIndicatorRenderer#update\n * @param {progressIndicator} data\n */\n this.trigger('update', data);\n }\n };\n return component(rendererApi, defaults).setTemplate(positionTpl).on('render', function () {\n // get access to the controls\n this.controls = {\n $label: this.getElement().find('[data-control=\"progress-label\"]'),\n $bar: this.getElement().find('[data-control=\"progress-bar\"] .progressbar-points')\n };\n\n // apply option\n if (!this.config.showLabel) {\n this.controls.$label.hide();\n }\n\n // set the right progression according to init data\n if (progressData) {\n this.update(progressData);\n }\n\n // forward the hidden state if it has been set before render\n if (this.is('hidden')) {\n this.hide();\n }\n }).on('destroy', function () {\n this.controls = null;\n }).init(config);\n }\n\n return positionIndicatorRenderer;\n\n});\n\n","define('taoQtiTest/runner/plugins/controls/progressbar/progressbar',['taoTests/runner/plugin', 'taoQtiTest/runner/helpers/map', 'taoQtiTest/runner/plugins/controls/progressbar/progress', 'taoQtiTest/runner/plugins/controls/progressbar/renderer/percentage', 'taoQtiTest/runner/plugins/controls/progressbar/renderer/position'], function (pluginFactory, mapHelper, progressHelper, percentageRendererFactory, positionRendererFactory) { 'use strict';\n\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n progressHelper = progressHelper && Object.prototype.hasOwnProperty.call(progressHelper, 'default') ? progressHelper['default'] : progressHelper;\n percentageRendererFactory = percentageRendererFactory && Object.prototype.hasOwnProperty.call(percentageRendererFactory, 'default') ? percentageRendererFactory['default'] : percentageRendererFactory;\n positionRendererFactory = positionRendererFactory && Object.prototype.hasOwnProperty.call(positionRendererFactory, 'default') ? positionRendererFactory['default'] : positionRendererFactory;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2018 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * List of available progress indicator renderers\n * @type {Object}\n */\n var renderers = {\n percentage: percentageRendererFactory,\n position: positionRendererFactory\n };\n\n /**\n * Returns the configured plugin\n */\n var progressbar = pluginFactory({\n name: 'progressBar',\n /**\n * Initialize the plugin (called during runner's init)\n */\n init: function init() {\n const testRunner = this.getTestRunner();\n const testRunnerConfig = testRunner.getOptions();\n const config = Object.assign({}, testRunnerConfig.progressIndicator || {}, this.getConfig());\n const self = this;\n var rendererFactory = renderers[config.renderer] || renderers.percentage;\n var progressConfig = {\n indicator: config.type || 'percentage',\n scope: config.scope || 'test',\n showLabel: config.showLabel,\n showTotal: config.showTotal,\n categories: config.categories\n };\n var hiddenByQuestions = function hiddenByQuestions(item) {\n return item && item.informational && progressConfig.indicator === 'questions';\n };\n var hiddenByCategories = function (item) {\n return item && progressConfig.indicator === 'categories' && !progressHelper.isMatchedCategories(item.categories, progressConfig.categories);\n };\n\n /**\n * Check if progress bar should be hidden\n */\n var isProgressbarHidden = function isProgressbarHidden(item) {\n return hiddenByQuestions(item) || hiddenByCategories(item);\n };\n\n /**\n * Update the progress bar\n */\n var update = function update() {\n var testContext = testRunner.getTestContext();\n var testMap = testRunner.getTestMap();\n var item = mapHelper.getItemAt(testMap, testContext.itemPosition);\n if (isProgressbarHidden(item)) {\n self.renderer.hide();\n } else {\n self.renderer.show();\n self.renderer.update(progressHelper.computeProgress(testMap, testContext, progressConfig));\n }\n };\n\n //create the progressbar\n this.renderer = rendererFactory(progressConfig);\n\n //let update the progression\n update();\n testRunner.on('ready loaditem', update);\n },\n /**\n * Called during the runner's render phase\n */\n render: function render() {\n var $container = this.getAreaBroker().getControlArea();\n this.renderer.render($container);\n },\n /**\n * Called during the runner's render phase\n */\n destroy: function destroy() {\n if (this.renderer) {\n this.renderer.destroy();\n }\n this.renderer = null;\n },\n /**\n * Show the progress bar\n */\n show: function show() {\n if (this.renderer) {\n this.renderer.show();\n }\n },\n /**\n * Hide the progress bar\n */\n hide: function hide() {\n if (this.renderer) {\n this.renderer.hide();\n }\n }\n });\n\n return progressbar;\n\n});\n\n","define('taoQtiTest/runner/plugins/controls/testState/testState',['lodash', 'taoTests/runner/plugin'], function (_, pluginFactory) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Creates the testState plugin.\n * Handle particular states of the assessment test\n */\n var testState = pluginFactory({\n name: 'testState',\n /**\n * Installs the plugin (called when the runner bind the plugin)\n */\n install: function install() {\n var testRunner = this.getTestRunner();\n\n // middleware invoked on every requests\n testRunner.getProxy().use(function qtiFilter(req, res, next) {\n var data = res && res.data;\n\n // test has been closed/suspended => redirect to the index page after message acknowledge\n if (data && data.type && data.type === 'TestState' && !testRunner.getState('closedOrSuspended')) {\n // spread the world about the reason of the leave\n testRunner.setState('closedOrSuspended', true);\n if (!testRunner.getState('ready')) {\n // if we open an inconsistent test just leave\n // should happen if we refresh an auto paused test\n testRunner.trigger('destroy');\n } else if (_.isEmpty(data.messages) || !_.find(data.messages, {\n channel: 'teststate'\n })) {\n testRunner.trigger('leave', data);\n }\n // break the chain to avoid uncaught exception in promise...\n // this will lead to unresolved promise, but the browser will be redirected soon!\n return;\n }\n next();\n });\n },\n /**\n * Initializes the plugin (called during runner's init)\n */\n init: function init() {\n var testRunner = this.getTestRunner();\n var isLeaving = false;\n\n // immediate handling of proctor's actions\n testRunner.getProxy().channel('teststate', function (data) {\n if (!isLeaving && data && ('close' === data.type || 'pause' === data.type) && !testRunner.getState('closedOrSuspended')) {\n isLeaving = true;\n if ('pause' === data.type) {\n testRunner.trigger('pause', data);\n } else {\n testRunner.setState('closedOrSuspended', true);\n testRunner.trigger('leave', data);\n }\n }\n });\n }\n });\n\n return testState;\n\n});\n\n","define('taoQtiTest/runner/helpers/getTimerMessage',['i18n'], function (__) { 'use strict';\n\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n\n /**\n * Returns timer information string\n * @returns {Boolean}\n */\n function getTimerMessage(hours, minutes, seconds, unansweredQuestions, scope) {\n let timerMessage;\n const timeArr = [hours, minutes, seconds];\n const timeArgArr = [];\n [__('hours'), __('minutes'), __('seconds')].forEach((unit, idx) => {\n if (timeArr[idx] > 0) {\n timeArgArr.push(`${timeArr[idx]} ${unit}`);\n }\n });\n let answeredMessage;\n if (!unansweredQuestions || scope === 'item') {\n answeredMessage = __('the current question');\n } else {\n let questionsMessage = __('questions');\n if (unansweredQuestions === 1) {\n questionsMessage = __('question');\n }\n answeredMessage = __('remaining %s %s', unansweredQuestions, questionsMessage);\n }\n if (timeArgArr.length === 0) {\n timerMessage = __('%s to answer %s', 'no time left', answeredMessage);\n } else {\n timerMessage = __('%s to answer %s', timeArgArr.join(', '), answeredMessage);\n }\n return timerMessage;\n }\n\n return getTimerMessage;\n\n});\n\n","\ndefine('css!taoQtiTest/runner/plugins/controls/timer/component/css/countdown',[],function(){});\n","define('taoQtiTest/runner/plugins/controls/timer/component/countdown',['jquery', 'lodash', 'core/encoder/time', 'ui/component', 'handlebars', 'lib/handlebars/helpers', 'taoQtiTest/runner/helpers/getTimerMessage', 'ui/tooltip', 'css!taoQtiTest/runner/plugins/controls/timer/component/css/countdown.css', 'moment'], function ($$1, _, timeEncoder, component, Handlebars, Helpers0, getTimerMessage, tooltip, countdown_css, moment) { 'use strict';\n\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n timeEncoder = timeEncoder && Object.prototype.hasOwnProperty.call(timeEncoder, 'default') ? timeEncoder['default'] : timeEncoder;\n component = component && Object.prototype.hasOwnProperty.call(component, 'default') ? component['default'] : component;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n getTimerMessage = getTimerMessage && Object.prototype.hasOwnProperty.call(getTimerMessage, 'default') ? getTimerMessage['default'] : getTimerMessage;\n tooltip = tooltip && Object.prototype.hasOwnProperty.call(tooltip, 'default') ? tooltip['default'] : tooltip;\n moment = moment && Object.prototype.hasOwnProperty.call(moment, 'default') ? moment['default'] : moment;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, functionType=\"function\", escapeExpression=this.escapeExpression;\n\n\n buffer += \"
          \\n \";\n if (helper = helpers.label) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.label); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\n \\n
          \\n
          \\n\";\n return buffer;\n });\n function countdownTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2018 (original work) Open Assessment Technologies SA ;\n */\n\n //Precision is milliseconds\n var precision = 1000;\n\n /**\n * Default config values, see below.\n */\n var defaults = {\n showBeforeStart: true,\n displayWarning: true\n };\n\n /**\n * time to display warnings\n */\n var warningTimeout = {\n info: 2000,\n success: 2000,\n warning: 4000,\n danger: 4000,\n error: 8000\n };\n\n /**\n * Creates, initialize and render a countdown component.\n *\n * @param {jQueryElement|HTMLElement} $container - where to append the countdown\n * @param {Object} config\n * @param {String} config.id - the timer unique identifier\n * @param {String} config.label - the text to display above the timer\n * @param {String} config.type - the type of countdown (to categorize them)\n * @param {String} [config.scope] - scope of a timer\n * @param {Number} [config.unansweredQuestions] - number of unanswered options\n * @param {Number} [config.remainingTime] - the current value of the countdown, in milliseconds\n * @param {Boolean} [config.showBeforeStart = true] - do we show the time before starting\n * @param {Boolean} [config.displayWarning = true] - do we display the warnings or trigger only the event\n * @param {Object[]} [config.warnings] - define warnings thresholds\n * @param {Number} [config.warnings.threshold] - when the warning is shown, in milliseconds\n * @param {String} [config.warnings.message] - the warning message\n * @param {String} [config.warnings.level = warn] - the feedback level in (success, info, warn, danger and error)\n * @returns {countdown} the component, initialized and rendered\n */\n function countdownFactory($container, config) {\n let $time;\n let $timeScreenreader;\n\n /**\n * @typedef {Object} countdown\n */\n var countdown = component({\n /**\n * Update the countdown\n * @param {Number} remainingTime - the time remaining (milliseconds)\n * @param {Number} unansweredQuestions\n * @returns {countdown} chains\n * @fires countdown#change - when the value has changed\n * @fires countdown#warn - when a threshold is reached\n */\n update: function udpate(remainingTime, unansweredQuestions) {\n var self = this;\n var encodedTime;\n var warningId;\n var warningMessage;\n if (!this.is('completed')) {\n if (remainingTime <= 0) {\n this.remainingTime = 0;\n } else {\n this.remainingTime = parseInt(remainingTime, 10);\n }\n if (this.is('rendered') && this.is('running')) {\n encodedTime = timeEncoder.encode(this.remainingTime / precision);\n if (encodedTime !== this.encodedTime) {\n this.encodedTime = encodedTime;\n const time = moment.duration(this.remainingTime / precision, 'seconds');\n const hours = time.get('hours');\n const minutes = time.get('minutes');\n const seconds = time.get('seconds');\n $time.text(this.encodedTime);\n $timeScreenreader.text(getTimerMessage(hours, minutes, seconds, unansweredQuestions, this.config.scope));\n }\n if (this.warnings) {\n //the warnings have already be sorted\n warningId = _.findLastKey(this.warnings, function (warning) {\n return warning && !warning.shown && warning.threshold > 0 && warning.threshold >= self.remainingTime;\n });\n if (warningId) {\n this.warnings[warningId].shown = true;\n if (_.isFunction(this.warnings[warningId].message)) {\n warningMessage = this.warnings[warningId].message(this.remainingTime);\n } else {\n warningMessage = this.warnings[warningId].message;\n }\n\n /**\n * Warn user the timer reach a threshold\n * @event countdown#warn\n * @param {String} message\n * @param {String} level\n */\n this.trigger('warn', warningMessage, this.warnings[warningId].level);\n }\n }\n if (this.warningsForScreenreader) {\n //the warnings have already be sorted\n const screenreaderWarningId = _.findLastKey(this.warningsForScreenreader, warning => warning && !warning.shown && warning.threshold > 0 && warning.threshold >= self.remainingTime);\n if (screenreaderWarningId) {\n this.warningsForScreenreader[screenreaderWarningId].shown = true;\n\n /**\n * Warn user the timer reach a threshold\n * @event countdown#warnscreenreader\n * @param {Function} message\n * @param {Number} remainingTime\n * @param {String} scope\n */\n this.trigger('warnscreenreader', this.warningsForScreenreader[screenreaderWarningId].message, self.remainingTime, this.warningsForScreenreader[screenreaderWarningId].scope);\n }\n }\n\n /**\n * The current value has changed\n * @event countdown#change\n * @param {Number} remainingTime - the updated time\n * @param {String} displayed - the displayed value\n */\n this.trigger('change', this.remainingTime, encodedTime);\n }\n if (this.remainingTime === 0) {\n this.complete();\n }\n }\n return this;\n },\n /**\n * Starts the countdown\n * @returns {countdown} chains\n * @fires countdown#start\n */\n start: function start() {\n if (this.is('rendered') && !this.is('running') && !this.is('completed')) {\n this.enable();\n this.setState('running', true);\n\n /**\n * The count has started\n * @event countdown#start\n */\n this.trigger('start');\n }\n return this;\n },\n /**\n * Stops the countdown (can be restarted then)\n * @returns {countdown} chains\n * @fires countdown#stop\n */\n stop: function stop() {\n if (this.is('rendered') && this.is('running')) {\n this.setState('running', false);\n\n /**\n * The count is stopped\n * @event countdown#stop\n */\n this.trigger('stop');\n }\n return this;\n },\n /**\n * Calls to complete the countdown,\n * it can't be resumed after.\n *\n * @returns {countdown} chains\n *\n * @fires countdown#complete\n * @fires countdown#end\n */\n complete: function complete() {\n if (this.is('rendered') && this.is('running') && !this.is('completed')) {\n this.stop();\n this.setState('completed', true);\n\n /**\n * The countdown has ended, is completed\n * @event countdown#complete\n * @event countdown#end (alias)\n */\n this.trigger('complete end');\n }\n return this;\n }\n }, defaults).on('init', function () {\n this.remainingTime = this.config.remainingTime;\n this.unansweredQuestions = this.config.unansweredQuestions;\n if (this.config.warnings) {\n this.warnings = _.sortBy(this.config.warnings, 'threshold');\n }\n if (this.config.warningsForScreenreader) {\n this.warningsForScreenreader = _.sortBy(this.config.warningsForScreenreader, 'threshold');\n }\n\n //auto renders\n this.render($container);\n }).on('render', function () {\n $time = $$1('.time', this.getElement());\n $timeScreenreader = $$1('.time--screenreader', this.getElement());\n if (this.config.showBeforeStart === true) {\n $time.text(timeEncoder.encode(this.remainingTime / precision));\n }\n }).on('warn', function (message, level) {\n var countdownTooltip;\n level = level || 'warning';\n if (this.is('rendered') && this.is('running') && _.isString(message) && !_.isEmpty(message)) {\n $time.removeClass('txt-success txt-info txt-warning txt-danger txt-error').addClass(`txt-${level}`);\n if (this.config.displayWarning === true) {\n countdownTooltip = tooltip.create(this.getElement(), message, {\n trigger: 'manual',\n theme: level,\n placement: 'bottom'\n });\n countdownTooltip.show();\n setTimeout(function () {\n countdownTooltip.hide();\n countdownTooltip.dispose();\n }, warningTimeout[level] || 2000);\n }\n }\n });\n countdown.setTemplate(countdownTpl);\n _.defer(function () {\n countdown.init(config);\n });\n return countdown;\n }\n\n return countdownFactory;\n\n});\n\n","\ndefine('css!taoQtiTest/runner/plugins/controls/timer/component/css/timerbox',[],function(){});\n","define('taoQtiTest/runner/plugins/controls/timer/component/timerbox',['jquery', 'lodash', 'i18n', 'ui/component', 'ui/hider', 'taoQtiTest/runner/plugins/controls/timer/component/countdown', 'handlebars', 'lib/handlebars/helpers', 'css!taoQtiTest/runner/plugins/controls/timer/component/css/timerbox.css'], function ($$1, _, __, component, hider, countdownFactory, Handlebars, Helpers0, timerbox_css) { 'use strict';\n\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n component = component && Object.prototype.hasOwnProperty.call(component, 'default') ? component['default'] : component;\n hider = hider && Object.prototype.hasOwnProperty.call(hider, 'default') ? hider['default'] : hider;\n countdownFactory = countdownFactory && Object.prototype.hasOwnProperty.call(countdownFactory, 'default') ? countdownFactory['default'] : countdownFactory;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, self=this, functionType=\"function\";\n\n function program1(depth0,data) {\n \n var buffer = \"\", helper, options;\n buffer += \"\\n
          \\n \";\n return buffer;\n }\n\n buffer += \"
          \\n \";\n stack1 = helpers['if'].call(depth0, ((stack1 = (depth0 && depth0.zenMode)),stack1 == null || stack1 === false ? stack1 : stack1.enabled), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n
          \\n\\n
          \\n
          \\n\";\n return buffer;\n });\n function timerboxTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2018 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Default config values, see below.\n */\n var defaults = {\n zenMode: {\n enabled: true,\n startHidden: false\n }\n };\n\n /**\n * Creates and initialize the timerbox component.\n * Please not the component IS NOT rendered.\n * You'll have to render it by yourself.\n *\n * @param {Object} config\n * @param {Boolean} [config.zenMode = true] - zen mode adds a button to hide the countdowns to stay zen\n * @param {Object[]} [config.timers] - the timers to start with\n * @param {Boolean} [config.displayWarning = true] - let the countdown display their warning (contextual)\n * @returns {timerbox} the component, initialized and rendered\n */\n function timerboxFactory(config) {\n var $zenModeToggler;\n var $countdownContainer;\n\n /**\n * @typedef {Object} timerbox\n */\n var timerbox = component({\n /***\n * Update the displayed timers.\n * Compare the current and the given, it will add,remove and update timers.\n *\n * @param {Object[]} timers - the new timers\n * @returns {Promise} resolves when all timers are up to date (with the result of all the update operations)\n *\n * @fires timerbox#update the update is done\n */\n update: function update(timers) {\n var self = this;\n var updating = [];\n\n //remove timers\n var timerIdsToRemove = _.difference(_.keys(this.timers), _.keys(timers));\n if (timerIdsToRemove.length) {\n _.forEach(timerIdsToRemove, function (timerId) {\n updating.push(self.removeTimer(timerId));\n });\n }\n\n //add/update\n _.forEach(timers, function (timer, id) {\n if (typeof self.timers[id] === 'undefined') {\n updating.push(self.addTimer(id, timer));\n } else {\n updating.push(self.updateTimer(id, timer));\n }\n });\n return Promise.all(updating).then(function (results) {\n //show the toggler only if there's timers\n if (_.size(self.timers) > 0) {\n hider.show($zenModeToggler);\n } else {\n hider.hide($zenModeToggler);\n }\n\n /**\n * The timer box update is done\n * @event timerbox#update\n * @param {Object[]} timers - ALL update results (includes removals)\n */\n self.trigger('update', results);\n return results;\n });\n },\n /**\n * Get the current timers\n * @return {Object[]} the timers\n */\n getTimers: function getTimers() {\n return this.timers;\n },\n /**\n * Adds a new timer to the box\n * @param {String} id - the timer unique identifier\n * @param {Object} timer - the new timer\n * @return {Promise} resolves with the timer once added or false\n *\n * @fires timerbox#timerchange something changes in a timer\n * @fires timerbox#timeradd a new timer is in the box\n * @fires timerbox#timerstart a timer get started\n * @fires timerbox#timerstop a timer get stopped\n * @fires timerbox#timerend a timer get completed\n * @fires timerbox#change spread from the countdown\n */\n addTimer: function addTimer(id, timer) {\n var self = this;\n if (this.is('rendered') && typeof this.timers[id] === 'undefined') {\n return new Promise(function (resolve) {\n var countdown = countdownFactory($countdownContainer, _.defaults(timer, {\n displayWarning: self.config.displayWarning\n })).on('render', function () {\n //keep track of the new timer\n //and the countdown component\n self.timers[id] = _.clone(timer);\n self.timers[id].countdown = this;\n\n /**\n * The timers have changed (add, update, remove)\n * @event timerbox#timerchange\n * @param {String} action - add, update, remove\n * @param {Object} timer\n */\n self.trigger('timerchange', 'add', self.timers[id]);\n\n /**\n * A new timer is added\n * @event timerbox#timeradd\n * @param {Object} timer\n */\n self.trigger('timeradd', self.timers[id]);\n resolve(self.timers[id]);\n }).on('start', function () {\n /**\n * A timer starts\n * @event timerbox#timerstart\n * @param {Object} timer\n */\n self.trigger('timerstart', self.timers[id]);\n }).on('stop', function () {\n /**\n * A timer stops\n * @event timerbox#timerstop\n * @param {Object} timer\n */\n self.trigger('timerstop', self.timers[id]);\n }).on('end', function () {\n /**\n * A timer ends\n * @event timerbox#timerend\n * @param {Object} timer\n */\n self.trigger('timerend', self.timers[id]);\n }).on('change', function (value) {\n if (self.timers[id]) {\n self.trigger('timertick', this.remainingTime, self.timers[id].scope, self.timers[id].unansweredQuestions); // propogate current timer data\n\n //keep the current timer data in sync\n self.timers[id].remainingTime = value;\n }\n });\n countdown.spread(self, ['error', 'change', 'warn', 'warnscreenreader']);\n });\n }\n return Promise.resolve(false);\n },\n /**\n * Updates an existing timer\n * @param {String} id - the timer unique identifier\n * @param {Object} timer - the new timer\n * @return {Promise} resolves with the timer once updated or false\n *\n * @fires timerbox#timerchange something changes in a timer\n * @fires timerbox#timerupdate an existing timer is updated\n */\n updateTimer: function updateTimer(id, timer) {\n if (this.is('rendered') && typeof this.timers[id] !== 'undefined') {\n this.timers[id].remainingTime = timer.remainingTime;\n this.timers[id].unansweredQuestions = timer.unansweredQuestions;\n this.timers[id].extraTime = timer.extraTime;\n if (_.isNumber(timer.remainingWithoutExtraTime)) {\n this.timers[id].remainingWithoutExtraTime = timer.remainingWithoutExtraTime;\n }\n if (this.timers[id].countdown) {\n this.timers[id].countdown.update(timer.remainingTime, timer.unansweredQuestions);\n }\n this.trigger('timerchange', 'update', this.timers[id]);\n\n /**\n * A timer has been updated with external values\n * @event timerbox#timerupdate\n * @param {Object} timer\n */\n this.trigger('timerupdate', this.timers[id]);\n return Promise.resolve(this.timers[id]);\n }\n return Promise.resolve(false);\n },\n /**\n * Remove a timer\n * @param {String} id - the timer unique identifier\n * @return {Promise} resolves with the timer once removed or false\n *\n * @fires timerbox#timerchange something changes in a timer\n * @fires timerbox#timerremove a timer is removed\n */\n removeTimer: function removeTimer(id) {\n var self = this;\n if (this.is('rendered') && typeof this.timers[id] !== 'undefined') {\n return new Promise(function (resolve) {\n /**\n * Artifact function, remove the timer from the component index\n */\n var deindex = function deindex() {\n //keep a clone, without the component, for the event\n var removed = _.omit(self.timers[id], 'countdown');\n\n //remove the timer from the list\n self.timers = _.omit(self.timers, id);\n self.trigger('timerchange', 'remove', removed);\n\n /**\n * A timer has been updated with external values\n * @event timerbox#timerupdate\n * @param {Object} timer\n */\n self.trigger('timerremove', removed);\n resolve(removed);\n };\n if (self.timers[id].countdown) {\n self.timers[id].countdown.on('destroy', deindex).destroy();\n } else {\n deindex();\n }\n });\n }\n return Promise.resolve();\n },\n /**\n * Starts all the timers contained in the box\n * @returns {timerbox} chains\n */\n start: function start() {\n _.forEach(this.timers, function (timer) {\n if (timer.countdown) {\n timer.countdown.start();\n }\n });\n return this;\n },\n /**\n * Stops all the timers contained in the box\n * @returns {timerbox} chains\n */\n stop: function stop() {\n _.forEach(this.timers, function (timer) {\n if (timer.countdown) {\n timer.countdown.stop();\n }\n });\n return this;\n },\n /**\n * Show/hide the timers aka \"zen mode\"\n * @returns {timerbox} chains\n * @fires timerbox#zenchange\n */\n toggleZenMode: function toggleZenMode() {\n if (this.is('rendered') && this.config.zenMode.enabled) {\n if (this.is('zen')) {\n this.setState('zen', false);\n $zenModeToggler.attr('title', __('Hide timers'));\n } else {\n this.setState('zen', true);\n $zenModeToggler.attr('title', __('Show timers'));\n }\n\n /**\n * @event timerbox#zenchange\n * @param {Boolean} isZen\n */\n this.trigger('zenchange', this.is('zen'));\n }\n return this;\n }\n }, defaults).on('init', function () {\n //index the current timers\n this.timers = {};\n }).on('render', function () {\n var self = this;\n var $element = this.getElement();\n\n //where we append the countdowns components\n $countdownContainer = $$1('.timer-wrapper', $element);\n\n //set up the zen mode toggler\n if (this.config.zenMode.enabled) {\n $zenModeToggler = $$1('.timer-toggler', $element);\n self.setState('zen', !!self.config.zenMode.startHidden);\n $zenModeToggler.on('click', function (e) {\n e.preventDefault();\n self.toggleZenMode();\n });\n }\n\n //if timers are provided with the config, we perform the 1st update\n if (this.config.timers) {\n this.update(this.config.timers);\n }\n });\n timerbox.setTemplate(timerboxTpl);\n _.defer(function () {\n timerbox.init(config);\n });\n return timerbox;\n }\n\n return timerboxFactory;\n\n});\n\n","define('taoQtiTest/runner/plugins/controls/timer/strategy/enforcedStay',[],function () { 'use strict';\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2018-2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Timer strategy that enforce the test taker to stay in\n * front of the item until the timer completes,\n * by disabling the navigation elements.\n *\n * Applies on item scope, min timers if the testPart is linear\n *\n * @author Bertrand Chevrier \n */\n\n /**\n * Creates the strategy if it applies to the given timer\n * @param {runner} testRunner\n * @param {Object} timer\n * @returns {strategy|Boolean} the strategy if applies or false\n */\n function enforcedStayStrategy(testRunner, timer) {\n const testPart = testRunner.getCurrentPart();\n if (timer && timer.type === 'min' && timer.scope === 'item' && testPart && testPart.isLinear) {\n return {\n name: 'enforcedStay',\n /**\n * setUp entry point : disable the navigation\n */\n setUp: function setUp() {\n testRunner.on('enablenav.enforcestay', function () {\n testRunner.trigger('disablenav');\n });\n testRunner.trigger('disablenav');\n },\n /**\n * complete entry point : enables back the navigation\n */\n complete: function complete() {\n this.tearDown();\n testRunner.trigger('enablenav');\n },\n /**\n * tearDown entry point : remove the listeners\n */\n tearDown: function tearDown() {\n testRunner.off('enablenav.enforcestay');\n }\n };\n }\n return false;\n }\n\n return enforcedStayStrategy;\n\n});\n\n","define('taoQtiTest/runner/plugins/controls/timer/strategy/extraTime',['lodash'], function (_) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2018 (original work) Open Assessment Technologies SA ;\n */\n var precision = 1000;\n var lastConsumedExtraTime = 0;\n\n /**\n * Creates the strategy if it applies to the given timer\n * @param {runner} testRunner\n * @param {Object} timer\n * @returns {strategy|Boolean} the strategy if applies or false\n */\n function extraTimeStrategy(testRunner, timer) {\n /**\n * Apply the extra time to the timer 'once' and\n * listen for test movment to add the consumed extrat time as parameter\n * Since the extra time is global, if multiple timers use the extra time part,\n * we take the biggest consumed extra time.\n */\n var applyExtraTime = function applyExtraTime() {\n if (_.isNumber(timer.extraTime) && timer.extraTime > 0 && !timer.extraTimeSetup) {\n timer.extraTimeSetup = true;\n testRunner.before('move.extra skip.extra exit.extra timeout.extra', function () {\n var consumedExtraTime = 0;\n var testContext = testRunner.getTestContext();\n if (timer.remainingTime < timer.extraTime) {\n consumedExtraTime = Math.max(timer.extraTime - timer.remainingTime, 0) / precision;\n lastConsumedExtraTime = Math.max(consumedExtraTime, lastConsumedExtraTime, testContext.extraTime.consumed);\n testRunner.getProxy().addCallActionParams({\n consumedExtraTime: lastConsumedExtraTime\n });\n }\n }).after('move.extra skip.extra exit.extra timeout.extra', function () {\n lastConsumedExtraTime = 0;\n });\n }\n };\n if (timer && timer.type === 'max') {\n return {\n name: 'extraTime',\n /**\n * setUp entry point : adds the extratime to the timer\n */\n setUp: function setUp() {\n applyExtraTime();\n },\n /**\n * setUp entry point : adds the extratime to the timer\n */\n start: function start() {\n //apply at start also in case the extra time is added in between\n applyExtraTime();\n },\n /**\n * tearDown entry point : remove the listeners\n */\n tearDown: function tearDown() {\n testRunner.off('move.extra skip.extra exit.extra timeout.extra');\n }\n };\n }\n return false;\n }\n\n return extraTimeStrategy;\n\n});\n\n","define('taoQtiTest/runner/plugins/controls/timer/strategy/guidedNavigation',[],function () { 'use strict';\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2018-2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Timer strategy that enforce the test taker to stay in\n * front of the item until the timer completes,\n * by hidding the navigation elements.\n * Once the timer completes, the test moves to the next item.\n *\n * Applies on item scope, locked timers only, linear test part and\n * the test configuration \"guidedNavigation\"\n *\n * @author Bertrand Chevrier \n */\n\n /**\n * Creates the strategy if it applies to the given timer\n * @param {runner} testRunner\n * @param {Object} timer\n * @returns {strategy|Boolean} the strategy if applies or false\n */\n function guidedNavigationStrategy(testRunner, timer) {\n const testRunnerOptions = testRunner.getOptions();\n const testPart = testRunner.getCurrentPart();\n if (timer && timer.type === 'locked' && timer.scope === 'item' && testRunnerOptions.guidedNavigation === true && testPart && testPart.isLinear) {\n return {\n name: 'guidedNavigation',\n /**\n * setUp entry point : hides the navigation\n */\n setUp: function setUp() {\n testRunner.trigger('hidenav');\n },\n /**\n * complete entry point : enables back the navigation\n */\n complete: function complete() {\n testRunner.trigger('disableitem disablenav shownav');\n setTimeout(function () {\n testRunner.trigger('move', 'next', 'item');\n }, 500);\n }\n };\n }\n return false;\n }\n\n return guidedNavigationStrategy;\n\n});\n\n","define('taoQtiTest/runner/plugins/controls/timer/strategy/timeout',[],function () { 'use strict';\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2018 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Timeout strategy, the given scope is timedout when the timer completes.\n *\n * Applies on all max timers\n *\n * @author Bertrand Chevrier \n */\n\n /**\n * Creates the strategy if it applies to the given timer\n * @param {runner} testRunner\n * @param {Object} timer\n * @returns {strategy|Boolean} the strategy if applies or false\n */\n function timeoutStrategy(testRunner, timer) {\n if (timer && timer.type === 'max') {\n return {\n name: 'timeout',\n /**\n * complete entry point : timeout\n */\n complete: function complete() {\n if (timer.qtiClassName && timer.source) {\n return testRunner.timeout(timer.qtiClassName, timer.source, timer);\n }\n }\n };\n }\n return false;\n }\n\n return timeoutStrategy;\n\n});\n\n","define('taoQtiTest/runner/helpers/currentItem',['lodash'], function (_) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * List of QTI model cardinalities\n * @type {Object}\n */\n var responseCardinalities = {\n single: 'base',\n multiple: 'list',\n ordered: 'list',\n record: 'record'\n };\n\n /**\n * List of QTI interaction minConstraint properties\n * @type {Object}\n */\n var interactionMinConstraintProperties = {\n matchInteraction: 'minAssociations',\n choiceInteraction: 'minChoices',\n orderInteraction: 'minChoices',\n associateInteraction: 'minAssociations',\n hottextInteraction: 'minChoices',\n hotspotInteraction: 'minChoices',\n graphicOrderInteraction: 'minChoices',\n graphicAssociateInteraction: 'minAssociations',\n selectPointInteraction: 'minChoices'\n };\n\n /**\n * @typedef {currentItemHelper}\n */\n var currentItemHelper = {\n /**\n * Gets the responses declarations of the current item.\n * @param {Object} runner - testRunner instance\n * @returns {Object}\n */\n getDeclarations: function getDeclarations(runner) {\n var itemRunner = runner.itemRunner;\n return itemRunner._item && itemRunner._item.responses;\n },\n /**\n * Gets a response declaration by the identifier of the response\n * @param {Object} runner - testRunner instance\n * @param {String} identifier - The identifier of the response\n * @returns {Object|null}\n */\n getResponseDeclaration: function getResponseDeclaration(runner, identifier) {\n var found = null;\n _.forEach(currentItemHelper.getDeclarations(runner), function (declaration) {\n var attributes = declaration.attributes || {};\n if (attributes.identifier === identifier) {\n found = declaration;\n return false;\n }\n });\n return found;\n },\n /**\n * Convert a value to a response object\n * @param {Array|String} value\n * @param {String} baseType\n * @param {String} cardinality\n * @returns {Object}\n */\n toResponse: function toResponse(value, baseType, cardinality) {\n var mappedCardinality = responseCardinalities[cardinality];\n var response = {};\n if (_.isString(value) || _.isNumber(value)) {\n value = [value];\n }\n let transform = v => v;\n if (baseType === 'boolean') {\n transform = v => v === true || v === 'true';\n } else if (baseType === 'integer') {\n transform = v => typeof v === 'number' ? v : parseInt(v);\n } else if (baseType === 'float') {\n transform = v => typeof v === 'number' ? v : parseFloat(v);\n } else if (baseType === 'directedPair' || baseType === 'pair') {\n transform = v => {\n if (_.isString(v)) {\n return v.split(' ');\n }\n return v;\n };\n }\n value = _.map(value || [], transform);\n if (mappedCardinality) {\n if (mappedCardinality === 'base') {\n if (value.length === 0) {\n //return empty response:\n response.base = null;\n } else {\n response.base = {};\n response.base[baseType] = value[0];\n }\n } else {\n response[mappedCardinality] = {};\n response[mappedCardinality][baseType] = value;\n }\n }\n return response;\n },\n /**\n * Checks if the provided value can be considered as null\n * @param {Object} value\n * @param {String} baseType\n * @param {String} cardinality\n * @returns {boolean}\n */\n isQtiValueNull: function isQtiValueNull(value, baseType, cardinality) {\n var mappedCardinality = responseCardinalities[cardinality];\n if (_.isObject(value) && value[mappedCardinality] === null) {\n value = null;\n }\n if (_.isObject(value) && value[mappedCardinality] && 'undefined' !== typeof value[mappedCardinality][baseType]) {\n value = value[mappedCardinality][baseType];\n }\n const stringyValue = 'string' === baseType || 'integer' === baseType || 'float' === baseType;\n return null === value || stringyValue && value === '' || cardinality !== 'single' && _.isEmpty(value);\n },\n /**\n * Tells if an item question has been answered or not\n * @param {Object} response\n * @param {String} baseType\n * @param {String} cardinality\n * @param {Object} [defaultValue]\n * @param {Object} constraintValue\n * @returns {*}\n */\n isQuestionAnswered: function isQuestionAnswered(response, baseType, cardinality, defaultValue, constraintValue) {\n var answered, currentCardinality, responses;\n var fullyAnswered = true;\n defaultValue = _.isUndefined(defaultValue) ? null : defaultValue;\n constraintValue = constraintValue || 0;\n if (currentItemHelper.isQtiValueNull(response, baseType, cardinality)) {\n answered = false;\n } else {\n answered = !_.isEqual(response, currentItemHelper.toResponse(defaultValue, baseType, cardinality));\n if (constraintValue !== 0) {\n currentCardinality = responseCardinalities[cardinality];\n responses = response[currentCardinality][baseType] || [];\n fullyAnswered = responses && responses.length >= constraintValue;\n }\n answered = answered && fullyAnswered;\n }\n return answered;\n },\n guessInteractionConstraintValues: function guessInteractionConstraintValues(runner) {\n var itemRunner = runner.itemRunner;\n var itemBody = itemRunner._item && itemRunner._item.bdy || {};\n var interactions = itemBody.elements || {};\n var constraintValues = {};\n _.forEach(interactions, function (interaction) {\n var attributes = interaction.attributes || {};\n var qtiClass = interaction.__proto__.qtiClass;\n var constraintProperty;\n if (Object.prototype.hasOwnProperty.call(interactionMinConstraintProperties, qtiClass)) {\n constraintProperty = interactionMinConstraintProperties[qtiClass];\n constraintValues[attributes.responseIdentifier] = attributes[constraintProperty];\n }\n });\n return constraintValues;\n },\n /**\n * Tells is the current item has been answered or not\n * The item is considered answered when at least one response has been set to not empty {base : null}\n * @param {Object} runner - testRunner instance\n * @param {Boolean} [partially=true] - if false all questions must have been answered\n * @returns {Boolean}\n */\n isAnswered: function isAnswered(runner, partially) {\n var itemRunner = runner.itemRunner;\n var responses = itemRunner && itemRunner.getResponses();\n var count = 0;\n var empty = 0;\n var declarations, constraintValues;\n if (itemRunner) {\n declarations = currentItemHelper.getDeclarations(runner);\n constraintValues = currentItemHelper.guessInteractionConstraintValues(runner);\n _.forEach(declarations, function (declaration) {\n var attributes = declaration.attributes || {};\n var response = responses[attributes.identifier];\n var baseType = attributes.baseType;\n var cardinality = attributes.cardinality;\n count++;\n if (!currentItemHelper.isQuestionAnswered(response, baseType, cardinality, declaration.defaultValue, constraintValues[attributes.identifier])) {\n empty++;\n }\n });\n }\n if (partially === false) {\n return count > 0 && empty === 0;\n }\n return count > 0 && empty < count;\n },\n /**\n * Gets list of shared stimuli hrefs in the current item\n *\n * @param {Object} runner - testRunner instance\n * @returns {Array}\n */\n getStimuliHrefs: function getStimuliHrefs(runner) {\n var itemRunner = runner.itemRunner;\n var itemBody = itemRunner._item && itemRunner._item.bdy || {};\n var interactions = itemBody.elements || {};\n return _(interactions).values().filter(function (element) {\n return element.qtiClass === 'include';\n }).value().map(val => val.attributes ? val.attributes.href : null);\n },\n /**\n * Find the list of text stimulus ids in the current item\n * Depends on the DOM already being loaded\n * @param {Object} runner - testRunner instance\n * @returns {Array}\n */\n getTextStimuliHrefs: function getTextStimuliHrefs(runner) {\n var stimuli = this.getStimuliHrefs(runner);\n var textStimuli;\n if (stimuli.length > 0) {\n // Filter the ones containing text:\n textStimuli = stimuli.filter(function (stimulusHref) {\n var domNode = document.querySelector(`.qti-include[data-href=\"${stimulusHref}\"]`);\n return _(domNode.childNodes).some(function (child) {\n return child.nodeType === child.TEXT_NODE;\n });\n });\n return textStimuli;\n }\n return [];\n }\n };\n\n return currentItemHelper;\n\n});\n\n","define('taoQtiTest/runner/helpers/stats',['lodash', 'taoQtiTest/runner/helpers/map', 'taoQtiTest/runner/helpers/currentItem'], function (_, mapHelper, currentItemHelper) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n currentItemHelper = currentItemHelper && Object.prototype.hasOwnProperty.call(currentItemHelper, 'default') ? currentItemHelper['default'] : currentItemHelper;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2019 (original work) Open Assessment Technologies SA ;\n */\n var stats = {\n /**\n * Return scope stats that takes into account any test taker interaction made since the item has been loaded\n * @param {String} scope - scope to consider for calculating the stats\n * @param {Object} runner - testRunner instance\n * @param {Boolean} sync - flag for sync the unanswered stats in exit message and the unanswered stats in the toolbox. Default false\n * @returns {Object} the stats\n */\n getInstantStats(scope, runner, sync) {\n const map = runner.getTestMap();\n const context = runner.getTestContext();\n const item = runner.getCurrentItem();\n const testPart = runner.getCurrentPart();\n const stats = _.clone(mapHelper.getScopeStats(map, context.itemPosition, scope));\n const options = runner.getOptions() || {};\n let partiallyAnsweredIsAnswered;\n if (options.review) {\n partiallyAnsweredIsAnswered = options.review.partiallyAnsweredIsAnswered;\n }\n if (!item.informational) {\n const isItemCurrentlyAnswered = currentItemHelper.isAnswered(runner, partiallyAnsweredIsAnswered);\n if (!isItemCurrentlyAnswered && item.answered) {\n stats.answered--;\n } else if ((isItemCurrentlyAnswered || sync) && !item.answered) {\n stats.answered++;\n // eslint-disable-next-line no-dupe-else-if\n } else if (sync && !isItemCurrentlyAnswered && item.answered && testPart.isLinear) {\n stats.answered++;\n }\n }\n return stats;\n }\n };\n\n return stats;\n\n});\n\n","define('taoQtiTest/runner/helpers/messages',['i18n', 'taoQtiTest/runner/helpers/stats', 'handlebars', 'lib/handlebars/helpers'], function (__, statsHelper, Handlebars, Helpers0) { 'use strict';\n\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n statsHelper = statsHelper && Object.prototype.hasOwnProperty.call(statsHelper, 'default') ? statsHelper['default'] : statsHelper;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var stack1, functionType=\"function\", escapeExpression=this.escapeExpression, self=this;\n\n function program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\";\n if (helper = helpers.header) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.header); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"

          \";\n return buffer;\n }\n\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.header), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { return stack1; }\n else { return ''; }\n });\n function messageHeaderTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2021 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Completes an exit message\n * @param {String} scope - scope to consider for calculating the stats\n * @param {Object} runner - testRunner instance\n * @param {String} message - custom message that will be appended to the unanswered stats count\n * @param {Boolean} sync - flag for sync the unanswered stats in exit message and the unanswered stats in the toolbox\n * @param {String|undefined} submitButtonLabel - point the user to the submit button\n * @returns {String} Returns the message text\n */\n function getExitMessage(scope, runner) {\n let message = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n let sync = arguments.length > 3 ? arguments[3] : undefined;\n let submitButtonLabel = arguments.length > 4 ? arguments[4] : undefined;\n let itemsCountMessage = '';\n const testRunnerOptions = runner.getOptions();\n const messageEnabled = testRunnerOptions.enableUnansweredItemsWarning;\n if (messageEnabled) {\n itemsCountMessage = getUnansweredItemsWarning(scope, runner, sync).trim();\n if (itemsCountMessage) {\n itemsCountMessage += '.';\n }\n }\n return `${getHeader(scope)}${itemsCountMessage} ${getActionMessage(scope, submitButtonLabel)}${message}`.trim();\n }\n\n /**\n * Build message if not all items have answers\n * @param {String} scope - scope to consider for calculating the stats\n * @returns {String} Returns the message text\n */\n function getHeader(scope) {\n let header = '';\n if (scope === 'section' || scope === 'testSection') {\n header = __('You are about to leave this section.');\n } else if (scope === 'test' || scope === 'testWithoutInaccessibleItems') {\n header = __('You are about to submit the test.');\n } else if (scope === 'part') {\n header = __('You are about to submit this test part.');\n }\n return messageHeaderTpl({\n header: header.trim()\n });\n }\n\n /**\n * Generates the message to help users perform the action\n * @param {String} scope - scope to consider for calculating the stats\n * @param {String} [submitButtonLabel] - Pointed user perform click on given button\n * @returns {String} Returns the message text\n */\n function getActionMessage(scope) {\n let submitButtonLabel = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : __('OK');\n var msg;\n switch (scope) {\n case 'section':\n case 'testSection':\n case 'part':\n return __('Click \"%s\" to continue.', submitButtonLabel).trim();\n case 'test':\n case 'testWithoutInaccessibleItems':\n msg = __('You will not be able to access this test once submitted. Click \"%s\" to continue and submit the test.', submitButtonLabel);\n return `${msg}`;\n }\n return '';\n }\n\n /**\n * Build message for the flagged items if any.\n * @param {Object} stats - The stats for the current context\n * @param {String} [message] - The existing message to complete\n * @returns {string|*}\n */\n function getFlaggedItemsWarning(stats) {\n let message = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n const flaggedCount = stats && stats.flagged;\n if (!flaggedCount) {\n return message;\n }\n if (message) {\n return `${message} ${__('and you flagged %s item(s) that you can review now', flaggedCount.toString())}`;\n }\n return __('You flagged %s item(s) that you can review now', flaggedCount.toString());\n }\n\n /**\n * Build message if not all items have answers\n * @param {String} scope - scope to consider for calculating the stats\n * @param {Object} runner - testRunner instance\n * @param {Boolean} sync - flag for sync the unanswered stats in exit message and the unanswered stats in the toolbox. Default false\n * @returns {String} Returns the message text\n */\n function getUnansweredItemsWarning(scope, runner, sync) {\n const stats = statsHelper.getInstantStats(scope, runner, sync);\n const unansweredCount = stats && stats.questions - stats.answered;\n const flaggedCount = stats && stats.flagged;\n let itemsCountMessage = '';\n if (scope === 'section' || scope === 'testSection') {\n itemsCountMessage = __('You answered %s of %s question(s) for this section of the test', stats.answered.toString(), stats.questions.toString());\n if (flaggedCount) {\n itemsCountMessage += `, ${__('and flagged %s of them', flaggedCount.toString())}`;\n }\n } else if (scope === 'test' || scope === 'testWithoutInaccessibleItems') {\n if (unansweredCount > 1) {\n itemsCountMessage = __('There are %s unanswered questions', unansweredCount.toString());\n } else if (unansweredCount === 1) {\n itemsCountMessage = __('There is %s unanswered question', unansweredCount.toString());\n }\n if (flaggedCount) {\n itemsCountMessage = getFlaggedItemsWarning(stats, itemsCountMessage);\n }\n } else if (scope === 'part') {\n if (unansweredCount > 1) {\n itemsCountMessage = __('There are %s unanswered questions in this part of the test', unansweredCount.toString());\n } else if (unansweredCount === 1) {\n itemsCountMessage = __('There is %s unanswered question in this part of the test', unansweredCount.toString());\n }\n if (flaggedCount) {\n itemsCountMessage = getFlaggedItemsWarning(stats, itemsCountMessage);\n }\n }\n itemsCountMessage = itemsCountMessage.trim();\n return itemsCountMessage;\n }\n var messages = {\n getExitMessage: getExitMessage\n };\n\n return messages;\n\n});\n\n","define('taoQtiTest/runner/config/states',[],function () { 'use strict';\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * The possible states\n * @author Bertrand Chevrier \n */\n var states = {\n //the test session states\n testSession: Object.freeze({\n initial: 0,\n interacting: 1,\n modalFeedback: 2,\n suspended: 3,\n closed: 4\n }),\n //the item session states\n itemSession: Object.freeze({\n initial: 0,\n interacting: 1,\n modalFeedback: 2,\n suspended: 3,\n closed: 4,\n solution: 5,\n notSelected: 255\n })\n };\n\n return states;\n\n});\n\n","define('taoQtiTest/runner/plugins/controls/timer/strategy/warnSectionLeaving',['lodash', 'i18n', 'taoQtiTest/runner/helpers/messages', 'taoQtiTest/runner/helpers/navigation', 'taoQtiTest/runner/config/states', 'taoQtiTest/runner/helpers/map'], function (_, __, messages, navigationHelper, states, mapHelper) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n messages = messages && Object.prototype.hasOwnProperty.call(messages, 'default') ? messages['default'] : messages;\n navigationHelper = navigationHelper && Object.prototype.hasOwnProperty.call(navigationHelper, 'default') ? navigationHelper['default'] : navigationHelper;\n states = states && Object.prototype.hasOwnProperty.call(states, 'default') ? states['default'] : states;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2018-2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * The message to display when exiting\n */\n var exitMessage = __('Once you close this section, you cannot return to it or change your answers.');\n\n /**\n * Creates the strategy if it applies to the given timer\n * @param {runner} testRunner\n * @param {Object} timer\n * @returns {strategy|Boolean} the strategy if applies or false\n */\n function warnSectionLeavingStrategy(testRunner, timer) {\n /**\n * Check if the movment leads to leaving an active timed section\n * @param {String} direction - the move direction (next, previous or jump)\n * @param {String} scope - the move scope (item, section, testPart)\n * @param {Number} [position] - the position in case of jump\n * @returns {Boolean}\n */\n var leaveTimedSection = function leaveTimedSection(direction, scope, position) {\n var context = testRunner.getTestContext();\n var map = testRunner.getTestMap();\n if (!context.isTimeout && context.itemSessionState !== states.itemSession.closed && context.sectionId === timer.source) {\n return navigationHelper.isLeavingSection(context, map, direction, scope, position);\n }\n return false;\n };\n if (timer && timer.scope === 'section' && timer.type === 'max') {\n return {\n name: 'warnSectionLeaving',\n /**\n * setUp entry point : blocks the move to display a message if needed\n */\n setUp: function setUp() {\n testRunner.off('move.warntimedsection skip.warntimedsection').before('move.warntimedsection skip.warntimedsection', function (e, type, scope, position) {\n const testContext = testRunner.getTestContext();\n const testMap = testRunner.getTestMap();\n const testRunnerOptions = testRunner.getOptions();\n const timerConfig = testRunnerOptions.timer || {};\n const itemIdentifier = testContext.itemIdentifier;\n const isLast = navigationHelper.isLast(testMap, itemIdentifier);\n const endTestWarning = mapHelper.hasItemCategory(testMap, itemIdentifier, 'endTestWarning', true);\n const noExitTimedSectionWarning = mapHelper.hasItemCategory(testMap, itemIdentifier, 'noExitTimedSectionWarning', true);\n var movePromise = new Promise(function (resolve, reject) {\n // endTestWarning has already been displayed, so we don't repeat the warning\n if (isLast && endTestWarning) {\n resolve();\n // display a message if we exit a timed section\n } else if (leaveTimedSection(type || 'next', scope, position) && !noExitTimedSectionWarning && !timerConfig.keepUpToTimeout) {\n const submitButtonLabel = __('Close this Section');\n testRunner.trigger('confirm.exittimed', messages.getExitMessage('section', testRunner, exitMessage, false, submitButtonLabel), resolve, reject, {\n buttons: {\n labels: {\n ok: submitButtonLabel,\n cancel: __('Review my Answers')\n }\n }\n });\n } else {\n resolve();\n }\n });\n movePromise.catch(function cancelMove() {\n // Use `defer` to be sure the timer resume will occur after the move event is\n // finished to be handled. Otherwise, the duration plugin will be frozen and\n // the additional time will not be taken into account!\n _.defer(function () {\n testRunner.trigger('enableitem enablenav');\n });\n });\n return movePromise;\n });\n },\n /**\n * complete entry point : removes the listeners\n */\n complete: function complete() {\n return this.tearDown();\n },\n /**\n * tearDown entry point : removes the listeners\n */\n tearDown: function tearDown() {\n testRunner.off('move.warntimedsection skip.warntimedsection');\n }\n };\n }\n return false;\n }\n\n return warnSectionLeavingStrategy;\n\n});\n\n","define('taoQtiTest/runner/plugins/controls/timer/strategy/strategyHandler',['lodash', 'taoQtiTest/runner/plugins/controls/timer/strategy/enforcedStay', 'taoQtiTest/runner/plugins/controls/timer/strategy/extraTime', 'taoQtiTest/runner/plugins/controls/timer/strategy/guidedNavigation', 'taoQtiTest/runner/plugins/controls/timer/strategy/timeout', 'taoQtiTest/runner/plugins/controls/timer/strategy/warnSectionLeaving'], function (_, extraTimeStrategy, enforcedStayStrategy, guidedNavigationStrategy, timeoutStrategy, warnSectionLeavingStrategy) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n extraTimeStrategy = extraTimeStrategy && Object.prototype.hasOwnProperty.call(extraTimeStrategy, 'default') ? extraTimeStrategy['default'] : extraTimeStrategy;\n enforcedStayStrategy = enforcedStayStrategy && Object.prototype.hasOwnProperty.call(enforcedStayStrategy, 'default') ? enforcedStayStrategy['default'] : enforcedStayStrategy;\n guidedNavigationStrategy = guidedNavigationStrategy && Object.prototype.hasOwnProperty.call(guidedNavigationStrategy, 'default') ? guidedNavigationStrategy['default'] : guidedNavigationStrategy;\n timeoutStrategy = timeoutStrategy && Object.prototype.hasOwnProperty.call(timeoutStrategy, 'default') ? timeoutStrategy['default'] : timeoutStrategy;\n warnSectionLeavingStrategy = warnSectionLeavingStrategy && Object.prototype.hasOwnProperty.call(warnSectionLeavingStrategy, 'default') ? warnSectionLeavingStrategy['default'] : warnSectionLeavingStrategy;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2018 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * The list of available strategies\n * TODO this list could come from the configuration\n */\n var defaultAvailableStrategies = [extraTimeStrategy, enforcedStayStrategy, guidedNavigationStrategy, timeoutStrategy, warnSectionLeavingStrategy];\n\n /**\n * Get a strategyHandler object for a testRunner instance\n * @param {runner} testRunner - the test runner instance\n * @param {strategy[]} strategies - the list of available strategies, to override the defaults\n * @returns {strategyHandler} the handler\n */\n function getStrategyHandler(testRunner, strategies) {\n var strategyHandler;\n\n /**\n * To keep track of the active strategies, per timer\n */\n var actives = {};\n\n /**\n * Artifact function to apply an action to a list of strategy\n * @param {String} timerId - the id of the timer to run the actions against\n * @param {String} action -\n */\n var applyToStrategies = function applyToStrategies(timerId, action) {\n var api = _.keys(strategyHandler);\n if (_.isEmpty(timerId) || _.isEmpty(action) || !api.includes(action)) {\n throw new TypeError('Invalid timer id or unauthorized action');\n }\n if (!_.isArray(actives[timerId])) {\n return Promise.resolve();\n }\n return Promise.all(_.map(actives[timerId], function (strategy) {\n if (_.isFunction(strategy[action])) {\n return strategy[action]();\n }\n }));\n };\n var availableStrategies = strategies || defaultAvailableStrategies;\n\n //quick validation of the test runner\n if (!testRunner || !_.isFunction(testRunner.on) || !_.isFunction(testRunner.getTestContext)) {\n throw new TypeError('The strategy handler needs a valid test runner.');\n }\n\n /**\n * @typedef {Object} strategyHandler\n */\n strategyHandler = {\n /**\n * Try to set up strategies for the given timer\n * @param {Object} timer\n * @returns {Promise} resolves once the set up is done\n */\n setUp: function setUp(timer) {\n _.forEach(availableStrategies, function (availableStrategy) {\n var strategy = availableStrategy(testRunner, timer);\n if (strategy !== false) {\n actives[timer.id] = actives[timer.id] || [];\n actives[timer.id].push(strategy);\n }\n });\n return applyToStrategies(timer.id, 'setUp');\n },\n /**\n * Get the actives strategies for the given timer\n * @returns {strategy[]} the actives strategies\n */\n getActives: function getActives(timer) {\n if (timer && timer.id && _.isArray(actives[timer.id])) {\n return actives[timer.id];\n }\n return [];\n },\n /**\n * Call the timer's strategies \"start\"\n * @param {Object} timer\n * @returns {Promise}\n */\n start: function start(timer) {\n return applyToStrategies(timer.id, 'start');\n },\n /**\n * Call the timer's strategies \"stop\"\n * @param {Object} timer\n * @returns {Promise}\n */\n stop: function stop(timer) {\n return applyToStrategies(timer.id, 'stop');\n },\n /**\n * Call the timer's strategies \"complete\"\n * @param {Object} timer\n * @returns {Promise}\n */\n complete: function complete(timer) {\n return applyToStrategies(timer.id, 'complete');\n },\n /**\n * Call the timer's strategies \"tearDown\"\n * will also un-reference the strategies\n * @param {Object} timer\n * @returns {Promise}\n */\n tearDown: function tearDown(timer) {\n return applyToStrategies(timer.id, 'tearDown').then(function () {\n actives = _.omit(actives, timer.id);\n });\n }\n };\n return strategyHandler;\n }\n\n return getStrategyHandler;\n\n});\n\n","define('taoQtiTest/runner/plugins/controls/timer/timers',['lodash', 'i18n', 'moment', 'core/format', 'core/logger'], function (_, __, moment, format, loggerFactory) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n moment = moment && Object.prototype.hasOwnProperty.call(moment, 'default') ? moment['default'] : moment;\n format = format && Object.prototype.hasOwnProperty.call(format, 'default') ? format['default'] : format;\n loggerFactory = loggerFactory && Object.prototype.hasOwnProperty.call(loggerFactory, 'default') ? loggerFactory['default'] : loggerFactory;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2018 (original work) Open Assessment Technologies SA ;\n */\n var logger = loggerFactory('taoQtiTest/runner/plugins/controls/timer/timers');\n\n /**\n * We receive values in seconds, so we convert them to milliseconds\n */\n var precision = 1000;\n\n /**\n * The timer's scope\n */\n var scopes = ['item', 'section', 'testPart', 'test'];\n\n /**\n * Map qti class names to scopes\n */\n var scopeMapping = {\n assessmentTest: 'test',\n assessmentSection: 'section',\n assessmentItemRef: 'item'\n };\n\n /**\n * helps you get the scope from a scope or qti class name\n * @param {String} value - scope or qti class name\n * @returns {String?} the scope\n */\n var getScope = function getScope(value) {\n if (scopeMapping[value]) {\n return scopeMapping[value];\n }\n if (scopes.includes(value)) {\n return value;\n }\n return null;\n };\n\n /**\n * The text of warning messages\n * TODO add warning messages for other timers types\n */\n var warningMessages = {\n item: __('Warning – You have %s remaining to complete this item.'),\n section: __('Warning – You have %s remaining to complete this section.'),\n testPart: __('Warning – You have %s remaining to complete this test part.'),\n test: __('Warning – You have %s remaining to complete this test.')\n };\n\n /**\n * The text of warning messages for screenreader\n */\n const warningMessagesForScreenraeder = {\n item: __('You have %s remaining to complete the current item.'),\n section: __('You have %s left to answer remaining %s questions.'),\n testPart: __('You have %s left to answer remaining %s questions.'),\n test: __('You have %s left to answer remaining %s questions.')\n };\n\n /**\n * Get the timers objects from the time constraints andt the given config\n * @param {Object[]} timeConstraints - as defined in the testContext\n * @param {Boolean} isLinear - is the current navigation mode linear\n * @param {Object} [config] - timers config\n * @param {Object[]} [config.warnings] - the warnings to apply to the timers (max only for now)\n * @param {Object[]} [config.warnings] - the warnings to apply to the timers (max only for now)\n * @returns {timer[]} the timers\n */\n function getTimers(timeConstraints, isLinear, config) {\n var timers = {};\n\n /**\n * The warnings comes in a weird format (ie. {scope:{threshold:level}}) , so we reformat them\n */\n var constraintsWarnings = _.reduce(config.warnings, function (acc, warnings, qtiScope) {\n var scope = getScope(qtiScope);\n acc[scope] = _.map(warnings, function (value, key) {\n return {\n threshold: parseInt(key, 10) * precision,\n message: function applyMessage(remainingTime) {\n var displayRemaining = moment.duration(remainingTime / precision, 'seconds').humanize();\n return format(warningMessages[scope], displayRemaining);\n },\n level: value,\n shown: false\n };\n });\n return acc;\n }, {});\n\n /**\n * The warnings comes in a weird format (ie. {scope:[threshold, ...]}) , so we reformat them\n */\n const constraintsWarningsForScreenreader = _.reduce(config.warningsForScreenreader, (acc, warnings, qtiScope) => {\n const scope = getScope(qtiScope);\n acc[scope] = _.map(warnings, value => ({\n threshold: parseInt(value, 10) * precision,\n message: function applyMessage(remainingTime, unansweredQuestions) {\n const displayRemaining = moment.duration(remainingTime / precision, 'seconds').humanize();\n return format(warningMessagesForScreenraeder[scope], displayRemaining, unansweredQuestions);\n },\n scope,\n shown: false\n }));\n return acc;\n }, {});\n\n /**\n * Build a timer of a given type from a time constraints\n * @param {String} type - min, max, locked\n * @param {Object} constraintData\n * @returns {timer} timer\n */\n var buildTimer = function buildTimer(type, constraintData) {\n /**\n * @typedef {Object} timer\n * @property {String} id - identify the timer (for max, it's the source for backward compat)\n * @property {String} type - min, max or locked\n * @property {String} label - the title to display\n * @property {String} scope - the timer's scope (item, section, etc.)\n * @property {String} qtiClassName - the QTI class of the timers applies to\n * @property {String} source - the ID of the element the timers belongs to\n * @property {Number} extraTime - additional time data, object\n * @property {Number} originalTime - the starting value of the timer, never changes, in ms.\n * @property {Number} remainingTime - current value, in ms.\n * @property {Number} remainingWithoutExtraTime - remaining time without extra time, in ms.\n * @property {Number} total - total time (original time + extra time), in ms.\n */\n var timer = _.pick(constraintData, ['label', 'scope', 'source', 'extraTime', 'qtiClassName']);\n timer.type = type;\n timer.allowLateSubmission = constraintData.allowLateSubmission;\n if (type === 'min') {\n timer.id = `${type}-${constraintData.scope}-${constraintData.source}`;\n timer.originalTime = constraintData.minTime * precision;\n timer.remainingTime = constraintData.minTimeRemaining * precision;\n } else {\n timer.id = constraintData.source;\n timer.originalTime = constraintData.maxTime * precision;\n timer.remainingTime = constraintData.maxTimeRemaining * precision;\n }\n timer.remainingWithoutExtraTime = timer.remainingTime;\n if (timer.extraTime && timer.type !== 'min') {\n timer.extraTime.consumed = timer.extraTime.consumed * precision;\n timer.extraTime.remaining = timer.extraTime.remaining * precision;\n timer.extraTime.total = timer.extraTime.total * precision;\n timer.total = timer.originalTime + timer.extraTime.total;\n timer.remainingTime += timer.extraTime.remaining;\n }\n\n //TODO supports warnings for other types\n if (type === 'max' && _.isArray(constraintsWarnings[timer.scope])) {\n timer.warnings = constraintsWarnings[timer.scope];\n }\n if (_.isArray(constraintsWarningsForScreenreader[timer.scope])) {\n timer.warningsForScreenreader = constraintsWarningsForScreenreader[timer.scope];\n }\n const stats = config.questionsStats[timer.scope];\n timer.unansweredQuestions = stats && stats.questions - stats.answered;\n return timer;\n };\n _.forEach(timeConstraints, function (timeConstraint) {\n var constraintData = _.clone(timeConstraint);\n var newTimer;\n constraintData.scope = getScope(timeConstraint.scope || timeConstraint.qtiClassName);\n if (!constraintData.scope) {\n logger.warn('Wrong data, a time constraint should apply to a valid scope, skipping');\n } else if (constraintData.minTime === false && constraintData.maxTime === false) {\n logger.warn('Time constraint defined with no time, skipping');\n\n // minTime = maxTime -> one locked timer\n } else if (config.guidedNavigation && isLinear && constraintData.maxTime && constraintData.minTime && constraintData.minTime === constraintData.maxTime && constraintData.maxTime > 0) {\n newTimer = buildTimer('locked', constraintData);\n timers[newTimer.id] = newTimer;\n } else {\n //minTime -> min timer\n if (isLinear && constraintData.minTime && constraintData.minTime > 0) {\n newTimer = buildTimer('min', constraintData);\n timers[newTimer.id] = newTimer;\n }\n\n //maxTime -> max timer\n if (constraintData.maxTime && constraintData.maxTime > 0) {\n newTimer = buildTimer('max', constraintData);\n timers[newTimer.id] = newTimer;\n }\n }\n });\n logger.debug('Timers built from timeConstraints', timers);\n return timers;\n }\n\n return getTimers;\n\n});\n\n","define('taoQtiTest/runner/plugins/controls/timer/plugin',['jquery', 'lodash', 'taoTests/runner/plugin', 'taoQtiTest/runner/plugins/controls/timer/strategy/strategyHandler', 'taoQtiTest/runner/plugins/controls/timer/component/timerbox', 'taoQtiTest/runner/plugins/controls/timer/timers', 'taoQtiTest/runner/helpers/isReviewPanelEnabled', 'taoQtiTest/runner/helpers/stats', 'handlebars', 'lib/handlebars/helpers'], function ($$1, _, pluginFactory, getStrategyHandler, timerboxFactory, timersFactory, isReviewPanelEnabled, statsHelper, Handlebars, Helpers0) { 'use strict';\n\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n getStrategyHandler = getStrategyHandler && Object.prototype.hasOwnProperty.call(getStrategyHandler, 'default') ? getStrategyHandler['default'] : getStrategyHandler;\n timerboxFactory = timerboxFactory && Object.prototype.hasOwnProperty.call(timerboxFactory, 'default') ? timerboxFactory['default'] : timerboxFactory;\n timersFactory = timersFactory && Object.prototype.hasOwnProperty.call(timersFactory, 'default') ? timersFactory['default'] : timersFactory;\n isReviewPanelEnabled = isReviewPanelEnabled && Object.prototype.hasOwnProperty.call(isReviewPanelEnabled, 'default') ? isReviewPanelEnabled['default'] : isReviewPanelEnabled;\n statsHelper = statsHelper && Object.prototype.hasOwnProperty.call(statsHelper, 'default') ? statsHelper['default'] : statsHelper;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); \n\n\n return \"
          \\n\";\n });\n function screenreaderNotificationTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2018-2019 (original work) Open Assessment Technologies SA ;\n */\n\n // timeout after which screenreader notifcation should be cleaned up\n const screenreaderNotificationTimeout = 20000;\n\n /**\n * Creates the plugin\n */\n var plugin = pluginFactory({\n name: 'timer',\n /**\n * Install step, add behavior before the lifecycle\n */\n install() {\n const testRunner = this.getTestRunner();\n\n /**\n * Load the timers, from the given timeConstraints and reading the current value in the store\n * @param {store} timeStore - where the values are read\n * @param {Object} config - the current config, especially for the warnings\n * @returns {Promise} the list of timers for the current context\n */\n this.loadTimers = function loadTimers(timeStore, config) {\n const testContext = testRunner.getTestContext();\n const testPart = testRunner.getCurrentPart();\n const isLinear = testPart && testPart.isLinear;\n const timeConstraints = testContext.timeConstraints;\n const timers = timersFactory(timeConstraints, isLinear, config);\n return Promise.all(_.map(timers, function (timer) {\n return timeStore.getItem(`consumed_${timer.id}`).then(function (savedConsumedTime) {\n if (_.isNumber(savedConsumedTime) && savedConsumedTime >= 0 && config.restoreTimerFromClient) {\n timer.remainingTime = timer.originalTime + timer.extraTime.total - savedConsumedTime;\n }\n });\n })).then(function () {\n return timers;\n });\n };\n\n /**\n * Save consumed time values into the store\n * @param {store} timeStore - where the values are saved\n * @param {Object[]} timers - the timers to save\n * @returns {Promise} resolves once saved\n */\n this.saveTimers = function saveTimers(timeStore, timers) {\n return Promise.all(_.map(timers, function (timer) {\n return timeStore.setItem(`consumed_${timer.id}`, timer.originalTime + timer.extraTime.total - timer.remainingTime);\n }));\n };\n\n //define the \"timer\" store as \"volatile\" (removed on browser change).\n testRunner.getTestStore().setVolatile(this.getName());\n },\n /**\n * Initializes the plugin (called during runner's init)\n *\n * @returns {Promise}\n */\n init: function init() {\n const self = this;\n const testRunner = this.getTestRunner();\n const testRunnerOptions = testRunner.getOptions();\n let screenreaderNotifcationTimeoutId;\n const stats = {};\n ['test', 'testPart', 'section', 'item'].forEach(scope => Object.assign(stats, {\n [scope]: statsHelper.getInstantStats(scope, testRunner)\n }));\n\n /**\n * Plugin config,\n */\n const config = Object.assign({\n /**\n * An option to control is the warnings are contextual or global\n */\n contextualWarnings: false,\n /**\n * The list of configured warnings\n */\n warnings: testRunnerOptions.timerWarning || {},\n /**\n * The list of configured warnings for screenreaders\n */\n warningsForScreenreader: testRunnerOptions.timerWarningForScreenreader || {},\n /**\n * The guided navigation option\n */\n guidedNavigation: testRunnerOptions.guidedNavigation,\n /**\n * Restore timer from client.\n */\n restoreTimerFromClient: testRunnerOptions.timer && testRunnerOptions.timer.restoreTimerFromClient,\n /**\n * Questions stats\n */\n questionsStats: stats\n }, this.getConfig());\n\n /**\n * Set up the strategy handler\n */\n const strategyHandler = getStrategyHandler(testRunner);\n\n /**\n * dispatch errors to the test runner\n * @param {Error} err - to dispatch\n */\n const handleError = err => {\n testRunner.trigger('error', err);\n };\n function loadSavedTimers(timeStore) {\n const testContext = testRunner.getTestContext();\n //update the timers before each item\n if (self.timerbox && testContext.timeConstraints) {\n return self.loadTimers(timeStore, config).then(function (timers) {\n return self.timerbox.update(timers);\n }).catch(handleError);\n }\n }\n return new Promise(function (resolve) {\n //load the plugin store\n return testRunner.getPluginStore(self.getName()).then(function (timeStore) {\n testRunner.before('renderitem', function () {\n return loadSavedTimers(timeStore);\n }).before('enableitem', function () {\n if (config.restoreTimerFromClient) {\n return loadSavedTimers(timeStore);\n }\n }).on('tick', function (elapsed) {\n if (self.timerbox) {\n const timers = self.timerbox.getTimers();\n const updatedTimers = Object.keys(timers).reduce((acc, timerName) => {\n const statsScope = statsHelper.getInstantStats(timers[timerName].scope, testRunner);\n const unansweredQuestions = statsScope && statsScope.questions - statsScope.answered;\n acc[timerName] = Object.assign({}, timers[timerName], {\n remainingTime: timers[timerName].remainingTime - elapsed,\n unansweredQuestions\n });\n return acc;\n }, {});\n self.timerbox.update(updatedTimers).catch(handleError);\n }\n }).after('renderitem', function () {\n if (self.timerbox) {\n $$1(self.timerbox.getElement()).find('.timer-wrapper').attr('aria-hidden', isReviewPanelEnabled(testRunner));\n self.timerbox.start();\n }\n self.$screenreaderWarningContainer.text('');\n }).after('enableitem', function () {\n if (self.timerbox && config.restoreTimerFromClient) {\n //this will \"resume\" the countdowns if timers have client mode\n self.timerbox.start();\n }\n }).on('move skip', function () {\n if (self.timerbox) {\n //this will \"pause\" the countdowns\n self.timerbox.stop();\n }\n }).on('disableitem', function () {\n if (self.timerbox && config.restoreTimerFromClient) {\n //this will \"pause\" the countdowns if timers have client mode\n self.timerbox.stop();\n }\n });\n timeStore.getItem('zen-mode').then(function (startZen) {\n //set up the timerbox\n self.timerbox = timerboxFactory({\n ariaHidden: isReviewPanelEnabled(testRunner),\n zenMode: {\n enabled: true,\n startHidden: !!startZen\n },\n displayWarning: config.contextualWarnings\n }).on('change', _.throttle(function () {\n //update the store with the current timer values\n self.saveTimers(timeStore, this.getTimers());\n }, 1000)).on('timeradd', function (timer) {\n strategyHandler.setUp(timer).catch(handleError);\n }).on('timerremove', function (timer) {\n strategyHandler.tearDown(timer).catch(handleError);\n }).on('timerstart', function (timer) {\n strategyHandler.start(timer).catch(handleError);\n }).on('timerstop', function (timer) {\n strategyHandler.stop(timer).catch(handleError);\n }).on('timerend', function (timer) {\n strategyHandler.complete(timer).catch(handleError);\n }).on('timerchange', function (action, timer) {\n //backward compatible events\n self.trigger(`${action}timer`, timer.qtiClassName, timer);\n }).on('zenchange', function (isZen) {\n timeStore.setItem('zen-mode', !!isZen);\n }).on('init', resolve).on('error', handleError);\n\n // share this timer values to use in other components\n self.timerbox.spread(testRunner, 'timertick');\n if (!config.contextualWarnings) {\n self.timerbox.on('warn', function (message, level) {\n if (level && message) {\n testRunner.trigger(level, message);\n }\n });\n\n // debounce used to prevent multiple invoking at the same time\n self.timerbox.on('warnscreenreader', _.debounce((message, remainingTime, scope) => {\n const statsScope = statsHelper.getInstantStats(scope, testRunner);\n const unansweredQuestions = statsScope && statsScope.questions - statsScope.answered;\n if (screenreaderNotifcationTimeoutId) {\n clearTimeout(screenreaderNotifcationTimeoutId);\n }\n self.$screenreaderWarningContainer.text(message(remainingTime, unansweredQuestions));\n screenreaderNotifcationTimeoutId = setTimeout(() => self.$screenreaderWarningContainer.text(''), screenreaderNotificationTimeout);\n }, 1000, {\n 'leading': true,\n 'trailing': false\n }));\n }\n }).catch(handleError);\n });\n });\n },\n /**\n * Called during the runner's render phase\n */\n render: function render() {\n const $container = this.getAreaBroker().getControlArea();\n this.$screenreaderWarningContainer = $$1(screenreaderNotificationTpl());\n this.timerbox.render($container);\n $container.append(this.$screenreaderWarningContainer);\n },\n /**\n * Called during the runner's destroy phase\n */\n destroy: function destroy() {\n if (this.timerbox) {\n this.timerbox.stop().destroy();\n }\n },\n /**\n * Shows the timers\n */\n show: function show() {\n if (this.timerbox) {\n this.timerbox.show();\n }\n },\n /**\n * Hides the timers\n */\n hide: function hide() {\n if (this.timerbox) {\n this.timerbox.hide();\n }\n }\n });\n\n return plugin;\n\n});\n\n","define('taoQtiTest/runner/plugins/controls/title/title',['jquery', 'lodash', 'taoTests/runner/plugin', 'handlebars', 'lib/handlebars/helpers', 'taoQtiTest/runner/helpers/map', 'taoQtiTest/runner/helpers/getTimerMessage', 'moment', 'taoQtiTest/runner/helpers/stats'], function ($$1, _, pluginFactory, Handlebars, Helpers0, mapHelper, getTimerMessage, moment, statsHelper) { 'use strict';\n\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n getTimerMessage = getTimerMessage && Object.prototype.hasOwnProperty.call(getTimerMessage, 'default') ? getTimerMessage['default'] : getTimerMessage;\n moment = moment && Object.prototype.hasOwnProperty.call(moment, 'default') ? moment['default'] : moment;\n statsHelper = statsHelper && Object.prototype.hasOwnProperty.call(statsHelper, 'default') ? statsHelper['default'] : statsHelper;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, functionType=\"function\", escapeExpression=this.escapeExpression, self=this;\n\n function program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\\n \\n
          \\n \";\n return buffer;\n }\n\n buffer += \"
          \\n \";\n stack1 = helpers.each.call(depth0, (depth0 && depth0.titles), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n
          \\n\";\n return buffer;\n });\n function titleTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n const precision = 1000;\n var title = pluginFactory({\n name: 'title',\n init: function init() {\n const testRunner = this.getTestRunner();\n const testMap = testRunner.getTestMap();\n const updateTitles = () => {\n const testContext = testRunner.getTestContext();\n const currentPart = mapHelper.getItemPart(testMap, testContext.itemPosition);\n const currentItem = mapHelper.getItem(testMap, testContext.itemIdentifier);\n\n // update test title\n if (testMap.title) {\n this.titles.test.$title.text(testMap.title).show();\n }\n\n // update part title\n if (currentPart && currentPart.label) {\n this.titles.testPart.$title.text(` - ${currentPart.label}`).show();\n }\n\n // update section title\n //@deprecated the following block seems to\n //be very specific and need to be reworked\n if (testContext.isDeepestSectionVisible) {\n const section = mapHelper.getItemSection(testMap, testContext.itemPosition);\n\n //testContext.sectionTitle is kept only for backward compat\n this.titles.section.$title.text(` - ${section.label || testContext.sectionTitle}`).show();\n }\n\n // update item title\n if (currentItem.label) {\n this.titles.item.$title.text(` - ${currentItem.label}`).show();\n }\n };\n testRunner.after('renderitem', () => {\n _.forOwn(this.titles, (options, scope) => {\n this.titles[scope].$title.text('');\n this.titles[scope].$timer.text('');\n if (scope !== 'item') {\n this.titles[scope].stats = statsHelper.getInstantStats(scope, testRunner);\n }\n });\n updateTitles();\n }).on('timertick', (remainingTime, scope) => {\n const title = this.titles[scope];\n if (!title) {\n return;\n }\n const {\n $timer,\n stats\n } = this.titles[scope];\n const time = moment.duration(remainingTime / precision, 'seconds');\n const hours = time.get('hours');\n const minutes = time.get('minutes');\n const seconds = time.get('seconds');\n const unansweredQuestions = stats && stats.questions - stats.answered;\n\n // check if notification should be updated\n if ($timer) {\n $timer.text(getTimerMessage(hours, minutes, seconds, unansweredQuestions));\n }\n }).on('unloaditem', () => {\n $$1('.qti-controls', this.$element).hide();\n });\n },\n render: function render() {\n const $container = this.getAreaBroker().getControlArea();\n this.titles = {\n test: {\n attribute: 'qti-test-title',\n className: ''\n },\n testPart: {\n attribute: 'qti-test-part-title',\n className: 'visible-hidden'\n },\n section: {\n attribute: 'qti-test-position',\n className: ''\n },\n item: {\n attribute: 'qti-test-item-title',\n className: 'visible-hidden'\n }\n };\n this.$element = $$1(titleTpl({\n titles: _.values(this.titles)\n }));\n\n // hide titles by default\n $$1('.qti-controls', this.$element).hide();\n $container.append(this.$element);\n _.forOwn(this.titles, (_ref, scope) => {\n let {\n attribute\n } = _ref;\n this.titles[scope].$title = $container.find(`[data-control=\"${attribute}\"]`);\n this.titles[scope].$timer = $container.find(`[data-control=\"${attribute}-timer\"]`);\n });\n }\n });\n\n return title;\n\n});\n\n","define('taoQtiTest/runner/plugins/controls/trace/itemTraceVariables',['lodash', 'moment', 'taoTests/runner/plugin'], function (_, moment, pluginFactory) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n moment = moment && Object.prototype.hasOwnProperty.call(moment, 'default') ? moment['default'] : moment;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Duration of a second in the timer's base unit\n * @type {Number}\n */\n var precision = 1000;\n\n /**\n * Gets the current timestamp\n * @returns {Number}\n */\n function timestamp() {\n return Date.now() / precision;\n }\n\n /**\n * Creates the timer plugin\n */\n var itemTraceVariables = pluginFactory({\n name: 'itemTraceVariables',\n /**\n * Install step, add behavior before the lifecycle.\n */\n install: function install() {\n //define the \"trace\" store as \"volatile\" (removed on browser change).\n // the store name is \"trace\" for backward compatibility,\n // best practice is to use the plugin name\n this.getTestRunner().getTestStore().setVolatile('trace');\n },\n /**\n * Initializes the plugin (called during runner's init)\n */\n init: function init() {\n var testRunner = this.getTestRunner();\n var variables = {};\n function onError(err) {\n testRunner.trigger('error', err);\n }\n return testRunner.getPluginStore('trace').then(function (tracesStore) {\n testRunner.after('renderitem enableitem', function () {\n var context = testRunner.getTestContext();\n variables = {\n ITEM_START_TIME_CLIENT: timestamp()\n };\n tracesStore.getItem(context.itemIdentifier).then(function (data) {\n if (data) {\n _.merge(variables, data);\n }\n return tracesStore.setItem(context.itemIdentifier, variables);\n }).catch(onError);\n }).before('move skip exit timeout', function () {\n var context = testRunner.getTestContext();\n variables.ITEM_END_TIME_CLIENT = timestamp();\n variables.ITEM_TIMEZONE = moment().utcOffset(moment().utcOffset()).format('Z');\n return tracesStore.setItem(context.itemIdentifier, variables).catch(onError);\n }).before('unloaditem', function () {\n var context = testRunner.getTestContext();\n return testRunner.getProxy().callItemAction(context.itemIdentifier, 'storeTraceData', {\n traceData: JSON.stringify(variables)\n }, true);\n });\n });\n }\n });\n\n return itemTraceVariables;\n\n});\n\n","define('taoQtiTest/runner/plugins/navigation/allowSkipping',['lodash', 'i18n', 'taoTests/runner/plugin', 'taoQtiTest/runner/helpers/currentItem'], function (_, __, pluginFactory, currentItemHelper) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n currentItemHelper = currentItemHelper && Object.prototype.hasOwnProperty.call(currentItemHelper, 'default') ? currentItemHelper['default'] : currentItemHelper;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017-2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Default plugin options\n * @type {Object}\n */\n var defaults = {\n allowPartial: true // whether all interactions must be answered to count an item as answered\n };\n\n /**\n * Plugin factory\n * @returns {Object}\n */\n var allowSkipping = pluginFactory({\n /**\n * Plugin name\n * @type {String}\n */\n name: 'allowSkipping',\n /**\n * Initialize plugin (called during runner's initialization)\n * @returns {this}\n */\n init() {\n const testRunner = this.getTestRunner();\n const testRunnerOptions = testRunner.getOptions();\n const pluginConfig = Object.assign({}, defaults, this.getConfig());\n testRunner.before('nav-next move', () => {\n const testContext = testRunner.getTestContext();\n const isInteracting = !testRunner.getItemState(testContext.itemIdentifier, 'disabled');\n const warning = pluginConfig.allowPartial ? __('A response to this item is required.') : __('A response to every question in this item is required.');\n if (isInteracting && testRunnerOptions.enableAllowSkipping) {\n const currenItem = testRunner.getCurrentItem();\n //@deprecated use allowSkipping from testMap instead of the testContext\n const allowSkipping = typeof currenItem.allowSkipping === 'boolean' ? currenItem.allowSkipping : testContext.allowSkipping;\n if (!allowSkipping) {\n return new Promise((resolve, reject) => {\n if (_.size(currentItemHelper.getDeclarations(testRunner)) === 0) {\n return resolve();\n }\n if (currentItemHelper.isAnswered(testRunner, pluginConfig.allowPartial)) {\n return resolve();\n }\n if (!testRunner.getState('alerted.notallowed')) {\n // Only show one alert for itemSessionControl\n\n testRunner.setState('alerted.notallowed', true);\n testRunner.trigger('alert.notallowed', warning, () => {\n testRunner.trigger('resumeitem');\n reject();\n testRunner.setState('alerted.notallowed', false);\n });\n }\n });\n }\n }\n });\n }\n });\n\n return allowSkipping;\n\n});\n\n","define('taoQtiTest/runner/plugins/navigation/next/nextWarningHelper',[],function () { 'use strict';\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * This is a helper for navigation plugins. It decides if a warning should be displayed\n * before actually moving to the next item\n *\n * @author Christophe Noël \n */\n\n /**\n * Convert a value to a boolean\n * @param {*} value\n * @param {Boolean} defaultValue\n * @returns {Boolean}\n */\n var toBoolean = function toBoolean(value, defaultValue) {\n if (typeof value === 'undefined') {\n return defaultValue;\n } else {\n return value === true || value === 'true';\n }\n };\n\n /**\n * @param {Object} options\n * @param {Boolean} options.endTestWarning - enables the end test warning, when applicable\n * @param {Boolean} options.isLast - if the item is the last of the test\n * @param {Boolean} options.isLinear - if the current part is linear\n * @param {Boolean} options.nextItemWarning - enables the next item warning, when applicable\n * @param {Boolean} options.nextPartWarning - enables the next item warning on part change\n * @param {Boolean} options.stats - current state of the test\n * @param {Object} options.nextPart - description of the next part of the test\n * @param {Number} options.remainingAttempts - remaining attempts for the current item\n * @param {String} options.testPartId - current test part identifier\n * @param {Boolean} options.unansweredOnly - warn only if there are unanswered/flagged items\n * @returns {Object}\n */\n var nextWarningHelper = function nextWarningHelper(options) {\n var endTestWarning = toBoolean(options.endTestWarning, false),\n isLast = toBoolean(options.isLast, false),\n isLinear = toBoolean(options.isLinear, false),\n nextItemWarning = toBoolean(options.nextItemWarning, false),\n nextPartWarning = toBoolean(options.nextPartWarning, false),\n stats = options.stats,\n nextPart = options.nextPart || {},\n remainingAttempts = typeof options.remainingAttempts === 'undefined' ? -1 : options.remainingAttempts,\n testPartId = options.testPartId || '',\n unansweredOnly = toBoolean(options.unansweredOnly, false),\n warnBeforeNext = shouldWarnBeforeNext(),\n warnBeforeEnd = shouldWarnBeforeEnd(),\n warnBeforeEndPart = shouldWarnBeforeEndPart();\n\n /**\n * Decide if we should display a warning before moving to the next item.\n * This is useful to prevent accidental navigation (for example by pressing a shortcut) that would occur\n * before the test taker actually gets a chance to answer an item\n */\n function shouldWarnBeforeNext() {\n return nextItemWarning && !itemCanBeTriedAtWill();\n //&& !exitTimedSectionWarning(); //todo: this should be implemented to prevent a double warning!\n }\n\n /**\n * We try to decide if the test taker has the freedom to come back to this item as many times as he wants\n */\n function itemCanBeTriedAtWill() {\n return isLast === false &&\n // the test is not over\n isLinear === false &&\n // the context is not linear\n remainingAttempts === -1 &&\n // the item doesn't have a configured max attempts number\n !isNextItemInLinearPart() // the next item is not in a linear part\n ;\n }\n\n /**\n * Check if the next item is in a linear part, as this would prevent the test taker to come back to the current item\n */\n function isNextItemInLinearPart() {\n return nextPart && typeof nextPart.isLinear !== 'undefined' && isLastOfPart() && nextPart.isLinear === true;\n }\n\n /**\n * Decide if we should display a warning before ending the test\n */\n function shouldWarnBeforeEnd() {\n return shouldWarnOnTestEnd();\n }\n\n /**\n * Decide if we should display a warning before ending the test part\n */\n function shouldWarnBeforeEndPart() {\n return shouldWarnOnPartChange();\n }\n\n /**\n * Are we on the last test item?\n * @returns {Boolean}\n */\n function shouldWarnOnTestEnd() {\n return isLast && (endTestWarning ||\n // warning is explicitly required by endTestWarning category\n warnBeforeNext) &&\n // warning is implicitly triggered by the next item warning being true (prevent double warning)\n shouldWarnForUnansweredItems();\n }\n\n /**\n * Provide the opportunity to cancel the display of the warning if there are no unanswered/flagged item\n * for this to work, the unansweredOnly option has to be set\n * @returns {Boolean}\n */\n function shouldWarnForUnansweredItems() {\n var hasUnanswered = stats && stats.questions - stats.answered !== 0,\n hasFlagged = stats && stats.flagged !== 0;\n if (unansweredOnly) {\n return hasUnanswered || hasFlagged;\n } else {\n return true;\n }\n }\n\n /**\n * Are we on the last part item?\n * @returns {Boolean}\n */\n function shouldWarnOnPartChange() {\n return nextPartWarning && isLastOfPart() && shouldWarnForUnansweredItems();\n }\n\n /**\n * Check if the next item belong to a different part\n * @returns {Boolean}\n */\n function isLastOfPart() {\n return nextPart && nextPart.id && testPartId !== nextPart.id;\n }\n\n /**\n * The helper object\n */\n return {\n shouldWarnBeforeEndPart: function () {\n return warnBeforeEndPart;\n },\n shouldWarnBeforeEnd: function () {\n return warnBeforeEnd;\n },\n shouldWarnBeforeNext: function () {\n return warnBeforeNext;\n }\n };\n };\n\n return nextWarningHelper;\n\n});\n\n","define('taoQtiTest/runner/plugins/navigation/next',['jquery', 'i18n', 'ui/hider', 'taoTests/runner/plugin', 'taoQtiTest/runner/plugins/navigation/next/nextWarningHelper', 'taoQtiTest/runner/helpers/messages', 'taoQtiTest/runner/helpers/map', 'taoQtiTest/runner/helpers/navigation', 'taoQtiTest/runner/helpers/stats', 'util/shortcut', 'util/namespace', 'handlebars', 'lib/handlebars/helpers'], function ($$1, __, hider, pluginFactory, nextWarningHelper, messages, mapHelper, navigationHelper, statsHelper, shortcut, namespaceHelper, Handlebars, Helpers0) { 'use strict';\n\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n hider = hider && Object.prototype.hasOwnProperty.call(hider, 'default') ? hider['default'] : hider;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n nextWarningHelper = nextWarningHelper && Object.prototype.hasOwnProperty.call(nextWarningHelper, 'default') ? nextWarningHelper['default'] : nextWarningHelper;\n messages = messages && Object.prototype.hasOwnProperty.call(messages, 'default') ? messages['default'] : messages;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n navigationHelper = navigationHelper && Object.prototype.hasOwnProperty.call(navigationHelper, 'default') ? navigationHelper['default'] : navigationHelper;\n statsHelper = statsHelper && Object.prototype.hasOwnProperty.call(statsHelper, 'default') ? statsHelper['default'] : statsHelper;\n shortcut = shortcut && Object.prototype.hasOwnProperty.call(shortcut, 'default') ? shortcut['default'] : shortcut;\n namespaceHelper = namespaceHelper && Object.prototype.hasOwnProperty.call(namespaceHelper, 'default') ? namespaceHelper['default'] : namespaceHelper;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, functionType=\"function\", escapeExpression=this.escapeExpression, self=this;\n\n function program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \" \";\n if (helper = helpers.className) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.className); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1);\n return buffer;\n }\n\n function program3(depth0,data) {\n \n var buffer = \"\", stack1;\n buffer += \"\\n aria-\"\n + escapeExpression(((stack1 = (data == null || data === false ? data : data.key)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1))\n + \"=\\\"\"\n + escapeExpression((typeof depth0 === functionType ? depth0.apply(depth0) : depth0))\n + \"\\\"\\n \";\n return buffer;\n }\n\n function program5(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\";\n return buffer;\n }\n function program6(depth0,data) {\n \n \n return \" no-label\";\n }\n\n function program8(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\";\n if (helper = helpers.text) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.text); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\";\n return buffer;\n }\n\n buffer += \"\\n \\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.icon), {hash:{},inverse:self.noop,fn:self.program(5, program5, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.text), {hash:{},inverse:self.noop,fn:self.program(8, program8, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \\n\\n\";\n return buffer;\n });\n function buttonTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * The display of the next button\n */\n const buttonData = {\n next: {\n control: 'move-forward',\n title: __('Submit and go to the next item'),\n specificTitle: __('Submit and go to the item %s'),\n icon: 'forward',\n text: __('Next')\n },\n end: {\n control: 'move-end',\n title: __('Submit and go to the end of the test'),\n icon: 'fast-forward',\n text: __('End test')\n }\n };\n\n /**\n * Create the button based on the current context\n * @param {Boolean} [isLast=false] - is the current item the last\n * @returns {jQueryElement} the button\n */\n const createElement = function () {\n let isLast = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n const dataType = isLast ? 'end' : 'next';\n return $$1(buttonTpl(buttonData[dataType]));\n };\n\n /**\n * Makes an element enabled\n * @param {jQuery} $element\n * @returns {jQuery}\n */\n const enableElement = $element => $element.removeProp('disabled').removeClass('disabled');\n\n /**\n * Makes an element disabled\n * @param {jQuery} $element\n * @returns {jQuery}\n */\n const disableElement = $element => $element.prop('disabled', true).addClass('disabled');\n\n /**\n * Update the button based on the context\n * @param {jQueryElement} $element - the element to update\n * @param {TestRunner} [testRunner] - the test runner instance\n * @param {Boolean} [isLast=false] - is the current item the last\n */\n const updateElement = function ($element, testRunner) {\n let isLast = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n const dataType = isLast ? 'end' : 'next';\n const testContext = testRunner.getTestContext();\n if (dataType === 'next' && !testContext.isAdaptive && !testContext.isCatAdaptive) {\n const testMap = testRunner.getTestMap();\n const nextItem = navigationHelper.getNextItem(testMap, testContext.itemPosition);\n $element.attr('title', __(buttonData.next.specificTitle, nextItem.label));\n } else {\n $element.attr('title', buttonData[dataType].title);\n }\n if ($element.attr('data-control') !== buttonData[dataType].control) {\n $element.attr('data-control', buttonData[dataType].control).find('.text').text(buttonData[dataType].text);\n if (dataType === 'next') {\n $element.find(`.icon-${buttonData.end.icon}`).removeClass(`icon-${buttonData.end.icon}`).addClass(`icon-${buttonData.next.icon}`);\n } else {\n $element.find(`.icon-${buttonData.next.icon}`).removeClass(`icon-${buttonData.next.icon}`).addClass(`icon-${buttonData.end.icon}`);\n }\n }\n };\n\n /**\n * Returns the configured plugin\n */\n var next = pluginFactory({\n name: 'next',\n /**\n * Initialize the plugin (called during runner's init)\n */\n init() {\n const testRunner = this.getTestRunner();\n const testRunnerOptions = testRunner.getOptions();\n const pluginShortcuts = (testRunnerOptions.shortcuts || {})[this.getName()] || {};\n\n /**\n * Check if the current item is the last item\n * @returns {Boolean} true if the last\n */\n const isLastItem = () => {\n const testContext = testRunner.getTestContext();\n const testMap = testRunner.getTestMap();\n const itemIdentifier = testContext.itemIdentifier;\n return navigationHelper.isLast(testMap, itemIdentifier);\n };\n\n //plugin behavior\n /**\n * @param {Boolean} nextItemWarning - enable the display of a warning when going to the next item.\n * Note: the actual display of the warning depends on other conditions (see nextWarningHelper)\n */\n const doNext = nextItemWarning => {\n const testContext = testRunner.getTestContext();\n const testMap = testRunner.getTestMap();\n const testPart = testRunner.getCurrentPart();\n const nextItemPosition = testContext.itemPosition + 1;\n const itemIdentifier = testContext.itemIdentifier;\n\n // x-tao-option-unansweredWarning is a deprecated option whose behavior now matches the one of\n const unansweredWarning = mapHelper.hasItemCategory(testMap, itemIdentifier, 'unansweredWarning', true);\n\n // x-tao-option-nextPartWarning with the unansweredOnly option\n const nextPartWarning = mapHelper.hasItemCategory(testMap, itemIdentifier, 'nextPartWarning', true) || unansweredWarning;\n const endTestWarning = mapHelper.hasItemCategory(testMap, itemIdentifier, 'endTestWarning', true);\n\n // this check to avoid an edge case where having both endTestWarning\n // and unansweredWarning options would prevent endTestWarning to behave normally\n const unansweredOnly = !endTestWarning && unansweredWarning;\n const warningScope = nextPartWarning ? 'part' : 'test';\n const enableNav = () => testRunner.trigger('enablenav');\n const triggerNextAction = () => {\n if (isLastItem()) {\n this.trigger('end');\n }\n testRunner.next();\n };\n testRunner.trigger('disablenav');\n if (this.getState('enabled') !== false) {\n const warningHelper = nextWarningHelper({\n endTestWarning: endTestWarning,\n isLast: isLastItem(),\n isLinear: testPart.isLinear,\n nextItemWarning: nextItemWarning,\n nextPartWarning: nextPartWarning,\n nextPart: mapHelper.getItemPart(testMap, nextItemPosition),\n remainingAttempts: testContext.remainingAttempts,\n testPartId: testContext.testPartId,\n unansweredWarning: unansweredWarning,\n stats: statsHelper.getInstantStats(warningScope, testRunner),\n unansweredOnly: unansweredOnly\n });\n if (warningHelper.shouldWarnBeforeEndPart()) {\n const submitButtonLabel = __('SUBMIT THIS PART');\n testRunner.trigger('confirm.endTestPart', messages.getExitMessage(warningScope, testRunner, '', false, submitButtonLabel), triggerNextAction,\n // if the test taker accept\n enableNav,\n // if he refuse\n {\n buttons: {\n labels: {\n ok: submitButtonLabel,\n cancel: __('CANCEL')\n }\n }\n });\n } else if (warningHelper.shouldWarnBeforeEnd()) {\n const submitButtonLabel = __('SUBMIT THE TEST');\n testRunner.trigger('confirm.endTest', messages.getExitMessage(warningScope, testRunner, '', false, submitButtonLabel), triggerNextAction,\n // if the test taker accept\n enableNav,\n // if he refuse\n {\n buttons: {\n labels: {\n ok: submitButtonLabel,\n cancel: __('CANCEL')\n }\n }\n });\n } else if (warningHelper.shouldWarnBeforeNext()) {\n testRunner.trigger('confirm.next', __('You are about to go to the next item. Click OK to continue and go to the next item.'), triggerNextAction,\n // if the test taker accept\n enableNav // if he refuse\n );\n } else {\n triggerNextAction();\n }\n }\n };\n\n //create the button (detached)\n this.$element = createElement(isLastItem());\n\n //attach behavior\n this.$element.on('click', e => {\n e.preventDefault();\n disableElement(this.$element);\n testRunner.trigger('nav-next');\n });\n const registerShortcut = kbdShortcut => {\n if (testRunnerOptions.allowShortcuts && kbdShortcut) {\n shortcut.add(namespaceHelper.namespaceAll(kbdShortcut, this.getName(), true), () => {\n if (this.getState('enabled') === true) {\n testRunner.trigger('nav-next', true);\n }\n }, {\n avoidInput: true,\n prevent: true\n });\n }\n };\n registerShortcut(pluginShortcuts.trigger);\n\n //disabled by default\n this.disable();\n\n //change plugin state\n testRunner.on('loaditem', () => {\n updateElement(this.$element, testRunner, isLastItem());\n }).on('enablenav', () => this.enable()).on('disablenav', () => this.disable()).on('hidenav', () => this.hide()).on('shownav', () => this.show()).on('nav-next', nextItemWarning => doNext(nextItemWarning)).on('enableaccessibilitymode', () => {\n const kbdShortcut = pluginShortcuts.triggerAccessibility;\n if (kbdShortcut && !this.getState('eaccessibilitymode')) {\n shortcut.remove(`.${this.getName()}`);\n registerShortcut(kbdShortcut);\n this.setState('eaccessibilitymode');\n }\n });\n },\n /**\n * Called during the runner's render phase\n */\n render() {\n //attach the element to the navigation area\n const $container = this.getAreaBroker().getNavigationArea();\n $container.append(this.$element);\n },\n /**\n * Called during the runner's destroy phase\n */\n destroy() {\n shortcut.remove(`.${this.getName()}`);\n this.$element.remove();\n },\n /**\n * Enable the button\n */\n enable() {\n enableElement(this.$element);\n },\n /**\n * Disable the button\n */\n disable() {\n disableElement(this.$element);\n },\n /**\n * Show the button\n */\n show() {\n hider.show(this.$element);\n },\n /**\n * Hide the button\n */\n hide() {\n hider.hide(this.$element);\n }\n });\n\n return next;\n\n});\n\n","define('taoQtiTest/runner/plugins/navigation/next/dialogConfirmNext',['jquery', 'lodash', 'i18n', 'ui/dialog', 'handlebars', 'lib/handlebars/helpers'], function ($$1, _, __, dialog, Handlebars, Helpers0) { 'use strict';\n\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n dialog = dialog && Object.prototype.hasOwnProperty.call(dialog, 'default') ? dialog['default'] : dialog;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, functionType=\"function\", escapeExpression=this.escapeExpression, self=this;\n\n function program1(depth0,data) {\n \n \n return \"checked\";\n }\n\n buffer += \"\";\n return buffer;\n });\n function checkboxTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Displays a confirmation dialog with a checkbox in it\n *\n * @param {String} heading - Above the main message\n * @param {String} message - The displayed message\n * @param {Function} accept - An action called when the dialog is accepted\n * @param {Function} refuse - An action called when the dialog is refused\n * @param {Object} checkboxParams - Checkbox options\n * @param {Boolean} [checkboxParams.checked] - True to render it checked\n * @param {Function} [checkboxParams.submitChecked] - Action called when dialog accepted with checkbox checked\n * @param {Function} [checkboxParams.submitUnchecked] - Action called when dialog accepted with checkbox unchecked\n * @returns {dialog} - Returns the dialog instance\n */\n function dialogConfirmNext(heading, message, accept, refuse, checkboxParams, dialogOptions) {\n var accepted = false;\n var dlg;\n var content = null;\n if (checkboxParams && checkboxParams.checked !== true) {\n content = checkboxTpl({\n checked: false,\n text: \"Don't show this again next time\",\n id: 'dont-show-again'\n });\n }\n dialogOptions = _.defaults({\n heading: heading,\n message: message,\n content: content,\n autoRender: true,\n autoDestroy: true,\n buttons: [{\n id: 'cancel',\n type: 'regular',\n label: __('Cancel'),\n close: true\n }, {\n id: 'ok',\n type: 'info',\n label: __('Go to next item'),\n close: true\n }],\n onOkBtn: function onOkBtn() {\n var $checkbox;\n accepted = true;\n if (_.isFunction(accept)) {\n accept.call(this);\n if (checkboxParams) {\n // handle checkbox callbacks:\n $checkbox = $$1('input[name=\"dont-show-again\"]', this);\n if ($checkbox.prop('checked') && _.isFunction(checkboxParams.submitChecked)) {\n checkboxParams.submitChecked();\n } else if (!$checkbox.prop('checked') && _.isFunction(checkboxParams.submitUnchecked)) {\n checkboxParams.submitUnchecked();\n }\n }\n }\n }\n }, dialogOptions);\n dlg = dialog(dialogOptions);\n if (_.isFunction(refuse)) {\n dlg.on('closed.modal', function () {\n if (!accepted) {\n refuse.call(this);\n }\n });\n }\n return dlg;\n }\n\n return dialogConfirmNext;\n\n});\n\n","define('taoQtiTest/runner/plugins/navigation/next/linearNextItemWarning',['i18n', 'taoTests/runner/plugin', 'taoQtiTest/runner/helpers/map', 'taoQtiTest/runner/helpers/currentItem', 'taoQtiTest/runner/plugins/navigation/next/dialogConfirmNext', 'taoQtiTest/runner/helpers/navigation'], function (__, pluginFactory, mapHelper, currentItemHelper, dialogConfirmNext, navigationHelper) { 'use strict';\n\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n currentItemHelper = currentItemHelper && Object.prototype.hasOwnProperty.call(currentItemHelper, 'default') ? currentItemHelper['default'] : currentItemHelper;\n dialogConfirmNext = dialogConfirmNext && Object.prototype.hasOwnProperty.call(dialogConfirmNext, 'default') ? dialogConfirmNext['default'] : dialogConfirmNext;\n navigationHelper = navigationHelper && Object.prototype.hasOwnProperty.call(navigationHelper, 'default') ? navigationHelper['default'] : navigationHelper;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Returns the configured plugin\n */\n var linearNextItemWarning = pluginFactory({\n name: 'linearNextItemWarning',\n /**\n * Initialize the plugin (called during runner's init)\n */\n init() {\n const self = this;\n const testRunner = this.getTestRunner();\n const testRunnerOptions = testRunner.getOptions();\n const testStore = testRunner.getTestStore(); // we'll store user's checkbox choice in here\n testStore.setVolatile(self.getName());\n\n /**\n * Retrieve the required categories of the current item\n * @returns {Object} the calculator categories\n */\n function getNextItemCategories() {\n const testContext = testRunner.getTestContext();\n const testMap = testRunner.getTestMap();\n return {\n nextPartWarning: mapHelper.hasItemCategory(testMap, testContext.itemIdentifier, 'nextPartWarning', true),\n nextSectionWarning: mapHelper.hasItemCategory(testMap, testContext.itemIdentifier, 'nextSectionWarning', true)\n };\n }\n\n /**\n * Provides different variants of message text\n * @param {String} action - 'next' or 'skip'\n * @returns {String}\n */\n function getCustomNextMessage(action) {\n var customNextMessage;\n var itemPartiallyAnswered = currentItemHelper.isAnswered(testRunner, true);\n if (!itemPartiallyAnswered) {\n customNextMessage = __('Are you sure you want to go to the next item? You will not be able to go back and provide an answer.');\n } else if (action === 'next') {\n customNextMessage = __('Are you sure you want to go to the next item? You will not be able to go back and change your answer.');\n } else if (action === 'skip') {\n customNextMessage = __('Are you sure you want to clear your answer and go to the next item? You will not be able to go back and provide an answer.');\n } else {\n // more generic message for default case:\n customNextMessage = __('Are you sure you want to go to the next item? You will not be able to go back.');\n }\n return customNextMessage;\n }\n\n //plugin behavior\n /**\n * Checks configuration, shows a dialog asking to confirm the nav action\n *\n * @param {String} action - 'next' or 'skip'\n * @returns {Promise} - resolves if dialog accepted or not shown, rejects if dialog cancelled\n */\n function doNextWarning(action) {\n testRunner.trigger('disablenav');\n\n // Load testStore checkbox value (async)\n return testStore.getStore(self.getName()).then(function (store) {\n return store.getItem('dontShowLinearNextItemWarning').then(function (checkboxValue) {\n var checkboxParams = null;\n\n // Show the warning unless user has turned it off:\n if (checkboxValue !== true) {\n // Define checkbox only if enabled by config:\n if (testRunnerOptions.enableLinearNextItemWarningCheckbox) {\n checkboxParams = {\n checked: checkboxValue,\n submitChecked: function () {\n store.setItem('dontShowLinearNextItemWarning', true);\n },\n submitUnchecked: function () {\n store.setItem('dontShowLinearNextItemWarning', false);\n }\n };\n }\n return new Promise(function (resolve, reject) {\n // show special dialog:\n dialogConfirmNext(__('Go to the next item?'), getCustomNextMessage(action), resolve,\n // if the test taker accepts\n function cancel() {\n // if he refuses\n reject({\n cancel: true\n });\n }, checkboxParams);\n });\n }\n });\n }).catch(function (err) {\n // if the rejection is due to an error, rethrow it\n if (err && err instanceof Error) {\n throw err;\n }\n if (err && err.cancel === true) {\n testRunner.trigger('enablenav');\n return Promise.reject(); // to cancel the move\n }\n });\n }\n\n // Attach this plugin to 'next' & 'skip' events\n testRunner.on('init', function () {\n // Clear the stored checkbox value before each test:\n testStore.getStore(self.getName()).then(function (store) {\n store.setItem('dontShowLinearNextItemWarning', null);\n });\n }).before('move skip', function (e, type, scope) {\n const context = testRunner.getTestContext();\n const map = testRunner.getTestMap();\n const item = testRunner.getCurrentItem();\n const currentPart = testRunner.getCurrentPart();\n const categories = getNextItemCategories();\n const isLast = navigationHelper.isLast(map, context.itemIdentifier);\n if (currentPart && currentPart.isLinear) {\n // Do nothing if nextSection warning imminent:\n if (scope === 'section' && categories.nextSectionWarning) {\n return;\n // Do nothing if endOfPart warning imminent:\n } else if (categories.nextPartWarning) {\n return;\n // Do nothing if 'informational item':\n } else if (item.informational) {\n return;\n // Show dialog if conditions met:\n } else if (type === 'next' && !isLast && testRunnerOptions.forceEnableLinearNextItemWarning) {\n return doNextWarning('next');\n } else if (e.name === 'skip' && !isLast && testRunnerOptions.forceEnableLinearNextItemWarning) {\n return doNextWarning('skip');\n }\n }\n });\n }\n });\n\n return linearNextItemWarning;\n\n});\n\n","define('taoQtiTest/runner/plugins/navigation/nextSection',['jquery', 'lodash', 'i18n', 'ui/hider', 'taoTests/runner/plugin', 'taoQtiTest/runner/helpers/messages', 'handlebars', 'lib/handlebars/helpers', 'taoQtiTest/runner/helpers/map'], function ($$1, _, __, hider, pluginFactory, messages, Handlebars, Helpers0, mapHelper) { 'use strict';\n\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n hider = hider && Object.prototype.hasOwnProperty.call(hider, 'default') ? hider['default'] : hider;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n messages = messages && Object.prototype.hasOwnProperty.call(messages, 'default') ? messages['default'] : messages;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, functionType=\"function\", escapeExpression=this.escapeExpression, self=this;\n\n function program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \" \";\n if (helper = helpers.className) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.className); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1);\n return buffer;\n }\n\n function program3(depth0,data) {\n \n var buffer = \"\", stack1;\n buffer += \"\\n aria-\"\n + escapeExpression(((stack1 = (data == null || data === false ? data : data.key)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1))\n + \"=\\\"\"\n + escapeExpression((typeof depth0 === functionType ? depth0.apply(depth0) : depth0))\n + \"\\\"\\n \";\n return buffer;\n }\n\n function program5(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\";\n return buffer;\n }\n function program6(depth0,data) {\n \n \n return \" no-label\";\n }\n\n function program8(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\";\n if (helper = helpers.text) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.text); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\";\n return buffer;\n }\n\n buffer += \"\\n \\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.icon), {hash:{},inverse:self.noop,fn:self.program(5, program5, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.text), {hash:{},inverse:self.noop,fn:self.program(8, program8, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \\n\\n\";\n return buffer;\n });\n function buttonTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2015-2019 (original work) Open Assessment Technologies SA ;\n */\n var nextSection = pluginFactory({\n name: 'nextsection',\n init() {\n const self = this;\n const testRunner = this.getTestRunner();\n const testRunnerOptions = testRunner.getOptions();\n\n /**\n * Retrieve the nexSection categories of the current item\n * @returns {Object} the calculator categories\n */\n function getNextSectionCategories() {\n const testContext = testRunner.getTestContext();\n const testMap = testRunner.getTestMap();\n return {\n nextSection: mapHelper.hasItemCategory(testMap, testContext.itemIdentifier, 'nextSection', true),\n nextSectionWarning: mapHelper.hasItemCategory(testMap, testContext.itemIdentifier, 'nextSectionWarning', true),\n noExitTimedSectionWarning: mapHelper.hasItemCategory(testMap, testContext.itemIdentifier, 'noExitTimedSectionWarning', true)\n };\n }\n function toggle() {\n const categories = getNextSectionCategories();\n if (testRunnerOptions.nextSection && (categories.nextSection || categories.nextSectionWarning)) {\n self.show();\n } else {\n self.hide();\n }\n }\n function nextSection() {\n testRunner.next('section');\n }\n\n /**\n * Check if warn section leaving dialog enabled to prevent showing double dialogs\n * @returns {Boolean}\n */\n const isWarnSectionLeavingEabled = () => {\n const testContext = testRunner.getTestContext();\n const categories = getNextSectionCategories();\n const timeConstraints = testContext.timeConstraints || [];\n return timeConstraints.some(_ref => {\n let {\n source\n } = _ref;\n return source === testContext.sectionId;\n }) && !categories.noExitTimedSectionWarning && !(testRunnerOptions.timer || {}).keepUpToTimeout;\n };\n this.$element = $$1(buttonTpl({\n control: 'next-section',\n title: __('Skip to the next section'),\n icon: 'fast-forward',\n text: __('Next Section')\n }));\n this.$element.on('click', function (e) {\n const enable = _.bind(self.enable, self);\n const categories = getNextSectionCategories();\n e.preventDefault();\n if (self.getState('enabled') !== false) {\n self.disable();\n if (categories.nextSectionWarning && !isWarnSectionLeavingEabled()) {\n const submitButtonLabel = __('CONTINUE TO THE NEXT SECTION');\n testRunner.trigger('confirm.nextsection', messages.getExitMessage('section', testRunner, '', false, submitButtonLabel), nextSection,\n // if the test taker accept\n enable,\n // if the test taker refuse\n {\n buttons: {\n labels: {\n ok: submitButtonLabel,\n cancel: __('CANCEL')\n }\n }\n });\n } else {\n nextSection();\n }\n }\n });\n this.disable();\n toggle();\n testRunner.on('loaditem', toggle).on('enablenav', function () {\n self.enable();\n }).on('disablenav', function () {\n self.disable();\n }).on('hidenav', function () {\n self.hide();\n }).on('shownav', function () {\n self.show();\n });\n },\n /**\n * Called during the runner's render phase\n */\n render: function render() {\n //attach the element to the navigation area\n var $container = this.getAreaBroker().getNavigationArea();\n $container.append(this.$element);\n },\n /**\n * Called during the runner's destroy phase\n */\n destroy: function destroy() {\n this.$element.remove();\n },\n /**\n * Enable the button\n */\n enable: function enable() {\n this.$element.removeProp('disabled').removeClass('disabled');\n },\n /**\n * Disable the button\n */\n disable: function disable() {\n this.$element.prop('disabled', true).addClass('disabled');\n },\n /**\n * Show the button\n */\n show: function show() {\n hider.show(this.$element);\n },\n /**\n * Hide the button\n */\n hide: function hide() {\n hider.hide(this.$element);\n }\n });\n\n return nextSection;\n\n});\n\n","define('taoQtiTest/runner/plugins/navigation/previous',['jquery', 'lodash', 'i18n', 'ui/hider', 'taoTests/runner/plugin', 'util/shortcut', 'util/namespace', 'taoQtiTest/runner/helpers/navigation', 'taoQtiTest/runner/helpers/map', 'handlebars', 'lib/handlebars/helpers'], function ($$1, _, __, hider, pluginFactory, shortcut, namespaceHelper, navigationHelper, mapHelper, Handlebars, Helpers0) { 'use strict';\n\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n hider = hider && Object.prototype.hasOwnProperty.call(hider, 'default') ? hider['default'] : hider;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n shortcut = shortcut && Object.prototype.hasOwnProperty.call(shortcut, 'default') ? shortcut['default'] : shortcut;\n namespaceHelper = namespaceHelper && Object.prototype.hasOwnProperty.call(namespaceHelper, 'default') ? namespaceHelper['default'] : namespaceHelper;\n navigationHelper = navigationHelper && Object.prototype.hasOwnProperty.call(navigationHelper, 'default') ? navigationHelper['default'] : navigationHelper;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, functionType=\"function\", escapeExpression=this.escapeExpression, self=this;\n\n function program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \" \";\n if (helper = helpers.className) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.className); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1);\n return buffer;\n }\n\n function program3(depth0,data) {\n \n var buffer = \"\", stack1;\n buffer += \"\\n aria-\"\n + escapeExpression(((stack1 = (data == null || data === false ? data : data.key)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1))\n + \"=\\\"\"\n + escapeExpression((typeof depth0 === functionType ? depth0.apply(depth0) : depth0))\n + \"\\\"\\n \";\n return buffer;\n }\n\n function program5(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\";\n return buffer;\n }\n function program6(depth0,data) {\n \n \n return \" no-label\";\n }\n\n function program8(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\";\n if (helper = helpers.text) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.text); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\";\n return buffer;\n }\n\n buffer += \"\\n \\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.icon), {hash:{},inverse:self.noop,fn:self.program(5, program5, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.text), {hash:{},inverse:self.noop,fn:self.program(8, program8, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \\n\\n\";\n return buffer;\n });\n function buttonTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Returns the configured plugin\n */\n var previous = pluginFactory({\n name: 'previous',\n /**\n * Initialize the plugin (called during runner's init)\n */\n init() {\n const self = this;\n const testRunner = this.getTestRunner();\n const testRunnerOptions = testRunner.getOptions();\n const pluginShortcuts = (testRunnerOptions.shortcuts || {})[this.getName()] || {};\n\n /**\n * Check if the \"Previous\" functionality should be available or not\n */\n var canDoPrevious = function canDoPrevious() {\n const testMap = testRunner.getTestMap();\n const context = testRunner.getTestContext();\n const currentSection = testRunner.getCurrentSection();\n const noExitTimedSectionWarning = mapHelper.hasItemCategory(testMap, context.itemIdentifier, 'noExitTimedSectionWarning', true);\n const currentPart = testRunner.getCurrentPart();\n let previousSection;\n let previousPart;\n\n // check TestMap if empty\n if (_.isPlainObject(testMap) && _.size(testMap) === 0) {\n return false;\n }\n\n //first item of the test\n if (navigationHelper.isFirst(testMap, context.itemIdentifier)) {\n return false;\n }\n\n //first item of a section\n if (navigationHelper.isFirstOf(testMap, context.itemIdentifier, 'section')) {\n //when entering an adaptive section,\n //you can't leave the section from the beginning\n if (currentSection.isCatAdaptive) {\n return false;\n }\n\n //if the previous section is adaptive or a timed section\n previousSection = mapHelper.getItemSection(testMap, context.itemPosition - 1);\n if (previousSection.isCatAdaptive || previousSection.timeConstraint && !noExitTimedSectionWarning) {\n return false;\n }\n }\n if (navigationHelper.isFirstOf(testMap, context.itemIdentifier, 'part')) {\n //if the previous part is linear, we don't enter it too\n previousPart = mapHelper.getItemPart(testMap, context.itemPosition - 1);\n if (previousPart.isLinear) {\n return false;\n }\n }\n return currentPart.isLinear === false && context.canMoveBackward === true;\n };\n\n /**\n * Hide the plugin if the Previous functionality shouldn't be available\n */\n var toggle = function toggle() {\n if (canDoPrevious()) {\n self.show();\n } else {\n self.hide();\n }\n };\n\n //build element (detached)\n this.$element = $$1(buttonTpl({\n control: 'move-backward',\n title: __('Submit and go to the previous item'),\n icon: 'backward',\n text: __('Previous')\n }));\n\n //attach behavior\n function doPrevious(previousItemWarning) {\n var context = testRunner.getTestContext();\n function enableNav() {\n testRunner.trigger('enablenav');\n }\n function triggerAction() {\n testRunner.previous();\n }\n testRunner.trigger('disablenav');\n if (self.getState('enabled') !== false) {\n if (previousItemWarning && context.remainingAttempts !== -1) {\n testRunner.trigger('confirm.previous', __('You are about to go to the previous item. Click OK to continue and go to the previous item.'), triggerAction,\n // if the test taker accept\n enableNav // if he refuses\n );\n } else {\n triggerAction();\n }\n }\n }\n this.$element.on('click', function (e) {\n e.preventDefault();\n testRunner.trigger('nav-previous');\n });\n const registerShortcut = kbdShortcut => {\n if (testRunnerOptions.allowShortcuts && kbdShortcut) {\n shortcut.add(namespaceHelper.namespaceAll(kbdShortcut, this.getName(), true), function () {\n if (canDoPrevious() && self.getState('enabled') === true) {\n testRunner.trigger('nav-previous', [true]);\n }\n }, {\n avoidInput: true,\n prevent: true\n });\n }\n };\n registerShortcut(pluginShortcuts.trigger);\n\n //start disabled\n toggle();\n self.disable();\n\n //update plugin state based on changes\n testRunner.on('loaditem', toggle).on('enablenav', function () {\n self.enable();\n }).on('disablenav', function () {\n self.disable();\n }).on('hidenav', function () {\n self.hide();\n }).on('shownav', function () {\n self.show();\n }).on('nav-previous', function (previousItemWarning) {\n doPrevious(previousItemWarning);\n }).on('enableaccessibilitymode', () => {\n const kbdShortcut = pluginShortcuts.triggerAccessibility;\n if (kbdShortcut && !this.getState('eaccessibilitymode')) {\n shortcut.remove(`.${this.getName()}`);\n registerShortcut(kbdShortcut);\n this.setState('eaccessibilitymode');\n }\n });\n },\n /**\n * Called during the runner's render phase\n */\n render: function render() {\n var $container = this.getAreaBroker().getNavigationArea();\n $container.append(this.$element);\n },\n /**\n * Called during the runner's destroy phase\n */\n destroy: function destroy() {\n shortcut.remove(`.${this.getName()}`);\n this.$element.remove();\n },\n /**\n * Enable the button\n */\n enable: function enable() {\n this.$element.removeProp('disabled').removeClass('disabled');\n },\n /**\n * Disable the button\n */\n disable: function disable() {\n this.$element.prop('disabled', true).addClass('disabled');\n },\n /**\n * Show the button\n */\n show: function show() {\n hider.show(this.$element);\n },\n /**\n * Hide the button\n */\n hide: function hide() {\n hider.hide(this.$element);\n }\n });\n\n return previous;\n\n});\n\n","define('taoQtiTest/runner/plugins/navigation/review/navigator',['jquery', 'lodash', 'ui/component', 'ui/autoscroll', 'taoQtiTest/runner/helpers/map', 'handlebars', 'lib/handlebars/helpers'], function ($$1, _, component, autoscroll, mapHelper, Handlebars, Helpers0) { 'use strict';\n\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n component = component && Object.prototype.hasOwnProperty.call(component, 'default') ? component['default'] : component;\n autoscroll = autoscroll && Object.prototype.hasOwnProperty.call(autoscroll, 'default') ? autoscroll['default'] : autoscroll;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, options, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, self=this;\n\n function program1(depth0,data) {\n \n \n return \" hidden\";\n }\n\n function program3(depth0,data) {\n \n var buffer = \"\", helper, options;\n buffer += \"\\n
          \\n \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Test status\", options) : helperMissing.call(depth0, \"__\", \"Test status\", options)))\n + \"\\n \\n \\n \\n
            \\n
          • \\n \\n \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Viewed\", options) : helperMissing.call(depth0, \"__\", \"Viewed\", options)))\n + \"\\n -/-\\n \\n
          • \\n
          • \\n \\n \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Answered\", options) : helperMissing.call(depth0, \"__\", \"Answered\", options)))\n + \"\\n -/-\\n \\n
          • \\n
          • \\n \\n \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Unanswered\", options) : helperMissing.call(depth0, \"__\", \"Unanswered\", options)))\n + \"\\n -/-\\n \\n
          • \\n
          • \\n \\n \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Flagged\", options) : helperMissing.call(depth0, \"__\", \"Flagged\", options)))\n + \"\\n -/-\\n \\n
          • \\n
          \\n
          \\n \";\n return buffer;\n }\n\n function program5(depth0,data) {\n \n \n return \"(0)\";\n }\n\n function program7(depth0,data) {\n \n \n return \"icon-unanswered \";\n }\n\n function program9(depth0,data) {\n \n var buffer = \"\", helper, options;\n buffer += escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Unanswered\", options) : helperMissing.call(depth0, \"__\", \"Unanswered\", options)))\n + \" (0)\";\n return buffer;\n }\n\n function program11(depth0,data) {\n \n \n return \"icon-flagged \";\n }\n\n function program13(depth0,data) {\n \n var buffer = \"\", helper, options;\n buffer += escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Flagged\", options) : helperMissing.call(depth0, \"__\", \"Flagged\", options)))\n + \" (0)\";\n return buffer;\n }\n\n buffer += \"
          \\n
          \\n \\n \\n
          \\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.showLegend), {hash:{},inverse:self.noop,fn:self.program(3, program3, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n\\n\\n
          \\n
            \\n
          • \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"All\", options) : helperMissing.call(depth0, \"__\", \"All\", options)))\n + \"\\n \";\n stack1 = helpers.unless.call(depth0, (depth0 && depth0.showLegend), {hash:{},inverse:self.noop,fn:self.program(5, program5, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \\n
          • \\n\\n
          • \\n \\n \";\n stack1 = helpers.unless.call(depth0, (depth0 && depth0.showLegend), {hash:{},inverse:self.noop,fn:self.program(9, program9, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \\n
          • \\n\\n
          • \\n \\n \";\n stack1 = helpers.unless.call(depth0, (depth0 && depth0.showLegend), {hash:{},inverse:self.noop,fn:self.program(13, program13, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \\n
          • \\n
          \\n
          \\n\\n \\n\\n
          \\n \\n

          \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"In this part of the test navigation is not allowed.\", options) : helperMissing.call(depth0, \"__\", \"In this part of the test navigation is not allowed.\", options)))\n + \"\\n

          \\n
          \\n
          \\n\";\n return buffer;\n });\n function navigatorTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template$1 = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, functionType=\"function\", self=this;\n\n function program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\\n
        • \\n \\n \";\n if (helper = helpers.label) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.label); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\n \\n \\n \\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.isLinear), {hash:{},inverse:self.program(8, program8, data),fn:self.program(6, program6, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n
        • \\n \";\n return buffer;\n }\n function program2(depth0,data) {\n \n \n return \"active\";\n }\n\n function program4(depth0,data) {\n \n \n return \"collapsed\";\n }\n\n function program6(depth0,data) {\n \n var buffer = \"\", stack1, helper, options;\n buffer += \"\\n
          \\n \\n

          \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"In this part of the test navigation is not allowed.\", options) : helperMissing.call(depth0, \"__\", \"In this part of the test navigation is not allowed.\", options)))\n + \"\\n

          \\n

          \\n \\n

          \\n
          \\n \";\n return buffer;\n }\n\n function program8(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\\n
            \\n \";\n stack1 = helpers.each.call(depth0, (depth0 && depth0.sections), {hash:{},inverse:self.noop,fn:self.program(9, program9, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n
          \\n \";\n return buffer;\n }\n function program9(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\\n
        • \\n \\n \";\n if (helper = helpers.label) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.label); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\n \"\n + escapeExpression(((stack1 = ((stack1 = (depth0 && depth0.stats)),stack1 == null || stack1 === false ? stack1 : stack1.answered)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1))\n + \"/\"\n + escapeExpression(((stack1 = ((stack1 = (depth0 && depth0.stats)),stack1 == null || stack1 === false ? stack1 : stack1.total)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1))\n + \"\\n \\n
            \\n \";\n stack1 = helpers.each.call(depth0, (depth0 && depth0.items), {hash:{},inverse:self.noop,fn:self.programWithDepth(10, program10, data, depth0),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n
          \\n
        • \\n \";\n return buffer;\n }\n function program10(depth0,data,depth1) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\\n
        • \\n \\n \\n \";\n if (helper = helpers.index) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.index); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\n \";\n if (helper = helpers.label) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.label); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\n \\n
        • \\n \";\n return buffer;\n }\n function program11(depth0,data) {\n \n \n return \"false\";\n }\n\n function program13(depth0,data) {\n \n \n return \"true\";\n }\n\n function program15(depth0,data) {\n \n \n return \"aria-current=\\\"page\\\"\";\n }\n\n buffer += \"
            \\n \";\n stack1 = helpers.each.call(depth0, (depth0 && depth0.parts), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n
          \\n\";\n return buffer;\n });\n function navigatorTreeTpl(data, options, asString) {\n var html = Template$1(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Some default values\n * @type {Object}\n * @private\n */\n var _defaults = {\n scope: 'test',\n canCollapse: false,\n preventsUnseen: true,\n hidden: false\n };\n\n /**\n * List of CSS classes\n * @type {Object}\n * @private\n */\n var _cssCls = {\n active: 'active',\n collapsed: 'collapsed',\n collapsible: 'collapsible',\n hidden: 'hidden',\n disabled: 'disabled',\n flagged: 'flagged',\n answered: 'answered',\n viewed: 'viewed',\n unseen: 'unseen',\n info: 'info',\n icon: 'qti-navigator-icon',\n scope: {\n test: 'scope-test',\n testPart: 'scope-test-part',\n testSection: 'scope-test-section'\n }\n };\n\n /**\n * List of icon CSS classes\n * @type {Array}\n * @private\n */\n var _iconCls = [_cssCls.info, _cssCls.flagged, _cssCls.answered, _cssCls.viewed];\n\n /**\n * List of common CSS selectors\n * @type {Object}\n * @private\n */\n var _selectors = {\n component: '.qti-navigator',\n filterBar: '.qti-navigator-filters',\n filter: '.qti-navigator-filter',\n tree: '.qti-navigator-tree',\n collapseHandle: '.qti-navigator-collapsible',\n linearState: '.qti-navigator-linear',\n infoAnswered: '.qti-navigator-answered .qti-navigator-counter',\n infoViewed: '.qti-navigator-viewed .qti-navigator-counter',\n infoUnanswered: '.qti-navigator-unanswered .qti-navigator-counter',\n infoFlagged: '.qti-navigator-flagged .qti-navigator-counter',\n infoPanel: '.qti-navigator-info',\n infoPanelLabels: '.qti-navigator-info > .qti-navigator-label',\n tabInfoAll: '[data-mode=\"all\"] .qti-navigator-counter',\n tabInfoUnanswered: '[data-mode=\"unanswered\"] .qti-navigator-counter',\n tabInfoFlagged: '[data-mode=\"flagged\"] .qti-navigator-counter',\n parts: '.qti-navigator-part',\n partLabels: '.qti-navigator-part > .qti-navigator-label',\n sections: '.qti-navigator-section',\n sectionLabels: '.qti-navigator-section > .qti-navigator-label',\n items: '.qti-navigator-item',\n itemLabels: '.qti-navigator-item > .qti-navigator-label',\n itemIcons: '.qti-navigator-item > .qti-navigator-icon',\n activeItem: '.qti-navigator-item.active',\n icons: '.qti-navigator-icon',\n linearStart: '.qti-navigator-linear-part button',\n counters: '.qti-navigator-counter',\n actives: '.active',\n collapsible: '.collapsible',\n collapsiblePanels: '.collapsible-panel',\n unseen: '.unseen',\n answered: '.answered',\n flagged: '.flagged',\n notFlagged: ':not(.flagged)',\n notAnswered: ':not(.answered)',\n notInformational: ':not(.info)',\n informational: '.info',\n hidden: '.hidden',\n disabled: '.disabled'\n };\n\n /**\n * Maps the filter mode to filter criteria.\n * Each filter criteria is a CSS selector used to find and mask the items to be discarded by the filter.\n * @type {Object}\n * @private\n */\n var _filterMap = {\n all: '',\n unanswered: [_selectors.answered, _selectors.informational].join(','),\n flagged: _selectors.notFlagged,\n answered: _selectors.notAnswered,\n filtered: _selectors.hidden\n };\n\n /**\n *\n * @type {Object}\n */\n var navigatorApi = {\n /**\n * Updates the stats on the flagged items in the current map\n * @param {Number} position\n * @param {Boolean} flag\n */\n updateStats: function updateStats(position, flag) {\n var map = this.map;\n var item;\n if (map) {\n item = mapHelper.getItemAt(map, position);\n if (item) {\n item.flagged = flag;\n mapHelper.updateItemStats(map, position);\n }\n }\n },\n /**\n * Gets the total number of items for the provided target\n * @param {Object} progression\n * @param {String} target\n * @returns {Number}\n */\n getProgressionTotal: function getProgressionTotal(progression, target) {\n var total;\n if ('questions' === target) {\n total = progression.questions;\n } else {\n total = progression.total;\n }\n return total;\n },\n /**\n * Set the marked state of an item\n * @param {Number|String|jQuery} position\n * @param {Boolean} flag\n */\n setItemFlag: function setItemFlag(position, flag) {\n var $item = position && position.jquery ? position : this.controls.$tree.find(`[data-position=${position}]`);\n var progression = this.progression;\n var icon;\n\n // update the map stats\n this.updateStats(position, flag);\n\n // update the item flag\n $item.toggleClass(_cssCls.flagged, flag);\n\n // set the item icon according to its state\n icon = _.find(_iconCls, _.bind($item.hasClass, $item)) || _cssCls.unseen;\n $item.find(_selectors.icons).attr('class', `${_cssCls.icon} icon-${icon}`);\n\n // update the info panel\n progression.flagged = this.controls.$tree.find(_selectors.flagged).length;\n this.writeCount(this.controls.$infoFlagged, progression.flagged, this.getProgressionTotal(progression, 'questions'));\n\n // recompute the filters\n this.filter(this.currentFilter);\n },\n /**\n * Filters the items by a criteria\n * @param {String} criteria\n */\n filter: function filter(criteria) {\n var self = this;\n\n // remove the current filter by restoring all items\n var $items = this.controls.$tree.find(_selectors.items).removeClass(_cssCls.hidden);\n\n // filter the items according to the provided criteria\n var filterCb = _filterMap[criteria];\n if (filterCb) {\n $items.filter(filterCb).addClass(_cssCls.hidden);\n }\n\n // update the section counters\n this.controls.$tree.find(_selectors.sections).each(function () {\n var $section = $$1(this);\n var $itemsFound = $section.find(_selectors.items).not(_selectors.hidden);\n var $filtered = $itemsFound.not(_selectors.disabled);\n self.writeCount($section.find(_selectors.counters), $filtered.length, $itemsFound.length);\n });\n this.currentFilter = criteria;\n },\n /**\n * Update the config\n * @param {Object} [config]\n * @returns {navigatorApi}\n */\n updateConfig: function updateConfig(config) {\n var $component = this.getElement();\n var scopeClass = _cssCls.scope[this.config.scope || _defaults.scope];\n\n // apply the new config\n config = _.merge(this.config, config || {});\n\n // enable/disable the collapsing of the panel\n $component.toggleClass(_cssCls.collapsible, config.canCollapse);\n\n // update the component CSS class according to the scope\n $component.removeClass(scopeClass);\n scopeClass = _cssCls.scope[this.config.scope || _defaults.scope];\n $component.addClass(scopeClass);\n return this;\n },\n /**\n * Keep the active item visible, auto scroll if needed\n */\n autoScroll: function autoScroll() {\n autoscroll(this.controls.$tree.find(_selectors.activeItem), this.controls.$tree);\n },\n /**\n * Updates the review screen\n * @param {Object} map The current test map\n * @param {Object} context The current test context\n * @returns {navigatorApi}\n * @fires navigator#update\n */\n update(map, context) {\n const scopedMap = this.getScopedMap(map, context);\n const testPart = mapHelper.getPart(map, context.testPartId);\n const progression = scopedMap.stats || {\n questions: 0,\n answered: 0,\n flagged: 0,\n viewed: 0,\n total: 0\n };\n const totalQuestions = this.getProgressionTotal(progression, 'questions');\n this.map = map;\n this.progression = progression;\n\n // update the info panel\n this.writeCount(this.controls.$infoAnswered, progression.answered, totalQuestions);\n this.writeCount(this.controls.$infoUnanswered, totalQuestions - progression.answered, totalQuestions);\n this.writeCount(this.controls.$infoViewed, progression.viewed, this.getProgressionTotal(progression, 'total'));\n this.writeCount(this.controls.$infoFlagged, progression.flagged, totalQuestions);\n this.writeCount(this.controls.$infoAll, totalQuestions, null);\n\n // rebuild the tree\n if (!testPart.isLinear) {\n this.controls.$filterBar.show();\n this.controls.$linearState.hide();\n this.controls.$tree.html(navigatorTreeTpl(scopedMap));\n this.autoScroll();\n const activeItem = mapHelper.getActiveItem(scopedMap);\n this.setState('prevents-unseen', this.config.preventsUnseen);\n const isSkipaheadEnabled = activeItem && activeItem.categories && _.indexOf(activeItem.categories, 'x-tao-option-review-skipahead') >= 0;\n this.setState('skipahead-enabled', isSkipaheadEnabled);\n if (this.config.preventsUnseen && !isSkipaheadEnabled) {\n // disables all unseen items to prevent the test taker has access to.\n this.controls.$tree.find(_selectors.unseen).addClass(_cssCls.disabled);\n }\n } else {\n this.controls.$filterBar.hide();\n this.controls.$linearState.show();\n this.controls.$tree.empty();\n }\n\n // apply again the current filter\n this.filter(this.controls.$filters.filter(_selectors.actives).data('mode'));\n\n /**\n * @event navigator#update the navigation data have changed\n */\n this.trigger('update');\n return this;\n },\n /**\n * Gets the scoped map\n * @param {Object} map The current test map\n * @param {Object} context The current test context\n * @returns {object} The scoped map\n */\n getScopedMap: function getScopedMap(map, context) {\n var scopedMap = mapHelper.getScopeMapFromContext(map, context, this.config.scope);\n var testPart = mapHelper.getPart(scopedMap, context.testPartId) || {};\n var section = mapHelper.getSection(scopedMap, context.sectionId) || {};\n var item = mapHelper.getItem(scopedMap, context.itemIdentifier) || {};\n\n // set the active part/section/item\n testPart.active = true;\n section.active = true;\n item.active = true;\n\n //interactive item counter\n let counter = 0;\n\n // adjust each item with additional meta\n return mapHelper.each(scopedMap, function (itm) {\n var cls = [];\n var icon = '';\n if (itm.active) {\n cls.push('active');\n }\n if (itm.informational) {\n cls.push('info');\n icon = icon || 'info';\n }\n if (itm.flagged) {\n cls.push('flagged');\n icon = icon || 'flagged';\n }\n if (itm.answered) {\n cls.push('answered');\n icon = icon || 'answered';\n }\n if (itm.viewed) {\n cls.push('viewed');\n icon = icon || 'viewed';\n } else {\n cls.push('unseen');\n icon = icon || 'unseen';\n }\n if (!itm.informational) {\n counter += 1;\n itm.numberTest = counter; //item position in whole test from 1\n }\n\n itm.cls = cls.join(' ');\n itm.icon = icon;\n });\n },\n /**\n * Updates a counter\n * @param {jQuery} $place\n * @param {Number} count\n * @param {Number|Null} total\n * @private\n */\n writeCount: function writeCount($place, count, total) {\n var display = 0;\n if ($place.parent().hasClass('qti-navigator-tab')) {\n display = Math.max(count, 0);\n } else if (total > 0) {\n display = `${Math.min(count, total)}/${total}`;\n }\n $place.text(display);\n },\n /**\n * Selects an item\n * @param {String|jQuery} position The item's position\n * @param {Boolean} [open] Forces the tree to be opened on the selected item\n * @returns {jQuery} Returns the selected item\n */\n select: function select(position, open) {\n // find the item to select and extract its hierarchy\n var $tree = this.controls.$tree;\n var selected = position && position.jquery ? position : $tree.find(`[data-position=${position}]`);\n var hierarchy = selected.parentsUntil($tree);\n var previousPosition = 0;\n var $previous = $tree.find(_selectors.activeItem);\n if ($previous.length) {\n previousPosition = $previous.data('position');\n }\n\n // collapse the full tree and open only the hierarchy of the selected item\n if (open) {\n this.openOnly(hierarchy);\n }\n\n // select the item\n $tree.find(_selectors.actives).removeClass(_cssCls.active);\n hierarchy.add(selected).addClass(_cssCls.active);\n position = selected.data('position');\n\n /**\n * An item is selected\n *\n * @param {Number} position - The item position on which select\n * @param {Number} previousPosition - The item position from which select\n * @event navigator#selected\n */\n this.trigger('selected', position, previousPosition);\n return selected;\n },\n /**\n * Opens the tree on the selected item only\n * @returns {jQuery} Returns the selected item\n */\n openSelected: function openSelected() {\n // find the selected item and extract its hierarchy\n var $tree = this.controls.$tree;\n var selected = $tree.find(_selectors.items + _selectors.actives);\n var hierarchy = selected.parentsUntil($tree);\n\n // collapse the full tree and open only the hierarchy of the selected item\n this.openOnly(hierarchy);\n return selected;\n },\n /**\n * Collapses the full tree and opens only the provided branch\n * @param {jQuery} opened The element to be opened\n * @param {jQuery} [root] The root element from which collapse the panels\n */\n openOnly: function openOnly(opened, root) {\n (root || this.controls.$tree).find(_selectors.collapsible).addClass(_cssCls.collapsed);\n opened.removeClass(_cssCls.collapsed);\n },\n /**\n * Toggles a panel\n * @param {jQuery} panel The panel to toggle\n * @param {String} [collapseSelector] Selector of panels to collapse\n * @returns {Boolean} Returns `true` if the panel just expanded now\n */\n togglePanel: function togglePanel(panel, collapseSelector) {\n var collapsed = panel.hasClass(_cssCls.collapsed);\n if (collapseSelector) {\n this.controls.$tree.find(collapseSelector).addClass(_cssCls.collapsed);\n }\n if (collapsed) {\n panel.removeClass(_cssCls.collapsed);\n } else {\n panel.addClass(_cssCls.collapsed);\n }\n return collapsed;\n },\n /**\n * Toggles the display state of the component\n * @param {Boolean} [show] External condition that's tells if the component must be shown or hidden\n * @returns {navigatorApi}\n */\n toggle: function toggle(show) {\n if (typeof show === 'undefined') {\n show = this.is('hidden');\n }\n if (show) {\n this.show();\n } else {\n this.hide();\n }\n return this;\n }\n };\n\n /**\n *\n * @param {Object} config\n * @param {String} [config.scope] Limit the review screen to a particular scope: test, testPart, testSection\n * @param {Boolean} [config.preventsUnseen] Prevents the test taker to access unseen items\n * @param {Boolean} [config.canCollapse] Allow the test taker to collapse the component\n * @param {Boolean} [config.canFlag] Allow the test taker to flag items\n * @param {Boolean} [config.hidden] Hide the component at init\n * @returns {*}\n */\n function navigatorFactory(config) {\n var navigator;\n\n /**\n * Flags an item\n * @param {jQuery} $item\n */\n function flagItem($item) {\n var position = $item.data('position');\n var flagged = !$item.hasClass(_cssCls.flagged);\n\n // update the display\n navigator.setItemFlag(position, flagged);\n\n /**\n * An item is flagged\n * @event navigator#flag\n * @param {Number} position - The item position on which jump\n * @param {Boolean} flag - Tells whether the item is marked for review or not\n */\n navigator.trigger('flag', position, flagged);\n }\n\n /**\n * Jumps to an item\n * @param {jQuery} $item\n * @private\n */\n function jump($item) {\n var position = $item.data('position');\n\n /**\n * A jump to a particular item is required\n * @event navigator#jump\n * @param {Number} position - The item position on which jump\n */\n navigator.trigger('jump', position);\n }\n navigator = component(navigatorApi, _defaults).setTemplate(navigatorTpl)\n\n // uninstalls the component\n .on('destroy', function () {\n this.controls = null;\n })\n\n // keep the activ item visible\n .on('show', function () {\n this.autoScroll();\n })\n\n // renders the component\n .on('render', function () {\n var self = this;\n\n // main component elements\n var $component = this.getElement();\n var $filterBar = $component.find(_selectors.filterBar);\n var $filters = $filterBar.find('li');\n var $tree = $component.find(_selectors.tree);\n\n // links the component to the underlying DOM elements\n this.controls = {\n // access to info panel displaying counters\n\n $infoAnswered: $component.find(_selectors.infoAnswered),\n $infoViewed: $component.find(_selectors.infoViewed),\n $infoAll: $component.find(_selectors.tabInfoAll),\n $infoUnanswered: this.config.showLegend ? $component.find(_selectors.infoUnanswered) : $component.find(_selectors.tabInfoUnanswered),\n $infoFlagged: this.config.showLegend ? $component.find(_selectors.infoFlagged) : $component.find(_selectors.tabInfoFlagged),\n // access to filter switches\n $filterBar: $filterBar,\n $filters: $filters,\n // access to the tree of parts/sections/items\n $tree: $tree,\n // access to the panel displayed when a linear part is reached\n $linearState: $component.find(_selectors.linearState)\n };\n\n // apply options\n this.updateConfig();\n\n // click on the collapse handle: collapse/expand the review panel\n $component.on(`click${_selectors.component}`, _selectors.collapseHandle, function () {\n if (!self.is('disabled')) {\n $component.toggleClass(_cssCls.collapsed);\n if ($component.hasClass(_cssCls.collapsed)) {\n self.openSelected();\n }\n }\n });\n\n // click on the info panel title: toggle the related panel\n $component.on(`click${_selectors.component}`, _selectors.infoPanelLabels, function () {\n if (!self.is('disabled')) {\n self.togglePanel($$1(this).closest(_selectors.infoPanel), _selectors.infoPanel);\n }\n });\n\n // click on a part title: toggle the related panel\n $tree.on(`click${_selectors.component}`, _selectors.partLabels, function () {\n var $panel;\n if (!self.is('disabled')) {\n $panel = $$1(this).closest(_selectors.parts);\n if (self.togglePanel($panel, _selectors.parts)) {\n if ($panel.hasClass(_cssCls.active)) {\n self.openSelected();\n } else {\n self.openOnly($panel.find(_selectors.sections).first(), $panel);\n }\n }\n }\n });\n\n // click on a section title: toggle the related panel\n $tree.on(`click${_selectors.component}`, _selectors.sectionLabels, function () {\n if (!self.is('disabled')) {\n self.togglePanel($$1(this).closest(_selectors.sections), _selectors.sections);\n }\n });\n\n // click on an item: jump to the position\n $tree.on(`click${_selectors.component}`, _selectors.itemLabels, function (event) {\n var $item, $target;\n if (!self.is('disabled')) {\n $item = $$1(this).closest(_selectors.items);\n if (!$item.hasClass(_cssCls.disabled)) {\n $target = $$1(event.target);\n if (self.config.canFlag && $target.is(_selectors.icons) && !$component.hasClass(_cssCls.collapsed)) {\n // click on the icon, just flag the item, unless the panel is collapsed\n if (!$item.hasClass(_cssCls.unseen) && !$item.hasClass(_cssCls.info)) {\n flagItem($item);\n }\n } else if (!$item.hasClass(_cssCls.active)) {\n // go to the selected item\n self.select($item);\n jump($item);\n }\n }\n }\n });\n\n // click on the start button inside a linear part: jump to the position\n $tree.on(`click${_selectors.component}`, _selectors.linearStart, function () {\n var $btn;\n if (!self.is('disabled')) {\n $btn = $$1(this);\n\n // go to the first item of the linear part\n if (!$btn.hasClass(_cssCls.disabled)) {\n $btn.addClass(_cssCls.disabled);\n jump($btn);\n }\n }\n });\n\n // click on a filter button\n $filterBar.on(`click${_selectors.component}`, _selectors.filter, function () {\n var $btn, mode;\n if (!self.is('disabled')) {\n $btn = $$1(this);\n mode = $btn.data('mode');\n\n // select the button\n $filters.removeClass(_cssCls.active);\n $filters.attr('aria-selected', false);\n $component.removeClass(_cssCls.collapsed);\n $btn.addClass(_cssCls.active);\n $btn.attr('aria-selected', true);\n\n // filter the items\n self.filter(mode);\n\n //after filtering, ensure that the active item (if exists) is visible\n self.autoScroll();\n }\n });\n });\n\n // set default filter\n navigator.currentFilter = 'all';\n\n // the component will be ready\n return navigator.init(config);\n }\n\n return navigatorFactory;\n\n});\n\n","define('taoQtiTest/runner/plugins/navigation/review/navigatorFizzy',['lodash', 'i18n', 'ui/component', 'ui/itemButtonList', 'taoQtiTest/runner/helpers/map', 'handlebars', 'lib/handlebars/helpers'], function (_, __, componentFactory, itemButtonListFactory, mapHelper, Handlebars, Helpers0) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n componentFactory = componentFactory && Object.prototype.hasOwnProperty.call(componentFactory, 'default') ? componentFactory['default'] : componentFactory;\n itemButtonListFactory = itemButtonListFactory && Object.prototype.hasOwnProperty.call(itemButtonListFactory, 'default') ? itemButtonListFactory['default'] : itemButtonListFactory;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, options, self=this, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;\n\n function program1(depth0,data) {\n \n \n return \" hidden\";\n }\n\n buffer += \"
          \\n
          \\n
          \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Test overview\", options) : helperMissing.call(depth0, \"__\", \"Test overview\", options)))\n + \"
          \\n \\n
          \\n \\n
          \\n

          \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"In this part of the test navigation is not allowed.\", options) : helperMissing.call(depth0, \"__\", \"In this part of the test navigation is not allowed.\", options)))\n + \"\\n

          \\n
          \\n
          \\n\";\n return buffer;\n });\n function navigatorTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template$1 = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, functionType=\"function\", escapeExpression=this.escapeExpression, self=this;\n\n function program1(depth0,data) {\n \n var buffer = \"\", stack1;\n buffer += \"\\n \";\n stack1 = helpers.each.call(depth0, (depth0 && depth0.parts), {hash:{},inverse:self.noop,fn:self.program(2, program2, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n\";\n return buffer;\n }\n function program2(depth0,data) {\n \n var buffer = \"\", stack1;\n buffer += \"\\n \";\n stack1 = helpers.each.call(depth0, (depth0 && depth0.sections), {hash:{},inverse:self.noop,fn:self.program(3, program3, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n return buffer;\n }\n function program3(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\\n
        • \\n
          \\n \";\n if (helper = helpers.label) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.label); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\n
          \\n
          \\n
        • \\n \";\n return buffer;\n }\n\n function program5(depth0,data) {\n \n \n return \"\\n
        • \\n
          \\n
        • \\n\";\n }\n\n buffer += \"
            \\n\";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.displaySectionTitles), {hash:{},inverse:self.program(5, program5, data),fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n
          \\n\";\n return buffer;\n });\n function navigatorTreeTpl(data, options, asString) {\n var html = Template$1(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2022 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Some default values\n * @type {Object}\n * @private\n */\n const _defaults = {\n scope: 'test',\n preventsUnseen: true\n };\n\n /**\n * List of common CSS selectors\n * @type {Object}\n * @private\n */\n const _selectors = {\n component: '.qti-navigator',\n tree: '.qti-navigator-tree',\n linearState: '.qti-navigator-linear',\n closeButton: '.icon-close',\n itemButtonListContainer: '.qti-navigator-items'\n };\n\n /**\n * @param {Object} config\n * @param {String} [config.scope] Limit the review screen to a particular scope: test, testPart, testSection\n * @param {Boolean} [config.preventsUnseen] Prevents the test taker to access unseen items\n * @returns {*}\n */\n function navigatorFactory(config) {\n let component;\n\n /**\n * Handle click on an item: jump to the position, if allowed\n * @param {String} itemId\n */\n function onItemClick(itemId) {\n const item = mapHelper.getItem(component.map, itemId);\n const activeItem = mapHelper.getItem(component.map, component.testContext.itemIdentifier);\n if (item && item.id && !component.is('disabled')) {\n if (!(component.disableUnseenItems && !item.viewed) && (!activeItem || item.position !== activeItem.position)) {\n component.select(item.position);\n /**\n * A jump to a particular item is required\n * @event navigator#jump\n * @param {Number} position - The item position on which jump\n */\n component.trigger('jump', item.position);\n }\n }\n }\n\n /**\n * Render items\n * @param {Object} fizzyItemButtonMap - list of items in format needed for rendering\n * @param {String} activeItemId\n */\n function renderItemButtonListComponents(fizzyItemButtonMap, activeItemId) {\n component.itemButtonListComponents.forEach(c => c.destroy());\n component.itemButtonListComponents = [];\n component.controls.$tree.find(_selectors.itemButtonListContainer).each((index, itemButtonListContainerElem) => {\n const itemButtonListComponent = itemButtonListFactory({\n items: fizzyItemButtonMap.sections[index].items,\n scrollContainer: component.controls.$tree\n }).render(itemButtonListContainerElem).on('click', _ref => {\n let {\n id\n } = _ref;\n return onItemClick(id);\n });\n component.itemButtonListComponents.push(itemButtonListComponent);\n });\n component.itemButtonListComponents.forEach(c => c.setActiveItem(activeItemId));\n }\n\n /**\n * Get list of items in format needed for rendering\n * @param {Object} scopedMap - test map, limited to the scope\n * @param {Boolean} disableUnseenItems\n * @returns {Object}\n */\n function getFizzyItemButtonMap(scopedMap, disableUnseenItems) {\n const {\n displaySectionTitles,\n displayItemTooltip\n } = component.getConfig();\n let nonInformationalCount = 0;\n const fizzyMap = {\n sections: []\n };\n _.forEach(scopedMap.parts, function (part) {\n _.forEach(part.sections, function (dataSection) {\n let fizzySection;\n if (displaySectionTitles) {\n fizzySection = {\n label: dataSection.label,\n items: []\n };\n fizzyMap.sections.push(fizzySection);\n } else {\n if (fizzyMap.sections.length) {\n fizzySection = fizzyMap.sections[0];\n } else {\n fizzySection = {\n items: []\n };\n fizzyMap.sections.push(fizzySection);\n }\n }\n _.forEach(dataSection.items, function (dataItem) {\n if (!dataItem.informational) {\n nonInformationalCount++;\n }\n const fizzyItem = {\n id: dataItem.id,\n position: dataItem.position\n };\n fizzySection.items.push(fizzyItem);\n fizzyItem.numericLabel = dataItem.informational ? '' : `${nonInformationalCount}`;\n if (dataItem.informational) {\n fizzyItem.icon = 'info';\n fizzyItem.ariaLabel = __('Informational item');\n } else if (dataItem.flagged) {\n fizzyItem.icon = 'flagged';\n fizzyItem.ariaLabel = __('Bookmarked question %s', nonInformationalCount);\n } else {\n fizzyItem.icon = null;\n fizzyItem.ariaLabel = __('Question %s', nonInformationalCount);\n }\n if (dataItem.answered) {\n fizzyItem.status = 'answered';\n } else if (dataItem.viewed) {\n fizzyItem.status = 'viewed';\n } else {\n fizzyItem.status = 'unseen';\n }\n if (disableUnseenItems && !dataItem.viewed) {\n // disables all unseen items to prevent the test taker has access to.\n fizzyItem.disabled = true;\n } else if (displayItemTooltip) {\n fizzyItem.title = dataItem.label;\n }\n });\n });\n });\n return fizzyMap;\n }\n\n /**\n *\n * @type {Object}\n */\n const navigatorApi = {\n /**\n * Set the marked state of an item\n * @param {Number} position\n * @param {Boolean} flag\n */\n setItemFlag(position, flag) {\n const updatedMap = _.cloneDeep(this.map);\n const updatedItem = mapHelper.getItemAt(updatedMap, position);\n if (updatedItem && updatedItem.id) {\n updatedItem.flagged = flag;\n const updatedScopeMap = mapHelper.getScopeMapFromContext(updatedMap, this.testContext, this.config.scope);\n const updatedFizzyMap = getFizzyItemButtonMap(updatedScopeMap, this.disableUnseenItems);\n let updatedItemData;\n _.forEach(updatedFizzyMap.sections, fizzySection => {\n updatedItemData = _.find(fizzySection.items, fizzyItem => fizzyItem.id === updatedItem.id);\n if (updatedItemData) {\n return false;\n }\n });\n this.itemButtonListComponents.forEach(c => c.updateItem(updatedItem.id, updatedItemData));\n }\n },\n /**\n * Update the config\n * @returns {navigatorApi}\n */\n updateConfig() {\n //not implemented\n return this;\n },\n /**\n * Updates the review screen\n * @param {Object} map The current test map\n * @param {Object} context The current test context\n * @returns {navigatorApi}\n * @fires navigator#update\n */\n update(map, context) {\n const scopedMap = mapHelper.getScopeMapFromContext(map, context, this.config.scope);\n scopedMap.displaySectionTitles = this.getConfig().displaySectionTitles;\n const activeItemId = context.itemIdentifier;\n const isSkipaheadEnabled = mapHelper.hasItemCategory(map, activeItemId, 'x-tao-option-review-skipahead');\n this.map = map;\n this.testContext = context;\n this.disableUnseenItems = this.config.preventsUnseen && !isSkipaheadEnabled;\n\n // rebuild the tree\n const testPart = mapHelper.getPart(map, context.testPartId);\n if (!testPart.isLinear) {\n this.setState('skipahead-enabled', isSkipaheadEnabled);\n this.setState('prevents-unseen', this.config.preventsUnseen);\n this.controls.$linearState.hide();\n this.controls.$tree.html(navigatorTreeTpl(scopedMap));\n const fizzyItemButtonMap = getFizzyItemButtonMap(scopedMap, this.disableUnseenItems);\n renderItemButtonListComponents(fizzyItemButtonMap, activeItemId);\n } else {\n this.controls.$linearState.show();\n this.controls.$tree.empty();\n }\n\n /**\n * @event navigator#update the navigation data have changed\n */\n this.trigger('update');\n return this;\n },\n /**\n * Selects an item\n * @param {Number} position The item's position\n */\n select(position) {\n let previousPosition = 0;\n const previousItem = mapHelper.getItem(this.map, this.testContext.itemIdentifier);\n if (previousItem && previousItem.id) {\n previousPosition = previousItem.position;\n }\n const item = mapHelper.getItemAt(this.map, parseInt(position));\n if (item && item.id) {\n this.itemButtonListComponents.forEach(c => c.setActiveItem(item.id));\n }\n\n /**\n * An item is selected\n * @param {Number} position - The item position on which select\n * @param {Number} previousPosition - The item position from which select\n * @event navigator#selected\n */\n this.trigger('selected', position, previousPosition);\n }\n };\n component = componentFactory(navigatorApi, _defaults).setTemplate(navigatorTpl).on('init', function () {\n this.itemButtonListComponents = [];\n }).on('destroy', function () {\n this.controls = null;\n this.itemButtonListComponents.forEach(c => c.destroy());\n this.itemButtonListComponents = [];\n }).on('render', function () {\n const $component = this.getElement();\n this.controls = {\n $tree: $component.find(_selectors.tree),\n $linearState: $component.find(_selectors.linearState),\n $closeButton: $component.find(_selectors.closeButton)\n };\n this.controls.$closeButton.on('click', function (e) {\n e.preventDefault();\n /**\n * Review screen should be closed\n * @event navigator#close\n */\n component.trigger('close');\n });\n }).on('enable', function () {\n this.itemButtonListComponents.forEach(c => c.enable());\n }).on('disable', function () {\n this.itemButtonListComponents.forEach(c => c.disable());\n });\n return component.init(config);\n }\n\n return navigatorFactory;\n\n});\n\n","define('taoQtiTest/runner/plugins/navigation/review/review',['lodash', 'i18n', 'ui/hider', 'util/shortcut', 'util/namespace', 'taoTests/runner/plugin', 'taoQtiTest/runner/helpers/map', 'taoQtiTest/runner/plugins/navigation/review/navigator', 'taoQtiTest/runner/plugins/navigation/review/navigatorFizzy'], function (_, __, hider, shortcut, namespaceHelper, pluginFactory, mapHelper, defaultNavigatorFactory, fizzyNavigatorFactory) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n shortcut = shortcut && Object.prototype.hasOwnProperty.call(shortcut, 'default') ? shortcut['default'] : shortcut;\n namespaceHelper = namespaceHelper && Object.prototype.hasOwnProperty.call(namespaceHelper, 'default') ? namespaceHelper['default'] : namespaceHelper;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n defaultNavigatorFactory = defaultNavigatorFactory && Object.prototype.hasOwnProperty.call(defaultNavigatorFactory, 'default') ? defaultNavigatorFactory['default'] : defaultNavigatorFactory;\n fizzyNavigatorFactory = fizzyNavigatorFactory && Object.prototype.hasOwnProperty.call(fizzyNavigatorFactory, 'default') ? fizzyNavigatorFactory['default'] : fizzyNavigatorFactory;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * The display states of the buttons\n */\n var buttonData = {\n setFlag: {\n control: 'set-item-flag',\n title: __('Flag the current item for later review'),\n icon: 'anchor',\n text: __('Flag for Review')\n },\n unsetFlag: {\n control: 'unset-item-flag',\n title: __('Do not flag the current item for later review'),\n icon: 'anchor',\n text: __('Unflag for Review')\n },\n setFlagBookmarked: {\n control: 'set-item-flag',\n title: __('Bookmark the current question for later review'),\n icon: 'bookmark',\n text: __('Bookmark question')\n },\n unsetFlagBookmarked: {\n control: 'unset-item-flag',\n title: __('Do not bookmark the current question for later review'),\n icon: 'bookmark-outline',\n text: __('Bookmark question')\n },\n showReview: {\n control: 'show-review',\n title: __('Show the review screen'),\n icon: 'right',\n text: __('Show Review')\n },\n hideReview: {\n control: 'hide-review',\n title: __('Hide the review screen'),\n icon: 'left',\n text: __('Hide Review')\n },\n showTestOverview: {\n control: 'show-test-overview',\n title: __('Show test overview panel'),\n icon: 'desktop-preview',\n text: __('Test overview')\n },\n hideTestOverview: {\n control: 'hide-test-overview',\n title: __('Hide test overview panel'),\n icon: 'desktop-preview',\n text: __('Test overview')\n }\n };\n\n /**\n * Get the flagged value for the item at that position\n * @param {Object} testMap\n * @param {Number} position - the item position\n * @returns {Boolean}\n */\n function isItemFlagged(testMap, position) {\n const item = mapHelper.getItemAt(testMap, position);\n return !!item.flagged;\n }\n\n /**\n * Update the button based on the provided data\n * @param {Component} button - the element to update\n * @param {Object} data - the button data\n */\n function updateButton(button, data) {\n var $button = button.getElement();\n if (button.is('rendered')) {\n if ($button.data('control') !== data.control) {\n $button.data('control', data.control).attr('title', data.title);\n $button.find('.icon').attr('class', `icon icon-${data.icon}`);\n $button.find('.text').text(data.text);\n if (data.control.includes('flag') || data.control.includes('overview')) {\n if (button.is('active')) {\n button.turnOff();\n } else {\n button.turnOn();\n }\n }\n }\n }\n }\n\n /**\n * Checks if the current context allows to mark the item for review\n * @param {Object} testRunner\n * @returns {Boolean}\n */\n function canFlag(testRunner) {\n const testContext = testRunner.getTestContext();\n const testMap = testRunner.getTestMap();\n const item = testRunner.getCurrentItem();\n const testPart = testRunner.getCurrentPart();\n const markReviewCategory = mapHelper.hasItemCategory(testMap, testContext.itemIdentifier, 'markReview', true);\n return !!(!testPart.isLinear && markReviewCategory && !(item && item.informational));\n }\n\n /**\n * Creates the timer plugin\n */\n var review = pluginFactory({\n name: 'review',\n /**\n * Initializes the plugin (called during runner's init)\n */\n init: function init() {\n const self = this;\n const testRunner = this.getTestRunner();\n const testContext = testRunner.getTestContext();\n const testMap = testRunner.getTestMap();\n const testRunnerOptions = testRunner.getOptions();\n const pluginShortcuts = (testRunnerOptions.shortcuts || {})[this.getName()] || {};\n const pluginConfig = this.getConfig();\n let navigatorConfig = testRunnerOptions.review || {\n defaultOpen: false\n };\n navigatorConfig = Object.assign({}, navigatorConfig, pluginConfig);\n this.isFizzyLayout = navigatorConfig && navigatorConfig.reviewLayout === 'fizzy';\n let previousItemPosition;\n\n /**\n * Gets the definition of the flagItem button related to the context\n * @param {Boolean} flag - the flag status\n * @returns {Object}\n */\n function getFlagItemButtonData(flag) {\n let dataType = flag ? 'unsetFlag' : 'setFlag';\n if (self.isFizzyLayout) {\n dataType = flag ? 'unsetFlagBookmarked' : 'setFlagBookmarked';\n }\n return buttonData[dataType];\n }\n\n /**\n * Gets the definition of the toggleNavigator button related to the context\n * @param {Object} navigator - the navigator component\n * @returns {Object}\n */\n function getToggleButtonData(navigator) {\n let dataType = navigator.is('hidden') ? 'showReview' : 'hideReview';\n if (self.isFizzyLayout) {\n dataType = navigator.is('hidden') ? 'showTestOverview' : 'hideTestOverview';\n }\n return buttonData[dataType];\n }\n\n /**\n * Retrieve the review categories of the current item\n * @returns {Object} the calculator categories\n */\n function getReviewCategories() {\n const currentContext = testRunner.getTestContext();\n const currentMap = testRunner.getTestMap();\n return {\n reviewScreen: mapHelper.hasItemCategory(currentMap, currentContext.itemIdentifier, 'reviewScreen', true),\n markReview: mapHelper.hasItemCategory(currentMap, currentContext.itemIdentifier, 'markReview', true)\n };\n }\n\n /**\n * Tells if the component is enabled\n * @returns {Boolean}\n */\n function isPluginAllowed() {\n const categories = getReviewCategories();\n return navigatorConfig.enabled && categories.reviewScreen;\n }\n\n /**\n * Mark an item for review\n * @param {Number} position\n * @param {Boolean} flag\n * @returns {Promise}\n */\n function flagItem(position, flag) {\n self.disable();\n return testRunner.getProxy().callTestAction('flagItem', {\n position,\n flag\n }).then(function () {\n const item = mapHelper.getItemAt(testRunner.getTestMap(), position);\n\n //update the value in the current testMap\n item.flagged = flag;\n\n // update the display of the flag button\n updateButton(self.flagItemButton, getFlagItemButtonData(flag));\n\n // update the item state\n self.navigator.setItemFlag(position, flag);\n self.enable();\n }).catch(function () {\n // rollback on the item flag\n self.navigator.setItemFlag(position, !flag);\n self.enable();\n });\n }\n\n /**\n * Mark the current item for review\n */\n function flagCurrentItem() {\n if (self.getState('enabled') !== false) {\n const itemPosition = testRunner.getTestContext().itemPosition;\n const flagStatus = isItemFlagged(testRunner.getTestMap(), itemPosition);\n flagItem(itemPosition, !flagStatus);\n }\n }\n\n /**\n * Shows/hides the review panel\n *\n * @param [{Boolean} forcedState], true will show the panel\n */\n function togglePanel(forcedState) {\n var isHidden = _.isUndefined(forcedState) ? self.navigator.is('hidden') : forcedState;\n if (isHidden) {\n self.explicitlyHidden = false;\n self.navigator.show();\n } else {\n self.explicitlyHidden = true;\n self.navigator.hide();\n }\n updateButton(self.toggleButton, getToggleButtonData(self.navigator));\n }\n const navigatorFactory = this.isFizzyLayout ? fizzyNavigatorFactory : defaultNavigatorFactory;\n this.navigator = navigatorFactory(navigatorConfig).on('selected', function (position, previousPosition) {\n previousItemPosition = previousPosition;\n }).on('jump', function (position) {\n if (self.getState('enabled') !== false) {\n self.disable();\n testRunner.jump(position, 'item');\n }\n }).on('flag', function (position, flag) {\n if (self.getState('enabled') !== false) {\n flagItem(position, flag);\n }\n }).on('close', function () {\n testRunner.trigger('tool-reviewpanel');\n }).render();\n\n // restore current item in the navigator if movement not allowed\n testRunner.on('alert.notallowed', function () {\n self.navigator.select(previousItemPosition);\n });\n this.explicitlyHidden = false;\n\n // register buttons in the toolbox component\n this.toggleButton = this.getAreaBroker().getToolbox().createEntry(getToggleButtonData(this.navigator));\n this.toggleButton.on('click', function (e) {\n e.preventDefault();\n testRunner.trigger('tool-reviewpanel');\n });\n this.flagItemButton = this.getAreaBroker().getToolbox().createEntry(getFlagItemButtonData(isItemFlagged(testMap, testContext.itemPosition)));\n this.flagItemButton.on('click', function (e) {\n e.preventDefault();\n testRunner.trigger('tool-flagitem');\n });\n if (testRunnerOptions.allowShortcuts) {\n if (pluginShortcuts.flag) {\n shortcut.add(namespaceHelper.namespaceAll(pluginShortcuts.flag, this.getName(), true), function () {\n testRunner.trigger('tool-flagitem');\n }, {\n avoidInput: true\n });\n }\n if (pluginShortcuts.toggle) {\n shortcut.add(namespaceHelper.namespaceAll(pluginShortcuts.toggle, this.getName(), true), function () {\n testRunner.trigger('tool-reviewpanel');\n }, {\n avoidInput: true\n });\n }\n }\n if (!isPluginAllowed()) {\n this.hide();\n }\n\n //disabled by default\n this.disable();\n togglePanel(navigatorConfig.defaultOpen);\n\n //change plugin state\n testRunner.on('render', function () {\n if (isPluginAllowed()) {\n self.show();\n updateButton(self.toggleButton, getToggleButtonData(self.navigator));\n } else {\n self.hide();\n }\n }).on('loaditem', function () {\n const context = testRunner.getTestContext();\n const map = testRunner.getTestMap();\n const testPart = testRunner.getCurrentPart();\n const categories = getReviewCategories();\n if (isPluginAllowed()) {\n updateButton(self.flagItemButton, getFlagItemButtonData(isItemFlagged(map, context.itemPosition)));\n self.navigator.update(map, context).updateConfig({\n canFlag: !testPart.isLinear && categories.markReview\n });\n self.show();\n updateButton(self.toggleButton, getToggleButtonData(self.navigator));\n } else {\n self.hide();\n }\n }).on('enabletools enablenav', function () {\n if (isPluginAllowed()) {\n self.enable();\n }\n }).on('disabletools disablenav', function () {\n if (isPluginAllowed()) {\n self.disable();\n }\n }).on('hidenav', function () {\n self.hide();\n }).on('shownav', function () {\n if (isPluginAllowed()) {\n self.show();\n }\n }).on('tool-flagitem', function () {\n if (isPluginAllowed() && canFlag(testRunner)) {\n flagCurrentItem();\n }\n }).on('tool-reviewpanel', function () {\n if (isPluginAllowed() && self.getState('enabled')) {\n togglePanel();\n }\n });\n },\n /**\n * Called during the runner's render phase\n */\n render: function render() {\n var areaBroker = this.getAreaBroker();\n var $panelContainer = areaBroker.getPanelArea();\n $panelContainer.append(this.navigator.getElement());\n },\n /**\n * Called during the runner's destroy phase\n */\n destroy: function destroy() {\n shortcut.remove(`.${this.getName()}`);\n this.navigator.destroy();\n },\n /**\n * Enables the button\n */\n enable: function enable() {\n const testRunner = this.getTestRunner();\n const testContext = testRunner.getTestContext();\n const testMap = testRunner.getTestMap();\n this.flagItemButton.enable();\n this.toggleButton.enable();\n this.navigator.enable();\n if (isItemFlagged(testMap, testContext.itemPosition)) {\n this.flagItemButton.turnOn();\n } else {\n this.flagItemButton.turnOff();\n }\n if (this.isFizzyLayout) {\n if (!this.explicitlyHidden) {\n this.toggleButton.turnOn();\n } else {\n this.toggleButton.turnOff();\n }\n }\n },\n /**\n * Disables the button\n */\n disable: function disable() {\n this.flagItemButton.disable();\n this.flagItemButton.turnOff();\n this.toggleButton.disable();\n if (this.isFizzyLayout) {\n this.toggleButton.turnOff();\n }\n this.navigator.disable();\n },\n /**\n * Shows the button\n */\n show: function show() {\n var testRunner = this.getTestRunner();\n if (canFlag(testRunner)) {\n this.flagItemButton.show();\n } else {\n this.flagItemButton.hide();\n }\n this.toggleButton.show();\n if (!this.explicitlyHidden) {\n this.navigator.show();\n } else {\n this.navigator.hide();\n }\n },\n /**\n * Hides the button\n */\n hide: function hide() {\n this.flagItemButton.hide();\n this.toggleButton.hide();\n this.navigator.hide();\n }\n });\n\n return review;\n\n});\n\n","define('taoQtiTest/runner/plugins/navigation/skip',['jquery', 'i18n', 'ui/hider', 'taoTests/runner/plugin', 'taoQtiTest/runner/helpers/messages', 'handlebars', 'lib/handlebars/helpers', 'taoQtiTest/runner/helpers/navigation', 'taoQtiTest/runner/helpers/map'], function ($$1, __, hider, pluginFactory, messages, Handlebars, Helpers0, navigationHelper, mapHelper) { 'use strict';\n\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n hider = hider && Object.prototype.hasOwnProperty.call(hider, 'default') ? hider['default'] : hider;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n messages = messages && Object.prototype.hasOwnProperty.call(messages, 'default') ? messages['default'] : messages;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n navigationHelper = navigationHelper && Object.prototype.hasOwnProperty.call(navigationHelper, 'default') ? navigationHelper['default'] : navigationHelper;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, functionType=\"function\", escapeExpression=this.escapeExpression, self=this;\n\n function program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \" \";\n if (helper = helpers.className) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.className); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1);\n return buffer;\n }\n\n function program3(depth0,data) {\n \n var buffer = \"\", stack1;\n buffer += \"\\n aria-\"\n + escapeExpression(((stack1 = (data == null || data === false ? data : data.key)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1))\n + \"=\\\"\"\n + escapeExpression((typeof depth0 === functionType ? depth0.apply(depth0) : depth0))\n + \"\\\"\\n \";\n return buffer;\n }\n\n function program5(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\";\n return buffer;\n }\n function program6(depth0,data) {\n \n \n return \" no-label\";\n }\n\n function program8(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\";\n if (helper = helpers.text) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.text); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\";\n return buffer;\n }\n\n buffer += \"\\n \\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.icon), {hash:{},inverse:self.noop,fn:self.program(5, program5, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.text), {hash:{},inverse:self.noop,fn:self.program(8, program8, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \\n\\n\";\n return buffer;\n });\n function buttonTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * The display of the skip\n */\n var buttonData = {\n skip: {\n control: 'skip',\n title: __('Skip and go to the next item'),\n icon: 'external',\n text: __('Skip')\n },\n end: {\n control: 'skip-end',\n title: __('Skip and go to the end of the test'),\n icon: 'external',\n text: __('Skip and end test')\n }\n };\n\n /**\n * Create the button based on the current context\n * @param {Object} testRunner - testRunner\n * @returns {jQueryElement} the button\n */\n var createElement = function createElement(testRunner) {\n const testContext = testRunner.getTestContext();\n const testMap = testRunner.getTestMap();\n const isLast = navigationHelper.isLast(testMap, testContext.itemIdentifier);\n const dataType = isLast ? 'end' : 'skip';\n return $$1(buttonTpl(buttonData[dataType]));\n };\n\n /**\n * Update the button based on the context\n * @param {jQueryElement} $element - the element to update\n * @param {Boolean} [isLast=false] - are we on the last item ?\n */\n const updateElement = function updateElement($element) {\n let isLast = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n const dataType = isLast ? 'end' : 'skip';\n const button = buttonData[dataType];\n if (button && $element.attr('data-control') !== button.control) {\n $element.attr('data-control', button.control).attr('title', button.title).find('.text').text(button.text);\n }\n };\n\n /**\n * Returns the configured plugin\n */\n var skip = pluginFactory({\n name: 'skip',\n /**\n * Initialize the plugin (called during runner's init)\n */\n init() {\n const testRunner = this.getTestRunner();\n const toggle = () => {\n const testContext = testRunner.getTestContext();\n if (testContext.allowSkipping === true) {\n this.show();\n return true;\n }\n this.hide();\n return false;\n };\n function doSkip() {\n testRunner.skip();\n }\n this.$element = createElement(testRunner);\n this.$element.on('click', e => {\n const enable = this.enable.bind(this);\n const testContext = testRunner.getTestContext();\n const testMap = testRunner.getTestMap();\n const isLast = navigationHelper.isLast(testMap, testContext.itemIdentifier);\n const endTestWarning = mapHelper.hasItemCategory(testMap, testContext.itemIdentifier, 'endTestWarning', true);\n e.preventDefault();\n if (this.getState('enabled') !== false) {\n this.disable();\n if (endTestWarning && isLast) {\n testRunner.trigger('confirm.endTest', messages.getExitMessage('test', testRunner), doSkip,\n // if the test taker accept\n enable // if the test taker refuse\n );\n } else {\n doSkip();\n }\n }\n });\n toggle();\n this.disable();\n testRunner.on('loaditem', () => {\n if (toggle()) {\n const testContext = testRunner.getTestContext();\n const testMap = testRunner.getTestMap();\n const isLast = navigationHelper.isLast(testMap, testContext.itemIdentifier);\n updateElement(this.$element, isLast);\n }\n }).on('enablenav', () => this.enable()).on('disablenav', () => this.disable()).on('hidenav', () => this.hide()).on('shownav', () => this.show());\n },\n /**\n * Called during the runner's render phase\n */\n render: function render() {\n var $container = this.getAreaBroker().getNavigationArea();\n $container.append(this.$element);\n },\n /**\n * Called during the runner's destroy phase\n */\n destroy: function destroy() {\n this.$element.remove();\n },\n /**\n * Enable the button\n */\n enable: function enable() {\n this.$element.removeProp('disabled').removeClass('disabled');\n },\n /**\n * Disable the button\n */\n disable: function disable() {\n this.$element.prop('disabled', true).addClass('disabled');\n },\n /**\n * Show the button\n */\n show: function show() {\n hider.show(this.$element);\n },\n /**\n * Hide the button\n */\n hide: function hide() {\n hider.hide(this.$element);\n }\n });\n\n return skip;\n\n});\n\n","define('taoQtiTest/runner/plugins/navigation/validateResponses',['lodash', 'i18n', 'taoTests/runner/plugin', 'taoQtiTest/runner/helpers/currentItem'], function (_, __, pluginFactory, currentItemHelper) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n currentItemHelper = currentItemHelper && Object.prototype.hasOwnProperty.call(currentItemHelper, 'default') ? currentItemHelper['default'] : currentItemHelper;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017-2019 (original work) Open Assessment Technologies SA ;\n */\n var pluginName = 'validateResponses';\n\n /**\n * Plugin\n * @returns {Object}\n */\n var validateResponses = pluginFactory({\n /**\n * Plugin name\n * @type {String}\n */\n name: pluginName,\n /**\n * Initialize plugin (called during runner's initialization)\n * @returns {this}\n */\n init() {\n const testRunner = this.getTestRunner();\n const testRunnerOptions = testRunner.getOptions();\n const pluginConfig = this.getConfig();\n testRunner.before('move', (e, direction) => {\n const testContext = testRunner.getTestContext();\n const isInteracting = !testRunner.getItemState(testContext.itemIdentifier, 'disabled');\n if (!pluginConfig.validateOnPreviousMove && direction === 'previous') {\n return Promise.resolve();\n }\n if (isInteracting && testRunnerOptions.enableValidateResponses) {\n const currenItem = testRunner.getCurrentItem();\n //@deprecated use validateResponses from testMap instead of the testContext\n const validateResponses = typeof currenItem.validateResponses === 'boolean' ? currenItem.validateResponses : testContext.validateResponses;\n if (validateResponses) {\n return new Promise((resolve, reject) => {\n if (_.size(currentItemHelper.getDeclarations(testRunner)) === 0) {\n return resolve();\n }\n if (currentItemHelper.isAnswered(testRunner, false)) {\n return resolve();\n }\n if (!testRunner.getState('alerted.notallowed')) {\n // Only show one alert for itemSessionControl\n testRunner.setState('alerted.notallowed', true);\n testRunner.trigger('alert.notallowed', __('A valid response to this item is required.'), () => {\n testRunner.trigger('resumeitem');\n reject();\n testRunner.setState('alerted.notallowed', false);\n });\n }\n });\n }\n }\n });\n return this;\n }\n });\n\n return validateResponses;\n\n});\n\n","define('taoQtiTest/runner/plugins/navigation/warnBeforeLeaving',['i18n', 'taoTests/runner/plugin'], function (__, pluginFactory) { 'use strict';\n\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * There's only a few chance to have this message displayed.\n * Most browsers doesn't support custom message anymore.\n * See https://www.chromestatus.com/feature/5349061406228480\n */\n var warnMessage = __('Please confirm you want to leave the test.');\n\n /**\n * The beforeunload listener\n * @param {Event} e\n * @returns {String} the custom message (for some browser, just need to be a string)\n */\n var warnListener = function warnListener(e) {\n e.returnValue = warnMessage;\n return warnMessage;\n };\n\n /**\n * Plugin factory\n * @returns {Object}\n */\n var warnBeforeLeaving = pluginFactory({\n /**\n * Plugin name\n * @type {String}\n */\n name: 'warnBeforeLeaving',\n /**\n * Initialize plugin (called during runner's initialization)\n */\n init: function init() {\n this.enable();\n },\n /**\n * Destroy plugin (called during runner's destruction)\n */\n destroy: function destroy() {\n this.disable();\n },\n /**\n * Enables the warning\n */\n enable: function enable() {\n window.addEventListener('beforeunload', warnListener);\n },\n /**\n * Disables the warning\n */\n disable: function disable() {\n window.removeEventListener('beforeunload', warnListener);\n }\n });\n\n return warnBeforeLeaving;\n\n});\n\n","define('taoQtiTest/runner/plugins/security/disableRightClick',['taoTests/runner/plugin'], function (pluginFactory) { 'use strict';\n\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n var disableRightClick = pluginFactory({\n name: 'disableRightClick',\n /**\n * Initializes the plugin (called during runner's init)\n */\n init: function init() {\n var rightClickEvents = ['contextmenu', 'mousedown', 'mouseup'];\n rightClickEvents.forEach(function (eventName) {\n window.document.addEventListener(eventName, function disableRightClick(event) {\n if (event.button === 2) {\n event.preventDefault();\n }\n });\n });\n }\n });\n\n return disableRightClick;\n\n});\n\n","define('taoQtiTest/runner/plugins/tools/answerElimination/eliminator',['lodash', 'i18n', 'ui/hider', 'util/shortcut', 'util/namespace', 'taoQtiTest/runner/helpers/map', 'taoTests/runner/plugin'], function (_, __, hider, shortcut, namespaceHelper, mapHelper, pluginFactory) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n shortcut = shortcut && Object.prototype.hasOwnProperty.call(shortcut, 'default') ? shortcut['default'] : shortcut;\n namespaceHelper = namespaceHelper && Object.prototype.hasOwnProperty.call(namespaceHelper, 'default') ? namespaceHelper['default'] : namespaceHelper;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017 (original work) Open Assessment Technologies SA;\n */\n\n /**\n * The public name of the plugin\n * @type {String}\n */\n var pluginName = 'eliminator';\n\n /**\n * The prefix of actions triggered through the event loop\n * @type {String}\n */\n var actionPrefix = `tool-${pluginName}-`;\n\n /**\n * Some default options for the plugin\n * @type {Object}\n */\n var defaultConfig = {\n // when hiding the buttons, don't remove existing eliminations\n removeEliminationsOnClose: false,\n // when showing the buttons, restore previously set eliminations\n restoreEliminationsOnOpen: false\n };\n\n /**\n * Returns the configured plugin\n */\n var eliminator = pluginFactory({\n name: pluginName,\n /**\n * Initialize the plugin (called during runner's init)\n */\n init() {\n const self = this;\n const testRunner = this.getTestRunner();\n const $container = testRunner.getAreaBroker().getContentArea().parent();\n const testRunnerOptions = testRunner.getOptions();\n const pluginShortcuts = (testRunnerOptions.shortcuts || {})[pluginName] || {};\n const config = Object.assign({}, defaultConfig, this.getConfig());\n\n // register the button in the toolbox\n this.button = this.getAreaBroker().getToolbox().createEntry({\n control: 'eliminator',\n title: __('Eliminate choices'),\n icon: 'eliminate',\n text: __('Answer Eliminator')\n });\n\n /**\n * Checks if the plugin is currently available\n * @returns {Boolean}\n */\n function isPluginEnabled() {\n //to be activated with the special category x-tao-option-eliminator\n return mapHelper.hasItemCategory(testRunner.getTestMap(), testRunner.getTestContext().itemIdentifier, 'eliminator', true);\n }\n\n /**\n * Is plugin activated ? if not, then we hide the plugin\n */\n function togglePluginButton() {\n if (isPluginEnabled()) {\n self.show();\n } else {\n self.hide();\n }\n }\n function togglePlugin() {\n if (!self.$choiceInteractions) {\n return;\n }\n self.$choiceInteractions.toggleClass('eliminable');\n if (isEliminable()) {\n enableEliminator();\n } else {\n disableEliminator();\n }\n }\n function isEliminable() {\n if (!self.$choiceInteractions) {\n return;\n }\n return self.$choiceInteractions.hasClass('eliminable');\n }\n function enableEliminator() {\n var $choices;\n if (!self.$choiceInteractions) {\n return;\n }\n $choices = self.$choiceInteractions.find('.qti-choice');\n self.button.turnOn();\n self.trigger('start');\n if (config.restoreEliminationsOnOpen) {\n $choices.each(function () {\n var input = this.querySelector('.real-label input');\n if (this.dataset.wasEliminated) {\n this.dataset.wasEliminated = null;\n this.classList.add('eliminated');\n input.setAttribute('disabled', 'disabled');\n input.checked = false;\n }\n });\n }\n }\n function disableEliminator() {\n var $choices;\n if (!self.$choiceInteractions) {\n return;\n }\n $choices = self.$choiceInteractions.find('.qti-choice');\n self.$choiceInteractions.removeClass('eliminable');\n self.button.turnOff();\n self.trigger('end');\n $choices.each(function () {\n if (this.classList.contains('eliminated')) {\n this.dataset.wasEliminated = true;\n this.classList.remove('eliminated');\n this.querySelector('.real-label input').removeAttribute('disabled');\n }\n });\n }\n\n //add a new mask each time the button is pressed\n this.button.on('click', function (e) {\n e.preventDefault();\n testRunner.trigger(`${actionPrefix}toggle`);\n });\n\n // handle the plugin's shortcuts\n if (testRunnerOptions.allowShortcuts) {\n _.forEach(pluginShortcuts, function (command, key) {\n shortcut.add(namespaceHelper.namespaceAll(command, pluginName, true), function () {\n // just fire the action using the event loop\n testRunner.trigger(actionPrefix + key);\n }, {\n avoidInput: true\n });\n });\n }\n\n //start disabled\n this.disable();\n\n //update plugin state based on changes\n testRunner.on('loaditem', togglePluginButton).on('renderitem', function conditionalInit() {\n // show button only when in the presence of choice interactions\n self.$choiceInteractions = $container.find('.qti-choiceInteraction');\n if (!self.$choiceInteractions.length) {\n self.hide();\n return;\n }\n if (isPluginEnabled()) {\n self.show();\n }\n }).on('enabletools renderitem', function () {\n self.enable();\n }).on('disabletools unloaditem', function () {\n self.disable();\n disableEliminator();\n })\n\n // commands that controls the plugin\n .on(`${actionPrefix}toggle`, function () {\n if (isPluginEnabled()) {\n togglePlugin();\n }\n })\n // Answer-eliminator and Answer-masking are mutually exclusive tools\n .on('tool-answer-masking-toggle', function () {\n if (isEliminable()) {\n disableEliminator();\n }\n });\n },\n /**\n * Called during the runner's destroy phase\n */\n destroy: function destroy() {\n shortcut.remove(`.${pluginName}`);\n },\n /**\n * Enable the button\n */\n enable: function enable() {\n this.button.enable();\n },\n /**\n * Disable the button\n */\n disable: function disable() {\n this.button.disable();\n },\n /**\n * Show the button\n */\n show: function show() {\n this.button.show();\n },\n /**\n * Hide the button\n */\n hide: function hide() {\n this.button.hide();\n }\n });\n\n return eliminator;\n\n});\n\n","define('taoQtiTest/runner/plugins/tools/answerMasking/answerMasking',['lodash', 'jquery', 'core/statifier', 'ui/component', 'handlebars', 'lib/handlebars/helpers'], function (_, $$1, statifier, componentFactory, Handlebars, Helpers0) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n statifier = statifier && Object.prototype.hasOwnProperty.call(statifier, 'default') ? statifier['default'] : statifier;\n componentFactory = componentFactory && Object.prototype.hasOwnProperty.call(componentFactory, 'default') ? componentFactory['default'] : componentFactory;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); \n\n\n return \"
          \\n \\n
          \";\n });\n function maskTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017 (original work) Open Assessment Technologies SA;\n */\n var ns = '.answerMasking';\n\n /**\n * @param {jQuery} $contentArea - DOM element containing the rendered item\n */\n function answerMaskingFactory($contentArea) {\n var answerMasking,\n allMasks = [],\n maskApi = {\n /**\n * Toggle mask visibility\n * @returns {component}\n */\n toggle: function toggle() {\n if (this.is('masked')) {\n return this.reveal();\n } else {\n return this.mask();\n }\n },\n /**\n * Show the choice under the current mask\n * @returns {component}\n */\n reveal: function reveal() {\n var $container = this.getContainer();\n $container.removeClass('masked');\n $container.find('input').removeAttr('disabled');\n this.setState('masked', false);\n return this;\n },\n /**\n * Cover the whole choice with the mask\n * @returns {component}\n */\n mask: function mask() {\n var $container = this.getContainer();\n $container.addClass('masked');\n $container.find('input').attr('disabled', 'disabled');\n this.setState('masked', true);\n return this;\n }\n };\n\n /**\n * Creates a ui/component to serve as a mask over a QTI Choice\n * @param {jQuery} $container - the qti-choice element\n * @returns {component}\n */\n function createMask($container) {\n return componentFactory(maskApi).setTemplate(maskTpl).on('render', function () {\n var self = this,\n $component = this.getElement();\n $component.on(`click${ns}`, function (e) {\n e.stopPropagation();\n e.preventDefault();\n self.toggle();\n });\n }).on('destroy', function () {\n var $component = this.getElement();\n $component.off(ns);\n }).init().render($container).mask();\n }\n\n /**\n * The answer masking helper\n */\n answerMasking = {\n /**\n * Enable the answer masking functionality by creating masks over the Qti Choices\n */\n enable: function enable() {\n var $choiceInteractions = $contentArea.find('.qti-choiceInteraction'),\n $qtiChoices = $contentArea.find('.qti-choice');\n allMasks = [];\n $choiceInteractions.addClass('maskable');\n $qtiChoices.each(function () {\n var $choice = $$1(this);\n allMasks.push(createMask($choice));\n });\n this.setState('enabled', true);\n },\n /**\n * Remove any answerMasking-related markup from the rendered item\n */\n disable: function disable() {\n var $choiceInteractions = $contentArea.find('.qti-choiceInteraction');\n $choiceInteractions.removeClass('maskable');\n allMasks.forEach(function (mask) {\n mask.reveal(); // remove class on container\n mask.destroy();\n });\n allMasks = [];\n this.setState('enabled', false);\n },\n /**\n * Return the current state of the masks\n * @returns {Boolean[]} - true if the choice is masked, false if the choice is revealed\n */\n getMasksState: function getMasksState() {\n var state = allMasks.map(function (mask) {\n return mask.is('masked');\n });\n return state;\n },\n /**\n * Restore a previously saved state for the masked choices\n * @param {Boolean[]} state - array of boolean, most probably given by the getMasksState method\n */\n setMasksState: function setMasksState(state) {\n state = state || [];\n state.forEach(function (masked, index) {\n var mask = allMasks[index];\n if (_.isObject(mask) && _.isFunction(mask.reveal) && !masked) {\n mask.reveal();\n }\n });\n }\n };\n statifier(answerMasking);\n return answerMasking;\n }\n\n return answerMaskingFactory;\n\n});\n\n","define('taoQtiTest/runner/plugins/tools/answerMasking/plugin',['i18n', 'taoTests/runner/plugin', 'ui/hider', 'util/shortcut', 'util/namespace', 'taoQtiTest/runner/helpers/map', 'taoQtiTest/runner/plugins/tools/answerMasking/answerMasking'], function (__, pluginFactory, hider, shortcut, namespaceHelper, mapHelper, answerMaskingFactory) { 'use strict';\n\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n shortcut = shortcut && Object.prototype.hasOwnProperty.call(shortcut, 'default') ? shortcut['default'] : shortcut;\n namespaceHelper = namespaceHelper && Object.prototype.hasOwnProperty.call(namespaceHelper, 'default') ? namespaceHelper['default'] : namespaceHelper;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n answerMaskingFactory = answerMaskingFactory && Object.prototype.hasOwnProperty.call(answerMaskingFactory, 'default') ? answerMaskingFactory['default'] : answerMaskingFactory;\n\n /*\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017 (original work) Open Assessment Technologies SA (under the project TAO-PRODUCT);\n *\n */\n\n /**\n * The public name of the plugin\n * @type {String}\n */\n var pluginName = 'answer-masking';\n\n /**\n * The prefix of actions triggered through the event loop\n * @type {String}\n */\n var actionPrefix = `tool-${pluginName}-`;\n\n /**\n * Stores the masking state for each item in the test\n * @type {Object}\n */\n var itemStates = {};\n\n /**\n * Default Configuration\n */\n var defaultConfig = {\n restoreStateOnToggle: true,\n restoreStateOnMove: true\n };\n\n /**\n * Returns the configured plugin\n */\n var plugin = pluginFactory({\n name: pluginName,\n /**\n * Initialize the plugin (called during runner's init)\n */\n init: function init() {\n const self = this;\n const testRunner = this.getTestRunner();\n const testRunnerOptions = testRunner.getOptions();\n const pluginConfig = Object.assign({}, defaultConfig, this.getConfig());\n const pluginShortcuts = (testRunnerOptions.shortcuts || {})[pluginName] || {};\n const $contentArea = this.getAreaBroker().getContentArea();\n var answerMasking = answerMaskingFactory($contentArea);\n function isPluginEnabled() {\n //to be activated with the special category x-tao-option-answerMasking\n const answerMaskingCategory = mapHelper.hasItemCategory(testRunner.getTestMap(), testRunner.getTestContext().itemIdentifier, 'answerMasking', true);\n return answerMaskingCategory && itemContainsChoiceInteraction();\n }\n function itemContainsChoiceInteraction() {\n var $container = self.getAreaBroker().getContentArea().parent();\n return $container.find('.qti-choiceInteraction').length;\n }\n function togglePluginButton() {\n if (isPluginEnabled()) {\n self.show();\n } else {\n self.hide();\n }\n }\n function togglePlugin() {\n if (!answerMasking.getState('enabled')) {\n enableMasking();\n } else {\n disableMasking();\n }\n }\n function enableMasking() {\n var testContext = testRunner.getTestContext(),\n itemId = testContext.itemIdentifier;\n answerMasking.enable();\n if (pluginConfig.restoreStateOnToggle) {\n answerMasking.setMasksState(itemStates[itemId]);\n }\n self.button.turnOn();\n self.trigger('start');\n }\n function disableMasking() {\n var testContext = testRunner.getTestContext(),\n itemId = testContext.itemIdentifier;\n if (answerMasking.getState('enabled')) {\n itemStates[itemId] = answerMasking.getMasksState();\n }\n answerMasking.disable();\n self.button.turnOff();\n self.trigger('end');\n }\n\n // create buttons\n this.button = this.getAreaBroker().getToolbox().createEntry({\n title: __('Answer Masking'),\n icon: 'result-nok',\n control: 'answer-masking',\n text: __('Answer Masking')\n });\n\n // attach user events\n this.button.on('click', function (e) {\n e.preventDefault();\n testRunner.trigger(`${actionPrefix}toggle`);\n });\n if (testRunnerOptions.allowShortcuts) {\n if (pluginShortcuts.toggle) {\n shortcut.add(namespaceHelper.namespaceAll(pluginShortcuts.toggle, this.getName(), true), function () {\n testRunner.trigger(`${actionPrefix}toggle`);\n }, {\n avoidInput: true,\n prevent: true\n });\n }\n }\n\n //start disabled\n this.disable();\n\n //update plugin state based on changes\n testRunner.on('loaditem', function () {\n var testContext = testRunner.getTestContext(),\n itemId = testContext.itemIdentifier;\n if (!pluginConfig.restoreStateOnMove) {\n itemStates[itemId] = [];\n }\n togglePluginButton();\n }).on('enabletools renderitem', function () {\n togglePluginButton(); // we repeat this here as we need the rendered item markup in order to decide whether the plugin is enabled\n self.enable();\n }).on('beforeunloaditem', function () {\n disableMasking();\n }).on('disabletools unloaditem', function () {\n self.disable();\n disableMasking();\n }).on(`${actionPrefix}toggle`, function () {\n if (isPluginEnabled()) {\n togglePlugin();\n }\n })\n // Answer-eliminator and Answer-masking are mutually exclusive tools\n .on('tool-eliminator-toggle', function () {\n disableMasking();\n });\n },\n /**\n * Called during the runner's destroy phase\n */\n destroy: function destroy() {\n shortcut.remove(`.${this.getName()}`);\n },\n /**\n * Enable the button\n */\n enable: function enable() {\n this.button.enable();\n },\n /**\n * Disable the button\n */\n disable: function disable() {\n this.button.disable();\n },\n /**\n * Show the button\n */\n show: function show() {\n this.button.show();\n },\n /**\n * Hide the button\n */\n hide: function hide() {\n this.button.hide();\n }\n });\n\n return plugin;\n\n});\n\n","define('taoQtiTest/runner/plugins/tools/apipTextToSpeech/textToSpeech',['jquery', 'i18n', 'handlebars', 'lib/handlebars/helpers', 'ui/component', 'interact', 'ui/component/stackable', 'ui/component/placeable', 'ui/feedback', 'nouislider'], function ($$1, __, Handlebars, Helpers0, component, interact, makeStackable, makePlaceable, feedback, nouislider) { 'use strict';\n\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n component = component && Object.prototype.hasOwnProperty.call(component, 'default') ? component['default'] : component;\n interact = interact && Object.prototype.hasOwnProperty.call(interact, 'default') ? interact['default'] : interact;\n makeStackable = makeStackable && Object.prototype.hasOwnProperty.call(makeStackable, 'default') ? makeStackable['default'] : makeStackable;\n makePlaceable = makePlaceable && Object.prototype.hasOwnProperty.call(makePlaceable, 'default') ? makePlaceable['default'] : makePlaceable;\n feedback = feedback && Object.prototype.hasOwnProperty.call(feedback, 'default') ? feedback['default'] : feedback;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", helper, options, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;\n\n\n buffer += \"
          \\n
          \\n
          \\n \\n \\n \\n
          \\n \\n
          \\n \\n \\n \\n \\n
          \\n
          \\n \\n \\n \\n
          \\n
          \\n \\n \\n \\n
          \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Speed\", options) : helperMissing.call(depth0, \"__\", \"Speed\", options)))\n + \"
          \\n
          \\n
          \\n
          \\n
          \\n\";\n return buffer;\n });\n function ttsTemplate(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA;\n */\n const defaultConfig = {\n activeElementClass: 'tts-active-content-node',\n elementClass: 'tts-content-node',\n left: -10,\n maxPlaybackRate: 2,\n minPlaybackRate: 0.5,\n playbackRate: 1,\n top: 50\n };\n const stackingOptions = {\n stackingScope: 'test-runner'\n };\n\n /**\n * Creates an instance of Text to Speech component\n *\n * @param {Element} container\n * @param {Object} config - component configurations\n * @param {String} config.activeElementClass - class applied to active content element. Default value 'tts-active-content-node'\n * @param {String} config.elementClass - class applied to content element. Default value 'tts-content-node'\n * @param {Number} config.left - initial left position of component. Default value 50\n * @param {Number} config.maxPlaybackRate - max playback rate. Default value 2\n * @param {Number} config.minPlaybackRate - min playback rate. Default value 0.5\n * @param {Number} config.playbackRate - playback rate. Default value 1\n * @param {Number} config.top - initial top position of component. Default value 50\n * @returns {ttsComponent} the textToSpeech component (uninitialized)\n */\n function maskingComponentFactory(container, config) {\n const audio = new Audio();\n let currentPlayback = [];\n let currentItem;\n let mediaContentData = [];\n let playbackRate;\n\n // Browser does not support selection Api If getSelection is not defined\n const selection = window.getSelection && window.getSelection();\n\n // component API\n const spec = {\n /**\n * Remove APIP element class and click handlers from APIP elements\n */\n clearAPIPElements() {\n const {\n elementClass\n } = this.config;\n const $contentNodes = $$1(mediaContentData.map(_ref => {\n let {\n selector\n } = _ref;\n return selector;\n }).join(', '), container);\n $contentNodes.removeClass(elementClass);\n $contentNodes.off('click', this.handleContentNodeClick);\n },\n /**\n * Update componet state and stop playback\n *\n * @fires close\n */\n close() {\n this.setTTSStateOnContainer('playing', false);\n this.setTTSStateOnContainer('sfhMode', false);\n this.setState('settings', false);\n this.stop();\n this.trigger('close');\n },\n /**\n * Get current active APIP item\n *\n * @returns {Object} active APIP item\n */\n getCurrentItem() {\n return currentItem;\n },\n /**\n * When component in start from here mode, switch to clicked content element\n *\n * @param {Object} e - event object\n */\n handleContentNodeClick(e) {\n const $target = $$1(e.target);\n\n // Allow default behaviour for inputs\n if ($target.hasClass('icon-checkbox') || $target.hasClass('icon-radio') || $target.is('input')) {\n return;\n }\n\n // Prevent default behaviour for lables and links\n e.stopPropagation();\n e.preventDefault();\n if (!this.is('sfhMode')) {\n return;\n }\n const $currentTarget = $$1(e.currentTarget);\n // Find APIP item associated with clicked element\n const selectedItemIndex = mediaContentData.findIndex(_ref2 => {\n let {\n selector\n } = _ref2;\n return $currentTarget.is(selector);\n });\n currentPlayback = mediaContentData.slice(selectedItemIndex);\n this.stop();\n this.initNextItem();\n this.togglePlayback();\n },\n /**\n * Select APIP item for default mode\n */\n initDefaultModeItem() {\n this.initItemWithTextSelection();\n if (!currentItem) {\n this.initDefaultModePlayback();\n }\n },\n /**\n * Check if there is some selected content inside APIP elelemts on the page\n */\n initItemWithTextSelection() {\n // Check if there is selected content\n if (this.is('sfhMode') || !selection || !selection.toString()) {\n return;\n }\n\n // Get APIP item by current selection\n const currentSelection = selection.getRangeAt(0);\n const {\n commonAncestorContainer\n } = currentSelection;\n const selectedItem = mediaContentData.find(_ref3 => {\n let {\n selector\n } = _ref3;\n const $item = $$1(selector, container);\n return $item.is(commonAncestorContainer) || $$1.contains($item[0], commonAncestorContainer);\n });\n if (selectedItem && selectedItem !== currentItem) {\n currentPlayback = [selectedItem];\n this.initNextItem();\n }\n },\n /**\n * Check if there is next APIP item to play and start playback if component in playing state.\n * If there is no APIP item to play stop playback\n *\n * @fires finish\n * @fires next\n */\n initNextItem() {\n const {\n activeElementClass\n } = this.config;\n currentItem && $$1(currentItem.selector, container).removeClass(activeElementClass);\n currentItem = currentPlayback.shift();\n if (currentItem) {\n const {\n selector,\n url\n } = currentItem;\n $$1(selector, container).addClass(activeElementClass);\n audio.setAttribute('src', url);\n audio.load();\n audio.playbackRate = playbackRate;\n if (this.is('playing')) {\n audio.play();\n }\n this.trigger('next');\n return;\n }\n this.trigger('finish');\n this.stop();\n },\n /**\n * Init default mode playback\n */\n initDefaultModePlayback() {\n currentPlayback = [...mediaContentData];\n this.initNextItem();\n },\n /**\n * Set APIP data. Apply handlers to APIP elements. Stop current playback\n *\n * @param {Array} data - APIP data items\n */\n setMediaContentData(data) {\n this.clearAPIPElements();\n const {\n elementClass\n } = this.config;\n mediaContentData = data;\n const $contentNodes = $$1(mediaContentData.map(_ref4 => {\n let {\n selector\n } = _ref4;\n return selector;\n }).join(', '), container);\n $contentNodes.addClass(elementClass);\n $contentNodes.on('click', this.handleContentNodeClick);\n this.stop();\n },\n /**\n * Set playback rate\n *\n * @param {Object} e - event object\n * @param {Number} value - playback rate\n */\n setPlaybackRate(e, value) {\n playbackRate = value;\n audio.playbackRate = value;\n },\n /**\n * Update component state. Toggle state class on page body\n *\n * @param {String} name\n * @param {Boolean} value\n */\n setTTSStateOnContainer(name, value) {\n this.setState(name, value);\n $$1(container).toggleClass(`tts-${name}`, value);\n },\n /**\n * Pause playback and update component state. Set current item to null\n */\n stop() {\n const {\n activeElementClass\n } = this.config;\n audio.pause();\n audio.currentTime = 0;\n currentItem && $$1(currentItem.selector, container).removeClass(activeElementClass);\n currentItem = null;\n this.setTTSStateOnContainer('playing', false);\n },\n /**\n * Toggle playback\n *\n * @param {Object} e - event object\n */\n togglePlayback(e) {\n e && e.preventDefault();\n const isPlaying = this.is('playing');\n this.initDefaultModeItem();\n if (!isPlaying && currentItem) {\n audio.play();\n this.setTTSStateOnContainer('playing', true);\n } else {\n audio.pause();\n this.setTTSStateOnContainer('playing', false);\n }\n },\n /**\n * Toggle start from here mode\n */\n toggleSFHMode() {\n const isSFHMode = this.is('sfhMode');\n this.setTTSStateOnContainer('sfhMode', !isSFHMode);\n this.stop();\n },\n /**\n * Toggle settings element\n */\n toggleSettings() {\n const isSettings = this.is('settings');\n this.setState('settings', !isSettings);\n\n // if settings was enabled make sure that component still inside the container\n if (!isSettings) {\n this.handleResize();\n }\n },\n /**\n * Handle browser resize\n */\n handleResize() {\n // offset from right\n const offsetFromRight = 10;\n const {\n x,\n y\n } = this.getPosition();\n const maxXPosition = window.innerWidth - this.getElement().width() - offsetFromRight;\n this.moveTo(x > maxXPosition ? maxXPosition : x, y);\n }\n };\n const ttsComponent = component(spec, defaultConfig);\n makePlaceable(ttsComponent);\n makeStackable(ttsComponent, stackingOptions);\n ttsComponent.setTemplate(ttsTemplate).on('init', function () {\n if (container.hasClass('tts-component-container')) {\n throw new Error('Container already has assigned text to speech component');\n }\n container.addClass('tts-component-container');\n this.render(container);\n }).on('render', function () {\n let {\n left,\n maxPlaybackRate,\n minPlaybackRate,\n playbackRate: defaultPlaybackRate,\n top\n } = this.getConfig();\n if (left < 0) {\n left = window.innerWidth - this.getElement().width() + left;\n }\n const $element = this.getElement();\n const $closeElement = $$1('.tts-control-close', $element);\n const $dragElement = $$1('.tts-control-drag', $element);\n const $playbackElement = $$1('.tts-control-playback', $element);\n const $sfhModeElement = $$1('.tts-control-mode', $element);\n const $sliderElement = $$1('.tts-slider', $element);\n const $settingsElement = $$1('.tts-control-settings', $element);\n playbackRate = defaultPlaybackRate;\n $element.css('touch-action', 'none');\n\n // make component dragable\n const interactElement = interact($element).draggable({\n autoScroll: true,\n manualStart: true,\n restrict: {\n restriction: container[0],\n elementRect: {\n left: 0,\n right: 1,\n top: 0,\n bottom: 1\n }\n },\n onmove: event => {\n const xOffset = Math.round(event.dx),\n yOffset = Math.round(event.dy);\n this.moveBy(xOffset, yOffset);\n }\n });\n interact($dragElement[0]).on('down', event => {\n const interaction = event.interaction;\n interaction.start({\n name: 'drag'\n }, interactElement, $element[0]);\n });\n\n // initialise slider\n $sliderElement.noUiSlider({\n animate: true,\n connected: true,\n range: {\n min: minPlaybackRate,\n max: maxPlaybackRate\n },\n start: defaultPlaybackRate,\n step: 0.1\n }).on('change', this.setPlaybackRate);\n\n // handle controls\n $closeElement.on('click', this.close);\n // handle mousedown instead of click to prevent selection lose\n $playbackElement.on('mousedown touchstart', this.togglePlayback);\n $sfhModeElement.on('click', this.toggleSFHMode);\n $settingsElement.on('click', this.toggleSettings);\n audio.addEventListener('ended', this.initNextItem);\n audio.addEventListener('error', () => {\n feedback().error(__('Can not playback media file!'));\n this.initNextItem();\n });\n window.addEventListener('resize', this.handleResize);\n\n // move to initial position\n this.moveTo(left, top);\n }).on('hide', function () {\n this.setTTSStateOnContainer('visible', false);\n }).on('show', function () {\n this.setTTSStateOnContainer('visible', true);\n }).on('destroy', function () {\n container.removeClass('tts-component-container');\n this.clearAPIPElements();\n this.stop();\n window.removeEventListener('resize', this.handleResize);\n });\n ttsComponent.init(config);\n return ttsComponent;\n }\n\n return maskingComponentFactory;\n\n});\n\n","define('taoQtiTest/runner/plugins/tools/apipTextToSpeech/ttsApipDataProvider',[],function () { 'use strict';\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2019 (original work) Open Assessment Technologies SA;\n *\n * @author Anton Tsymuk \n */\n\n /**\n * Extract TTS data from APIP item data\n *\n * @param {Object} apipElement - APIP item Data\n * @returns {Object}\n */\n const getTTSItemData = apipElement => {\n const {\n identifier\n } = apipElement['@attributes'];\n const {\n contentLinkInfo = {\n '@attributes': {}\n },\n relatedElementInfo: {\n spoken: {\n audioFileInfo = []\n } = {}\n } = {}\n } = apipElement;\n const {\n fileHref = ''\n } = audioFileInfo.find(audioFile => audioFile['@attributes'].mimeType === 'audio/mpeg') || {};\n const elementId = contentLinkInfo['@attributes'].qtiLinkIdentifierRef;\n return {\n identifier,\n selector: elementId && `#${elementId}`,\n url: fileHref.replace('assets/', '')\n };\n };\n\n /**\n * Get APIP item order from APIP order data\n *\n * @param {String} identifier - APIP item identifier\n * @param {Object} elementOrder - APIP order data\n * @returns {Number}\n */\n const getTTSItemOrder = (identifier, elementOrder) => {\n const {\n order\n } = elementOrder.find(apipElementOrder => apipElementOrder['@attributes'].identifierRef === identifier) || {};\n return parseInt(order) || Number.POSITIVE_INFINITY;\n };\n\n /**\n * Extract data related to Text To Speech from item APIP data\n * @param {Object} apipData\n * @returns {Object}\n */\n var ttsApipDataProvider = (apipData => {\n const {\n accessibilityInfo: {\n accessElement = []\n } = {},\n inclusionOrder: {\n textGraphicsDefaultOrder: {\n elementOrder = []\n } = {}\n } = {}\n } = apipData;\n return accessElement.map(getTTSItemData).filter(_ref => {\n let {\n url\n } = _ref;\n return !!url;\n }).sort((a, b) => getTTSItemOrder(a.identifier, elementOrder) - getTTSItemOrder(b.identifier, elementOrder));\n });\n\n return ttsApipDataProvider;\n\n});\n\n","define('taoQtiTest/runner/plugins/tools/apipTextToSpeech/plugin',['lodash', 'i18n', 'ui/hider', 'util/shortcut', 'util/namespace', 'taoTests/runner/plugin', 'taoQtiTest/runner/helpers/map', 'ui/keyNavigation/navigator', 'ui/keyNavigation/navigableDomElement', 'taoQtiTest/runner/plugins/tools/apipTextToSpeech/textToSpeech', 'taoQtiTest/runner/plugins/tools/apipTextToSpeech/ttsApipDataProvider'], function (_, __, hider, shortcut, namespaceHelper, pluginFactory, mapHelper, keyNavigator, navigableDomElement, ttsComponentFactory, ttsApipDataProvider) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n shortcut = shortcut && Object.prototype.hasOwnProperty.call(shortcut, 'default') ? shortcut['default'] : shortcut;\n namespaceHelper = namespaceHelper && Object.prototype.hasOwnProperty.call(namespaceHelper, 'default') ? namespaceHelper['default'] : namespaceHelper;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n keyNavigator = keyNavigator && Object.prototype.hasOwnProperty.call(keyNavigator, 'default') ? keyNavigator['default'] : keyNavigator;\n navigableDomElement = navigableDomElement && Object.prototype.hasOwnProperty.call(navigableDomElement, 'default') ? navigableDomElement['default'] : navigableDomElement;\n ttsComponentFactory = ttsComponentFactory && Object.prototype.hasOwnProperty.call(ttsComponentFactory, 'default') ? ttsComponentFactory['default'] : ttsComponentFactory;\n ttsApipDataProvider = ttsApipDataProvider && Object.prototype.hasOwnProperty.call(ttsApipDataProvider, 'default') ? ttsApipDataProvider['default'] : ttsApipDataProvider;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2019 (original work) Open Assessment Technologies SA;\n *\n * @author Anton Tsymuk \n */\n const pluginName = 'apiptts';\n const actionPrefix = `tool-${pluginName}-`;\n\n /**\n * Returns the configured plugin\n */\n var plugin = pluginFactory({\n name: pluginName,\n /**\n * Initialize the plugin (called during runner's init)\n */\n init() {\n const testRunner = this.getTestRunner();\n const testRunnerOptions = testRunner.getOptions();\n const pluginShortcuts = (testRunnerOptions.shortcuts || {})[this.getName()] || {};\n let ttsComponent;\n let ttsApipData;\n const createNavigationGroup = () => {\n const $container = testRunner.getAreaBroker().getContainer();\n const $navigationGroupElement = this.button.getElement();\n const groupNavigationId = `${pluginName}_navigation_group`;\n const $navigationElements = $container.find(ttsApipData.map(_ref => {\n let {\n selector\n } = _ref;\n return selector;\n }).join(', '));\n this.navigationGroup = keyNavigator({\n id: groupNavigationId,\n group: $navigationGroupElement,\n elements: navigableDomElement.createFromDoms($navigationElements.add($navigationGroupElement)),\n propagateTab: false,\n loop: true,\n keepState: true\n }).on('tab', () => {\n if (ttsComponent.is('sfhMode')) {\n this.navigationGroup.next();\n testRunner.trigger(`${actionPrefix}next`);\n }\n }).on('shift+tab', () => {\n if (ttsComponent.is('sfhMode')) {\n this.navigationGroup.previous();\n testRunner.trigger(`${actionPrefix}previous`);\n }\n }).on('activate', () => {\n if (ttsComponent.is('sfhMode')) {\n testRunner.trigger(`${actionPrefix}togglePlayback`);\n }\n }).on('blur', () => {\n setTimeout(() => {\n if (!this.navigationGroup.isFocused()) {\n this.navigationGroup.focus();\n }\n }, 0);\n }).setCursorAt($navigationElements.length);\n ttsComponent.on('next finish', () => {\n if (ttsComponent.is('sfhMode')) {\n const $currentElement = this.navigationGroup.getCursor().navigable.getElement();\n const {\n selector\n } = ttsComponent.getCurrentItem() || {};\n if (!selector || !$currentElement.is(selector)) {\n this.navigationGroup.next();\n }\n }\n });\n };\n\n /**\n * Creates the tts component on demand\n * @returns {textToSpeech}\n */\n const getTTSComponent = () => {\n if (!ttsComponent) {\n const $container = testRunner.getAreaBroker().getContainer();\n ttsComponent = ttsComponentFactory($container, {}).on('close', () => {\n if (this.getState('active')) {\n testRunner.trigger(`${actionPrefix}toggle`);\n }\n }).hide();\n }\n return ttsComponent;\n };\n\n /**\n * Checks if the plugin is currently available.\n * To be activated with the special category x-tao-option-apiptts\n *\n * @returns {Boolean}\n */\n const isConfigured = () => mapHelper.hasItemCategory(testRunner.getTestMap(), testRunner.getTestContext().itemIdentifier, 'apiptts', true);\n\n /**\n * Is plugin activated ? if not, then we hide the plugin\n */\n const togglePlugin = () => {\n if (isConfigured()) {\n this.show();\n } else {\n this.hide();\n }\n };\n\n /**\n * Show the plugin panel\n *\n * @fires plugin-open.apiptts\n */\n const enablePlugin = () => {\n createNavigationGroup();\n this.button.turnOn();\n this.setState('active', true);\n this.trigger('open');\n if (ttsComponent.is('hidden')) {\n ttsComponent.show();\n }\n };\n\n /**\n * Hide the plugin panel\n *\n * @fires plugin-close.apiptts\n */\n const disablePlugin = () => {\n if (this.getState('active')) {\n this.navigationGroup.blur();\n this.navigationGroup.destroy();\n this.setState('active', false);\n this.button.turnOff();\n this.trigger('close');\n if (ttsComponent && !ttsComponent.is('hidden')) {\n ttsComponent.close();\n ttsComponent.hide();\n }\n }\n };\n\n /**\n * Shows/hides the plugin\n */\n const toggleTool = () => {\n if (this.getState('enabled')) {\n if (this.getState('active')) {\n disablePlugin();\n this.setState('sleep', true);\n } else {\n enablePlugin();\n this.setState('sleep', false);\n }\n }\n };\n\n // Add plugin button to toolbox\n this.button = this.getAreaBroker().getToolbox().createEntry({\n className: `${this.getName()}-plugin`,\n control: this.getName(),\n icon: 'headphones',\n text: __('Text To Speech'),\n title: __('Enable text to speech')\n });\n\n // Handle plugin button click\n this.button.on('click', e => {\n e.preventDefault();\n testRunner.trigger(`${actionPrefix}toggle`);\n });\n\n // Register plugin shortcuts\n if (testRunnerOptions.allowShortcuts) {\n _.forEach(pluginShortcuts, (command, key) => {\n shortcut.add(namespaceHelper.namespaceAll(command, pluginName, true), () => {\n if (key === 'spaceTogglePlayback' && ttsComponent && ttsComponent.is('sfhMode')) {\n return;\n }\n const eventKey = key.endsWith('TogglePlayback') ? 'togglePlayback' : key;\n testRunner.trigger(actionPrefix + eventKey);\n }, {\n avoidInput: true\n });\n });\n }\n\n // Hide plugin by default\n togglePlugin();\n this.disable();\n this.hide();\n\n //update plugin state based on changes\n testRunner.on('loaditem', () => {\n togglePlugin();\n this.disable();\n }).on('enabletools renderitem', () => {\n this.enable();\n }).on('disabletools unloaditem', () => {\n disablePlugin();\n this.disable();\n }).on(`${actionPrefix}toggle`, () => {\n if (isConfigured()) {\n toggleTool();\n }\n }).on(`${actionPrefix}togglePlayback`, () => {\n if (this.getState('enabled')) {\n if (this.getState('active')) {\n if (ttsComponent.is('sfhMode')) {\n const $currentElement = this.navigationGroup.getCursor().navigable.getElement();\n const {\n selector\n } = ttsComponent.getCurrentItem() || {};\n if (!$currentElement.is(selector)) {\n if (this.button.getElement()[0] !== $currentElement[0]) {\n $currentElement.trigger('click');\n }\n return;\n }\n }\n ttsComponent.togglePlayback();\n }\n }\n }).on('renderitem', () => {\n if (!isConfigured()) {\n return;\n }\n ttsApipData = ttsApipDataProvider(testRunner.itemRunner.getData().apipAccessibility || {}).map(apipItemData => Object.assign({}, apipItemData, {\n url: testRunner.itemRunner.assetManager.resolve(apipItemData.url)\n }));\n if (!ttsApipData.length) {\n disablePlugin();\n this.hide();\n return;\n }\n getTTSComponent().setMediaContentData(ttsApipData);\n this.show();\n if (!this.getState('sleep')) {\n this.setState('enabled', true);\n toggleTool();\n }\n });\n },\n /**\n * Called during the runner's destroy phase\n */\n destroy() {\n shortcut.remove(`.${this.getName()}`);\n },\n /**\n * Enable the button\n */\n enable() {\n this.button.enable();\n },\n /**\n * Disable the button\n */\n disable() {\n this.button.disable();\n },\n /**\n * Show the button\n */\n show() {\n this.button.show();\n },\n /**\n * Hide the button\n */\n hide() {\n this.button.hide();\n }\n });\n\n return plugin;\n\n});\n\n","define('taoQtiTest/runner/plugins/tools/areaMasking/mask',['lodash', 'handlebars', 'lib/handlebars/helpers', 'ui/dynamicComponent'], function (_, Handlebars, Helpers0, dynamicComponent) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n dynamicComponent = dynamicComponent && Object.prototype.hasOwnProperty.call(dynamicComponent, 'default') ? dynamicComponent['default'] : dynamicComponent;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", helper, options, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;\n\n\n buffer += \"
          \\n
          \\n
          \\n \\n \\n
          \\n
          \\n\";\n return buffer;\n });\n function areaMaskingTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA;\n */\n var defaultConfig = {\n draggable: true,\n resizable: true,\n preserveAspectRatio: false,\n width: 250,\n minWidth: 160,\n maxWidth: 1000,\n minHeight: 60,\n height: 100,\n stackingScope: 'test-runner',\n top: 50,\n left: 10,\n previewDelay: 3000\n };\n\n /**\n * Creates a new masking component\n * @returns {maskComponent} the component (uninitialized)\n */\n function maskingComponentFactory() {\n var dynamicComponentInstance;\n\n /**\n * @typedef {Object} dynamicComponent\n */\n dynamicComponentInstance = dynamicComponent({\n /**\n * Preview the content under the masked area\n * @returns {maskComponent} chains\n *\n * @fires maskComponent#preview\n */\n preview: function preview() {\n var self = this;\n var delay = this.config.previewDelay || 1000;\n if (this.is('rendered') && !this.is('disabled') && !this.is('previewing')) {\n this.setState('previewing', true);\n this.trigger('preview');\n _.delay(function () {\n self.setState('previewing', false);\n }, delay);\n }\n return this;\n }\n }, defaultConfig).on('rendercontent', function ($content) {\n var self = this;\n var $element = this.getElement();\n $content.append(areaMaskingTpl({}));\n $element.addClass('mask-container');\n $element.on('click touchstart', '.view', function (e) {\n e.preventDefault();\n self.preview();\n }).on('click touchend', '.close', function (e) {\n e.preventDefault();\n self.destroy();\n });\n }).init();\n return dynamicComponentInstance;\n }\n\n return maskingComponentFactory;\n\n});\n\n","define('taoQtiTest/runner/plugins/tools/areaMasking/areaMasking',['lodash', 'i18n', 'ui/hider', 'util/shortcut', 'util/namespace', 'taoTests/runner/plugin', 'taoQtiTest/runner/plugins/tools/areaMasking/mask', 'taoQtiTest/runner/helpers/map'], function (_, __, hider, shortcut, namespaceHelper, pluginFactory, maskComponent, mapHelper) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n shortcut = shortcut && Object.prototype.hasOwnProperty.call(shortcut, 'default') ? shortcut['default'] : shortcut;\n namespaceHelper = namespaceHelper && Object.prototype.hasOwnProperty.call(namespaceHelper, 'default') ? namespaceHelper['default'] : namespaceHelper;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n maskComponent = maskComponent && Object.prototype.hasOwnProperty.call(maskComponent, 'default') ? maskComponent['default'] : maskComponent;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA;\n */\n\n /**\n * The public name of the plugin\n * @type {String}\n */\n var pluginName = 'area-masking';\n\n /**\n * The prefix of actions triggered through the event loop\n * @type {String}\n */\n var actionPrefix = `tool-${pluginName}-`;\n\n /**\n * Some default options for the plugin\n * @type {Object}\n */\n var defaultConfig = {\n max: 5,\n foo: true\n };\n\n /**\n * Returns the configured plugin\n */\n var areaMasking = pluginFactory({\n name: pluginName,\n /**\n * Initialize the plugin (called during runner's init)\n */\n init() {\n const self = this;\n const testRunner = this.getTestRunner();\n const $container = testRunner.getAreaBroker().getContentArea().parent();\n const testRunnerOptions = testRunner.getOptions();\n const config = Object.assign({}, defaultConfig, this.getConfig());\n const pluginShortcuts = (testRunnerOptions.shortcuts || {})[pluginName] || {};\n function addMask() {\n maskComponent().on('render', function () {\n self.masks.push(this);\n self.button.turnOn();\n\n /**\n * @event areaMasking#maskadd\n */\n self.trigger('maskadd');\n }).on('destroy', function () {\n self.masks = _.without(self.masks, this);\n if (self.masks.length < config.max) {\n self.enable();\n }\n if (self.masks.length === 0) {\n self.button.turnOff();\n self.trigger('close');\n }\n\n /**\n * @event areaMasking#maskclose\n */\n self.trigger('maskclose');\n }).init({\n renderTo: $container,\n draggableContainer: $container\n });\n }\n\n //keep a ref to all masks\n this.masks = [];\n\n // register the element in the Toolbox\n this.button = this.getAreaBroker().getToolbox().createEntry({\n control: 'area-masking',\n text: __('Masking'),\n title: __('Covers parts of the item'),\n icon: 'eye-slash'\n });\n\n //add a new mask each time the button is pressed\n this.button.on('click', function (e) {\n e.preventDefault();\n testRunner.trigger(`${actionPrefix}toggle`);\n });\n\n // handle the plugin's shortcuts\n if (testRunnerOptions.allowShortcuts) {\n _.forEach(pluginShortcuts, function (command, key) {\n shortcut.add(namespaceHelper.namespaceAll(command, pluginName, true), function () {\n // just fire the action using the event loop\n testRunner.trigger(actionPrefix + key);\n }, {\n avoidInput: true\n });\n });\n }\n\n //start disabled\n this.disable();\n\n /**\n * Checks if the plugin is currently available\n * @returns {Boolean}\n */\n function isEnabled() {\n //to be activated with the special category x-tao-option-areaMasking\n return mapHelper.hasItemCategory(testRunner.getTestMap(), testRunner.getTestContext().itemIdentifier, 'areaMasking', true);\n }\n\n /**\n * Is plugin activated ? if not, then we hide the plugin\n */\n function togglePlugin() {\n if (isEnabled()) {\n self.show();\n } else {\n self.hide();\n }\n }\n //update plugin state based on changes\n testRunner.on('loaditem', togglePlugin).on('enabletools renderitem', function () {\n self.enable();\n }).on('disabletools unloaditem', function () {\n self.disable();\n //remove all masks\n self.masks.forEach(mask => mask.destroy());\n })\n // commands that controls the plugin\n .on(`${actionPrefix}toggle`, function () {\n if (isEnabled()) {\n if (self.masks.length === 0) {\n self.trigger('open');\n }\n if (self.masks.length < config.max) {\n addMask();\n } else if (config.max === 1) {\n self.masks.forEach(mask => mask.destroy());\n }\n }\n });\n },\n /**\n * Called during the runner's destroy phase\n */\n destroy: function destroy() {\n shortcut.remove(`.${pluginName}`);\n },\n /**\n * Enable the button\n */\n enable: function enable() {\n this.button.enable();\n },\n /**\n * Disable the button\n */\n disable: function disable() {\n this.button.disable();\n },\n /**\n * Show the button\n */\n show: function show() {\n this.button.show();\n },\n /**\n * Hide the button\n */\n hide: function hide() {\n this.button.hide();\n }\n });\n\n return areaMasking;\n\n});\n\n","define('taoQtiTest/runner/plugins/tools/calculator',['jquery', 'lodash', 'i18n', 'ui/hider', 'ui/calculator', 'ui/maths/calculator/basicCalculator', 'ui/maths/calculator/scientificCalculator', 'util/shortcut', 'util/namespace', 'taoTests/runner/plugin', 'taoQtiTest/runner/helpers/map', 'handlebars', 'lib/handlebars/helpers'], function ($$1, _, __, hider, calculatorFactory, basicCalculatorFactory, scientificCalculatorFactory, shortcut, namespaceHelper, pluginFactory, mapHelper, Handlebars, Helpers0) { 'use strict';\n\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n calculatorFactory = calculatorFactory && Object.prototype.hasOwnProperty.call(calculatorFactory, 'default') ? calculatorFactory['default'] : calculatorFactory;\n basicCalculatorFactory = basicCalculatorFactory && Object.prototype.hasOwnProperty.call(basicCalculatorFactory, 'default') ? basicCalculatorFactory['default'] : basicCalculatorFactory;\n scientificCalculatorFactory = scientificCalculatorFactory && Object.prototype.hasOwnProperty.call(scientificCalculatorFactory, 'default') ? scientificCalculatorFactory['default'] : scientificCalculatorFactory;\n shortcut = shortcut && Object.prototype.hasOwnProperty.call(shortcut, 'default') ? shortcut['default'] : shortcut;\n namespaceHelper = namespaceHelper && Object.prototype.hasOwnProperty.call(namespaceHelper, 'default') ? namespaceHelper['default'] : namespaceHelper;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); \n\n\n return \"
          \";\n });\n function calculatorTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Default config for calculator components\n * @type {Object}\n */\n var defaultCalcConfig = {\n height: 380,\n width: 280,\n top: 50,\n left: 10,\n stackingScope: 'test-runner',\n proportionalResize: true\n };\n\n /**\n * Default config for BODMAS calculator component\n * @type {Object}\n */\n var bodmasCalcConfig = _.defaults({\n height: 380,\n width: 280\n }, defaultCalcConfig);\n\n /**\n * Default config for scientific calculator component\n * @type {Object}\n */\n var scientificCalcConfig = _.defaults({\n width: 490,\n height: 420,\n calculator: {\n maths: {\n degree: true\n }\n }\n }, defaultCalcConfig);\n\n /**\n * Returns the configured plugin\n */\n var calculator = pluginFactory({\n name: 'calculator',\n /**\n * Initialize the plugin (called during runner's init)\n */\n init: function init() {\n const self = this;\n const testRunner = this.getTestRunner();\n const areaBroker = this.getAreaBroker();\n const testRunnerOptions = testRunner.getOptions();\n const config = this.getConfig();\n const pluginShortcuts = (testRunnerOptions.shortcuts || {})[this.getName()] || {};\n\n /**\n * Retrieve the calculators categories of the current item\n * @returns {Object} the calculator categories\n */\n function getCalculatorCategories() {\n const testContext = testRunner.getTestContext();\n const itemIdentifier = testContext.itemIdentifier;\n const testMap = testRunner.getTestMap();\n return {\n calculator: mapHelper.hasItemCategory(testMap, itemIdentifier, 'calculator', true),\n bodmas: mapHelper.hasItemCategory(testMap, itemIdentifier, 'calculator-bodmas', true),\n scientific: mapHelper.hasItemCategory(testMap, itemIdentifier, 'calculator-scientific', true)\n };\n }\n\n /**\n * Checks if the plugin is currently available\n * @returns {Boolean}\n */\n function isEnabled() {\n //to be activated with a special category from:\n // - x-tao-option-calculator\n // - x-tao-option-calculator-bodmas\n // - x-tao-option-calculator-scientific\n const categories = getCalculatorCategories();\n return categories.calculator || categories.bodmas || categories.scientific;\n }\n\n /**\n * Is calculator activated ? if not, then we hide the plugin\n */\n function togglePlugin() {\n if (isEnabled()) {\n //allow calculator\n self.show();\n } else {\n self.hide();\n }\n }\n\n /**\n * Build the calculator component\n * @param {Function} [calcTpl] - An optional alternative template for the calculator.\n * Only compatible with the four-functions version\n */\n function buildCalculator(calcTpl) {\n const categories = getCalculatorCategories();\n let factory, calcConfig;\n if (categories.scientific) {\n factory = scientificCalculatorFactory;\n calcConfig = scientificCalcConfig;\n calcConfig.calculator.maths.degree = _.isUndefined(config.degree) ? scientificCalcConfig.calculator.maths.degree : config.degree;\n } else if (categories.bodmas) {\n factory = basicCalculatorFactory;\n calcConfig = bodmasCalcConfig;\n } else {\n factory = calculatorFactory;\n calcConfig = defaultCalcConfig;\n }\n self.calculator = factory(_.defaults({\n renderTo: self.$calculatorContainer,\n replace: true,\n draggableContainer: areaBroker.getContainer(),\n alternativeTemplate: calcTpl || null\n }, calcConfig)).on('show', function () {\n self.trigger('open');\n self.button.turnOn();\n }).on('hide', function () {\n self.trigger('close');\n self.button.turnOff();\n }).after('render', function () {\n this.show();\n });\n }\n\n /**\n * Show/hide the calculator\n */\n function toggleCalculator() {\n if (self.getState('enabled') !== false) {\n if (self.calculator) {\n //just show/hide the calculator widget\n if (self.calculator.is('hidden')) {\n self.calculator.show();\n } else {\n self.calculator.hide();\n }\n } else {\n //build calculator widget\n if (config.template) {\n require([`tpl!${config.template.replace(/\\.tpl$/, '')}`], function (calcTpl) {\n buildCalculator(calcTpl);\n }, function () {\n //in case of error, display the default calculator:\n buildCalculator();\n });\n } else {\n buildCalculator();\n }\n }\n }\n }\n\n //build element (detached)\n this.button = this.getAreaBroker().getToolbox().createEntry({\n control: 'calculator',\n title: __('Open Calculator'),\n icon: 'table',\n text: __('Calculator')\n });\n this.$calculatorContainer = $$1(calculatorTpl());\n\n //init calculator instance var, it will be created only necessary\n this.calculator = null;\n\n //attach behavior\n this.button.on('click', function (e) {\n //prevent action if the click is made inside the form which is a sub part of the button\n if ($$1(e.target).closest('.widget-calculator').length) {\n return;\n }\n e.preventDefault();\n testRunner.trigger('tool-calculator');\n });\n if (testRunnerOptions.allowShortcuts) {\n if (pluginShortcuts.toggle) {\n shortcut.add(namespaceHelper.namespaceAll(pluginShortcuts.toggle, this.getName(), true), function () {\n testRunner.trigger('tool-calculator');\n }, {\n avoidInput: true,\n allowIn: '.widget-calculator'\n });\n }\n }\n\n //start disabled\n togglePlugin();\n this.disable();\n\n //update plugin state based on changes\n testRunner.on('loaditem', togglePlugin).on('enabletools renderitem', function () {\n self.enable();\n }).on('disabletools unloaditem', function () {\n self.disable();\n if (self.calculator) {\n //destroy calculator to create a new instance of calculator each time\n self.calculator.destroy();\n self.calculator = null;\n }\n }).on('tool-calculator', function () {\n if (isEnabled()) {\n toggleCalculator();\n }\n });\n },\n /**\n * Called during the runner's render phase\n */\n render: function render() {\n var areaBroker = this.getAreaBroker();\n areaBroker.getContainer().append(this.$calculatorContainer);\n },\n /**\n * Called during the runner's destroy phase\n */\n destroy: function destroy() {\n shortcut.remove(`.${this.getName()}`);\n this.$calculatorContainer.remove();\n if (this.calculator) {\n this.calculator.destroy();\n }\n },\n /**\n * Enable the button\n */\n enable: function enable() {\n this.button.enable();\n },\n /**\n * Disable the button\n */\n disable: function disable() {\n this.button.disable();\n if (this.calculator) {\n this.calculator.hide();\n }\n },\n /**\n * Show the button\n */\n show: function show() {\n this.button.show();\n },\n /**\n * Hide the button\n */\n hide: function hide() {\n this.button.hide();\n if (this.calculator) {\n this.calculator.hide();\n }\n }\n });\n\n return calculator;\n\n});\n\n","define('taoQtiTest/runner/plugins/tools/comment/comment',['jquery', 'i18n', 'taoTests/runner/plugin', 'ui/hider', 'ui/stacker', 'util/shortcut', 'util/namespace', 'handlebars', 'lib/handlebars/helpers'], function ($$1, __, pluginFactory, hider, stackerFactory, shortcut, namespaceHelper, Handlebars, Helpers0) { 'use strict';\n\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n hider = hider && Object.prototype.hasOwnProperty.call(hider, 'default') ? hider['default'] : hider;\n stackerFactory = stackerFactory && Object.prototype.hasOwnProperty.call(stackerFactory, 'default') ? stackerFactory['default'] : stackerFactory;\n shortcut = shortcut && Object.prototype.hasOwnProperty.call(shortcut, 'default') ? shortcut['default'] : shortcut;\n namespaceHelper = namespaceHelper && Object.prototype.hasOwnProperty.call(namespaceHelper, 'default') ? namespaceHelper['default'] : namespaceHelper;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", helper, options, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;\n\n\n buffer += \"
          \\n \\n \\n \\n
          \\n\";\n return buffer;\n });\n function commentTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Returns the configured plugin\n */\n var comment = pluginFactory({\n name: 'comment',\n /**\n * Initialize the plugin (called during runner's init)\n */\n init() {\n const self = this;\n const testRunner = this.getTestRunner();\n const testRunnerOptions = testRunner.getOptions();\n const pluginShortcuts = (testRunnerOptions.shortcuts || {})[this.getName()] || {};\n const stacker = stackerFactory('test-runner');\n\n /**\n * Checks if the plugin is currently available\n * @returns {Boolean}\n */\n function isEnabled() {\n const currentItem = testRunner.getCurrentItem();\n if (typeof currentItem.allowComment === 'boolean') {\n return currentItem.allowComment;\n }\n\n //@deprecated use allowComment from the testMap\n const testContext = testRunner.getTestContext();\n const contextOptions = testContext.options || {};\n return !!contextOptions.allowComment;\n }\n\n /**\n * Can we comment ? if not, then we hide the plugin\n */\n function togglePlugin() {\n if (isEnabled()) {\n self.show();\n } else {\n self.hide();\n }\n }\n\n /**\n * Show/hide the comment panel\n */\n function toggleComment() {\n if (self.getState('enabled') !== false) {\n //just show/hide the form\n hider.toggle(self.$form);\n if (!hider.isHidden(self.$form)) {\n //reset the form on each display\n self.$input.val('').focus();\n self.button.turnOn();\n stacker.bringToFront(self.$form);\n } else {\n self.button.turnOff();\n }\n }\n }\n\n // register button in toolbox\n this.button = this.getAreaBroker().getToolbox().createEntry({\n control: 'comment',\n title: __('Leave a comment'),\n icon: 'tag',\n text: __('Comment')\n });\n\n //get access to controls\n this.button.on('render', function () {\n self.$button = self.button.getElement();\n self.$form = $$1(commentTpl()).appendTo(self.$button);\n self.$input = self.$button.find('[data-control=\"qti-comment-text\"]');\n self.$cancel = self.$button.find('[data-control=\"qti-comment-cancel\"]');\n self.$submit = self.$button.find('[data-control=\"qti-comment-send\"]');\n stacker.autoBringToFront(self.$form);\n\n //hide the form without submit\n self.$cancel.on('click', function () {\n hider.hide(self.$form);\n self.button.turnOff();\n });\n\n //submit the comment, then hide the form\n self.$submit.on('click', function () {\n var comment = self.$input.val();\n if (comment) {\n self.disable();\n self.button.turnOff();\n testRunner.getProxy().callTestAction('comment', {\n comment: comment\n }).then(function () {\n hider.hide(self.$form);\n self.enable();\n }).catch(function () {\n hider.hide(self.$form);\n self.enable();\n });\n }\n });\n });\n\n //attach behavior\n this.button.on('click', function (e) {\n //prevent action if the click is made inside the form which is a sub part of the button\n if ($$1(e.target).closest('[data-control=\"qti-comment\"]').length) {\n return;\n }\n e.preventDefault();\n testRunner.trigger('tool-comment');\n });\n if (testRunnerOptions.allowShortcuts) {\n if (pluginShortcuts.toggle) {\n shortcut.add(namespaceHelper.namespaceAll(pluginShortcuts.toggle, this.getName(), true), function () {\n testRunner.trigger('tool-comment');\n }, {\n avoidInput: true\n });\n }\n }\n\n //start disabled\n togglePlugin();\n this.disable();\n\n //update plugin state based on changes\n testRunner.on('loaditem', togglePlugin).on('renderitem enabletools', function () {\n self.enable();\n }).on('unloaditem disabletools', function () {\n self.disable();\n }).on('tool-comment', function () {\n if (isEnabled()) {\n toggleComment();\n }\n });\n },\n /**\n * Called during the runner's destroy phase\n */\n destroy: function destroy() {\n shortcut.remove(`.${this.getName()}`);\n },\n /**\n * Enable the button\n */\n enable: function enable() {\n this.button.enable();\n },\n /**\n * Disable the button\n */\n disable: function disable() {\n if (this.$form) {\n hider.hide(this.$form);\n }\n this.button.disable();\n this.button.turnOff();\n },\n /**\n * Show the button\n */\n show: function show() {\n this.button.show();\n },\n /**\n * Hide the button\n */\n hide: function hide() {\n if (this.$form) {\n hider.hide(this.$form);\n }\n this.button.hide();\n }\n });\n\n return comment;\n\n});\n\n","define('taoQtiTest/runner/plugins/tools/documentViewer/documentViewer',['jquery', 'lodash', 'ui/hider', 'ui/documentViewer', 'ui/documentViewer/providers/pdfViewer', 'taoTests/runner/plugin', 'handlebars', 'lib/handlebars/helpers'], function ($$1, _, hider, viewerFactory, pdfViewer, pluginFactory, Handlebars, Helpers0) { 'use strict';\n\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n hider = hider && Object.prototype.hasOwnProperty.call(hider, 'default') ? hider['default'] : hider;\n viewerFactory = viewerFactory && Object.prototype.hasOwnProperty.call(viewerFactory, 'default') ? viewerFactory['default'] : viewerFactory;\n pdfViewer = pdfViewer && Object.prototype.hasOwnProperty.call(pdfViewer, 'default') ? pdfViewer['default'] : pdfViewer;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, functionType=\"function\", escapeExpression=this.escapeExpression;\n\n\n buffer += \"
          \\n
          \\n
          \\n
          \\n \";\n if (helper = helpers.title) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.title); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\n \\n
          \\n
          \";\n if (helper = helpers.content) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.content); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"
          \\n
          \\n
          \\n
          \\n\";\n return buffer;\n });\n function panelTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * The name of the plugin\n * @type {String}\n */\n var pluginName = 'documentViewer';\n\n /**\n * Shows the panel, trigger the `panelshow` event\n *\n * @param plugin\n */\n function showPanel(plugin) {\n hider.show(plugin.controls.$panel);\n plugin.trigger('panelshow');\n $$1(window).on(`resize.${plugin.getName()}`, _.debounce(_.partial(resizeViewer, plugin), 50));\n }\n\n /**\n * Hides the panel, trigger the `panelhide` event\n *\n * @param plugin\n */\n function hidePanel(plugin) {\n hider.hide(plugin.controls.$panel);\n plugin.trigger('panelhide');\n $$1(window).off(`resize.${plugin.getName()}`);\n }\n\n /**\n * Hides the panel if it is visible\n *\n * @param plugin\n * @returns {Boolean} Returns `true` if the panel was visible and has been hidden\n */\n function hideIfVisible(plugin) {\n var isVisible = !hider.isHidden(plugin.controls.$panel, true);\n if (isVisible) {\n hidePanel(plugin);\n }\n return isVisible;\n }\n\n /**\n * Initializes the event handlers for the panel container\n *\n * @param plugin\n */\n function initPanelEvents(plugin) {\n var namespace = `.${plugin.getName()}`;\n var stopEvents = ['click', 'mousedown', 'mouseup', 'touchstart', 'touchend', 'keyup', 'keydow', 'keypress', 'scroll', 'drop'].join(`${namespace} `) + namespace;\n var hideViewer = _.partial(hidePanel, plugin);\n function stopPropagation(e) {\n e.stopImmediatePropagation();\n e.stopPropagation();\n }\n plugin.controls.$overlay.off(namespace).on(`click${namespace}`, hideViewer).on(stopEvents, stopPropagation);\n plugin.controls.$panel.off(namespace).on(`click${namespace}`, '.icon-close', hideViewer).on(stopEvents, stopPropagation);\n }\n\n /**\n * Resizes the viewer to fit the panel content area\n * @param plugin\n */\n function resizeViewer(plugin) {\n var $content = plugin.controls.$content;\n plugin.viewer.setSize($content.width(), $content.height());\n }\n\n // all document viewers need to be registered\n viewerFactory.registerProvider('pdf', pdfViewer);\n\n /**\n * Returns the configured plugin\n */\n var documentViewer = pluginFactory({\n name: pluginName,\n /**\n * Initialize the plugin (called during runner's init)\n */\n init: function init() {\n var self = this;\n var testRunner = this.getTestRunner();\n var $panel = $$1(panelTpl());\n\n /**\n * @param {Object} data\n * @param {String} data.label - document title\n * @param {String} data.document - document url\n */\n function displayViewer(data) {\n if (self.getState('enabled') !== false) {\n showPanel(self);\n self.controls.$title.text(data.label);\n resizeViewer(self);\n self.viewer.load(data.document, 'pdf');\n }\n }\n this.controls = {\n $panel: $panel,\n $overlay: $panel.find('.viewer-overlay'),\n $title: $panel.find('.viewer-title'),\n $content: $panel.find('.viewer-content')\n };\n this.viewer = viewerFactory({\n renderTo: this.controls.$content,\n replace: true,\n fitToWidth: true,\n allowSearch: true\n });\n\n //update plugin state based on changes\n testRunner.on('renderitem enabletools', function () {\n self.enable();\n }).on('renderitem', function () {\n self.getAreaBroker().getContentArea().append(self.controls.$panel).off(`.${self.getName()}`).on(`viewDocument.${self.getName()}`, function (event) {\n var data = event.originalEvent.detail;\n displayViewer(data);\n });\n initPanelEvents(self);\n }).on('move', function () {\n hideIfVisible(self);\n }).on('skip', function () {\n hideIfVisible(self);\n }).on('unloaditem disabletools', function () {\n self.disable();\n }).on('tool-documentViewer', function (data) {\n displayViewer(data);\n });\n },\n /**\n * Called during the runner's render phase\n */\n render: function render() {},\n /**\n * Called during the runner's destroy phase\n */\n destroy: function destroy() {\n this.getAreaBroker().getContentArea().off(`.${this.getName()}`);\n if (this.viewer) {\n this.viewer.destroy();\n }\n if (this.controls.$panel) {\n this.controls.$panel.remove();\n }\n this.viewer = null;\n this.controls = {};\n },\n /**\n * Enable the button\n */\n enable: function enable() {},\n /**\n * Disable the button\n */\n disable: function disable() {\n hideIfVisible(this);\n },\n /**\n * Show the button\n */\n show: function show() {},\n /**\n * Hide the button\n */\n hide: function hide() {\n hideIfVisible(this);\n }\n });\n\n return documentViewer;\n\n});\n\n","define('taoQtiTest/runner/plugins/tools/highlighter/highlighter',['lodash', 'jquery', 'core/eventifier', 'ui/highlighter'], function (_, $, eventifier, highlighterFactory) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n $ = $ && Object.prototype.hasOwnProperty.call($, 'default') ? $['default'] : $;\n eventifier = eventifier && Object.prototype.hasOwnProperty.call(eventifier, 'default') ? eventifier['default'] : eventifier;\n highlighterFactory = highlighterFactory && Object.prototype.hasOwnProperty.call(highlighterFactory, 'default') ? highlighterFactory['default'] : highlighterFactory;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA;\n */\n var prevSelection = [];\n var selection;\n if (!window.getSelection) throw new Error('Browser does not support getSelection()');\n selection = window.getSelection();\n\n /**\n * Returns an array of active ranges.\n * If browser doesn't support multiple Ranges, returns only the first range\n * see note on https://w3c.github.io/selection-api/#methods\n *\n * @returns {Range[]}\n */\n function getAllRanges() {\n var i,\n allRanges = [];\n for (i = 0; i < selection.rangeCount; i++) {\n allRanges.push(selection.getRangeAt(i));\n }\n return allRanges;\n }\n\n /**\n * Discards the global text selection from the browser (window.selection)\n */\n function discardSelection() {\n // delay discarding, to allow time for multiple highlighters logic\n setTimeout(function () {\n selection.removeAllRanges();\n }, 250);\n }\n\n /**\n * The highlighter Factory\n * @param {Object} options\n * @param {String} [options.className]\n * @param {String} [options.containerSelector]\n * @param {Array} [options.containersBlackList]\n * @param {String} [options.id]\n * @returns {Object} the highlighter instance\n */\n function testHighlighterFactory(options) {\n /**\n * Is this highlighter enabled or disabled?\n * @type {boolean}\n */\n var enabled = true;\n\n /**\n * Are we in highlight mode, meaning that each new selection is automatically highlighted\n * without having to press any button\n * @type {boolean}\n */\n var isHighlighting = false;\n\n /**\n * The helper that does the highlight magic\n */\n var highlightHelper = highlighterFactory({\n className: options.className || 'txt-user-highlight',\n containerSelector: options.containerSelector || '.qti-itemBody',\n containersBlackList: options.containersBlackList || [],\n clearOnClick: true\n });\n\n //add event to automatically highlight the recently made selection if needed\n $(document).on('mouseup.highlighter', function () {\n if (isHighlighting && !selection.isCollapsed) {\n highlightHelper.highlightRanges(getAllRanges());\n discardSelection();\n }\n });\n\n //add event to automatically highlight the recently made selection if needed\n //added touch event (as from TAO-6578)\n $(document).on('touchend.highlighter', function () {\n if (isHighlighting && !selection.isCollapsed) {\n highlightHelper.highlightRanges(getAllRanges());\n }\n });\n\n // iOS devices clears selection after click on button,\n // so we store prev selection for this devices to be able\n // to use it after click on highlight button\n if (/iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream) {\n $(document).on('selectionchange', function () {\n if (!isHighlighting) {\n prevSelection = _.clone(getAllRanges(), true);\n }\n });\n }\n\n /**\n * The highlighter instance\n */\n return eventifier({\n /**\n * Enable this instance\n */\n enable: function enable() {\n enabled = true;\n },\n /**\n * Disable this instance\n */\n disable: function disable() {\n enabled = false;\n },\n /**\n * Is this instance currently enabled?\n * @returns {Boolean}\n */\n isEnabled: function isEnabled() {\n return enabled;\n },\n /**\n * toggle highlighting mode on and off\n * @param {Boolean} bool - wanted state\n */\n toggleHighlighting: function toggleHighlighting(bool) {\n isHighlighting = bool;\n if (isHighlighting) {\n this.trigger('start');\n $('.qti-itemBody').toggleClass('highlighter-cursor', true);\n } else {\n this.trigger('end');\n $('.qti-itemBody').toggleClass('highlighter-cursor', false);\n }\n return this;\n },\n /**\n * Either highlight the current or selection, or toggle highlighting mode\n */\n highlight: function highlight() {\n if (!isHighlighting) {\n if (!selection.isCollapsed) {\n this.toggleHighlighting(true);\n highlightHelper.highlightRanges(getAllRanges());\n this.toggleHighlighting(false);\n discardSelection();\n } else if (prevSelection[0] && !prevSelection[0].collapsed) {\n this.toggleHighlighting(true);\n highlightHelper.highlightRanges(prevSelection);\n this.toggleHighlighting(false);\n discardSelection();\n } else {\n this.toggleHighlighting(true);\n }\n } else {\n this.toggleHighlighting(false);\n }\n },\n /**\n * restore the highlight from a given index\n * @param {Array} index\n */\n restoreIndex: function restoreIndex(index) {\n if (index && index.length > 0) {\n highlightHelper.highlightFromIndex(index);\n }\n },\n /**\n * Get the current index\n * @returns {Array} index\n */\n getIndex: function getIndex() {\n return highlightHelper.getHighlightIndex();\n },\n /**\n * remove all highlights\n */\n clearHighlights: function clearHighlights() {\n highlightHelper.clearHighlights();\n selection.removeAllRanges();\n },\n /**\n * Getter for the instance's id\n * @returns {String}\n */\n getId: function getId() {\n return options.id;\n }\n });\n }\n\n return testHighlighterFactory;\n\n});\n\n","define('taoQtiTest/runner/plugins/tools/highlighter/collection',['taoQtiTest/runner/plugins/tools/highlighter/highlighter'], function (highlighterFactory) { 'use strict';\n\n highlighterFactory = highlighterFactory && Object.prototype.hasOwnProperty.call(highlighterFactory, 'default') ? highlighterFactory['default'] : highlighterFactory;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * @var {Array} highlighters - Highlighters collection\n * We can run multiple instances of the highlighter plugin on one page:\n * - one for item-level highlights, which persist for the Test session\n * - others for stimulus-level highlights, which should persist across multiple sessions (TAO-7617)\n */\n var highlighters = [];\n\n /**\n * @typedef {highlighterCollection}\n * @returns {Object}\n */\n var highlighterCollection = function highlighterCollection() {\n return {\n /**\n * Instantiates new highlighter and adds it to array\n * @param {Object} options\n * @param {String} options.className - class applied to highlighted spans\n * @param {String} options.containerSelector - selector for the unique root DOM node the HL will work on\n * @param {Array} options.containersBlackList - list of children which should not receive highlights\n * @param {String} options.id\n * @returns {Object} a highlighter instance\n */\n addHighlighter: function addHighlighter(options) {\n var hl = highlighterFactory(options);\n highlighters.push(hl);\n return hl;\n },\n /**\n * Retrieves one highlighter from the collection by matching its id\n * @param {String} id\n * @returns {Object} highlighter instance\n */\n getHighlighterById: function getHighlighterById(id) {\n return highlighters.find(function (hl) {\n return hl.getId() === id;\n });\n },\n /**\n * Retrieves the full array of highlighters from the collection\n * @returns {Array}\n */\n getAllHighlighters: function getAllHighlighters() {\n return highlighters;\n },\n /**\n * Retrieves the first highlighter in the collection\n * @returns {Object} highlighter instance\n */\n getItemHighlighter: function getItemHighlighter() {\n return highlighters[0];\n },\n /**\n * Retrieves the fully array of highlighter from the collection, minus the first one\n * @returns {Array} highlighter instance\n */\n getNonItemHighlighters: function getNonItemHighlighters() {\n return highlighters.slice(1);\n },\n /**\n * Empties th highlighter collection\n * @returns {Integer}\n */\n getLength: function getLength() {\n return highlighters.length;\n },\n /**\n * Empties the highlighter collection\n * @returns {Object}\n */\n empty: function empty() {\n highlighters = [];\n return this;\n }\n };\n };\n\n return highlighterCollection;\n\n});\n\n","define('taoQtiTest/runner/plugins/tools/highlighter/plugin',['jquery', 'lodash', 'i18n', 'core/logger', 'taoTests/runner/plugin', 'util/shortcut', 'util/namespace', 'taoQtiTest/runner/helpers/currentItem', 'taoQtiTest/runner/plugins/tools/highlighter/collection', 'taoQtiTest/runner/helpers/map'], function ($, _, __, loggerFactory, pluginFactory, shortcut, namespaceHelper, itemHelper, highlighterCollection, mapHelper) { 'use strict';\n\n $ = $ && Object.prototype.hasOwnProperty.call($, 'default') ? $['default'] : $;\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n loggerFactory = loggerFactory && Object.prototype.hasOwnProperty.call(loggerFactory, 'default') ? loggerFactory['default'] : loggerFactory;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n shortcut = shortcut && Object.prototype.hasOwnProperty.call(shortcut, 'default') ? shortcut['default'] : shortcut;\n namespaceHelper = namespaceHelper && Object.prototype.hasOwnProperty.call(namespaceHelper, 'default') ? namespaceHelper['default'] : namespaceHelper;\n itemHelper = itemHelper && Object.prototype.hasOwnProperty.call(itemHelper, 'default') ? itemHelper['default'] : itemHelper;\n highlighterCollection = highlighterCollection && Object.prototype.hasOwnProperty.call(highlighterCollection, 'default') ? highlighterCollection['default'] : highlighterCollection;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Returns the configured plugin\n */\n var plugin = pluginFactory({\n name: 'highlighter',\n /**\n * Install plugin's functions\n *\n */\n install: function install() {\n var testRunner = this.getTestRunner();\n\n //define the \"highlighter\" store as \"volatile\" (removed on browser change).\n testRunner.getTestStore().setVolatile(this.getName());\n },\n /**\n * Initialize the plugin (called during runner's init)\n * @returns {void}\n */\n init: function init() {\n const self = this;\n const testRunner = this.getTestRunner();\n const testRunnerOptions = testRunner.getOptions();\n const pluginShortcuts = (testRunnerOptions.shortcuts || {})[this.getName()] || {};\n let hasHighlights = false;\n const logger = loggerFactory('highlighterPlugin');\n\n /**\n * @var {Object} highlighters - Highlighters collection\n * See taoQtiTest/views/js/runner/plugins/tools/highlighter/collection.js\n */\n var highlighters = highlighterCollection();\n\n // Create the first (item-level) highlighter instance:\n highlighters.addHighlighter({\n className: 'txt-user-highlight',\n containerSelector: '.qti-itemBody',\n containersBlackList: ['.qti-include'],\n id: 'item-highlighter'\n });\n\n // create buttons\n this.buttonMain = this.getAreaBroker().getToolbox().createEntry({\n title: __('Highlight Text'),\n icon: 'text-marker',\n control: 'highlight-trigger',\n aria: {\n pressed: 'false',\n label: __('(Visual) Highlight Text')\n },\n text: __('Highlight')\n });\n this.buttonRemove = this.getAreaBroker().getToolbox().createEntry({\n title: __('Clear all active highlights'),\n icon: 'result-nok',\n control: 'highlight-clear',\n aria: {\n label: __('(Visual) Clear all active highlights')\n },\n text: __('Clear Highlights')\n });\n\n // attach user events\n this.buttonMain.on('mousedown', function (e) {\n // using 'mousedown' instead of 'click' to avoid losing current selection\n e.preventDefault();\n if (isPluginEnabled()) {\n _.forEach(highlighters.getAllHighlighters(), function (instance) {\n if (instance.isEnabled()) {\n instance.highlight();\n }\n });\n }\n });\n this.buttonRemove.on('click', function (e) {\n e.preventDefault();\n if (isPluginEnabled()) {\n _.forEach(highlighters.getAllHighlighters(), function (instance) {\n if (instance.isEnabled()) {\n instance.clearHighlights();\n }\n });\n testRunner.trigger('clear');\n }\n });\n if (testRunnerOptions.allowShortcuts) {\n if (pluginShortcuts.toggle) {\n shortcut.add(namespaceHelper.namespaceAll(pluginShortcuts.toggle, this.getName(), true), function () {\n if (isPluginEnabled()) {\n _.forEach(highlighters.getAllHighlighters(), function (instance) {\n if (instance.isEnabled()) {\n instance.highlight();\n }\n });\n }\n }, {\n avoidInput: true,\n prevent: true\n });\n }\n }\n\n //start disabled\n this.disable();\n\n /**\n * Checks if the plugin is currently available\n * @returns {Boolean}\n */\n function isPluginEnabled() {\n //to be activated with the special category x-tao-option-highlighter\n return mapHelper.hasItemCategory(testRunner.getTestMap(), testRunner.getTestContext().itemIdentifier, 'highlighter', true);\n }\n\n /**\n * Is plugin activated ? if not, then we hide the plugin\n */\n function togglePlugin() {\n if (isPluginEnabled()) {\n self.show();\n } else {\n self.hide();\n }\n }\n\n /**\n * Gets the browser test store\n * Can be in volatile or non-volatile mode, depending on config\n * @returns {Promise}\n */\n function getStore() {\n return testRunner.getTestStore().getStore(self.getName());\n }\n\n /**\n * Load the stores and hook the behavior\n */\n return getStore().then(function (highlighterStore) {\n /**\n * Saves a highlighter's state to the appropriate store\n * @param {String} [itemId] - must be provided to save item-level highlights,\n * will be used as store key if no key provided\n * @param {String} [key] - a key (e.g. a stimulus href) under which we store non-item-level highlights\n * @returns {Boolean} true if save was done\n */\n function saveHighlight(itemId, key) {\n var instance;\n var highlightsIndex;\n if (!itemId) {\n instance = highlighters.getHighlighterById(key);\n } else {\n key = itemId;\n instance = highlighters.getItemHighlighter();\n }\n if (!instance) return Promise.resolve(false);\n highlightsIndex = instance.getIndex();\n if (isPluginEnabled() && hasHighlights && key) {\n logger.debug(`Saving ${highlightsIndex.length} highlights for id ${key}`);\n return highlighterStore.setItem(key, highlightsIndex);\n }\n return false;\n }\n\n /**\n * Saves all the highlighters states in the store\n * First the non-item highlighters, then the item highlighter (index 0)\n * @returns {Promise} resolves once the save is done\n */\n function saveAll() {\n var nonItemHighlighters = highlighters.getNonItemHighlighters();\n return Promise.all(_(nonItemHighlighters).filter(function (instance) {\n return instance.isEnabled();\n }).map(function (instance) {\n var key = instance.getId();\n return saveHighlight(null, key);\n }).value()).then(function (results) {\n // Now save the main item highlight\n // and if every setItem() returned true, return true\n var itemId = testRunner.getTestContext().itemIdentifier;\n return saveHighlight(itemId) && _.every(results);\n });\n }\n\n /**\n * Retrieves a highlighter's state from a store and applies it to the DOM\n * @param {String} [itemId] - must be provided to save item-level highlights,\n * will be used as store key if no key provided\n * @param {String} [key] - a key (e.g. a stimulus href) under which we store non-item-level highlights\n * @returns {Promise} resolves once the load is done\n */\n function loadHighlight(itemId, key) {\n var instance;\n if (!itemId) {\n instance = highlighters.getHighlighterById(key);\n } else {\n key = itemId;\n instance = highlighters.getItemHighlighter();\n }\n if (!instance) return Promise.resolve(false);\n return highlighterStore.getItem(key).then(function (index) {\n if (index) {\n logger.debug(`Loading ${index.length} highlights for key ${key}`);\n hasHighlights = true;\n instance.restoreIndex(index);\n }\n }).then(function () {\n //save highlighter state during the item session,\n //when the highlighting ends\n instance.on('end.save', function () {\n return saveHighlight(itemId, key);\n });\n });\n }\n\n //update plugin state based on changes\n testRunner.on('loaditem', togglePlugin).on('enabletools renderitem', function () {\n self.enable();\n if (isPluginEnabled()) {\n _.forEach(highlighters.getAllHighlighters(), function (instance) {\n if (!instance.isEnabled()) {\n instance.on('start').toggleHighlighting(false).enable();\n }\n });\n }\n }).on('renderitem', function () {\n var textStimuli;\n var itemId = testRunner.getTestContext().itemIdentifier;\n if (itemId && isPluginEnabled()) {\n hasHighlights = false;\n highlighters.getItemHighlighter().enable();\n // Load item-level highlights from store:\n loadHighlight(itemId);\n\n // Count stimuli in this item:\n textStimuli = itemHelper.getTextStimuliHrefs(testRunner);\n\n // NOW we can instantiate the extra highlighters:\n _.forEach(textStimuli, function (textStimulusHref) {\n var stimHighlighter = highlighters.getHighlighterById(textStimulusHref);\n // Instantiate, if id not already present in highlighters...\n if (!stimHighlighter) {\n stimHighlighter = highlighters.addHighlighter({\n className: 'txt-user-highlight',\n containerSelector: `.qti-include[data-href=\"${textStimulusHref}\"]`,\n id: textStimulusHref\n });\n }\n stimHighlighter.enable();\n // And load its data:\n loadHighlight(null, textStimulusHref);\n });\n }\n }).after('renderitem', function () {\n // Attach start/end listeners only to item level highlighter\n const instance = highlighters.getItemHighlighter();\n if (instance.isEnabled()) {\n instance.on('start', function () {\n self.buttonMain.turnOn();\n self.buttonMain.$component.attr('aria-pressed', 'true');\n self.trigger('start');\n hasHighlights = true;\n }).on('end', function () {\n self.buttonMain.turnOff();\n self.buttonMain.$component.attr('aria-pressed', 'false');\n self.trigger('end');\n });\n }\n }).after('clear.highlighter', function () {\n saveAll();\n }).before('skip move timeout', function () {\n return saveAll();\n }).on('disabletools unloaditem', function () {\n self.disable();\n if (isPluginEnabled()) {\n _.forEach(highlighters.getAllHighlighters(), function (instance) {\n if (instance.isEnabled()) {\n instance.off('end.save end start').toggleHighlighting(false).disable();\n }\n });\n }\n });\n });\n },\n /**\n * Called during the runner's destroy phase\n */\n destroy: function destroy() {\n shortcut.remove(`.${this.getName()}`);\n $(document).off('.highlighter');\n },\n /**\n * Enable the button\n */\n enable: function enable() {\n this.buttonMain.enable();\n this.buttonRemove.enable();\n },\n /**\n * Disable the button\n */\n disable: function disable() {\n this.buttonMain.disable();\n this.buttonRemove.disable();\n },\n /**\n * Show the button\n */\n show: function show() {\n this.buttonMain.show();\n this.buttonRemove.show();\n },\n /**\n * Hide the button\n */\n hide: function hide() {\n this.buttonMain.hide();\n this.buttonRemove.hide();\n }\n });\n\n return plugin;\n\n});\n\n","define('taoQtiTest/runner/plugins/tools/itemThemeSwitcher/itemThemeSwitcher',['jquery', 'lodash', 'i18n', 'taoTests/runner/plugin', 'ui/hider', 'ui/themes', 'util/shortcut', 'util/namespace', 'ui/themeLoader'], function ($, _, __, pluginFactory, hider, themeHandler, shortcut, namespaceHelper, themeLoader) { 'use strict';\n\n $ = $ && Object.prototype.hasOwnProperty.call($, 'default') ? $['default'] : $;\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n themeHandler = themeHandler && Object.prototype.hasOwnProperty.call(themeHandler, 'default') ? themeHandler['default'] : themeHandler;\n shortcut = shortcut && Object.prototype.hasOwnProperty.call(shortcut, 'default') ? shortcut['default'] : shortcut;\n namespaceHelper = namespaceHelper && Object.prototype.hasOwnProperty.call(namespaceHelper, 'default') ? namespaceHelper['default'] : namespaceHelper;\n themeLoader = themeLoader && Object.prototype.hasOwnProperty.call(themeLoader, 'default') ? themeLoader['default'] : themeLoader;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * Returns the configured plugin\n */\n var itemThemeSwitcher = pluginFactory({\n name: 'itemThemeSwitcher',\n /**\n * Install step, add behavior before the lifecycle.\n */\n install: function install() {\n //define the \"itemThemeSwitcher\" store as \"volatile\" (removed on browser change).\n this.getTestRunner().getTestStore().setVolatile(this.getName());\n },\n /**\n * Initialize the plugin (called during runner's init)\n */\n init: function init() {\n var self = this;\n var pluginName = this.getName();\n var testRunner = this.getTestRunner();\n var testRunnerOptions = testRunner.getOptions();\n var pluginShortcuts = (testRunnerOptions.shortcuts || {})[this.getName()] || {};\n const pluginConfig = this.getConfig();\n this.oldNamespace = themeHandler.getActiveNamespace();\n const state = {\n availableThemes: [],\n defaultTheme: '',\n selectedTheme: ''\n };\n const allMenuEntries = [];\n if (pluginConfig.activeNamespace) {\n themeHandler.setActiveNamespace(pluginConfig.activeNamespace);\n }\n const themesConfig = themeHandler.get('items') || {};\n if (pluginConfig.activeNamespace !== this.oldNamespace && !_.isEmpty(themesConfig)) {\n reloadThemes();\n }\n\n /**\n * Tells if the component is enabled\n * @returns {Boolean}\n */\n function isPluginAllowed() {\n return themesConfig && _.size(themesConfig.available) > 1;\n }\n\n /**\n * Reloads theme config and changes theme\n */\n function reloadThemes() {\n var themeConfig = themeHandler.get('items');\n themeLoader(themeConfig).load();\n if (state && state.selectedTheme) {\n changeTheme(state.selectedTheme);\n } else {\n changeTheme(themeConfig.default);\n }\n }\n\n /**\n * Load the selected theme\n * @param themeId\n */\n function changeTheme(themeId) {\n var $qtiItem = $('.qti-item');\n var previousTheme = state.selectedTheme;\n state.selectedTheme = themeId;\n if ($qtiItem) {\n _.defer(function () {\n $qtiItem.trigger('themechange', [state.selectedTheme]);\n });\n }\n if (self.storage) {\n self.storage.setItem('itemThemeId', themeId);\n }\n if (previousTheme !== state.selectedTheme) {\n testRunner.trigger('themechange', state.selectedTheme, previousTheme);\n }\n allMenuEntries.forEach(function (menuEntry) {\n if (menuEntry.getId() === themeId) {\n menuEntry.turnOn();\n } else {\n menuEntry.turnOff();\n }\n });\n }\n\n //init plugin state\n if (themesConfig) {\n if (themesConfig.default) {\n state.defaultTheme = themesConfig.default;\n state.selectedTheme = themesConfig.default;\n changeTheme(themesConfig.default);\n }\n if (themesConfig.available) {\n _.forEach(themesConfig.available, function (theme) {\n state.availableThemes.push({\n id: theme.id,\n label: __(theme.name)\n });\n });\n }\n }\n\n // register toolbox button\n this.menuButton = this.getAreaBroker().getToolbox().createMenu({\n control: 'color-contrast',\n title: __('Change the current color preset'),\n icon: 'contrast',\n text: __('Contrast')\n }).after('render', () => {\n if (!isPluginAllowed()) {\n self.hide();\n }\n }).on('click', function (e) {\n e.preventDefault();\n testRunner.trigger('tool-themeswitcher-toggle');\n }).on('openmenu', function () {\n testRunner.trigger(`plugin-open.${pluginName}`, state.selectedTheme);\n }).on('closemenu', function () {\n testRunner.trigger(`plugin-close.${pluginName}`, state.selectedTheme);\n });\n\n // register menu entries\n state.availableThemes.forEach(function (theme) {\n var themeEntry = self.getAreaBroker().getToolbox().createEntry({\n role: 'option',\n control: theme.id,\n title: theme.label,\n icon: 'preview',\n text: __(theme.label)\n });\n themeEntry.setMenuId('color-contrast');\n themeEntry.on('click', function (e) {\n var themeId = this.config.control;\n e.preventDefault();\n self.menuButton.turnOffAll();\n this.turnOn();\n changeTheme(themeId);\n });\n if (state.defaultTheme === theme.id) {\n themeEntry.on('render', function () {\n this.turnOn();\n });\n }\n allMenuEntries.push(themeEntry);\n });\n if (testRunnerOptions.allowShortcuts) {\n if (pluginShortcuts.toggle) {\n shortcut.add(namespaceHelper.namespaceAll(pluginShortcuts.toggle, this.getName(), true), function () {\n testRunner.trigger('tool-themeswitcher-toggle');\n }, {\n avoidInput: true\n });\n }\n }\n if (!isPluginAllowed()) {\n this.hide();\n }\n\n //start disabled\n this.disable();\n\n //update plugin state based on changes\n testRunner.on('loaditem', function () {\n if (isPluginAllowed()) {\n self.show();\n } else {\n self.hide();\n }\n }).on('renderitem', function () {\n self.enable();\n changeTheme(state.selectedTheme);\n }).on('enabletools', function () {\n self.enable();\n }).on('disabletools unloaditem', function () {\n self.disable();\n }).on('tool-themeswitcher-toggle', function () {\n if (self.getState('enabled') !== false) {\n self.menuButton.toggleMenu();\n }\n }).on('tool-themeswitcher-setnavtype', function (type) {\n self.menuButton.setNavigationType(type);\n });\n return testRunner.getPluginStore(this.getName()).then(function (itemThemesStore) {\n self.storage = itemThemesStore;\n self.storage.getItem('itemThemeId').then(function (itemThemeId) {\n if (itemThemeId && state.selectedTheme !== itemThemeId) {\n changeTheme(itemThemeId);\n }\n });\n });\n },\n /**\n * Called during the runner's destroy phase\n */\n destroy: function destroy() {\n themeHandler.setActiveNamespace(this.oldNamespace);\n shortcut.remove(`.${this.getName()}`);\n return this.getTestRunner().getPluginStore(this.getName()).then(function (itemThemesStore) {\n return itemThemesStore.removeItem('itemThemeId');\n });\n },\n /**\n * Enable the button\n */\n enable: function enable() {\n this.menuButton.enable();\n },\n /**\n * Disable the button\n */\n disable: function disable() {\n this.menuButton.disable();\n },\n /**\n * Show the button\n */\n show: function show() {\n this.menuButton.show();\n },\n /**\n * Hide the button\n */\n hide: function hide() {\n this.menuButton.hide();\n }\n });\n\n return itemThemeSwitcher;\n\n});\n\n","define('taoQtiTest/runner/plugins/tools/lineReader/compoundMask',['jquery', 'lodash', 'core/statifier', 'core/eventifier', 'ui/component', 'ui/component/placeable', 'ui/component/draggable', 'ui/component/resizable', 'ui/component/stackable'], function ($, _, statifier, eventifier, componentFactory, makePlaceable, makeDraggable, makeResizable, makeStackable) { 'use strict';\n\n $ = $ && Object.prototype.hasOwnProperty.call($, 'default') ? $['default'] : $;\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n statifier = statifier && Object.prototype.hasOwnProperty.call(statifier, 'default') ? statifier['default'] : statifier;\n eventifier = eventifier && Object.prototype.hasOwnProperty.call(eventifier, 'default') ? eventifier['default'] : eventifier;\n componentFactory = componentFactory && Object.prototype.hasOwnProperty.call(componentFactory, 'default') ? componentFactory['default'] : componentFactory;\n makePlaceable = makePlaceable && Object.prototype.hasOwnProperty.call(makePlaceable, 'default') ? makePlaceable['default'] : makePlaceable;\n makeDraggable = makeDraggable && Object.prototype.hasOwnProperty.call(makeDraggable, 'default') ? makeDraggable['default'] : makeDraggable;\n makeResizable = makeResizable && Object.prototype.hasOwnProperty.call(makeResizable, 'default') ? makeResizable['default'] : makeResizable;\n makeStackable = makeStackable && Object.prototype.hasOwnProperty.call(makeStackable, 'default') ? makeStackable['default'] : makeStackable;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017 (original work) Open Assessment Technologies SA;\n */\n var defaultDimensions = {\n outerWidth: 600,\n outerHeight: 400,\n innerWidth: 500,\n innerHeight: 20\n };\n var defaultPosition = {\n outerX: 0,\n outerY: 0,\n innerX: 50,\n innerY: 50\n };\n var defaultOptions = {\n dragMinWidth: 10,\n dragMinHeight: 10,\n resizeHandleSize: 10,\n innerDragHeight: 20\n };\n var stackingOptions = {\n stackingScope: 'test-runner'\n };\n var constrains;\n\n /**\n * @param {Object} options\n * @param {Number} options.resizeHandleSize - size of the resize handlers on each resizable edge\n * @param {Number} options.dragMinWidth - minimal width for the draggable area of each component.\n * @param {Number} options.dragMinHeight - minimal height for the draggable area of each component.\n * @param {Number} options.innerDragHeight - height of the inner window drag handle\n * @param {Object} dimensions\n * @param {Number} dimensions.outerWidth - overall mask width\n * @param {Number} dimensions.outerHeight - overall mask height\n * @param {Number} dimensions.innerWidth - inner window width\n * @param {Number} dimensions.innerHeight - inner window height\n * @param {Number} position\n * @param {Number} position.outerX - overall mask x\n * @param {Number} position.outerY - overall mask y\n * @param {Number} position.innerX - inner window mask x\n * @param {Number} position.innerY - inner window mask y\n */\n function compoundMaskFactory(options, dimensions, position) {\n var compoundMask,\n allParts = {},\n innerDrag,\n closer,\n visualGuides = {};\n\n /**\n * ============================================\n * Definition of Mask & Overlay component types\n * ============================================\n */\n\n /**\n * Create a mask component. They are used for masking (obviously) but also resizing the compound mask\n * @param {Object} maskConfig\n * @param {String} maskConfig.id\n * @param {Function} maskConfig.place - size and position the mask according to the transform model\n * @param {Function} maskConfig.placeOverlay - size and position the overlay according to the transform model\n * @param {Function} maskConfig.beforeResize - used to set the resize limit depending on which edge the resizing occurs\n * @param {Function} maskConfig.onResize - how the resize affect the transform model\n * @param {Object} maskConfig.edges - Interact configuration to specify which edges can be used for resizing\n * @param {Number} maskConfig.minWidth\n * @param {Number} maskConfig.minHeight\n */\n function createMask(maskConfig) {\n var mask,\n maskAPI = {\n place: maskConfig.place,\n placeOverlay: maskConfig.placeOverlay,\n styleResizableEdges: function styleResizableEdges() {\n var $element = this.getElement();\n _.forOwn(this.config.edgesBorders, function (isResizable, edgeId) {\n if (isResizable) {\n $element.addClass(`border-${edgeId}`);\n }\n });\n },\n addResizeControll: function addResizeControll() {\n var $element = this.getElement();\n var $resizeControll = $('
          ', {\n class: 'resize-control'\n });\n $element.append($resizeControll);\n }\n };\n mask = componentFactory(maskAPI, maskConfig);\n makeResizable(mask);\n makeStackable(mask, stackingOptions);\n return mask.on('render', function () {\n var $element = this.getElement();\n this.styleResizableEdges();\n if (this.config.resizeControll) {\n this.addResizeControll();\n }\n $element.addClass(`line-reader-mask ${maskConfig.id}`).on('mousedown touchstart', function () {\n bringAllToFront();\n });\n\n // uncomment this to see what's going on with masks:\n // $element.css({ border: '1px solid olive'});\n }).on('resizestart', function () {\n innerDrag.hide();\n closer.hide();\n invokeOnOverlays('hide');\n invokeOnMasks('setState', ['resizing', true]);\n this.setState('resizer', true);\n }).on('beforeresize', maskConfig.beforeResize || _.noop).on('resize', maskConfig.onResize || _.noop).on('resizeend', function () {\n applyTransformsToOverlays();\n applyTransformsToInnerDrag();\n applyTransformsToCloser();\n invokeOnMasks('setState', ['resizing', false]);\n invokeOnOverlays('show');\n innerDrag.show();\n closer.show();\n this.setState('resizer', false);\n }).init();\n }\n\n /**\n * Create a overlay component. Overlay are invisible and are used for dragging.\n * When clicked, the whole mask is hidden and only the overlay is displayed, after being resized to fit the whole mask surface\n * this allows for performance improvement as well as giving the dragged element proper dragging boundaries.\n * Also, visual guides are added, like a fake inner window, during the drag\n * @param {Object} overlayConfig\n * @param {String} overlayConfig.id\n */\n function createOverlay(overlayConfig) {\n var overlay,\n overlayAPI = {\n transformOverlay: function transformOverlay() {\n var $element = this.getElement();\n this._sizeBackup = this.getSize();\n this._posBackup = this.getPosition();\n this.setSize(dimensions.outerWidth, dimensions.outerHeight).moveTo(position.outerX, position.outerY);\n $element.addClass('moving');\n this.setState('transformed', true);\n },\n restoreOverlay: function restoreOverlay() {\n var $element = this.getElement();\n if (this.is('transformed')) {\n this.setSize(this._sizeBackup.width, this._sizeBackup.height).moveTo(this._posBackup.x, this._posBackup.y);\n $element.removeClass('moving');\n this._sizeBackup = null;\n this._posBackup = null;\n this.setState('transformed', false);\n }\n },\n appendVisualGuides: function appendVisualGuides() {\n var $element = this.getElement(),\n borderWidth = 1,\n // this mirror the $lrBorderWidth css variable\n borderOffset = borderWidth * 2;\n $element.append(visualGuides.$maskBg);\n $element.append(visualGuides.$innerWindow);\n visualGuides.$maskBg.css({\n width: dimensions.outerWidth - borderOffset,\n height: dimensions.outerHeight - borderOffset,\n 'border-top-width': dimensions.topHeight - borderOffset,\n 'border-right-width': dimensions.rightWidth - borderOffset,\n 'border-bottom-width': dimensions.bottomHeight - borderOffset,\n 'border-left-width': dimensions.leftWidth - borderOffset\n });\n visualGuides.$innerWindow.css({\n width: dimensions.innerWidth,\n height: dimensions.innerHeight,\n left: dimensions.leftWidth - borderOffset,\n top: dimensions.topHeight - borderOffset\n });\n },\n removeVisualGuides: function removeVisualGuides() {\n visualGuides.$maskBg.remove();\n visualGuides.$innerWindow.remove();\n }\n };\n overlay = componentFactory(overlayAPI, overlayConfig);\n makeDraggable(overlay);\n makeStackable(overlay, stackingOptions);\n return overlay.on('render', function () {\n var self = this,\n $element = this.getElement(),\n // captures touch and mouse\n // also fixes issue with IE not capturing 'mousedown' etc\n pointerEventsPrefix = window.PointerEvent ? 'pointer' : 'mouse',\n $moveIcon = $('
          ', {\n class: 'icon icon-mobile-menu'\n });\n $element.addClass(`line-reader-overlay ${overlayConfig.id}`).on(`${pointerEventsPrefix}down` + ` touchstart`, function () {\n bringAllToFront();\n self.transformOverlay();\n }).on(`${pointerEventsPrefix}up` + ` touchend`, function () {\n self.restoreOverlay();\n }).prepend($moveIcon);\n }).on('dragstart', function () {\n innerDrag.hide();\n closer.hide();\n invokeOnMasks('hide');\n this.appendVisualGuides();\n }).on('dragmove', function moveAllPartsTogether(xOffsetRelative, yOffsetRelative) {\n // update the transform model\n position.outerX += xOffsetRelative;\n position.outerY += yOffsetRelative;\n position.innerX += xOffsetRelative;\n position.innerY += yOffsetRelative;\n }).on('dragend', function () {\n this.removeVisualGuides();\n // although they are already display, calling show() again on the overlays\n // will force their z-Index at the top of the stack\n invokeOnAll('show');\n innerDrag.show();\n closer.show();\n\n // apply the new transform model\n applyTransforms();\n }).init();\n }\n\n /**\n * ==========================\n * Inner Drag Handle & Closer\n * ==========================\n */\n\n /**\n * This handle allows to drag the inner window\n */\n function createInnerDragHandle() {\n // uncomment this (and a few lines below) if debugging is needed:\n // var $boundingBox = $('
          ').css({ position: 'fixed', 'box-sizing': 'border-box', border: '1px solid red' });\n\n innerDrag = componentFactory();\n makeStackable(innerDrag, stackingOptions);\n makeDraggable(innerDrag, {\n dragRestriction: function dragRestriction() {\n var fixedXY = allParts.nw.mask.getElement().offset(),\n rect;\n rect = {\n x: fixedXY.left + constrains.minWidth,\n y: fixedXY.top + (constrains.minTopHeight + dimensions.innerHeight + options.resizeHandleSize),\n width: dimensions.outerWidth - constrains.minWidth * 2,\n height: dimensions.outerHeight - (dimensions.innerHeight + constrains.minTopHeight + constrains.minBottomHeight - options.innerDragHeight)\n };\n\n // uncomment to see what's going on:\n // allParts.ne.mask.getContainer().append($boundingBox);\n // $boundingBox.css({ width: rect.width, height: rect.height, top: rect.y, left: rect.x });\n\n return rect;\n }\n }).on('render', function () {\n var $element = this.getElement(),\n $dragIcon = $('
          ', {\n class: 'icon icon-move'\n });\n $element.css('touch-action', 'none');\n $element.addClass('line-reader-inner-drag');\n $element.css({\n background: 'none'\n });\n $element.append($dragIcon);\n }).on('dragstart', function () {\n closer.hide();\n bringAllToFront();\n invokeOnMasks('setState', ['resizing', true]);\n }).on('dragmove', function (xOffsetRelative, yOffsetRelative) {\n position.innerX += xOffsetRelative;\n position.innerY += yOffsetRelative;\n dimensions.leftWidth += xOffsetRelative;\n dimensions.topHeight += yOffsetRelative;\n dimensions.rightWidth -= xOffsetRelative;\n dimensions.bottomHeight -= yOffsetRelative;\n applyTransformsToMasks();\n }).on('dragend', function () {\n innerDrag.bringToFront();\n closer.show();\n invokeOnMasks('setState', ['resizing', false]);\n applyTransformsToOverlays();\n }).init();\n }\n\n /**\n * Close button for the compound mask\n */\n function createCloser() {\n closer = componentFactory();\n makeStackable(closer, stackingOptions);\n makePlaceable(closer).on('render', function () {\n var self = this,\n $element = this.getElement(),\n $closeIcon = $('
          ', {\n class: 'icon icon-result-nok'\n });\n $element.append($closeIcon);\n $element.addClass('line-reader-closer');\n $element.on('mousedown touchstart', function () {\n bringAllToFront();\n });\n $element.on('click', function (e) {\n e.stopPropagation();\n self.trigger('click');\n });\n }).init();\n }\n\n /**\n * =================\n * Utility functions\n * =================\n */\n function bringAllToFront() {\n invokeOnAll('bringToFront');\n innerDrag.bringToFront();\n closer.bringToFront();\n }\n function invokeOnAll(fn, args) {\n invokeOnMasks(fn, args);\n invokeOnOverlays(fn, args);\n }\n function invokeOnMasks(fn, args) {\n invokeOn('mask', fn, args);\n }\n function invokeOnOverlays(fn, args) {\n invokeOn('overlay', fn, args);\n }\n\n /**\n * Invoke a method on all compound mask parts, whether mask or overlays\n * @param {String} target - mask | overlay\n * @param {String} fn - the name of the method to invoke\n * @param {*[]} args - arguments passed on invoke\n */\n function invokeOn(target, fn, args) {\n _.forOwn(allParts, function (part) {\n if (_.isObject(part[target]) && _.isFunction(part[target][fn])) {\n part[target][fn](...(args || []));\n }\n });\n }\n\n /**\n * =================================\n * Transform model related functions\n * =================================\n */\n\n function applyTransforms() {\n applyTransformsToMasks();\n applyTransformsToOverlays();\n applyTransformsToInnerDrag();\n applyTransformsToCloser();\n }\n function applyTransformsToMasks() {\n invokeOnMasks('place');\n }\n function applyTransformsToOverlays() {\n _.forOwn(allParts, function (part) {\n if (part.overlay) {\n part.mask.placeOverlay(part.overlay);\n }\n });\n }\n function applyTransformsToInnerDrag() {\n if (innerDrag) {\n innerDrag.setSize(dimensions.innerWidth - 20, options.innerDragHeight).moveTo(position.innerX + 10, position.innerY + dimensions.innerHeight + options.resizeHandleSize);\n }\n }\n function applyTransformsToCloser() {\n if (closer) {\n closer.setSize(constrains.minWidth - options.resizeHandleSize, constrains.minHeight - options.resizeHandleSize).moveTo(position.outerX + dimensions.outerWidth - constrains.minWidth - 5,\n // manual adjustment so it looks better\n position.outerY + options.resizeHandleSize - 4);\n }\n }\n\n /**\n * Check that the given transform model respect the current constrains.\n * If not, correct them\n */\n function correctTransforms() {\n if (dimensions.topHeight < constrains.minTopHeight) {\n dimensions.topHeight = constrains.minTopHeight;\n position.innerY = position.outerY + constrains.minTopHeight;\n }\n if (dimensions.innerHeight < constrains.minHeight) {\n dimensions.innerHeight = constrains.minHeight;\n }\n if (dimensions.bottomHeight < constrains.minBottomHeight) {\n dimensions.bottomHeight = constrains.minBottomHeight;\n }\n dimensions.outerHeight = dimensions.topHeight + dimensions.innerHeight + dimensions.bottomHeight;\n if (dimensions.leftWidth < constrains.minWidth) {\n dimensions.leftWidth = constrains.minWidth;\n position.innerX = position.outerX + constrains.minWidth;\n }\n if (dimensions.innerWidth < constrains.minWidth) {\n dimensions.innerWidth = constrains.minWidth;\n }\n if (dimensions.rightWidth < constrains.minWidth) {\n dimensions.rightWidth = constrains.minWidth;\n }\n dimensions.outerWidth = dimensions.leftWidth + dimensions.innerWidth + dimensions.rightWidth;\n }\n\n /**\n * Update the transform model during a resize affecting the top height\n * @param {Number} newHeight\n * @param {Number} newY\n * @param {Boolean} fromTop - if the resize occurs from the top\n */\n function setTopHeight(newHeight, newY, fromTop) {\n dimensions.topHeight = newHeight;\n if (fromTop) {\n dimensions.outerHeight = newHeight + dimensions.innerHeight + dimensions.bottomHeight;\n position.outerY = newY;\n } else {\n dimensions.innerHeight = dimensions.outerHeight - newHeight - dimensions.bottomHeight;\n position.innerY = position.outerY + newHeight;\n }\n }\n\n /**\n * Update the transform model during a resize affecting the right width\n * @param {Number} newWidth\n * @param {Number} newX\n * @param {Boolean} fromLeft - if the resize occurs from the left\n */\n function setRightWidth(newWidth, newX, fromLeft) {\n dimensions.rightWidth = newWidth;\n if (fromLeft) {\n dimensions.innerWidth = newX - position.innerX;\n } else {\n dimensions.outerWidth = dimensions.leftWidth + dimensions.innerWidth + newWidth;\n }\n }\n\n /**\n * Update the transform model during a resize affecting the bottom height\n * @param {Number} newHeight\n * @param {Number} newY\n * @param {Boolean} fromTop - if the resize occurs from the top\n */\n function setBottomHeight(newHeight, newY, fromTop) {\n dimensions.bottomHeight = newHeight;\n if (fromTop) {\n dimensions.innerHeight = newY - position.innerY;\n dimensions.bottomHeight = newHeight;\n } else {\n dimensions.outerHeight = dimensions.topHeight + dimensions.innerHeight + newHeight;\n }\n }\n\n /**\n * Update the transform model during a resize affecting the left width\n * @param {Number} newWidth\n * @param {Number} newX\n * @param {Boolean} fromLeft - if the resize occurs from the left\n */\n function setLeftWidth(newWidth, newX, fromLeft) {\n dimensions.leftWidth = newWidth;\n if (fromLeft) {\n dimensions.outerWidth = newWidth + dimensions.innerWidth + dimensions.rightWidth;\n position.outerX = newX;\n } else {\n dimensions.innerWidth = dimensions.outerWidth - newWidth - dimensions.rightWidth;\n position.innerX = position.outerX + newWidth;\n }\n }\n\n /**\n * Update the transform model during a resize affecting inner height\n * @param {Number} newHeight\n */\n const setInnerHeight = newHeight => {\n dimensions.innerHeight = newHeight;\n dimensions.bottomHeight = dimensions.outerHeight - dimensions.innerHeight - dimensions.topHeight;\n };\n /**\n * ======================================\n * Mask parts and other elements creation\n * ======================================\n */\n\n function createCompoundMask() {\n // North\n createPart({\n id: 'n',\n edges: {\n top: false,\n right: false,\n bottom: false,\n left: false\n },\n edgesBorders: {\n top: true,\n right: false,\n bottom: true,\n left: false\n },\n addOverlay: true,\n minHeight: constrains.minTopHeight,\n // move and dimension the mask\n place: function place() {\n this.moveTo(position.innerX, position.outerY).setSize(dimensions.innerWidth, dimensions.topHeight);\n },\n // move and dimension the overlay\n placeOverlay: function placeOverlay(overlay) {\n var pos = this.getPosition(),\n size = this.getSize();\n overlay.moveTo(position.outerX, pos.y).setSize(dimensions.outerWidth, size.height);\n },\n // set a resize limit whenever resize happens on an inner edge (here, the top inner edge, eg. the bottom of the mask),\n // so the min/max width/height limit for \"inner component\" is respected\n beforeResize: function beforeResize(width, height, fromLeft, fromTop) {\n this.config.maxHeight = fromTop ? null : dimensions.topHeight + (dimensions.innerHeight - constrains.minHeight);\n },\n // set the new transform values (dimension and position) resulting from the current mask resize, and apply them\n onResize: function onResize(width, height, fromLeft, fromTop, x, y) {\n setTopHeight(height, y, fromTop);\n applyTransformsToMasks();\n }\n });\n\n // North-east\n createPart({\n id: 'ne',\n edges: {\n top: false,\n right: false,\n bottom: false,\n left: false\n },\n edgesBorders: {\n top: true,\n right: true,\n bottom: false,\n left: false\n },\n minHeight: constrains.minTopHeight,\n place: function place() {\n this.moveTo(position.innerX + dimensions.innerWidth, position.outerY).setSize(dimensions.rightWidth, dimensions.topHeight);\n },\n placeOverlay: function placeOverlay(overlay) {\n var pos = this.getPosition(),\n size = this.getSize();\n overlay.moveTo(pos.x, pos.y + options.resizeHandleSize).setSize(size.width - options.resizeHandleSize, size.height - options.resizeHandleSize * 2);\n },\n onResize: function onResize(width, height, fromLeft, fromTop, x, y) {\n setTopHeight(height, y, fromTop);\n setRightWidth(width, x, fromLeft);\n applyTransformsToMasks();\n }\n });\n\n // South east\n createPart({\n id: 'se',\n edges: {\n top: false,\n right: '.resize-control',\n bottom: '.resize-control',\n left: false\n },\n edgesBorders: {\n top: false,\n right: true,\n bottom: true,\n left: false\n },\n minHeight: constrains.minBottomHeight,\n resizeControll: true,\n place: function place() {\n this.moveTo(position.innerX + dimensions.innerWidth, position.innerY + dimensions.innerHeight).setSize(dimensions.rightWidth, dimensions.bottomHeight);\n },\n placeOverlay: function placeOverlay(overlay) {\n var pos = this.getPosition(),\n size = this.getSize();\n overlay.moveTo(pos.x, pos.y + options.resizeHandleSize).setSize(size.width - options.resizeHandleSize, size.height - options.resizeHandleSize * 2);\n },\n onResize: function onResize(width, height, fromLeft, fromTop, x, y) {\n setRightWidth(width, x, fromLeft);\n setBottomHeight(height, y, fromTop);\n applyTransformsToMasks();\n }\n });\n\n // South\n createPart({\n id: 's',\n edges: {\n top: false,\n right: false,\n bottom: false,\n left: false\n },\n edgesBorders: {\n top: true,\n right: false,\n bottom: true,\n left: false\n },\n minHeight: constrains.minBottomHeight,\n place: function place() {\n this.moveTo(position.innerX, position.innerY + dimensions.innerHeight).setSize(dimensions.innerWidth, dimensions.bottomHeight);\n },\n placeOverlay: function placeOverlay(overlay) {\n var pos = this.getPosition(),\n size = this.getSize();\n overlay.moveTo(pos.x, pos.y + options.resizeHandleSize).setSize(size.width, size.height - options.resizeHandleSize * 2);\n },\n beforeResize: function beforeResize(width, height, fromLeft, fromTop) {\n this.config.maxHeight = fromTop ? dimensions.bottomHeight + (dimensions.innerHeight - constrains.minHeight) : null;\n },\n onResize: function onResize(width, height, fromLeft, fromTop, x, y) {\n setBottomHeight(height, y, fromTop);\n applyTransformsToMasks();\n }\n });\n\n // East\n createPart({\n id: 'e',\n edges: {\n top: false,\n right: false,\n bottom: '.resize-control',\n left: '.resize-control'\n },\n edgesBorders: {\n top: false,\n right: true,\n bottom: false,\n left: true\n },\n resizeControll: true,\n place: function place() {\n this.moveTo(position.innerX + dimensions.innerWidth, position.innerY).setSize(dimensions.rightWidth, dimensions.innerHeight);\n },\n placeOverlay: function placeOverlay(overlay) {\n var pos = this.getPosition(),\n size = this.getSize();\n overlay.moveTo(pos.x + options.resizeHandleSize, pos.y - options.resizeHandleSize).setSize(size.width - options.resizeHandleSize * 2, size.height + options.resizeHandleSize * 2);\n },\n // eslint-disable-next-line no-unused-vars\n beforeResize: function beforeResize(width, height, fromLeft) {\n this.config.maxWidth = dimensions.rightWidth + (dimensions.innerWidth - constrains.minWidth);\n this.config.minWidth = constrains.minWidth;\n this.config.maxHeight = dimensions.outerHeight - dimensions.topHeight - constrains.minBottomHeight;\n },\n onResize: function onResize(width, height, fromLeft, fromTop, x) {\n setRightWidth(width, x, fromLeft);\n setInnerHeight(height);\n applyTransformsToMasks();\n }\n });\n\n // South-west\n createPart({\n id: 'sw',\n edges: {\n top: false,\n right: false,\n bottom: false,\n left: false\n },\n edgesBorders: {\n top: false,\n right: false,\n bottom: true,\n left: true\n },\n minHeight: constrains.minBottomHeight,\n place: function place() {\n this.moveTo(position.outerX, position.innerY + dimensions.innerHeight).setSize(dimensions.leftWidth, dimensions.bottomHeight);\n },\n placeOverlay: function placeOverlay(overlay) {\n var pos = this.getPosition(),\n size = this.getSize();\n overlay.moveTo(pos.x + options.resizeHandleSize, pos.y + options.resizeHandleSize).setSize(size.width - options.resizeHandleSize, size.height - options.resizeHandleSize * 2);\n },\n onResize: function onResize(width, height, fromLeft, fromTop, x, y) {\n setBottomHeight(height, y, fromTop);\n setLeftWidth(width, x, fromLeft);\n applyTransformsToMasks();\n }\n });\n\n // West\n createPart({\n id: 'w',\n edges: {\n top: false,\n right: false,\n bottom: false,\n left: false\n },\n edgesBorders: {\n top: false,\n right: true,\n bottom: false,\n left: true\n },\n place: function place() {\n this.moveTo(position.outerX, position.innerY).setSize(dimensions.leftWidth, dimensions.innerHeight);\n },\n placeOverlay: function placeOverlay(overlay) {\n var pos = this.getPosition(),\n size = this.getSize();\n overlay.moveTo(pos.x + options.resizeHandleSize, pos.y - options.resizeHandleSize).setSize(size.width - options.resizeHandleSize * 2, size.height + options.resizeHandleSize * 2);\n },\n beforeResize: function beforeResize(width, height, fromLeft) {\n this.config.maxWidth = fromLeft ? null : dimensions.leftWidth + (dimensions.innerWidth - constrains.minWidth);\n },\n onResize: function onResize(width, height, fromLeft, fromTop, x) {\n setLeftWidth(width, x, fromLeft);\n applyTransformsToMasks();\n }\n });\n\n // North-west\n createPart({\n id: 'nw',\n edges: {\n top: false,\n right: false,\n bottom: false,\n left: false\n },\n edgesBorders: {\n top: true,\n right: false,\n bottom: false,\n left: true\n },\n minHeight: constrains.minTopHeight,\n place: function place() {\n this.moveTo(position.outerX, position.outerY).setSize(dimensions.leftWidth, dimensions.topHeight);\n },\n placeOverlay: function placeOverlay(overlay) {\n var pos = this.getPosition(),\n size = this.getSize();\n overlay.moveTo(pos.x + options.resizeHandleSize, pos.y + options.resizeHandleSize).setSize(size.width - options.resizeHandleSize, size.height - options.resizeHandleSize * 2);\n },\n onResize: function onResize(width, height, fromLeft, fromTop, x, y) {\n setTopHeight(height, y, fromTop);\n setLeftWidth(width, x, fromLeft);\n applyTransformsToMasks();\n }\n });\n }\n function createPart(partConfig) {\n allParts[partConfig.id] = {\n mask: createMask(_.assign({}, constrains, partConfig)),\n overlay: partConfig.addOverlay ? createOverlay(partConfig) : null\n };\n }\n function createVisualGuides() {\n visualGuides.$maskBg = $('
          ', {\n class: 'mask-bg'\n });\n visualGuides.$innerWindow = $('
          ', {\n class: 'inner-window'\n });\n }\n\n /**\n * =========================\n * The compoundMask instance\n * =========================\n */\n\n dimensions = _.defaults(dimensions || {}, defaultDimensions);\n position = _.defaults(position || {}, defaultPosition);\n options = _.defaults(options || {}, defaultOptions);\n constrains = {\n minWidth: options.resizeHandleSize * 2 + options.dragMinWidth,\n minHeight: options.resizeHandleSize * 2 + options.dragMinHeight,\n minBottomHeight: options.resizeHandleSize * 2 + options.innerDragHeight,\n minTopHeight: options.resizeHandleSize * 2 + 18 // make sure that top will fit header size\n };\n\n compoundMask = {\n init: function init() {\n var self = this;\n this.setTransforms(dimensions, position);\n createCompoundMask();\n createVisualGuides();\n createInnerDragHandle();\n createCloser();\n closer.on('click', function () {\n self.hide();\n self.trigger('close');\n });\n return this;\n },\n render: function render($container) {\n invokeOnAll('render', [$container]);\n innerDrag.render($container);\n closer.render($container);\n applyTransforms();\n return this;\n },\n destroy: function destroy() {\n invokeOnAll('destroy');\n visualGuides = null;\n innerDrag = null;\n closer = null;\n return this;\n },\n show: function show() {\n invokeOnAll('show');\n innerDrag.show();\n closer.show();\n this.setState('hidden', false);\n return this;\n },\n hide: function hide() {\n invokeOnAll('hide');\n innerDrag.hide();\n closer.hide();\n this.setState('hidden', true);\n return this;\n },\n /**\n * Allow updating the transform model\n * @param {Object} dim\n * @param {Number} dim.outerWidth - overall mask width\n * @param {Number} dim.outerHeight - overall mask height\n * @param {Number} dim.innerWidth - inner window width\n * @param {Number} dim.innerHeight - inner window height\n * @param {Number} pos\n * @param {Number} pos.outerX - overall mask x\n * @param {Number} pos.outerY - overall mask y\n * @param {Number} pos.innerX - inner window x\n * @param {Number} pos.innerY - inner window y\n */\n setTransforms: function setTransforms(dim, pos) {\n dimensions = _.defaults(dim || {}, dimensions);\n position = _.defaults(pos || {}, position);\n\n // automatically complete the dimensions\n dimensions.topHeight = pos.innerY - pos.outerY;\n dimensions.rightWidth = dim.outerWidth - (pos.innerX - pos.outerX) - dim.innerWidth;\n dimensions.bottomHeight = dim.outerHeight - (pos.innerY - pos.outerY) - dim.innerHeight;\n dimensions.leftWidth = pos.innerX - pos.outerX;\n correctTransforms();\n applyTransforms();\n },\n getDimensions: function getDimensions() {\n return dimensions;\n },\n getPosition: function getPosition() {\n return position;\n },\n getParts: function getParts() {\n return allParts;\n }\n };\n statifier(compoundMask);\n eventifier(compoundMask);\n return compoundMask;\n }\n\n return compoundMaskFactory;\n\n});\n\n","define('taoQtiTest/runner/plugins/tools/lineReader/plugin',['lodash', 'i18n', 'taoTests/runner/plugin', 'ui/hider', 'util/shortcut', 'util/namespace', 'taoQtiTest/runner/helpers/map', 'taoQtiTest/runner/plugins/tools/lineReader/compoundMask'], function (_, __, pluginFactory, hider, shortcut, namespaceHelper, mapHelper, compoundMaskFactory) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n shortcut = shortcut && Object.prototype.hasOwnProperty.call(shortcut, 'default') ? shortcut['default'] : shortcut;\n namespaceHelper = namespaceHelper && Object.prototype.hasOwnProperty.call(namespaceHelper, 'default') ? namespaceHelper['default'] : namespaceHelper;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n compoundMaskFactory = compoundMaskFactory && Object.prototype.hasOwnProperty.call(compoundMaskFactory, 'default') ? compoundMaskFactory['default'] : compoundMaskFactory;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * The public name of the plugin\n * @type {String}\n */\n var pluginName = 'line-reader';\n\n /**\n * The prefix of actions triggered through the event loop\n * @type {String}\n */\n var actionPrefix = `tool-${pluginName}-`;\n\n /**\n * Options for the compoundMask factory\n * @type {Object}\n */\n var maskOptions = {\n dragMinWidth: 17,\n dragMinHeight: 7,\n resizeHandleSize: 7,\n innerDragHeight: 20\n };\n var dimensions, position;\n\n /**\n * These functions are a first effort to place the mask on the first line on the item\n * They make a lot of assumptions:\n * - the item starts with a text\n * - the padding is set on the .qti-item container\n * - the padding is consistent with the minWidth/minHeight configuration of the mask\n * - and some other...\n * @param {jQuery} $container - where the mask is appended\n */\n function getDimensions($container) {\n var $qtiContent = $container.find('#qti-content'),\n $qtiItem = $qtiContent.find('.qti-item'),\n lineHeight = Math.ceil(parseFloat($qtiContent.css('line-height'))) || 20; // reasonable default line height\n\n return {\n outerWidth: $qtiItem.width() + maskOptions.resizeHandleSize * 4 + maskOptions.dragMinWidth * 2,\n outerHeight: 175,\n // reasonable default height\n innerWidth: $qtiItem.width(),\n innerHeight: lineHeight\n };\n }\n function getPosition($container) {\n var $qtiContent = $container.find('#qti-content'),\n $qtiItem = $qtiContent.find('.qti-item'),\n itemPosition = $qtiItem.position() || {},\n paddingLeft = parseInt($qtiItem.css('padding-left'), 10),\n paddingTop = parseInt($qtiItem.css('padding-top'), 10),\n textPadding = 3,\n // this is to let the text breathe a bit\n innerX = parseInt(itemPosition.left, 10) + paddingLeft - textPadding,\n innerY = parseInt(itemPosition.top, 10) + paddingTop - textPadding;\n return {\n outerX: innerX - maskOptions.resizeHandleSize * 2 - maskOptions.dragMinWidth,\n outerY: 0,\n innerX: innerX,\n innerY: innerY\n };\n }\n function containerWidthHasChanged($container) {\n var newDimensions = getDimensions($container);\n return newDimensions.outerWidth !== dimensions.outerWidth;\n }\n\n /**\n * Returns the configured plugin\n */\n var plugin = pluginFactory({\n name: pluginName,\n /**\n * Initialize the plugin (called during runner's init)\n */\n init: function init() {\n const self = this;\n const testRunner = this.getTestRunner();\n const testRunnerOptions = testRunner.getOptions();\n const pluginShortcuts = (testRunnerOptions.shortcuts || {})[pluginName] || {};\n const $container = testRunner.getAreaBroker().getContentArea().parent();\n this.compoundMask = compoundMaskFactory(maskOptions).init().render($container).on('close', function () {\n closeMask();\n }).hide();\n\n /**\n * Checks if the plugin is currently available\n * @returns {Boolean}\n */\n function isEnabled() {\n //to be activated with the special category x-tao-option-lineReader\n return mapHelper.hasItemCategory(testRunner.getTestMap(), testRunner.getTestContext().itemIdentifier, 'lineReader', true);\n }\n function toggleButton() {\n if (isEnabled()) {\n self.show();\n } else {\n self.hide();\n }\n }\n function toggleMask() {\n if (self.compoundMask.getState('hidden')) {\n if (containerWidthHasChanged($container)) {\n transformMask($container);\n }\n openMask();\n } else {\n closeMask();\n }\n }\n function openMask() {\n self.compoundMask.show();\n self.trigger('start');\n self.button.turnOn();\n }\n function closeMask() {\n if (!self.compoundMask.getState('hidden')) {\n self.compoundMask.hide();\n }\n self.trigger('end');\n self.button.turnOff();\n }\n function transformMask($maskContainer) {\n dimensions = getDimensions($maskContainer);\n position = getPosition($maskContainer);\n self.compoundMask.setTransforms(_.clone(dimensions), _.clone(position));\n }\n\n // create button\n this.button = this.getAreaBroker().getToolbox().createEntry({\n title: __('Line Reader'),\n icon: 'insert-horizontal-line',\n control: 'line-reader',\n text: __('Line Reader')\n });\n\n // attach user events\n this.button.on('click', function (e) {\n e.preventDefault();\n testRunner.trigger(`${actionPrefix}toggle`);\n });\n if (testRunnerOptions.allowShortcuts) {\n if (pluginShortcuts.toggle) {\n shortcut.add(namespaceHelper.namespaceAll(pluginShortcuts.toggle, this.getName(), true), function () {\n testRunner.trigger(`${actionPrefix}toggle`);\n }, {\n avoidInput: true,\n prevent: true\n });\n }\n }\n\n //start disabled\n this.disable();\n\n //update plugin state based on changes\n testRunner.on('loaditem', toggleButton).on('renderitem', function () {\n transformMask($container);\n }).on('enabletools renderitem', function () {\n self.enable();\n }).on('disabletools unloaditem', function () {\n self.disable();\n closeMask();\n }).on(`${actionPrefix}toggle`, function () {\n if (isEnabled()) {\n toggleMask();\n }\n });\n },\n /**\n * Called during the runner's destroy phase\n */\n destroy: function destroy() {\n this.compoundMask.destroy();\n shortcut.remove(`.${this.getName()}`);\n },\n /**\n * Enable the button\n */\n enable: function enable() {\n this.button.enable();\n },\n /**\n * Disable the button\n */\n disable: function disable() {\n this.button.disable();\n },\n /**\n * Show the button\n */\n show: function show() {\n this.button.show();\n },\n /**\n * Hide the button\n */\n hide: function hide() {\n this.button.hide();\n }\n });\n\n return plugin;\n\n});\n\n","define('taoQtiTest/runner/plugins/tools/magnifier/magnifierPanel',['jquery', 'lodash', 'ui/component', 'handlebars', 'lib/handlebars/helpers', 'ui/dynamicComponent'], function ($$1, _, component, Handlebars, Helpers0, dynamicComponent) { 'use strict';\n\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n component = component && Object.prototype.hasOwnProperty.call(component, 'default') ? component['default'] : component;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n Helpers0 = Helpers0 && Object.prototype.hasOwnProperty.call(Helpers0, 'default') ? Helpers0['default'] : Helpers0;\n dynamicComponent = dynamicComponent && Object.prototype.hasOwnProperty.call(dynamicComponent, 'default') ? dynamicComponent['default'] : dynamicComponent;\n\n if (!Helpers0.__initialized) {\n Helpers0(Handlebars);\n Helpers0.__initialized = true;\n }\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, options, functionType=\"function\", escapeExpression=this.escapeExpression, helperMissing=helpers.helperMissing;\n\n\n buffer += \"
          \\n
          \";\n if (helper = helpers.level) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.level); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"
          \\n
          \\n
          \\n
          \\n \\n \\n \\n
          \\n
          \\n\";\n return buffer;\n });\n function magnifierPanelTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * The screen pixel ratio\n * @type {Number}\n */\n var screenRatio = window.screen.width / window.screen.height;\n\n /**\n * Standard debounce delay for heavy process\n * @type {Number}\n */\n var debounceDelay = 50;\n\n /**\n * Standard scrolling throttling for the scrolling\n * It can be lower than the debounce delay as it is lighter in process and it improves the user experience\n * @type {Number}\n */\n var scrollingDelay = 20;\n\n /**\n * The default base size\n * @type {Number}\n */\n var defaultBaseSize = 116;\n\n /**\n * The minimum zoom level\n * @type {Number}\n */\n var defaultLevelMin = 2;\n\n /**\n * The maximum zoom level\n * @type {Number}\n */\n var defaultLevelMax = 8;\n\n /**\n * The default zoom level\n * @type {Number}\n */\n var defaultLevel = defaultLevelMin;\n\n /**\n * Some default values\n * @type {Object}\n */\n var defaultConfig = {\n level: defaultLevel,\n levelMin: defaultLevelMin,\n levelMax: defaultLevelMax,\n levelStep: 0.5,\n baseSize: defaultBaseSize,\n maxRatio: 0.5\n };\n var dynamicComponentDefaultConfig = {\n draggable: true,\n resizable: true,\n preserveAspectRatio: false,\n width: defaultBaseSize * defaultLevel,\n height: defaultBaseSize * defaultLevel / screenRatio,\n minWidth: defaultBaseSize * defaultLevelMin,\n minHeight: defaultBaseSize * defaultLevelMin / screenRatio,\n stackingScope: 'test-runner',\n top: 50,\n left: 10\n };\n\n /**\n * Creates a magnifier panel component\n * @param {Object} config\n * @param {Number} [config.level] - The default zoom level\n * @param {Number} [config.levelMin] - The minimum allowed zoom level\n * @param {Number} [config.levelMax] - The maximum allowed zoom level\n * @param {Number} [config.levelStep] - The level increment applied when using the controls + and -\n * @param {Number} [config.baseSize] - The base size used to assign the width and the height according to the zoom level\n * @param {Number} [config.maxRatio] - The ratio for the maximum size regarding the size of the window\n * @returns {magnifierPanel} the component (initialized)\n */\n function magnifierPanelFactory(config) {\n var initConfig = _.defaults(config || {}, defaultConfig);\n var zoomLevelMin = parseFloat(initConfig.levelMin);\n var zoomLevelMax = parseFloat(initConfig.levelMax);\n var zoomLevelStep = parseFloat(initConfig.levelStep);\n var zoomLevel = adjustZoomLevel(initConfig.level);\n var maxRatio = parseFloat(initConfig.maxRatio);\n var $initTarget = null;\n var controls = null;\n var observer = null;\n var targetWidth, targetHeight, dx, dy;\n var scrolling = [];\n var dynamicComponentInstance;\n var dynamicComponentConfig = _.defaults(config ? config.component || {} : {}, dynamicComponentDefaultConfig);\n\n /**\n * @typedef {Object} magnifierPanel\n */\n var magnifierPanel = component({\n /**\n * Gets the current zoom level\n * @returns {Number}\n */\n getZoomLevel: function getZoomLevel() {\n return zoomLevel;\n },\n /**\n * Gets the targeted content the magnifier will zoom\n * @returns {jQuery}\n */\n getTarget: function getTarget() {\n return controls && controls.$target;\n },\n /**\n * Sets the targeted content the magnifier will zoom\n * @param {jQuery} $newTarget\n * @returns {magnifierPanel}\n * @fires targetchange\n * @fires update\n */\n setTarget: function setTarget($newTarget) {\n if (controls) {\n controls.$target = $newTarget;\n controls.$viewTarget = null;\n setScrollingListener();\n\n /**\n * @event magnifierPanel#targetchange\n * @param {jQuery} $target\n */\n this.trigger('targetchange', controls.$target);\n this.update();\n } else {\n $initTarget = $newTarget;\n }\n return this;\n },\n /**\n * Sets the zoom level of the magnifier\n * @param {Number} level\n * @returns {magnifierPanel}\n * @fires zoom\n */\n zoomTo: function zoomTo(level) {\n if (level && _.isFinite(level)) {\n zoomLevel = adjustZoomLevel(level);\n }\n applyZoomLevel();\n showZoomLevel();\n updateMaxSize();\n updateZoom();\n\n /**\n * @event magnifierPanel#zoom\n * @param {Number} zoomLevel\n */\n this.trigger('zoom', zoomLevel);\n return this;\n },\n /**\n * Increments the zoom level of the magnifier\n * @param {Number} step\n * @returns {magnifierPanel}\n * @fires zoom\n */\n zoomBy: function zoomBy(step) {\n if (step && _.isFinite(step)) {\n this.zoomTo(zoomLevel + parseFloat(step));\n }\n return this;\n },\n /**\n * Zoom-in using the configured level step\n * @returns {magnifierPanel}\n * @fires zoom\n */\n zoomIn: function zoomIn() {\n return this.zoomBy(zoomLevelStep);\n },\n /**\n * Zoom-out using the configured level step\n * @returns {magnifierPanel}\n * @fires zoom\n */\n zoomOut: function zoomOut() {\n return this.zoomBy(-zoomLevelStep);\n },\n /**\n * Places the magnifier sight at a particular position on the target content\n * @param {Number} x\n * @param {Number} y\n * @returns {magnifierPanel}\n */\n zoomAt: function zoomAt(x, y) {\n var position;\n if (controls) {\n position = this.translate(x, y);\n controls.$inner.css({\n top: -position.top,\n left: -position.left\n });\n }\n },\n /**\n * Translates screen coordinates to zoom coordinates\n * @param {Number} x\n * @param {Number} y\n * @returns {Object}\n */\n translate: function translate(x, y) {\n return {\n top: translateMagnifier(y, targetHeight, dynamicComponentInstance.position.height),\n left: translateMagnifier(x, targetWidth, dynamicComponentInstance.position.width)\n };\n },\n /**\n * Updates the magnifier with the target content\n * @returns {magnifierPanel}\n * @fires update\n */\n update: function update() {\n if (controls && controls.$target) {\n controls.$clone = controls.$target.clone().removeAttr('id');\n controls.$clone.find('iframe').remove();\n controls.$clone.find('[name],[id],[data-serial]').removeAttr('name id data-serial');\n controls.$inner.empty().append(controls.$clone);\n controls.$clone.find('audio').prop('muted', true);\n applySize();\n applyZoomLevel();\n updateZoom();\n updateMaxSize();\n applyScrolling();\n\n /**\n * @event magnifierPanel#update\n */\n this.trigger('update');\n }\n return this;\n }\n }, defaultConfig);\n\n /**\n * Will update the magnifier content with the actual content\n * @type {Function}\n */\n var updateMagnifier = _.debounce(_.bind(magnifierPanel.update, magnifierPanel), debounceDelay);\n\n /**\n * Will update the magnifier content with the scrolling position\n * @type {Function}\n */\n var scrollingListenerCallback = _.throttle(function (event) {\n var $target = $$1(event.target);\n var scrollingTop = event.target.scrollTop;\n var scrollLeft = event.target.scrollLeft;\n var scrollId, scrollData;\n\n //check if the element is already known as a scrollable element\n if (controls && controls.$clone && $target.data('magnifier-scroll')) {\n scrollId = $target.data('magnifier-scroll');\n scrollData = _.find(scrolling, {\n id: scrollId\n });\n scrollData.scrollTop = scrollingTop;\n scrollData.scrollLeft = scrollLeft;\n\n //if in clone, scroll it\n scrollInClone(scrollData);\n } else {\n //if the element is not yet identified as a scrollable element, tag it and register its id\n scrollId = _.uniqueId('scrolling_');\n $target.attr('data-magnifier-scroll', scrollId);\n scrolling.push({\n id: scrollId,\n scrollTop: scrollingTop,\n scrollLeft: scrollLeft\n });\n\n //update all\n magnifierPanel.update();\n }\n }, scrollingDelay);\n\n /**\n * Scroll an element in the clone\n *\n * @param {Object} scrollData\n * @param {String} scrollData.id\n * @param {Number} [scrollData.scrollTop]\n * @param {Number} [scrollData.scrollLeft]\n */\n function scrollInClone(scrollData) {\n var $clonedTarget;\n if (controls && controls.$clone && scrollData && scrollData.id) {\n $clonedTarget = controls.$clone.find(`[data-magnifier-scroll=${scrollData.id}]`);\n if ($clonedTarget.length) {\n if (_.isNumber(scrollData.scrollTop)) {\n $clonedTarget[0].scrollTop = scrollData.scrollTop;\n }\n if (_.isNumber(scrollData.scrollLeft)) {\n $clonedTarget[0].scrollLeft = scrollData.scrollLeft;\n }\n }\n }\n }\n\n /**\n * Capture all scroll positions of elements inside current target\n */\n function updateScrollPositions() {\n if (!controls || !controls.$target) {\n return;\n }\n const elements = [controls.$target];\n let scrollOffsetsChanged = false;\n while (elements.length) {\n const $currentElement = $$1(elements.shift());\n const scrollLeft = $currentElement.scrollLeft();\n const scrollTop = $currentElement.scrollTop();\n let scrollId = $currentElement.data('magnifier-scroll');\n elements.push(...Array.from($currentElement.children()));\n if (scrollLeft > 0 || scrollTop > 0 || scrollId) {\n scrollOffsetsChanged = true;\n if (scrollId) {\n const scrollData = _.find(scrolling, {\n id: scrollId\n });\n scrollData.scrollTop = scrollTop;\n scrollData.scrollLeft = scrollLeft;\n } else {\n scrollId = _.uniqueId('scrolling_');\n $currentElement.attr('data-magnifier-scroll', scrollId);\n scrolling.push({\n id: scrollId,\n scrollTop,\n scrollLeft\n });\n }\n }\n }\n\n // If there is any changes to scroll offset inside the target the magnifier should be updated\n if (scrollOffsetsChanged) {\n magnifierPanel.update();\n }\n }\n\n /**\n * Initializes the listener for scrolling event and transfer the scrolling\n */\n function setScrollingListener() {\n updateScrollPositions();\n window.addEventListener('scroll', scrollingListenerCallback, true);\n }\n\n /**\n * Stops the listener for scrolling event\n */\n function removeScrollingListener() {\n window.removeEventListener('scroll', scrollingListenerCallback, true);\n }\n\n /**\n * Applies scrolling programmatically from the recorded list of elements to be scrolled\n */\n function applyScrolling() {\n _.forEach(scrolling, scrollInClone);\n }\n\n /**\n * Adjusts a provided zoom level to fit the constraints\n * @param {Number|String} level\n * @returns {Number}\n */\n function adjustZoomLevel(level) {\n return Math.max(zoomLevelMin, Math.min(parseFloat(level), zoomLevelMax));\n }\n\n /**\n * Applies the zoom level to the content\n */\n function applyZoomLevel() {\n if (controls) {\n controls.$inner.css({\n transform: `scale(${zoomLevel})`\n });\n }\n }\n\n /**\n * Shows the zoom level using a CSS animation\n */\n function showZoomLevel() {\n var $newZoomLevel;\n if (controls) {\n $newZoomLevel = controls.$zoomLevel.clone(true).html(zoomLevel);\n controls.$zoomLevel.before($newZoomLevel).remove();\n controls.$zoomLevel = $newZoomLevel;\n }\n }\n\n /**\n * Updates the max size according to the window's size\n */\n function updateMaxSize() {\n if (!dynamicComponentInstance) {\n return;\n }\n const $window = $$1(window);\n dynamicComponentInstance.config.maxWidth = $window.width() * maxRatio;\n dynamicComponentInstance.config.maxHeight = $window.height() * maxRatio;\n }\n\n /**\n * Forwards the size of the target to the cloned content\n */\n function applySize() {\n if (controls && controls.$clone) {\n targetWidth = controls.$target.width();\n targetHeight = controls.$target.height();\n controls.$clone.width(targetWidth).height(targetHeight);\n }\n }\n\n /**\n * Place the zoom sight at the right place inside the magnifier\n */\n function updateZoom() {\n var position;\n if (controls && controls.$target) {\n position = dynamicComponentInstance.position;\n position.x += dx + controls.$target.scrollLeft();\n position.y += dy + controls.$target.scrollTop();\n magnifierPanel.zoomAt(position.x, position.y);\n }\n }\n\n /**\n * Creates the observer that will react to DOM changes to update the magnifier\n */\n function createObserver() {\n observer = new window.MutationObserver(updateMagnifier);\n }\n\n /**\n * Starts to observe the DOM of the magnifier target\n */\n function startObserver() {\n if (controls && controls.$target) {\n observer.observe(controls.$target.get(0), {\n childList: true,\n // Set to true if additions and removals of the target node's child elements (including text nodes) are to be observed.\n attributes: true,\n // Set to true if mutations to target's attributes are to be observed.\n characterData: true,\n // Set to true if mutations to target's data are to be observed.\n subtree: true // Set to true if mutations to target and target's descendants are to be observed.\n });\n }\n\n setScrollingListener();\n }\n\n /**\n * Stops to observe the DOM of the magnifier target\n */\n function stopObserver() {\n observer.disconnect();\n removeScrollingListener();\n }\n\n /**\n * Translates a screen coordinate into the magnifier\n * @param {Number} coordinate\n * @param {Number} actualSize\n * @param {Number} magnifierSize\n * @returns {Number}\n */\n function translateMagnifier(coordinate, actualSize, magnifierSize) {\n var delta = 0;\n var ratio = zoomLevel;\n if (actualSize) {\n delta = actualSize * (zoomLevel - 1) / 2;\n ratio = (actualSize * zoomLevel - magnifierSize) / (actualSize - magnifierSize);\n }\n return coordinate * ratio - delta;\n }\n\n /**\n * Gets the top element from a particular absolute point.\n * @param {Number} x - the page X-coordinate of the point\n * @param {Number} y - the page Y-coordinate of the point\n * @returns {HTMLElement}\n */\n function getElementFromPoint(x, y) {\n var el;\n\n // this is done to prevent working with undefined coordinates\n x = x || 0;\n y = y || 0;\n if (controls) {\n controls.$overlay.addClass('hidden');\n }\n el = document.elementFromPoint(x, y);\n if (controls) {\n controls.$overlay.removeClass('hidden');\n }\n return el;\n }\n\n /**\n * Find the related node in the target. The both trees must have the same content.\n * @param {jQuery|HTMLElement} node - the node for which find a relation\n * @param {jQuery|HTMLElement} root - the root of the tree that contains the actual node\n * @param {jQuery|HTMLElement} target - the root of the tree that could contains the related node\n * @returns {jQuery}\n */\n function findSourceNode(node, root, target) {\n var $node = $$1(node);\n var $root = $$1(root);\n var $target = $$1(target);\n var indexes = [$node.index()];\n\n // compute map of node's parents indexes\n $node.parents().each(function () {\n var $this = $$1(this);\n if (!$this.is($root)) {\n indexes.push($this.index());\n } else {\n return false;\n }\n });\n\n // the last index is related to the root, so ignore it\n indexes.pop();\n\n // now try to find the same node using the path provided by the indexes map\n if (indexes.length) {\n $node = $target;\n _.forEachRight(indexes, function (index) {\n $node = $node.children().eq(index);\n if (!$node.length) {\n return false;\n }\n });\n } else {\n // nothing to search for...\n $node = $$1();\n }\n return $node;\n }\n dynamicComponentInstance = dynamicComponent({}).on('rendercontent', function ($content) {\n // eslint-disable-next-line consistent-this\n var dynamicComponentContext = this;\n var $element = this.getElement();\n $element.addClass('magnifier-container');\n magnifierPanel.setTemplate(magnifierPanelTpl).on('render', function () {\n var self = this;\n var $component = this.getElement();\n this.setState('hidden', true);\n\n // compute the padding of the magnifier content\n dx = ($component.outerWidth() - $component.width()) / 2;\n dy = ($component.outerHeight() - $component.height()) / 2;\n controls = {\n $target: $initTarget,\n $inner: $$1('.inner', $component),\n $zoomLevel: $$1('.level', $component),\n $overlay: $$1('.overlay', $component)\n };\n $initTarget = null;\n\n // click on zoom-out control\n $component.on('click touchstart', '.control[data-control=\"zoomOut\"]', function (event) {\n event.preventDefault();\n self.zoomOut();\n });\n\n // click on zoom-in control\n $component.on('click touchstart', '.control[data-control=\"zoomIn\"]', function (event) {\n event.preventDefault();\n self.zoomIn();\n });\n\n // click on close controls\n $component.on('click touchstart', '.closeMagnifier', function (event) {\n event.preventDefault();\n self.hide();\n self.trigger('close');\n });\n\n // interact through the magnifier glass with the zoomed content\n $component.on('click touchstart', '.overlay', function (event) {\n findSourceNode(getElementFromPoint(event.pageX, event.pageY), controls.$inner, controls.$target).click().focus();\n });\n createObserver();\n updateMaxSize();\n applyZoomLevel();\n }).on('show', function () {\n updateMagnifier();\n startObserver();\n dynamicComponentContext.show();\n }).on('hide', function () {\n stopObserver();\n dynamicComponentContext.hide();\n }).on('destroy', function () {\n stopObserver();\n $initTarget = null;\n controls = null;\n observer = null;\n dynamicComponentContext.destroy();\n }).init(initConfig).render($content);\n }).on('down move resize', function () {\n updateZoom();\n }).on('resize', function () {\n updateMaxSize();\n }).init(dynamicComponentConfig);\n return magnifierPanel;\n }\n\n return magnifierPanelFactory;\n\n});\n\n","define('taoQtiTest/runner/plugins/tools/magnifier/magnifier',['lodash', 'i18n', 'taoTests/runner/plugin', 'ui/hider', 'util/shortcut', 'util/namespace', 'taoQtiTest/runner/plugins/tools/magnifier/magnifierPanel', 'taoQtiTest/runner/helpers/map'], function (_, __, pluginFactory, hider, shortcut, namespaceHelper, magnifierPanelFactory, mapHelper) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n shortcut = shortcut && Object.prototype.hasOwnProperty.call(shortcut, 'default') ? shortcut['default'] : shortcut;\n namespaceHelper = namespaceHelper && Object.prototype.hasOwnProperty.call(namespaceHelper, 'default') ? namespaceHelper['default'] : namespaceHelper;\n magnifierPanelFactory = magnifierPanelFactory && Object.prototype.hasOwnProperty.call(magnifierPanelFactory, 'default') ? magnifierPanelFactory['default'] : magnifierPanelFactory;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * The public name of the plugin\n * @type {String}\n */\n var pluginName = 'magnifier';\n\n /**\n * The prefix of actions triggered through the event loop\n * @type {String}\n */\n var actionPrefix = `tool-${pluginName}-`;\n\n /**\n * Some default options for the plugin\n * @type {Object}\n */\n var defaultOptions = {\n zoomMin: 2,\n // Smallest magnification factor\n zoomMax: 8,\n // Biggest magnification factor\n zoomStep: 0.5 // Increment between min an max\n };\n\n /**\n * Returns the configured plugin\n */\n var magnifier = pluginFactory({\n name: pluginName,\n /**\n * Initializes the plugin (called during runner's init)\n */\n init: function init() {\n const self = this;\n const testRunner = this.getTestRunner();\n const testRunnerOptions = testRunner.getOptions();\n const pluginConfig = Object.assign({}, defaultOptions, this.getConfig());\n const pluginShortcuts = (testRunnerOptions.shortcuts || {})[pluginName] || {};\n let magnifierPanel = null;\n\n /**\n * Creates the magnifier panel on demand\n * @returns {magnifierPanel}\n * @fires plugin-magnifier-create.magnifier\n */\n function getMagnifierPanel() {\n var $container;\n if (!magnifierPanel) {\n $container = testRunner.getAreaBroker().getContainer();\n magnifierPanel = magnifierPanelFactory({\n levelMin: pluginConfig.zoomMin,\n levelMax: pluginConfig.zoomMax,\n levelStep: pluginConfig.zoomStep,\n component: {\n renderTo: $container.parent(),\n draggableContainer: $container.parent()\n }\n }).on('show', function () {\n /**\n * @event plugin-magnifier-show.magnifier\n */\n self.trigger('magnifier-show');\n }).on('hide', function () {\n /**\n * @event plugin-magnifier-hide.magnifier\n */\n self.trigger('magnifier-hide');\n }).on('zoom', function (level) {\n /**\n * @event plugin-magnifier-zoom.magnifier\n * @param {Number} zoomLevel\n */\n self.trigger('magnifier-zoom', level);\n }).on('close', function () {\n hideMagnifier();\n }).setTarget($container);\n\n /**\n * @event plugin-magnifier-create.magnifier\n */\n self.trigger('magnifier-create');\n }\n return magnifierPanel;\n }\n\n /**\n * Checks if the plugin is currently available\n * @returns {Boolean}\n */\n function isEnabled() {\n //to be activated with the special category x-tao-option-magnifier\n return mapHelper.hasItemCategory(testRunner.getTestMap(), testRunner.getTestContext().itemIdentifier, 'magnifier', true);\n }\n\n /**\n * Shows/hides the plugin GUI according to context\n */\n function togglePlugin() {\n if (isEnabled()) {\n self.show();\n } else {\n self.hide();\n }\n }\n\n /**\n * Shows/hides the magnifier\n */\n function toggleMagnifier() {\n if (self.getState('enabled')) {\n if (self.getState('active')) {\n hideMagnifier();\n } else {\n showMagnifier();\n }\n }\n }\n\n /**\n * Opens the magnifier panel\n * @fires plugin-magnifier-show.magnifier\n */\n function showMagnifier() {\n getMagnifierPanel();\n if (magnifierPanel.is('hidden')) {\n magnifierPanel.show();\n }\n self.button.turnOn();\n testRunner.trigger(`plugin-open.${pluginName}`);\n self.setState('active', true);\n }\n\n /**\n * Closes the magnifier panel\n * @fires plugin-magnifier-hide.magnifier\n */\n function hideMagnifier() {\n self.setState('active', false);\n self.button.turnOff();\n testRunner.trigger(`plugin-close.${pluginName}`);\n if (magnifierPanel && !magnifierPanel.is('hidden')) {\n magnifierPanel.hide();\n }\n }\n\n // build element\n this.button = this.getAreaBroker().getToolbox().createEntry({\n control: 'magnify',\n title: __('Displays a customisable magnifier'),\n text: __('Magnifying Glass'),\n icon: 'find'\n });\n\n // attach behavior\n this.button.on('click', function (event) {\n event.preventDefault();\n testRunner.trigger(`${actionPrefix}toggle`);\n });\n\n // handle the plugin's shortcuts\n if (testRunnerOptions.allowShortcuts) {\n _.forEach(pluginShortcuts, function (command, key) {\n shortcut.add(namespaceHelper.namespaceAll(command, pluginName, true), function () {\n // just fire the action using the event loop\n testRunner.trigger(actionPrefix + key);\n }, {\n avoidInput: true\n });\n });\n }\n\n //start disabled\n togglePlugin();\n this.disable();\n\n //update plugin state based on changes\n testRunner\n // runner life cycle\n .on('loaditem', function () {\n togglePlugin();\n self.disable();\n }).on('renderitem', function () {\n if (magnifierPanel) {\n magnifierPanel.update().zoomTo(pluginConfig.zoomMin);\n }\n }).on('enabletools renderitem', function () {\n self.enable();\n }).on('disabletools unloaditem', function () {\n if (self.getState('active')) {\n hideMagnifier();\n }\n self.disable();\n }).on('destroy', function () {\n if (magnifierPanel) {\n magnifierPanel.destroy();\n }\n magnifierPanel = null;\n })\n\n // commands that controls the magnifier\n .on(`${actionPrefix}toggle`, function () {\n if (isEnabled()) {\n toggleMagnifier();\n }\n }).on(`${actionPrefix}in`, function () {\n if (isEnabled() && self.getState('enabled') && self.getState('active')) {\n getMagnifierPanel().zoomIn();\n }\n }).on(`${actionPrefix}out`, function () {\n if (isEnabled() && self.getState('enabled') && self.getState('active')) {\n getMagnifierPanel().zoomOut();\n }\n }).on(`${actionPrefix}close`, function () {\n if (self.getState('active')) {\n hideMagnifier();\n }\n });\n },\n /**\n * Called during the runner's destroy phase\n */\n destroy: function destroy() {\n shortcut.remove(`.${pluginName}`);\n },\n /**\n * Enables the button\n */\n enable: function enable() {\n this.button.enable();\n },\n /**\n * Disables the button\n */\n disable: function disable() {\n this.button.disable();\n },\n /**\n * Shows the button\n */\n show: function show() {\n this.button.show();\n },\n /**\n * Hides the button\n */\n hide: function hide() {\n this.button.hide();\n }\n });\n\n return magnifier;\n\n});\n\n","define('taoQtiTest/runner/plugins/tools/zoom',['jquery', 'i18n', 'ui/hider', 'ui/transformer', 'util/shortcut', 'util/namespace', 'taoTests/runner/plugin', 'taoQtiTest/runner/helpers/map'], function ($, __, hider, transformer, shortcut, namespaceHelper, pluginFactory, mapHelper) { 'use strict';\n\n $ = $ && Object.prototype.hasOwnProperty.call($, 'default') ? $['default'] : $;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n transformer = transformer && Object.prototype.hasOwnProperty.call(transformer, 'default') ? transformer['default'] : transformer;\n shortcut = shortcut && Object.prototype.hasOwnProperty.call(shortcut, 'default') ? shortcut['default'] : shortcut;\n namespaceHelper = namespaceHelper && Object.prototype.hasOwnProperty.call(namespaceHelper, 'default') ? namespaceHelper['default'] : namespaceHelper;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2022 (original work) Open Assessment Technologies SA;\n *\n * @author dieter \n * @author Alexander Zagovorichev \n */\n\n /**\n * The standard zoom level, in percentage\n * @type {Number}\n */\n const standard = 100;\n\n /**\n * Zoom-In/Zoom-Out steps\n * @type {Number}\n */\n const increment = 10;\n\n /**\n * The zoom boundaries, in percentage\n * @type {Object}\n */\n const threshold = {\n lower: 10,\n upper: 200\n };\n\n /**\n * Sets the zoom level\n * @param {jQuery} $target\n * @param {Number} level - Zoom percentage\n */\n const _setZoomLevel = ($target, level) => {\n const $parent = $target.parent();\n const newScale = level / standard;\n const isOverZoom = $parent.outerWidth(true) < $target.width() * newScale;\n if (isOverZoom) {\n transformer.setTransformOrigin($target, '0 0');\n $parent.css('margin-left', '0');\n } else {\n transformer.setTransformOrigin($target, '50% 0');\n $parent.css('margin-left', '');\n }\n transformer.scale($target, newScale);\n };\n\n /**\n * Restores the standard zoom level\n * @param {jQuery} $target\n */\n const _resetZoom = $target => {\n transformer.reset($target);\n };\n\n /**\n * Forces a browser repaint\n * Solution from http://stackoverflow.com/questions/3485365/how-can-i-force-webkit-to-redraw-repaint-to-propagate-style-changes?answertab=votes#tab-top\n * @param {jQuery} $target\n */\n const forceRepaint = $target => {\n const sel = $target[0];\n if (sel) {\n sel.style.display = 'none';\n sel.offsetHeight; // no need to store this anywhere, the reference is enough\n sel.style.display = '';\n }\n };\n\n /**\n * Returns the configured plugin\n */\n var zoom = pluginFactory({\n name: 'zoom',\n /**\n * Initialize the plugin (called during runner's init)\n */\n init() {\n const testRunner = this.getTestRunner();\n const testRunnerOptions = testRunner.getOptions();\n const pluginShortcuts = (testRunnerOptions.shortcuts || {})[this.getName()] || {};\n const testRunnerContainer = this.getAreaBroker().getContainer().get(0);\n\n /**\n * Checks if the plugin is currently available\n * @returns {Boolean}\n */\n const isConfigured = () => {\n //to be activated with the special category x-tao-option-zoom\n return mapHelper.hasItemCategory(testRunner.getTestMap(), testRunner.getTestContext().itemIdentifier, 'zoom', true);\n };\n\n /**\n * Is zoom activated ? if not, then we hide the plugin\n */\n const togglePlugin = () => {\n if (isConfigured()) {\n //allow zoom\n this.show();\n } else {\n this.hide();\n }\n };\n const zoomAction = dir => {\n const inc = increment * dir;\n if (this.$zoomTarget) {\n const el = this.$zoomTarget[0];\n const before = el.getBoundingClientRect();\n let sx = this.$container.scrollLeft();\n let sy = this.$container.scrollTop();\n this.zoom = Math.max(threshold.lower, Math.min(threshold.upper, this.zoom + inc));\n if (this.zoom === standard) {\n _resetZoom(this.$zoomTarget);\n } else {\n _setZoomLevel(this.$zoomTarget, this.zoom);\n }\n testRunnerContainer.style.setProperty('--tool-zoom-level', this.zoom / standard);\n\n // force a browser repaint to fix a scrollbar issue with WebKit\n forceRepaint(this.$zoomTarget);\n const after = el.getBoundingClientRect();\n sx = Math.max(0, sx + (after.width - before.width) / 2);\n sy = Math.max(0, sy + (after.height - before.height) / 2);\n this.$container.scrollLeft(sx).scrollTop(sy);\n }\n };\n const zoomIn = () => {\n if (this.getState('enabled') !== false) {\n zoomAction(1);\n }\n };\n const zoomOut = () => {\n if (this.getState('enabled') !== false) {\n zoomAction(-1);\n }\n };\n\n /**\n * Reapplys the same zoom level to the target\n * It can be useful if the element was (visually-)hidden why zoom happened\n */\n const zoomReApply = () => {\n if (this.zoom !== standard) {\n _setZoomLevel(this.$zoomTarget, this.zoom);\n }\n };\n\n //build element (detached)\n this.buttonZoomOut = this.getAreaBroker().getToolbox().createEntry({\n control: 'zoomOut',\n title: __('Zoom out'),\n icon: 'remove'\n });\n this.buttonZoomIn = this.getAreaBroker().getToolbox().createEntry({\n control: 'zoomIn',\n title: __('Zoom in'),\n icon: 'add'\n });\n\n //attach behavior\n this.buttonZoomIn.on('click', e => {\n e.preventDefault();\n testRunner.trigger('tool-zoomin');\n });\n\n //attach behavior\n this.buttonZoomOut.on('click', e => {\n e.preventDefault();\n testRunner.trigger('tool-zoomout');\n });\n if (testRunnerOptions.allowShortcuts) {\n if (pluginShortcuts.in) {\n shortcut.add(namespaceHelper.namespaceAll(pluginShortcuts.in, this.getName(), true), () => {\n testRunner.trigger('tool-zoomin');\n }, {\n avoidInput: true\n });\n }\n if (pluginShortcuts.out) {\n shortcut.add(namespaceHelper.namespaceAll(pluginShortcuts.out, this.getName(), true), () => {\n testRunner.trigger('tool-zoomout');\n }, {\n avoidInput: true\n });\n }\n }\n\n //start disabled\n togglePlugin();\n this.disable();\n\n //update plugin state based on changes\n testRunner.on('loaditem', () => {\n this.zoom = standard;\n togglePlugin();\n this.disable();\n }).on('renderitem', () => {\n this.$container = $('#qti-content');\n this.$zoomTarget = $('.qti-item');\n this.enable();\n }).on('enabletools', () => {\n this.enable();\n }).on('disabletools unloaditem', () => {\n this.disable();\n }).on('tool-zoomin', zoomIn).on('tool-zoomout', zoomOut).on('tool-zoomreapply', zoomReApply);\n },\n /**\n * Called during the runner's destroy phase\n */\n destroy() {\n shortcut.remove(`.${this.getName()}`);\n },\n /**\n * Enable the button\n */\n enable() {\n this.buttonZoomIn.enable();\n this.buttonZoomOut.enable();\n },\n /**\n * Disable the button\n */\n disable() {\n this.buttonZoomIn.disable();\n this.buttonZoomOut.disable();\n },\n /**\n * Show the button\n */\n show() {\n this.buttonZoomIn.show();\n this.buttonZoomOut.show();\n },\n /**\n * Hide the button\n */\n hide() {\n this.buttonZoomIn.hide();\n this.buttonZoomOut.hide();\n }\n });\n\n return zoom;\n\n});\n\n","\n(function(c){var d=document,a='appendChild',i='styleSheet',s=d.createElement('style');s.type='text/css';d.getElementsByTagName('head')[0][a](s);s[i]?s[i].cssText=c:s[a](d.createTextNode(c));})\n('/*\\nUsage:\\n- linear-gradient((color1, color2, color3)) - returns linear-gradient with evenly distributed colors,\\n if 3 colors used then the position of each will be 33,33%\\n- linear-gradient((color1 0%, color2 30%, color3 80%)) - returns linear-gradient with manually distributed colors,\\n first param - color, second - position. Also you can use px or other valid units for set position.\\n*/\\n/* based on \\\"visually-hidden\\\" mixin in LDS for accessibility goals */\\n/* Do not edit */\\n.test-runner-scope .content-wrapper p.key-navigation-group, .test-runner-scope .content-wrapper div.key-navigation-group:not(.select2-container) {\\n padding: 5px !important;\\n}\\n.test-runner-scope .content-wrapper .key-navigation-group:not(.qti-extendedTextInteraction):not(.qti-textEntryInteraction):not(.qti-customInteraction) {\\n border-width: 1px !important;\\n border-style: solid;\\n border-color: transparent;\\n}\\n.test-runner-scope .content-wrapper .key-navigation-group:not(.qti-extendedTextInteraction):not(.qti-textEntryInteraction):not(.qti-customInteraction).focusin {\\n border-color: rgb(14, 93, 145) !important;\\n outline: none;\\n}\\n.test-runner-scope .content-wrapper .key-navigation-group:not(.qti-extendedTextInteraction):not(.qti-textEntryInteraction):not(.qti-customInteraction).qti-interaction .qti-choice.key-navigation-highlight:not(.tts-content-node) {\\n background: #e7eff4 !important;\\n}\\n.test-runner-scope .content-wrapper span.key-navigation-group {\\n border: none !important;\\n}\\n.test-runner-scope .content-wrapper span.key-navigation-group.focusin {\\n outline: solid rgb(14, 93, 145) 1px !important;\\n outline-offset: 1px;\\n}\\n.test-runner-scope .test-sidebar .key-navigation-group.focusin {\\n background: #e7eff4;\\n}\\n.test-runner-scope .test-sidebar .key-navigation-group .qti-navigator-filters .key-navigation-highlight .qti-navigator-tab {\\n border-width: 2px;\\n}\\n.test-runner-scope .test-sidebar .key-navigation-group .qti-navigator-filters .key-navigation-highlight:focus {\\n outline: none;\\n}\\n.test-runner-scope .test-sidebar .key-navigation-group .qti-navigator-filters .key-navigation-highlight:focus .qti-navigator-tab {\\n border-top-color: #222 !important;\\n border-left-color: #222 !important;\\n border-right-color: #222 !important;\\n}\\n.test-runner-scope .test-sidebar .key-navigation-group li.qti-navigator-item.key-navigation-highlight {\\n padding-left: 8px;\\n border-left: solid 2px #222;\\n}\\n.test-runner-scope .test-sidebar .key-navigation-group li.qti-navigator-item.key-navigation-highlight .key-navigation-highlight:focus {\\n outline: none;\\n}\\n.test-runner-scope .test-sidebar .qti-navigator-fizzy .key-navigation-group.focusin {\\n background: #f2f2f2;\\n}\\n.test-runner-scope .bottom-action-bar.content-action-bar.key-navigation-group.focusin {\\n -ms-box-shadow: 0 0 6px 2px #3e7da7;\\n -o-box-shadow: 0 0 6px 2px #3e7da7;\\n box-shadow: 0 0 6px 2px #3e7da7;\\n}\\n.test-runner-scope .bottom-action-bar.content-action-bar.key-navigation-group .key-navigation-highlight:focus {\\n margin-bottom: 0;\\n border-bottom-color: #e7eff4 !important;\\n outline: none;\\n}\\n.test-runner-scope .bottom-action-bar.content-action-bar.key-navigation-group .key-navigation-highlight:focus.active {\\n border-bottom-color: transparent !important;\\n background: #e7eff4 !important;\\n}\\n.test-runner-scope .bottom-action-bar.content-action-bar.key-navigation-group .key-navigation-highlight:focus:not(.active):not(:active) .li-inner {\\n color: #e7eff4;\\n}\\n\\nheader .settings-menu .key-navigation-group {\\n padding-right: 5px;\\n}\\nheader .settings-menu .key-navigation-group.focusin {\\n background-color: rgba(14, 93, 145, 0.5);\\n padding-bottom: 10px;\\n}\\nheader .settings-menu .key-navigation-highlight:focus {\\n height: 54px;\\n color: white !important;\\n border-bottom: solid 2px white !important;\\n}\\n/*# sourceMappingURL=../../../taoQtiTest/views/node_modules/@oat-sa/tao-test-runner-qti/dist/plugins/content/accessibility/css/key-navigation.css.map *//*\\nUsage:\\n- linear-gradient((color1, color2, color3)) - returns linear-gradient with evenly distributed colors,\\n if 3 colors used then the position of each will be 33,33%\\n- linear-gradient((color1 0%, color2 30%, color3 80%)) - returns linear-gradient with manually distributed colors,\\n first param - color, second - position. Also you can use px or other valid units for set position.\\n*/\\n/* based on \\\"visually-hidden\\\" mixin in LDS for accessibility goals */\\n/* Do not edit */\\n.countdown {\\n opacity: 0;\\n position: relative;\\n display: inline-block;\\n overflow: hidden;\\n text-align: center;\\n vertical-align: top;\\n line-height: 1.2;\\n padding: 0 20px;\\n margin-top: -1px;\\n height: 100%;\\n}\\n.countdown.rendered {\\n opacity: 1;\\n transition: opacity, 300ms, linear, 0s;\\n}\\n.countdown .label {\\n max-width: 130px;\\n display: block;\\n font-size: 12px;\\n font-size: 1.2rem;\\n}\\n/*# sourceMappingURL=../../../taoQtiTest/views/node_modules/@oat-sa/tao-test-runner-qti/dist/plugins/controls/timer/component/css/countdown.css.map *//*\\nUsage:\\n- linear-gradient((color1, color2, color3)) - returns linear-gradient with evenly distributed colors,\\n if 3 colors used then the position of each will be 33,33%\\n- linear-gradient((color1 0%, color2 30%, color3 80%)) - returns linear-gradient with manually distributed colors,\\n first param - color, second - position. Also you can use px or other valid units for set position.\\n*/\\n/* based on \\\"visually-hidden\\\" mixin in LDS for accessibility goals */\\n/* Do not edit */\\n.timer-box {\\n opacity: 0;\\n padding-top: 0;\\n white-space: nowrap;\\n /*flex item of control-box */\\n flex: 1 0 auto;\\n /* is also a flex container for .qti-timer */\\n display: flex;\\n flex-direction: row;\\n flex-wrap: nowrap;\\n justify-content: flex-end;\\n}\\n.timer-box.rendered {\\n opacity: 1;\\n transition: opacity, 300ms, linear, 0s;\\n}\\n.timer-box .timer-toggler {\\n text-decoration: none;\\n color: white;\\n line-height: 1.3;\\n opacity: 0.68;\\n padding: 8px 20px;\\n position: relative;\\n top: -1px;\\n left: 20px;\\n z-index: 2;\\n transition: opacity, 0.5s, ease-out, 0s;\\n}\\n.timer-box .timer-toggler:hover, .timer-box .timer-toggler:active, .timer-box .timer-toggler:focus {\\n outline: unset;\\n}\\n.timer-box .timer-toggler:active, .timer-box .timer-toggler:focus {\\n border: 2px solid white;\\n}\\n.timer-box .timer-toggler:hover {\\n opacity: 0.93;\\n transition: opacity, 0.5s, ease-out, 0s;\\n}\\n.timer-box.zen .timer-toggler {\\n opacity: 0.93;\\n transition: opacity, 0.5s, ease-out, 0s;\\n}\\n.timer-box.zen .countdown .time {\\n opacity: 0;\\n transition: opacity, 1s, ease-out, 0s;\\n}\\n.timer-box .countdown::before {\\n content: \\\" \\\";\\n background: rgba(255, 255, 255, 0.3);\\n width: 1px;\\n height: 20px;\\n position: absolute;\\n left: 0;\\n top: 5px;\\n}\\n.timer-box .countdown:first-child::before {\\n content: none;\\n}\\n.timer-box .countdown[data-scope=test][data-type=min] {\\n order: 5;\\n}\\n.timer-box .countdown[data-scope=test] {\\n order: 10;\\n}\\n.timer-box .countdown[data-scope=testPart][data-type=min] {\\n order: 15;\\n}\\n.timer-box .countdown[data-scope=testPart] {\\n order: 20;\\n}\\n.timer-box .countdown[data-scope=section][data-type=min] {\\n order: 25;\\n}\\n.timer-box .countdown[data-scope=section] {\\n order: 30;\\n}\\n.timer-box .countdown[data-scope=item][data-type=min] {\\n order: 35;\\n}\\n.timer-box .countdown[data-scope=item] {\\n order: 40;\\n}\\n/*# sourceMappingURL=../../../taoQtiTest/views/node_modules/@oat-sa/tao-test-runner-qti/dist/plugins/controls/timer/component/css/timerbox.css.map */');\n","\ndefine(\"taoQtiTest/loader/testPlugins.bundle\", function(){});\n"],"mappings":"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"} \ No newline at end of file diff --git a/views/package-lock.json b/views/package-lock.json index 5c605b2a2..63ead71de 100644 --- a/views/package-lock.json +++ b/views/package-lock.json @@ -1,18 +1,33 @@ { "name": "@oat-sa/tao-testqti", "version": "0.4.2", - "lockfileVersion": 1, + "lockfileVersion": 3, "requires": true, - "dependencies": { - "@oat-sa/tao-test-runner": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@oat-sa/tao-test-runner/-/tao-test-runner-0.9.1.tgz", - "integrity": "sha512-VFl9M/cO1OuGznSdqf30uqgrXHRoDO56YSD62ZRqeKr+Z3k+syCCp5m789JWp5prGA/VB1S/b1SsTmqd6cfzpw==" + "packages": { + "": { + "name": "@oat-sa/tao-testqti", + "version": "0.4.2", + "license": "GPL-2.0", + "dependencies": { + "@oat-sa/tao-test-runner": "^1.0.0", + "@oat-sa/tao-test-runner-qti": "^4.0.0" + } }, - "@oat-sa/tao-test-runner-qti": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@oat-sa/tao-test-runner-qti/-/tao-test-runner-qti-3.0.0.tgz", - "integrity": "sha512-nsuMCslvXv9uZ5VK32nRaXRYhezwcCFrMd8Wo6weuJZ00qWWaTp9hN2/GmdBBosKUYrJbEpisu9D6ar0y6TBew==" + "node_modules/@oat-sa/tao-test-runner": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@oat-sa/tao-test-runner/-/tao-test-runner-1.0.0.tgz", + "integrity": "sha512-ehZcyU+rQS/rN+RO7/qd5Yw3E3u25xTHv7tD+lBJDgnD+AbfOIe1Fcz/K+tFWc97cHzzYo1eUTKsaTsVbbPOSQ==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@oat-sa/tao-test-runner-qti": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@oat-sa/tao-test-runner-qti/-/tao-test-runner-qti-4.0.0.tgz", + "integrity": "sha512-cpl5AImr9Ozd0allMAQO+ZVFHeD7bzmaIYhLJPHBO4OrAE/njKtrvxV+mYCqSxOZwXKbUiyAHr1/ZGlKR/I+Bg==", + "engines": { + "node": ">=14.0.0" + } } } } diff --git a/views/package.json b/views/package.json index 76cb65ed4..018ae9fc5 100644 --- a/views/package.json +++ b/views/package.json @@ -8,7 +8,7 @@ }, "license": "GPL-2.0", "dependencies": { - "@oat-sa/tao-test-runner": "^0.9.1", - "@oat-sa/tao-test-runner-qti": "^3.0.0" + "@oat-sa/tao-test-runner": "^1.0.0", + "@oat-sa/tao-test-runner-qti": "^4.0.0" } }