Migrate source and build to vite.js
authorymh <ymh.work@gmail.com>
Wed, 04 Sep 2024 17:32:50 +0200
changeset 1072 ac1eacb3aa33
parent 1071 02c04d2c8fd8
child 1073 687133dc13cf
Migrate source and build to vite.js
.hgignore
README.md
package-lock.json
package.json
sbin/build/build-downloads.sh
sbin/build/client.xml
sbin/build/compil-to-platform.sh.tmpl
sbin/build/compil-to-polemic-tweet.sh.tmpl
sbin/build/compil.bat
sbin/build/compil.sh
sbin/build/gendoc.bat
sbin/build/gendoc.sh
sbin/build/minify.bat
sbin/build/minify.sh
sbin/doc/convertdocs.sh
sbin/doc/markdown2dokuwiki.py
sbin/doc/markdown2html.py
sbin/res/Markdown-2.2.0.tar.gz
sbin/res/ant-contrib.jar
sbin/res/ant/bin/ant
sbin/res/ant/bin/ant.bat
sbin/res/ant/bin/ant.cmd
sbin/res/ant/bin/antRun
sbin/res/ant/bin/antRun.bat
sbin/res/ant/bin/antRun.pl
sbin/res/ant/bin/antenv.cmd
sbin/res/ant/bin/complete-ant-cmd.pl
sbin/res/ant/bin/envset.cmd
sbin/res/ant/bin/lcp.bat
sbin/res/ant/bin/runant.pl
sbin/res/ant/bin/runant.py
sbin/res/ant/bin/runrc.cmd
sbin/res/ant/lib/README
sbin/res/ant/lib/ant-antlr.jar
sbin/res/ant/lib/ant-antlr.pom
sbin/res/ant/lib/ant-apache-bcel.jar
sbin/res/ant/lib/ant-apache-bcel.pom
sbin/res/ant/lib/ant-apache-bsf.jar
sbin/res/ant/lib/ant-apache-bsf.pom
sbin/res/ant/lib/ant-apache-log4j.jar
sbin/res/ant/lib/ant-apache-log4j.pom
sbin/res/ant/lib/ant-apache-oro.jar
sbin/res/ant/lib/ant-apache-oro.pom
sbin/res/ant/lib/ant-apache-regexp.jar
sbin/res/ant/lib/ant-apache-regexp.pom
sbin/res/ant/lib/ant-apache-resolver.jar
sbin/res/ant/lib/ant-apache-resolver.pom
sbin/res/ant/lib/ant-apache-xalan2.jar
sbin/res/ant/lib/ant-apache-xalan2.pom
sbin/res/ant/lib/ant-commons-logging.jar
sbin/res/ant/lib/ant-commons-logging.pom
sbin/res/ant/lib/ant-commons-net.jar
sbin/res/ant/lib/ant-commons-net.pom
sbin/res/ant/lib/ant-jai.jar
sbin/res/ant/lib/ant-jai.pom
sbin/res/ant/lib/ant-javamail.jar
sbin/res/ant/lib/ant-javamail.pom
sbin/res/ant/lib/ant-jdepend.jar
sbin/res/ant/lib/ant-jdepend.pom
sbin/res/ant/lib/ant-jmf.jar
sbin/res/ant/lib/ant-jmf.pom
sbin/res/ant/lib/ant-jsch.jar
sbin/res/ant/lib/ant-jsch.pom
sbin/res/ant/lib/ant-junit.jar
sbin/res/ant/lib/ant-junit.pom
sbin/res/ant/lib/ant-junit4.jar
sbin/res/ant/lib/ant-junit4.pom
sbin/res/ant/lib/ant-launcher.jar
sbin/res/ant/lib/ant-launcher.pom
sbin/res/ant/lib/ant-netrexx.jar
sbin/res/ant/lib/ant-netrexx.pom
sbin/res/ant/lib/ant-parent.pom
sbin/res/ant/lib/ant-swing.jar
sbin/res/ant/lib/ant-swing.pom
sbin/res/ant/lib/ant-testutil.jar
sbin/res/ant/lib/ant-testutil.pom
sbin/res/ant/lib/ant.jar
sbin/res/ant/lib/ant.pom
sbin/res/ant/lib/libraries.properties
sbin/res/compiler.jar
sbin/res/jquery-1.3.2.externs.js
sbin/res/jsdoc/LdtPlayer-release.js
sbin/res/jsdoc/README.txt
sbin/res/jsdoc/app/frame.js
sbin/res/jsdoc/app/frame/Chain.js
sbin/res/jsdoc/app/frame/Dumper.js
sbin/res/jsdoc/app/frame/Hash.js
sbin/res/jsdoc/app/frame/Link.js
sbin/res/jsdoc/app/frame/Namespace.js
sbin/res/jsdoc/app/frame/Opt.js
sbin/res/jsdoc/app/frame/Reflection.js
sbin/res/jsdoc/app/frame/String.js
sbin/res/jsdoc/app/frame/Testrun.js
sbin/res/jsdoc/app/handlers/FOODOC.js
sbin/res/jsdoc/app/handlers/XMLDOC.js
sbin/res/jsdoc/app/handlers/XMLDOC/DomReader.js
sbin/res/jsdoc/app/handlers/XMLDOC/XMLDoc.js
sbin/res/jsdoc/app/handlers/XMLDOC/XMLParse.js
sbin/res/jsdoc/app/lib/JSDOC.js
sbin/res/jsdoc/app/lib/JSDOC/DocComment.js
sbin/res/jsdoc/app/lib/JSDOC/DocTag.js
sbin/res/jsdoc/app/lib/JSDOC/JsDoc.js
sbin/res/jsdoc/app/lib/JSDOC/JsPlate.js
sbin/res/jsdoc/app/lib/JSDOC/Lang.js
sbin/res/jsdoc/app/lib/JSDOC/Parser.js
sbin/res/jsdoc/app/lib/JSDOC/PluginManager.js
sbin/res/jsdoc/app/lib/JSDOC/Symbol.js
sbin/res/jsdoc/app/lib/JSDOC/SymbolSet.js
sbin/res/jsdoc/app/lib/JSDOC/TextStream.js
sbin/res/jsdoc/app/lib/JSDOC/Token.js
sbin/res/jsdoc/app/lib/JSDOC/TokenReader.js
sbin/res/jsdoc/app/lib/JSDOC/TokenStream.js
sbin/res/jsdoc/app/lib/JSDOC/Util.js
sbin/res/jsdoc/app/lib/JSDOC/Walker.js
sbin/res/jsdoc/app/main.js
sbin/res/jsdoc/app/plugins/commentSrcJson.js
sbin/res/jsdoc/app/plugins/frameworkPrototype.js
sbin/res/jsdoc/app/plugins/functionCall.js
sbin/res/jsdoc/app/plugins/publishSrcHilite.js
sbin/res/jsdoc/app/plugins/symbolLink.js
sbin/res/jsdoc/app/plugins/tagParamConfig.js
sbin/res/jsdoc/app/plugins/tagSynonyms.js
sbin/res/jsdoc/app/run.js
sbin/res/jsdoc/app/t/TestDoc.js
sbin/res/jsdoc/app/t/runner.js
sbin/res/jsdoc/app/test.js
sbin/res/jsdoc/app/test/addon.js
sbin/res/jsdoc/app/test/anon_inner.js
sbin/res/jsdoc/app/test/augments.js
sbin/res/jsdoc/app/test/augments2.js
sbin/res/jsdoc/app/test/borrows.js
sbin/res/jsdoc/app/test/borrows2.js
sbin/res/jsdoc/app/test/config.js
sbin/res/jsdoc/app/test/constructs.js
sbin/res/jsdoc/app/test/encoding.js
sbin/res/jsdoc/app/test/encoding_other.js
sbin/res/jsdoc/app/test/event.js
sbin/res/jsdoc/app/test/exports.js
sbin/res/jsdoc/app/test/functions_anon.js
sbin/res/jsdoc/app/test/functions_nested.js
sbin/res/jsdoc/app/test/global.js
sbin/res/jsdoc/app/test/globals.js
sbin/res/jsdoc/app/test/ignore.js
sbin/res/jsdoc/app/test/inner.js
sbin/res/jsdoc/app/test/jsdoc_test.js
sbin/res/jsdoc/app/test/lend.js
sbin/res/jsdoc/app/test/memberof.js
sbin/res/jsdoc/app/test/memberof2.js
sbin/res/jsdoc/app/test/memberof3.js
sbin/res/jsdoc/app/test/memberof_constructor.js
sbin/res/jsdoc/app/test/module.js
sbin/res/jsdoc/app/test/multi_methods.js
sbin/res/jsdoc/app/test/name.js
sbin/res/jsdoc/app/test/namespace_nested.js
sbin/res/jsdoc/app/test/nocode.js
sbin/res/jsdoc/app/test/oblit_anon.js
sbin/res/jsdoc/app/test/overview.js
sbin/res/jsdoc/app/test/param_inline.js
sbin/res/jsdoc/app/test/params_optional.js
sbin/res/jsdoc/app/test/prototype.js
sbin/res/jsdoc/app/test/prototype_nested.js
sbin/res/jsdoc/app/test/prototype_oblit.js
sbin/res/jsdoc/app/test/prototype_oblit_constructor.js
sbin/res/jsdoc/app/test/public.js
sbin/res/jsdoc/app/test/scripts/code.js
sbin/res/jsdoc/app/test/scripts/notcode.txt
sbin/res/jsdoc/app/test/shared.js
sbin/res/jsdoc/app/test/shared2.js
sbin/res/jsdoc/app/test/shortcuts.js
sbin/res/jsdoc/app/test/static_this.js
sbin/res/jsdoc/app/test/synonyms.js
sbin/res/jsdoc/app/test/tosource.js
sbin/res/jsdoc/app/test/variable_redefine.js
sbin/res/jsdoc/changes.txt
sbin/res/jsdoc/conf/sample.conf
sbin/res/jsdoc/java/build.xml
sbin/res/jsdoc/java/build_1.4.xml
sbin/res/jsdoc/java/classes/js.jar
sbin/res/jsdoc/java/src/JsDebugRun.java
sbin/res/jsdoc/java/src/JsRun.java
sbin/res/jsdoc/jsdebug.jar
sbin/res/jsdoc/jsrun.jar
sbin/res/jsdoc/jsrun.sh
sbin/res/jsdoc/out/jsdoc/files.html
sbin/res/jsdoc/out/jsdoc/index.html
sbin/res/jsdoc/out/jsdoc/symbols/_global_.html
sbin/res/jsdoc/out/jsdoc/symbols/src/LdtPlayer-release.js.html
sbin/res/jsdoc/templates/jsdoc/allclasses.tmpl
sbin/res/jsdoc/templates/jsdoc/allfiles.tmpl
sbin/res/jsdoc/templates/jsdoc/class.tmpl
sbin/res/jsdoc/templates/jsdoc/index.tmpl
sbin/res/jsdoc/templates/jsdoc/publish.js
sbin/res/jsdoc/templates/jsdoc/static/default.css
sbin/res/jsdoc/templates/jsdoc/static/header.html
sbin/res/jsdoc/templates/jsdoc/static/index.html
sbin/res/jsdoc/templates/jsdoc/symbol.tmpl
sbin/res/jslint-wrapper.js
sbin/res/jslint.js
sbin/res/rhino.jar
src/js/header.js
src/js/html-player.js
src/js/iframe_embed/embedder.js
src/js/init.js
src/js/model.js
src/js/serializers/contentapi-serializer.js
src/js/serializers/index.js
src/js/serializers/ldt-serializer.js
src/js/serializers/ldt_annotate.js
src/js/serializers/ldt_localstorage.js
src/js/serializers/segmentapi-serializer.js
src/js/utils.js
src/js/version.js
src/js/widgets-container/defaults.js
src/js/widgets-container/metadataplayer.js
src/js/widgets-container/widget.js
src/main.js
src/main.module.css
src/widgets/AdaptivePlayer.js
src/widgets/Annotation.css
src/widgets/Annotation.js
src/widgets/Annotation.module.css
src/widgets/AnnotationsController.css
src/widgets/AnnotationsController.js
src/widgets/AnnotationsController.module.css
src/widgets/AnnotationsList.css
src/widgets/AnnotationsList.js
src/widgets/AnnotationsList.module.css
src/widgets/Arrow.js
src/widgets/AutoPlayer.js
src/widgets/Controller.css
src/widgets/Controller.js
src/widgets/Controller.module.css
src/widgets/CreateAnnotation.css
src/widgets/CreateAnnotation.js
src/widgets/CreateAnnotation.module.css
src/widgets/CurrentSegmentInfobox.css
src/widgets/CurrentSegmentInfobox.js
src/widgets/CurrentSegmentInfobox.module.css
src/widgets/DailymotionPlayer.js
src/widgets/EnrichedPlan.css
src/widgets/EnrichedPlan.js
src/widgets/EnrichedPlan.module.css
src/widgets/HelloWorld.css
src/widgets/HelloWorld.js
src/widgets/HelloWorld.module.css
src/widgets/Highlighter.css
src/widgets/Highlighter.js
src/widgets/Highlighter.module.css
src/widgets/HtmlMashupPlayer.js
src/widgets/HtmlPlayer.js
src/widgets/ImageDisplay.css
src/widgets/ImageDisplay.js
src/widgets/ImageDisplay.module.css
src/widgets/JwpPlayer.js
src/widgets/KnowledgeConcierge.css
src/widgets/KnowledgeConcierge.js
src/widgets/KnowledgeConcierge.module.css
src/widgets/LatestAnnotation.css
src/widgets/LatestAnnotation.js
src/widgets/LatestAnnotation.module.css
src/widgets/Markers.css
src/widgets/Markers.js
src/widgets/Markers.module.css
src/widgets/MashupPlayer.css
src/widgets/MashupPlayer.js
src/widgets/MashupPlayer.module.css
src/widgets/MediaList.css
src/widgets/MediaList.js
src/widgets/MediaList.module.css
src/widgets/Mediafragment.js
src/widgets/MultiSegments.js
src/widgets/NoteTaking.css
src/widgets/NoteTaking.js
src/widgets/NoteTaking.module.css
src/widgets/PlaceholderPlayer.css
src/widgets/PlaceholderPlayer.js
src/widgets/PlaceholderPlayer.module.css
src/widgets/Polemic.css
src/widgets/Polemic.js
src/widgets/Polemic.module.css
src/widgets/PopcornPlayer.js
src/widgets/Quiz.css
src/widgets/Quiz.js
src/widgets/Quiz.module.css
src/widgets/QuizCreator.css
src/widgets/QuizCreator.js
src/widgets/QuizCreator.module.css
src/widgets/Renkan.css
src/widgets/Renkan.js
src/widgets/Renkan.module.css
src/widgets/Segments.css
src/widgets/Segments.js
src/widgets/Segments.module.css
src/widgets/Shortcuts.css
src/widgets/Shortcuts.js
src/widgets/Shortcuts.module.css
src/widgets/Slice.css
src/widgets/Slice.js
src/widgets/Slice.module.css
src/widgets/SlidePreview.css
src/widgets/SlidePreview.js
src/widgets/SlidePreview.module.css
src/widgets/SlideVideoPlayer.css
src/widgets/SlideVideoPlayer.js
src/widgets/SlideVideoPlayer.module.css
src/widgets/Slider.css
src/widgets/Slider.js
src/widgets/Slider.module.css
src/widgets/Slideshare.css
src/widgets/Slideshare.js
src/widgets/Slideshare.module.css
src/widgets/Social.css
src/widgets/Social.js
src/widgets/Social.module.css
src/widgets/Sparkline.js
src/widgets/SpelSyncHtml.js
src/widgets/Tagcloud.css
src/widgets/Tagcloud.js
src/widgets/Tagcloud.module.css
src/widgets/Title.js
src/widgets/Tooltip.css
src/widgets/Tooltip.js
src/widgets/Tooltip.module.css
src/widgets/Trace.js
src/widgets/Transcript.css
src/widgets/Transcript.js
src/widgets/Transcript.module.css
src/widgets/Tweet.css
src/widgets/Tweet.js
src/widgets/Tweet.module.css
src/widgets/index.js
test/dailymotion.htm
test/dailymotion.html
test/ext-trace.htm
test/ext-trace.html
test/hello-world-dist.html
test/hello-world.html
test/index.htm
test/index.html
test/iri-ressources_embed.html
test/iri-ressources_embed_dist.html
test/jwplayer-audio.htm
test/jwplayer-audio.html
test/jwplayer.htm
test/jwplayer.html
test/mp4video.htm
test/mp4video.html
test/oggvideo.htm
test/oggvideo.html
test/onthefly.htm
test/onthefly.html
test/placeholderplayer.htm
test/placeholderplayer.html
test/renkan.htm
test/renkan.html
test/slideshare.htm
test/slideshare.html
test/spel-2.htm
test/spel-2.html
vite.config.js
--- a/.hgignore	Sun Nov 12 22:07:33 2017 +0100
+++ b/.hgignore	Wed Sep 04 17:32:50 2024 +0200
@@ -16,6 +16,7 @@
 ^sbin/build/compil-to-polemic-tweet\.sh$
 ^.git$
 ^.gitignore$
+^node_modules$
 
 syntax: glob
 build/LdtPlayer-release.js
@@ -24,3 +25,6 @@
 *.orig
 src/js/site.js
 doc/jsdoc/*
+shell.nix
+dist/*
+.envrc
--- a/README.md	Sun Nov 12 22:07:33 2017 +0100
+++ b/README.md	Wed Sep 04 17:32:50 2024 +0200
@@ -7,27 +7,29 @@
     o Reads from Youtube, Dailymotion and Flash backends
     o Loads the data as JSON as well as JSONP
     
-
-Requirements
+Prerequisite
 ============
 
-- jQuery 1.4
-- jQuery UI 1.4
-- the java jre (for building the sources)
+- node + npm
+- `$ npm install`
 
 Building the library
 ====================
 
-The library files are scattered in many files. An ant build script has been made to make the developer and
-minified versions of the player. It is located in sbin/build/client.xml.
-To build the library, simply run sbin/build/compil.bat if you are running windows, or sbin/build/compil.sh
-if you're running Unix.
+The library files are scattered in many files. 
+It is built with vite.
+- `$ npm run build`
+
+The result of the build is in the dist/ folder.
 
 Running the examples
 ====================
 
-You'll have to have a web server configured to serve the metadataplayer directory, because
-of the flash cross-domain policy.
+- `npm dev`
+
+or for building the dist:
+- `vite build -w` + `python -m http.server 5173`
+
 
 The code
 ========
@@ -35,3 +37,5 @@
 The code is scattered among several files, which are concatenated and minified during the
 build process. The html templates in the templates/ directory are also "jsified" during
 this process, to be used by the js code.
+
+**TODO:** finish the migration of the examples and widgets. Replace the JwPlayer widget with an open source js video player that can play youtube and wimeo videos. Adapt  the AdaptivePlayer accordingly.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/package-lock.json	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,4721 @@
+{
+  "name": "metadataplayer",
+  "version": "0.0.1",
+  "lockfileVersion": 3,
+  "requires": true,
+  "packages": {
+    "": {
+      "name": "metadataplayer",
+      "version": "0.0.1",
+      "dependencies": {
+        "backbone": "^1.6.0",
+        "backbone-relational": "^0.10.0",
+        "jquery": "^3.7.1",
+        "jquery-ui": "^1.14.0",
+        "jwplayer": "^1.0.3",
+        "lodash": "^4.17.21",
+        "mousetrap": "^1.6.5",
+        "mousetrap-global-bind": "^1.1.0",
+        "mustache": "^4.2.0",
+        "paper": "^0.12.18",
+        "popcorn-js": "github:menismu/popcorn-js",
+        "processing": "^0.2.0",
+        "raphael": "^2.3.0"
+      },
+      "devDependencies": {
+        "@rollup/plugin-inject": "^5.0.5",
+        "vite": "^5.4.1",
+        "vite-plugin-banner": "^0.7.1",
+        "vite-plugin-node-polyfills": "^0.22.0"
+      }
+    },
+    "node_modules/@esbuild/aix-ppc64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
+      "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "aix"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/android-arm": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
+      "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/android-arm64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
+      "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/android-x64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
+      "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/darwin-arm64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
+      "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/darwin-x64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
+      "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/freebsd-arm64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
+      "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/freebsd-x64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
+      "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/linux-arm": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
+      "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/linux-arm64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
+      "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/linux-ia32": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
+      "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/linux-loong64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
+      "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
+      "cpu": [
+        "loong64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/linux-mips64el": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
+      "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
+      "cpu": [
+        "mips64el"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/linux-ppc64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
+      "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/linux-riscv64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
+      "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
+      "cpu": [
+        "riscv64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/linux-s390x": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
+      "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
+      "cpu": [
+        "s390x"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/linux-x64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
+      "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/netbsd-x64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
+      "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "netbsd"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/openbsd-x64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
+      "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "openbsd"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/sunos-x64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
+      "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "sunos"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/win32-arm64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
+      "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/win32-ia32": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
+      "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/win32-x64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
+      "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@jridgewell/sourcemap-codec": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
+      "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
+      "dev": true
+    },
+    "node_modules/@mapbox/node-pre-gyp": {
+      "version": "1.0.11",
+      "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz",
+      "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==",
+      "dependencies": {
+        "detect-libc": "^2.0.0",
+        "https-proxy-agent": "^5.0.0",
+        "make-dir": "^3.1.0",
+        "node-fetch": "^2.6.7",
+        "nopt": "^5.0.0",
+        "npmlog": "^5.0.1",
+        "rimraf": "^3.0.2",
+        "semver": "^7.3.5",
+        "tar": "^6.1.11"
+      },
+      "bin": {
+        "node-pre-gyp": "bin/node-pre-gyp"
+      }
+    },
+    "node_modules/@rollup/plugin-inject": {
+      "version": "5.0.5",
+      "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-5.0.5.tgz",
+      "integrity": "sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==",
+      "dev": true,
+      "dependencies": {
+        "@rollup/pluginutils": "^5.0.1",
+        "estree-walker": "^2.0.2",
+        "magic-string": "^0.30.3"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      },
+      "peerDependencies": {
+        "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
+      },
+      "peerDependenciesMeta": {
+        "rollup": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@rollup/pluginutils": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz",
+      "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==",
+      "dev": true,
+      "dependencies": {
+        "@types/estree": "^1.0.0",
+        "estree-walker": "^2.0.2",
+        "picomatch": "^2.3.1"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      },
+      "peerDependencies": {
+        "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
+      },
+      "peerDependenciesMeta": {
+        "rollup": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@rollup/rollup-android-arm-eabi": {
+      "version": "4.20.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.20.0.tgz",
+      "integrity": "sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "android"
+      ]
+    },
+    "node_modules/@rollup/rollup-android-arm64": {
+      "version": "4.20.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.20.0.tgz",
+      "integrity": "sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "android"
+      ]
+    },
+    "node_modules/@rollup/rollup-darwin-arm64": {
+      "version": "4.20.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.20.0.tgz",
+      "integrity": "sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ]
+    },
+    "node_modules/@rollup/rollup-darwin-x64": {
+      "version": "4.20.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.20.0.tgz",
+      "integrity": "sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+      "version": "4.20.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.20.0.tgz",
+      "integrity": "sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+      "version": "4.20.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.20.0.tgz",
+      "integrity": "sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm64-gnu": {
+      "version": "4.20.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.20.0.tgz",
+      "integrity": "sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm64-musl": {
+      "version": "4.20.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.20.0.tgz",
+      "integrity": "sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
+      "version": "4.20.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.20.0.tgz",
+      "integrity": "sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+      "version": "4.20.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.20.0.tgz",
+      "integrity": "sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA==",
+      "cpu": [
+        "riscv64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-s390x-gnu": {
+      "version": "4.20.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.20.0.tgz",
+      "integrity": "sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg==",
+      "cpu": [
+        "s390x"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-x64-gnu": {
+      "version": "4.20.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.20.0.tgz",
+      "integrity": "sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-x64-musl": {
+      "version": "4.20.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.20.0.tgz",
+      "integrity": "sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-win32-arm64-msvc": {
+      "version": "4.20.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.20.0.tgz",
+      "integrity": "sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@rollup/rollup-win32-ia32-msvc": {
+      "version": "4.20.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.20.0.tgz",
+      "integrity": "sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@rollup/rollup-win32-x64-msvc": {
+      "version": "4.20.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.20.0.tgz",
+      "integrity": "sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@types/estree": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
+      "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
+      "dev": true
+    },
+    "node_modules/abbrev": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+      "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
+    },
+    "node_modules/accepts": {
+      "version": "1.3.8",
+      "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
+      "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
+      "dependencies": {
+        "mime-types": "~2.1.34",
+        "negotiator": "0.6.3"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/agent-base": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+      "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+      "dependencies": {
+        "debug": "4"
+      },
+      "engines": {
+        "node": ">= 6.0.0"
+      }
+    },
+    "node_modules/ajv": {
+      "version": "6.12.6",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+      "dependencies": {
+        "fast-deep-equal": "^3.1.1",
+        "fast-json-stable-stringify": "^2.0.0",
+        "json-schema-traverse": "^0.4.1",
+        "uri-js": "^4.2.2"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/epoberezkin"
+      }
+    },
+    "node_modules/ansi-regex": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/ansi-styles": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+      "dependencies": {
+        "color-convert": "^1.9.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/aproba": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz",
+      "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ=="
+    },
+    "node_modules/are-we-there-yet": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz",
+      "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==",
+      "deprecated": "This package is no longer supported.",
+      "dependencies": {
+        "delegates": "^1.0.0",
+        "readable-stream": "^3.6.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/array-flatten": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+      "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
+    },
+    "node_modules/asn1": {
+      "version": "0.2.6",
+      "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
+      "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
+      "dependencies": {
+        "safer-buffer": "~2.1.0"
+      }
+    },
+    "node_modules/asn1.js": {
+      "version": "4.10.1",
+      "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
+      "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==",
+      "dev": true,
+      "dependencies": {
+        "bn.js": "^4.0.0",
+        "inherits": "^2.0.1",
+        "minimalistic-assert": "^1.0.0"
+      }
+    },
+    "node_modules/asn1.js/node_modules/bn.js": {
+      "version": "4.12.0",
+      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+      "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+      "dev": true
+    },
+    "node_modules/assert": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz",
+      "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "is-nan": "^1.3.2",
+        "object-is": "^1.1.5",
+        "object.assign": "^4.1.4",
+        "util": "^0.12.5"
+      }
+    },
+    "node_modules/assert-plus": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+      "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/async": {
+      "version": "2.6.4",
+      "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz",
+      "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==",
+      "dependencies": {
+        "lodash": "^4.17.14"
+      }
+    },
+    "node_modules/asynckit": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+    },
+    "node_modules/available-typed-arrays": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
+      "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
+      "dev": true,
+      "dependencies": {
+        "possible-typed-array-names": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/aws-sign2": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+      "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==",
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/aws4": {
+      "version": "1.13.1",
+      "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.1.tgz",
+      "integrity": "sha512-u5w79Rd7SU4JaIlA/zFqG+gOiuq25q5VLyZ8E+ijJeILuTxVzZgp2CaGw/UTw6pXYN9XMO9yiqj/nEHmhTG5CA=="
+    },
+    "node_modules/backbone": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/backbone/-/backbone-1.6.0.tgz",
+      "integrity": "sha512-13PUjmsgw/49EowNcQvfG4gmczz1ximTMhUktj0Jfrjth0MVaTxehpU+qYYX4MxnuIuhmvBLC6/ayxuAGnOhbA==",
+      "dependencies": {
+        "underscore": ">=1.8.3"
+      }
+    },
+    "node_modules/backbone-relational": {
+      "version": "0.10.0",
+      "resolved": "https://registry.npmjs.org/backbone-relational/-/backbone-relational-0.10.0.tgz",
+      "integrity": "sha512-g770F1c89e6LDaah4GaN/auh4HHjumPMFBkaNeZEEJGZA+0dh5pLFgXyb45iaxcDoa2VBWWgwdd2ZnqozyPeiw==",
+      "dependencies": {
+        "backbone": ">=1.2.1",
+        "underscore": ">=1.7.0"
+      }
+    },
+    "node_modules/balanced-match": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+    },
+    "node_modules/base64-js": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+      "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ]
+    },
+    "node_modules/bcrypt-pbkdf": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+      "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
+      "dependencies": {
+        "tweetnacl": "^0.14.3"
+      }
+    },
+    "node_modules/bn.js": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz",
+      "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==",
+      "dev": true
+    },
+    "node_modules/body-parser": {
+      "version": "1.20.2",
+      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz",
+      "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==",
+      "dependencies": {
+        "bytes": "3.1.2",
+        "content-type": "~1.0.5",
+        "debug": "2.6.9",
+        "depd": "2.0.0",
+        "destroy": "1.2.0",
+        "http-errors": "2.0.0",
+        "iconv-lite": "0.4.24",
+        "on-finished": "2.4.1",
+        "qs": "6.11.0",
+        "raw-body": "2.5.2",
+        "type-is": "~1.6.18",
+        "unpipe": "1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.8",
+        "npm": "1.2.8000 || >= 1.4.16"
+      }
+    },
+    "node_modules/body-parser/node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/body-parser/node_modules/iconv-lite": {
+      "version": "0.4.24",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+      "dependencies": {
+        "safer-buffer": ">= 2.1.2 < 3"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/body-parser/node_modules/ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+    },
+    "node_modules/body-parser/node_modules/qs": {
+      "version": "6.11.0",
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
+      "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
+      "dependencies": {
+        "side-channel": "^1.0.4"
+      },
+      "engines": {
+        "node": ">=0.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "dependencies": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "node_modules/brorand": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
+      "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==",
+      "dev": true
+    },
+    "node_modules/browser-resolve": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz",
+      "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==",
+      "dev": true,
+      "dependencies": {
+        "resolve": "^1.17.0"
+      }
+    },
+    "node_modules/browserify-aes": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
+      "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
+      "dev": true,
+      "dependencies": {
+        "buffer-xor": "^1.0.3",
+        "cipher-base": "^1.0.0",
+        "create-hash": "^1.1.0",
+        "evp_bytestokey": "^1.0.3",
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "node_modules/browserify-cipher": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
+      "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
+      "dev": true,
+      "dependencies": {
+        "browserify-aes": "^1.0.4",
+        "browserify-des": "^1.0.0",
+        "evp_bytestokey": "^1.0.0"
+      }
+    },
+    "node_modules/browserify-des": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
+      "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
+      "dev": true,
+      "dependencies": {
+        "cipher-base": "^1.0.1",
+        "des.js": "^1.0.0",
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.1.2"
+      }
+    },
+    "node_modules/browserify-rsa": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz",
+      "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==",
+      "dev": true,
+      "dependencies": {
+        "bn.js": "^5.0.0",
+        "randombytes": "^2.0.1"
+      }
+    },
+    "node_modules/browserify-sign": {
+      "version": "4.2.3",
+      "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.3.tgz",
+      "integrity": "sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==",
+      "dev": true,
+      "dependencies": {
+        "bn.js": "^5.2.1",
+        "browserify-rsa": "^4.1.0",
+        "create-hash": "^1.2.0",
+        "create-hmac": "^1.1.7",
+        "elliptic": "^6.5.5",
+        "hash-base": "~3.0",
+        "inherits": "^2.0.4",
+        "parse-asn1": "^5.1.7",
+        "readable-stream": "^2.3.8",
+        "safe-buffer": "^5.2.1"
+      },
+      "engines": {
+        "node": ">= 0.12"
+      }
+    },
+    "node_modules/browserify-sign/node_modules/readable-stream": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+      "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+      "dev": true,
+      "dependencies": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      }
+    },
+    "node_modules/browserify-sign/node_modules/readable-stream/node_modules/safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+      "dev": true
+    },
+    "node_modules/browserify-sign/node_modules/string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "dev": true,
+      "dependencies": {
+        "safe-buffer": "~5.1.0"
+      }
+    },
+    "node_modules/browserify-sign/node_modules/string_decoder/node_modules/safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+      "dev": true
+    },
+    "node_modules/browserify-zlib": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
+      "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
+      "dev": true,
+      "dependencies": {
+        "pako": "~1.0.5"
+      }
+    },
+    "node_modules/buffer": {
+      "version": "5.7.1",
+      "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+      "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "dependencies": {
+        "base64-js": "^1.3.1",
+        "ieee754": "^1.1.13"
+      }
+    },
+    "node_modules/buffer-xor": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
+      "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==",
+      "dev": true
+    },
+    "node_modules/builtin-status-codes": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
+      "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==",
+      "dev": true
+    },
+    "node_modules/bytes": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+      "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/call-bind": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
+      "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
+      "dependencies": {
+        "es-define-property": "^1.0.0",
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2",
+        "get-intrinsic": "^1.2.4",
+        "set-function-length": "^1.2.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/canvas": {
+      "version": "2.11.2",
+      "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.11.2.tgz",
+      "integrity": "sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==",
+      "hasInstallScript": true,
+      "dependencies": {
+        "@mapbox/node-pre-gyp": "^1.0.0",
+        "nan": "^2.17.0",
+        "simple-get": "^3.0.3"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/caseless": {
+      "version": "0.12.0",
+      "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+      "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw=="
+    },
+    "node_modules/chalk": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+      "dependencies": {
+        "ansi-styles": "^3.2.1",
+        "escape-string-regexp": "^1.0.5",
+        "supports-color": "^5.3.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/charenc": {
+      "version": "0.0.2",
+      "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz",
+      "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==",
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/chownr": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+      "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/cipher-base": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
+      "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
+      "dev": true,
+      "dependencies": {
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "node_modules/clone": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+      "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==",
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/clone-buffer": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz",
+      "integrity": "sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==",
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/clone-stats": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
+      "integrity": "sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag=="
+    },
+    "node_modules/cloneable-readable": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz",
+      "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==",
+      "dependencies": {
+        "inherits": "^2.0.1",
+        "process-nextick-args": "^2.0.0",
+        "readable-stream": "^2.3.5"
+      }
+    },
+    "node_modules/cloneable-readable/node_modules/readable-stream": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+      "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+      "dependencies": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      }
+    },
+    "node_modules/cloneable-readable/node_modules/safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+    },
+    "node_modules/cloneable-readable/node_modules/string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "dependencies": {
+        "safe-buffer": "~5.1.0"
+      }
+    },
+    "node_modules/color-convert": {
+      "version": "1.9.3",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+      "dependencies": {
+        "color-name": "1.1.3"
+      }
+    },
+    "node_modules/color-name": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+      "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
+    },
+    "node_modules/color-support": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
+      "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
+      "bin": {
+        "color-support": "bin.js"
+      }
+    },
+    "node_modules/colors": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+      "integrity": "sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==",
+      "engines": {
+        "node": ">=0.1.90"
+      }
+    },
+    "node_modules/combined-stream": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+      "dependencies": {
+        "delayed-stream": "~1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
+    },
+    "node_modules/console-browserify": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz",
+      "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==",
+      "dev": true
+    },
+    "node_modules/console-control-strings": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
+      "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ=="
+    },
+    "node_modules/constants-browserify": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
+      "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==",
+      "dev": true
+    },
+    "node_modules/content-disposition": {
+      "version": "0.5.4",
+      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
+      "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
+      "dependencies": {
+        "safe-buffer": "5.2.1"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/content-type": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+      "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/cookie": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz",
+      "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/cookie-signature": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+      "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
+    },
+    "node_modules/core-util-is": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+      "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="
+    },
+    "node_modules/corser": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz",
+      "integrity": "sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==",
+      "engines": {
+        "node": ">= 0.4.0"
+      }
+    },
+    "node_modules/create-ecdh": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz",
+      "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==",
+      "dev": true,
+      "dependencies": {
+        "bn.js": "^4.1.0",
+        "elliptic": "^6.5.3"
+      }
+    },
+    "node_modules/create-ecdh/node_modules/bn.js": {
+      "version": "4.12.0",
+      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+      "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+      "dev": true
+    },
+    "node_modules/create-hash": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
+      "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
+      "dev": true,
+      "dependencies": {
+        "cipher-base": "^1.0.1",
+        "inherits": "^2.0.1",
+        "md5.js": "^1.3.4",
+        "ripemd160": "^2.0.1",
+        "sha.js": "^2.4.0"
+      }
+    },
+    "node_modules/create-hmac": {
+      "version": "1.1.7",
+      "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
+      "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
+      "dev": true,
+      "dependencies": {
+        "cipher-base": "^1.0.3",
+        "create-hash": "^1.1.0",
+        "inherits": "^2.0.1",
+        "ripemd160": "^2.0.0",
+        "safe-buffer": "^5.0.1",
+        "sha.js": "^2.4.8"
+      }
+    },
+    "node_modules/create-require": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
+      "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
+      "dev": true
+    },
+    "node_modules/crypt": {
+      "version": "0.0.2",
+      "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz",
+      "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==",
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/crypto-browserify": {
+      "version": "3.12.0",
+      "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
+      "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
+      "dev": true,
+      "dependencies": {
+        "browserify-cipher": "^1.0.0",
+        "browserify-sign": "^4.0.0",
+        "create-ecdh": "^4.0.0",
+        "create-hash": "^1.1.0",
+        "create-hmac": "^1.1.0",
+        "diffie-hellman": "^5.0.0",
+        "inherits": "^2.0.1",
+        "pbkdf2": "^3.0.3",
+        "public-encrypt": "^4.0.0",
+        "randombytes": "^2.0.0",
+        "randomfill": "^1.0.3"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/cssstyle": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.0.1.tgz",
+      "integrity": "sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==",
+      "dependencies": {
+        "rrweb-cssom": "^0.6.0"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/cssstyle/node_modules/rrweb-cssom": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz",
+      "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw=="
+    },
+    "node_modules/dashdash": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+      "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
+      "dependencies": {
+        "assert-plus": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10"
+      }
+    },
+    "node_modules/data-urls": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz",
+      "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==",
+      "dependencies": {
+        "whatwg-mimetype": "^4.0.0",
+        "whatwg-url": "^14.0.0"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/debug": {
+      "version": "4.3.6",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz",
+      "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==",
+      "dependencies": {
+        "ms": "2.1.2"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/decimal.js": {
+      "version": "10.4.3",
+      "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz",
+      "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA=="
+    },
+    "node_modules/decompress-response": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz",
+      "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==",
+      "dependencies": {
+        "mimic-response": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/define-data-property": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+      "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+      "dependencies": {
+        "es-define-property": "^1.0.0",
+        "es-errors": "^1.3.0",
+        "gopd": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/define-properties": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
+      "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
+      "dev": true,
+      "dependencies": {
+        "define-data-property": "^1.0.1",
+        "has-property-descriptors": "^1.0.0",
+        "object-keys": "^1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/delayed-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/delegates": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
+      "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ=="
+    },
+    "node_modules/depd": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+      "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/des.js": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz",
+      "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==",
+      "dev": true,
+      "dependencies": {
+        "inherits": "^2.0.1",
+        "minimalistic-assert": "^1.0.0"
+      }
+    },
+    "node_modules/destroy": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
+      "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
+      "engines": {
+        "node": ">= 0.8",
+        "npm": "1.2.8000 || >= 1.4.16"
+      }
+    },
+    "node_modules/detect-libc": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz",
+      "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/diffie-hellman": {
+      "version": "5.0.3",
+      "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
+      "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
+      "dev": true,
+      "dependencies": {
+        "bn.js": "^4.1.0",
+        "miller-rabin": "^4.0.0",
+        "randombytes": "^2.0.0"
+      }
+    },
+    "node_modules/diffie-hellman/node_modules/bn.js": {
+      "version": "4.12.0",
+      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+      "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+      "dev": true
+    },
+    "node_modules/domain-browser": {
+      "version": "4.23.0",
+      "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.23.0.tgz",
+      "integrity": "sha512-ArzcM/II1wCCujdCNyQjXrAFwS4mrLh4C7DZWlaI8mdh7h3BfKdNd3bKXITfl2PT9FtfQqaGvhi1vPRQPimjGA==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://bevry.me/fund"
+      }
+    },
+    "node_modules/dotenv": {
+      "version": "6.2.0",
+      "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-6.2.0.tgz",
+      "integrity": "sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/ecc-jsbn": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+      "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
+      "dependencies": {
+        "jsbn": "~0.1.0",
+        "safer-buffer": "^2.1.0"
+      }
+    },
+    "node_modules/ecstatic": {
+      "version": "3.3.2",
+      "resolved": "https://registry.npmjs.org/ecstatic/-/ecstatic-3.3.2.tgz",
+      "integrity": "sha512-fLf9l1hnwrHI2xn9mEDT7KIi22UDqA2jaCwyCbSUJh9a1V+LEUSL/JO/6TIz/QyuBURWUHrFL5Kg2TtO1bkkog==",
+      "deprecated": "This package is unmaintained and deprecated. See the GH Issue 259.",
+      "dependencies": {
+        "he": "^1.1.1",
+        "mime": "^1.6.0",
+        "minimist": "^1.1.0",
+        "url-join": "^2.0.5"
+      },
+      "bin": {
+        "ecstatic": "lib/ecstatic.js"
+      }
+    },
+    "node_modules/ee-first": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+      "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
+    },
+    "node_modules/elliptic": {
+      "version": "6.5.7",
+      "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.7.tgz",
+      "integrity": "sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==",
+      "dev": true,
+      "dependencies": {
+        "bn.js": "^4.11.9",
+        "brorand": "^1.1.0",
+        "hash.js": "^1.0.0",
+        "hmac-drbg": "^1.0.1",
+        "inherits": "^2.0.4",
+        "minimalistic-assert": "^1.0.1",
+        "minimalistic-crypto-utils": "^1.0.1"
+      }
+    },
+    "node_modules/elliptic/node_modules/bn.js": {
+      "version": "4.12.0",
+      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+      "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+      "dev": true
+    },
+    "node_modules/emoji-regex": {
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+    },
+    "node_modules/encodeurl": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+      "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/entities": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+      "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+      "engines": {
+        "node": ">=0.12"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/entities?sponsor=1"
+      }
+    },
+    "node_modules/es-define-property": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
+      "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
+      "dependencies": {
+        "get-intrinsic": "^1.2.4"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-errors": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+      "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/esbuild": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
+      "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
+      "dev": true,
+      "hasInstallScript": true,
+      "bin": {
+        "esbuild": "bin/esbuild"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "optionalDependencies": {
+        "@esbuild/aix-ppc64": "0.21.5",
+        "@esbuild/android-arm": "0.21.5",
+        "@esbuild/android-arm64": "0.21.5",
+        "@esbuild/android-x64": "0.21.5",
+        "@esbuild/darwin-arm64": "0.21.5",
+        "@esbuild/darwin-x64": "0.21.5",
+        "@esbuild/freebsd-arm64": "0.21.5",
+        "@esbuild/freebsd-x64": "0.21.5",
+        "@esbuild/linux-arm": "0.21.5",
+        "@esbuild/linux-arm64": "0.21.5",
+        "@esbuild/linux-ia32": "0.21.5",
+        "@esbuild/linux-loong64": "0.21.5",
+        "@esbuild/linux-mips64el": "0.21.5",
+        "@esbuild/linux-ppc64": "0.21.5",
+        "@esbuild/linux-riscv64": "0.21.5",
+        "@esbuild/linux-s390x": "0.21.5",
+        "@esbuild/linux-x64": "0.21.5",
+        "@esbuild/netbsd-x64": "0.21.5",
+        "@esbuild/openbsd-x64": "0.21.5",
+        "@esbuild/sunos-x64": "0.21.5",
+        "@esbuild/win32-arm64": "0.21.5",
+        "@esbuild/win32-ia32": "0.21.5",
+        "@esbuild/win32-x64": "0.21.5"
+      }
+    },
+    "node_modules/escape-html": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+      "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
+    },
+    "node_modules/escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+      "engines": {
+        "node": ">=0.8.0"
+      }
+    },
+    "node_modules/estree-walker": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+      "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+      "dev": true
+    },
+    "node_modules/etag": {
+      "version": "1.8.1",
+      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+      "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/eve-raphael": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/eve-raphael/-/eve-raphael-0.5.0.tgz",
+      "integrity": "sha512-jrxnPsCGqng1UZuEp9DecX/AuSyAszATSjf4oEcRxvfxa1Oux4KkIPKBAAWWnpdwfARtr+Q0o9aPYWjsROD7ug=="
+    },
+    "node_modules/eventemitter3": {
+      "version": "4.0.7",
+      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
+      "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="
+    },
+    "node_modules/events": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+      "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.8.x"
+      }
+    },
+    "node_modules/evp_bytestokey": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
+      "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
+      "dev": true,
+      "dependencies": {
+        "md5.js": "^1.3.4",
+        "safe-buffer": "^5.1.1"
+      }
+    },
+    "node_modules/express": {
+      "version": "4.19.2",
+      "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz",
+      "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==",
+      "dependencies": {
+        "accepts": "~1.3.8",
+        "array-flatten": "1.1.1",
+        "body-parser": "1.20.2",
+        "content-disposition": "0.5.4",
+        "content-type": "~1.0.4",
+        "cookie": "0.6.0",
+        "cookie-signature": "1.0.6",
+        "debug": "2.6.9",
+        "depd": "2.0.0",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "etag": "~1.8.1",
+        "finalhandler": "1.2.0",
+        "fresh": "0.5.2",
+        "http-errors": "2.0.0",
+        "merge-descriptors": "1.0.1",
+        "methods": "~1.1.2",
+        "on-finished": "2.4.1",
+        "parseurl": "~1.3.3",
+        "path-to-regexp": "0.1.7",
+        "proxy-addr": "~2.0.7",
+        "qs": "6.11.0",
+        "range-parser": "~1.2.1",
+        "safe-buffer": "5.2.1",
+        "send": "0.18.0",
+        "serve-static": "1.15.0",
+        "setprototypeof": "1.2.0",
+        "statuses": "2.0.1",
+        "type-is": "~1.6.18",
+        "utils-merge": "1.0.1",
+        "vary": "~1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.10.0"
+      }
+    },
+    "node_modules/express/node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/express/node_modules/ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+    },
+    "node_modules/express/node_modules/qs": {
+      "version": "6.11.0",
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
+      "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
+      "dependencies": {
+        "side-channel": "^1.0.4"
+      },
+      "engines": {
+        "node": ">=0.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/extend": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
+    },
+    "node_modules/extsprintf": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+      "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
+      "engines": [
+        "node >=0.6.0"
+      ]
+    },
+    "node_modules/fast-deep-equal": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+    },
+    "node_modules/fast-json-stable-stringify": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
+    },
+    "node_modules/finalhandler": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
+      "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
+      "dependencies": {
+        "debug": "2.6.9",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "on-finished": "2.4.1",
+        "parseurl": "~1.3.3",
+        "statuses": "2.0.1",
+        "unpipe": "~1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/finalhandler/node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/finalhandler/node_modules/ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+    },
+    "node_modules/find-up": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+      "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+      "dev": true,
+      "dependencies": {
+        "locate-path": "^6.0.0",
+        "path-exists": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/follow-redirects": {
+      "version": "1.15.6",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
+      "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
+      "funding": [
+        {
+          "type": "individual",
+          "url": "https://github.com/sponsors/RubenVerborgh"
+        }
+      ],
+      "engines": {
+        "node": ">=4.0"
+      },
+      "peerDependenciesMeta": {
+        "debug": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/for-each": {
+      "version": "0.3.3",
+      "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
+      "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
+      "dev": true,
+      "dependencies": {
+        "is-callable": "^1.1.3"
+      }
+    },
+    "node_modules/forever-agent": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+      "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==",
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/form-data": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+      "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+      "dependencies": {
+        "asynckit": "^0.4.0",
+        "combined-stream": "^1.0.8",
+        "mime-types": "^2.1.12"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/forwarded": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
+      "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/fresh": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+      "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/fs-minipass": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
+      "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
+      "dependencies": {
+        "minipass": "^3.0.0"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/fs-minipass/node_modules/minipass": {
+      "version": "3.3.6",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+      "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+      "dependencies": {
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/fs.realpath": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
+    },
+    "node_modules/fsevents": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+      "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+      "dev": true,
+      "hasInstallScript": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+      }
+    },
+    "node_modules/function-bind": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/gauge": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz",
+      "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==",
+      "deprecated": "This package is no longer supported.",
+      "dependencies": {
+        "aproba": "^1.0.3 || ^2.0.0",
+        "color-support": "^1.1.2",
+        "console-control-strings": "^1.0.0",
+        "has-unicode": "^2.0.1",
+        "object-assign": "^4.1.1",
+        "signal-exit": "^3.0.0",
+        "string-width": "^4.2.3",
+        "strip-ansi": "^6.0.1",
+        "wide-align": "^1.1.2"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/get-intrinsic": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
+      "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2",
+        "has-proto": "^1.0.1",
+        "has-symbols": "^1.0.3",
+        "hasown": "^2.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/getpass": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+      "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
+      "dependencies": {
+        "assert-plus": "^1.0.0"
+      }
+    },
+    "node_modules/glob": {
+      "version": "7.2.3",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+      "deprecated": "Glob versions prior to v9 are no longer supported",
+      "dependencies": {
+        "fs.realpath": "^1.0.0",
+        "inflight": "^1.0.4",
+        "inherits": "2",
+        "minimatch": "^3.1.1",
+        "once": "^1.3.0",
+        "path-is-absolute": "^1.0.0"
+      },
+      "engines": {
+        "node": "*"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/google-closure-compiler": {
+      "version": "20191027.0.0",
+      "resolved": "https://registry.npmjs.org/google-closure-compiler/-/google-closure-compiler-20191027.0.0.tgz",
+      "integrity": "sha512-W8MVm/fUg6pPVDHbkP2R8HmeLXNVkjhQHwFpikAhRnF8znhjn7e78V+VXYUiOnjBwDGP1/We1sGk4QGMYY2UfA==",
+      "dependencies": {
+        "chalk": "2.x",
+        "google-closure-compiler-java": "^20191027.0.0",
+        "google-closure-compiler-js": "^20191027.0.0",
+        "minimist": "1.x",
+        "vinyl": "2.x",
+        "vinyl-sourcemaps-apply": "^0.2.0"
+      },
+      "bin": {
+        "google-closure-compiler": "cli.js"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "optionalDependencies": {
+        "google-closure-compiler-linux": "^20191027.0.0",
+        "google-closure-compiler-osx": "^20191027.0.0",
+        "google-closure-compiler-windows": "^20191027.0.0"
+      }
+    },
+    "node_modules/google-closure-compiler-java": {
+      "version": "20191027.0.0",
+      "resolved": "https://registry.npmjs.org/google-closure-compiler-java/-/google-closure-compiler-java-20191027.0.0.tgz",
+      "integrity": "sha512-3C0bRnXOp9yYbb6Qm0FqWm53xDmuRRB90tAA57rYzpreZg96Kxz2moVGcoYBh4jFlBkLIywHjV+AWYMaXA3lSQ=="
+    },
+    "node_modules/google-closure-compiler-js": {
+      "version": "20191027.0.0",
+      "resolved": "https://registry.npmjs.org/google-closure-compiler-js/-/google-closure-compiler-js-20191027.0.0.tgz",
+      "integrity": "sha512-D3UHBQ0fbPl3VZ2BDK4OWfqDzp/q1FywwEQBbC2qrEKa6Q1wYJRSSY21z+xwscQ1qyPHZjdqIIPXTBrnJvP0WQ=="
+    },
+    "node_modules/google-closure-compiler-linux": {
+      "version": "20191027.0.0",
+      "resolved": "https://registry.npmjs.org/google-closure-compiler-linux/-/google-closure-compiler-linux-20191027.0.0.tgz",
+      "integrity": "sha512-zWg+3UdqhsFOkP895azl9ioFOx+JZVFHdETZwhO59PA+zTNTulZqDCX6wqq8YFRoO3HKvYfedUp7Cp+jdaELnA==",
+      "cpu": [
+        "x64",
+        "x86"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/google-closure-compiler-osx": {
+      "version": "20191027.0.0",
+      "resolved": "https://registry.npmjs.org/google-closure-compiler-osx/-/google-closure-compiler-osx-20191027.0.0.tgz",
+      "integrity": "sha512-Ko/+43oeMD8u6MhKMGPhx61B5e2lR5+C9pzlhnibQwuXuDVcp2ruFbblhWBXiT2FrStTX65SZzFvza0bRVYikA==",
+      "cpu": [
+        "x64",
+        "x86"
+      ],
+      "optional": true,
+      "os": [
+        "darwin"
+      ]
+    },
+    "node_modules/google-closure-compiler-windows": {
+      "version": "20191027.0.0",
+      "resolved": "https://registry.npmjs.org/google-closure-compiler-windows/-/google-closure-compiler-windows-20191027.0.0.tgz",
+      "integrity": "sha512-kAzGFGaeAL9qsieotjb5qq5SsYD2Vwtl7aCeIVUnzWyNfhz7WZCmAMSGwGdtaShfM+4uzOwG1mahtPWasTaBxg==",
+      "cpu": [
+        "x64",
+        "x86"
+      ],
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/gopd": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
+      "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+      "dependencies": {
+        "get-intrinsic": "^1.1.3"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/har-schema": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+      "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/har-validator": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
+      "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
+      "deprecated": "this library is no longer supported",
+      "dependencies": {
+        "ajv": "^6.12.3",
+        "har-schema": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/has-flag": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+      "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/has-property-descriptors": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+      "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+      "dependencies": {
+        "es-define-property": "^1.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-proto": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
+      "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-symbols": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+      "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-tostringtag": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+      "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+      "dev": true,
+      "dependencies": {
+        "has-symbols": "^1.0.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-unicode": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
+      "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ=="
+    },
+    "node_modules/hash-base": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz",
+      "integrity": "sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==",
+      "dev": true,
+      "dependencies": {
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/hash.js": {
+      "version": "1.1.7",
+      "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
+      "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
+      "dev": true,
+      "dependencies": {
+        "inherits": "^2.0.3",
+        "minimalistic-assert": "^1.0.1"
+      }
+    },
+    "node_modules/hasown": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+      "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+      "dependencies": {
+        "function-bind": "^1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/he": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+      "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+      "bin": {
+        "he": "bin/he"
+      }
+    },
+    "node_modules/hmac-drbg": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
+      "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==",
+      "dev": true,
+      "dependencies": {
+        "hash.js": "^1.0.3",
+        "minimalistic-assert": "^1.0.0",
+        "minimalistic-crypto-utils": "^1.0.1"
+      }
+    },
+    "node_modules/html-encoding-sniffer": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz",
+      "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==",
+      "dependencies": {
+        "whatwg-encoding": "^3.1.1"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/http-errors": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
+      "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
+      "dependencies": {
+        "depd": "2.0.0",
+        "inherits": "2.0.4",
+        "setprototypeof": "1.2.0",
+        "statuses": "2.0.1",
+        "toidentifier": "1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/http-proxy": {
+      "version": "1.18.1",
+      "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
+      "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
+      "dependencies": {
+        "eventemitter3": "^4.0.0",
+        "follow-redirects": "^1.0.0",
+        "requires-port": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=8.0.0"
+      }
+    },
+    "node_modules/http-proxy-agent": {
+      "version": "7.0.2",
+      "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
+      "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
+      "dependencies": {
+        "agent-base": "^7.1.0",
+        "debug": "^4.3.4"
+      },
+      "engines": {
+        "node": ">= 14"
+      }
+    },
+    "node_modules/http-proxy-agent/node_modules/agent-base": {
+      "version": "7.1.1",
+      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz",
+      "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==",
+      "dependencies": {
+        "debug": "^4.3.4"
+      },
+      "engines": {
+        "node": ">= 14"
+      }
+    },
+    "node_modules/http-server": {
+      "version": "0.11.2",
+      "resolved": "https://registry.npmjs.org/http-server/-/http-server-0.11.2.tgz",
+      "integrity": "sha512-Gp1ka7W4MLjFz8CLhFmUWa+uIf7cq93O4DZv8X0ZmNS1L4P2dbMkmlBeYhb0hGaI3M0Y1xM4waWgnIf/5Hp7dQ==",
+      "dependencies": {
+        "colors": "1.0.3",
+        "corser": "~2.0.0",
+        "ecstatic": "^3.0.0",
+        "http-proxy": "^1.8.1",
+        "opener": "~1.4.0",
+        "optimist": "0.6.x",
+        "portfinder": "^1.0.13",
+        "union": "^0.5.0"
+      },
+      "bin": {
+        "hs": "bin/http-server",
+        "http-server": "bin/http-server"
+      }
+    },
+    "node_modules/http-signature": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+      "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==",
+      "dependencies": {
+        "assert-plus": "^1.0.0",
+        "jsprim": "^1.2.2",
+        "sshpk": "^1.7.0"
+      },
+      "engines": {
+        "node": ">=0.8",
+        "npm": ">=1.3.7"
+      }
+    },
+    "node_modules/https-browserify": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
+      "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==",
+      "dev": true
+    },
+    "node_modules/https-proxy-agent": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+      "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+      "dependencies": {
+        "agent-base": "6",
+        "debug": "4"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/iconv-lite": {
+      "version": "0.6.3",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+      "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+      "dependencies": {
+        "safer-buffer": ">= 2.1.2 < 3.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/ieee754": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+      "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ]
+    },
+    "node_modules/inflight": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+      "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+      "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
+      "dependencies": {
+        "once": "^1.3.0",
+        "wrappy": "1"
+      }
+    },
+    "node_modules/inherits": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+    },
+    "node_modules/ipaddr.js": {
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+      "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/is-arguments": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz",
+      "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "has-tostringtag": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-callable": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
+      "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-core-module": {
+      "version": "2.15.1",
+      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz",
+      "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==",
+      "dev": true,
+      "dependencies": {
+        "hasown": "^2.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-fullwidth-code-point": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/is-generator-function": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz",
+      "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==",
+      "dev": true,
+      "dependencies": {
+        "has-tostringtag": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-nan": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz",
+      "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.0",
+        "define-properties": "^1.1.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-potential-custom-element-name": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
+      "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ=="
+    },
+    "node_modules/is-typed-array": {
+      "version": "1.1.13",
+      "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz",
+      "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==",
+      "dev": true,
+      "dependencies": {
+        "which-typed-array": "^1.1.14"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-typedarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+      "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="
+    },
+    "node_modules/isarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+      "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
+    },
+    "node_modules/isomorphic-timers-promises": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/isomorphic-timers-promises/-/isomorphic-timers-promises-1.0.1.tgz",
+      "integrity": "sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/isstream": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+      "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g=="
+    },
+    "node_modules/jquery": {
+      "version": "3.7.1",
+      "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz",
+      "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg=="
+    },
+    "node_modules/jquery-ui": {
+      "version": "1.14.0",
+      "resolved": "https://registry.npmjs.org/jquery-ui/-/jquery-ui-1.14.0.tgz",
+      "integrity": "sha512-mPfYKBoRCf0MzaT2cyW5i3IuZ7PfTITaasO5OFLAQxrHuI+ZxruPa+4/K1OMNT8oElLWGtIxc9aRbyw20BKr8g==",
+      "dependencies": {
+        "jquery": ">=1.12.0 <5.0.0"
+      }
+    },
+    "node_modules/jsbn": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+      "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg=="
+    },
+    "node_modules/jsdom": {
+      "version": "24.1.1",
+      "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-24.1.1.tgz",
+      "integrity": "sha512-5O1wWV99Jhq4DV7rCLIoZ/UIhyQeDR7wHVyZAHAshbrvZsLs+Xzz7gtwnlJTJDjleiTKh54F4dXrX70vJQTyJQ==",
+      "dependencies": {
+        "cssstyle": "^4.0.1",
+        "data-urls": "^5.0.0",
+        "decimal.js": "^10.4.3",
+        "form-data": "^4.0.0",
+        "html-encoding-sniffer": "^4.0.0",
+        "http-proxy-agent": "^7.0.2",
+        "https-proxy-agent": "^7.0.5",
+        "is-potential-custom-element-name": "^1.0.1",
+        "nwsapi": "^2.2.12",
+        "parse5": "^7.1.2",
+        "rrweb-cssom": "^0.7.1",
+        "saxes": "^6.0.0",
+        "symbol-tree": "^3.2.4",
+        "tough-cookie": "^4.1.4",
+        "w3c-xmlserializer": "^5.0.0",
+        "webidl-conversions": "^7.0.0",
+        "whatwg-encoding": "^3.1.1",
+        "whatwg-mimetype": "^4.0.0",
+        "whatwg-url": "^14.0.0",
+        "ws": "^8.18.0",
+        "xml-name-validator": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "peerDependencies": {
+        "canvas": "^2.11.2"
+      },
+      "peerDependenciesMeta": {
+        "canvas": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/jsdom/node_modules/agent-base": {
+      "version": "7.1.1",
+      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz",
+      "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==",
+      "dependencies": {
+        "debug": "^4.3.4"
+      },
+      "engines": {
+        "node": ">= 14"
+      }
+    },
+    "node_modules/jsdom/node_modules/https-proxy-agent": {
+      "version": "7.0.5",
+      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz",
+      "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==",
+      "dependencies": {
+        "agent-base": "^7.0.2",
+        "debug": "4"
+      },
+      "engines": {
+        "node": ">= 14"
+      }
+    },
+    "node_modules/json-schema": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
+      "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="
+    },
+    "node_modules/json-schema-traverse": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+    },
+    "node_modules/json-stringify-safe": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+      "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="
+    },
+    "node_modules/jsprim": {
+      "version": "1.4.2",
+      "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
+      "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
+      "dependencies": {
+        "assert-plus": "1.0.0",
+        "extsprintf": "1.3.0",
+        "json-schema": "0.4.0",
+        "verror": "1.10.0"
+      },
+      "engines": {
+        "node": ">=0.6.0"
+      }
+    },
+    "node_modules/jwplayer": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/jwplayer/-/jwplayer-1.0.3.tgz",
+      "integrity": "sha512-FkogyQxpDrO8sCXGjDNGq2WRQaq6RLqkljbOEDO77hA01gXEUQdoPYw3E5SB5+olvnJqQ9E1YfyKZGmmt2opWA==",
+      "dependencies": {
+        "php2js": "^1.0.0",
+        "request": "^2.67.0",
+        "sha1": "^1.1.1"
+      }
+    },
+    "node_modules/locate-path": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+      "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+      "dev": true,
+      "dependencies": {
+        "p-locate": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/lodash": {
+      "version": "4.17.21",
+      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+    },
+    "node_modules/magic-string": {
+      "version": "0.30.11",
+      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz",
+      "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==",
+      "dev": true,
+      "dependencies": {
+        "@jridgewell/sourcemap-codec": "^1.5.0"
+      }
+    },
+    "node_modules/make-dir": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+      "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+      "dependencies": {
+        "semver": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/make-dir/node_modules/semver": {
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+      "bin": {
+        "semver": "bin/semver.js"
+      }
+    },
+    "node_modules/md5.js": {
+      "version": "1.3.5",
+      "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
+      "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
+      "dev": true,
+      "dependencies": {
+        "hash-base": "^3.0.0",
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.1.2"
+      }
+    },
+    "node_modules/media-typer": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+      "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/merge-descriptors": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+      "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
+    },
+    "node_modules/methods": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+      "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/miller-rabin": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
+      "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
+      "dev": true,
+      "dependencies": {
+        "bn.js": "^4.0.0",
+        "brorand": "^1.0.1"
+      },
+      "bin": {
+        "miller-rabin": "bin/miller-rabin"
+      }
+    },
+    "node_modules/miller-rabin/node_modules/bn.js": {
+      "version": "4.12.0",
+      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+      "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+      "dev": true
+    },
+    "node_modules/mime": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+      "bin": {
+        "mime": "cli.js"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/mime-db": {
+      "version": "1.52.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/mime-types": {
+      "version": "2.1.35",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+      "dependencies": {
+        "mime-db": "1.52.0"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/mimic-response": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz",
+      "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==",
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/minimalistic-assert": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+      "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
+      "dev": true
+    },
+    "node_modules/minimalistic-crypto-utils": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
+      "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==",
+      "dev": true
+    },
+    "node_modules/minimatch": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+      "dependencies": {
+        "brace-expansion": "^1.1.7"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/minimist": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+      "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/minipass": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
+      "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/minizlib": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
+      "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
+      "dependencies": {
+        "minipass": "^3.0.0",
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/minizlib/node_modules/minipass": {
+      "version": "3.3.6",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+      "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+      "dependencies": {
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/mkdirp": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+      "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+      "bin": {
+        "mkdirp": "bin/cmd.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/mousetrap": {
+      "version": "1.6.5",
+      "resolved": "https://registry.npmjs.org/mousetrap/-/mousetrap-1.6.5.tgz",
+      "integrity": "sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA=="
+    },
+    "node_modules/mousetrap-global-bind": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/mousetrap-global-bind/-/mousetrap-global-bind-1.1.0.tgz",
+      "integrity": "sha512-AfxKB0OYc/wU66E2n2HXcZmKHrd5O/6mEdtSrZAt3tsMqcpcpYAolQdj602L0SgrP38ncm/6iOpxr9SIGgxOpQ==",
+      "peerDependencies": {
+        "mousetrap": "^1.6.0"
+      }
+    },
+    "node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+    },
+    "node_modules/mustache": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz",
+      "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==",
+      "bin": {
+        "mustache": "bin/mustache"
+      }
+    },
+    "node_modules/nan": {
+      "version": "2.20.0",
+      "resolved": "https://registry.npmjs.org/nan/-/nan-2.20.0.tgz",
+      "integrity": "sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw=="
+    },
+    "node_modules/nanoid": {
+      "version": "3.3.7",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
+      "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "bin": {
+        "nanoid": "bin/nanoid.cjs"
+      },
+      "engines": {
+        "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+      }
+    },
+    "node_modules/negotiator": {
+      "version": "0.6.3",
+      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
+      "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/node-fetch": {
+      "version": "2.7.0",
+      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
+      "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
+      "dependencies": {
+        "whatwg-url": "^5.0.0"
+      },
+      "engines": {
+        "node": "4.x || >=6.0.0"
+      },
+      "peerDependencies": {
+        "encoding": "^0.1.0"
+      },
+      "peerDependenciesMeta": {
+        "encoding": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/node-fetch/node_modules/tr46": {
+      "version": "0.0.3",
+      "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+      "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
+    },
+    "node_modules/node-fetch/node_modules/webidl-conversions": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+      "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
+    },
+    "node_modules/node-fetch/node_modules/whatwg-url": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+      "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+      "dependencies": {
+        "tr46": "~0.0.3",
+        "webidl-conversions": "^3.0.0"
+      }
+    },
+    "node_modules/node-stdlib-browser": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/node-stdlib-browser/-/node-stdlib-browser-1.2.0.tgz",
+      "integrity": "sha512-VSjFxUhRhkyed8AtLwSCkMrJRfQ3e2lGtG3sP6FEgaLKBBbxM/dLfjRe1+iLhjvyLFW3tBQ8+c0pcOtXGbAZJg==",
+      "dev": true,
+      "dependencies": {
+        "assert": "^2.0.0",
+        "browser-resolve": "^2.0.0",
+        "browserify-zlib": "^0.2.0",
+        "buffer": "^5.7.1",
+        "console-browserify": "^1.1.0",
+        "constants-browserify": "^1.0.0",
+        "create-require": "^1.1.1",
+        "crypto-browserify": "^3.11.0",
+        "domain-browser": "^4.22.0",
+        "events": "^3.0.0",
+        "https-browserify": "^1.0.0",
+        "isomorphic-timers-promises": "^1.0.1",
+        "os-browserify": "^0.3.0",
+        "path-browserify": "^1.0.1",
+        "pkg-dir": "^5.0.0",
+        "process": "^0.11.10",
+        "punycode": "^1.4.1",
+        "querystring-es3": "^0.2.1",
+        "readable-stream": "^3.6.0",
+        "stream-browserify": "^3.0.0",
+        "stream-http": "^3.2.0",
+        "string_decoder": "^1.0.0",
+        "timers-browserify": "^2.0.4",
+        "tty-browserify": "0.0.1",
+        "url": "^0.11.0",
+        "util": "^0.12.4",
+        "vm-browserify": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/node-stdlib-browser/node_modules/punycode": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+      "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==",
+      "dev": true
+    },
+    "node_modules/nopt": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
+      "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==",
+      "dependencies": {
+        "abbrev": "1"
+      },
+      "bin": {
+        "nopt": "bin/nopt.js"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/npmlog": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz",
+      "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==",
+      "deprecated": "This package is no longer supported.",
+      "dependencies": {
+        "are-we-there-yet": "^2.0.0",
+        "console-control-strings": "^1.1.0",
+        "gauge": "^3.0.0",
+        "set-blocking": "^2.0.0"
+      }
+    },
+    "node_modules/nwsapi": {
+      "version": "2.2.12",
+      "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.12.tgz",
+      "integrity": "sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w=="
+    },
+    "node_modules/oauth-sign": {
+      "version": "0.9.0",
+      "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+      "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/object-assign": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+      "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/object-inspect": {
+      "version": "1.13.2",
+      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz",
+      "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/object-is": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz",
+      "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/object-keys": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/object.assign": {
+      "version": "4.1.5",
+      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz",
+      "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.5",
+        "define-properties": "^1.2.1",
+        "has-symbols": "^1.0.3",
+        "object-keys": "^1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/on-finished": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+      "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+      "dependencies": {
+        "ee-first": "1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+      "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+      "dependencies": {
+        "wrappy": "1"
+      }
+    },
+    "node_modules/opener": {
+      "version": "1.4.3",
+      "resolved": "https://registry.npmjs.org/opener/-/opener-1.4.3.tgz",
+      "integrity": "sha512-4Im9TrPJcjAYyGR5gBe3yZnBzw5n3Bfh1ceHHGNOpMurINKc6RdSIPXMyon4BZacJbJc36lLkhipioGbWh5pwg==",
+      "bin": {
+        "opener": "opener.js"
+      }
+    },
+    "node_modules/optimist": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
+      "integrity": "sha512-snN4O4TkigujZphWLN0E//nQmm7790RYaE53DdL7ZYwee2D8DDo9/EyYiKUfN3rneWUjhJnueija3G9I2i0h3g==",
+      "dependencies": {
+        "minimist": "~0.0.1",
+        "wordwrap": "~0.0.2"
+      }
+    },
+    "node_modules/optimist/node_modules/minimist": {
+      "version": "0.0.10",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
+      "integrity": "sha512-iotkTvxc+TwOm5Ieim8VnSNvCDjCK9S8G3scJ50ZthspSxa7jx50jkhYduuAtAjvfDUwSgOwf8+If99AlOEhyw=="
+    },
+    "node_modules/os-browserify": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
+      "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==",
+      "dev": true
+    },
+    "node_modules/p-limit": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+      "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+      "dev": true,
+      "dependencies": {
+        "yocto-queue": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/p-locate": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+      "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+      "dev": true,
+      "dependencies": {
+        "p-limit": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/pako": {
+      "version": "1.0.11",
+      "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
+      "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
+      "dev": true
+    },
+    "node_modules/paper": {
+      "version": "0.12.18",
+      "resolved": "https://registry.npmjs.org/paper/-/paper-0.12.18.tgz",
+      "integrity": "sha512-ZSLIEejQTJZuYHhSSqAf4jXOnii0kPhCJGAnYAANtdS72aNwXJ9cP95tZHgq1tnNpvEwgQhggy+4OarviqTCGw==",
+      "engines": {
+        "node": ">=8.0.0"
+      }
+    },
+    "node_modules/parse-asn1": {
+      "version": "5.1.7",
+      "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.7.tgz",
+      "integrity": "sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==",
+      "dev": true,
+      "dependencies": {
+        "asn1.js": "^4.10.1",
+        "browserify-aes": "^1.2.0",
+        "evp_bytestokey": "^1.0.3",
+        "hash-base": "~3.0",
+        "pbkdf2": "^3.1.2",
+        "safe-buffer": "^5.2.1"
+      },
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/parse5": {
+      "version": "7.1.2",
+      "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz",
+      "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==",
+      "dependencies": {
+        "entities": "^4.4.0"
+      },
+      "funding": {
+        "url": "https://github.com/inikulin/parse5?sponsor=1"
+      }
+    },
+    "node_modules/parseurl": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+      "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/path-browserify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz",
+      "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==",
+      "dev": true
+    },
+    "node_modules/path-exists": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/path-is-absolute": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/path-parse": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+      "dev": true
+    },
+    "node_modules/path-to-regexp": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+      "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
+    },
+    "node_modules/pbkdf2": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz",
+      "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==",
+      "dev": true,
+      "dependencies": {
+        "create-hash": "^1.1.2",
+        "create-hmac": "^1.1.4",
+        "ripemd160": "^2.0.1",
+        "safe-buffer": "^5.0.1",
+        "sha.js": "^2.4.8"
+      },
+      "engines": {
+        "node": ">=0.12"
+      }
+    },
+    "node_modules/performance-now": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+      "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow=="
+    },
+    "node_modules/php2js": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/php2js/-/php2js-1.0.0.tgz",
+      "integrity": "sha512-BwInN7glz04gg0A4Z5BC9m+okARoI69lupFlkKcNPXG7cxsG5VTA3xkEFg0xoBDfHf92KSmTyuZwgs8NAgxkvg=="
+    },
+    "node_modules/picocolors": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz",
+      "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==",
+      "dev": true
+    },
+    "node_modules/picomatch": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+      "dev": true,
+      "engines": {
+        "node": ">=8.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
+    "node_modules/pkg-dir": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz",
+      "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==",
+      "dev": true,
+      "dependencies": {
+        "find-up": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/popcorn-js": {
+      "version": "1.5.11",
+      "resolved": "git+ssh://git@github.com/menismu/popcorn-js.git#c7af4927ef02042dbf428a048d6d786497c1779e",
+      "license": "MIT",
+      "dependencies": {
+        "dotenv": "^6.2.0",
+        "express": "^4.16.4",
+        "google-closure-compiler": "^20191027.0.0",
+        "http-server": "^0.11.1"
+      }
+    },
+    "node_modules/portfinder": {
+      "version": "1.0.32",
+      "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz",
+      "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==",
+      "dependencies": {
+        "async": "^2.6.4",
+        "debug": "^3.2.7",
+        "mkdirp": "^0.5.6"
+      },
+      "engines": {
+        "node": ">= 0.12.0"
+      }
+    },
+    "node_modules/portfinder/node_modules/debug": {
+      "version": "3.2.7",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+      "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+      "dependencies": {
+        "ms": "^2.1.1"
+      }
+    },
+    "node_modules/portfinder/node_modules/mkdirp": {
+      "version": "0.5.6",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
+      "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+      "dependencies": {
+        "minimist": "^1.2.6"
+      },
+      "bin": {
+        "mkdirp": "bin/cmd.js"
+      }
+    },
+    "node_modules/possible-typed-array-names": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz",
+      "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/postcss": {
+      "version": "8.4.41",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz",
+      "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/postcss/"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/postcss"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "dependencies": {
+        "nanoid": "^3.3.7",
+        "picocolors": "^1.0.1",
+        "source-map-js": "^1.2.0"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >=14"
+      }
+    },
+    "node_modules/process": {
+      "version": "0.11.10",
+      "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+      "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.6.0"
+      }
+    },
+    "node_modules/process-nextick-args": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
+    },
+    "node_modules/processing": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/processing/-/processing-0.2.0.tgz",
+      "integrity": "sha512-DUtC8yW9/MngzzAe98d37tKJjlWWnNjW0r7DT4mKsxKzUYx+7GPf5fS6GtJwrfsn5GCJLvrU9S9T2TxSCekZuA==",
+      "dependencies": {
+        "canvas": "*",
+        "jsdom": "*",
+        "xmlhttprequest": "*"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/proxy-addr": {
+      "version": "2.0.7",
+      "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
+      "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+      "dependencies": {
+        "forwarded": "0.2.0",
+        "ipaddr.js": "1.9.1"
+      },
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/psl": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
+      "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag=="
+    },
+    "node_modules/public-encrypt": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
+      "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
+      "dev": true,
+      "dependencies": {
+        "bn.js": "^4.1.0",
+        "browserify-rsa": "^4.0.0",
+        "create-hash": "^1.1.0",
+        "parse-asn1": "^5.0.0",
+        "randombytes": "^2.0.1",
+        "safe-buffer": "^5.1.2"
+      }
+    },
+    "node_modules/public-encrypt/node_modules/bn.js": {
+      "version": "4.12.0",
+      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+      "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+      "dev": true
+    },
+    "node_modules/punycode": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+      "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/qs": {
+      "version": "6.5.3",
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
+      "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
+      "engines": {
+        "node": ">=0.6"
+      }
+    },
+    "node_modules/querystring-es3": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
+      "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.4.x"
+      }
+    },
+    "node_modules/querystringify": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
+      "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ=="
+    },
+    "node_modules/randombytes": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+      "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+      "dev": true,
+      "dependencies": {
+        "safe-buffer": "^5.1.0"
+      }
+    },
+    "node_modules/randomfill": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
+      "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
+      "dev": true,
+      "dependencies": {
+        "randombytes": "^2.0.5",
+        "safe-buffer": "^5.1.0"
+      }
+    },
+    "node_modules/range-parser": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+      "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/raphael": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/raphael/-/raphael-2.3.0.tgz",
+      "integrity": "sha512-w2yIenZAQnp257XUWGni4bLMVxpUpcIl7qgxEgDIXtmSypYtlNxfXWpOBxs7LBTps5sDwhRnrToJrMUrivqNTQ==",
+      "dependencies": {
+        "eve-raphael": "0.5.0"
+      }
+    },
+    "node_modules/raw-body": {
+      "version": "2.5.2",
+      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
+      "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
+      "dependencies": {
+        "bytes": "3.1.2",
+        "http-errors": "2.0.0",
+        "iconv-lite": "0.4.24",
+        "unpipe": "1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/raw-body/node_modules/iconv-lite": {
+      "version": "0.4.24",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+      "dependencies": {
+        "safer-buffer": ">= 2.1.2 < 3"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/readable-stream": {
+      "version": "3.6.2",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+      "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+      "dependencies": {
+        "inherits": "^2.0.3",
+        "string_decoder": "^1.1.1",
+        "util-deprecate": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/remove-trailing-separator": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
+      "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw=="
+    },
+    "node_modules/replace-ext": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz",
+      "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==",
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/request": {
+      "version": "2.88.2",
+      "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
+      "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
+      "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142",
+      "dependencies": {
+        "aws-sign2": "~0.7.0",
+        "aws4": "^1.8.0",
+        "caseless": "~0.12.0",
+        "combined-stream": "~1.0.6",
+        "extend": "~3.0.2",
+        "forever-agent": "~0.6.1",
+        "form-data": "~2.3.2",
+        "har-validator": "~5.1.3",
+        "http-signature": "~1.2.0",
+        "is-typedarray": "~1.0.0",
+        "isstream": "~0.1.2",
+        "json-stringify-safe": "~5.0.1",
+        "mime-types": "~2.1.19",
+        "oauth-sign": "~0.9.0",
+        "performance-now": "^2.1.0",
+        "qs": "~6.5.2",
+        "safe-buffer": "^5.1.2",
+        "tough-cookie": "~2.5.0",
+        "tunnel-agent": "^0.6.0",
+        "uuid": "^3.3.2"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/request/node_modules/form-data": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+      "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+      "dependencies": {
+        "asynckit": "^0.4.0",
+        "combined-stream": "^1.0.6",
+        "mime-types": "^2.1.12"
+      },
+      "engines": {
+        "node": ">= 0.12"
+      }
+    },
+    "node_modules/request/node_modules/tough-cookie": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+      "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+      "dependencies": {
+        "psl": "^1.1.28",
+        "punycode": "^2.1.1"
+      },
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/requires-port": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+      "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="
+    },
+    "node_modules/resolve": {
+      "version": "1.22.8",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
+      "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
+      "dev": true,
+      "dependencies": {
+        "is-core-module": "^2.13.0",
+        "path-parse": "^1.0.7",
+        "supports-preserve-symlinks-flag": "^1.0.0"
+      },
+      "bin": {
+        "resolve": "bin/resolve"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/rimraf": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+      "deprecated": "Rimraf versions prior to v4 are no longer supported",
+      "dependencies": {
+        "glob": "^7.1.3"
+      },
+      "bin": {
+        "rimraf": "bin.js"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/ripemd160": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
+      "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
+      "dev": true,
+      "dependencies": {
+        "hash-base": "^3.0.0",
+        "inherits": "^2.0.1"
+      }
+    },
+    "node_modules/rollup": {
+      "version": "4.20.0",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.20.0.tgz",
+      "integrity": "sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==",
+      "dev": true,
+      "dependencies": {
+        "@types/estree": "1.0.5"
+      },
+      "bin": {
+        "rollup": "dist/bin/rollup"
+      },
+      "engines": {
+        "node": ">=18.0.0",
+        "npm": ">=8.0.0"
+      },
+      "optionalDependencies": {
+        "@rollup/rollup-android-arm-eabi": "4.20.0",
+        "@rollup/rollup-android-arm64": "4.20.0",
+        "@rollup/rollup-darwin-arm64": "4.20.0",
+        "@rollup/rollup-darwin-x64": "4.20.0",
+        "@rollup/rollup-linux-arm-gnueabihf": "4.20.0",
+        "@rollup/rollup-linux-arm-musleabihf": "4.20.0",
+        "@rollup/rollup-linux-arm64-gnu": "4.20.0",
+        "@rollup/rollup-linux-arm64-musl": "4.20.0",
+        "@rollup/rollup-linux-powerpc64le-gnu": "4.20.0",
+        "@rollup/rollup-linux-riscv64-gnu": "4.20.0",
+        "@rollup/rollup-linux-s390x-gnu": "4.20.0",
+        "@rollup/rollup-linux-x64-gnu": "4.20.0",
+        "@rollup/rollup-linux-x64-musl": "4.20.0",
+        "@rollup/rollup-win32-arm64-msvc": "4.20.0",
+        "@rollup/rollup-win32-ia32-msvc": "4.20.0",
+        "@rollup/rollup-win32-x64-msvc": "4.20.0",
+        "fsevents": "~2.3.2"
+      }
+    },
+    "node_modules/rrweb-cssom": {
+      "version": "0.7.1",
+      "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz",
+      "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg=="
+    },
+    "node_modules/safe-buffer": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ]
+    },
+    "node_modules/safer-buffer": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+    },
+    "node_modules/saxes": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz",
+      "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==",
+      "dependencies": {
+        "xmlchars": "^2.2.0"
+      },
+      "engines": {
+        "node": ">=v12.22.7"
+      }
+    },
+    "node_modules/semver": {
+      "version": "7.6.3",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+      "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+      "bin": {
+        "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/send": {
+      "version": "0.18.0",
+      "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
+      "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
+      "dependencies": {
+        "debug": "2.6.9",
+        "depd": "2.0.0",
+        "destroy": "1.2.0",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "etag": "~1.8.1",
+        "fresh": "0.5.2",
+        "http-errors": "2.0.0",
+        "mime": "1.6.0",
+        "ms": "2.1.3",
+        "on-finished": "2.4.1",
+        "range-parser": "~1.2.1",
+        "statuses": "2.0.1"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/send/node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/send/node_modules/debug/node_modules/ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+    },
+    "node_modules/send/node_modules/ms": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+    },
+    "node_modules/serve-static": {
+      "version": "1.15.0",
+      "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
+      "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
+      "dependencies": {
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "parseurl": "~1.3.3",
+        "send": "0.18.0"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/set-blocking": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+      "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="
+    },
+    "node_modules/set-function-length": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
+      "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+      "dependencies": {
+        "define-data-property": "^1.1.4",
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2",
+        "get-intrinsic": "^1.2.4",
+        "gopd": "^1.0.1",
+        "has-property-descriptors": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/setimmediate": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
+      "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==",
+      "dev": true
+    },
+    "node_modules/setprototypeof": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+      "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
+    },
+    "node_modules/sha.js": {
+      "version": "2.4.11",
+      "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
+      "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
+      "dev": true,
+      "dependencies": {
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.0.1"
+      },
+      "bin": {
+        "sha.js": "bin.js"
+      }
+    },
+    "node_modules/sha1": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz",
+      "integrity": "sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==",
+      "dependencies": {
+        "charenc": ">= 0.0.1",
+        "crypt": ">= 0.0.1"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/side-channel": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
+      "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.4",
+        "object-inspect": "^1.13.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/signal-exit": {
+      "version": "3.0.7",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+      "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="
+    },
+    "node_modules/simple-concat": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
+      "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ]
+    },
+    "node_modules/simple-get": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz",
+      "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==",
+      "dependencies": {
+        "decompress-response": "^4.2.0",
+        "once": "^1.3.1",
+        "simple-concat": "^1.0.0"
+      }
+    },
+    "node_modules/source-map": {
+      "version": "0.5.7",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+      "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/source-map-js": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
+      "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/sshpk": {
+      "version": "1.18.0",
+      "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz",
+      "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==",
+      "dependencies": {
+        "asn1": "~0.2.3",
+        "assert-plus": "^1.0.0",
+        "bcrypt-pbkdf": "^1.0.0",
+        "dashdash": "^1.12.0",
+        "ecc-jsbn": "~0.1.1",
+        "getpass": "^0.1.1",
+        "jsbn": "~0.1.0",
+        "safer-buffer": "^2.0.2",
+        "tweetnacl": "~0.14.0"
+      },
+      "bin": {
+        "sshpk-conv": "bin/sshpk-conv",
+        "sshpk-sign": "bin/sshpk-sign",
+        "sshpk-verify": "bin/sshpk-verify"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/statuses": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+      "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/stream-browserify": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz",
+      "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==",
+      "dev": true,
+      "dependencies": {
+        "inherits": "~2.0.4",
+        "readable-stream": "^3.5.0"
+      }
+    },
+    "node_modules/stream-http": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz",
+      "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==",
+      "dev": true,
+      "dependencies": {
+        "builtin-status-codes": "^3.0.0",
+        "inherits": "^2.0.4",
+        "readable-stream": "^3.6.0",
+        "xtend": "^4.0.2"
+      }
+    },
+    "node_modules/string_decoder": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+      "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+      "dependencies": {
+        "safe-buffer": "~5.2.0"
+      }
+    },
+    "node_modules/string-width": {
+      "version": "4.2.3",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+      "dependencies": {
+        "emoji-regex": "^8.0.0",
+        "is-fullwidth-code-point": "^3.0.0",
+        "strip-ansi": "^6.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/strip-ansi": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+      "dependencies": {
+        "ansi-regex": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/supports-color": {
+      "version": "5.5.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+      "dependencies": {
+        "has-flag": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/supports-preserve-symlinks-flag": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+      "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/symbol-tree": {
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
+      "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="
+    },
+    "node_modules/tar": {
+      "version": "6.2.1",
+      "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz",
+      "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==",
+      "dependencies": {
+        "chownr": "^2.0.0",
+        "fs-minipass": "^2.0.0",
+        "minipass": "^5.0.0",
+        "minizlib": "^2.1.1",
+        "mkdirp": "^1.0.3",
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/timers-browserify": {
+      "version": "2.0.12",
+      "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz",
+      "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==",
+      "dev": true,
+      "dependencies": {
+        "setimmediate": "^1.0.4"
+      },
+      "engines": {
+        "node": ">=0.6.0"
+      }
+    },
+    "node_modules/toidentifier": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+      "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+      "engines": {
+        "node": ">=0.6"
+      }
+    },
+    "node_modules/tough-cookie": {
+      "version": "4.1.4",
+      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz",
+      "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==",
+      "dependencies": {
+        "psl": "^1.1.33",
+        "punycode": "^2.1.1",
+        "universalify": "^0.2.0",
+        "url-parse": "^1.5.3"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/tr46": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz",
+      "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==",
+      "dependencies": {
+        "punycode": "^2.3.1"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/tty-browserify": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz",
+      "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==",
+      "dev": true
+    },
+    "node_modules/tunnel-agent": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+      "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
+      "dependencies": {
+        "safe-buffer": "^5.0.1"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/tweetnacl": {
+      "version": "0.14.5",
+      "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+      "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="
+    },
+    "node_modules/type-is": {
+      "version": "1.6.18",
+      "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+      "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+      "dependencies": {
+        "media-typer": "0.3.0",
+        "mime-types": "~2.1.24"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/underscore": {
+      "version": "1.13.7",
+      "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.7.tgz",
+      "integrity": "sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g=="
+    },
+    "node_modules/union": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz",
+      "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==",
+      "dependencies": {
+        "qs": "^6.4.0"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/universalify": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
+      "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
+      "engines": {
+        "node": ">= 4.0.0"
+      }
+    },
+    "node_modules/unpipe": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+      "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/uri-js": {
+      "version": "4.4.1",
+      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+      "dependencies": {
+        "punycode": "^2.1.0"
+      }
+    },
+    "node_modules/url": {
+      "version": "0.11.4",
+      "resolved": "https://registry.npmjs.org/url/-/url-0.11.4.tgz",
+      "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==",
+      "dev": true,
+      "dependencies": {
+        "punycode": "^1.4.1",
+        "qs": "^6.12.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/url-join": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/url-join/-/url-join-2.0.5.tgz",
+      "integrity": "sha512-c2H1fIgpUdwFRIru9HFno5DT73Ok8hg5oOb5AT3ayIgvCRfxgs2jyt5Slw8kEB7j3QUr6yJmMPDT/odjk7jXow=="
+    },
+    "node_modules/url-parse": {
+      "version": "1.5.10",
+      "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
+      "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
+      "dependencies": {
+        "querystringify": "^2.1.1",
+        "requires-port": "^1.0.0"
+      }
+    },
+    "node_modules/url/node_modules/punycode": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+      "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==",
+      "dev": true
+    },
+    "node_modules/url/node_modules/qs": {
+      "version": "6.13.0",
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
+      "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
+      "dev": true,
+      "dependencies": {
+        "side-channel": "^1.0.6"
+      },
+      "engines": {
+        "node": ">=0.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/util": {
+      "version": "0.12.5",
+      "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz",
+      "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==",
+      "dev": true,
+      "dependencies": {
+        "inherits": "^2.0.3",
+        "is-arguments": "^1.0.4",
+        "is-generator-function": "^1.0.7",
+        "is-typed-array": "^1.1.3",
+        "which-typed-array": "^1.1.2"
+      }
+    },
+    "node_modules/util-deprecate": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+      "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
+    },
+    "node_modules/utils-merge": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+      "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
+      "engines": {
+        "node": ">= 0.4.0"
+      }
+    },
+    "node_modules/uuid": {
+      "version": "3.4.0",
+      "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+      "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
+      "deprecated": "Please upgrade  to version 7 or higher.  Older versions may use Math.random() in certain circumstances, which is known to be problematic.  See https://v8.dev/blog/math-random for details.",
+      "bin": {
+        "uuid": "bin/uuid"
+      }
+    },
+    "node_modules/vary": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+      "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/verror": {
+      "version": "1.10.0",
+      "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+      "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
+      "engines": [
+        "node >=0.6.0"
+      ],
+      "dependencies": {
+        "assert-plus": "^1.0.0",
+        "core-util-is": "1.0.2",
+        "extsprintf": "^1.2.0"
+      }
+    },
+    "node_modules/vinyl": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz",
+      "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==",
+      "dependencies": {
+        "clone": "^2.1.1",
+        "clone-buffer": "^1.0.0",
+        "clone-stats": "^1.0.0",
+        "cloneable-readable": "^1.0.0",
+        "remove-trailing-separator": "^1.0.1",
+        "replace-ext": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/vinyl-sourcemaps-apply": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz",
+      "integrity": "sha512-+oDh3KYZBoZC8hfocrbrxbLUeaYtQK7J5WU5Br9VqWqmCll3tFJqKp97GC9GmMsVIL0qnx2DgEDVxdo5EZ5sSw==",
+      "dependencies": {
+        "source-map": "^0.5.1"
+      }
+    },
+    "node_modules/vite": {
+      "version": "5.4.1",
+      "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.1.tgz",
+      "integrity": "sha512-1oE6yuNXssjrZdblI9AfBbHCC41nnyoVoEZxQnID6yvQZAFBzxxkqoFLtHUMkYunL8hwOLEjgTuxpkRxvba3kA==",
+      "dev": true,
+      "dependencies": {
+        "esbuild": "^0.21.3",
+        "postcss": "^8.4.41",
+        "rollup": "^4.13.0"
+      },
+      "bin": {
+        "vite": "bin/vite.js"
+      },
+      "engines": {
+        "node": "^18.0.0 || >=20.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/vitejs/vite?sponsor=1"
+      },
+      "optionalDependencies": {
+        "fsevents": "~2.3.3"
+      },
+      "peerDependencies": {
+        "@types/node": "^18.0.0 || >=20.0.0",
+        "less": "*",
+        "lightningcss": "^1.21.0",
+        "sass": "*",
+        "sass-embedded": "*",
+        "stylus": "*",
+        "sugarss": "*",
+        "terser": "^5.4.0"
+      },
+      "peerDependenciesMeta": {
+        "@types/node": {
+          "optional": true
+        },
+        "less": {
+          "optional": true
+        },
+        "lightningcss": {
+          "optional": true
+        },
+        "sass": {
+          "optional": true
+        },
+        "sass-embedded": {
+          "optional": true
+        },
+        "stylus": {
+          "optional": true
+        },
+        "sugarss": {
+          "optional": true
+        },
+        "terser": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/vite-plugin-banner": {
+      "version": "0.7.1",
+      "resolved": "https://registry.npmjs.org/vite-plugin-banner/-/vite-plugin-banner-0.7.1.tgz",
+      "integrity": "sha512-Bww2Xd5tOGsZ1yZ9rQiGneryvsL1u86znPrqeQjCsXPsG72pnSdV5lcQA+cy8UNDguMqyTJiCevlNUbLnT85UA==",
+      "dev": true
+    },
+    "node_modules/vite-plugin-node-polyfills": {
+      "version": "0.22.0",
+      "resolved": "https://registry.npmjs.org/vite-plugin-node-polyfills/-/vite-plugin-node-polyfills-0.22.0.tgz",
+      "integrity": "sha512-F+G3LjiGbG8QpbH9bZ//GSBr9i1InSTkaulfUHFa9jkLqVGORFBoqc2A/Yu5Mmh1kNAbiAeKeK+6aaQUf3x0JA==",
+      "dev": true,
+      "dependencies": {
+        "@rollup/plugin-inject": "^5.0.5",
+        "node-stdlib-browser": "^1.2.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/davidmyersdev"
+      },
+      "peerDependencies": {
+        "vite": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0"
+      }
+    },
+    "node_modules/vm-browserify": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
+      "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==",
+      "dev": true
+    },
+    "node_modules/w3c-xmlserializer": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz",
+      "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==",
+      "dependencies": {
+        "xml-name-validator": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/webidl-conversions": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+      "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/whatwg-encoding": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz",
+      "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==",
+      "dependencies": {
+        "iconv-lite": "0.6.3"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/whatwg-mimetype": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz",
+      "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==",
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/whatwg-url": {
+      "version": "14.0.0",
+      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz",
+      "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==",
+      "dependencies": {
+        "tr46": "^5.0.0",
+        "webidl-conversions": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/which-typed-array": {
+      "version": "1.1.15",
+      "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz",
+      "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==",
+      "dev": true,
+      "dependencies": {
+        "available-typed-arrays": "^1.0.7",
+        "call-bind": "^1.0.7",
+        "for-each": "^0.3.3",
+        "gopd": "^1.0.1",
+        "has-tostringtag": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/wide-align": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
+      "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
+      "dependencies": {
+        "string-width": "^1.0.2 || 2 || 3 || 4"
+      }
+    },
+    "node_modules/wordwrap": {
+      "version": "0.0.3",
+      "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
+      "integrity": "sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw==",
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/wrappy": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
+    },
+    "node_modules/ws": {
+      "version": "8.18.0",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz",
+      "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==",
+      "engines": {
+        "node": ">=10.0.0"
+      },
+      "peerDependencies": {
+        "bufferutil": "^4.0.1",
+        "utf-8-validate": ">=5.0.2"
+      },
+      "peerDependenciesMeta": {
+        "bufferutil": {
+          "optional": true
+        },
+        "utf-8-validate": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/xml-name-validator": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz",
+      "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==",
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/xmlchars": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
+      "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw=="
+    },
+    "node_modules/xmlhttprequest": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz",
+      "integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==",
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/xtend": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.4"
+      }
+    },
+    "node_modules/yallist": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+    },
+    "node_modules/yocto-queue": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+      "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    }
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/package.json	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,44 @@
+{
+  "name": "metadataplayer",
+  "private": true,
+  "version": "0.0.1",
+  "type": "module",
+  "files": [
+    "dist"
+  ],
+  "main": "./dist/LdtPlayer-core.js",
+  "module": "./dist/LdtPlayer-core.lib.js",
+  "exports": {
+    ".": {
+      "import": "./dist/LdtPlayer-core.lib.js",
+      "require": "./dist/LdtPlayer-core.js"
+    },
+    "./dist/LdtPlayer-core.css": "./dist/style.css"
+  },
+  "scripts": {
+    "dev": "vite",
+    "build": "vite build",
+    "preview": "vite preview"
+  },
+  "devDependencies": {
+    "@rollup/plugin-inject": "^5.0.5",
+    "vite": "^5.4.1",
+    "vite-plugin-banner": "^0.7.1",
+    "vite-plugin-node-polyfills": "^0.22.0"
+  },
+  "dependencies": {
+    "backbone": "^1.6.0",
+    "backbone-relational": "^0.10.0",
+    "jquery": "^3.7.1",
+    "jquery-ui": "^1.14.0",
+    "jwplayer": "^1.0.3",
+    "lodash": "^4.17.21",
+    "mousetrap": "^1.6.5",
+    "mousetrap-global-bind": "^1.1.0",
+    "mustache": "^4.2.0",
+    "paper": "^0.12.18",
+    "popcorn-js": "github:menismu/popcorn-js",
+    "processing": "^0.2.0",
+    "raphael": "^2.3.0"
+  }
+}
--- a/sbin/build/build-downloads.sh	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,10 +0,0 @@
-#!/bin/sh
-./compil.sh
-cd ../doc
-./convertdocs.sh
-cd ../../
-
-rm downloads/*.zip
-
-zip -r downloads/metadataplayer-$(date +%Y%m%d).zip test/ src doc/*.html -x *.mp4 *.webm *.ogv
-
--- a/sbin/build/client.xml	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,99 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project basedir="." default="makeall">
-
-    <taskdef name="jscomp" classname="com.google.javascript.jscomp.ant.CompileTask">
-        <classpath>
-            <pathelement location="../res/compiler.jar" />
-        </classpath>
-    </taskdef>
-    <taskdef resource="net/sf/antcontrib/antlib.xml">
-        <classpath>
-            <pathelement location="../res/ant-contrib.jar"/>
-        </classpath>
-    </taskdef>
-    <delete dir="${basedir}/../../build" />
-    <mkdir  dir="${basedir}/../../build" />
-
-    <target name="makeall" depends="concatenate-player,copytotest" />
-
-    <target name="concatenate-core">
-        <concat encoding="UTF-8" outputencoding="UTF-8" destfile="../../build/metadataplayer-core.js">
-            <filelist dir="../../src/js/" files="header.js version.js" />
-        	<!-- core files -->
-            <filelist dir="../../src/js" files="init.js utils.js model.js html-player.js" />
-            <filterchain>
-                <deletecharacters chars="&#xFEFF;" />
-            </filterchain>
-        </concat>
-    </target>
-
-    <target name="concatenate-player" description="Build the developer release file" depends="concatenate-core">
-        <concat encoding="UTF-8" outputencoding="UTF-8" destfile="../../build/LdtPlayer-core.js">
-            <filelist dir="../../src/js/libs" files="LAB.min.js" />
-            <!-- core files -->
-            <filelist dir="../../build" files="metadataplayer-core.js" />
-            <!-- serializers -->
-            <fileset dir="../../src/js/serializers" casesensitive="yes">
-                <include name="**/*.js"/>
-            </fileset>
-            <fileset dir="../../src/js/widgets-container" casesensitive="yes">
-                <include name="**/*.js"/>
-            </fileset>
-            <filterchain>
-                <deletecharacters chars="&#xFEFF;" />
-            </filterchain>
-        </concat>
-    </target>
-
-    <target name="copytotest" description="Copy files to test directory">
-        <delete dir="../../test/metadataplayer" />
-        <delete dir="../../test/libs" />
-        <copy todir="../../test/libs">
-            <fileset dir="../../src/js/libs"/>
-        </copy>
-        <copy todir="../../test/metadataplayer">
-            <fileset dir="../../src/widgets"/>
-        </copy>
-        <copy file="../../build/LdtPlayer-core.js" todir="../../test/metadataplayer/" />
-        <copy file="../../src/css/LdtPlayer-core.css" todir="../../test/metadataplayer/" />
-        <copy todir="../../test/metadataplayer/img">
-            <fileset dir="../../src/css/img"/>
-        </copy>
-    </target>
-
-    <target name="minify" depends="concatenate-player">
-        <jscomp compilationLevel="simple" warning="quiet" debug="false"
-        output="../../build/LdtPlayer.min.raw.js">
-            <externs dir="${basedir}/../../src/js/">
-                <file name="libs/jquery.min.js" />
-                <file name="libs/jquery-ui.min.js" />
-                <file name="libs/swfobject.js" />
-            </externs>
-            <sources dir="${basedir}/../../build">
-                <file name="LdtPlayer-core.js" />
-            </sources>
-        </jscomp>
-        <concat destfile="../../build/LdtPlayer.min.js"
-        append="false">
-            <filelist dir="../../src/js/" files="header.js version.js" />
-            <filelist dir="../../build/" files="LdtPlayer.min.raw.js" />
-        </concat>
-        <delete file="../../build/LdtPlayer.min.raw.js" />
-    </target>
-    <property name="rhino.jar" value="${basedir}/../res/rhino.jar"/>
-    <property name="jslint-wrapper.js" value="${basedir}/../res/jslint-wrapper.js"/>
-    <property name="jslint.js" value="${basedir}/../res/jslint.js"/>
-    <target name="jslint" description="Run jslint on the files">
-        <apply executable="java" parallel="false">
-            <fileset dir="../../src">
-                <include name="js/**/*.js"/>
-                <exclude name="js/libs/**"/>
-                <include name="widgets/**/*.js"/>
-            </fileset>
-            <arg line="-jar"/>
-            <arg path="${rhino.jar}"/>
-            <arg path="${jslint-wrapper.js}"/>
-            <arg path="${jslint.js}"/>
-        </apply>
-    </target>
-</project>
--- a/sbin/build/compil-to-platform.sh.tmpl	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,30 +0,0 @@
-#!/bin/bash
-
-echo "Compiling Metadataplayer"
-
-sh ../res/ant/bin/ant -f client.xml
-
-echo "Copying to Platform :"
-
-echo "  Copying core files and widgets"
-
-cp -R ../../test/metadataplayer/* ~/shared/platform/src/ldt/ldt/static/ldt/metadataplayer
-
-echo "  Copying JS libs"
-
-cp -R ../../src/js/libs/*.js ~/shared/platform/src/ldt/ldt/static/ldt/js
-
-echo "  Copying SWF libs"
-
-cp -R ../../src/js/libs/*.swf ~/shared/platform/src/ldt/ldt/static/ldt/swf
-
-echo "Activating virtual environment"
-
-source ~/venv_pf/activate.sh
-
-cd ~/shared/platform/web
-
-echo "Collecting static files"
-
-python manage.py collectstatic --noinput
-
--- a/sbin/build/compil-to-polemic-tweet.sh.tmpl	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
-#!/bin/bash
-
-echo "Compiling Metadataplayer"
-
-sh ../res/ant/bin/ant -f client.xml
-
-echo "Copying to Polemic Tweet :"
-
-echo "  Copying core files and widgets"
-
-cp -R ../../test/metadataplayer/* ~/shared/tweet_live/web/res/metadataplayer
-
-echo "  Copying libs"
-
-cp -R ../../src/js/libs/* ~/shared/tweet_live/web/res/js
-
--- a/sbin/build/compil.bat	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-..\res\ant\bin\ant.bat -f client.xml
--- a/sbin/build/compil.sh	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-#!/bin/sh
-DIR=$(dirname $0)
-sh ${DIR}/../res/ant/bin/ant -f ${DIR}/client.xml $@
--- a/sbin/build/gendoc.bat	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-compil.bat
-java -jar ../res/jsdoc/jsrun.jar ../res/jsdoc/app/run.js -a -t=../res/jsdoc/templates/jsdoc/ ../../build/LdtPlayer-release.js -d=../../doc/jsdoc/
\ No newline at end of file
--- a/sbin/build/gendoc.sh	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-#!/bin/sh
-./compil.sh
-java -jar ../res/jsdoc/jsrun.jar ../res/jsdoc/app/run.js -a -t=../res/jsdoc/templates/jsdoc/ ../../build/LdtPlayer-release.js -d=../../doc/jsdoc/
\ No newline at end of file
--- a/sbin/build/minify.bat	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-..\res\ant\bin\ant.bat -f client.xml minify
\ No newline at end of file
--- a/sbin/build/minify.sh	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-#!/bin/sh
-sh ../res/ant/bin/ant -f client.xml minify
\ No newline at end of file
--- a/sbin/doc/convertdocs.sh	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-#!/bin/bash
-for f in ../../doc/*.md
-do
-    python markdown2html.py $f
-done
\ No newline at end of file
--- a/sbin/doc/markdown2dokuwiki.py	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-import re, sys
-
-inputname = sys.argv[1]
-outputname = re.sub("\.\w+$",".dokuwiki",inputname)
-
-print "Converting %s to %s"%(inputname,outputname)
-
-inputfile = open(inputname,'r')
-
-markdowntext = inputfile.read()
-
-# Replacing title levels: #italic# -> ======italic======
-
-wikitext = re.sub("(?m)(^#+|#+$)", lambda matches: "=" * (7 - len(matches.group(1))), markdowntext)
-
-# Replacing italics: *italic* -> //italic//
-
-wikitext = re.sub("(?m)([^*])\*([^*]+)\*($|[^*])", lambda matches: matches.group(1) + "//" + matches.group(2) + "//" + matches.group(3), wikitext)
-
-# Replacing lists: - -> *
-
-wikitext = re.sub("(?m)^(\s*)(-)\s", lambda matches: " " * ( 2 + len(matches.group(1)) / 2) + "* ", wikitext)
-
-# Replacing lists: 1. -> -
-
-wikitext = re.sub("(?m)^(\s*)(\d+\.)\s", lambda matches: " " * ( 2 + len(matches.group(1)) / 2) + "- ", wikitext)
-
-# Replacing escaped underscores \_ -> _
-
-wikitext = re.sub("(?m)(\\\_)", "_", wikitext)
-
-# Escaping URL templates {{ -> %%{%%{
-
-wikitext = re.sub("(?m)({{)", "%%{%%{", wikitext)
-
-outputfile = open(outputname,'w')
-
-outputfile.write(wikitext)
-
-outputfile.close()
-
-inputfile.close()
\ No newline at end of file
--- a/sbin/doc/markdown2html.py	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,32 +0,0 @@
-import re, sys, markdown, codecs
-
-inputname = sys.argv[1]
-outputname = re.sub("\.\w+$",".html",inputname)
-shortname = re.sub("(^.+\/|\.\w+$)","",inputname)
-
-print "Converting %s"%shortname
-
-f = codecs.open(inputname, mode="r", encoding="utf8")
-mdtext = f.read()
-f.close()
-html = markdown.markdown(mdtext)
-
-f = codecs.open(outputname, "w", encoding="utf8")
-
-header = """<!doctype html>
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
-<title>Metadataplayer docs: %s</title>
-</head>
-<body>
-"""%shortname
-footer = """
-</body>
-</html>"""
-
-f.write(header)
-f.write(html)
-f.write(footer)
-
-f.close()
\ No newline at end of file
Binary file sbin/res/Markdown-2.2.0.tar.gz has changed
Binary file sbin/res/ant-contrib.jar has changed
--- a/sbin/res/ant/bin/ant	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,335 +0,0 @@
-#! /bin/sh
-
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Extract launch and ant arguments, (see details below).
-ant_exec_args=
-no_config=false
-use_jikes_default=false
-ant_exec_debug=false
-show_help=false
-for arg in "$@" ; do
-  if [ "$arg" = "--noconfig" ] ; then
-    no_config=true
-  elif [ "$arg" = "--usejikes" ] ; then
-    use_jikes_default=true
-  elif [ "$arg" = "--execdebug" ] ; then
-    ant_exec_debug=true
-  elif [ my"$arg" = my"--h"  -o my"$arg" = my"--help"  ] ; then
-    show_help=true
-    ant_exec_args="$ant_exec_args -h"
-  else
-    if [  my"$arg" = my"-h"  -o  my"$arg" = my"-help" ] ; then
-      show_help=true
-    fi
-    ant_exec_args="$ant_exec_args \"$arg\""
-  fi
-done
-
-# Source/default ant configuration
-if $no_config ; then
-  rpm_mode=false
-  usejikes=$use_jikes_default
-else
-  # load system-wide ant configuration (ONLY if ANT_HOME has NOT been set)
-  if [ -z "$ANT_HOME" -o "$ANT_HOME" = "/usr/share/ant" ]; then
-      if [ -f "/etc/ant.conf" ] ; then
-          . /etc/ant.conf
-      fi
-  fi
-
-  # load user ant configuration
-  if [ -f "$HOME/.ant/ant.conf" ] ; then
-    . $HOME/.ant/ant.conf
-  fi
-  if [ -f "$HOME/.antrc" ] ; then
-    . "$HOME/.antrc"
-  fi
-
-  # provide default configuration values
-  if [ -z "$rpm_mode" ] ; then
-    rpm_mode=false
-  fi
-  if [ -z "$usejikes" ] ; then
-    usejikes=$use_jikes_default
-  fi
-fi
-
-# Setup Java environment in rpm mode
-if $rpm_mode ; then
-  if [ -f /usr/share/java-utils/java-functions ] ; then
-    . /usr/share/java-utils/java-functions
-    set_jvm
-    set_javacmd
-  fi
-fi
-
-# OS specific support.  $var _must_ be set to either true or false.
-cygwin=false;
-darwin=false;
-mingw=false;
-case "`uname`" in
-  CYGWIN*) cygwin=true ;;
-  Darwin*) darwin=true
-           if [ -z "$JAVA_HOME" ] ; then
-             JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Home
-           fi
-           ;;
-  MINGW*) mingw=true ;;
-esac
-
-if [ -z "$ANT_HOME" -o ! -d "$ANT_HOME" ] ; then
-  ## resolve links - $0 may be a link to ant's home
-  PRG="$0"
-  progname=`basename "$0"`
-
-  # need this for relative symlinks
-  while [ -h "$PRG" ] ; do
-    ls=`ls -ld "$PRG"`
-    link=`expr "$ls" : '.*-> \(.*\)$'`
-    if expr "$link" : '/.*' > /dev/null; then
-    PRG="$link"
-    else
-    PRG=`dirname "$PRG"`"/$link"
-    fi
-  done
-
-  ANT_HOME=`dirname "$PRG"`/..
-
-  # make it fully qualified
-  ANT_HOME=`cd "$ANT_HOME" > /dev/null && pwd`
-fi
-
-# For Cygwin and Mingw, ensure paths are in UNIX format before
-# anything is touched
-if $cygwin ; then
-  [ -n "$ANT_HOME" ] &&
-    ANT_HOME=`cygpath --unix "$ANT_HOME"`
-  [ -n "$JAVA_HOME" ] &&
-    JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
-fi
-if $mingw ; then
-  [ -n "$ANT_HOME" ] &&
-    ANT_HOME="`(cd "$ANT_HOME"; pwd)`"
-  [ -n "$JAVA_HOME" ] &&
-    JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
-fi
-
-# set ANT_LIB location
-ANT_LIB="${ANT_HOME}/lib"
-
-if [ -z "$JAVACMD" ] ; then
-  if [ -n "$JAVA_HOME"  ] ; then
-    # IBM's JDK on AIX uses strange locations for the executables
-    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
-      JAVACMD="$JAVA_HOME/jre/sh/java"
-    elif [ -x "$JAVA_HOME/jre/bin/java" ] ; then
-      JAVACMD="$JAVA_HOME/jre/bin/java"
-    else
-      JAVACMD="$JAVA_HOME/bin/java"
-    fi
-  else
-    JAVACMD=`which java 2> /dev/null `
-    if [ -z "$JAVACMD" ] ; then
-        JAVACMD=java
-    fi
-  fi
-fi
-
-if [ ! -x "$JAVACMD" ] ; then
-  echo "Error: JAVA_HOME is not defined correctly."
-  echo "  We cannot execute $JAVACMD"
-  exit 1
-fi
-
-# Build local classpath using just the launcher in non-rpm mode or
-# use the Jpackage helper in rpm mode with basic and default jars
-# specified in the ant.conf configuration. Because the launcher is
-# used, libraries linked in ANT_HOME/lib will also be included, but this
-# is discouraged as it is not java-version safe. A user should
-# request optional jars and their dependencies via the OPT_JAR_LIST
-# variable
-if $rpm_mode && [ -x /usr/bin/build-classpath ] ; then
-  LOCALCLASSPATH="$(/usr/bin/build-classpath ant ant-launcher jaxp_parser_impl xml-commons-apis)"
-
-  # If no optional jars have been specified then build the default list
-  if [ -z "$OPT_JAR_LIST" ] ; then
-    for file in /etc/ant.d/*; do
-      if [ -f "$file" ]; then
-        case "$file" in
-        *~) ;;
-        *#*) ;;
-        *.rpmsave) ;;
-        *.rpmnew) ;;
-        *)
-          for dep in `cat "$file"`; do
-            case "$OPT_JAR_LIST" in
-            *"$dep"*) ;;
-            *) OPT_JAR_LIST="$OPT_JAR_LIST${OPT_JAR_LIST:+ }$dep"
-            esac
-          done
-        esac
-      fi
-    done
-  fi
-
-  # If the user requested to try to add some other jars to the classpath
-  if [ -n "$OPT_JAR_LIST" ] ; then
-    _OPTCLASSPATH="$(/usr/bin/build-classpath $OPT_JAR_LIST 2> /dev/null)"
-    if [ -n "$_OPTCLASSPATH" ] ; then 
-      LOCALCLASSPATH="$LOCALCLASSPATH:$_OPTCLASSPATH"
-    fi
-  fi
-
-  # Explicitly add javac path to classpath, assume JAVA_HOME set
-  # properly in rpm mode
-  if [ -f "$JAVA_HOME/lib/tools.jar" ] ; then
-    LOCALCLASSPATH="$LOCALCLASSPATH:$JAVA_HOME/lib/tools.jar"
-  fi
-  if [ -f "$JAVA_HOME/lib/classes.zip" ] ; then
-    LOCALCLASSPATH="$LOCALCLASSPATH:$JAVA_HOME/lib/classes.zip"
-  fi
-
-  # if CLASSPATH_OVERRIDE env var is set, LOCALCLASSPATH will be
-  # user CLASSPATH first and ant-found jars after.
-  # In that case, the user CLASSPATH will override ant-found jars
-  #
-  # if CLASSPATH_OVERRIDE is not set, we'll have the normal behaviour
-  # with ant-found jars first and user CLASSPATH after
-  if [ -n "$CLASSPATH" ] ; then
-    # merge local and specified classpath 
-    if [ -z "$LOCALCLASSPATH" ] ; then 
-      LOCALCLASSPATH="$CLASSPATH"
-    elif [ -n "$CLASSPATH_OVERRIDE" ] ; then
-      LOCALCLASSPATH="$CLASSPATH:$LOCALCLASSPATH"
-    else
-      LOCALCLASSPATH="$LOCALCLASSPATH:$CLASSPATH"
-    fi
-
-    # remove class path from launcher -cp option
-    CLASSPATH=""
-  fi
-else
-  # not using rpm_mode; use launcher to determine classpaths
-  if [ -z "$LOCALCLASSPATH" ] ; then
-      LOCALCLASSPATH=$ANT_LIB/ant-launcher.jar
-  else
-      LOCALCLASSPATH=$ANT_LIB/ant-launcher.jar:$LOCALCLASSPATH
-  fi
-fi
-
-if [ -n "$JAVA_HOME" ] ; then
-  # OSX hack to make Ant work with jikes
-  if $darwin ; then
-    OSXHACK="${JAVA_HOME}/../Classes"
-    if [ -d "${OSXHACK}" ] ; then
-      for i in "${OSXHACK}"/*.jar
-      do
-        JIKESPATH="$JIKESPATH:$i"
-      done
-    fi
-  fi
-fi
-
-# Allow Jikes support (off by default)
-if $usejikes; then
-  ANT_OPTS="$ANT_OPTS -Dbuild.compiler=jikes"
-fi
-
-# For Cygwin, switch paths to appropriate format before running java
-# For PATHs convert to unix format first, then to windows format to ensure
-# both formats are supported. Probably this will fail on directories with ;
-# in the name in the path. Let's assume that paths containing ; are more
-# rare than windows style paths on cygwin.
-if $cygwin; then
-  if [ "$OS" = "Windows_NT" ] && cygpath -m .>/dev/null 2>/dev/null ; then
-    format=mixed
-  else
-    format=windows
-  fi
-  [ -n "$ANT_HOME" ] && ANT_HOME=`cygpath --$format "$ANT_HOME"`
-  ANT_LIB=`cygpath --$format "$ANT_LIB"`
-  [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --$format "$JAVA_HOME"`
-  LCP_TEMP=`cygpath --path --unix "$LOCALCLASSPATH"`
-  LOCALCLASSPATH=`cygpath --path --$format "$LCP_TEMP"`
-  if [ -n "$CLASSPATH" ] ; then
-    CP_TEMP=`cygpath --path --unix "$CLASSPATH"`
-    CLASSPATH=`cygpath --path --$format "$CP_TEMP"`
-  fi
-  CYGHOME=`cygpath --$format "$HOME"`
-fi
-
-# Show script help if requested
-if $show_help ; then
-  echo $0 '[script options] [options] [target [target2 [target3] ..]]'
-  echo 'Script Options:'
-  echo '  --help, --h            print this message and ant help'
-  echo '  --noconfig             suppress sourcing of /etc/ant.conf,'
-  echo '                         $HOME/.ant/ant.conf, and $HOME/.antrc'
-  echo '                         configuration files'
-  echo '  --usejikes             enable use of jikes by default, unless'
-  echo '                         set explicitly in configuration files'
-  echo '  --execdebug            print ant exec line generated by this'
-  echo '                         launch script'
-  echo '  '
-fi
-# add a second backslash to variables terminated by a backslash under cygwin
-if $cygwin; then
-  case "$ANT_HOME" in
-    *\\ )
-    ANT_HOME="$ANT_HOME\\"
-    ;;
-  esac
-  case "$CYGHOME" in
-    *\\ )
-    CYGHOME="$CYGHOME\\"
-    ;;
-  esac
-  case "$JIKESPATH" in
-    *\\ )
-    JIKESPATH="$JIKESPATH\\"
-    ;;
-  esac
-  case "$LOCALCLASSPATH" in
-    *\\ )
-    LOCALCLASSPATH="$LOCALCLASSPATH\\"
-    ;;
-  esac
-  case "$CLASSPATH" in
-    *\\ )
-    CLASSPATH="$CLASSPATH\\"
-    ;;
-  esac
-fi
-# Execute ant using eval/exec to preserve spaces in paths,
-# java options, and ant args
-ant_sys_opts=
-if [ -n "$CYGHOME" ]; then
-  if [ -n "$JIKESPATH" ]; then
-    ant_sys_opts="-Djikes.class.path=\"$JIKESPATH\" -Dcygwin.user.home=\"$CYGHOME\""
-  else
-    ant_sys_opts="-Dcygwin.user.home=\"$CYGHOME\""
-  fi
-else
-  if [ -n "$JIKESPATH" ]; then
-    ant_sys_opts="-Djikes.class.path=\"$JIKESPATH\""
-  fi
-fi
-ant_exec_command="exec \"$JAVACMD\" $ANT_OPTS -classpath \"$LOCALCLASSPATH\" -Dant.home=\"$ANT_HOME\" -Dant.library.dir=\"$ANT_LIB\" $ant_sys_opts org.apache.tools.ant.launch.Launcher $ANT_ARGS -cp \"$CLASSPATH\""
-if $ant_exec_debug ; then
-    echo $ant_exec_command $ant_exec_args
-fi
-eval $ant_exec_command "$ant_exec_args"
--- a/sbin/res/ant/bin/ant.bat	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,218 +0,0 @@
-@echo off
-
-REM  Licensed to the Apache Software Foundation (ASF) under one or more
-REM  contributor license agreements.  See the NOTICE file distributed with
-REM  this work for additional information regarding copyright ownership.
-REM  The ASF licenses this file to You under the Apache License, Version 2.0
-REM  (the "License"); you may not use this file except in compliance with
-REM  the License.  You may obtain a copy of the License at
-REM 
-REM      http://www.apache.org/licenses/LICENSE-2.0
-REM 
-REM  Unless required by applicable law or agreed to in writing, software
-REM  distributed under the License is distributed on an "AS IS" BASIS,
-REM  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-REM  See the License for the specific language governing permissions and
-REM  limitations under the License.
-
-REM This is an inordinately troublesome piece of code, particularly because it
-REM tries to work on both Win9x and WinNT-based systems. If we could abandon '9x
-REM support, things would be much easier, but sadly, it is not yet time.
-REM Be cautious about editing this, and only add WinNT specific stuff in code that
-REM only runs on WinNT.
-
-if "%HOME%"=="" goto homeDrivePathPre
-if exist "%HOME%\antrc_pre.bat" call "%HOME%\antrc_pre.bat"
-
-:homeDrivePathPre
-if "%HOMEDRIVE%%HOMEPATH%"=="" goto userProfilePre
-if "%HOMEDRIVE%%HOMEPATH%"=="%HOME%" goto userProfilePre
-if exist "%HOMEDRIVE%%HOMEPATH%\antrc_pre.bat" call "%HOMEDRIVE%%HOMEPATH%\antrc_pre.bat"
-
-:userProfilePre
-if "%USERPROFILE%"=="" goto alpha
-if "%USERPROFILE%"=="%HOME%" goto alpha
-if "%USERPROFILE%"=="%HOMEDRIVE%%HOMEPATH%" goto alpha
-if exist "%USERPROFILE%\antrc_pre.bat" call "%USERPROFILE%\antrc_pre.bat"
-
-:alpha
-
-if "%OS%"=="Windows_NT" @setlocal
-if "%OS%"=="WINNT" @setlocal
-
-if "%ANT_HOME%"=="" goto setDefaultAntHome
-
-:stripAntHome
-if not _%ANT_HOME:~-1%==_\ goto checkClasspath
-set ANT_HOME=%ANT_HOME:~0,-1%
-goto stripAntHome
-
-:setDefaultAntHome
-rem %~dp0 is expanded pathname of the current script under NT
-set ANT_HOME=%~dp0..
-
-:checkClasspath
-set _USE_CLASSPATH=yes
-rem CLASSPATH must not be used if it is equal to ""
-if "%CLASSPATH%"=="""" set _USE_CLASSPATH=no
-if "%CLASSPATH%"=="" set _USE_CLASSPATH=no
-
-rem Slurp the command line arguments. This loop allows for an unlimited number
-rem of arguments (up to the command line limit, anyway).
-set ANT_CMD_LINE_ARGS=
-:setupArgs
-if ""%1""=="""" goto doneStart
-if ""%1""==""-noclasspath"" goto clearclasspath
-set ANT_CMD_LINE_ARGS=%ANT_CMD_LINE_ARGS% %1
-shift
-goto setupArgs
-
-rem here is there is a -noclasspath in the options
-:clearclasspath
-set _USE_CLASSPATH=no
-shift
-goto setupArgs
-
-rem This label provides a place for the argument list loop to break out
-rem and for NT handling to skip to.
-
-:doneStart
-
-if "%_USE_CLASSPATH%"=="no" goto findAntHome
-
-:stripClasspath
-if not _%CLASSPATH:~-1%==_\ goto findAntHome
-set CLASSPATH=%CLASSPATH:~0,-1%
-goto stripClasspath
-
-:findAntHome
-rem find ANT_HOME if it does not exist due to either an invalid value passed
-rem by the user or the %0 problem on Windows 9x
-if exist "%ANT_HOME%\lib\ant.jar" goto checkJava
-
-rem check for ant in Program Files
-if not exist "%ProgramFiles%\ant" goto checkSystemDrive
-set ANT_HOME=%ProgramFiles%\ant
-goto checkJava
-
-:checkSystemDrive
-rem check for ant in root directory of system drive
-if not exist %SystemDrive%\ant\lib\ant.jar goto checkCDrive
-set ANT_HOME=%SystemDrive%\ant
-goto checkJava
-
-:checkCDrive
-rem check for ant in C:\ant for Win9X users
-if not exist C:\ant\lib\ant.jar goto noAntHome
-set ANT_HOME=C:\ant
-goto checkJava
-
-:noAntHome
-echo ANT_HOME is set incorrectly or ant could not be located. Please set ANT_HOME.
-goto end
-
-:checkJava
-set _JAVACMD=%JAVACMD%
-
-if "%JAVA_HOME%" == "" goto noJavaHome
-if not exist "%JAVA_HOME%\bin\java.exe" goto noJavaHome
-if "%_JAVACMD%" == "" set _JAVACMD=%JAVA_HOME%\bin\java.exe
-goto checkJikes
-
-:noJavaHome
-if "%_JAVACMD%" == "" set _JAVACMD=java.exe
-
-:checkJikes
-if not "%JIKESPATH%"=="" goto runAntWithJikes
-
-:runAnt
-if "%_USE_CLASSPATH%"=="no" goto runAntNoClasspath
-:runAntWithClasspath
-"%_JAVACMD%" %ANT_OPTS% -classpath "%ANT_HOME%\lib\ant-launcher.jar" "-Dant.home=%ANT_HOME%" org.apache.tools.ant.launch.Launcher %ANT_ARGS% -cp "%CLASSPATH%" %ANT_CMD_LINE_ARGS%
-rem Check the error code of the Ant build
-if not "%OS%"=="Windows_NT" goto onError
-set ANT_ERROR=%ERRORLEVEL%
-goto end
-
-:runAntNoClasspath
-"%_JAVACMD%" %ANT_OPTS% -classpath "%ANT_HOME%\lib\ant-launcher.jar" "-Dant.home=%ANT_HOME%" org.apache.tools.ant.launch.Launcher %ANT_ARGS% %ANT_CMD_LINE_ARGS%
-rem Check the error code of the Ant build
-if not "%OS%"=="Windows_NT" goto onError
-set ANT_ERROR=%ERRORLEVEL%
-goto end
-
-:runAntWithJikes
-
-if not _%JIKESPATH:~-1%==_\ goto checkJikesAndClasspath
-set JIKESPATH=%JIKESPATH:~0,-1%
-goto runAntWithJikes
-
-:checkJikesAndClasspath
-
-if "%_USE_CLASSPATH%"=="no" goto runAntWithJikesNoClasspath
-
-:runAntWithJikesAndClasspath
-"%_JAVACMD%" %ANT_OPTS% -classpath "%ANT_HOME%\lib\ant-launcher.jar" "-Dant.home=%ANT_HOME%" "-Djikes.class.path=%JIKESPATH%" org.apache.tools.ant.launch.Launcher %ANT_ARGS%  -cp "%CLASSPATH%" %ANT_CMD_LINE_ARGS%
-rem Check the error code of the Ant build
-if not "%OS%"=="Windows_NT" goto onError
-set ANT_ERROR=%ERRORLEVEL%
-goto end
-
-:runAntWithJikesNoClasspath
-"%_JAVACMD%" %ANT_OPTS% -classpath "%ANT_HOME%\lib\ant-launcher.jar" "-Dant.home=%ANT_HOME%" "-Djikes.class.path=%JIKESPATH%" org.apache.tools.ant.launch.Launcher %ANT_ARGS% %ANT_CMD_LINE_ARGS%
-rem Check the error code of the Ant build
-if not "%OS%"=="Windows_NT" goto onError
-set ANT_ERROR=%ERRORLEVEL%
-goto end
-
-:onError
-rem Windows 9x way of checking the error code.  It matches via brute force.
-for %%i in (1 10 100) do set err%%i=
-for %%i in (0 1 2) do if errorlevel %%i00 set err100=%%i
-if %err100%==2 goto onError200
-if %err100%==0 set err100=
-for %%i in (0 1 2 3 4 5 6 7 8 9) do if errorlevel %err100%%%i0 set err10=%%i
-if "%err100%"=="" if %err10%==0 set err10=
-:onError1
-for %%i in (0 1 2 3 4 5 6 7 8 9) do if errorlevel %err100%%err10%%%i set err1=%%i
-goto onErrorEnd
-:onError200
-for %%i in (0 1 2 3 4 5) do if errorlevel 2%%i0 set err10=%%i
-if err10==5 for %%i in (0 1 2 3 4 5) do if errorlevel 25%%i set err1=%%i
-if not err10==5 goto onError1
-:onErrorEnd
-set ANT_ERROR=%err100%%err10%%err1%
-for %%i in (1 10 100) do set err%%i=
-
-:end
-rem bug ID 32069: resetting an undefined env variable changes the errorlevel.
-if not "%_JAVACMD%"=="" set _JAVACMD=
-if not "%_ANT_CMD_LINE_ARGS%"=="" set ANT_CMD_LINE_ARGS=
-
-if "%ANT_ERROR%"=="0" goto mainEnd
-
-goto omega
-
-:mainEnd
-
-rem If there were no errors, we run the post script.
-if "%OS%"=="Windows_NT" @endlocal
-if "%OS%"=="WINNT" @endlocal
-
-if "%HOME%"=="" goto homeDrivePathPost
-if exist "%HOME%\antrc_post.bat" call "%HOME%\antrc_post.bat"
-
-:homeDrivePathPost
-if "%HOMEDRIVE%%HOMEPATH%"=="" goto userProfilePost
-if "%HOMEDRIVE%%HOMEPATH%"=="%HOME%" goto userProfilePost
-if exist "%HOMEDRIVE%%HOMEPATH%\antrc_post.bat" call "%HOMEDRIVE%%HOMEPATH%\antrc_post.bat"
-
-:userProfilePost
-if "%USERPROFILE%"=="" goto omega
-if "%USERPROFILE%"=="%HOME%" goto omega
-if "%USERPROFILE%"=="%HOMEDRIVE%%HOMEPATH%" goto omega
-if exist "%USERPROFILE%\antrc_post.bat" call "%USERPROFILE%\antrc_post.bat"
-
-:omega
-
-exit /b %ANT_ERROR%
--- a/sbin/res/ant/bin/ant.cmd	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,93 +0,0 @@
-/* 
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
- 
-    Run ant
-*/
-
-'@echo off'
-parse arg mode envarg '::' antarg
-
-if mode\='.' & mode\='..' & mode\='/' then do
-  envarg = mode envarg
-  mode = ''
-end
-
-if antarg = '' then do
-  antarg = envarg
-  envarg = ''
-end
-
-x = setlocal()
-
-env="OS2ENVIRONMENT"
-antenv = _getenv_('antenv')
-if _testenv_() = 0 then interpret 'call "' || antenv || '"' '"' || envarg || '"'
-
-if mode = '' then mode = _getenv_('ANT_MODE' '..')
-if mode \= '/' then do
-  runrc = _getenv_('runrc')
-  antrc = _getenv_('antrc' 'antrc.cmd')
-  if mode = '..' then mode = '-r'
-  else mode = ''
-  interpret 'call "' || runrc || '"' antrc '"' || mode || '"'
-end
-
-if _testenv_() = 0 then do
-  say 'Ant environment is not set properly'
-  x = endlocal()
-  exit 16
-end
-
-settings = '-Dant.home=' || ANT_HOME '-Djava.home=' || JAVA_HOME
-
-java = _getenv_('javacmd' 'java')
-opts = value('ANT_OPTS',,env)
-args = value('ANT_ARGS',,env)
-lcp = value('LOCALCLASSPATH',,env)
-cp = value('CLASSPATH',,env)
-if value('ANT_USE_CP',,env) \= '' then do
-  if lcp \= '' & right(lcp, 1) \= ';' then lcp = lcp || ';'
-  lcp = lcp || cp
-  'SET CLASSPATH='
-end
-if lcp\='' then lcp = '-classpath' lcp
-
-cmd = java opts lcp '-jar' ANT_HOME ||'\lib\ant-launcher.jar' settings args antarg
-launcher = stream(ANT_HOME ||'\lib\ant-launcher.jar', 'C', 'query exists')
-if launcher = '' then entry = 'org.apache.tools.ant.Main'
-else entry = 'org.apache.tools.ant.launch.Launcher'
-java opts lcp entry settings args antarg
-
-x = endlocal()
-
-return rc
-
-_testenv_: procedure expose env ANT_HOME JAVA_HOME
-ANT_HOME = value('ANT_HOME',,env)
-if ANT_HOME = '' then return 0
-JAVA_HOME = value('JAVA_HOME',,env)
-if JAVA_HOME = '' then return 0
-cp = translate(value('CLASSPATH',,env))
-if pos(translate(ANT_HOME), cp) = 0 then return 0
-if pos(translate(JAVA_HOME), cp) = 0 then return 0
-return 1
-
-_getenv_: procedure expose env
-parse arg envar default
-if default = '' then default = envar
-var = value(translate(envar),,env)
-if var = '' then var = default
-return var
--- a/sbin/res/ant/bin/antRun	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
-#! /bin/sh
-
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Args: DIR command
-cd "$1"
-CMD="$2"
-shift
-shift
-
-exec "$CMD" "$@"
--- a/sbin/res/ant/bin/antRun.bat	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,50 +0,0 @@
-@echo off
-
-REM  Licensed to the Apache Software Foundation (ASF) under one or more
-REM  contributor license agreements.  See the NOTICE file distributed with
-REM  this work for additional information regarding copyright ownership.
-REM  The ASF licenses this file to You under the Apache License, Version 2.0
-REM  (the "License"); you may not use this file except in compliance with
-REM  the License.  You may obtain a copy of the License at
-REM 
-REM      http://www.apache.org/licenses/LICENSE-2.0
-REM 
-REM  Unless required by applicable law or agreed to in writing, software
-REM  distributed under the License is distributed on an "AS IS" BASIS,
-REM  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-REM  See the License for the specific language governing permissions and
-REM  limitations under the License.
-
-if "%OS%"=="Windows_NT" @setlocal
-if "%OS%"=="WINNT" @setlocal
-
-if ""%1""=="""" goto runCommand
-
-rem Change drive and directory to %1
-if "%OS%"=="Windows_NT" goto nt_cd
-if "%OS%"=="WINNT" goto nt_cd
-cd ""%1""
-goto end_cd
-:nt_cd
-cd /d ""%1""
-:end_cd
-shift
-
-rem Slurp the command line arguments. This loop allows for an unlimited number
-rem of arguments (up to the command line limit, anyway).
-set ANT_RUN_CMD=%1
-if ""%1""=="""" goto runCommand
-shift
-:loop
-if ""%1""=="""" goto runCommand
-set ANT_RUN_CMD=%ANT_RUN_CMD% %1
-shift
-goto loop
-
-:runCommand
-rem echo %ANT_RUN_CMD%
-%ANT_RUN_CMD%
-
-if "%OS%"=="Windows_NT" @endlocal
-if "%OS%"=="WINNT" @endlocal
-
--- a/sbin/res/ant/bin/antRun.pl	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,66 +0,0 @@
-#!/usr/bin/perl
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-#  contributor license agreements.  See the NOTICE file distributed with
-#  this work for additional information regarding copyright ownership.
-#  The ASF licenses this file to You under the Apache License, Version 2.0
-#  (the "License"); you may not use this file except in compliance with
-#  the License.  You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-#  Unless required by applicable law or agreed to in writing, software
-#  distributed under the License is distributed on an "AS IS" BASIS,
-#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#  See the License for the specific language governing permissions and
-#  limitations under the License.
-#
-#######################################################################
-#
-# antRun.pl
-#
-# wrapper script for invoking commands on a platform with Perl installed
-# this is akin to antRun.bat, and antRun the SH script 
-#
-# created:         2001-10-18
-# author:          Jeff Tulley jtulley@novell.com 
-#######################################################################
-#be fussy about variables
-use strict;
-
-#turn warnings on during dev; generates a few spurious uninitialised var access warnings
-#use warnings;
-
-#and set $debug to 1 to turn on trace info (currently unused)
-my $debug=1;
-
-#######################################################################
-# change drive and directory to "%1"
-my $ANT_RUN_CMD = @ARGV[0];
-
-# assign current run command to "%2"
-chdir (@ARGV[0]) || die "Can't cd to $ARGV[0]: $!\n";
-if ($^O eq "NetWare") {
-    # There is a bug in Perl 5 on NetWare, where chdir does not
-    # do anything.  On NetWare, the following path-prefixed form should 
-    # always work. (afaict)
-    $ANT_RUN_CMD .= "/".@ARGV[1];
-}
-else {
-    $ANT_RUN_CMD = @ARGV[1];
-}
-
-# dispose of the first two arguments, leaving only the command's args.
-shift;
-shift;
-
-# run the command
-my $returnValue = system $ANT_RUN_CMD, @ARGV;
-if ($returnValue eq 0) {
-    exit 0;
-}
-else {
-    # only 0 and 1 are widely recognized as exit values
-    # so change the exit value to 1
-    exit 1;
-}
--- a/sbin/res/ant/bin/antenv.cmd	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,98 +0,0 @@
-/* 
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-*/
-
-'@echo off'
-call RxFuncAdd "SysLoadFuncs", "RexxUtil", "SysLoadFuncs"
-call SysLoadFuncs
-
-/* Prepare the parameters for later use */
-parse arg argv
-mode = ''
-args = ''
-opts = ''
-cp = ''
-lcp = ''
-
-do i = 1 to words(argv)
-  param = word(argv, i)
-  select
-    when param='-lcp' then mode = 'l'
-    when param='-cp' | param='-classpath' then mode = 'c'
-    when abbrev('-opts', param, 4) then mode = 'o'
-    when abbrev('-args', param, 4) then mode = 'a'
-  otherwise
-    select
-      when mode = 'a' then args = space(args param, 1)
-      when mode = 'c' then cp = space(cp param, 1)
-      when mode = 'l' then lcp = space(lcp param, 1)
-      when mode = 'o' then opts = space(opts param, 1)
-    otherwise
-      say 'Option' param 'ignored'
-    end
-  end
-end
-
-env="OS2ENVIRONMENT"
-antconf = _getenv_('antconf' 'antconf.cmd')
-runrc = _getenv_('runrc')
-interpret 'call "' || runrc || '"' '"' || antconf || '"' 'ETC'
-ANT_HOME = value('ANT_HOME',,env)
-JAVA_HOME = value('JAVA_HOME',,env)
-classpath = value('CLASSPATH',,env)
-classes = stream(JAVA_HOME || "\lib\classes.zip", "C", "QUERY EXISTS")
-if classes \= '' then classpath = prepend(classpath classes)
-classes = stream(JAVA_HOME || "\lib\tools.jar", "C", "QUERY EXISTS")
-if classes \= '' then classpath = prepend(classpath classes)
-
-classpath = prepend(classpath ANT_HOME || '\lib\ant-launcher.jar')
-'SET CLASSPATH=' || classpath
-
-/* Setting classpathes, options and arguments */
-envset = _getenv_('envset')
-if cp\=''   then interpret 'call "' || envset || '"' '"; CLASSPATH"' '"' || cp || '"'
-if lcp\=''  then interpret 'call "' || envset || '"' '"; LOCALCLASSPATH"' '"' || lcp || '"'
-if opts\='' then interpret 'call "' || envset || '"' '"-D ANT_OPTS"' '"' || opts || '"'
-if args\='' then interpret 'call "' || envset || '"' '"ANT_ARGS"' '"' || args || '"'
-
-exit 0
-
-addpath: procedure
-parse arg path elem
-if elem = '' then do
-  if path\='' & right(path, 1)\=';' then path = path || ';'
-  return path
-end
-if substr(path, length(path)) = ';' then glue = ''
-else glue = ';'
-if pos(translate(elem), translate(path)) = 0 then path = path || glue || elem || ';'
-return path
-
-prepend: procedure
-parse arg path elem
-if elem = '' then do
-  if path\='' & right(path, 1)\=';' then path = path || ';'
-  return path
-end
-if pos(translate(elem), translate(path)) = 0 then path = elem || ';' || path
-return path
-
-_getenv_: procedure expose env
-parse arg envar default
-if default = '' then default = envar
-var = value(translate(envar),,env)
-if var = '' then var = default
-return var
--- a/sbin/res/ant/bin/complete-ant-cmd.pl	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,114 +0,0 @@
-#!/usr/bin/perl
-#
-#  Licensed to the Apache Software Foundation (ASF) under one or more
-#  contributor license agreements.  See the NOTICE file distributed with
-#  this work for additional information regarding copyright ownership.
-#  The ASF licenses this file to You under the Apache License, Version 2.0
-#  (the "License"); you may not use this file except in compliance with
-#  the License.  You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-#  Unless required by applicable law or agreed to in writing, software
-#  distributed under the License is distributed on an "AS IS" BASIS,
-#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#  See the License for the specific language governing permissions and
-#  limitations under the License.
-#
-# A script to allow Bash or Z-Shell to complete an Ant command-line.  
-#
-# To install for Bash 2.0 or better, add the following to ~/.bashrc:
-# 
-#     $ complete -C complete-ant-cmd ant build.sh
-#
-# To install for Z-Shell 2.5 or better, add the following to ~/.zshrc:
-#
-#     function ant_complete () {
-#         local args_line args
-#         read -l args_line
-#         set -A args $args_line
-#         set -A reply $(COMP_LINE=$args_line complete-ant-cmd ${args[1]} $1)
-#     }
-#     compctl -K ant_complete ant build.sh
-#     
-# @author Mike Williams <mikew@cortexebusiness.com.au>
-
-my $cmdLine = $ENV{'COMP_LINE'};
-my $antCmd = $ARGV[0];
-my $word = $ARGV[1];
-
-my @completions;
-if ($word =~ /^-/) {
-    list( restrict( $word, getArguments() ));
-} elsif ($cmdLine =~ /-(f|buildfile)\s+\S*$/) {
-    list( getBuildFiles($word) );
-} else {
-    list( restrict( $word, getTargets() ));
-}
-
-exit(0);
-
-sub list {
-    for (@_) {
-        print "$_\n";
-    }
-}
-
-sub restrict {
-    my ($word, @completions) = @_;
-    grep( /^\Q$word\E/, @completions );
-}
-
-sub getArguments {
-    qw(-buildfile -debug -emacs -f -find -help -listener -logfile 
-       -logger -projecthelp -quiet -verbose -version); 
-}
-
-
-sub getBuildFiles {
-    my ($word) = @_;
-    grep( /\.xml$/, glob( "$word*" ));
-}
-
-sub getTargets {
-
-    # Look for build-file
-    my $buildFile = 'build.xml';
-    if ($cmdLine =~ /-(f|buildfile)\s+(\S+)/) {
-        $buildFile = $2;
-    }
-    return () unless (-f $buildFile);
-
-    # Run "ant -projecthelp" to list targets.  Keep a cache of results in a
-    # cache-file.
-    my $cacheFile = $buildFile;
-    $cacheFile =~ s|(.*/)?(.*)|${1}.ant-targets-${2}|;
-    if ((!-e $cacheFile) || (-z $cacheFile) || (-M $buildFile) < (-M $cacheFile)) {
-        open( CACHE, '>'.$cacheFile ) || die "can\'t write $cacheFile: $!\n";
-        open( HELP, "$antCmd -projecthelp -f '$buildFile'|" ) || return(); 
-        my %targets;
-        while( <HELP> ) {
-            if (/^\s+(\S+)/) {
-                $targets{$1}++;
-            }
-        }
-        my @targets = sort keys %targets;
-        for (@targets) { print CACHE "$_\n"; }
-        return @targets;
-    }
-    
-    # Read the target-cache
-    open( CACHE, $cacheFile ) || die "can\'t read $cacheFile: $!\n";
-    my @targets;
-    while (<CACHE>) {
-        chop;
-        s/\r$//;  # for Cygwin
-        push( @targets, $_ );
-    }
-    close( CACHE );
-    @targets;
-
-}
-
-
-
--- a/sbin/res/ant/bin/envset.cmd	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,131 +0,0 @@
-/*
-
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-
-SET environment variables
-First optional parameter:
-   ;     parameters are considered parts of a path variable, semicolons are
-         appended to each element if not already present
-   -D    parameters are properties for Java or Makefile etc., -D will be
-         prepended and the parameters will be separated by a space
-   =D    the same as above but equal sign is not required
-   ,     parameters should be comma separated in the environment variable
-   -     parameters should be separated by the next parameter
-   Other values mean that the first parameter is missing and the environment
-   variable will be set to the space separated parameters
-
-Second parameter: name of the environment variable
-
-Next parameters: values
-; implies that the equal sign is considered a part of the parameter and is
-not interpreted
-
--D requires parameters in the form name=value. If the equal sign is not found,
-the parameters are changed to name=expanded_name
-
-Other options have optional equal sign. If it is found, only the part after
-the equal sign will be oprionally expanded.
-
-If the parameter is the minus sign, the next parameter will not be expanded.
-If the parameter is a single dot, it will be replaced with the value of the
-environment variable as it existed before envset was invoked.
-
-For other parameters the batch looks for the environment variable with the
-same name (in uppercase). If it is found, it forms the expanded_name. If
-the environment variable with such a name does not exist, the expanded_name
-will hold the parameter name without case conversion.
-*/
-
-parse arg mode envar args
-
-equal = 0
-sep = ' '
-
-/* Parse command line parameters */
-select
-  when mode='-' then do
-    sep = envar
-    parse var args envar args
-  end
-  when mode=';' then do
-    sep = ''
-    equal = -1
-  end
-  when mode='-D' then equal = 1
-  when mode='=D' then mode = '-D'
-  when mode=',' then sep = ','
-otherwise
-  args = envar args
-  envar = mode
-  mode = ''
-end
-
-env = 'OS2ENVIRONMENT'
-envar = translate(envar)
-orig = value(envar,,env)
-newval = ''
-expand = 1
-
-/* for each parameter... */
-do i = 1 to words(args)
-  if expand > 0 & word(args, i) = '-' then expand = 0
-  else call addval word(args, i)
-end
-
-/* Optionally enclose path variable by quotes */
-if mode = ';' & pos(' ', newval) > 0 then newval = '"' || newval || '"'
-
-/* Set the new value, 'SET' cannot be used since it does not allow '=' */
-x = value(envar, newval, env)
-exit 0
-
-addval: procedure expose sep equal orig expand newval mode env
-parse arg var
-
-if var = '.' then expvar = orig
-else do
-  if equal >= 0 then do
-    parse var var name '=' val
-    if val = '' then var = name
-    else var = val
-  end
-  if expand = 0 then expvar = var
-  else expvar = value(translate(var),,env)
-  if expvar = '' then expvar = var
-  if equal >= 0 then do
-    if val = '' then do
-      parse var expvar key '=' val
-      if val <> '' then name = key
-      else do
-        if equal > 0 then val = key
-        else name = key
-      end
-    end
-    else val = expvar
-    if pos(' ', val) > 0 | pos('=', val) > 0 then val = '"' || val || '"'
-    if val = '' then expvar = name
-    else expvar = name || '=' || val
-  end
-  if mode = '-D' then expvar = '-D' || expvar
-  if mode = ';' then do
-    if right(expvar, 1) <> ';' then expvar = expvar || ';'
-  end
-end
-
-if newval = '' then newval = expvar
-else newval = newval || sep || expvar
-expand = 1
-return
--- a/sbin/res/ant/bin/lcp.bat	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,31 +0,0 @@
-REM
-REM  Licensed to the Apache Software Foundation (ASF) under one or more
-REM  contributor license agreements.  See the NOTICE file distributed with
-REM  this work for additional information regarding copyright ownership.
-REM  The ASF licenses this file to You under the Apache License, Version 2.0
-REM  (the "License"); you may not use this file except in compliance with
-REM  the License.  You may obtain a copy of the License at
-REM 
-REM      http://www.apache.org/licenses/LICENSE-2.0
-REM 
-REM  Unless required by applicable law or agreed to in writing, software
-REM  distributed under the License is distributed on an "AS IS" BASIS,
-REM  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-REM  See the License for the specific language governing permissions and
-REM  limitations under the License.
-REM
-REM
-
-set _CLASSPATHCOMPONENT=%1
-if ""%1""=="""" goto gotAllArgs
-shift
-
-:argCheck
-if ""%1""=="""" goto gotAllArgs
-set _CLASSPATHCOMPONENT=%_CLASSPATHCOMPONENT% %1
-shift
-goto argCheck
-
-:gotAllArgs
-set LOCALCLASSPATH=%LOCALCLASSPATH%;%_CLASSPATHCOMPONENT%
-
--- a/sbin/res/ant/bin/runant.pl	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,153 +0,0 @@
-#!/usr/bin/perl
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-#  contributor license agreements.  See the NOTICE file distributed with
-#  this work for additional information regarding copyright ownership.
-#  The ASF licenses this file to You under the Apache License, Version 2.0
-#  (the "License"); you may not use this file except in compliance with
-#  the License.  You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-#  Unless required by applicable law or agreed to in writing, software
-#  distributed under the License is distributed on an "AS IS" BASIS,
-#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#  See the License for the specific language governing permissions and
-#  limitations under the License.
-#
-#######################################################################
-#
-# runant.pl
-#
-# wrapper script for invoking ant in a platform with Perl installed
-# this may include cgi-bin invocation, which is considered somewhat daft.
-# (slo: that should be a separate file which can be derived from this
-# and returns the XML formatted output)
-#
-# the code is not totally portable due to classpath and directory splitting
-# issues. oops. (NB, use File::Spec::Functions  will help and the code is
-# structured for the catfile() call, but because of perl version funnies
-# the code is not included. 
-#
-# created:         2000-8-24
-# author:          Steve Loughran steve_l@sourceforge.net
-#######################################################################
-#
-# Assumptions:
-#
-# - the "java" executable/script is on the command path
-# - ANT_HOME has been set
-# - target platform uses ":" as classpath separator or perl indicates it is dos/win32
-# - target platform uses "/" as directory separator.
-
-#be fussy about variables
-use strict;
-
-#platform specifics (disabled)
-#use File::Spec::Functions;
-
-#turn warnings on during dev; generates a few spurious uninitialised var access warnings
-#use warnings;
-
-#and set $debug to 1 to turn on trace info
-my $debug=1;
-
-#######################################################################
-#
-# check to make sure environment is setup
-#
-
-my $HOME = $ENV{ANT_HOME};
-if ($HOME eq "")
-        {
-    die "\n\nANT_HOME *MUST* be set!\n\n";
-        }
-
-my $JAVACMD = $ENV{JAVACMD};
-$JAVACMD = "java" if $JAVACMD eq "";
-
-my $onnetware = 0;
-if ($^O eq "NetWare")
-{
-  $onnetware = 1;
-}
-
-my $oncygwin = ($^O eq "cygwin");
-
-#ISSUE: what java wants to split up classpath varies from platform to platform 
-#and perl is not too hot at hinting which box it is on.
-#here I assume ":" 'cept on win32, dos, and netware. Add extra tests here as needed.
-my $s=":";
-if(($^O eq "MSWin32") || ($^O eq "dos") || ($^O eq "cygwin") ||
-   ($onnetware == 1))
-        {
-        $s=";";
-        }
-
-#build up standard classpath
-my $localpath = "$HOME/lib/ant-launcher.jar";
-#set JVM options and Ant arguments, if any
-my @ANT_OPTS=split(" ", $ENV{ANT_OPTS});
-my @ANT_ARGS=split(" ", $ENV{ANT_ARGS});
-
-#jikes
-if($ENV{JIKESPATH} ne "")
-        {
-        push @ANT_OPTS, "-Djikes.class.path=$ENV{JIKESPATH}";
-        }
-
-#construct arguments to java
-my @ARGS;
-push @ARGS, @ANT_OPTS;
-
-my $CYGHOME = "";
-
-my $classpath=$ENV{CLASSPATH};
-if ($oncygwin == 1) {
-  $localpath = `cygpath --path --windows $localpath`;
-  chomp ($localpath);
-  if (! $classpath eq "")
-  {
-    $classpath = `cygpath --path --windows "$classpath"`;
-    chomp ($classpath);
-  }
-  $HOME = `cygpath --path --windows $HOME`;
-  chomp ($HOME);
-  $CYGHOME = `cygpath --path --windows $ENV{HOME}`;
-  chomp ($CYGHOME);
-}
-push @ARGS, "-classpath", "$localpath";
-push @ARGS, "-Dant.home=$HOME";
-if ( ! $CYGHOME eq "" )
-{
-  push @ARGS, "-Dcygwin.user.home=\"$CYGHOME\""
-}
-push @ARGS, "org.apache.tools.ant.launch.Launcher", @ANT_ARGS;
-push @ARGS, @ARGV;
-if (! $classpath eq "")
-{
-  if ($onnetware == 1)
-  {
-    # make classpath literally $CLASSPATH
-    # this is to avoid pushing us over the 512 character limit
-    # even skip the ; - that is already in $localpath
-    push @ARGS, "-lib", "\$CLASSPATH";
-  }
-  else
-  {
-    push @ARGS, "-lib", "$classpath";
-  }
-}
-print "\n $JAVACMD @ARGS\n\n" if ($debug);
-
-my $returnValue = system $JAVACMD, @ARGS;
-if ($returnValue eq 0)
-        {
-        exit 0;
-        }
-else
-        {
-        # only 0 and 1 are widely recognized as exit values
-        # so change the exit value to 1
-        exit 1;
-        }
--- a/sbin/res/ant/bin/runant.py	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,102 +0,0 @@
-#!/usr/bin/python
-# Licensed to the Apache Software Foundation (ASF) under one or more
-#  contributor license agreements.  See the NOTICE file distributed with
-#  this work for additional information regarding copyright ownership.
-#  The ASF licenses this file to You under the Apache License, Version 2.0
-#  (the "License"); you may not use this file except in compliance with
-#  the License.  You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-#  Unless required by applicable law or agreed to in writing, software
-#  distributed under the License is distributed on an "AS IS" BASIS,
-#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#  See the License for the specific language governing permissions and
-#  limitations under the License.
-#
-
-"""
-
- runant.py
-
-    This script is a translation of the runant.pl written by Steve Loughran.
-    It runs ant with/out arguments, it should be quite portable (thanks to
-    the python os library)
-    This script has been tested with Python2.0/Win2K
-
- created:         2001-04-11
- author:          Pierre Dittgen pierre.dittgen@criltelecom.com
-
- Assumptions:
-
- - the "java" executable/script is on the command path
-"""
-import os, os.path, string, sys
-
-# Change it to 1 to get extra debug information
-debug = 0
-
-#######################################################################
-
-# If ANT_HOME is not set default to script's parent directory
-if os.environ.has_key('ANT_HOME'):
-    ANT_HOME = os.environ['ANT_HOME']
-else:
-    ANT_HOME = os.path.dirname(os.path.dirname(os.path.abspath(sys.argv[0])))
-
-# set ANT_LIB location
-ANT_LIB = os.path.join(ANT_HOME, 'lib')
-
-# set JAVACMD (check variables JAVACMD and JAVA_HOME)
-JAVACMD = None
-if not os.environ.has_key('JAVACMD'):
-    if os.environ.has_key('JAVA_HOME'):
-        if not os.path.exists(os.environ['JAVA_HOME']):
-            print "Warning: JAVA_HOME is not defined correctly."
-        else:
-            JAVACMD = os.path.join(os.environ['JAVA_HOME'], 'bin', 'java')
-    else:
-        print "Warning: JAVA_HOME not set."
-else:
-    JAVACMD = os.environ['JAVACMD']
-if not JAVACMD:
-    JAVACMD = 'java'
-
-launcher_jar = os.path.join(ANT_LIB, 'ant-launcher.jar')
-if not os.path.exists(launcher_jar):
-    print 'Warning: Unable to locate ant-launcher.jar. Expected to find it in %s' % \
-        ANT_LIB
-
-# Build up standard classpath (LOCALCLASSPATH)
-LOCALCLASSPATH = launcher_jar
-if os.environ.has_key('LOCALCLASSPATH'):
-    LOCALCLASSPATH += os.pathsep + os.environ['LOCALCLASSPATH']
-
-ANT_OPTS = ""
-if os.environ.has_key('ANT_OPTS'):
-    ANT_OPTS = os.environ['ANT_OPTS']
-
-OPTS = ""
-if os.environ.has_key('JIKESPATH'):
-    OPTS = '-Djikes.class.path=\"%s\"' % os.environ['JIKESPATH']
-
-ANT_ARGS = ""
-if os.environ.has_key('ANT_ARGS'):
-    ANT_ARGS = os.environ['ANT_ARGS']
-
-CLASSPATH = ""
-if os.environ.has_key('CLASSPATH'):
-    CLASSPATH = "-lib " + os.environ['CLASSPATH']
-
-# Builds the commandline
-cmdline = ('%s %s -classpath %s -Dant.home=%s %s ' + \
-    'org.apache.tools.ant.launch.Launcher %s %s %s') \
-     % (JAVACMD, ANT_OPTS, LOCALCLASSPATH, ANT_HOME, OPTS, ANT_ARGS, \
-        CLASSPATH, string.join(sys.argv[1:], ' '))
-
-if debug:
-    print '\n%s\n\n' % (cmdline)
-sys.stdout.flush()
-
-# Run the biniou!
-os.system(cmdline)
--- a/sbin/res/ant/bin/runrc.cmd	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,60 +0,0 @@
-/* 
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-
-   Run RC file, name is in the first arg, second arg is either PATH
-   ENV  or -r or nothing 
-*/
-
-parse arg name path rest
-
-if name = '' then do
-  say 'RC file name is missing'
-  exit 1
-end
-
-if rest \= '' then do
-  say 'Too many parameters'
-  exit 1
-end
-
-call runit name path
-exit 0
-
-runit: procedure
-parse arg name path dir
-
-if path \= '' & path \= '-r' then do
-  dir = value(translate(path),,'OS2ENVIRONMENT')
-  if dir = '' then return
-  dir = translate(dir, '\', '/') /* change UNIX-like path to OS/2 */
-end
-
-if dir = '' then dir = directory()
-
-if path = '-r' then do /* recursive call */
-  subdir = filespec('path', dir)
-  if subdir \= '\' then do
-    subdir = left(subdir, length(subdir)-1)
-    call runit name path filespec('drive', dir) || subdir
-  end
-end
-
-/* Look for the file and run it */
-if right(dir, 1) \= '\' then dir = dir || '\'
-rcfile = stream(dir || name, 'c', 'query exists')
-if rcfile \= '' then interpret 'call "' || rcfile || '"'
-
-return
--- a/sbin/res/ant/lib/README	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-Please refer to the Ant manual under Installing Ant / Library
-Dependencies for a list of the jar requirements for various optional
-tasks and features.
Binary file sbin/res/ant/lib/ant-antlr.jar has changed
--- a/sbin/res/ant/lib/ant-antlr.pom	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,76 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
--->
-<!--
-  This POM has been created manually by the Ant Development Team.
-  Please contact us if you are not satisfied with the data contained in this POM.
-  URL : http://ant.apache.org
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <parent>
-    <groupId>org.apache.ant</groupId>
-    <artifactId>ant-parent</artifactId>
-    <relativePath>../pom.xml</relativePath>
-    <version>1.8.2</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>org.apache.ant</groupId>
-  <artifactId>ant-antlr</artifactId>
-  <version>1.8.2</version>
-  <name>Apache Ant + ANTLR</name>
-  <description>antlr specific task.
-    The implementation forks a java process, therefore the antlr jar file is only needed at runtime</description>
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.ant</groupId>
-      <artifactId>ant</artifactId>
-      <version>1.8.2</version>
-      <optional>true</optional>
-      <scope>compile</scope>
-    </dependency>
-    <dependency>
-      <!-- add a dependency with antlr 2.7.2 consistent with libraries.properties antlr 2.7.6 is also available on ibiblio-->
-      <groupId>antlr</groupId>
-      <artifactId>antlr</artifactId>
-      <version>2.7.2</version>
-      <optional>true</optional>
-      <scope>runtime</scope>
-    </dependency>
-  </dependencies>
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <configuration>
-          <source>1.4</source>
-          <target>1.4</target>
-          <includes>
-            <include>org/apache/tools/ant/taskdefs/optional/ANTLR*</include>
-          </includes>
-        </configuration>
-      </plugin>
-    </plugins>
-    <sourceDirectory>../../../../src/main</sourceDirectory>
-    <testSourceDirectory>../../../../src/testcases</testSourceDirectory>
-    <outputDirectory>../../../../target/${project.artifactId}/classes</outputDirectory>
-    <testOutputDirectory>../../../../target/${project.artifactId}/testcases</testOutputDirectory>
-    <directory>../../../../target/${project.artifactId}</directory>
-  </build>
-</project>
Binary file sbin/res/ant/lib/ant-apache-bcel.jar has changed
--- a/sbin/res/ant/lib/ant-apache-bcel.pom	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
--->
-<!--
-  This POM has been created manually by the Ant Development Team.
-  Please contact us if you are not satisfied with the data contained in this POM.
-  URL : http://ant.apache.org
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <parent>
-    <groupId>org.apache.ant</groupId>
-    <artifactId>ant-parent</artifactId>
-    <relativePath>../pom.xml</relativePath>
-    <version>1.8.2</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>org.apache.ant</groupId>
-  <artifactId>ant-apache-bcel</artifactId>
-  <version>1.8.2</version>
-  <name>Apache Ant + BCEL</name>
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.ant</groupId>
-      <artifactId>ant</artifactId>
-      <version>1.8.2</version>
-      <scope>compile</scope>
-    </dependency>
-    <dependency>
-      <groupId>bcel</groupId>
-      <artifactId>bcel</artifactId>
-      <version>5.1</version>
-      <scope>compile</scope>
-    </dependency>
-  </dependencies>
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <configuration>
-          <source>1.4</source>
-          <target>1.4</target>
-          <includes>
-            <include>org/apache/tools/ant/filters/util/JavaClassHelper*</include>
-            <include>org/apache/tools/ant/util/depend/bcel/*</include>
-          </includes>
-        </configuration>
-      </plugin>
-    </plugins>
-    <sourceDirectory>../../../../src/main</sourceDirectory>
-    <testSourceDirectory>../../../../src/testcases</testSourceDirectory>
-    <outputDirectory>../../../../target/${project.artifactId}/classes</outputDirectory>
-    <testOutputDirectory>../../../../target/${project.artifactId}/testcases</testOutputDirectory>
-    <directory>../../../../target/${project.artifactId}</directory>
-  </build>
-</project>
Binary file sbin/res/ant/lib/ant-apache-bsf.jar has changed
--- a/sbin/res/ant/lib/ant-apache-bsf.pom	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,75 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
--->
-<!--
-  This POM has been created manually by the Ant Development Team.
-  Please contact us if you are not satisfied with the data contained in this POM.
-  URL : http://ant.apache.org
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <parent>
-    <groupId>org.apache.ant</groupId>
-    <artifactId>ant-parent</artifactId>
-    <relativePath>../pom.xml</relativePath>
-    <version>1.8.2</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>org.apache.ant</groupId>
-  <artifactId>ant-apache-bsf</artifactId>
-  <version>1.8.2</version>
-  <name>Apache Ant + BSF</name>
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.ant</groupId>
-      <artifactId>ant</artifactId>
-      <version>1.8.2</version>
-      <scope>compile</scope>
-    </dependency>
-    <dependency>
-      <groupId>bsf</groupId>
-      <artifactId>bsf</artifactId>
-      <version>2.4.0</version>
-      <scope>compile</scope>
-    </dependency>
-  </dependencies>
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <configuration>
-          <source>1.4</source>
-          <target>1.4</target>
-          <includes>
-            <include>org/apache/tools/ant/taskdefs/optional/Script*</include>
-            <include>org/apache/tools/ant/taskdefs/optional/script/**</include>
-            <include>org/apache/tools/ant/types/optional/*Script*</include>
-            <include>org/apache/tools/ant/util/Script*</include>
-            <include>org/apache/tools/ant/util/optional/Script*</include>
-          </includes>
-        </configuration>
-      </plugin>
-    </plugins>
-    <sourceDirectory>../../../../src/main</sourceDirectory>
-    <testSourceDirectory>../../../../src/testcases</testSourceDirectory>
-    <outputDirectory>../../../../target/${project.artifactId}/classes</outputDirectory>
-    <testOutputDirectory>../../../../target/${project.artifactId}/testcases</testOutputDirectory>
-    <directory>../../../../target/${project.artifactId}</directory>
-  </build>
-</project>
Binary file sbin/res/ant/lib/ant-apache-log4j.jar has changed
--- a/sbin/res/ant/lib/ant-apache-log4j.pom	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,70 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
--->
-<!--
-  This POM has been created manually by the Ant Development Team.
-  Please contact us if you are not satisfied with the data contained in this POM.
-  URL : http://ant.apache.org
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
-xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <parent>
-    <groupId>org.apache.ant</groupId>
-    <artifactId>ant-parent</artifactId>
-    <relativePath>../pom.xml</relativePath>
-    <version>1.8.2</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>org.apache.ant</groupId>
-  <artifactId>ant-apache-log4j</artifactId>
-  <version>1.8.2</version>
-  <name>Apache Ant + Log4J</name>
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.ant</groupId>
-      <artifactId>ant</artifactId>
-      <version>1.8.2</version>
-      <scope>compile</scope>
-    </dependency>
-    <dependency>
-      <groupId>log4j</groupId>
-      <artifactId>log4j</artifactId>
-      <version>1.2.13</version>
-      <scope>compile</scope>
-    </dependency>
-  </dependencies>
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <configuration>
-          <source>1.4</source>
-          <target>1.4</target>
-          <includes>
-            <include>org/apache/tools/ant/listener/Log4jListener*</include>
-          </includes>
-        </configuration>
-      </plugin>
-    </plugins>
-    <sourceDirectory>../../../../src/main</sourceDirectory>
-    <testSourceDirectory>../../../../src/testcases</testSourceDirectory>
-    <outputDirectory>../../../../target/${project.artifactId}/classes</outputDirectory>
-    <testOutputDirectory>../../../../target/${project.artifactId}/testcases</testOutputDirectory>
-    <directory>../../../../target/${project.artifactId}</directory>
-  </build>
-</project>
Binary file sbin/res/ant/lib/ant-apache-oro.jar has changed
--- a/sbin/res/ant/lib/ant-apache-oro.pom	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,75 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
--->
-<!--
-  This POM has been created manually by the Ant Development Team.
-  Please contact us if you are not satisfied with the data contained in this POM.
-  URL : http://ant.apache.org
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <parent>
-    <groupId>org.apache.ant</groupId>
-    <artifactId>ant-parent</artifactId>
-    <relativePath>../pom.xml</relativePath>
-    <version>1.8.2</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>org.apache.ant</groupId>
-  <artifactId>ant-apache-oro</artifactId>
-  <version>1.8.2</version>
-  <name>Apache Ant + Apache Oro</name>
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.ant</groupId>
-      <artifactId>ant</artifactId>
-      <version>1.8.2</version>
-      <scope>compile</scope>
-    </dependency>
-    <dependency>
-      <groupId>oro</groupId>
-      <artifactId>oro</artifactId>
-      <version>2.0.8</version>
-      <scope>compile</scope>
-    </dependency>
-  </dependencies>
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <configuration>
-          <source>1.4</source>
-          <target>1.4</target>
-          <includes>
-            <include>org/apache/tools/ant/util/regexp/JakartaOro*</include>
-            <include>org/apache/tools/ant/taskdefs/optional/perforce/*</include>
-          </includes>
-          <testIncludes>
-            <include>org/apache/tools/ant/taskdefs/optional/perforce/*</include>
-          </testIncludes>
-        </configuration>
-      </plugin>
-    </plugins>
-    <sourceDirectory>../../../../src/main</sourceDirectory>
-    <testSourceDirectory>../../../../src/testcases</testSourceDirectory>
-    <outputDirectory>../../../../target/${project.artifactId}/classes</outputDirectory>
-    <testOutputDirectory>../../../../target/${project.artifactId}/testcases</testOutputDirectory>
-    <directory>../../../../target/${project.artifactId}</directory>
-  </build>
-</project>
Binary file sbin/res/ant/lib/ant-apache-regexp.jar has changed
--- a/sbin/res/ant/lib/ant-apache-regexp.pom	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,71 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
--->
-<!--
-  This POM has been created manually by the Ant Development Team.
-  Please contact us if you are not satisfied with the data contained in this POM.
-  URL : http://ant.apache.org
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
-xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <parent>
-    <groupId>org.apache.ant</groupId>
-    <artifactId>ant-parent</artifactId>
-    <relativePath>../pom.xml</relativePath>
-    <version>1.8.2</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>org.apache.ant</groupId>
-  <artifactId>ant-apache-regexp</artifactId>
-  <version>1.8.2</version>
-  <name>Apache Ant + Apache Regexp</name>
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.ant</groupId>
-      <artifactId>ant</artifactId>
-      <version>1.8.2</version>
-      <scope>compile</scope>
-    </dependency>
-    <dependency>
-      <groupId>regexp</groupId>
-      <artifactId>regexp</artifactId>
-      <version>1.3</version>
-      <scope>compile</scope>
-    </dependency>
-  </dependencies>
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <configuration>
-          <source>1.4</source>
-          <target>1.4</target>
-          <includes>
-            <include>org/apache/tools/ant/util/regexp/JakartaRegexp*</include>
-          </includes>
-        </configuration>
-      </plugin>
-    </plugins>
-    <sourceDirectory>../../../../src/main</sourceDirectory>
-    <testSourceDirectory>../../../../src/testcases</testSourceDirectory>
-    <outputDirectory>../../../../target/${project.artifactId}/classes</outputDirectory>
-    <testOutputDirectory>../../../../target/${project.artifactId}/testcases</testOutputDirectory>
-    <directory>../../../../target/${project.artifactId}</directory>
-  </build>
-  
-</project>
Binary file sbin/res/ant/lib/ant-apache-resolver.jar has changed
--- a/sbin/res/ant/lib/ant-apache-resolver.pom	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,70 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
--->
-<!--
-  This POM has been created manually by the Ant Development Team.
-  Please contact us if you are not satisfied with the data contained in this POM.
-  URL : http://ant.apache.org
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
-xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <parent>
-    <groupId>org.apache.ant</groupId>
-    <artifactId>ant-parent</artifactId>
-    <relativePath>../pom.xml</relativePath>
-    <version>1.8.2</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>org.apache.ant</groupId>
-  <artifactId>ant-apache-resolver</artifactId>
-  <version>1.8.2</version>
-  <name>Apache Ant + Apache Resolver</name>
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.ant</groupId>
-      <artifactId>ant</artifactId>
-      <version>1.8.2</version>
-      <scope>compile</scope>
-    </dependency>
-    <dependency>
-      <groupId>xml-resolver</groupId>
-      <artifactId>xml-resolver</artifactId>
-      <version>1.1</version>
-      <scope>compile</scope>
-    </dependency>
-  </dependencies>
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <configuration>
-          <source>1.4</source>
-          <target>1.4</target>
-          <includes>
-            <include>org/apache/tools/ant/types/resolver/**</include>
-          </includes>
-        </configuration>
-      </plugin>
-    </plugins>
-    <sourceDirectory>../../../../src/main</sourceDirectory>
-    <testSourceDirectory>../../../../src/testcases</testSourceDirectory>
-    <outputDirectory>../../../../target/${project.artifactId}/classes</outputDirectory>
-    <testOutputDirectory>../../../../target/${project.artifactId}/testcases</testOutputDirectory>
-    <directory>../../../../target/${project.artifactId}</directory>
-  </build>
-</project>
Binary file sbin/res/ant/lib/ant-apache-xalan2.jar has changed
--- a/sbin/res/ant/lib/ant-apache-xalan2.pom	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,95 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
--->
-<!--
-  This POM has been created manually by the Ant Development Team.
-  Please contact us if you are not satisfied with the data contained in this POM.
-  URL : http://ant.apache.org
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
-xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <parent>
-    <groupId>org.apache.ant</groupId>
-    <artifactId>ant-parent</artifactId>
-    <relativePath>../pom.xml</relativePath>
-    <version>1.8.2</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>org.apache.ant</groupId>
-  <artifactId>ant-apache-xalan2</artifactId>
-  <version>1.8.2</version>
-  <name>Apache Ant + Xalan 2</name>
-  <description>contains Xalan2-specific features</description>
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.ant</groupId>
-      <artifactId>ant</artifactId>
-      <version>1.8.2</version>
-      <scope>compile</scope>
-    </dependency>
-    <dependency>
-      <groupId>xalan</groupId>
-      <artifactId>xalan</artifactId>
-      <version>2.7.1</version>
-      <scope>compile</scope>
-    </dependency>
-  </dependencies>
-  <build>
-    <plugins>
-      <plugin>
-        <artifactId>maven-antrun-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>create-timestamp-file</id>
-            <phase>generate-resources</phase>
-            <goals>
-              <goal>run</goal>
-            </goals>
-            <configuration>
-              <tasks>
-                <mkdir dir="${project.build.outputDirectory}"/>
-                <copy todir="${project.build.outputDirectory}/org/apache/tools/ant/taskdefs/optional/junit/xsl">
-                  <fileset dir="${project.build.sourceDirectory}/../etc">
-                    <include name="junit-frames.xsl"/>
-                    <include name="junit-noframes.xsl"/>
-                  </fileset>
-                </copy>              
-              </tasks>
-            </configuration>
-          </execution>
-
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <configuration>
-          <source>1.4</source>
-          <target>1.4</target>
-          <includes>
-            <include>org/apache/tools/ant/taskdefs/optional/Xalan2TraceSupport*</include>
-          </includes>
-        </configuration>
-      </plugin>
-    </plugins>
-    <sourceDirectory>../../../../src/main</sourceDirectory>
-    <testSourceDirectory>../../../../src/testcases</testSourceDirectory>
-    <outputDirectory>../../../../target/${project.artifactId}/classes</outputDirectory>
-    <testOutputDirectory>../../../../target/${project.artifactId}/testcases</testOutputDirectory>
-    <directory>../../../../target/${project.artifactId}</directory>
-  </build>
-</project>
Binary file sbin/res/ant/lib/ant-commons-logging.jar has changed
--- a/sbin/res/ant/lib/ant-commons-logging.pom	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,71 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
--->
-<!--
-  This POM has been created manually by the Ant Development Team.
-  Please contact us if you are not satisfied with the data contained in this POM.
-  URL : http://ant.apache.org
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
-xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <parent>
-    <groupId>org.apache.ant</groupId>
-    <artifactId>ant-parent</artifactId>
-    <relativePath>../pom.xml</relativePath>
-    <version>1.8.2</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>org.apache.ant</groupId>
-  <artifactId>ant-commons-logging</artifactId>
-  <version>1.8.2</version>
-  <name>Apache Ant + Commons Logging</name>
-  <description>Ant Listener based on commons-logging</description>
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.ant</groupId>
-      <artifactId>ant</artifactId>
-      <version>1.8.2</version>
-      <scope>compile</scope>
-    </dependency>
-    <dependency>
-      <groupId>commons-logging</groupId>
-      <artifactId>commons-logging-api</artifactId>
-      <version>1.0.4</version>
-      <scope>compile</scope>
-    </dependency>
-  </dependencies>
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <configuration>
-          <source>1.4</source>
-          <target>1.4</target>
-          <includes>
-            <include>org/apache/tools/ant/tlistener/CommonsLoggingListener*</include>
-          </includes>
-        </configuration>
-      </plugin>
-    </plugins>
-    <sourceDirectory>../../../../src/main</sourceDirectory>
-    <testSourceDirectory>../../../../src/testcases</testSourceDirectory>
-    <outputDirectory>../../../../target/${project.artifactId}/classes</outputDirectory>
-    <testOutputDirectory>../../../../target/${project.artifactId}/testcases</testOutputDirectory>
-    <directory>../../../../target/${project.artifactId}</directory>
-  </build>
-</project>
Binary file sbin/res/ant/lib/ant-commons-net.jar has changed
--- a/sbin/res/ant/lib/ant-commons-net.pom	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,76 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
--->
-<!--
-  This POM has been created manually by the Ant Development Team.
-  Please contact us if you are not satisfied with the data contained in this POM.
-  URL : http://ant.apache.org
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
-xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <parent>
-    <groupId>org.apache.ant</groupId>
-    <artifactId>ant-parent</artifactId>
-    <relativePath>../pom.xml</relativePath>
-    <version>1.8.2</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>org.apache.ant</groupId>
-  <artifactId>ant-commons-net</artifactId>
-  <version>1.8.2</version>
-  <name>Apache Ant + Commons Net</name>
-  <description>ftp, rexec and telnet tasks</description>
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.ant</groupId>
-      <artifactId>ant</artifactId>
-      <version>1.8.2</version>
-      <scope>compile</scope>
-    </dependency>
-    <dependency>
-      <groupId>commons-net</groupId>
-      <artifactId>commons-net</artifactId>
-      <version>1.4.0</version>
-      <scope>compile</scope>
-    </dependency>
-  </dependencies>
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <configuration>
-          <source>1.4</source>
-          <target>1.4</target>
-          <includes>
-            <include>org/apache/tools/ant/taskdefs/optional/net/FTP*</include>
-            <include>org/apache/tools/ant/taskdefs/optional/net/RExec*</include>
-            <include>org/apache/tools/ant/taskdefs/optional/net/TelnetTask*</include>
-          </includes>
-          <testIncludes>
-            <include>org/apache/tools/ant/taskdefs/optional/net/FTP*</include>
-          </testIncludes>
-        </configuration>
-      </plugin>
-    </plugins>
-    <sourceDirectory>../../../../src/main</sourceDirectory>
-    <testSourceDirectory>../../../../src/testcases</testSourceDirectory>
-    <outputDirectory>../../../../target/${project.artifactId}/classes</outputDirectory>
-    <testOutputDirectory>../../../../target/${project.artifactId}/testcases</testOutputDirectory>
-    <directory>../../../../target/${project.artifactId}</directory>
-  </build>
-</project>
Binary file sbin/res/ant/lib/ant-jai.jar has changed
--- a/sbin/res/ant/lib/ant-jai.pom	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,85 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
--->
-<!--
-  This POM has been created manually by the Ant Development Team.
-  Please contact us if you are not satisfied with the data contained in this POM.
-  URL : http://ant.apache.org
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <parent>
-    <groupId>org.apache.ant</groupId>
-    <artifactId>ant-parent</artifactId>
-    <relativePath>../pom.xml</relativePath>
-    <version>1.8.2</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>org.apache.ant</groupId>
-  <artifactId>ant-jai</artifactId>
-  <version>1.8.2</version>
-  <name>Apache Ant + JAI</name>
-  <description>image task and corresponding types.
-  </description>
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.ant</groupId>
-      <artifactId>ant</artifactId>
-      <version>1.8.2</version>
-      <scope>compile</scope>
-    </dependency>
-    <dependency>
-      <groupId>javax.media</groupId>
-      <artifactId>jai-core</artifactId>
-      <version>1.1.3</version>
-    </dependency>
-    <dependency>
-      <groupId>com.sun.media</groupId>
-      <artifactId>jai-codec</artifactId>
-      <version>1.1.3</version>
-    </dependency>
-  </dependencies>
-  <repositories>
-      <repository>
-          <id>jboss</id>
-          <name>JBoss</name>
-          <url>http://repository.jboss.org/maven2/</url>
-      </repository>
-  </repositories>
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <configuration>
-          <source>1.4</source>
-          <target>1.4</target>
-          <includes>
-            <include>org/apache/tools/ant/taskdefs/optional/image/*</include>
-            <include>org/apache/tools/ant/types/optional/image/*</include>
-          </includes>
-        </configuration>
-      </plugin>
-    </plugins>
-    <sourceDirectory>../../../../src/main</sourceDirectory>
-    <testSourceDirectory>../../../../src/testcases</testSourceDirectory>
-    <outputDirectory>../../../../target/${project.artifactId}/classes</outputDirectory>
-    <testOutputDirectory>../../../../target/${project.artifactId}/testcases</testOutputDirectory>
-    <directory>../../../../target/${project.artifactId}</directory>
-  </build>
-</project>
Binary file sbin/res/ant/lib/ant-javamail.jar has changed
--- a/sbin/res/ant/lib/ant-javamail.pom	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,79 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
--->
-<!--
-  This POM has been created manually by the Ant Development Team.
-  Please contact us if you are not satisfied with the data contained in this POM.
-  URL : http://ant.apache.org
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
-xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <parent>
-    <groupId>org.apache.ant</groupId>
-    <artifactId>ant-parent</artifactId>
-    <relativePath>../pom.xml</relativePath>
-    <version>1.8.2</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>org.apache.ant</groupId>
-  <artifactId>ant-javamail</artifactId>
-  <version>1.8.2</version>
-  <name>Apache Ant + JavaMail</name>
-  <description>implementation of the mail task based on javamail.
-    Required to send emails to SMTP servers using user/password combinations
-  or to send mail over SSL</description>
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.ant</groupId>
-      <artifactId>ant</artifactId>
-      <version>1.8.2</version>
-      <scope>compile</scope>
-    </dependency>
-    <dependency>
-      <groupId>javax.mail</groupId>
-      <artifactId>mail</artifactId>
-      <version>1.4</version>
-      <scope>compile</scope>
-    </dependency>
-    <dependency>
-      <groupId>javax.activation</groupId>
-      <artifactId>activation</artifactId>
-      <version>1.1</version>
-      <scope>compile</scope>
-    </dependency>
-  </dependencies> 
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <configuration>
-          <source>1.4</source>
-          <target>1.4</target>
-          <includes>
-            <include>org/apache/tools/ant/taskdefs/email/MimeMailer*</include>
-          </includes>
-        </configuration>
-      </plugin>
-    </plugins>
-    <sourceDirectory>../../../../src/main</sourceDirectory>
-    <testSourceDirectory>../../../../src/testcases</testSourceDirectory>
-    <outputDirectory>../../../../target/${project.artifactId}/classes</outputDirectory>
-    <testOutputDirectory>../../../../target/${project.artifactId}/testcases</testOutputDirectory>
-    <directory>../../../../target/${project.artifactId}</directory>
-  </build>
-</project>
Binary file sbin/res/ant/lib/ant-jdepend.jar has changed
--- a/sbin/res/ant/lib/ant-jdepend.pom	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,73 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
--->
-<!--
-  This POM has been created manually by the Ant Development Team.
-  Please contact us if you are not satisfied with the data contained in this POM.
-  URL : http://ant.apache.org
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <parent>
-    <groupId>org.apache.ant</groupId>
-    <artifactId>ant-parent</artifactId>
-    <relativePath>../pom.xml</relativePath>
-    <version>1.8.2</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>org.apache.ant</groupId>
-  <artifactId>ant-jdepend</artifactId>
-  <version>1.8.2</version>
-  <name>Apache Ant + JDepend</name>
-  <description>task jdepend invoking the jdepend parser. There is also a version 2.9.1 of the
-    jdepend parser available on the maven repository</description>
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.ant</groupId>
-      <artifactId>ant</artifactId>
-      <version>1.8.2</version>
-      <scope>compile</scope>
-    </dependency>
-    <dependency>
-      <groupId>jdepend</groupId>
-      <artifactId>jdepend</artifactId>
-      <version>2.7</version>
-      <scope>compile</scope>
-    </dependency>
-  </dependencies>
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <configuration>
-          <source>1.4</source>
-          <target>1.4</target>
-          <includes>
-            <include>org/apache/tools/ant/taskdefs/optional/jdepend/*</include>
-          </includes>
-        </configuration>
-      </plugin>
-    </plugins>
-    <sourceDirectory>../../../../src/main</sourceDirectory>
-    <testSourceDirectory>../../../../src/testcases</testSourceDirectory>
-    <outputDirectory>../../../../target/${project.artifactId}/classes</outputDirectory>
-    <testOutputDirectory>../../../../target/${project.artifactId}/testcases</testOutputDirectory>
-    <directory>../../../../target/${project.artifactId}</directory>
-  </build>
-</project>
Binary file sbin/res/ant/lib/ant-jmf.jar has changed
--- a/sbin/res/ant/lib/ant-jmf.pom	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,66 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
--->
-<!--
-  This POM has been created manually by the Ant Development Team.
-  Please contact us if you are not satisfied with the data contained in this POM.
-  URL : http://ant.apache.org
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
-xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <parent>
-    <groupId>org.apache.ant</groupId>
-    <artifactId>ant-parent</artifactId>
-    <relativePath>../pom.xml</relativePath>
-    <version>1.8.2</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>org.apache.ant</groupId>
-  <artifactId>ant-jmf</artifactId>
-  <version>1.8.2</version>
-  <name>Apache Ant + JMF</name>
-  <description>contains the sound task and a soundplayer listener
-    download the dependency from http://java.sun.com/products/java-media/jmf/</description>
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.ant</groupId>
-      <artifactId>ant</artifactId>
-      <version>1.8.2</version>
-      <scope>compile</scope>
-    </dependency>
-  </dependencies>
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <configuration>
-          <source>1.4</source>
-          <target>1.4</target>
-          <includes>
-            <include>org/apache/tools/ant/taskdefs/optional/sound/*</include>
-          </includes>
-        </configuration>
-      </plugin>
-    </plugins>
-    <sourceDirectory>../../../../src/main</sourceDirectory>
-    <testSourceDirectory>../../../../src/testcases</testSourceDirectory>
-    <outputDirectory>../../../../target/${project.artifactId}/classes</outputDirectory>
-    <testOutputDirectory>../../../../target/${project.artifactId}/testcases</testOutputDirectory>
-    <directory>../../../../target/${project.artifactId}</directory>
-  </build>
-  </project>
Binary file sbin/res/ant/lib/ant-jsch.jar has changed
--- a/sbin/res/ant/lib/ant-jsch.pom	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,75 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
--->
-<!--
-  This POM has been created manually by the Ant Development Team.
-  Please contact us if you are not satisfied with the data contained in this POM.
-  URL : http://ant.apache.org
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
-xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <parent>
-    <groupId>org.apache.ant</groupId>
-    <artifactId>ant-parent</artifactId>
-    <relativePath>../pom.xml</relativePath>
-    <version>1.8.2</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>org.apache.ant</groupId>
-  <artifactId>ant-jsch</artifactId>
-  <version>1.8.2</version>
-  <name>Apache Ant + JSch</name>
-  <description>contains the sshexec and scp tasks
-  jsch 0.1.29 might not be available from maven</description>
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.ant</groupId>
-      <artifactId>ant</artifactId>
-      <version>1.8.2</version>
-      <scope>compile</scope>
-    </dependency>
-    <dependency>
-      <groupId>com.jcraft</groupId>
-      <artifactId>jsch</artifactId>
-      <version>0.1.42</version>
-      <scope>compile</scope>
-    </dependency>
-  </dependencies>
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <configuration>
-          <source>1.4</source>
-          <target>1.4</target>
-          <includes>
-            <include>org/apache/tools/ant/taskdefs/optional/ssh/*</include>
-          </includes>
-          <testIncludes>
-            <include>org/apache/tools/ant/taskdefs/optional/ssh/*</include>
-          </testIncludes>
-        </configuration>
-      </plugin>
-    </plugins>
-    <sourceDirectory>../../../../src/main</sourceDirectory>
-    <testSourceDirectory>../../../../src/testcases</testSourceDirectory>
-    <outputDirectory>../../../../target/${project.artifactId}/classes</outputDirectory>
-    <testOutputDirectory>../../../../target/${project.artifactId}/testcases</testOutputDirectory>
-    <directory>../../../../target/${project.artifactId}</directory>
-  </build>
-</project>
Binary file sbin/res/ant/lib/ant-junit.jar has changed
--- a/sbin/res/ant/lib/ant-junit.pom	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,101 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
--->
-<!--
-  This POM has been created manually by the Ant Development Team.
-  Please contact us if you are not satisfied with the data contained in this POM.
-  URL : http://ant.apache.org
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
-xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <parent>
-    <groupId>org.apache.ant</groupId>
-    <artifactId>ant-parent</artifactId>
-    <relativePath>../pom.xml</relativePath>
-    <version>1.8.2</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>org.apache.ant</groupId>
-  <artifactId>ant-junit</artifactId>
-  <version>1.8.2</version>
-  <name>Apache Ant + JUnit</name>
-  <description>contains the junit and junirreport tasks</description>
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.ant</groupId>
-      <artifactId>ant</artifactId>
-      <version>1.8.2</version>
-      <scope>compile</scope>
-    </dependency>
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>3.8.2</version>
-      <scope>compile</scope>
-    </dependency>
-  </dependencies>
-  <build>
-    <plugins>
-      <plugin>
-        <artifactId>maven-antrun-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>create-timestamp-file</id>
-            <phase>generate-resources</phase>
-            <goals>
-              <goal>run</goal>
-            </goals>
-            <configuration>
-              <tasks>
-                <mkdir dir="${project.build.outputDirectory}"/>
-                <copy todir="${project.build.outputDirectory}/org/apache/tools/ant/taskdefs/optional/junit/xsl">
-                  <fileset dir="${project.build.sourceDirectory}/../etc">
-                    <include name="junit-frames.xsl"/>
-                    <include name="junit-noframes.xsl"/>
-                  </fileset>
-                </copy>              
-              </tasks>
-            </configuration>
-          </execution>
-
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <configuration>
-          <source>1.4</source>
-          <target>1.4</target>
-          <includes>
-            <include>org/apache/tools/ant/taskdefs/optional/junit/*</include>
-          </includes>
-          <excludes>
-            <exclude>org/apache/tools/ant/taskdefs/optional/junit/JUnit4TestMethodAdapter*</exclude>
-          </excludes>
-          <testIncludes>
-            <include>org/apache/tools/ant/taskdefs/optional/junit/</include>
-          </testIncludes>
-        </configuration>
-      </plugin>
-    </plugins>
-    <sourceDirectory>../../../../src/main</sourceDirectory>
-    <testSourceDirectory>../../../../src/testcases</testSourceDirectory>
-    <outputDirectory>../../../../target/${project.artifactId}/classes</outputDirectory>
-    <testOutputDirectory>../../../../target/${project.artifactId}/testcases</testOutputDirectory>
-    <directory>../../../../target/${project.artifactId}</directory>
-  </build>
-</project>
Binary file sbin/res/ant/lib/ant-junit4.jar has changed
--- a/sbin/res/ant/lib/ant-junit4.pom	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,71 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
--->
-<!--
-  This POM has been created manually by the Ant Development Team.
-  Please contact us if you are not satisfied with the data contained in this POM.
-  URL : http://ant.apache.org
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
-xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <parent>
-    <groupId>org.apache.ant</groupId>
-    <artifactId>ant-parent</artifactId>
-    <relativePath>../pom.xml</relativePath>
-    <version>1.8.2</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>org.apache.ant</groupId>
-  <artifactId>ant-junit4</artifactId>
-  <version>1.8.2</version>
-  <name>Apache Ant + JUnit 4</name>
-  <description>contains JUnit 4.x support</description>
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.ant</groupId>
-      <artifactId>ant</artifactId>
-      <version>1.8.2</version>
-      <scope>compile</scope>
-    </dependency>
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>4.8.1</version>
-      <scope>compile</scope>
-    </dependency>
-  </dependencies>
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <configuration>
-          <source>1.4</source>
-          <target>1.4</target>
-          <includes>
-            <include>org/apache/tools/ant/taskdefs/optional/junit/JUnit4TestMethodAdapter*</include>
-          </includes>
-        </configuration>
-      </plugin>
-    </plugins>
-    <sourceDirectory>../../../../src/main</sourceDirectory>
-    <testSourceDirectory>../../../../src/testcases</testSourceDirectory>
-    <outputDirectory>../../../../target/${project.artifactId}/classes</outputDirectory>
-    <testOutputDirectory>../../../../target/${project.artifactId}/testcases</testOutputDirectory>
-    <directory>../../../../target/${project.artifactId}</directory>
-  </build>
-</project>
Binary file sbin/res/ant/lib/ant-launcher.jar has changed
--- a/sbin/res/ant/lib/ant-launcher.pom	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,58 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
--->
-<!--
-  This POM has been created manually by the Ant Development Team.
-  Please contact us if you are not satisfied with the data contained in this POM.
-  URL : http://ant.apache.org
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <parent>
-    <groupId>org.apache.ant</groupId>
-    <artifactId>ant-parent</artifactId>
-    <relativePath>../pom.xml</relativePath>
-    <version>1.8.2</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>org.apache.ant</groupId>
-  <artifactId>ant-launcher</artifactId>
-  <version>1.8.2</version>
-  <name>Apache Ant Launcher</name>
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <configuration>
-          <source>1.4</source>
-          <target>1.4</target>
-          <includes>
-            <include>org/apache/tools/ant/launch/*.java</include>
-          </includes>
-
-        </configuration>
-      </plugin>
-    </plugins>
-    <sourceDirectory>../../../../src/main</sourceDirectory>
-    <testSourceDirectory>../../../../src/testcases</testSourceDirectory>
-    <outputDirectory>../../../../target/ant-launcher/classes</outputDirectory>
-    <testOutputDirectory>../../../../target/ant-launcher/testcases</testOutputDirectory>
-    <directory>../../../../target/ant-launcher</directory>
-  </build>
-</project>
Binary file sbin/res/ant/lib/ant-netrexx.jar has changed
--- a/sbin/res/ant/lib/ant-netrexx.pom	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,99 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
--->
-<!--
-  This POM has been created manually by the Ant Development Team.
-  Please contact us if you are not satisfied with the data contained in this POM.
-  URL : http://ant.apache.org
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
-xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <parent>
-    <groupId>org.apache.ant</groupId>
-    <artifactId>ant-parent</artifactId>
-    <relativePath>../pom.xml</relativePath>
-    <version>1.8.2</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>org.apache.ant</groupId>
-  <artifactId>ant-netrexx</artifactId>
-  <version>1.8.2</version>
-  <name>Apache Ant + NetRexx</name>
-  <description>NetRexxC task
-    dependency can be downloaded from http://www.ibm.com/software/awdtools/netrexx/download.html</description>
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.ant</groupId>
-      <artifactId>ant</artifactId>
-      <version>1.8.2</version>
-      <scope>compile</scope>
-    </dependency>
-    <!-- Processed too early, before maven-antrun-plugin gets a chance to work:
-    <dependency>
-      <groupId>com.ibm.netrexx</groupId>
-      <artifactId>netrexx</artifactId>
-      <version>2.0.5</version>
-      <scope>system</scope>
-      <systemPath>${basedir}/../../../../lib/optional/NetRexxC.jar</systemPath>
-    </dependency>
-    -->
-  </dependencies>
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <configuration>
-          <source>1.4</source>
-          <target>1.4</target>
-          <includes>
-            <include>org/apache/tools/ant/taskdefs/optional/NetRexxC*</include>
-          </includes>
-          <!-- Need to use this rather than system scope as above: -->
-          <compilerArguments>
-            <extdirs>${basedir}/../../../../lib/optional</extdirs>
-          </compilerArguments>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-antrun-plugin</artifactId>
-        <version>1.4</version>
-        <executions>
-          <execution>
-            <phase>validate</phase>
-            <configuration>
-              <tasks>
-                <ant dir="${basedir}/../../../.." antfile="fetch.xml" target="netrexx">
-                  <property name="dest" value="optional"/>
-                </ant>
-              </tasks>
-            </configuration>
-            <goals>
-              <goal>run</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-    <sourceDirectory>../../../../src/main</sourceDirectory>
-    <testSourceDirectory>../../../../src/testcases</testSourceDirectory>
-    <outputDirectory>../../../../target/${project.artifactId}/classes</outputDirectory>
-    <testOutputDirectory>../../../../target/${project.artifactId}/testcases</testOutputDirectory>
-    <directory>../../../../target/${project.artifactId}</directory>
-  </build>
-</project>
--- a/sbin/res/ant/lib/ant-parent.pom	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,120 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
--->
-<!--
-  This POM has been created manually by the Ant Development Team.
-  Please contact us if you are not satisfied with the data contained in this POM.
-  URL : http://ant.apache.org
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
-xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>org.apache.ant</groupId>
-  <artifactId>ant-parent</artifactId>
-  <version>1.8.2</version>
-  <packaging>pom</packaging>
-  <description>master POM</description>
-  <licenses>
-    <license>
-      <name>The Apache Software License, Version 2.0</name>
-      <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
-      <distribution>repo</distribution>
-    </license>
-  </licenses>
-  <name>Apache Ant</name>
-  <url>http://ant.apache.org/</url>
-  <inceptionYear>2000</inceptionYear>
-  <organization>
-    <name>The Apache Software Foundation</name>
-    <url>http://www.apache.org/</url>
-  </organization>
-  <distributionManagement>
-    <!-- Null out inherited apache distribution repo by default -->
-    <repository>
-      <id>dummy</id>
-      <name>Dummy to avoid accidental deploys</name>
-      <url></url>
-    </repository>
-  </distributionManagement>
-  <scm>
-    <connection>scm:svn:http://svn.apache.org/repos/asf/ant/core/trunk</connection>
-    <developerConnection>scm:svn:https://svn.apache.org/repos/asf/ant/core/trunk</developerConnection>
-    <url>http://svn.apache.org/repos/asf/ant/core/trunk</url>
-  </scm>
-  <ciManagement>
-    <system>hudson</system>
-    <url>https://hudson.apache.org/hudson/job/Ant_BuildFromPOMs/</url>
-  </ciManagement>
-  <mailingLists>
-    <mailingList>
-      <name>Ant Developers List</name>
-      <subscribe>dev-subscribe@ant.apache.org</subscribe>
-      <unsubscribe>dev-unsubscribe@ant.apache.org</unsubscribe>
-      <post>dev@ant.apache.org</post>
-      <archive>http://mail-archives.apache.org/mod_mbox/ant-dev</archive>
-    </mailingList>
-    <mailingList>
-      <name>Ant Users List</name>
-      <subscribe>user-subscribe@ant.apache.org</subscribe>
-      <unsubscribe>user-unsubscribe@ant.apache.org</unsubscribe>
-      <post>user@ant.apache.org</post>
-      <archive>http://mail-archives.apache.org/mod_mbox/ant-user</archive>
-    </mailingList>
-  </mailingLists>
-  <issueManagement>
-    <system>bugzilla</system>
-    <url>http://issues.apache.org/bugzilla/</url>
-  </issueManagement>
-  <modules>
-    <module>ant</module>
-    <module>ant-antlr</module>
-    <module>ant-apache-bcel</module>
-    <module>ant-apache-bsf</module>
-    <module>ant-apache-log4j</module>
-    <module>ant-apache-oro</module>
-    <module>ant-apache-regexp</module>
-    <module>ant-apache-resolver</module>
-    <module>ant-apache-xalan2</module>
-    <module>ant-commons-logging</module>
-    <module>ant-commons-net</module>
-    <module>ant-jai</module>
-    <module>ant-javamail</module>
-    <module>ant-jdepend</module>
-    <module>ant-jmf</module>
-    <module>ant-jsch</module>
-    <module>ant-junit</module>
-    <module>ant-junit4</module>
-    <module>ant-launcher</module>
-    <module>ant-netrexx</module>
-    <module>ant-swing</module>
-    <module>ant-testutil</module>
-  </modules>
-  <dependencies>
-     <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>3.8.2</version>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
-  <build>
-    <sourceDirectory>../../../src/main</sourceDirectory>
-    <testSourceDirectory>../../../src/testcases</testSourceDirectory>
-    <outputDirectory>../../../target/classes</outputDirectory>
-    <testOutputDirectory>../../../target/testcases</testOutputDirectory>
-  </build>
-</project>
Binary file sbin/res/ant/lib/ant-swing.jar has changed
--- a/sbin/res/ant/lib/ant-swing.pom	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,67 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
--->
-<!--
-  This POM has been created manually by the Ant Development Team.
-  Please contact us if you are not satisfied with the data contained in this POM.
-  URL : http://ant.apache.org
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <parent>
-    <groupId>org.apache.ant</groupId>
-    <artifactId>ant-parent</artifactId>
-    <relativePath>../pom.xml</relativePath>
-    <version>1.8.2</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>org.apache.ant</groupId>
-  <artifactId>ant-swing</artifactId>
-  <version>1.8.2</version>
-  <name>Apache Ant + Swing</name>
-  <description>a listener and a splash task based on Swing</description>
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.ant</groupId>
-      <artifactId>ant</artifactId>
-      <version>1.8.2</version>
-      <scope>compile</scope>
-    </dependency>
-  </dependencies>
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <configuration>
-          <source>1.4</source>
-          <target>1.4</target>
-          <includes>
-            <include>org/apache/tools/ant/taskdefs/optional/splash/*</include>
-          </includes>
-        </configuration>
-      </plugin>
-    </plugins>
-    <sourceDirectory>../../../../src/main</sourceDirectory>
-    <testSourceDirectory>../../../../src/testcases</testSourceDirectory>
-    <outputDirectory>../../../../target/${project.artifactId}/classes</outputDirectory>
-    <testOutputDirectory>../../../../target/${project.artifactId}/testcases</testOutputDirectory>
-    <directory>../../../../target/${project.artifactId}</directory>
-  </build>
-  
-</project>
Binary file sbin/res/ant/lib/ant-testutil.jar has changed
--- a/sbin/res/ant/lib/ant-testutil.pom	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,75 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
--->
-<!--
-  This POM has been created manually by the Ant Development Team.
-  Please contact us if you are not satisfied with the data contained in this POM.
-  URL : http://ant.apache.org
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <parent>
-    <groupId>org.apache.ant</groupId>
-    <artifactId>ant-parent</artifactId>
-    <relativePath>../pom.xml</relativePath>
-    <version>1.8.2</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>org.apache.ant</groupId>
-  <artifactId>ant-testutil</artifactId>
-  <version>1.8.2</version>
-  <name>Apache Ant Test Utilities</name>
-  <description>test utility classes</description>
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.ant</groupId>
-      <artifactId>ant</artifactId>
-      <version>1.8.2</version>
-      <scope>compile</scope>
-    </dependency>
-     <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>3.8.2</version>
-      <scope>compile</scope>
-    </dependency>
-  </dependencies>
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <configuration>
-          <source>1.4</source>
-          <target>1.4</target>
-          <includes>
-            <include>org/apache/tools/ant/BuildFileTest*</include>
-            <include>org/apache/tools/ant/util/regexp/RegexpMatcherTest*</include>
-            <include>org/apache/tools/ant/util/regexp/RegexpTest*</include>
-            <include>org/apache/tools/ant/taskdefs/optional/AbstractXSLTLiaisonTest*</include>
-            <include>org/apache/tools/ant/types/AbstractFileSetTest*</include>
-          </includes>
-        </configuration>
-      </plugin>
-    </plugins>
-    <sourceDirectory>../../../../src/tests/junit</sourceDirectory>
-    <outputDirectory>../../../../target/${project.artifactId}/classes</outputDirectory>
-    <directory>../../../../target/${project.artifactId}</directory>
-  </build>
-  
-</project>
Binary file sbin/res/ant/lib/ant.jar has changed
--- a/sbin/res/ant/lib/ant.pom	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,222 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
--->
-<!--
-  This POM has been created manually by the Ant Development Team.
-  Please contact us if you are not satisfied with the data contained in this POM.
-  URL : http://ant.apache.org
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <parent>
-    <groupId>org.apache.ant</groupId>
-    <artifactId>ant-parent</artifactId>
-    <relativePath>../pom.xml</relativePath>
-    <version>1.8.2</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>org.apache.ant</groupId>
-  <artifactId>ant</artifactId>
-  <version>1.8.2</version>
-  <name>Apache Ant Core</name>
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.ant</groupId>
-      <artifactId>ant-launcher</artifactId>
-      <version>1.8.2</version>
-      <scope>compile</scope>
-    </dependency>
-  </dependencies>
-  <build>
-    <filters>
-      <filter>../../../../target/ant/.build.timestamp.properties</filter>
-    </filters>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <configuration> </configuration>
-      </plugin>
-      <plugin>
-        <artifactId>maven-antrun-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>create-timestamp-file</id>
-            <phase>generate-resources</phase>
-            <goals>
-              <goal>run</goal>
-            </goals>
-            <configuration>
-              <tasks>
-                <tstamp/>
-                <mkdir dir="${project.build.directory}"/>
-                <touch file="${project.build.directory}/.build.timestamp.properties"/>
-                <echo file="${project.build.directory}/.build.timestamp.properties" append="false"
-                  message="TODAY=${TODAY}"/>
-              </tasks>
-            </configuration>
-          </execution>
-          <execution>
-            <id>delete-timestamp-file</id>
-            <phase>clean</phase>
-            <goals>
-              <goal>run</goal>
-            </goals>
-            <configuration>
-              <tasks>
-                <delete file="${project.build.directory}/.build.timestamp.properties"/>
-              </tasks>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <configuration>
-          <source>1.4</source>
-          <target>1.4</target>
-          <excludes>
-            <exclude>org/apache/tools/ant/filters/util/JavaClassHelper*</exclude>
-            <exclude>org/apache/tools/ant/types/resolver/**</exclude>
-            <exclude>org/apache/tools/ant/listener/Log4jListener*</exclude>
-            <exclude>org/apache/tools/ant/listener/CommonsLoggingListener*</exclude>
-            <exclude>org/apache/tools/ant/util/regexp/JakartaRegexp*</exclude>
-            <exclude>org/apache/tools/ant/util/regexp/JakartaOro*</exclude>
-            <exclude>org/apache/tools/ant/taskdefs/email/MimeMailer*</exclude>
-            <exclude>org/apache/tools/ant/launch/**</exclude>
-            <exclude>org/apache/tools/ant/taskdefs/optional/net/FTP*</exclude>
-            <exclude>org/apache/tools/ant/taskdefs/optional/net/RExec*</exclude>
-            <exclude>org/apache/tools/ant/taskdefs/optional/net/TelnetTask*</exclude>
-            <exclude>org/apache/tools/ant/taskdefs/optional/perforce/*</exclude>
-            <exclude>org/apache/tools/ant/taskdefs/optional/junit/*</exclude>
-            <exclude>org/apache/tools/ant/taskdefs/optional/ssh/*</exclude>
-            <exclude>org/apache/tools/ant/taskdefs/optional/image/*</exclude>
-            <exclude>org/apache/tools/ant/types/optional/image/*</exclude>
-            <exclude>org/apache/tools/ant/taskdefs/optional/Script*</exclude>
-            <exclude>org/apache/tools/ant/taskdefs/optional/script/**</exclude>
-            <exclude>org/apache/tools/ant/types/optional/*Script*</exclude>
-            <exclude>org/apache/tools/ant/util/ScriptRunner.java</exclude>
-            <exclude>org/apache/tools/ant/util/optional/ScriptRunner.java</exclude>
-            <exclude>org/apache/tools/ant/filters/util/JavaClassHelper*</exclude>
-            <exclude>org/apache/tools/ant/util/depend/bcel/*</exclude>
-            <exclude>org/apache/tools/ant/taskdefs/optional/NetRexxC*</exclude>
-            <exclude>org/apache/tools/ant/taskdefs/optional/Xalan2TraceSupport*</exclude>
-            <exclude>org/apache/tools/ant/taskdefs/optional/jdepend/*</exclude>
-          </excludes>
-          <testExcludes>
-            <exclude>org/apache/tools/ant/filters/util/JavaClassHelper*</exclude>
-            <exclude>org/apache/tools/ant/types/resolver/**</exclude>
-            <exclude>org/apache/tools/ant/util/Script*</exclude>
-            <exclude>org/apache/tools/ant/listener/Log4jListener*</exclude>
-            <exclude>org/apache/tools/ant/listener/CommonsLoggingListener*</exclude>
-            <exclude>org/apache/tools/ant/util/regexp/JakartaRegexp*</exclude>
-            <exclude>org/apache/tools/ant/util/regexp/JakartaOro*</exclude>
-            <exclude>org/apache/tools/ant/util/regexp/Jdk14Regexp*</exclude>
-            <exclude>org/apache/tools/ant/taskdefs/email/MimeMailer*</exclude>
-            <exclude>org/apache/tools/ant/launch/**</exclude>
-            <exclude>org/apache/tools/ant/taskdefs/StyleTest*</exclude>
-            <exclude>org/apache/tools/ant/taskdefs/optional/junit/</exclude>
-            <exclude>org/apache/tools/ant/taskdefs/optional/net/FTP*</exclude>
-            <exclude>org/apache/tools/ant/taskdefs/optional/ssh/*</exclude>
-            <exclude>org/apache/tools/ant/taskdefs/optional/perforce/*</exclude>
-          </testExcludes>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <omitBasedir>true</omitBasedir>
-          <systemProperties>
-            <property>
-              <name>ant.home</name>
-              <value>${env.ANT_HOME}</value>
-            </property>
-            <property>
-              <name>build.tests</name>
-              <value>../../../../target/ant/testcases</value>
-            </property>
-            <property>
-              <name>build.tests.value</name>
-              <value>../../../../target/ant/testcases</value>
-            </property>
-            <property>
-              <name>offline</name>
-              <value>true</value>
-            </property>
-            <property>
-              <name>root</name>
-              <value>../../../..</value>
-            </property>
-          </systemProperties>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-report-plugin</artifactId>
-      </plugin>
-    </plugins>
-    <resources>
-      <resource>
-        <directory>../../../../src/main</directory>
-        <filtering>true</filtering>
-        <includes>
-          <include>org/apache/tools/ant/taskdefs/default.properties</include>
-          <include>org/apache/tools/ant/types/default.properties</include>
-          <include>org/apache/tools/ant/taskdefs/default.properties</include>
-          <include>org/apache/tools/ant/types/conditions/antlib.xml</include>
-          <include>org/apache/tools/ant/defaultManifest.mf</include>
-          <include>org/apache/tools/ant/version.txt</include>
-        </includes>
-      </resource>
-      <resource>
-        <directory>../../../../src/resources</directory>
-        <filtering>true</filtering>
-        <includes>
-          <include>**/antlib.xml</include>
-        </includes>
-      </resource>
-      <resource>
-        <directory>../../../../docs</directory>
-        <filtering>false</filtering>
-        <includes>
-          <include>images/ant_logo_large.gif</include>
-        </includes>
-      </resource>
-    </resources>
-    <testResources>
-      <testResource>
-        <directory>../../../../src/etc/testcases</directory>
-        <filtering>true</filtering>
-      </testResource>
-      <testResource>
-        <directory>../../../../src/main</directory>
-        <filtering>true</filtering>
-        <excludes>
-          <exclude>**/*.java</exclude>
-        </excludes>
-      </testResource>
-    </testResources>
-    <sourceDirectory>../../../../src/main</sourceDirectory>
-    <testSourceDirectory>../../../../src/tests/junit</testSourceDirectory>
-    <outputDirectory>../../../../target/ant/classes</outputDirectory>
-    <testOutputDirectory>../../../../target/ant/testcases</testOutputDirectory>
-    <directory>../../../../target/ant</directory>
-  </build>
-</project>
--- a/sbin/res/ant/lib/libraries.properties	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,65 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-#this file declares the libraries for use in 
-#a given release of the components
-
-#if you change this, change the checksum to match
-m2.version=2.0.4
-m2.url=http://ibiblio.org/maven2/
-m2.artifact-name=maven-artifact-ant
-m2.jar.name=${m2.artifact-name}-${m2.version}-dep.jar
-#this is the URL of the antlib library, that is pulled down for everything else.
-m2.antlib.url=${m2.url}/org/apache/maven/${m2.artifact-name}/${m2.version}/${m2.jar.name}
-#this is the sha1 checksum of the artifact
-m2.sha1.checksum=4e7ddfdb91600e9b59bb965ff8eef2f06015df50
-
-# Repository to use by default for fetching dependencies.
-m2.repo=http://repo1.maven.org/maven2/
-
-#versions of different libraries. Please keep in alphabetical order, except
-#when a specific dependency forces them to be out-of-order
-antlr.version=2.7.7
-bcel.version=5.1
-bsf.version=2.4.0
-bsh.version=2.0b4
-bsh-core.version=${bsh.version}
-commons-net.version=1.4.1
-commons-logging.version=1.1
-commons-logging-api.version=${commons-logging.version}
-jai-core.version=1.1.3
-jai-codec.version=1.1.3
-jasper-compiler.version=4.1.36
-jasper-runtime.version=${jasper-compiler.version}
-jdepend.version=2.9.1
-jruby.version=0.9.8
-junit.version=4.8.1
-jsch.version=0.1.42
-jython.version=2.1
-#log4j 1.2.15 requires JMS and a few other Sun jars that are not in the m2 repo
-log4j.version=1.2.14
-#js is the javascript implementation of the rhino project
-#17R1 is compiled with Java5 so we can't use the jar when building with JDK 1.4
-js.version=1.6R7
-oro.version=2.0.8
-regexp.version=1.3
-servlet-api.version=2.3
-which.version=1.0
-xalan.version=2.7.1
-xml-resolver.version=1.2
-mail.version=1.4
-#paired
-jacl.version=1.2.6
-tcljava.version=${jacl.version}
Binary file sbin/res/compiler.jar has changed
--- a/sbin/res/jquery-1.3.2.externs.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,715 +0,0 @@
-/*
- * Copyright 2009 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * @fileoverview Externs for jQuery 1.3.2.
- * The externs defined here are in the order of the jQuery documentation pages.
- * Note that some functions use different return types depending on the number
- * of parameters passed in. In this cases, you may need to annotate the type
- * of the result in your code, so the JSCompiler understands which type you're
- * expecting. For example:
- *    <code>var elt = /** @type {Element} * / (foo.get(0));</code>
- * @see http://docs.jquery.com/
-*
- */
-
-/**
- * @param {string|Node|Element|Array.<Element>|Function} arg
- * @param {(jQueryObject|Document)=} opt_arg
- * @return {jQueryObject}
- */
-var $ = function(arg, opt_arg) {};
-
-var jQuery = {};
-
-/** @constructor */
-function jQueryObject() {};
-
-
-// http://docs.jquery.com/Core - Object accessors
-
-/**
- * @param {Function} callback
- * @return {jQueryObject}
- */
-jQueryObject.prototype.each = function(callback) {};
-
-/** @return {number} */
-jQueryObject.prototype.size = function() {};
-
-/** @type {number} */
-jQueryObject.prototype.length;
-
-/** @return {string} */
-jQueryObject.prototype.selector = function() {};
-
-/** @return {Element} */
-jQueryObject.prototype.context = function() {};
-
-/**
- * @param {number=} opt_index
- * @return {Element|Array.<Element>}
- */
-jQueryObject.prototype.get = function(opt_index) {};
-
-/**
- * @param {Element|jQueryObject} subject
- * @return {number}
- */
-jQueryObject.prototype.index = function(subject) {};
-
-
-// http://docs.jquery.com/Core - Data
-
-/**
- * @param {string} name
- * @param {string=} opt_value
- * @return {*}
- */
-jQueryObject.prototype.data = function(name, opt_value) {};
-
-/**
- * @param {string} name
- * @return {jQueryObject}
- */
-jQueryObject.prototype.removeData = function(name) {};
-
-/**
- * @param {(string|Function|Array.<Function>)=} opt_arg1
- * @param {(Function|Array.<Function>)=} opt_arg2
- * @return {Array.<Function>|jQueryObject}
- */
-jQueryObject.prototype.queue = function(opt_arg1, opt_arg2) {};
-
-/**
- * @param {string=} opt_name
- * @return {jQueryObject}
- */
-jQueryObject.prototype.dequeue = function(opt_name) {};
-
-
-// http://docs.jquery.com/Attributes - Attr
-
-/**
- * @param {string|Object} nameOrProperties
- * @param {*=} opt_value
- * @return {Object|jQueryObject}
- */
-jQueryObject.prototype.attr = function(nameOrProperties, opt_value) {};
-
-/**
- * @param {string} name
- * @return {jQueryObject}
- */
-jQueryObject.prototype.removeAttr = function(name) {};
-
-
-// http://docs.jquery.com/Attributes - Class
-
-/**
- * @param {string} klass
- * @return {jQueryObject}
- */
-jQueryObject.prototype.addClass = function(klass) {};
-
-/**
- * @param {string} klass
- * @return {boolean}
- */
-jQueryObject.prototype.hasClass = function(klass) {};
-
-/**
- * @param {string=} opt_klass
- * @return {jQueryObject}
- */
-jQueryObject.prototype.removeClass = function(opt_klass) {};
-
-/**
- * @param {string} klass
- * @param {boolean=} opt_switch
- * @return {jQueryObject}
- */
-jQueryObject.prototype.toggleClass = function(klass, opt_switch) {};
-
-
-// http://docs.jquery.com/Attributes - HTML, Text, Value
-
-/**
- * @param {string} opt_val
- * @return {string|jQueryObject}
- */
-jQueryObject.prototype.html = function(opt_val) {};
-
-/**
- * @param {string=} opt_val
- * @return {string|jQueryObject}
- */
-jQueryObject.prototype.text = function(opt_val) {};
-
-/**
- * @param {string|Array.<string>} opt_val
- * @return {string|Array|jQueryObject}
- */
-jQueryObject.prototype.val = function(opt_val) {};
-
-
-// http://docs.jquery.com/Traversing - Filtering
-
-/**
- * @param {number} index
- * @return {jQueryObject}
- */
-jQueryObject.prototype.eq = function(index) {};
-
-/**
- * @param {string|Function} arg
- * @return {jQueryObject}
- */
-jQueryObject.prototype.filter = function(arg) {};
-
-/**
- * @param {string} expr
- * @return {boolean}
- */
-jQueryObject.prototype.is = function(expr) {};
-
-/**
- * @param {Function} callback
- * @return {jQueryObject}
- */
-jQueryObject.prototype.map = function(callback) {};
-
-/**
- * @param {string} expr
- * @return {jQueryObject}
- */
-jQueryObject.prototype.not = function(expr) {};
-
-/**
- * @param {number} start
- * @param {number=} opt_end
- * @return {jQueryObject}
- */
-jQueryObject.prototype.slice = function(start, opt_end) {};
-
-
-// http://docs.jquery.com/Traversing - Finding, Chaining
-
-/**
- * @param {string|Element|Array.<Element>} expr
- * @return {jQueryObject}
- */
-jQueryObject.prototype.add = function(expr) {};
-
-/**
- * @param {string=} opt_expr
- * @return {jQueryObject}
- */
-jQueryObject.prototype.children = function(opt_expr) {};
-
-/**
- * @param {string} expr
- * @return {jQueryObject}
- */
-jQueryObject.prototype.closest = function(expr) {};
-
-/**
- * @return {jQueryObject}
- */
-jQueryObject.prototype.contents = function() {};
-
-/**
- * @param {string} expr
- * @return {jQueryObject}
- */
-jQueryObject.prototype.find = function(expr) {};
-
-/**
- * @param {string=} opt_expr
- * @return {jQueryObject}
- */
-jQueryObject.prototype.next = function(opt_expr) {};
-
-/**
- * @param {string=} opt_expr
- * @return {jQueryObject}
- */
-jQueryObject.prototype.nextAll = function(opt_expr) {};
-
-/**
- * @return {jQueryObject}
- */
-jQueryObject.prototype.offsetParent = function() {};
-
-/**
- * @param {string=} opt_expr
- * @return {jQueryObject}
- */
-jQueryObject.prototype.parent = function(opt_expr) {};
-
-/**
- * @param {string=} opt_expr
- * @return {jQueryObject}
- */
-jQueryObject.prototype.parents = function(opt_expr) {};
-
-/**
- * @param {string=} opt_expr
- * @return {jQueryObject}
- */
-jQueryObject.prototype.prev = function(opt_expr) {};
-
-/**
- * @param {string=} opt_expr
- * @return {jQueryObject}
- */
-jQueryObject.prototype.prevAll = function(opt_expr) {};
-
-/**
- * @param {string=} opt_expr
- * @return {jQueryObject}
- */
-jQueryObject.prototype.siblings = function(opt_expr) {};
-
-/**
- * @return {jQueryObject}
- */
-jQueryObject.prototype.andSelf = function() {};
-
-/**
- * @return {jQueryObject}
- */
-jQueryObject.prototype.end = function() {};
-
-
-// http://docs.jquery.com/Manipulation
-
-/**
- * @param {string|Node|Element|jQueryObject} content
- * @return {jQueryObject}
- */
-jQueryObject.prototype.append = function(content) {};
-
-/**
- * @param {string} selector
- * @return {jQueryObject}
- */
-jQueryObject.prototype.appendTo = function(selector) {};
-
-/**
- * @param {string|Node|Element|jQueryObject} content
- * @return {jQueryObject}
- */
-jQueryObject.prototype.prepend = function(content) {};
-
-/**
- * @param {string} selector
- * @return {jQueryObject}
- */
-jQueryObject.prototype.prependTo = function(selector) {};
-
-/**
- * @param {string|Node|Element|jQueryObject} content
- * @return {jQueryObject}
- */
-jQueryObject.prototype.after = function(content) {};
-
-/**
- * @param {string|Node|Element|jQueryObject} content
- * @return {jQueryObject}
- */
-jQueryObject.prototype.before = function(content) {};
-
-/**
- * @param {string} selector
- * @return {jQueryObject}
- */
-jQueryObject.prototype.insertAfter = function(selector) {};
-
-/**
- * @param {string} selector
- * @return {jQueryObject}
- */
-jQueryObject.prototype.insertBefore = function(selector) {};
-
-/**
- * @param {string|Element} arg
- * @return {jQueryObject}
- */
-jQueryObject.prototype.wrap = function(arg) {};
-
-/**
- * @param {string|Element} arg
- * @return {jQueryObject}
- */
-jQueryObject.prototype.wrapAll = function(arg) {};
-
-/**
- * @param {string|Element} arg
- * @return {jQueryObject}
- */
-jQueryObject.prototype.wrapInner = function(arg) {};
-
-/**
- * @param {string|Node|Element|jQueryObject} content
- * @return {jQueryObject}
- */
-jQueryObject.prototype.replaceWith = function(content) {};
-
-/**
- * @param {string} selector
- * @return {jQueryObject}
- */
-jQueryObject.prototype.replaceAll = function(selector) {};
-
-/**
- * @return {jQueryObject}
- */
-jQueryObject.prototype.empty = function() {};
-
-/**
- * @param {string=} opt_expr
- * @return {jQueryObject}
- */
-jQueryObject.prototype.remove = function(opt_expr) {};
-
-/**
- * @param {boolean=} opt_cloneEvents
- * @return {jQueryObject}
- */
-jQueryObject.prototype.clone = function(opt_cloneEvents) {};
-
-
-// http://docs.jquery.com/CSS
-
-/**
- * @param {string|Object} nameOrProperties
- * @param {(string|number|Function)=} opt_value
- * @return {Object|jQueryObject|string}
- */
-jQueryObject.prototype.css = function(nameOrProperties, opt_value) {};
-
-/**
- * @return {Object}
- */
-jQueryObject.prototype.offset = function() {};
-
-/**
- * @return {Object}
- */
-jQueryObject.prototype.position = function() {};
-
-/**
- * @param {number=} opt_val
- * @return {number|jQueryObject}
- */
-jQueryObject.prototype.scrollTop = function(opt_val) {};
-
-/**
- * @param {number=} opt_val
- * @return {number|jQueryObject}
- */
-jQueryObject.prototype.scrollLeft = function(opt_val) {};
-
-/**
- * @param {number=} opt_val
- * @return {number|jQueryObject}
- */
-jQueryObject.prototype.height = function(opt_val) {};
-
-/**
- * @param {number=} opt_val
- * @return {number|jQueryObject}
- */
-jQueryObject.prototype.width = function(opt_val) {};
-
-/**
- * @return {number}
- */
-jQueryObject.prototype.innerHeight = function() {};
-
-/**
- * @return {number}
- */
-jQueryObject.prototype.innerWidth = function() {};
-
-/**
- * @param {boolean=} opt_margin
- * @return {number}
- */
-jQueryObject.prototype.outerHeight = function(opt_margin) {};
-
-/**
- * @param {boolean=} opt_margin
- * @return {number}
- */
-jQueryObject.prototype.outerWidth = function(opt_margin) {};
-
-
-// http://docs.jquery.com/Events
-
-/**
- * @param {string} type
- * @param {Function} fn
- * @return {jQueryObject}
- */
-jQueryObject.prototype.live = function(type, fn) {};
-
-/**
- * @param {string=} opt_type
- * @param {Function=} opt_fn
- * @return {jQueryObject}
- */
-jQueryObject.prototype.die = function(opt_type, opt_fn) {};
-
-/**
- * @param {Function} over
- * @param {Function} out
- * @return {jQueryObject}
- */
-jQueryObject.prototype.hover = function(over, out) {};
-
-/**
- * @param {Function=} opt_fn
- * @return {jQueryObject}
- */
-jQueryObject.prototype.blur = function(opt_fn) {};
-
-/**
- * @param {Function=} opt_fn
- * @return {jQueryObject}
- */
-jQueryObject.prototype.change = function(opt_fn) {};
-
-/**
- * @param {Function=} opt_fn
- * @return {jQueryObject}
- */
-jQueryObject.prototype.click = function(opt_fn) {};
-
-/**
- * @param {Function=} opt_fn
- * @return {jQueryObject}
- */
-jQueryObject.prototype.dblclick = function(opt_fn) {};
-
-/**
- * @param {Function=} opt_fn
- * @return {jQueryObject}
- */
-jQueryObject.prototype.error = function(opt_fn) {};
-
-/**
- * @param {Function=} opt_fn
- * @return {jQueryObject}
- */
-jQueryObject.prototype.focus = function(opt_fn) {};
-
-/**
- * @param {Function=} opt_fn
- * @return {jQueryObject}
- */
-jQueryObject.prototype.keydown = function(opt_fn) {};
-
-/**
- * @param {Function=} opt_fn
- * @return {jQueryObject}
- */
-jQueryObject.prototype.keypress = function(opt_fn) {};
-
-/**
- * @param {Function} fn
- * @return {jQueryObject}
- */
-jQueryObject.prototype.keyup = function(fn) {};
-
-/**
- * @param {Function} fn
- * @return {jQueryObject}
- */
-jQueryObject.prototype.load = function(fn) {};
-
-/**
- * @param {Function} fn
- * @return {jQueryObject}
- */
-jQueryObject.prototype.mousedown = function(fn) {};
-
-/**
- * @param {Function} fn
- * @return {jQueryObject}
- */
-jQueryObject.prototype.mouseenter = function(fn) {};
-
-/**
- * @param {Function} fn
- * @return {jQueryObject}
- */
-jQueryObject.prototype.mouseleave = function(fn) {};
-
-/**
- * @param {Function} fn
- * @return {jQueryObject}
- */
-jQueryObject.prototype.mousemove = function(fn) {};
-
-/**
- * @param {Function} fn
- * @return {jQueryObject}
- */
-jQueryObject.prototype.mouseout = function(fn) {};
-
-/**
- * @param {Function} fn
- * @return {jQueryObject}
- */
-jQueryObject.prototype.mouseover = function(fn) {};
-
-/**
- * @param {Function} fn
- * @return {jQueryObject}
- */
-jQueryObject.prototype.mouseup = function(fn) {};
-
-/**
- * @param {Function} fn
- * @return {jQueryObject}
- */
-jQueryObject.prototype.resize = function(fn) {};
-
-/**
- * @param {Function} fn
- * @return {jQueryObject}
- */
-jQueryObject.prototype.scroll = function(fn) {};
-
-/**
- * @param {Function=} opt_fn
- * @return {jQueryObject}
- */
-jQueryObject.prototype.select = function(opt_fn) {};
-
-/**
- * @param {Function=} opt_fn
- * @return {jQueryObject}
- */
-jQueryObject.prototype.submit = function(opt_fn) {};
-
-/**
- * @param {Function} fn
- * @return {jQueryObject}
- */
-jQueryObject.prototype.unload = function(fn) {};
-
-
-// http://docs.jquery.com/Effects
-
-/**
- * @param {(number|string)=} opt_speed
- * @param {Function=} opt_fn
- * @return {jQueryObject}
- */
-jQueryObject.prototype.show = function(opt_speed, opt_fn) {};
-
-/**
- * @param {(number|string)=} opt_speed
- * @param {Function=} opt_fn
- * @return {jQueryObject}
- */
-jQueryObject.prototype.hide = function(opt_speed, opt_fn) {};
-
-/**
- * toggle() is defined as both an event and an effect... sigh.
- * @param {(Function|boolean|number|string)=} opt_arg1
- * @param {Function=} opt_fn2
- * @param {...Function} var_args
- * @return {jQueryObject}
- */
-jQueryObject.prototype.toggle = function(opt_arg1, opt_fn2, var_args) {};
-
-/**
- * @param {(number|string)=} opt_speed
- * @param {Function=} opt_fn
- * @return {jQueryObject}
- */
-jQueryObject.prototype.slideDown = function(opt_speed, opt_fn) {};
-
-/**
- * @param {(number|string)=} opt_speed
- * @param {Function=} opt_fn
- * @return {jQueryObject}
- */
-jQueryObject.prototype.slideUp = function(opt_speed, opt_fn) {};
-
-/**
- * @param {(number|string)=} opt_speed
- * @param {Function=} opt_fn
- * @return {jQueryObject}
- */
-jQueryObject.prototype.slideToggle = function(opt_speed, opt_fn) {};
-
-/**
- * @param {(number|string)=} opt_speed
- * @param {Function=} opt_fn
- * @return {jQueryObject}
- */
-jQueryObject.prototype.fadeIn = function(opt_speed, opt_fn) {};
-
-/**
- * @param {(number|string)=} opt_speed
- * @param {Function=} opt_fn
- * @return {jQueryObject}
- */
-jQueryObject.prototype.fadeOut = function(opt_speed, opt_fn) {};
-
-/**
- * @param {(number|string)=} opt_speed
- * @param {number=} opt_opacity
- * @param {Function=} opt_fn
- * @return {jQueryObject}
- */
-jQueryObject.prototype.fadeTo = function(opt_speed, opt_opacity, opt_fn) {};
-
-/**
- * @param {Object} params
- * @param {(number|string|Object)=} opt_durationOrOptions
- * @param {string=} opt_easing
- * @param {Function=} opt_fn
- * @return {jQueryObject}
- */
-jQueryObject.prototype.animate = function(
-    params, opt_durationOrOptions, opt_easing, opt_fn) {};
-
-/**
- * @param {boolean} opt_clearQueue
- * @param {boolean} opt_gotoEnd
- * @return {jQueryObject}
- */
-jQueryObject.prototype.stop = function(opt_clearQueue, opt_gotoEnd) {};
-
-jQuery.fx = {};
-
-/** @type {boolean} */
-jQuery.fx.off;
-
-// http://docs.jquery.com/Utilities
-
-/**
- * @param {number|string|Object} value
- * @param {Array} array
- * @return {number}
- */
-jQueryObject.prototype.inArray = function(value, array) {};
--- a/sbin/res/jsdoc/LdtPlayer-release.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3541 +0,0 @@
-/* 
- * 	
- *	Copyright 2010 Institut de recherche et d'innovation 
- *	contributor(s) : Samuel Huron 
- *	 
- *	contact@iri.centrepompidou.fr
- *	http://www.iri.centrepompidou.fr 
- *	 
- *	This software is a computer program whose purpose is to show and add annotations on a video .
- *	This software is governed by the CeCILL-C license under French law and
- *	abiding by the rules of distribution of free software. You can  use, 
- *	modify and/ or redistribute the software under the terms of the CeCILL-C
- *	license as circulated by CEA, CNRS and INRIA at the following URL
- *	"http://www.cecill.info". 
- *	
- *	The fact that you are presently reading this means that you have had
- *	knowledge of the CeCILL-C license and that you accept its terms.
-*/
-/*! LAB.js (LABjs :: Loading And Blocking JavaScript)
-    v2.0.3 (c) Kyle Simpson
-    MIT License
-*/
-
-(function(global){
-	var _$LAB = global.$LAB,
-	
-		// constants for the valid keys of the options object
-		_UseLocalXHR = "UseLocalXHR",
-		_AlwaysPreserveOrder = "AlwaysPreserveOrder",
-		_AllowDuplicates = "AllowDuplicates",
-		_CacheBust = "CacheBust",
-		/*!START_DEBUG*/_Debug = "Debug",/*!END_DEBUG*/
-		_BasePath = "BasePath",
-		
-		// stateless variables used across all $LAB instances
-		root_page = /^[^?#]*\//.exec(location.href)[0],
-		root_domain = /^\w+\:\/\/\/?[^\/]+/.exec(root_page)[0],
-		append_to = document.head || document.getElementsByTagName("head"),
-		
-		// inferences... ick, but still necessary
-		opera_or_gecko = (global.opera && Object.prototype.toString.call(global.opera) == "[object Opera]") || ("MozAppearance" in document.documentElement.style),
-
-/*!START_DEBUG*/
-		// console.log() and console.error() wrappers
-		log_msg = function(){}, 
-		log_error = log_msg,
-/*!END_DEBUG*/
-		
-		// feature sniffs (yay!)
-		test_script_elem = document.createElement("script"),
-		explicit_preloading = typeof test_script_elem.preload == "boolean", // http://wiki.whatwg.org/wiki/Script_Execution_Control#Proposal_1_.28Nicholas_Zakas.29
-		real_preloading = explicit_preloading || (test_script_elem.readyState && test_script_elem.readyState == "uninitialized"), // will a script preload with `src` set before DOM append?
-		script_ordered_async = !real_preloading && test_script_elem.async === true, // http://wiki.whatwg.org/wiki/Dynamic_Script_Execution_Order
-		
-		// XHR preloading (same-domain) and cache-preloading (remote-domain) are the fallbacks (for some browsers)
-		xhr_or_cache_preloading = !real_preloading && !script_ordered_async && !opera_or_gecko
-	;
-
-/*!START_DEBUG*/
-	// define console wrapper functions if applicable
-	if (global.console && global.console.log) {
-		if (!global.console.error) global.console.error = global.console.log;
-		log_msg = function(msg) { global.console.log(msg); };
-		log_error = function(msg,err) { global.console.error(msg,err); };
-	}
-/*!END_DEBUG*/
-
-	// test for function
-	function is_func(func) { return Object.prototype.toString.call(func) == "[object Function]"; }
-
-	// test for array
-	function is_array(arr) { return Object.prototype.toString.call(arr) == "[object Array]"; }
-
-	// make script URL absolute/canonical
-	function canonical_uri(src,base_path) {
-		var absolute_regex = /^\w+\:\/\//;
-		
-		// is `src` is protocol-relative (begins with // or ///), prepend protocol
-		if (/^\/\/\/?/.test(src)) {
-			src = location.protocol + src;
-		}
-		// is `src` page-relative? (not an absolute URL, and not a domain-relative path, beginning with /)
-		else if (!absolute_regex.test(src) && src.charAt(0) != "/") {
-			// prepend `base_path`, if any
-			src = (base_path || "") + src;
-		}
-		// make sure to return `src` as absolute
-		return absolute_regex.test(src) ? src : ((src.charAt(0) == "/" ? root_domain : root_page) + src);
-	}
-
-	// merge `source` into `target`
-	function merge_objs(source,target) {
-		for (var k in source) { if (source.hasOwnProperty(k)) {
-			target[k] = source[k]; // TODO: does this need to be recursive for our purposes?
-		}}
-		return target;
-	}
-
-	// does the chain group have any ready-to-execute scripts?
-	function check_chain_group_scripts_ready(chain_group) {
-		var any_scripts_ready = false;
-		for (var i=0; i<chain_group.scripts.length; i++) {
-			if (chain_group.scripts[i].ready && chain_group.scripts[i].exec_trigger) {
-				any_scripts_ready = true;
-				chain_group.scripts[i].exec_trigger();
-				chain_group.scripts[i].exec_trigger = null;
-			}
-		}
-		return any_scripts_ready;
-	}
-
-	// creates a script load listener
-	function create_script_load_listener(elem,registry_item,flag,onload) {
-		elem.onload = elem.onreadystatechange = function() {
-			if ((elem.readyState && elem.readyState != "complete" && elem.readyState != "loaded") || registry_item[flag]) return;
-			elem.onload = elem.onreadystatechange = null;
-			onload();
-		};
-	}
-
-	// script executed handler
-	function script_executed(registry_item) {
-		registry_item.ready = registry_item.finished = true;
-		for (var i=0; i<registry_item.finished_listeners.length; i++) {
-			registry_item.finished_listeners[i]();
-		}
-		registry_item.ready_listeners = [];
-		registry_item.finished_listeners = [];
-	}
-
-	// make the request for a scriptha
-	function request_script(chain_opts,script_obj,registry_item,onload,preload_this_script) {
-		// setTimeout() "yielding" prevents some weird race/crash conditions in older browsers
-		setTimeout(function(){
-			var script, src = script_obj.real_src, xhr;
-			
-			// don't proceed until `append_to` is ready to append to
-			if ("item" in append_to) { // check if `append_to` ref is still a live node list
-				if (!append_to[0]) { // `append_to` node not yet ready
-					// try again in a little bit -- note: will re-call the anonymous function in the outer setTimeout, not the parent `request_script()`
-					setTimeout(arguments.callee,25);
-					return;
-				}
-				// reassign from live node list ref to pure node ref -- avoids nasty IE bug where changes to DOM invalidate live node lists
-				append_to = append_to[0];
-			}
-			script = document.createElement("script");
-			if (script_obj.type) script.type = script_obj.type;
-			if (script_obj.charset) script.charset = script_obj.charset;
-			
-			// should preloading be used for this script?
-			if (preload_this_script) {
-				// real script preloading?
-				if (real_preloading) {
-					/*!START_DEBUG*/if (chain_opts[_Debug]) log_msg("start script preload: "+src);/*!END_DEBUG*/
-					registry_item.elem = script;
-					if (explicit_preloading) { // explicit preloading (aka, Zakas' proposal)
-						script.preload = true;
-						script.onpreload = onload;
-					}
-					else {
-						script.onreadystatechange = function(){
-							if (script.readyState == "loaded") onload();
-						};
-					}
-					script.src = src;
-					// NOTE: no append to DOM yet, appending will happen when ready to execute
-				}
-				// same-domain and XHR allowed? use XHR preloading
-				else if (preload_this_script && src.indexOf(root_domain) == 0 && chain_opts[_UseLocalXHR]) {
-					xhr = new XMLHttpRequest(); // note: IE never uses XHR (it supports true preloading), so no more need for ActiveXObject fallback for IE <= 7
-					/*!START_DEBUG*/if (chain_opts[_Debug]) log_msg("start script preload (xhr): "+src);/*!END_DEBUG*/
-					xhr.onreadystatechange = function() {
-						if (xhr.readyState == 4) {
-							xhr.onreadystatechange = function(){}; // fix a memory leak in IE
-							registry_item.text = xhr.responseText + "\n//@ sourceURL=" + src; // http://blog.getfirebug.com/2009/08/11/give-your-eval-a-name-with-sourceurl/
-							onload();
-						}
-					};
-					xhr.open("GET",src);
-					xhr.send();
-				}
-				// as a last resort, use cache-preloading
-				else {
-					/*!START_DEBUG*/if (chain_opts[_Debug]) log_msg("start script preload (cache): "+src);/*!END_DEBUG*/
-					script.type = "text/cache-script";
-					create_script_load_listener(script,registry_item,"ready",function() {
-						append_to.removeChild(script);
-						onload();
-					});
-					script.src = src;
-					append_to.insertBefore(script,append_to.firstChild);
-				}
-			}
-			// use async=false for ordered async? parallel-load-serial-execute http://wiki.whatwg.org/wiki/Dynamic_Script_Execution_Order
-			else if (script_ordered_async) {
-				/*!START_DEBUG*/if (chain_opts[_Debug]) log_msg("start script load (ordered async): "+src);/*!END_DEBUG*/
-				script.async = false;
-				create_script_load_listener(script,registry_item,"finished",onload);
-				script.src = src;
-				append_to.insertBefore(script,append_to.firstChild);
-			}
-			// otherwise, just a normal script element
-			else {
-				/*!START_DEBUG*/if (chain_opts[_Debug]) log_msg("start script load: "+src);/*!END_DEBUG*/
-				create_script_load_listener(script,registry_item,"finished",onload);
-				script.src = src;
-				append_to.insertBefore(script,append_to.firstChild);
-			}
-		},0);
-	}
-		
-	// create a clean instance of $LAB
-	function create_sandbox() {
-		var global_defaults = {},
-			can_use_preloading = real_preloading || xhr_or_cache_preloading,
-			queue = [],
-			registry = {},
-			instanceAPI
-		;
-		
-		// global defaults
-		global_defaults[_UseLocalXHR] = true;
-		global_defaults[_AlwaysPreserveOrder] = false;
-		global_defaults[_AllowDuplicates] = false;
-		global_defaults[_CacheBust] = false;
-		/*!START_DEBUG*/global_defaults[_Debug] = false;/*!END_DEBUG*/
-		global_defaults[_BasePath] = "";
-
-		// execute a script that has been preloaded already
-		function execute_preloaded_script(chain_opts,script_obj,registry_item) {
-			var script;
-			
-			function preload_execute_finished() {
-				if (script != null) { // make sure this only ever fires once
-					script = null;
-					script_executed(registry_item);
-				}
-			}
-			
-			if (registry[script_obj.src].finished) return;
-			if (!chain_opts[_AllowDuplicates]) registry[script_obj.src].finished = true;
-			
-			script = registry_item.elem || document.createElement("script");
-			if (script_obj.type) script.type = script_obj.type;
-			if (script_obj.charset) script.charset = script_obj.charset;
-			create_script_load_listener(script,registry_item,"finished",preload_execute_finished);
-			
-			// script elem was real-preloaded
-			if (registry_item.elem) {
-				registry_item.elem = null;
-			}
-			// script was XHR preloaded
-			else if (registry_item.text) {
-				script.onload = script.onreadystatechange = null;	// script injection doesn't fire these events
-				script.text = registry_item.text;
-			}
-			// script was cache-preloaded
-			else {
-				script.src = script_obj.real_src;
-			}
-			append_to.insertBefore(script,append_to.firstChild);
-
-			// manually fire execution callback for injected scripts, since events don't fire
-			if (registry_item.text) {
-				preload_execute_finished();
-			}
-		}
-	
-		// process the script request setup
-		function do_script(chain_opts,script_obj,chain_group,preload_this_script) {
-			var registry_item,
-				registry_items,
-				ready_cb = function(){ script_obj.ready_cb(script_obj,function(){ execute_preloaded_script(chain_opts,script_obj,registry_item); }); },
-				finished_cb = function(){ script_obj.finished_cb(script_obj,chain_group); }
-			;
-			
-			script_obj.src = canonical_uri(script_obj.src,chain_opts[_BasePath]);
-			script_obj.real_src = script_obj.src + 
-				// append cache-bust param to URL?
-				(chain_opts[_CacheBust] ? ((/\?.*$/.test(script_obj.src) ? "&_" : "?_") + ~~(Math.random()*1E9) + "=") : "")
-			;
-			
-			if (!registry[script_obj.src]) registry[script_obj.src] = {items:[],finished:false};
-			registry_items = registry[script_obj.src].items;
-
-			// allowing duplicates, or is this the first recorded load of this script?
-			if (chain_opts[_AllowDuplicates] || registry_items.length == 0) {
-				registry_item = registry_items[registry_items.length] = {
-					ready:false,
-					finished:false,
-					ready_listeners:[ready_cb],
-					finished_listeners:[finished_cb]
-				};
-
-				request_script(chain_opts,script_obj,registry_item,
-					// which callback type to pass?
-					(
-					 	(preload_this_script) ? // depends on script-preloading
-						function(){
-							registry_item.ready = true;
-							for (var i=0; i<registry_item.ready_listeners.length; i++) {
-								registry_item.ready_listeners[i]();
-							}
-							registry_item.ready_listeners = [];
-						} :
-						function(){ script_executed(registry_item); }
-					),
-					// signal if script-preloading should be used or not
-					preload_this_script
-				);
-			}
-			else {
-				registry_item = registry_items[0];
-				if (registry_item.finished) {
-					finished_cb();
-				}
-				else {
-					registry_item.finished_listeners.push(finished_cb);
-				}
-			}
-		}
-
-		// creates a closure for each separate chain spawned from this $LAB instance, to keep state cleanly separated between chains
-		function create_chain() {
-			var chainedAPI,
-				chain_opts = merge_objs(global_defaults,{}),
-				chain = [],
-				exec_cursor = 0,
-				scripts_currently_loading = false,
-				group
-			;
-			
-			// called when a script has finished preloading
-			function chain_script_ready(script_obj,exec_trigger) {
-				/*!START_DEBUG*/if (chain_opts[_Debug]) log_msg("script preload finished: "+script_obj.real_src);/*!END_DEBUG*/
-				script_obj.ready = true;
-				script_obj.exec_trigger = exec_trigger;
-				advance_exec_cursor(); // will only check for 'ready' scripts to be executed
-			}
-
-			// called when a script has finished executing
-			function chain_script_executed(script_obj,chain_group) {
-				/*!START_DEBUG*/if (chain_opts[_Debug]) log_msg("script execution finished: "+script_obj.real_src);/*!END_DEBUG*/
-				script_obj.ready = script_obj.finished = true;
-				script_obj.exec_trigger = null;
-				// check if chain group is all finished
-				for (var i=0; i<chain_group.scripts.length; i++) {
-					if (!chain_group.scripts[i].finished) return;
-				}
-				// chain_group is all finished if we get this far
-				chain_group.finished = true;
-				advance_exec_cursor();
-			}
-
-			// main driver for executing each part of the chain
-			function advance_exec_cursor() {
-				while (exec_cursor < chain.length) {
-					if (is_func(chain[exec_cursor])) {
-						/*!START_DEBUG*/if (chain_opts[_Debug]) log_msg("$LAB.wait() executing: "+chain[exec_cursor]);/*!END_DEBUG*/
-						try { chain[exec_cursor++](); } catch (err) {
-							/*!START_DEBUG*/if (chain_opts[_Debug]) log_error("$LAB.wait() error caught: ",err);/*!END_DEBUG*/
-						}
-						continue;
-					}
-					else if (!chain[exec_cursor].finished) {
-						if (check_chain_group_scripts_ready(chain[exec_cursor])) continue;
-						break;
-					}
-					exec_cursor++;
-				}
-				// we've reached the end of the chain (so far)
-				if (exec_cursor == chain.length) {
-					scripts_currently_loading = false;
-					group = false;
-				}
-			}
-			
-			// setup next chain script group
-			function init_script_chain_group() {
-				if (!group || !group.scripts) {
-					chain.push(group = {scripts:[],finished:true});
-				}
-			}
-
-			// API for $LAB chains
-			chainedAPI = {
-				// start loading one or more scripts
-				script:function(){
-					for (var i=0; i<arguments.length; i++) {
-						(function(script_obj,script_list){
-							var splice_args;
-							
-							if (!is_array(script_obj)) {
-								script_list = [script_obj];
-							}
-							for (var j=0; j<script_list.length; j++) {
-								init_script_chain_group();
-								script_obj = script_list[j];
-								
-								if (is_func(script_obj)) script_obj = script_obj();
-								if (!script_obj) continue;
-								if (is_array(script_obj)) {
-									// set up an array of arguments to pass to splice()
-									splice_args = [].slice.call(script_obj); // first include the actual array elements we want to splice in
-									splice_args.unshift(j,1); // next, put the `index` and `howMany` parameters onto the beginning of the splice-arguments array
-									[].splice.apply(script_list,splice_args); // use the splice-arguments array as arguments for splice()
-									j--; // adjust `j` to account for the loop's subsequent `j++`, so that the next loop iteration uses the same `j` index value
-									continue;
-								}
-								if (typeof script_obj == "string") script_obj = {src:script_obj};
-								script_obj = merge_objs(script_obj,{
-									ready:false,
-									ready_cb:chain_script_ready,
-									finished:false,
-									finished_cb:chain_script_executed
-								});
-								group.finished = false;
-								group.scripts.push(script_obj);
-								
-								do_script(chain_opts,script_obj,group,(can_use_preloading && scripts_currently_loading));
-								scripts_currently_loading = true;
-								
-								if (chain_opts[_AlwaysPreserveOrder]) chainedAPI.wait();
-							}
-						})(arguments[i],arguments[i]);
-					}
-					return chainedAPI;
-				},
-				// force LABjs to pause in execution at this point in the chain, until the execution thus far finishes, before proceeding
-				wait:function(){
-					if (arguments.length > 0) {
-						for (var i=0; i<arguments.length; i++) {
-							chain.push(arguments[i]);
-						}
-						group = chain[chain.length-1];
-					}
-					else group = false;
-					
-					advance_exec_cursor();
-					
-					return chainedAPI;
-				}
-			};
-
-			// the first chain link API (includes `setOptions` only this first time)
-			return {
-				script:chainedAPI.script, 
-				wait:chainedAPI.wait, 
-				setOptions:function(opts){
-					merge_objs(opts,chain_opts);
-					return chainedAPI;
-				}
-			};
-		}
-
-		// API for each initial $LAB instance (before chaining starts)
-		instanceAPI = {
-			// main API functions
-			setGlobalDefaults:function(opts){
-				merge_objs(opts,global_defaults);
-				return instanceAPI;
-			},
-			setOptions:function(){
-				return create_chain().setOptions.apply(null,arguments);
-			},
-			script:function(){
-				return create_chain().script.apply(null,arguments);
-			},
-			wait:function(){
-				return create_chain().wait.apply(null,arguments);
-			},
-
-			// built-in queuing for $LAB `script()` and `wait()` calls
-			// useful for building up a chain programmatically across various script locations, and simulating
-			// execution of the chain
-			queueScript:function(){
-				queue[queue.length] = {type:"script", args:[].slice.call(arguments)};
-				return instanceAPI;
-			},
-			queueWait:function(){
-				queue[queue.length] = {type:"wait", args:[].slice.call(arguments)};
-				return instanceAPI;
-			},
-			runQueue:function(){
-				var $L = instanceAPI, len=queue.length, i=len, val;
-				for (;--i>=0;) {
-					val = queue.shift();
-					$L = $L[val.type].apply(null,val.args);
-				}
-				return $L;
-			},
-
-			// rollback `[global].$LAB` to what it was before this file was loaded, the return this current instance of $LAB
-			noConflict:function(){
-				global.$LAB = _$LAB;
-				return instanceAPI;
-			},
-
-			// create another clean instance of $LAB
-			sandbox:function(){
-				return create_sandbox();
-			}
-		};
-
-		return instanceAPI;
-	}
-
-	// create the main instance of $LAB
-	global.$LAB = create_sandbox();
-
-
-	/* The following "hack" was suggested by Andrea Giammarchi and adapted from: http://webreflection.blogspot.com/2009/11/195-chars-to-help-lazy-loading.html
-	   NOTE: this hack only operates in FF and then only in versions where document.readyState is not present (FF < 3.6?).
-	   
-	   The hack essentially "patches" the **page** that LABjs is loaded onto so that it has a proper conforming document.readyState, so that if a script which does 
-	   proper and safe dom-ready detection is loaded onto a page, after dom-ready has passed, it will still be able to detect this state, by inspecting the now hacked 
-	   document.readyState property. The loaded script in question can then immediately trigger any queued code executions that were waiting for the DOM to be ready. 
-	   For instance, jQuery 1.4+ has been patched to take advantage of document.readyState, which is enabled by this hack. But 1.3.2 and before are **not** safe or 
-	   fixed by this hack, and should therefore **not** be lazy-loaded by script loader tools such as LABjs.
-	*/ 
-	(function(addEvent,domLoaded,handler){
-		if (document.readyState == null && document[addEvent]){
-			document.readyState = "loading";
-			document[addEvent](domLoaded,handler = function(){
-				document.removeEventListener(domLoaded,handler,false);
-				document.readyState = "complete";
-			},false);
-		}
-	})("addEventListener","DOMContentLoaded");
-
-})(this);/*
-  mustache.js — Logic-less templates in JavaScript
-
-  See http://mustache.github.com/ for more info.
-*/
-
-var Mustache = function() {
-  var Renderer = function() {};
-
-  Renderer.prototype = {
-    otag: "{{",
-    ctag: "}}",
-    pragmas: {},
-    buffer: [],
-    pragmas_implemented: {
-      "IMPLICIT-ITERATOR": true
-    },
-    context: {},
-
-    render: function(template, context, partials, in_recursion) {
-      // reset buffer & set context
-      if(!in_recursion) {
-        this.context = context;
-        this.buffer = []; // TODO: make this non-lazy
-      }
-
-      // fail fast
-      if(!this.includes("", template)) {
-        if(in_recursion) {
-          return template;
-        } else {
-          this.send(template);
-          return;
-        }
-      }
-
-      template = this.render_pragmas(template);
-      var html = this.render_section(template, context, partials);
-      if(in_recursion) {
-        return this.render_tags(html, context, partials, in_recursion);
-      }
-
-      this.render_tags(html, context, partials, in_recursion);
-    },
-
-    /*
-      Sends parsed lines
-    */
-    send: function(line) {
-      if(line !== "") {
-        this.buffer.push(line);
-      }
-    },
-
-    /*
-      Looks for %PRAGMAS
-    */
-    render_pragmas: function(template) {
-      // no pragmas
-      if(!this.includes("%", template)) {
-        return template;
-      }
-
-      var that = this;
-      var regex = new RegExp(this.otag + "%([\\w-]+) ?([\\w]+=[\\w]+)?" +
-            this.ctag, "g");
-      return template.replace(regex, function(match, pragma, options) {
-        if(!that.pragmas_implemented[pragma]) {
-          throw({message: 
-            "This implementation of mustache doesn't understand the '" +
-            pragma + "' pragma"});
-        }
-        that.pragmas[pragma] = {};
-        if(options) {
-          var opts = options.split("=");
-          that.pragmas[pragma][opts[0]] = opts[1];
-        }
-        return "";
-        // ignore unknown pragmas silently
-      });
-    },
-
-    /*
-      Tries to find a partial in the curent scope and render it
-    */
-    render_partial: function(name, context, partials) {
-      name = this.trim(name);
-      if(!partials || partials[name] === undefined) {
-        throw({message: "unknown_partial '" + name + "'"});
-      }
-      if(typeof(context[name]) != "object") {
-        return this.render(partials[name], context, partials, true);
-      }
-      return this.render(partials[name], context[name], partials, true);
-    },
-
-    /*
-      Renders inverted (^) and normal (#) sections
-    */
-    render_section: function(template, context, partials) {
-      if(!this.includes("#", template) && !this.includes("^", template)) {
-        return template;
-      }
-
-      var that = this;
-      // CSW - Added "+?" so it finds the tighest bound, not the widest
-      var regex = new RegExp(this.otag + "(\\^|\\#)\\s*(.+)\\s*" + this.ctag +
-              "\n*([\\s\\S]+?)" + this.otag + "\\/\\s*\\2\\s*" + this.ctag +
-              "\\s*", "mg");
-
-      // for each {{#foo}}{{/foo}} section do...
-      return template.replace(regex, function(match, type, name, content) {
-        var value = that.find(name, context);
-        if(type == "^") { // inverted section
-          if(!value || that.is_array(value) && value.length === 0) {
-            // false or empty list, render it
-            return that.render(content, context, partials, true);
-          } else {
-            return "";
-          }
-        } else if(type == "#") { // normal section
-          if(that.is_array(value)) { // Enumerable, Let's loop!
-            return that.map(value, function(row) {
-              return that.render(content, that.create_context(row),
-                partials, true);
-            }).join("");
-          } else if(that.is_object(value)) { // Object, Use it as subcontext!
-            return that.render(content, that.create_context(value),
-              partials, true);
-          } else if(typeof value === "function") {
-            // higher order section
-            return value.call(context, content, function(text) {
-              return that.render(text, context, partials, true);
-            });
-          } else if(value) { // boolean section
-            return that.render(content, context, partials, true);
-          } else {
-            return "";
-          }
-        }
-      });
-    },
-
-    /*
-      Replace {{foo}} and friends with values from our view
-    */
-    render_tags: function(template, context, partials, in_recursion) {
-      // tit for tat
-      var that = this;
-
-      var new_regex = function() {
-        return new RegExp(that.otag + "(=|!|>|\\{|%)?([^\\/#\\^]+?)\\1?" +
-          that.ctag + "+", "g");
-      };
-
-      var regex = new_regex();
-      var tag_replace_callback = function(match, operator, name) {
-        switch(operator) {
-        case "!": // ignore comments
-          return "";
-        case "=": // set new delimiters, rebuild the replace regexp
-          that.set_delimiters(name);
-          regex = new_regex();
-          return "";
-        case ">": // render partial
-          return that.render_partial(name, context, partials);
-        case "{": // the triple mustache is unescaped
-          return that.find(name, context);
-        default: // escape the value
-          return that.escape(that.find(name, context));
-        }
-      };
-      var lines = template.split("\n");
-      for(var i = 0; i < lines.length; i++) {
-        lines[i] = lines[i].replace(regex, tag_replace_callback, this);
-        if(!in_recursion) {
-          this.send(lines[i]);
-        }
-      }
-
-      if(in_recursion) {
-        return lines.join("\n");
-      }
-    },
-
-    set_delimiters: function(delimiters) {
-      var dels = delimiters.split(" ");
-      this.otag = this.escape_regex(dels[0]);
-      this.ctag = this.escape_regex(dels[1]);
-    },
-
-    escape_regex: function(text) {
-      // thank you Simon Willison
-      if(!arguments.callee.sRE) {
-        var specials = [
-          '/', '.', '*', '+', '?', '|',
-          '(', ')', '[', ']', '{', '}', '\\'
-        ];
-        arguments.callee.sRE = new RegExp(
-          '(\\' + specials.join('|\\') + ')', 'g'
-        );
-      }
-      return text.replace(arguments.callee.sRE, '\\$1');
-    },
-
-    /*
-      find `name` in current `context`. That is find me a value
-      from the view object
-    */
-    find: function(name, context) {
-      name = this.trim(name);
-
-      // Checks whether a value is thruthy or false or 0
-      function is_kinda_truthy(bool) {
-        return bool === false || bool === 0 || bool;
-      }
-
-      var value;
-      if(is_kinda_truthy(context[name])) {
-        value = context[name];
-      } else if(is_kinda_truthy(this.context[name])) {
-        value = this.context[name];
-      }
-
-      if(typeof value === "function") {
-        return value.apply(context);
-      }
-      if(value !== undefined) {
-        return value;
-      }
-      // silently ignore unkown variables
-      return "";
-    },
-
-    // Utility methods
-
-    /* includes tag */
-    includes: function(needle, haystack) {
-      return haystack.indexOf(this.otag + needle) != -1;
-    },
-
-    /*
-      Does away with nasty characters
-    */
-    escape: function(s) {
-      s = String(s === null ? "" : s);
-      return s.replace(/&(?!\w+;)|["'<>\\]/g, function(s) {
-        switch(s) {
-        case "&": return "&amp;";
-        case "\\": return "\\\\";
-        case '"': return '&quot;';
-        case "'": return '&#39;';
-        case "<": return "&lt;";
-        case ">": return "&gt;";
-        default: return s;
-        }
-      });
-    },
-
-    // by @langalex, support for arrays of strings
-    create_context: function(_context) {
-      if(this.is_object(_context)) {
-        return _context;
-      } else {
-        var iterator = ".";
-        if(this.pragmas["IMPLICIT-ITERATOR"]) {
-          iterator = this.pragmas["IMPLICIT-ITERATOR"].iterator;
-        }
-        var ctx = {};
-        ctx[iterator] = _context;
-        return ctx;
-      }
-    },
-
-    is_object: function(a) {
-      return a && typeof a == "object";
-    },
-
-    is_array: function(a) {
-      return Object.prototype.toString.call(a) === '[object Array]';
-    },
-
-    /*
-      Gets rid of leading and trailing whitespace
-    */
-    trim: function(s) {
-      return s.replace(/^\s*|\s*$/g, "");
-    },
-
-    /*
-      Why, why, why? Because IE. Cry, cry cry.
-    */
-    map: function(array, fn) {
-      if (typeof array.map == "function") {
-        return array.map(fn);
-      } else {
-        var r = [];
-        var l = array.length;
-        for(var i = 0; i < l; i++) {
-          r.push(fn(array[i]));
-        }
-        return r;
-      }
-    }
-  };
-
-  return({
-    name: "mustache.js",
-    version: "0.3.1-dev",
-
-    /*
-      Turns a template and view into HTML
-    */
-    to_html: function(template, view, partials, send_fun) {
-      var renderer = new Renderer();
-      if(send_fun) {
-        renderer.send = send_fun;
-      }
-      renderer.render(template, view, partials);
-      if(!send_fun) {
-        return renderer.buffer.join("\n");
-      }
-    }
-  });
-}();
-// Underscore.js 1.2.3
-// (c) 2009-2011 Jeremy Ashkenas, DocumentCloud Inc.
-// Underscore is freely distributable under the MIT license.
-// Portions of Underscore are inspired or borrowed from Prototype,
-// Oliver Steele's Functional, and John Resig's Micro-Templating.
-// For all details and documentation:
-// http://documentcloud.github.com/underscore
-(function(){function r(a,c,d){if(a===c)return a!==0||1/a==1/c;if(a==null||c==null)return a===c;if(a._chain)a=a._wrapped;if(c._chain)c=c._wrapped;if(a.isEqual&&b.isFunction(a.isEqual))return a.isEqual(c);if(c.isEqual&&b.isFunction(c.isEqual))return c.isEqual(a);var e=l.call(a);if(e!=l.call(c))return false;switch(e){case "[object String]":return a==String(c);case "[object Number]":return a!=+a?c!=+c:a==0?1/a==1/c:a==+c;case "[object Date]":case "[object Boolean]":return+a==+c;case "[object RegExp]":return a.source==
-c.source&&a.global==c.global&&a.multiline==c.multiline&&a.ignoreCase==c.ignoreCase}if(typeof a!="object"||typeof c!="object")return false;for(var f=d.length;f--;)if(d[f]==a)return true;d.push(a);var f=0,g=true;if(e=="[object Array]"){if(f=a.length,g=f==c.length)for(;f--;)if(!(g=f in a==f in c&&r(a[f],c[f],d)))break}else{if("constructor"in a!="constructor"in c||a.constructor!=c.constructor)return false;for(var h in a)if(m.call(a,h)&&(f++,!(g=m.call(c,h)&&r(a[h],c[h],d))))break;if(g){for(h in c)if(m.call(c,
-h)&&!f--)break;g=!f}}d.pop();return g}var s=this,F=s._,o={},k=Array.prototype,p=Object.prototype,i=k.slice,G=k.concat,H=k.unshift,l=p.toString,m=p.hasOwnProperty,v=k.forEach,w=k.map,x=k.reduce,y=k.reduceRight,z=k.filter,A=k.every,B=k.some,q=k.indexOf,C=k.lastIndexOf,p=Array.isArray,I=Object.keys,t=Function.prototype.bind,b=function(a){return new n(a)};if(typeof exports!=="undefined"){if(typeof module!=="undefined"&&module.exports)exports=module.exports=b;exports._=b}else typeof define==="function"&&
-define.amd?define("underscore",function(){return b}):s._=b;b.VERSION="1.2.3";var j=b.each=b.forEach=function(a,c,b){if(a!=null)if(v&&a.forEach===v)a.forEach(c,b);else if(a.length===+a.length)for(var e=0,f=a.length;e<f;e++){if(e in a&&c.call(b,a[e],e,a)===o)break}else for(e in a)if(m.call(a,e)&&c.call(b,a[e],e,a)===o)break};b.map=function(a,c,b){var e=[];if(a==null)return e;if(w&&a.map===w)return a.map(c,b);j(a,function(a,g,h){e[e.length]=c.call(b,a,g,h)});return e};b.reduce=b.foldl=b.inject=function(a,
-c,d,e){var f=arguments.length>2;a==null&&(a=[]);if(x&&a.reduce===x)return e&&(c=b.bind(c,e)),f?a.reduce(c,d):a.reduce(c);j(a,function(a,b,i){f?d=c.call(e,d,a,b,i):(d=a,f=true)});if(!f)throw new TypeError("Reduce of empty array with no initial value");return d};b.reduceRight=b.foldr=function(a,c,d,e){var f=arguments.length>2;a==null&&(a=[]);if(y&&a.reduceRight===y)return e&&(c=b.bind(c,e)),f?a.reduceRight(c,d):a.reduceRight(c);var g=b.toArray(a).reverse();e&&!f&&(c=b.bind(c,e));return f?b.reduce(g,
-c,d,e):b.reduce(g,c)};b.find=b.detect=function(a,c,b){var e;D(a,function(a,g,h){if(c.call(b,a,g,h))return e=a,true});return e};b.filter=b.select=function(a,c,b){var e=[];if(a==null)return e;if(z&&a.filter===z)return a.filter(c,b);j(a,function(a,g,h){c.call(b,a,g,h)&&(e[e.length]=a)});return e};b.reject=function(a,c,b){var e=[];if(a==null)return e;j(a,function(a,g,h){c.call(b,a,g,h)||(e[e.length]=a)});return e};b.every=b.all=function(a,c,b){var e=true;if(a==null)return e;if(A&&a.every===A)return a.every(c,
-b);j(a,function(a,g,h){if(!(e=e&&c.call(b,a,g,h)))return o});return e};var D=b.some=b.any=function(a,c,d){c||(c=b.identity);var e=false;if(a==null)return e;if(B&&a.some===B)return a.some(c,d);j(a,function(a,b,h){if(e||(e=c.call(d,a,b,h)))return o});return!!e};b.include=b.contains=function(a,c){var b=false;if(a==null)return b;return q&&a.indexOf===q?a.indexOf(c)!=-1:b=D(a,function(a){return a===c})};b.invoke=function(a,c){var d=i.call(arguments,2);return b.map(a,function(a){return(c.call?c||a:a[c]).apply(a,
-d)})};b.pluck=function(a,c){return b.map(a,function(a){return a[c]})};b.max=function(a,c,d){if(!c&&b.isArray(a))return Math.max.apply(Math,a);if(!c&&b.isEmpty(a))return-Infinity;var e={computed:-Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b>=e.computed&&(e={value:a,computed:b})});return e.value};b.min=function(a,c,d){if(!c&&b.isArray(a))return Math.min.apply(Math,a);if(!c&&b.isEmpty(a))return Infinity;var e={computed:Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b<e.computed&&(e={value:a,
-computed:b})});return e.value};b.shuffle=function(a){var c=[],b;j(a,function(a,f){f==0?c[0]=a:(b=Math.floor(Math.random()*(f+1)),c[f]=c[b],c[b]=a)});return c};b.sortBy=function(a,c,d){return b.pluck(b.map(a,function(a,b,g){return{value:a,criteria:c.call(d,a,b,g)}}).sort(function(a,c){var b=a.criteria,d=c.criteria;return b<d?-1:b>d?1:0}),"value")};b.groupBy=function(a,c){var d={},e=b.isFunction(c)?c:function(a){return a[c]};j(a,function(a,b){var c=e(a,b);(d[c]||(d[c]=[])).push(a)});return d};b.sortedIndex=
-function(a,c,d){d||(d=b.identity);for(var e=0,f=a.length;e<f;){var g=e+f>>1;d(a[g])<d(c)?e=g+1:f=g}return e};b.toArray=function(a){return!a?[]:a.toArray?a.toArray():b.isArray(a)?i.call(a):b.isArguments(a)?i.call(a):b.values(a)};b.size=function(a){return b.toArray(a).length};b.first=b.head=function(a,b,d){return b!=null&&!d?i.call(a,0,b):a[0]};b.initial=function(a,b,d){return i.call(a,0,a.length-(b==null||d?1:b))};b.last=function(a,b,d){return b!=null&&!d?i.call(a,Math.max(a.length-b,0)):a[a.length-
-1]};b.rest=b.tail=function(a,b,d){return i.call(a,b==null||d?1:b)};b.compact=function(a){return b.filter(a,function(a){return!!a})};b.flatten=function(a,c){return b.reduce(a,function(a,e){if(b.isArray(e))return a.concat(c?e:b.flatten(e));a[a.length]=e;return a},[])};b.without=function(a){return b.difference(a,i.call(arguments,1))};b.uniq=b.unique=function(a,c,d){var d=d?b.map(a,d):a,e=[];b.reduce(d,function(d,g,h){if(0==h||(c===true?b.last(d)!=g:!b.include(d,g)))d[d.length]=g,e[e.length]=a[h];return d},
-[]);return e};b.union=function(){return b.uniq(b.flatten(arguments,true))};b.intersection=b.intersect=function(a){var c=i.call(arguments,1);return b.filter(b.uniq(a),function(a){return b.every(c,function(c){return b.indexOf(c,a)>=0})})};b.difference=function(a){var c=b.flatten(i.call(arguments,1));return b.filter(a,function(a){return!b.include(c,a)})};b.zip=function(){for(var a=i.call(arguments),c=b.max(b.pluck(a,"length")),d=Array(c),e=0;e<c;e++)d[e]=b.pluck(a,""+e);return d};b.indexOf=function(a,
-c,d){if(a==null)return-1;var e;if(d)return d=b.sortedIndex(a,c),a[d]===c?d:-1;if(q&&a.indexOf===q)return a.indexOf(c);for(d=0,e=a.length;d<e;d++)if(d in a&&a[d]===c)return d;return-1};b.lastIndexOf=function(a,b){if(a==null)return-1;if(C&&a.lastIndexOf===C)return a.lastIndexOf(b);for(var d=a.length;d--;)if(d in a&&a[d]===b)return d;return-1};b.range=function(a,b,d){arguments.length<=1&&(b=a||0,a=0);for(var d=arguments[2]||1,e=Math.max(Math.ceil((b-a)/d),0),f=0,g=Array(e);f<e;)g[f++]=a,a+=d;return g};
-var E=function(){};b.bind=function(a,c){var d,e;if(a.bind===t&&t)return t.apply(a,i.call(arguments,1));if(!b.isFunction(a))throw new TypeError;e=i.call(arguments,2);return d=function(){if(!(this instanceof d))return a.apply(c,e.concat(i.call(arguments)));E.prototype=a.prototype;var b=new E,g=a.apply(b,e.concat(i.call(arguments)));return Object(g)===g?g:b}};b.bindAll=function(a){var c=i.call(arguments,1);c.length==0&&(c=b.functions(a));j(c,function(c){a[c]=b.bind(a[c],a)});return a};b.memoize=function(a,
-c){var d={};c||(c=b.identity);return function(){var b=c.apply(this,arguments);return m.call(d,b)?d[b]:d[b]=a.apply(this,arguments)}};b.delay=function(a,b){var d=i.call(arguments,2);return setTimeout(function(){return a.apply(a,d)},b)};b.defer=function(a){return b.delay.apply(b,[a,1].concat(i.call(arguments,1)))};b.throttle=function(a,c){var d,e,f,g,h,i=b.debounce(function(){h=g=false},c);return function(){d=this;e=arguments;var b;f||(f=setTimeout(function(){f=null;h&&a.apply(d,e);i()},c));g?h=true:
-a.apply(d,e);i();g=true}};b.debounce=function(a,b){var d;return function(){var e=this,f=arguments;clearTimeout(d);d=setTimeout(function(){d=null;a.apply(e,f)},b)}};b.once=function(a){var b=false,d;return function(){if(b)return d;b=true;return d=a.apply(this,arguments)}};b.wrap=function(a,b){return function(){var d=G.apply([a],arguments);return b.apply(this,d)}};b.compose=function(){var a=arguments;return function(){for(var b=arguments,d=a.length-1;d>=0;d--)b=[a[d].apply(this,b)];return b[0]}};b.after=
-function(a,b){return a<=0?b():function(){if(--a<1)return b.apply(this,arguments)}};b.keys=I||function(a){if(a!==Object(a))throw new TypeError("Invalid object");var b=[],d;for(d in a)m.call(a,d)&&(b[b.length]=d);return b};b.values=function(a){return b.map(a,b.identity)};b.functions=b.methods=function(a){var c=[],d;for(d in a)b.isFunction(a[d])&&c.push(d);return c.sort()};b.extend=function(a){j(i.call(arguments,1),function(b){for(var d in b)b[d]!==void 0&&(a[d]=b[d])});return a};b.defaults=function(a){j(i.call(arguments,
-1),function(b){for(var d in b)a[d]==null&&(a[d]=b[d])});return a};b.clone=function(a){return!b.isObject(a)?a:b.isArray(a)?a.slice():b.extend({},a)};b.tap=function(a,b){b(a);return a};b.isEqual=function(a,b){return r(a,b,[])};b.isEmpty=function(a){if(b.isArray(a)||b.isString(a))return a.length===0;for(var c in a)if(m.call(a,c))return false;return true};b.isElement=function(a){return!!(a&&a.nodeType==1)};b.isArray=p||function(a){return l.call(a)=="[object Array]"};b.isObject=function(a){return a===
-Object(a)};b.isArguments=function(a){return l.call(a)=="[object Arguments]"};if(!b.isArguments(arguments))b.isArguments=function(a){return!(!a||!m.call(a,"callee"))};b.isFunction=function(a){return l.call(a)=="[object Function]"};b.isString=function(a){return l.call(a)=="[object String]"};b.isNumber=function(a){return l.call(a)=="[object Number]"};b.isNaN=function(a){return a!==a};b.isBoolean=function(a){return a===true||a===false||l.call(a)=="[object Boolean]"};b.isDate=function(a){return l.call(a)==
-"[object Date]"};b.isRegExp=function(a){return l.call(a)=="[object RegExp]"};b.isNull=function(a){return a===null};b.isUndefined=function(a){return a===void 0};b.noConflict=function(){s._=F;return this};b.identity=function(a){return a};b.times=function(a,b,d){for(var e=0;e<a;e++)b.call(d,e)};b.escape=function(a){return(""+a).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#x27;").replace(/\//g,"&#x2F;")};b.mixin=function(a){j(b.functions(a),function(c){J(c,
-b[c]=a[c])})};var K=0;b.uniqueId=function(a){var b=K++;return a?a+b:b};b.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};b.template=function(a,c){var d=b.templateSettings,d="var __p=[],print=function(){__p.push.apply(__p,arguments);};with(obj||{}){__p.push('"+a.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(d.escape,function(a,b){return"',_.escape("+b.replace(/\\'/g,"'")+"),'"}).replace(d.interpolate,function(a,b){return"',"+b.replace(/\\'/g,
-"'")+",'"}).replace(d.evaluate||null,function(a,b){return"');"+b.replace(/\\'/g,"'").replace(/[\r\n\t]/g," ")+";__p.push('"}).replace(/\r/g,"\\r").replace(/\n/g,"\\n").replace(/\t/g,"\\t")+"');}return __p.join('');",e=new Function("obj","_",d);return c?e(c,b):function(a){return e.call(this,a,b)}};var n=function(a){this._wrapped=a};b.prototype=n.prototype;var u=function(a,c){return c?b(a).chain():a},J=function(a,c){n.prototype[a]=function(){var a=i.call(arguments);H.call(a,this._wrapped);return u(c.apply(b,
-a),this._chain)}};b.mixin(b);j("pop,push,reverse,shift,sort,splice,unshift".split(","),function(a){var b=k[a];n.prototype[a]=function(){b.apply(this._wrapped,arguments);return u(this._wrapped,this._chain)}});j(["concat","join","slice"],function(a){var b=k[a];n.prototype[a]=function(){return u(b.apply(this._wrapped,arguments),this._chain)}});n.prototype.chain=function(){this._chain=true;return this};n.prototype.value=function(){return this._wrapped}}).call(this);
-/* main file */
-
-if ( window.IriSP === undefined && window.__IriSP === undefined ) { 
-	var IriSP = {}; 
-	var __IriSP = IriSP; /* for backward compatibility */
-}
-
-IriSP.loadLibs = function( libs, config, metadata_url, callback ) {
-    // Localize jQuery variable
-		IriSP.jQuery = null;
-    var $L = $LAB.script(libs.jQuery).script(libs.swfObject)
-                .script(libs.jQueryUI)
-                                   
-    if (config.player.type === "jwplayer") {
-      // load our popcorn.js lookalike
-      $L = $L.script(libs.jwplayer);
-    } else {
-      // load the real popcorn
-      $L = $L.script(libs.popcorn).script(libs["popcorn.code"]);
-      if (config.player.type === "youtube") {
-        $L = $L.script(libs["popcorn.youtube"]);
-      } 
-      if (config.player.type === "vimeo")
-        $L = $L.script(libs["popcorn.vimeo"]);
-      
-      /* do nothing for html5 */
-    }       
-    
-    /* widget specific requirements */
-    for (var idx in config.gui.widgets) {
-      if (config.gui.widgets[idx].type === "PolemicWidget") {        
-        $L.script(libs.raphael);
-      }
-    }
-    
-    // same for modules
-    /*
-    for (var idx in config.modules) {
-      if (config.modules[idx].type === "PolemicWidget")
-        $L.script(libs.raphaelJs);
-    }
-    */
-
-    $L.wait(function() {
-      IriSP.jQuery = window.jQuery.noConflict( true );
-      IriSP._ = window._.noConflict();
-      IriSP.underscore = IriSP._;
-      
-      var css_link_jquery = IriSP.jQuery( "<link>", { 
-        rel: "stylesheet", 
-        type: "text/css", 
-        href: libs.cssjQueryUI,
-        'class': "dynamic_css"
-      } );
-      var css_link_custom = IriSP.jQuery( "<link>", { 
-        rel: "stylesheet", 
-        type: "text/css", 
-        href: config.gui.css,
-        'class': "dynamic_css"
-      } );
-      
-      css_link_jquery.appendTo('head');
-      css_link_custom.appendTo('head');
-          
-      IriSP.setupDataLoader();
-      IriSP.__dataloader.get(metadata_url, 
-          function(data) {
-            /* save the data so that we could re-use it to
-               configure the video
-            */
-            IriSP.__jsonMetadata = data;
-            callback.call(window) });
-    });
-};
-IriSP.annotation_template = "{{! template for an annotation displayed in a segmentWidget }}<div title='{{divTitle}}' id='{{id}}'	class='Ldt-iri-chapter' 	style='left: {{startPixel}}px;          width: {{pxWidth}}px;          background-color:#{{hexa_color}};' 	></div>";
-IriSP.annotationWidget_template = "{{! template for the annotation widget }}<div class='Ldt-AnnotationsWidget'>  <!-- ugly div because we want to have a double border -->  <div class='Ldt-Annotation-DoubleBorder'>      <div class='Ldt-AnnotationContent'>        <div class='Ldt-AnnotationShareIcons'>         <a class='Ldt-fbShare' href=''><img src='{{img_dir}}/facebook.png' alt='share on facebook'></img></a>         <a class='Ldt-TwShare' href=''><img src='{{img_dir}}/twitter.png' alt='share on twitter'></img></a>         <a class='Ldt-GplusShare' href=''><img src='{{img_dir}}/google.png' alt='share on google+'></img></a>      </div>		  <div class='Ldt-SaTitle'></div>	  	<div class='Ldt-SaDescription'></div>    </div>  </div></div>";
-IriSP.annotation_loading_template = "{{! template shown while the annotation widget is loading }}<div id='Ldt-load-container'><div id='Ldt-loader'>&nbsp;</div> Chargement... </div>";
-IriSP.arrowWidget_template = "<div class='Ldt-arrowWidget'></div>";
-IriSP.overlay_marker_template = "{{! the template for the small bars which is z-indexed over our segment widget }}<div class='Ldt-SegmentPositionMarker' style='background-color: #F7268E;'></div>";
-IriSP.player_template = "{{! template for the radio player }}<div class='Ldt-controler demo'>	<div class='Ldt-LeftPlayerControls'>    <div class='Ldt-button Ldt-CtrlPlay'></div>		<div class='Ldt-button Ldt-CtrlAnnotate'></div>    <div class='Ldt-button Ldt-CtrlSearch'></div>	</div>		<div class='Ldt-RightPlayerControls'>    <div class='Ldt-Time'>      <div class='Ldt-ElapsedTime'></div>      <div class='Ldt-TimeSeparator'>/</div>      <div class='Ldt-TotalTime'></div>    </div>		<div class='Ldt-button Ldt-CtrlSound'></div>	</div></div>";
-IriSP.search_template = "{{! template for the search container }}<div class='LdtSearchContainer'	style='margin-left: {{margin_left}}; position: absolute; margin-top: -60px;'>	<div class='LdtSearch'		style='display: none; background-color: #EEE; width: 165px; boder: 1px; border-color: #CFCFCF; position: absolute; text-align: center;'>		<input class='LdtSearchInput'			style='margin-top: 2px; margin-bottom: 2px;' />	</div></div><div class='cleaner'></div>";
-IriSP.share_template = "{{! social network sharing template }}<a onclick='__IriSP.MyApiPlayer.share(\'delicious\');' title='partager avec delicious'><span class='share shareDelicious'>&nbsp;</span></a>		<a onclick='__IriSP.MyApiPlayer.share(\'facebook\');' title='partager avec facebook'> <span class='share shareFacebook'>&nbsp;</span></a><a onclick='__IriSP.MyApiPlayer.share(\'twitter\');' title='partager avec twitter'>  <span class='share shareTwitter'>&nbsp;</span></a><a onclick='__IriSP.MyApiPlayer.share(\'myspace\');' title='partager avec Myspace'>  <span class='share shareMySpace'>&nbsp;</span></a>";
-IriSP.sliderWidget_template = "{{! template for the slider widget - it's composed of two divs we one overlayed on top    of the other }}<div class='Ldt-sliderBackground'></div><div class='Ldt-sliderForeground'></div><div class='Ldt-sliderPositionMarker'></div>";
-IriSP.tooltip_template = "{{! template used by the jquery ui tooltip }}<div class='Ldt-tooltip'>  <div class='title'>{{title}}</div>  <div class='time'>{{begin}} : {{end}} </div>  <div class='description'>{{description}}</div></div>";
-IriSP.tooltipWidget_template = "{{! template for the tooltip widget }}<div class='tip'>	<div class='tipcolor' style='height:10px;width:10px'></div>	<div class='tiptext'></div>";
-IriSP.tweetWidget_template = "{{! template for the tweet widget }}<div class='Ldt-tweetWidget'>  <div class='Ldt-tweet-DoubleBorder'>      <img src='{{img_dir}}/minimize.png' class='Ldt-tweetWidgetKeepOpen' alt='dont minimize automatically'></img>      <img src='{{img_dir}}/minimize.png' class='Ldt-tweetWidgetMinimize' alt='minimize window'></img>      <div class='Ldt-tweetAvatar'></div>      <img src='{{img_dir}}/profile_arrow.png' class='Ldt-tweetAvatar-profileArrow'></img>      <div class='Ldt-tweetContents'></div>      <a href='' target='_blank' class='Ldt-Retweet'><div class='Ldt-RetweetIcon'></div> - Retweet </a>      <a href='' target='_blank' class='Ldt-TweetReply'><div class='Ldt-TweetReplyIcon'></div> - Reply</a>  </div></div>";/* wrapper that simulates popcorn.js because
-   popcorn is a bit unstable at the time */
-
-IriSP.PopcornReplacement = {
-  msgPump : {} /* used by jquery to receive and send messages */
-};
-
-IriSP.PopcornReplacement.media = { 
-  "paused": true,
-  "muted": false
-};
-
-IriSP.PopcornReplacement.listen = function(msg, callback) {
-//  IriSP.jQuery(IriSP.PopcornReplacement.msgPump).bind(msg, function(event, rest) { callback(rest); });
-  if (!IriSP.PopcornReplacement.msgPump.hasOwnProperty(msg))
-    IriSP.PopcornReplacement.msgPump[msg] = [];
-
-  IriSP.PopcornReplacement.msgPump[msg].push(callback);
-};
-
-IriSP.PopcornReplacement.trigger = function(msg, params) {
-//  IriSP.jQuery(IriSP.PopcornReplacement.msgPump).trigger(msg, params);
-  
-  if (!IriSP.PopcornReplacement.msgPump.hasOwnProperty(msg))
-    return;
-
-  var d = IriSP.PopcornReplacement.msgPump[msg];
-  for(var entry in d) {
-    d[entry].call(window, params);
-  }
-
-};
-
-IriSP.PopcornReplacement.guid = function(prefix) {
-  var str = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
-      var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
-      return v.toString(16);
-   });
-
-  return prefix + str;
-};
-
-IriSP.PopcornReplacement.__initApi = function() {
-  IriSP.PopcornReplacement.trigger("loadedmetadata"); // we've done more than loading metadata of course,
-                                                      // but popcorn doesn't need to know more.
-  IriSP.PopcornReplacement.media.muted = jwplayer(IriSP.PopcornReplacement._container).getMute();
-};
-
-IriSP.PopcornReplacement.jwplayer = function(container, options) {
-  IriSP.PopcornReplacement._container = container.slice(1); //eschew the '#'
-  options.events = {
-      onReady: IriSP.PopcornReplacement.__initApi,
-      onTime: IriSP.PopcornReplacement.__timeHandler,
-      onPlay: IriSP.PopcornReplacement.__playHandler,
-      onPause: IriSP.PopcornReplacement.__pauseHandler,
-      onSeek: IriSP.PopcornReplacement.__seekHandler 
-      }
-    
-  jwplayer(IriSP.PopcornReplacement._container).setup(options);
-  IriSP.PopcornReplacement.media.duration = options.duration;
-  return IriSP.PopcornReplacement;
-};
-
-IriSP.PopcornReplacement.currentTime = function(time) {
-  if (typeof(time) === "undefined") {
-      return jwplayer(IriSP.PopcornReplacement._container).getPosition();            
-  } else {
-     var currentTime = +time;
-     jwplayer( IriSP.PopcornReplacement._container ).seek( currentTime );
-     IriSP.PopcornReplacement.trigger("seeked");
-     return jwplayer(IriSP.PopcornReplacement._container).getPosition();            
-  }
-};
-
-IriSP.PopcornReplacement.play = function() {
-      IriSP.PopcornReplacement.media.paused = false;
-      IriSP.PopcornReplacement.trigger("play");
-//      IriSP.PopcornReplacement.trigger("playing");
-      jwplayer( IriSP.PopcornReplacement._container ).play();
-};
-    
-IriSP.PopcornReplacement.pause = function() {
-      if ( !IriSP.PopcornReplacement.media.paused ) {
-        IriSP.PopcornReplacement.media.paused = true;
-        IriSP.PopcornReplacement.trigger( "pause" );
-        jwplayer( IriSP.PopcornReplacement._container ).pause();
-      }
-};
-
-IriSP.PopcornReplacement.muted = function(val) {
-  if (typeof(val) !== "undefined") {
-
-    if (jwplayer(IriSP.PopcornReplacement._container).getMute() !== val) {
-      if (val) {
-        jwplayer(IriSP.PopcornReplacement._container).setMute(true);
-        IriSP.PopcornReplacement.media.muted = true;
-      } else {
-        jwplayer( IriSP.PopcornReplacement._container ).setMute(false);
-        IriSP.PopcornReplacement.media.muted = false;
-      }
-
-      IriSP.PopcornReplacement.trigger( "volumechange" );
-    }
-    
-    return jwplayer( IriSP.PopcornReplacement._container ).getMute();
-  } else {
-    return jwplayer( IriSP.PopcornReplacement._container ).getMute();
-  }
-};
-
-IriSP.PopcornReplacement.mute = IriSP.PopcornReplacement.muted;
-
-IriSP.PopcornReplacement.__codes = [];
-IriSP.PopcornReplacement.code = function(options) {
-  IriSP.PopcornReplacement.__codes.push(options);
-  return IriSP.PopcornReplacement;
-};
-
-IriSP.PopcornReplacement.__runCode = function() {
-  var currentTime = jwplayer(IriSP.PopcornReplacement._container).getPosition();
-  var i = 0;
-  for(i = 0; i < IriSP.PopcornReplacement.__codes.length; i++) {
-    var c = IriSP.PopcornReplacement.__codes[i];
-    if (currentTime == c.start) {
-      c.onStart();
-    }
-    
-    if (currentTime == c.end) {
-      c.onEnd();
-    }
-
-  }
-};
-
-/* called everytime the player updates itself 
-   (onTime event)
- */
-
-IriSP.PopcornReplacement.__timeHandler = function(event) {
-  var pos = event.position;
-
-  var i = 0;
-  for(i = 0; i < IriSP.PopcornReplacement.__codes.length; i++) {
-     var c = IriSP.PopcornReplacement.__codes[i];
-     
-     if (pos >= c.start && pos < c.end && 
-         pos - 0.1 <= c.start) {       
-        c.onStart();
-     }
- 
-     if (pos > c.start && pos > c.end && 
-         pos - 0.1 <= c.end) {
-         console.log("eonedn");
-        c.onEnd();
-     }
-   
-  }
- 
-  IriSP.PopcornReplacement.trigger("timeupdate");
-};
-
-IriSP.PopcornReplacement.__seekHandler = function(event) {
-  var i = 0;
-  
-  for(i = 0; i < IriSP.PopcornReplacement.__codes.length; i++) {
-     var c = IriSP.PopcornReplacement.__codes[i];
-    
-     if (event.position >= c.start && event.position < c.end) {        
-        c.onEnd();
-     }         
-   }
-
-   for(i = 0; i < IriSP.PopcornReplacement.__codes.length; i++) {
-     var c = IriSP.PopcornReplacement.__codes[i];
-
-     if (typeof(event.offset) === "undefined")
-       event.offset = 0;
-           
-     if (event.offset >= c.start && event.offset < c.end) { 
-       c.onStart();
-     }
-     
-   }
-
-  IriSP.PopcornReplacement.trigger("timeupdate");
-};
-
-
-IriSP.PopcornReplacement.__playHandler = function(event) {
-  IriSP.PopcornReplacement.media.paused = false;
-  IriSP.PopcornReplacement.trigger("play");
-};
-
-IriSP.PopcornReplacement.__pauseHandler = function(event) {
-  IriSP.PopcornReplacement.media.paused = true;
-  IriSP.PopcornReplacement.trigger("pause");
-};
-
-IriSP.PopcornReplacement.roundTime = function() {
-  var currentTime = IriSP.PopcornReplacement.currentTime();
-  return Math.round(currentTime);
-};
-/* utils.js - various utils that don't belong anywhere else */
-
-/* trace function, for debugging */
-
-IriSP.traceNum = 0;
-IriSP.trace = function( msg, value ) {
-/*
-	if( IriSP.config.gui.debug === true ) {
-		IriSP.traceNum += 1;
-		IriSP.jQuery( "<div>"+IriSP.traceNum+" - "+msg+" : "+value+"</div>" ).appendTo( "#Ldt-output" );
-	}
-*/
-};
-
-/* used in callbacks - because in callbacks we lose "this",
-   we need to have a special function which wraps "this" in 
-   a closure. This way, the 
-*/   
-IriSP.wrap = function (obj, fn) {
-  return function() {    
-    var args = Array.prototype.slice.call(arguments, 0);
-    return fn.apply(obj, args);
-  }
-}
-
-/* convert a time to a percentage in the media */
-IriSP.timeToPourcent = function(time, timetotal){
-	var time = Math.abs(time);
-  var timetotal = Math.abs(timetotal);
-  
-	return Math.floor((time/timetotal) * 100);
-};
-
-IriSP.padWithZeros = function(num) {
-  if (Math.abs(num) < 10) {
-    return "0" + num.toString();
-  } else {
-    return num.toString();
-  }
-};
-/* convert a number of seconds to a tuple of the form 
-   [hours, minutes, seconds]
-*/
-IriSP.secondsToTime = function(secs) {  
-  var hours = Math.abs(parseInt( secs / 3600 ) % 24);
-  var minutes = Math.abs(parseInt( secs / 60 ) % 60);
-  var seconds = parseFloat(Math.abs(secs % 60).toFixed(0));
-  
-  var toString_fn = function() {
-    var ret = "";
-    if (hours > 0)
-       ret = IriSP.padWithZeros(this.hours) + ":";
-    ret += IriSP.padWithZeros(this.minutes) + ":" + IriSP.padWithZeros(this.seconds);
-
-    return ret;
-  }
-  return {"hours" : hours, "minutes" : minutes, "seconds" : seconds, toString: toString_fn};
-};
-
-IriSP.secondsToString
-
-/* format a tweet - replaces @name by a link to the profile, #hashtag, etc. */
-IriSP.formatTweet = function(tweet) {
-  /*
-    an array of arrays which hold a regexp and its replacement.
-  */
-  var regExps = [
-    /* copied from http://codegolf.stackexchange.com/questions/464/shortest-url-regex-match-in-javascript/480#480 */
-    [/((https?:\/\/)?[\w-]+(\.[\w-]+)+\.?(:\d+)?(\/\S*)?)/gi, "<a href='$1'>$1</a>"],
-    [/@(\w+)/gi, "<a href='http://twitter.com/$1'>@$1</a>"], // matches a @handle
-    [/#(\w+)/gi, "<a href='http://twitter.com/search?q=%23$1'>#$1</a>"],// matches a hashtag
-    [/(\+\+)/gi, "<span class='Ldt-PolemicPlusPlus'>$1</span>"],
-    [/(--)/gi, "<span class='Ldt-PolemicMinusMinus'>$1</span>"],
-    [/(==)/gi, "<span class='Ldt-PolemicEqualEqual'>$1</span>"],
-    [/(\?\?)/gi, "<span class='Ldt-PolemicQuestion'>$1</span>"]
-  ]; 
-
-  var i = 0;
-  for(i = 0; i < regExps.length; i++) {
-     tweet = tweet.replace(regExps[i][0], regExps[i][1]);
-  }
-  
-  return tweet;
-};
-
-IriSP.countProperties = function(obj) {
-    var count = 0;
-
-    for(var prop in obj) {
-        if(obj.hasOwnProperty(prop))
-                ++count;
-    }
-
-    return count;
-};
-
-// conversion de couleur Decimal vers HexaDecimal || 000 si fff
-IriSP.DEC_HEXA_COLOR = function (dec) {
-	 var hexa='0123456789ABCDEF';
-   var hex='';
-	 var tmp;
-	 while (dec>15){
-		  tmp = dec-(Math.floor(dec/16))*16;
-		  hex = hexa.charAt(tmp)+hex;
-		  dec = Math.floor(dec/16);
-	 }
-	 hex = hexa.charAt(dec)+hex;	 
-	 return(hex);
-};
-
-/* shortcut to have global variables in templates */
-IriSP.templToHTML = function(template, values) {
-  var params = IriSP.jQuery.extend(IriSP.default_templates_vars, values);
-  return Mustache.to_html(template, params);
-};
-
-/* we need to be stricter than encodeURIComponent,
-   because of twitter
-*/  
-IriSP.encodeURI = function(str) {
-  return encodeURIComponent(str).replace(/!/g, '%21').replace(/'/g, '%27').replace(/\(/g, '%28').  
-                                 replace(/\)/g, '%29').replace(/\*/g, '%2A');  
-}  
-
-IriSP.__guidCounter = 0;
-IriSP.guid = function(prefix) {
-  IriSP.__guidCounter += 1;
-  return prefix + IriSP.__guidCounter;
-};
-/* for ie compatibility
-if (Object.prototype.__defineGetter__&&!Object.defineProperty) {
-   Object.defineProperty=function(obj,prop,desc) {
-      if ("get" in desc) obj.__defineGetter__(prop,desc.get);
-      if ("set" in desc) obj.__defineSetter__(prop,desc.set);
-   }
-}
-*/
-/* data.js - this file deals with how the players gets and sends data */
-
-IriSP.DataLoader = function() {
-  this._cache = {};
-  
-  /*
-    A structure to hold callbacks for specific urls. We need it because
-    ajax calls are asynchronous, so it means that sometimes we ask
-    multiple times for a ressource because the first call hasn't been
-    received yet.
-  */
-  this._callbacks = {};
-};
-
-IriSP.DataLoader.prototype.get = function(url, callback) {
-
-  var base_url = url.split("&")[0]
-  if (this._cache.hasOwnProperty(base_url)) {
-    callback(this._cache[base_url]);
-  } else {  
-    if (!this._callbacks.hasOwnProperty(base_url)) {
-      this._callbacks[base_url] = [];
-      this._callbacks[base_url].push(callback);   
-      /* we need a closure because this gets lost when it's called back */
-  
-      // uncomment you don't want to use caching.
-      // IriSP.jQuery.get(url, callback);
-      
-      var func = function(data) {
-                  this._cache[base_url] = data;                                
-                  var i = 0;
-                  
-                  for (i = 0; i < this._callbacks[base_url].length; i++) {
-                    this._callbacks[base_url][i](this._cache[base_url]);                                  
-                  }
-      };
-      
-      /* automagically choose between json and jsonp */
-      if (url.indexOf(document.location.hostname) === -1 &&
-          url.indexOf("http://") !== -1 /* not a relative url */ ) {
-        // we contacting a foreign domain, use JSONP
-
-        IriSP.jQuery.get(url, {}, IriSP.wrap(this, func), "jsonp");
-      } else {
-
-        // otherwise, hey, whatever rows your boat
-        IriSP.jQuery.get(url, IriSP.wrap(this, func));
-      }
-    
-    } else {
-      /* simply push the callback - it'll get called when the ressource
-         has been received */
-      
-      this._callbacks[base_url].push(callback);   
-   
-    }
-  }
-}
-
-/* the base abstract "class" */
-IriSP.Serializer = function(DataLoader, url) {
-  this._DataLoader = DataLoader;
-  this._url = url;
-  this._data = [];
-};
-
-IriSP.Serializer.prototype.serialize = function(data) { };
-IriSP.Serializer.prototype.deserialize = function(data) {};
-
-IriSP.Serializer.prototype.currentMedia = function() {  
-};
-
-IriSP.Serializer.prototype.sync = function(callback) {  
-  callback.call(this, this._data);  
-};
-
-IriSP.SerializerFactory = function(DataLoader) {
-  this._dataloader = DataLoader;
-};
-
-IriSP.SerializerFactory.prototype.getSerializer = function(metadataOptions) {
-  /* This function returns serializer set-up with the correct
-     configuration - takes a metadata struct describing the metadata source
-  */
-  
-  if (metadataOptions === undefined)
-    /* return an empty serializer */
-    return IriSP.Serializer("", "");
-            
-  switch(metadataOptions.type) {
-    case "json":
-      return new IriSP.JSONSerializer(this._dataloader, metadataOptions.src);
-      break;
-    
-    case "dummy": /* only used for unit testing - not defined in production */
-      return new IriSP.MockSerializer(this._dataloader, metadataOptions.src);
-      break;
-    
-    case "empty":
-      return new IriSP.Serializer("", "empty");
-      break;
-      
-    default:      
-      return undefined;
-  }
-};
-/* site.js - all our site-dependent config : player chrome, cdn locations, etc...*/
-
-IriSP.lib = { 
-		jQuery : "http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.js",
-		jQueryUI : "http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.4/jquery-ui.js",
-		jQueryToolTip : "http://cdn.jquerytools.org/1.2.4/all/jquery.tools.min.js",
-		swfObject : "http://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js",
-		cssjQueryUI : "http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.4/themes/base/jquery-ui.css",
-    popcorn : "/mdp/src/js/libs/popcorn.js",
-    jwplayer : "/mdp/src/js/libs/jwplayer.js",
-    popcornReplacement: "/mdp/src/js/libs/pop.js",
-    raphael: "/mdp/src/js/libs/raphael.js",
-    "popcorn.mediafragment" : "/mdp/src/js/libs/popcorn.mediafragment.js",
-    "popcorn.code" : "/mdp/src/js/libs/popcorn.code.js",
-    "popcorn.jwplayer": "/mdp/src/js/libs/popcorn.jwplayer.js",
-    "popcorn.youtube": "/mdp/src/js/libs/popcorn.youtube.js"
-};
-
-//Player Configuration 
-IriSP.config = undefined;
-
-IriSP.widgetsDefaults = {
-  "LayoutManager" : {spacer_div_height : "0px" },
-  "PlayerWidget" : {},
-  "AnnotationsWidget": {
-    "share_text" : "I'm watching ",     
-    "fb_link" : "http://www.facebook.com/share.php?u=",
-    "tw_link" : "http://twitter.com/home?status=",
-    "gplus_link" : ""
-    },
-  "TweetsWidget" : {
-      default_profile_picture : "https://si0.twimg.com/sticky/default_profile_images/default_profile_1_normal.png",
-      tweet_display_period: 10000 // how long do we show a tweet ?
-  },
-  "SliderWidget" : {
-      minimize_period: 850 // how long does the slider stays maximized after the user leaves the zone ?
-  },
-  "Main" : {
-      autoplay: true
-  }
-  
-};
-
-IriSP.paths = {
-//  "imgs": "/tweetlive/res/metadataplayer/src/css/imgs"
-  "imgs": "/mdp/src/css/imgs"
-};
-IriSP.default_templates_vars = {
-  "img_dir" : IriSP.paths.imgs 
-};
-
-/* ui.js - ui related functions */
-
-/* FIXME: use an sharing library */
-IriSP.LdtShareTool = IriSP.share_template; /* the contents come from share.html */
-
-IriSP.createPlayerChrome = function(){
-	var width = IriSP.config.gui.width;
-	var height = IriSP.config.gui.height;
-	var heightS = IriSP.config.gui.height-20;
-	
-	// AUDIO  */
-	// PB dans le html : ; 
-	IriSP.trace( "__IriSP.createMyHtml",IriSP.config.gui.container );
-
-	
-	/* FIXME : factor this in another file */
-	if( IriSP.config.gui.mode=="radio" ){
-
-		IriSP.jQuery( "#"+IriSP.config.gui.container ).before(IriSP.search_template);
-		var radioPlayer = Mustache.to_html(IriSP.radio_template, {"share_template" : IriSP.share_template});
-		IriSP.jQuery(radioPlayer).appendTo("#"+IriSP.config.gui.container);
-
-		// special tricks for IE 7
-		if (IriSP.jQuery.browser.msie==true && IriSP.jQuery.browser.version=="7.0"){
-			//LdtSearchContainer
-			//__IriSP.jQuery("#LdtPlayer").attr("margin-top","50px");
-			IriSP.jQuery("#Ldt-Root").css("padding-top","25px");
-			IriSP.trace("__IriSP.createHtml","IE7 SPECIAL ");
-		}
-	} else if(IriSP.config.gui.mode=="video") {
-	
-		var videoPlayer = Mustache.to_html(IriSP.video_template, {"share_template" : IriSP.share_template, "heightS" : heightS});
-		IriSP.jQuery(videoPlayer).appendTo("#"+IriSP.config.gui.container);
-	}
-	
-	IriSP.jQuery("#Ldt-Annotations").width(width-(75*2));
-	IriSP.jQuery("#Ldt-Show-Arrow-container").width(width-(75*2));
-	IriSP.jQuery("#Ldt-ShowAnnotation-audio").width(width-10);
-	IriSP.jQuery("#Ldt-ShowAnnotation-video").width(width-10);
-	IriSP.jQuery("#Ldt-SaKeyword").width(width-10);
-	IriSP.jQuery("#Ldt-controler").width(width-10);
-	IriSP.jQuery("#Ldt-Control").attr("z-index","100");
-	IriSP.jQuery("#Ldt-controler").hide();
-	
-	IriSP.jQuery(IriSP.annotation_loading_template).appendTo("#Ldt-ShowAnnotation-audio");
-
-	if(IriSP.config.gui.mode=='radio'){
-		IriSP.jQuery("#Ldt-load-container").attr("width",IriSP.config.gui.width);
-	}
-	// Show or not the output
-	if(IriSP.config.gui.debug===true){
-		IriSP.jQuery("#Ldt-output").show();
-	} else {
-		IriSP.jQuery("#Ldt-output").hide();
-	}
-	
-};
-
-
-/* create the buttons and the slider   */
-IriSP.createInterface = function( width, height, duration ) {
-		
-		IriSP.jQuery( "#Ldt-controler" ).show();
-		//__IriSP.jQuery("#Ldt-Root").css('display','visible');
-		IriSP.trace( "__IriSP.createInterface" , width+","+height+","+duration+"," );
-		
-		IriSP.jQuery( "#Ldt-ShowAnnotation").click( function () { 
-			 //__IriSP.jQuery(this).slideUp(); 
-		} );
-
-		var LdtpPlayerY = IriSP.jQuery("#Ldt-PlaceHolder").attr("top");
-		var LdtpPlayerX = IriSP.jQuery("#Ldt-PlaceHolder").attr("left");
-		
-		IriSP.jQuery( "#slider-range-min" ).slider( { //range: "min",
-			value: 0,
-			min: 1,
-			max: duration/1000,//1:54:52.66 = 3600+3240+
-			step: 0.1,
-			slide: function(event, ui) {
-				
-				//__IriSP.jQuery("#amount").val(ui.value+" s");
-				//player.sendEvent('SEEK', ui.value)
-				IriSP.MyApiPlayer.seek(ui.value);
-				//changePageUrlOffset(ui.value);
-				//player.sendEvent('PAUSE')
-			}
-		} );
-		
-		IriSP.trace("__IriSP.createInterface","ICI");
-		IriSP.jQuery("#amount").val(IriSP.jQuery("#slider-range-min").slider("value")+" s");
-		IriSP.jQuery(".Ldt-Control1 button:first").button({
-			icons: {
-				primary: 'ui-icon-play'
-			},
-			text: false
-		}).next().button({
-			icons: {
-				primary: 'ui-icon-seek-next'
-			},
-			 text: false
-		});
-		IriSP.jQuery(".Ldt-Control2 button:first").button({
-			icons: {
-				primary: 'ui-icon-search'//,
-				//secondary: 'ui-icon-volume-off'
-			},
-			text: false
-		}).next().button({
-			icons: {
-				primary: 'ui-icon-volume-on'
-			},
-			 text: false
-		});
-
-		// /!\ PB A MODIFIER 
-		//__IriSP.MyTags.draw();
-		IriSP.trace("__IriSP.createInterface","ICI2");
-		IriSP.jQuery( "#ldt-CtrlPlay" ).attr( "style", "background-color:#CD21C24;" );
-		
-		IriSP.jQuery( "#Ldt-load-container" ).hide();
-		
-		if( IriSP.config.gui.mode=="radio" & IriSP.jQuery.browser.msie != true ) {
-			IriSP.jQuery( "#Ldtplayer1" ).attr( "height", "0" );
-		}
-		IriSP.trace( "__IriSP.createInterface" , "3" );
-
-		IriSP.trace( "__IriSP.createInterface", "END" );
-		
-	};
-/* the widget classes and definitions */
-
-IriSP.Widget = function(Popcorn, config, Serializer) {
-
-  if (config === undefined || config === null) {
-    config = {}
-  }
-  
-  this._Popcorn = Popcorn;
-  this._config = config;  
-  this._serializer = Serializer;
-  
-  if (config.hasOwnProperty("container")) {
-     this._id = config.container;
-     this.selector = IriSP.jQuery("#" + this._id);
-  }
-
-  if (config.hasOwnProperty("spacer")) {
-     this._spacerId = config.spacer;
-     this.spacer = IriSP.jQuery("#" + this._spacerId);
-  }
-
-
-  if (config.hasOwnProperty("width")) {
-     // this.width and not this._width because we consider it public.
-     this.width = config.width;     
-  }
-  
-  if (config.hasOwnProperty("height")) {    
-     this.height = config.height;     
-  }
-  
-  if (config.hasOwnProperty("heightmax")) {
-     this.heightmax = config.heightmax;     
-  }
-
-  if (config.hasOwnProperty("widthmax")) {
-     this.widthmax = config.widthmax;     
-  }
-  
-};
-
-IriSP.Widget.prototype.draw = function() {
-  /* implemented by "sub-classes" */  
-};
-
-IriSP.Widget.prototype.redraw = function() {
-  /* implemented by "sub-classes" */  
-};
-/* modules are non-graphical entities, similar to widgets */
-
-IriSP.Module = function(Popcorn, config, Serializer) {
-
-  if (config === undefined || config === null) {
-    config = {}
-  }
-  
-  this._Popcorn = Popcorn;
-  this._config = config;  
-  this._serializer = Serializer;
-};
-/* layout.js - very basic layout management */
-
-/*
-  a layout manager manages a div and the layout of objects
-  inside it.
-*/
-
-IriSP.LayoutManager = function(options) {
-    this._Popcorn = null;
-    this._widgets = [];
-    
-    this._div = "LdtPlayer";
-    this._width = 640;
-    
-    if (options === undefined) {
-      options = {};
-    };
-    
-    if (options.hasOwnProperty('container')) {
-      this._div = options.container;
-    }
-
-    if (options.hasOwnProperty('width')) {
-      this._width = options.width;
-    }    
-    
-    if (options.hasOwnProperty('height')) {
-      this._height = options.height;
-    } 
-    
-    /* this is a shortcut */
-    this.selector = IriSP.jQuery("#" + this._div);
-    
-    this.selector.css("width", this._width);
-    
-    if (this._height !== undefined)
-      this.selector.css("height", this._height);
-};
-
-/* we need this special setter because of a chicken and egg problem :
-   we want the manager to use popcorn but the popcorn div will be managed
-   by the manager. So we need a way to set the instance the manager uses
-*/
-   
-IriSP.LayoutManager.prototype.setPopcornInstance = function(popcorn) {
-    this._Popcorn = popcorn;
-}
-
-/* stem is a string to append to the id of the widget */
-IriSP.LayoutManager.prototype.createDiv = function(stem) {
-    if (typeof(stem) === "undefined")
-       stem = "";
-
-    var newDiv = IriSP.guid(this._div + "_widget_" + stem + "_");
-    var spacerDiv = IriSP.guid("LdtPlayer_spacer_");
-    this._widgets.push(newDiv);
-
-    var divTempl = "<div id='{{id}}' style='width: {{width}}px; position: relative;'></div";
-    var spacerTempl = "<div id='{{spacer_id}}' style='width: {{width}}px; position: relative; height: {{spacer_div_height}};'></div";
-    
-    var divCode = Mustache.to_html(divTempl, {id: newDiv, width: this._width});
-    var spacerCode = Mustache.to_html(spacerTempl, {spacer_id: spacerDiv, width: this._width,
-                                                    spacer_div_height: IriSP.widgetsDefaults.LayoutManager.spacer_div_height });
-
-    this.selector.append(divCode);
-    this.selector.append(spacerCode);
-
-    return [newDiv, spacerDiv];
-};
-/* init.js - initialization and configuration of Popcorn and the widgets
-exemple json configuration:
- 
- */
-
-IriSP.setupDataLoader = function() {
-  /* we set it up separately because we need to
-     get data at the very beginning, for instance when
-     setting up the video */
-  IriSP.__dataloader = new IriSP.DataLoader();
-};
-
-IriSP.configurePopcorn = function (layoutManager, options) {
-    var pop;
-    var ret = layoutManager.createDiv(); 
-    var containerDiv = ret[0];
-    
-    switch(options.type) {
-      /*
-        todo : dynamically create the div/video tag which
-        will contain the video.
-      */
-      case "html5":
-           var tmpId = Popcorn.guid("video"); 
-           IriSP.jQuery("#" + containerDiv).append("<video src='" + options.file + "' id='" + tmpId + "'></video>");
-
-           if (options.hasOwnProperty("width"))
-             IriSP.jQuery("#" + containerDiv).css("width", options.width);
-           
-           if (options.hasOwnProperty("height"))
-             IriSP.jQuery("#" + containerDiv).css("height", options.height);
-
-           pop = Popcorn("#" + tmpId);
-        break;
-        
-      case "jwplayer":
-          var opts = IriSP.jQuery.extend({}, options);
-          delete opts.container;
-
-          if (options.provider === "rtmp") {
-            /* exit if we can't access the metadata */
-            if (typeof(IriSP.__jsonMetadata) === "undefined") {
-                break;
-            };
-
-
-            // the json format is totally illogical
-            opts.streamer = IriSP.__jsonMetadata["medias"][0]["meta"]["item"]["value"];
-            var source = IriSP.__jsonMetadata["medias"][0]["href"];
-
-            // the source if a full url but jwplayer wants an url relative to the
-            // streamer url, so we've got to remove the common part.
-            opts.file = source.slice(opts.streamer.length);
-          } else {
-            /* other providers type, video for instance -
-               pass everything as is */
-          }
-
-          pop = IriSP.PopcornReplacement.jwplayer("#" + containerDiv, opts);
-        break;
-      
-      case "youtube":
-          var opts = IriSP.jQuery.extend({}, options);
-          delete opts.container;
-          opts.controls = 0;
-          opts.autostart = false;
-          templ = "width: {{width}}px; height: {{height}}px;";
-          var str = Mustache.to_html(templ, {width: opts.width, height: opts.height});    
-          // Popcorn.youtube wants us to specify the size of the player in the style attribute of its container div.
-          IriSP.jQuery("#" + containerDiv).attr("style", str);
-          
-          pop = Popcorn.youtube("#" + containerDiv, opts.video, opts);
-        break;
-        
-      default:
-        pop = undefined;
-    };
-    
-    return pop;
-};
-
-IriSP.configureWidgets = function (popcornInstance, layoutManager, guiOptions) {
- 
-  var serialFactory = new IriSP.SerializerFactory(IriSP.__dataloader);
-  var params = {width: guiOptions.width, height: guiOptions.height};
-
-  var ret_widgets = [];
-  var index;
-  
-  for (index = 0; index < guiOptions.widgets.length; index++) {    
-    var widgetConfig = guiOptions.widgets[index];
-    var widget = IriSP.instantiateWidget(popcornInstance, serialFactory, layoutManager, widgetConfig);
-    ret_widgets.push(widget);
-   
-  };
-
-  return ret_widgets;
-};
-
-IriSP.configureModules = function (popcornInstance, modulesList) {
- 
-  var serialFactory = new IriSP.SerializerFactory(IriSP.__dataloader);
-  var ret_modules = [];
-  var index;
-  
-  for (index = 0; index < modulesList.length; index++) {    
-    var moduleConfig = modulesList[index];
-    
-    var serializer = serialFactory.getSerializer(moduleConfig.metadata);
-    var module = new IriSP[moduleConfig.type](popcornInstance, moduleConfig, serializer);    
-    ret_modules.push(module);
-  };
-
-  return ret_modules;
-};
-
-IriSP.instantiateWidget = function(popcornInstance, serialFactory, layoutManager, widgetConfig) {
-    /* create div returns us a container for the widget and a spacer */
-    var ret = layoutManager.createDiv(widgetConfig.type);        
-    var container = ret[0];
-    var spacer = ret[1];
-
-    var arr = IriSP.jQuery.extend({}, widgetConfig);
-    arr.container = container;
-    arr.spacer = spacer;
-    
-    var serializer = serialFactory.getSerializer(widgetConfig.metadata);    
-    
-    if (typeof serializer == "undefined")   
-      debugger;
-    
-    // instantiate the object passed as a string
-    var widget = new IriSP[widgetConfig.type](popcornInstance, arr, serializer);    
-    
-    if (widgetConfig.hasOwnProperty("requires")) {
-      // also create the widgets this one depends on.
-      // the dependency widget is available in the parent widget context as
-      // this.WidgetName (for instance, this.TipWidget);
-      
-      var i = 0;
-      for(i = 0; i < widgetConfig.requires.length; i++) {
-        var widgetName = widgetConfig.requires[i]["type"];
-        widget[widgetName] = IriSP.instantiateWidget(popcornInstance, serialFactory, layoutManager, widgetConfig.requires[i]);
-      }
-    }       
-     
-    serializer.sync(IriSP.wrap(widget, function() { this.draw(); }));
-    return widget;
-};
-/* mediafragment module */
-
-IriSP.MediaFragment = function(Popcorn, config, Serializer) {
-  IriSP.Module.call(this, Popcorn, config, Serializer);
-
-  this.mutex = false; /* a mutex because we access the url from two different functions */
-
-  this._Popcorn.listen( "loadedmetadata", IriSP.wrap(this, IriSP.MediaFragment.advanceTime));
-  this._Popcorn.listen( "pause", IriSP.wrap(this, IriSP.MediaFragment.updateTime));
-  this._Popcorn.listen( "seeked", IriSP.wrap(this, IriSP.MediaFragment.updateTime));
-  this._Popcorn.listen( "IriSP.PolemicTweet.click", IriSP.wrap(this, IriSP.MediaFragment.updateAnnotation));
-  this._Popcorn.listen( "IriSP.SegmentsWidget.click", IriSP.wrap(this, IriSP.MediaFragment.updateAnnotation));
-};
-
-IriSP.MediaFragment.advanceTime = function() {
-             var url = window.location.href;
-
-              if ( url.split( "#" )[ 1 ] != null ) {
-                  pageoffset = url.split( "#" )[1];
-
-                  if ( pageoffset.substring(0, 2) === "t=") {
-                    // timecode 
-                    if ( pageoffset.substring( 2 ) != null ) {
-                    var offsettime = pageoffset.substring( 2 );
-                    this._Popcorn.currentTime( parseFloat( offsettime ) );
-                    }
-                  } else if ( pageoffset.substring(0, 2) === "a=") {
-                    // annotation
-                    var annotationId = pageoffset.substring( 2 );
-
-                    // there's no better way than that because
-                    // of possible race conditions
-                    this._serializer.sync(IriSP.wrap(this, function() {
-                          IriSP.MediaFragment.lookupAnnotation.call(this, annotationId); 
-                          }));
-                  }
-              }
-};
-
-IriSP.MediaFragment.updateTime = function() {
-  if (this.mutex === true) {
-    return;
-  }
-
-  var history = window.history;
-  if ( !history.pushState ) {
-    return false;
-  }
-  
-  splitArr = window.location.href.split( "#" )
-  history.replaceState( {}, "", splitArr[0] + "#t=" + this._Popcorn.currentTime().toFixed( 2 ) );
-};
-
-
-IriSP.MediaFragment.updateAnnotation = function(annotationId) {
-  var _this = this;
-  this.mutex = true;
-
-  var history = window.history;
-  if ( !history.pushState ) {
-    return false;
-  }
-  
-  splitArr = window.location.href.split( "#" )
-  history.replaceState( {}, "", splitArr[0] + "#a=" + annotationId);
- 
-  window.setTimeout(function() { _this.mutex = false }, 50);
-};
-
-// lookup and seek to the beginning of an annotation
-IriSP.MediaFragment.lookupAnnotation = function(annotationId) {
-  var annotation = undefined;
-  var annotations = this._serializer._data.annotations;
-
-  var i;
-  for (i = 0; i < annotations.length; i++) {
-      if (annotations[i].id === annotationId) {
-        annotation = annotations[i];
-        break;
-      }
-  }
-
-  if (typeof(annotation) !== "undefined") {
-    this._Popcorn.currentTime(annotation.begin / 1000);
-  }
-};
-IriSP.AnnotationsWidget = function(Popcorn, config, Serializer) {
-  IriSP.Widget.call(this, Popcorn, config, Serializer);
-  
-};
-
-
-IriSP.AnnotationsWidget.prototype = new IriSP.Widget();
-
-IriSP.AnnotationsWidget.prototype.clear = function() {
-    this.selector.find(".Ldt-SaTitle").text("");
-    this.selector.find(".Ldt-SaDescription").text("");
-    this.selector.find(".Ldt-SaKeywordText").text("");
-};
-
-IriSP.AnnotationsWidget.prototype.displayAnnotation = function(annotation) {   
-
-    var title = annotation.content.title;
-    var description = annotation.content.description;
-    var keywords =  "" // FIXME;
-    var begin = +annotation.begin / 1000;
-    var end = +annotation.end / 1000;
-    var duration = +this._serializer.currentMedia().meta["dc:duration"];
-    
-    var title_templ = "{{title}} - ( {{begin}} - {{end}} )";
-    var endstr = Mustache.to_html(title_templ, {title: title, begin: IriSP.secondsToTime(begin), end: IriSP.secondsToTime(end)});
-
-    this.selector.find(".Ldt-SaTitle").text(endstr);
-    this.selector.find(".Ldt-SaDescription").text(description);
-    
-    // update sharing buttons
-    var defaults = IriSP.widgetsDefaults.AnnotationsWidget;
-    var text = defaults.share_text;
-    var fb_link = defaults.fb_link;
-    var tw_link = defaults.tw_link;
-    var gplus_link = defaults.gplus_link;
-    var url = document.location.href + "#a=" + annotation.id;
-    this.selector.find(".Ldt-fbShare").attr("href", fb_link + IriSP.encodeURI(text) + IriSP.encodeURI(url));
-    this.selector.find(".Ldt-TwShare").attr("href", tw_link + IriSP.encodeURI(text) + IriSP.encodeURI(url));
-    this.selector.find(".Ldt-GplusShare").attr("href", fb_link + IriSP.encodeURI(text) + IriSP.encodeURI(url));
-};
-
-IriSP.AnnotationsWidget.prototype.clearWidget = function() {
-
-    
-    /* retract the pane between two annotations */
-    this.selector.find(".Ldt-SaTitle").text("");
-    this.selector.find(".Ldt-SaDescription").text("");
-    this.selector.find(".Ldt-SaKeywordText").html("");
-    this.selector.find(".Ldt-ShowAnnotation").slideUp();
-};
-
-IriSP.AnnotationsWidget.prototype.draw = function() {
-  var _this = this;
-
-  var annotationMarkup = IriSP.templToHTML(IriSP.annotationWidget_template);
-	this.selector.append(annotationMarkup);
-  var view;
-
-  if (typeof(this._serializer._data.views) !== "undefined" && this._serializer._data.views !== null)
-     view = this._serializer._data.views[0];
-
-  var view_type = "";
-
-  if(typeof(view) !== "undefined" && typeof(view.annotation_types) !== "undefined" && view.annotation_types.length > 1) {
-          view_type = view.annotation_types[0];
-  }
- 
-  var annotations = this._serializer._data.annotations;
-  var i;
-  
-	for (i in annotations) {    
-    var annotation = annotations[i];
-    var begin = Math.round((+ annotation.begin) / 1000);
-    var end = Math.round((+ annotation.end) / 1000);
-
-    if (view_type != "" && typeof(annotation.meta) !== "undefined" && typeof(annotation.meta["id-ref"]) !== "undefined"
-          && annotation.meta["id-ref"] != view_type) {
-        continue;
-    }
-
-
-    var conf = {start: begin, end: end, 
-                onStart: 
-                       function(annotation) { 
-                        return function() { 
-                            _this.displayAnnotation(annotation); 
-                          
-                        } }(annotation),
-                onEnd: 
-                       function() { _this.clearWidget.call(_this); }
-                };
-    this._Popcorn = this._Popcorn.code(conf);                                             
-  }
-
-};
-IriSP.ArrowWidget = function(Popcorn, config, Serializer) {
-  IriSP.Widget.call(this, Popcorn, config, Serializer);
-
-  this._oldAnnotation = null;
-  
-};
-
-
-IriSP.ArrowWidget.prototype = new IriSP.Widget();
-
-IriSP.ArrowWidget.prototype.clear = function() {
-
-};
-
-IriSP.ArrowWidget.prototype.clearWidget = function() {
-};
-
-IriSP.ArrowWidget.prototype.draw = function() {
-  var templ = Mustache.to_html(IriSP.arrowWidget_template, {});
-  this.selector.append(templ);
-  this._Popcorn.listen("timeupdate", IriSP.wrap(this, this.timeUpdateHandler));
-};
-
-IriSP.ArrowWidget.prototype.timeUpdateHandler = function(percents) {
-  var currentTime = this._Popcorn.currentTime();
-  var currentAnnotation = this._serializer.currentAnnotations(currentTime)[0]; // FIXME : use the others ?
-
-  /* move the arrow only if the current annotation changes */
-  if (currentAnnotation != this._oldAnnotation) {
-    var begin = (+ currentAnnotation.begin) / 1000;
-    var end = (+ currentAnnotation.end) / 1000;
-
-    var duration = +this._serializer.currentMedia().meta["dc:duration"] / 1000;
-    var middle_time = (begin + end) / 2;
-    var percents = Math.floor((middle_time / duration) * 100);
-
-    // we need to apply a fix because the arrow has a certain length
-    // it's half the length of the arrow (27 / 2). We need to convert
-    // it in percents though.
-    var totalWidth = this.selector.width();
-    var correction = ((27 / 2) / totalWidth) * 100;
-    var corrected_percents = percents - correction;
-
-    /* don't move out of the screen */
-    if (corrected_percents <= 0)
-      corrected_percents = 0;
-
-    this.selector.children(".Ldt-arrowWidget").animate({"left" : corrected_percents + "%"});
-
-    this._oldAnnotation = currentAnnotation;
-  }
-}
-IriSP.PlayerWidget = function(Popcorn, config, Serializer) {
-  IriSP.Widget.call(this, Popcorn, config, Serializer);
-  
-  this._searchBlockOpen = false;
-  this._searchLastValue = "";
-};
-
-IriSP.PlayerWidget.prototype = new IriSP.Widget();
-
-IriSP.PlayerWidget.prototype.draw = function() {
-  var self = this;
-  var width = this.width;
-	var height = this.height;
-	var heightS = this.height-20;
-	  
-	var Player_templ = Mustache.to_html(IriSP.player_template, {"share_template" : IriSP.share_template});
-  this.selector.append(Player_templ);		
-	
-  this.selector.children(".Ldt-controler").show();
-    
-  // handle clicks by the user on the video.
-  this._Popcorn.listen("play", IriSP.wrap(this, this.playButtonUpdater));
-  this._Popcorn.listen("pause", IriSP.wrap(this, this.playButtonUpdater));
-  
-  this._Popcorn.listen("volumechange", IriSP.wrap(this, this.muteButtonUpdater));
-
-  this._Popcorn.listen("timeupdate", IriSP.wrap(this, this.timeDisplayUpdater));
-  this._Popcorn.listen("IriSP.search.matchFound", IriSP.wrap(this, this.searchMatch));
-  this._Popcorn.listen("IriSP.search.noMatchFound", IriSP.wrap(this, this.searchNoMatch));
-  
-  
-  this.selector.find(".Ldt-CtrlPlay").click(function() { self.playHandler.call(self); });
-  this.selector.find(".Ldt-CtrlNext").click(function() { });
-  this.selector.find(".Ldt-CtrlSearch").click(function() { self.searchButtonHandler.call(self); });
-  
-  this.selector.find('.Ldt-CtrlSound').click(function() { self.muteHandler.call(self); } );
-
-  this.selector.find(".Ldt-CtrlPlay").attr( "style", "background-color:#CD21C24;" );
-  
-  var searchButtonPos = this.selector.find(".Ldt-CtrlSearch").position();
-  var searchBox = Mustache.to_html(IriSP.search_template, {margin_left : searchButtonPos.left + "px"});
-  this.selector.append(searchBox);
-  
-  // trigger an IriSP.PlayerWidget.MouseOver to the widgets that are interested (i.e : sliderWidget)
-  this.selector.hover(function() { self._Popcorn.trigger("IriSP.PlayerWidget.MouseOver"); }, 
-                      function() { self._Popcorn.trigger("IriSP.PlayerWidget.MouseOut"); });
- 
-  this.muteButtonUpdater(); /* some player - jwplayer notable - save the state of the mute button between sessions */
-};
-
-/* Update the elasped time div */
-IriSP.PlayerWidget.prototype.timeDisplayUpdater = function() {
-  
-  if (this._previousSecond === undefined)
-    this._previousSecond = this._Popcorn.roundTime();
-  
-  else {
-    /* we're still in the same second, so it's not necessary to update time */
-    if (this._Popcorn.roundTime() == this._previousSecond)
-      return;
-      
-  }
-  
-  // we get it at each call because it may change.
-  var duration = +this._serializer.currentMedia().meta["dc:duration"] / 1000; 
-  var totalTime = IriSP.secondsToTime(duration);
-  var elapsedTime = IriSP.secondsToTime(this._Popcorn.currentTime());
-  
-  this.selector.find(".Ldt-ElapsedTime").html(elapsedTime.toString());
-  this.selector.find(".Ldt-TotalTime").html(totalTime.toString());
-  this._previousSecond = this._Popcorn.roundTime();
-};
-
-/* update the icon of the button - separate function from playHandler
-   because in some cases (for instance, when the user directly clicks on
-   the jwplayer window) we have to change the icon without playing/pausing
-*/
-IriSP.PlayerWidget.prototype.playButtonUpdater = function() {
-  var status = this._Popcorn.media.paused;
-  
-  if ( status == true ){        
-    this.selector.find(".Ldt-CtrlPlay").attr("title", "Play");
-   
-    // we use templToHTML because it has some predefined
-    // vars like where to get the images
-    var templ = IriSP.templToHTML("url({{img_dir}}/play_sprite.png)");
-    this.selector.find(".Ldt-CtrlPlay").css("background-image", templ);
-
-  } else {
-    this.selector.find(".Ldt-CtrlPlay").attr("title", "Pause");
-
-    // we use templToHTML because it has some predefined
-    // vars like where to get the images
-    var templ = IriSP.templToHTML("url({{img_dir}}/pause_sprite.png)");
-    this.selector.find(".Ldt-CtrlPlay").css("background-image", templ);
-  }  
-
-  return;
-};
-
-
-IriSP.PlayerWidget.prototype.playHandler = function() {
-  var status = this._Popcorn.media.paused;
-  
-  if ( status == true ){        
-    this._Popcorn.play();   
-  } else {
-    this._Popcorn.pause();
-  }  
-};
-
-IriSP.PlayerWidget.prototype.muteHandler = function() {
-  if (!this._Popcorn.muted()) {    
-      this._Popcorn.mute(true);
-    } else {
-      this._Popcorn.mute(false);
-    }
-};
-
-IriSP.PlayerWidget.prototype.muteButtonUpdater = function() {
-  var status = this._Popcorn.media.muted;
-  
-  if ( status == true ){        
-    this.selector.find(".Ldt-CtrlSound").attr("title", "Unmute");
-   
-    // we use templToHTML because it has some predefined
-    // vars like where to get the images
-    var templ = IriSP.templToHTML("url({{img_dir}}/sound_sprite.png)");
-    this.selector.find(".Ldt-CtrlSound").css("background-image", templ);
-
-  } else {
-    this.selector.find(".Ldt-CtrlSound").attr("title", "Mute");
-
-    // we use templToHTML because it has some predefined
-    // vars like where to get the images
-    var templ = IriSP.templToHTML("url({{img_dir}}/mute_sprite.png)");
-    this.selector.find(".Ldt-CtrlSound").css("background-image", templ);
-  }  
-
-  return;
-};
-
-
-IriSP.PlayerWidget.prototype.searchButtonHandler = function() {
-    var self = this;
-
-    /* show the search field if it is not shown */
-  	if ( this._searchBlockOpen == false ) {      
-      this.selector.find(".LdtSearch").show(100);
-      
-      this.selector.find(".LdtSearchInput").css('background-color','#fff');
-      this.selector.find(".LdtSearchInput").focus();
-      this.selector.find(".LdtSearchInput").attr('value', this._searchLastValue);      
-      this._Popcorn.trigger("IriSP.search", this._searchLastValue); // trigger the search to make it more natural.
-      
-      this._searchBlockOpen = true;           
-      this.selector.find(".LdtSearchInput").bind('keyup', null, function() { self.searchHandler.call(self); } );
-      
-      // we need this variable because some widget can find a match in
-      // their data while at the same time other's don't. As we want the
-      // search field to become green when there's a match, we need a 
-      // variable to remember that we had one.
-      this._positiveMatch = false;
-
-      // tell the world the field is open
-      this._Popcorn.trigger("IriSP.search.open");
-      
-	} else {
-      this._searchLastValue = this.selector.find(".LdtSearchInput").attr('value');
-      this.selector.find(".LdtSearchInput").attr('value','');
-      this.selector.find(".LdtSearch").hide(100);
-      
-      // unbind the watcher event.
-      this.selector.find(".LdtSearchInput").unbind('keypress set');
-      this._searchBlockOpen = false;
-
-      this._positiveMatch = false;
-      
-      this._Popcorn.trigger("IriSP.search.closed");
-  }
-};
-
-/* this handler is called whenever the content of the search
-   field changes */
-IriSP.PlayerWidget.prototype.searchHandler = function() {
-  this._searchLastValue = this.selector.find(".LdtSearchInput").attr('value');
-  this._positiveMatch = false;
-  
-  // do nothing if the search field is empty, instead of highlighting everything.
-  if (this._searchLastValue == "") {
-    this._Popcorn.trigger("IriSP.search.cleared");
-    this.selector.find(".LdtSearchInput").css('background-color','');
-  } else {
-    this._Popcorn.trigger("IriSP.search", this._searchLastValue);
-  }
-};
-
-/*
-  handler for the IriSP.search.found message, which is sent by some views when they
-  highlight a match.
-*/
-IriSP.PlayerWidget.prototype.searchMatch = function() {
-  this._positiveMatch = true;
-  this.selector.find(".LdtSearchInput").css('background-color','#e1ffe1');
-}
-
-/* the same, except that no value could be found */
-IriSP.PlayerWidget.prototype.searchNoMatch = function() {
-  if (this._positiveMatch !== true)
-    this.selector.find(".LdtSearchInput").css('background-color', "#d62e3a");
-}
-
-/* 
- *   
- *  Copyright 2010 Institut de recherche et d'innovation 
- *  contributor(s) : Samuel Huron 
- *   
- *  contact@iri.centrepompidou.fr
- *  http://www.iri.centrepompidou.fr 
- *   
- *  This software is a computer program whose purpose is to show and add annotations on a video .
- *  This software is governed by the CeCILL-C license under French law and
- *  abiding by the rules of distribution of free software. You can  use, 
- *  modify and/ or redistribute the software under the terms of the CeCILL-C
- *  license as circulated by CEA, CNRS and INRIA at the following URL
- *  "http://www.cecill.info". 
- *  
- *  The fact that you are presently reading this means that you have had
- *  knowledge of the CeCILL-C license and that you accept its terms.
-*/
-// CHART TIMELINE / VERSION PROTOTYPE  ::
-
-IriSP.PolemicWidget = function(Popcorn, config, Serializer) {
-  IriSP.Widget.call(this, Popcorn, config, Serializer);
- 
-  this.userPol    = new Array();
-  this.userNoPol  = new Array();
-  this.userst      = new Array();
-  this.numberOfTweet = 0;
-  this.Users;
-  this.TweetPolemic;
-  this.yMax        = this.height; 
-  this.PaperSlider;
-  this.heightOfChart;
-  this.tweets  = new Array();
-  this.svgElements = {};
-  
-  // Make and define the Raphael area
-  this.paper = Raphael(document.getElementById(this._id), config.width, config.height);
-  
-  this.oldSearchMatches = [];
-
-  // event handlers
-  this._Popcorn.listen("IriSP.search", IriSP.wrap(this, function(searchString) { this.searchHandler(searchString); }));
-  this._Popcorn.listen("IriSP.search.closed", IriSP.wrap(this, this.searchFieldClosedHandler));
-  this._Popcorn.listen("IriSP.search.cleared", IriSP.wrap(this, this.searchFieldClearedHandler));
-
-};
-
-IriSP.PolemicWidget.prototype = new IriSP.Widget();
-  
-IriSP.PolemicWidget.prototype.draw = function() {
-  
-    // variable 
-    // yMax
-    
-    var self = this;
-    var yCoef        = 2;             // coef for height of 1 tweet 
-    var frameSize     = 5;             // frame size 
-    var margin         = 1;            // marge between frame
-    var lineSize      = this.width;        // timeline pixel width 
-    var nbrframes     = lineSize/frameSize;     // frame numbers
-    var numberOfTweet   = 0;            // number of tweet overide later 
-    var duration      = +this._serializer.currentMedia().meta["dc:duration"];      // timescale width 
-    var frameLength   = lineSize / frameSize;    // frame timescale  
-    var timeline;
-    var colors  = new Array("","#1D973D","#C5A62D","#CE0A15","#036AAE","#585858");
-    
-    // array 
-    //var tweets  = new Array();
-    var element = new Array();
-    var cluster = new Array();
-    var frames  = new Array(frameLength);
-    var slices  = new Array();
-    
-    
-    // Classes =======================================================================
-    var Frames = function(){
-      
-      var Myclusters;
-      var x;
-      var y;
-      var width;
-      var height;
-    };
-    Frames = function(json){
-      // make my clusters
-      // ou Frame vide 
-    };
-    Frames.prototype.draw = function(){
-    };
-    Frames.prototype.zoom = function(){
-    };
-    Frames.prototype.inside = function(){
-    };
-    var Clusters = function(){
-      var Object;
-      var yDist;
-      var x;
-      var y;
-      var width;
-      var height;
-    };
-    Clusters = function(json){
-      // make my object
-    };
-    var Tweet = function(){
-    };
-    // Classes =======================================================================
-
-    // Refactoring (parametere) ************************************************************
-    // color translastion
-    var qTweet_0  =0;
-    var qTweet_Q  =0;
-    var qTweet_REF=0;
-    var qTweet_OK =0;
-    var qTweet_KO =0;
-    function colorTranslation(value){
-      if(value == "Q"){
-        qTweet_Q+=1;
-        return 2;
-      }else if(value =="REF"){
-        qTweet_REF+=1;
-        return 4;
-      }else if(value =="OK"){
-        qTweet_OK+=1;
-        return 1;
-      }else if(value =="KO"){
-        qTweet_KO+=1;
-        return 3;
-      }else if(value ==""){
-        qTweet_0+=1;
-        return 5;
-      }
-    }
-    
-
-      this._serializer.sync(function(data) { loaded_callback.call(self, data) });
-      
-      function loaded_callback (json) {
-
-        // get current view (the first ???)
-        view = json.views[0];
-        
-        // the tweets are by definition of the second annotation type FIXME ?
-        tweet_annot_type = null;
-        if(typeof(view.annotation_types) !== "undefined" && view.annotation_types.length > 1) {
-          tweet_annot_type = view.annotation_types[1];
-        }
-      
-      for(var i = 0; i < json.annotations.length; i++) {
-        var item = json.annotations[i];        
-        var MyTime  = Math.floor(item.begin/duration*lineSize);
-        var Myframe = Math.floor(MyTime/lineSize*frameLength);
-
-        if (typeof(item.meta) !== "undefined" 
-          && typeof(item.meta["id-ref"]) !== "undefined"
-          && item.meta["id-ref"] === tweet_annot_type) {
-            
-          var MyTJson = JSON.parse(item.meta['dc:source']['content']);
-          
-            if (item.content['polemics'] != undefined 
-            && item.content['polemics'][0] != null) {
-            
-              // a tweet can have many polemics at the same time.
-              for(var j=0; j<item.content['polemics'].length; j++){
-                  
-                  this.tweets[numberOfTweet] = {
-                        id:i,
-                        qualification:colorTranslation(item.content['polemics'][j]),
-                        yIndicator:MyTime,
-                        yframe:Myframe,
-                        title:item.content['title'],
-                        timeframe:item.begin,
-                        userId: MyTJson.id,
-                        userScreenName: MyTJson.screen_name,
-                        tsource:MyTJson,
-                        cinecast_id: item.id
-                        };
-                  numberOfTweet+=1;
-                  
-              }
-          }
-          else {
-            this.tweets[numberOfTweet] = {
-                  id:i,
-                  qualification:colorTranslation(""),
-                  yIndicator:MyTime,
-                  yframe:Myframe,
-                  title:item.content['title'],
-                  timeframe:item.begin,
-                  userId: MyTJson.id,
-                  userScreenName: MyTJson.screen_name,
-                  tsource:MyTJson,
-                  cinecast_id: item.id
-            };
-            numberOfTweet+=1;
-          }
-          
-        } 
-      };  
-      
-       DrawTweets.call (this); // FIXME: ugly.
-       
-      };      
-
-    // tweet Drawing (in raphael) 
-    function DrawTweets (){
-    // GROUPES TWEET ============================================
-    // Count nbr of cluster and tweet in a frame an save int in "frames"
-      numberOfTweet = this.tweets.length;
-      for(var i=0; i<nbrframes; i++) {  
-        for(var j=0; j<numberOfTweet; j++) {  
-        
-          if (i==this.tweets[j].yframe){
-            
-            var k = this.tweets[j].qualification;
-            
-            // make array for frame cluster
-            if(frames[i]==undefined){
-              frames[i] = {id:i,
-                     qualifVol:new Array(),
-                     mytweetsID:new Array()
-                    };
-            }
-            // add my tweet to frame
-            frames[i].mytweetsID.push(this.tweets[j]);
-            
-            // count opinion by frame
-            if( frames[i].qualifVol[k] == undefined){
-              frames[i].qualifVol[k] = 1;
-            }else{
-              frames[i].qualifVol[k] += 1;
-            }
-            
-          }
-        }
-      }
-    
-    // GROUPES TWEET ============================================    
-    // max of tweet by Frame 
-      var max = 0; 
-      for(var i = 0; i < nbrframes; i++) {
-        var moy  = 0;
-        for (var j = 0; j < 6; j++) {    
-          if (frames[i] != undefined) {
-            if (frames[i].qualifVol[j] != undefined) {
-              moy += frames[i].qualifVol[j];
-            }
-          }
-        }
-        
-        if (moy > max) {
-          max = moy;
-        }
-      }
-    
-      var tweetDrawed = new Array();
-      var TweetHeight = 5;
-      
-      // DRAW  TWEETS ============================================
-      for(var i = 0; i < nbrframes; i++) {
-        var addEheight = 5;
-        if (frames[i] != undefined){                
-          // by type 
-          
-          for (var j = 6; j > -1; j--) {
-            if (frames[i].qualifVol[j] != undefined) {
-              // show tweet by type 
-              for (var k = 0; k < frames[i].mytweetsID.length; k++) {
-              
-                if (frames[i].mytweetsID[k].qualification == j) {                
-                  var x = i * frameSize;
-                  var y = this.heightmax - addEheight;
-                  
-                  if (this.yMax > y) {
-                    this.yMax = y;
-                  }
-                  
-                  var e = this.paper.rect(x, y, frameSize - margin, TweetHeight /* height */)
-                                    .attr({stroke:"#00","stroke-width":0.1,  fill: colors[j]});  
-                  
-                  addEheight += TweetHeight;
-                  
-                  e.color = colors[j];
-                  e.time = frames[i].mytweetsID[k].timeframe;
-                  e.title = frames[i].mytweetsID[k].title;
-                  e.id = frames[i].mytweetsID[k].cinecast_id;
-
-                  this.svgElements[e.id] = e;
-
-                  /*
-                  e.mouseover(function(element) { return function (event) {
-                        // event.clientX and event.clientY are to raphael what event.pageX and pageY are to jquery.                        
-                        self.TooltipWidget.show.call(self.TooltipWidget, element.title, element.attr("fill"), event.clientX - 106, event.clientY - 160);
-                        element.displayed = true;
-                  }}(e)).mouseout(function(element) { return function () {                          
-                          self.TooltipWidget.hide.call(self.TooltipWidget);
-                  }}(e)).mousedown(function () {
-                    self._Popcorn.currentTime(this.time/1000);
-                    self._Popcorn.trigger("IriSP.PolemicTweet.click", this.id); 
-                  });
-                  */
-                  
-                  IriSP.jQuery(e.node).mouseenter(function(element) { return function (event) {                        
-                        // event.clientX and event.clientY are to raphael what event.pageX and pageY are to jquery.                        
-                        self.TooltipWidget.show.call(self.TooltipWidget, element.title, element.attr("fill"), event.pageX - 106, event.pageY - 160);
-                        element.displayed = true;
-                  }}(e)).mousedown(function(element) { return function () {                    
-                    self._Popcorn.currentTime(element.time/1000);
-                    self._Popcorn.trigger("IriSP.PolemicTweet.click", element.id); 
-                    }
-                  }(e));                  
-                  
-                  IriSP.jQuery(e.node).attr('id', 't' + k + '');
-                  IriSP.jQuery(e.node).attr('title', frames[i].mytweetsID[k].title);
-                  IriSP.jQuery(e.node).attr('begin',  frames[i].mytweetsID[k].timeframe);                  
-                }
-              }
-            }
-          }
-        }
-
-      }    
-      // DRAW UI :: resize border and bgd      
-      this.paperBackground = this.paper.rect(0, 0, this.width, this.heightmax).attr({fill:"#F8F8F8","stroke-width":0.1,opacity: 1});  
-
-      // outer borders
-      this.outerBorders   = [];
-      this.outerBorders.push(this.paper.rect(0, this.height - 1, this.width, 1).attr({fill:"#ababab",stroke: "none",opacity: 1}));  
-      this.outerBorders.push(this.paper.rect(0, 0, this.width, 1).attr({fill:"#ababab",stroke: "none",opacity: 1}));  
-
-      // inner borders
-      this.innerBorders   = [];
-      this.innerBorders.push(this.paper.rect(1, this.height - 2, this.width, 1).attr({fill:"#efefef",stroke: "none",opacity: 1}));  
-      this.innerBorders.push(this.paper.rect(1, 1, this.width, 1).attr({fill:"#efefef",stroke: "none",opacity: 1}));  
-      this.innerBorders.push(this.paper.rect(1, 1, 1, this.height - 2).attr({fill:"#d0d1d1",stroke: "none",opacity: 0.8}));  
-      this.innerBorders.push(this.paper.rect(this.width - 2, 1, 1, this.height - 2).attr({fill:"#efefef",stroke: "none",opacity: 1}));  
-
-
-
-      this.paperSlider   = this.paper.rect(0, 0, 0, this.heightmax).attr({fill:"#D4D5D5", stroke: "none", opacity: 1});
-      
-      // the small white line displayed over the slider.
-      this.sliderTip = this.paper.rect(0, 0, 1, this.heightmax).attr({fill:"#fc00ff", stroke: "none", opacity: 1});
-      // decalage 
-      // tweetSelection = this.paper.rect(-100,-100,5,5).attr({fill:"#fff",stroke: "none",opacity: 1});  
-      
-      
-      this.paperSlider.toBack();
-      this.paperBackground.toBack();
-      this.sliderTip.toFront();
-    }
-    
-    this.selector.mouseleave(IriSP.wrap(this, function() { self.TooltipWidget.hide.call(self.TooltipWidget); }));
-    this._Popcorn.listen("timeupdate", IriSP.wrap(this, this.sliderUpdater));
-}
-
-IriSP.PolemicWidget.prototype.sliderUpdater = function() {
-
-    var time = +this._Popcorn.currentTime();
-    var duration = +this._serializer.currentMedia().meta["dc:duration"];
-    
-    this.paperSlider.attr("width", time * (this.width / (duration / 1000)));
-        
-    this.sliderTip.attr("x", time * (this.width / (duration / 1000)));
-};
-    
-IriSP.PolemicWidget.prototype.searchHandler = function(searchString) {
-  if (searchString == "")
-    return;
-
-  var matches = this._serializer.searchTweetsOccurences(searchString);
-
-  if (IriSP.countProperties(matches) > 0) {
-    this._Popcorn.trigger("IriSP.search.matchFound");
-  } else {
-    this._Popcorn.trigger("IriSP.search.noMatchFound");
-  }
-
-  for (var id in matches) {
-    if (this.svgElements.hasOwnProperty(id)) {
-      var e = this.svgElements[id];
-      this.svgElements[id].attr({fill: "#fc00ff"});
-    }
-  }
-
-  // clean up the blocks that were in the previous search
-  // but who aren't in the current one.
-  for (var id in this.oldSearchMatches) {
-    if (!matches.hasOwnProperty(id)) {
-      var e = this.svgElements[id];
-      e.attr({fill: e.color});
-    }
-  }
-  
-  this.oldSearchMatches = matches;
-};
-
-IriSP.PolemicWidget.prototype.searchFieldClearedHandler = function() {
-  // clean up the blocks that were in the previous search
-  // but who aren't in the current one.
-  for (var id in this.oldSearchMatches) {
-      var e = this.svgElements[id];
-      e.attr({fill: e.color});
-  }
- 
-};
-
-IriSP.PolemicWidget.prototype.searchFieldClosedHandler = function() {
-  // clean up the blocks that were in the previous search
-  // but who aren't in the current one.
-  for (var id in this.oldSearchMatches) {
-      var e = this.svgElements[id];
-      e.attr({fill: e.color});
-  }
- 
-};
-   
-IriSP.SegmentsWidget = function(Popcorn, config, Serializer) {
-
-  var self = this;
-  IriSP.Widget.call(this, Popcorn, config, Serializer);
-  this.oldSearchMatches = [];
-
-  // event handlers
-  this._Popcorn.listen("IriSP.search", function(searchString) { self.searchHandler.call(self, searchString); });
-  this._Popcorn.listen("IriSP.search.closed", function() { self.searchFieldClosedHandler.call(self); });
-  this._Popcorn.listen("IriSP.search.cleared", function() { self.searchFieldClearedHandler.call(self); });
-};
-
-IriSP.SegmentsWidget.prototype = new IriSP.Widget();
-
-/* Get the width of a segment, in pixels. */
-IriSP.SegmentsWidget.prototype.segmentToPixel = function(annotation) {  
-  var begin = Math.round((+ annotation.begin) / 1000);
-  var end = Math.round((+ annotation.end) / 1000);    
-  var duration = this._serializer.currentMedia().meta["dc:duration"] / 1000;
-  
-  var startPourcent 	= IriSP.timeToPourcent(begin, duration);
-  var startPixel = Math.floor(this.selector.parent().width() * (startPourcent / 100));
-  
-  var endPourcent 	= Math.floor(IriSP.timeToPourcent(end, duration) - startPourcent);
-  var endPixel = Math.floor(this.selector.parent().width() * (endPourcent / 100));
-  
-  return endPixel;
-};
-
-/* compute the total length of a group of segments */
-IriSP.SegmentsWidget.prototype.segmentsLength = function(segmentsList) {
-  var self = this;
-  var total = 0;
-  
-  for (var i = 0; i < segmentsList.length; i++)
-    total += self.segmentToPixel(segmentsList[i].annotation);
-  
-  return total;  
-};
-
-IriSP.SegmentsWidget.prototype.draw = function() {
-
-  var self = this;
-  var annotations = this._serializer._data.annotations;
-
-  this.selector.addClass("Ldt-SegmentsWidget");
-  this.selector.append(Mustache.to_html(IriSP.overlay_marker_template));
-          
-  var view_type = this._serializer.getNonTweetIds()[0];    
-  
-  this.positionMarker = this.selector.children(":first");
-  
-  this._Popcorn.listen("timeupdate", IriSP.wrap(this, this.positionUpdater));
-  
-  
-  var i = 0;
-  
-  var segments_annotations = [];
-  
-  for (i = 0; i < annotations.length; i++) {
-    var annotation = annotations[i];
-
-    /* filter the annotations whose type is not the one we want */
-    if (view_type != "" && typeof(annotation.meta) !== "undefined" && typeof(annotation.meta["id-ref"]) !== "undefined"
-          && annotation.meta["id-ref"] != view_type) {
-        continue;
-    }
-
-    segments_annotations.push(annotation);
-  }
-    
-  var totalWidth = this.selector.width() - segments_annotations.length;
-  var lastSegment = IriSP.underscore.max(segments_annotations, function(annotation) { return annotation.end; });
-  
-  for (i = 0; i < segments_annotations.length; i++) {
-  
-    var annotation = segments_annotations[i];
-    var begin = (+ annotation.begin);
-    var end = (+ annotation.end);
-    var duration = this._serializer.currentMedia().meta["dc:duration"];
-    var id = annotation.id;
-        
-    var startPixel = Math.floor(this.selector.parent().width() * (begin / duration));
-
-    var endPixel = Math.floor(this.selector.parent().width() * (end / duration));
-    
-    if (annotation.id !== lastSegment.id) 
-      var pxWidth = endPixel - startPixel -1;
-    else
-      /* the last segment has no segment following it */
-      var pxWidth = endPixel - startPixel;
- 
-    var divTitle = (annotation.content.title + " - " + annotation.content.description).substr(0,55);
-
-    if (typeof(annotation.content.color) !== "undefined")
-      var color = annotation.content.color;
-    else
-      var color = annotation.color;
-    
-    var hexa_color = IriSP.DEC_HEXA_COLOR(color);
-
-    if (hexa_color === "FFCC00")
-      hexa_color = "333";
-    if (hexa_color.length == 4)
-      hexa_color = hexa_color + '00';
-    
-    var annotationTemplate = Mustache.to_html(IriSP.annotation_template,
-        {"divTitle" : divTitle, "id" : id, "startPixel" : startPixel,
-        "pxWidth" : pxWidth, "hexa_color" : hexa_color,
-        "seekPlace" : Math.round(begin/1000)});
-
-        
-    this.selector.append(annotationTemplate);
-    
-    /* add a special class to the last segment and change its border */
-    if (annotation.id === lastSegment.id) {
-        this.selector.find("#" + id).addClass("Ldt-lastSegment");        
-        this.selector.find(".Ldt-lastSegment").css("border-color", "#" + hexa_color);        
-    }
-
-    IriSP.jQuery("#" + id).fadeTo(0, 0.3);
-
-    IriSP.jQuery("#" + id).mouseover(
-    /* we wrap the handler in another function because js's scoping
-       rules are function-based - otherwise, the internal vars like
-       divTitle are preserved but they are looked-up from the draw
-       method scope, so after that the loop is run, so they're not
-       preserved */
-    (function(divTitle) { 
-     return function(event) {
-          IriSP.jQuery(this).animate({opacity: 0.6}, 5);
-          var offset = IriSP.jQuery(this).offset();
-          var correction = IriSP.jQuery(this).outerWidth() / 2;
-
-          var offset_x = offset.left + correction - 106;
-          if (offset_x < 0)
-            offset_x = 0;
-                    
-          self.TooltipWidget.show(divTitle, color, offset_x, event.pageY - 160);
-    } })(divTitle)).mouseout(function(){
-      IriSP.jQuery(this).animate({opacity: 0.3}, 5);
-      self.TooltipWidget.hide();
-    });
-
-    IriSP.jQuery("#" + id).click(function(_this, annotation) {
-                                    return function() { _this.clickHandler(annotation)};
-                                 }(this, annotation));
-  }
-};
-
-/* restores the view after a search */
-IriSP.SegmentsWidget.prototype.clear = function() {
-  this.selector.children(".Ldt-iri-chapter").animate({opacity:0.3}, 100);
-};
-
-IriSP.SegmentsWidget.prototype.clickHandler = function(annotation) {
-  this._Popcorn.trigger("IriSP.SegmentsWidget.click", annotation.id);
-  var begin = (+ annotation.begin) / 1000;
-  this._Popcorn.currentTime(Math.round(begin));
-};
-
-IriSP.SegmentsWidget.prototype.searchHandler = function(searchString) {
-
-  if (searchString == "")
-    return;
-
-  var matches = this._serializer.searchOccurences(searchString);
-
-  if (IriSP.countProperties(matches) > 0) {
-    this._Popcorn.trigger("IriSP.search.matchFound");
-  } else {
-    this._Popcorn.trigger("IriSP.search.noMatchFound");
-  }
-
-  // un-highlight all the blocks
-  this.selector.children(".Ldt-iri-chapter").css("opacity", 0.1);
- 
-  // then highlight the ones with matches.
-  for (var id in matches) {
-    var factor = 0.5 + matches[id] * 0.2;
-    this.selector.find("#"+id).dequeue();
-    this.selector.find("#"+id).animate({opacity:factor}, 200);
-  }
-
- 
-  this.oldSearchMatches = matches;
-};
-
-IriSP.SegmentsWidget.prototype.searchFieldClearedHandler = function() {
-  this.clear();
-};
-
-IriSP.SegmentsWidget.prototype.searchFieldClosedHandler = function() {
-  this.clear();
-};
-
-IriSP.SegmentsWidget.prototype.positionUpdater = function() {  
-  var duration = this._serializer.currentMedia().meta["dc:duration"] / 1000;
-  var time = this._Popcorn.currentTime();
-  //var position 	= ((time / duration) * 100).toFixed(2);
-  var position 	= ((time / duration) * 100).toFixed(2);
-
-  this.positionMarker.css("left", position + "%");  
-};
-IriSP.SliderWidget = function(Popcorn, config, Serializer) {
-  IriSP.Widget.call(this, Popcorn, config, Serializer);
-};
-
-IriSP.SliderWidget.prototype = new IriSP.Widget();
-
-IriSP.SliderWidget.prototype.draw = function() {
-  var self = this;
-
-  this.selector.append(Mustache.to_html(IriSP.sliderWidget_template, {}));
-  this.selector.addClass("Ldt-SliderMinimized");
-
-  this.sliderBackground = this.selector.find(".Ldt-sliderBackground");
-  this.sliderForeground = this.selector.find(".Ldt-sliderForeground");
-  this.positionMarker = this.selector.find(".Ldt-sliderPositionMarker");
-
-
-  // a special variable to stop methods from tinkering
-  // with the positionMarker when the user is dragging it
-  this.draggingOngoing = false;
-
-  // another special variable used by the timeout handler to
-  // open or close the slider.
-  this.sliderMaximized = false;
-  this.timeOutId = null;
-
-  
-  this.positionMarker.draggable({axis: "x",
-  start: IriSP.wrap(this, this.positionMarkerDraggingStartedHandler),
-  stop: IriSP.wrap(this, this.positionMarkerDraggedHandler),
-  containment: "parent"
-  });
-  this.positionMarker.css("position", "absolute");
-  
-  this.sliderBackground.click(function(event) { self.backgroundClickHandler.call(self, event); });
-  this.sliderForeground.click(function(event) { self.foregroundClickHandler.call(self, event); });
-
-  this.selector.hover(IriSP.wrap(this, this.mouseOverHandler), IriSP.wrap(this, this.mouseOutHandler));
-
-  // update the positions
-  this._Popcorn.listen("timeupdate", IriSP.wrap(this, this.sliderUpdater));
-
-  // special messages :
-  this._Popcorn.listen("IriSP.PlayerWidget.MouseOver", IriSP.wrap(this, this.mouseOverHandler));
-  this._Popcorn.listen("IriSP.PlayerWidget.MouseOut", IriSP.wrap(this, this.mouseOutHandler));
-};
-
-/* update the slider and the position marker as time passes */
-IriSP.SliderWidget.prototype.sliderUpdater = function() {
-  if(this.draggingOngoing || this._disableUpdate)
-    return;
-  
-  var time = this._Popcorn.currentTime();
-
-  var duration = this._serializer.currentMedia().meta["dc:duration"] / 1000;
-  var percent = ((time / duration) * 100).toFixed(2);
-  
-  /* we do these complicated calculations to center exactly
-     the position Marker */
-  var pixels_to_percents = 100 / this.selector.width(); /* how much is a pixel in percents */
-  var positionMarker_width = this.positionMarker.width();
-  var correction = (pixels_to_percents * positionMarker_width) / 2;
-
-  var newPos = percent - correction;
-  if (newPos <= 0)
-    newPos = 0;
-  
-	this.sliderForeground.css("width", percent + "%");
-	this.positionMarker.css("left", newPos + "%");
-
-};
-
-IriSP.SliderWidget.prototype.backgroundClickHandler = function(event) {
-  /* this piece of code is a little bit convoluted - here's how it works :
-     we want to handle clicks on the progress bar and convert those to seeks in the media.
-     However, jquery only gives us a global position, and we want a number of pixels relative
-     to our container div, so we get the parent position, and compute an offset to this position,
-     and finally compute the progress ratio in the media.
-     Finally we multiply this ratio with the duration to get the correct time
-  */
-
-  var parentOffset = this.sliderBackground.parent().offset();
-  var width = this.sliderBackground.width();
-  var relX = event.pageX - parentOffset.left;
-
-  var duration = this._serializer.currentMedia().meta["dc:duration"] / 1000;
-  var newTime = ((relX / width) * duration).toFixed(2);
-
-  this._Popcorn.currentTime(newTime);
-};
-
-/* same function as the previous one, except that it handles clicks
-   on the foreground element */
-IriSP.SliderWidget.prototype.foregroundClickHandler = function(event) {
-  var parentOffset = this.sliderForeground.parent().offset();
-  var width = this.sliderBackground.width();
-  var relX = event.pageX - parentOffset.left;
-
-  var duration = this._serializer.currentMedia().meta["dc:duration"] / 1000;
-  var newTime = ((relX / width) * duration).toFixed(2);
-
-  this._Popcorn.currentTime(newTime);
-};
-
-/* handles mouse over the slider */
-IriSP.SliderWidget.prototype.mouseOverHandler = function(event) {
-  
-  if (this.timeOutId !== null) {
-    window.clearTimeout(this.timeOutId);
-  }
- 
-  this.sliderMaximized = true;
-
-  this.sliderBackground.animate({"height": "9px"}, 100);
-  this.sliderForeground.animate({"height": "9px"}, 100);
-  this.positionMarker.animate({"height": "9px", "width": "9px"}, 100);
-  //this.positionMarker.css("margin-top", "-4px");
-  
-//  this.selector.removeClass("Ldt-SliderMinimized");
-//  this.selector.addClass("Ldt-SliderMaximized");
-};
-
-/* handles when the mouse leaves the slider */
-IriSP.SliderWidget.prototype.mouseOutHandler = function(event) {
-
-  this.timeOutId = window.setTimeout(IriSP.wrap(this, this.minimizeOnTimeout),
-                                     IriSP.widgetsDefaults.SliderWidget.minimize_period);
-};
-
-IriSP.SliderWidget.prototype.minimizeOnTimeout = function(event) {
-  this.sliderBackground.animate({"height": "5px"}, 100);
-  this.sliderForeground.animate({"height": "5px"}, 100);
-  this.positionMarker.animate({"height": "5px", "width": "5px"}, 100);
-  this.positionMarker.css("margin-top", "0px");
-  this.sliderMinimized = true;
-  
-//  this.selector.removeClass("Ldt-SliderMaximized");
-//  this.selector.addClass("Ldt-SliderMinimized");
-
-};
-
-// called when the user starts dragging the position indicator
-IriSP.SliderWidget.prototype.positionMarkerDraggingStartedHandler = function(event, ui) {  
-  this.draggingOngoing = true;
-};
-
-IriSP.SliderWidget.prototype.positionMarkerDraggedHandler = function(event, ui) {   
-  this._disableUpdate = true; // disable slider position updates while dragging is ongoing.
-  window.setTimeout(IriSP.wrap(this, function() { this._disableUpdate = false; }), 500);
-
-  var parentOffset = this.sliderForeground.parent().offset();
-  var width = this.sliderBackground.width();
-  var relX = event.pageX - parentOffset.left;
-
-  var duration = this._serializer.currentMedia().meta["dc:duration"] / 1000;
-  var newTime = ((relX / width) * duration).toFixed(2);
-
-  this._Popcorn.currentTime(newTime);
-  
-  this.draggingOngoing = false;
-};
-
-/* this widget displays a small tooltip */
-IriSP.TooltipWidget = function(Popcorn, config, Serializer) {
-  IriSP.Widget.call(this, Popcorn, config, Serializer);
-  this._shown = false;
-  this._displayedText = "";
-  this._hideTimeout = -1;
-};
-
-
-IriSP.TooltipWidget.prototype = new IriSP.Widget();
-
-IriSP.TooltipWidget.prototype.draw = function() {
-  var templ = Mustache.to_html(IriSP.tooltipWidget_template);
-
-  this.selector.append(templ);
-  this.hide();
-
-};
-
-IriSP.TooltipWidget.prototype.clear = function() {
-	this.selector.find(".tiptext").text("");
-};
-
-IriSP.TooltipWidget.prototype.show = function(text, color, x, y) {
-
-  if (this._displayedText == text)
-    return;
-  
-  this.selector.find(".tipcolor").css("background-color", color);
-  this._displayedText = text;
-	this.selector.find(".tiptext").text(text);
-  //this.selector.find(".tip").css("left", x).css("top", y);  
-  this.selector.find(".tip").css("left", x).css("top", y);
-  this.selector.find(".tip").show();
-  this._shown = true;
-};
-
-IriSP.TooltipWidget.prototype.hide = function() {                                                   
-  this.selector.find(".tip").hide();
-  this._shown = false;  
-};/* a widget that displays tweet - used in conjunction with the polemicWidget */
-
-IriSP.TweetsWidget = function(Popcorn, config, Serializer) {
-  IriSP.Widget.call(this, Popcorn, config, Serializer);
-
-  this._displayingTweet = false;
-  this._timeoutId = undefined;  
-};
-
-
-IriSP.TweetsWidget.prototype = new IriSP.Widget();
-
-
-IriSP.TweetsWidget.prototype.drawTweet = function(annotation) {
-    
-    var title = IriSP.formatTweet(annotation.content.title);
-    var img = annotation.content.img.src;
-    if (typeof(img) === "undefined" || img === "" || img === "None") {
-      img = IriSP.widgetsDefaults.TweetsWidget.default_profile_picture;
-    }
-
-    var imageMarkup = IriSP.templToHTML("<img src='{{src}}' alt='user image'></img>", 
-                                       {src : img});
-    
-    if (typeof(annotation.meta["dc:source"].content) !== "undefined") {
-      var tweetContents = JSON.parse(annotation.meta["dc:source"].content);
-      var creator = tweetContents.user.screen_name;
-      var real_name = tweetContents.user.name;
-
-      imageMarkup = IriSP.templToHTML("<a href='http://twitter.com/{{creator}}'><img src='{{src}}' alt='user image'></img></a>", 
-                                       {src : img, creator: creator});
-            
-      var formatted_date = new Date(tweetContents.created_at).toLocaleDateString();
-      title = IriSP.templToHTML("<a class='Ldt-tweet_userHandle' href='http://twitter.com/{{creator}}'>@{{creator}}</a> - " + 
-                                "<div class='Ldt-tweet_realName'>{{real_name}}</div>" +
-                                "<div class='Ldt-tweet_tweetContents'>{{{ contents }}}</div>" +
-                                "<div class='Ldt-tweet_date'>{{ date }}</div>", 
-                                {creator: creator, real_name: real_name, contents : title, date : formatted_date});
-
-      this.selector.find(".Ldt-TweetReply").attr("href", "http://twitter.com/home?status=@" + creator + ":%20");
-
-
-      var rtText = Mustache.to_html("http://twitter.com/home?status=RT @{{creator}}: {{text}}",
-                                    {creator: creator, text: IriSP.encodeURI(annotation.content.title)});
-      this.selector.find(".Ldt-Retweet").attr("href", rtText);
-    }
-
-    this.selector.find(".Ldt-tweetContents").html(title);
-    this.selector.find(".Ldt-tweetAvatar").html(imageMarkup);
-    this.selector.show("blind", 250); 
-};
-
-IriSP.TweetsWidget.prototype.displayTweet = function(annotation) {
-  if (this._displayingTweet === false) {
-    this._displayingTweet = true;
-  } else {
-    window.clearTimeout(this._timeoutId);
-  }
-
-  this.drawTweet(annotation);
-
-  var time = this._Popcorn.currentTime();  
-  this._timeoutId = window.setTimeout(IriSP.wrap(this, this.clearPanel), IriSP.widgetsDefaults.TweetsWidget.tweet_display_period);
-};
-
-
-IriSP.TweetsWidget.prototype.clearPanel = function() {  
-    this._displayingTweet = false;
-    this._timeoutId = undefined;
-    this.closePanel();
-    
-};
-
-IriSP.TweetsWidget.prototype.closePanel = function() {
-    if (this._timeoutId != undefined) {
-      /* we're called from the "close window" link */
-      /* cancel the timeout */
-      window.clearTimeout(this._timeoutId);
-      this._timeoutId = null;
-    }
-    
-    this.selector.hide("blind", 400);
-    
-};
-
-/* cancel the timeout if the user clicks on the keep panel open button */
-IriSP.TweetsWidget.prototype.keepPanel = function() {
-    if (this._timeoutId != undefined) {
-      /* we're called from the "close window" link */
-      /* cancel the timeout */
-      window.clearTimeout(this._timeoutId);
-      this._timeoutId = null;
-    }
-};
-
-IriSP.TweetsWidget.prototype.draw = function() {
-  var _this = this;
-  
-  var tweetMarkup = IriSP.templToHTML(IriSP.tweetWidget_template, {"share_template" : IriSP.share_template});
-  this.selector.append(tweetMarkup);
-  this.selector.hide();
-  this.selector.find(".Ldt-tweetWidgetMinimize").click(IriSP.wrap(this, this.closePanel));
-  this.selector.find(".Ldt-tweetWidgetKeepOpen").click(IriSP.wrap(this, this.keepPanel));
-  
-  this._Popcorn.listen("IriSP.PolemicTweet.click", IriSP.wrap(this, this.PolemicTweetClickHandler));
-};
-
-IriSP.TweetsWidget.prototype.PolemicTweetClickHandler = function(tweet_id) {  
-  var index, annotation;
-  for (index in this._serializer._data.annotations) {
-    annotation = this._serializer._data.annotations[index];
-    
-    if (annotation.id === tweet_id)
-      break;
-  }
-    
-  if (annotation.id !== tweet_id)
-      /* we haven't found it */
-      return;
-  
-  this.displayTweet(annotation);
-  return;
-};
-
-IriSP.JSONSerializer = function(DataLoader, url) {
-  IriSP.Serializer.call(this, DataLoader, url);
-};
-
-IriSP.JSONSerializer.prototype = new IriSP.Serializer();
-
-IriSP.JSONSerializer.prototype.serialize = function(data) {
-  return JSON.stringify(data);
-};
-
-IriSP.JSONSerializer.prototype.deserialize = function(data) {
-  return JSON.parse(data);
-};
-
-IriSP.JSONSerializer.prototype.sync = function(callback) {
-  /* we don't have to do much because jQuery handles json for us */
-
-  var self = this;
-
-  var fn = function(data) {      
-      self._data = data;      
-      // sort the data too     
-      self._data["annotations"].sort(function(a, b) 
-          { var a_begin = +a.begin;
-            var b_begin = +b.begin;
-            return a_begin - b_begin;
-          });
-     
-      callback(data);      
-  };
-  
-  this._DataLoader.get(this._url, fn);
-};
-
-IriSP.JSONSerializer.prototype.currentMedia = function() {  
-  return this._data.medias[0]; /* FIXME: don't hardcode it */
-};
-
-/* this function searches for an annotation which matches title, description and keyword 
-   "" matches any field. 
-   Note: it ignores tweets.
-*/    
-IriSP.JSONSerializer.prototype.searchAnnotations = function(title, description, keyword) {
-    /* we can have many types of annotations. We want search to only look for regular segments */
-    /* the next two lines are a bit verbose because for some test data, _serializer.data.view is either
-       null or undefined.
-    */
-    var view;
-
-    if (typeof(this._data.views) !== "undefined" && this._data.views !== null)
-       view = this._data.views[0];
-
-    var searchViewType = "";
-
-    if(typeof(view) !== "undefined" && typeof(view.annotation_types) !== "undefined" && view.annotation_types.length > 1) {
-            searchViewType = view.annotation_types[0];
-    }
-
-    var filterfn = function(annotation) {
-      if( searchViewType  != "" && 
-          typeof(annotation.meta) !== "undefined" && 
-          typeof(annotation.meta["id-ref"]) !== "undefined" &&
-          annotation.meta["id-ref"] !== searchViewType) {
-        return true; // don't pass
-      } else {
-          return false;
-      }
-    };
-
-    return this.searchAnnotationsFilter(title, description, keyword, filterfn);
-
-};
-
-/* only look for tweets */
-IriSP.JSONSerializer.prototype.searchTweets = function(title, description, keyword) {
-    /* we can have many types of annotations. We want search to only look for regular segments */
-    /* the next two lines are a bit verbose because for some test data, _serializer.data.view is either
-       null or undefined.
-    */
-    var view;
-
-    if (typeof(this._data.views) !== "undefined" && this._data.views !== null)
-       view = this._data.views[0];
-
-    var searchViewType = "";
-
-    if(typeof(view) !== "undefined" && typeof(view.annotation_types) !== "undefined" && view.annotation_types.length > 1) {
-            searchViewType = view.annotation_types[0];
-    }
-
-    var filterfn = function(annotation) {
-      if( searchViewType  != "" && 
-          typeof(annotation.meta) !== "undefined" && 
-          typeof(annotation.meta["id-ref"]) !== "undefined" &&
-          annotation.meta["id-ref"] !== searchViewType) {
-        return false; // pass
-      } else {
-          return true;
-      }
-    };
-
-    return this.searchAnnotationsFilter(title, description, keyword, filterfn);
-
-};
-
-/*
-  the previous function call this one, which is more general:
- */    
-IriSP.JSONSerializer.prototype.searchAnnotationsFilter = function(title, description, keyword, filter) {
-
-    var rTitle;
-    var rDescription;
-    var rKeyword;
-    /* match anything if given the empty string */
-    if (title == "")
-      title = ".*";
-    if (description == "")
-      description = ".*";
-    if (keyword == "")
-      keyword = ".*";
-    
-    rTitle = new RegExp(title, "i");  
-    rDescription = new RegExp(description, "i");  
-    rKeyword = new RegExp(keyword, "i");  
-    
-    var ret_array = [];
-    
-    var i;
-    for (i in this._data.annotations) {
-      var annotation = this._data.annotations[i];
-      
-      /* filter the annotations whose type is not the one we want */
-      if (filter(annotation)) {
-          continue;
-      }
-      
-      if (rTitle.test(annotation.content.title) && 
-          rDescription.test(annotation.content.description)) {
-          /* FIXME : implement keyword support */
-          ret_array.push(annotation);
-      }
-    }
-    
-    return ret_array;
-};
-
-/* breaks a string in words and searches each of these words. Returns an array
-   of objects with the id of the annotation and its number of occurences.
-   
-   FIXME: optimize ? seems to be n^2 in the worst case.
-*/
-IriSP.JSONSerializer.prototype.searchOccurences = function(searchString) {
-  var ret = { };
-  var keywords = searchString.split(/\s+/);
-  
-  for (var i in keywords) {
-    var keyword = keywords[i];
-    
-    // search this keyword in descriptions and title
-    var found_annotations = []
-    found_annotations = found_annotations.concat(this.searchAnnotations(keyword, "", ""));
-    found_annotations = found_annotations.concat(this.searchAnnotations("", keyword, ""));
-    
-    for (var j in found_annotations) {
-      var current_annotation = found_annotations[j];
-      
-      if (!ret.hasOwnProperty(current_annotation.id)) {
-        ret[current_annotation.id] = 1;
-      } else {
-        ret[current_annotation.id] += 1;
-      }
-      
-    }
-
-  };
-  
-  return ret;
-};
-
-/* breaks a string in words and searches each of these words. Returns an array
-   of objects with the id of the annotation and its number of occurences.
-   
-   FIXME: optimize ? seems to be n^2 in the worst case.
-*/
-IriSP.JSONSerializer.prototype.searchTweetsOccurences = function(searchString) {
-  var ret = { };
-  var keywords = searchString.split(/\s+/);
-  
-  for (var i in keywords) {
-    var keyword = keywords[i];
-    
-    // search this keyword in descriptions and title
-    var found_annotations = []
-    found_annotations = found_annotations.concat(this.searchTweets(keyword, "", ""));
-    found_annotations = found_annotations.concat(this.searchTweets("", keyword, ""));
-    
-    for (var j in found_annotations) {
-      var current_annotation = found_annotations[j];
-      
-      if (!ret.hasOwnProperty(current_annotation.id)) {
-        ret[current_annotation.id] = 1;
-      } else {
-        ret[current_annotation.id] += 1;
-      }
-      
-    }
-
-  };
-  
-  return ret;
-};
-
-/* takes the currentTime and returns all the annotations that are displayable at the moment 
-   NB: only takes account the first type of annotations - ignores tweets 
-   currentTime is in seconds.
- */
-
-IriSP.JSONSerializer.prototype.currentAnnotations = function(currentTime) {
-  var view;
-  var currentTimeMs = 1000 * currentTime;
-
-  if (typeof(this._data.views) !== "undefined" && this._data.views !== null)
-     view = this._data.views[0];
-
-  var view_type = "";
-
-  if(typeof(view) !== "undefined" && typeof(view.annotation_types) !== "undefined" && view.annotation_types.length >= 1) {
-          view_type = view.annotation_types[0];
-  }
-
-  var ret_array = [];
-  
-  var i;
- 
-  for (i in this._data.annotations) {
-    var annotation = this._data.annotations[i];
-    
-    if (annotation.meta["id-ref"] === view_type && annotation.begin <= currentTimeMs && annotation.end >= currentTimeMs)
-      ret_array.push(annotation);
-  }
-
-  return ret_array;
-};
-
-
-/* this function returns a list of ids of tweet lines */
-IriSP.JSONSerializer.prototype.getTweetIds = function() {
-  if (typeof(this._data.lists) === "undefined" || this._data.lists === null)
-    return [];
-
-  var tweetsId = [];
-  
-  /* first get the list containing the tweets */
-  var tweets = IriSP.underscore.filter(this._data.lists, function(entry) { return entry.id.indexOf("tweet") !== -1 });
-  
-  // FIXME: collect tweets from multiple sources ?
-  tweetsId = IriSP.underscore.pluck(tweets[0].items, "id-ref");
-
-  return tweetsId;
-};
-
-/* this function returns a list of lines which are not tweet lines */
-IriSP.JSONSerializer.prototype.getNonTweetIds = function() {
-  if (typeof(this._data.lists) === "undefined" || this._data.lists === null)
-    return [];
-  
-  /* get all the ids */
-  var ids = IriSP.underscore.map(this._data.lists, function(entry) {                                                         
-                                                         return IriSP.underscore.pluck(entry.items, "id-ref"); });
-                                                         
-  var illegal_values = this.getTweetIds();
-  return IriSP.underscore.difference(ids, illegal_values);
-  
-};
--- a/sbin/res/jsdoc/README.txt	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,183 +0,0 @@
-======================================================================
-
-DESCRIPTION:
-
-This is the source code for JsDoc Toolkit, an automatic documentation
-generation tool for JavaScript. It is written in JavaScript and is run
-from a command line (or terminal) using Java and Mozilla's Rhino
-JavaScript runtime engine.
-
-Using this tool you can automatically turn JavaDoc-like comments in
-your JavaScript source code into published output files, such as HTML
-or XML.
-
-For more information, to report a bug, or to browse the technical
-documentation for this tool please visit the official JsDoc Toolkit
-project homepage at http://code.google.com/p/jsdoc-toolkit/
-
-For the most up-to-date documentation on JsDoc Toolkit see the 
-official wiki at http://code.google.com/p/jsdoc-toolkit/w/list
-
-======================================================================
-
-REQUIREMENTS:
-
-JsDoc Toolkit is known to work with:
-java version "1.6.0_03"
-Java(TM) SE Runtime Environment (build 1.6.0_03-b05)
-on Windows XP,
-and java version "1.5.0_19"
-Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_19-b02-304)
-on Mac OS X 10.5.
-
-Other versions of java may or may not work with JsDoc Toolkit.
-
-======================================================================
-
-USAGE:
-
-Running JsDoc Toolkit requires you to have Java installed on your
-computer. For more information see http://www.java.com/getjava/
-
-Before running the JsDoc Toolkit app you should change your current
-working directory to the jsdoc-toolkit folder. Then follow the
-examples below, or as shown on the project wiki.
-
-On a computer running Windows a valid command line to run JsDoc
-Toolkit might look like this:
-
-> java -jar jsrun.jar app\run.js -a -t=templates\jsdoc mycode.js
-
-On Mac OS X or Linux the same command would look like this:
-
-$ java -jar jsrun.jar app/run.js -a -t=templates/jsdoc mycode.js
-
-The above assumes your current working directory contains jsrun.jar,
-the "app" and "templates" subdirectories from the standard JsDoc
-Toolkit distribution and that the relative path to the code you wish
-to document is "mycode.js".
-
-The output documentation files will be saved to a new directory named
-"out" (by default) in the current directory, or if you specify a
--d=somewhere_else option, to the somewhere_else directory.
-
-For help (usage notes) enter this on the command line:
-
-$ java -jar jsrun.jar app/run.js --help
-
-More information about the various command line options used by JsDoc
-Toolkit are available on the project wiki.
-
-======================================================================
-
-RUNNING VIA SHELL SCRIPT
-
-Avi Deitcher has contributed the file jsrun.sh with the following usage notes:
-
-A script to simplify running jsdoc from the command-line, especially when
-running from within a development or build environment such as ant.
-
-Normally, to run jsdoc, you need a command-line as the following:
-java -Djsdoc.dir=/some/long/dir/path/to/jsdoc -jar
-/some/long/dir/path/to/jsdoc/jsrun.jar /some/long/dir/path/to/jsdoc/app/run.js
--t=template -r=4 /some/long/dir/path/to/my/src/code
-
-This can get tedious to redo time and again, and difficult to use from within a build environment.
-
-To simplify the process, jsrun.sh will automatically run this path, as well as passing through any arguments.
-
-Usage: jsrun.sh <run.js arguments>
-
-All <run.js arguments> will be passed through.
-Additionally, jsrun.sh will take the following actions:
-1) If the environment variable JSDOCDIR is set, it will add
-"-Djsdoc.dir=$JSDOCDIR" to the command-line
-2) If the environment variable JSDOCTEMPLATEDIR is set, it will add
-"-Djsdoc.template.dir=$JSDOCTEMPLATEDIR" to the command-line
-3) java with the appropriate path to jsrun.jar and run.js will be instantiated
-
-If not variables are set, it is assumed that the path to jsrun.jar and app/ is in the current working directory.
-
-Example:
-# jsrun.sh ./src/
-Assuming JSDOCDIR=/some/path/to/my/jsdoc will cause the following command to
-execute:
-java -Djsdoc.dir=/some/path/to/my/jsdoc -jar /some/path/to/my/jsdoc/jsrun.jar
-/some/path/to/my/jsdoc/app/run.js ./src/
-
-======================================================================
-
-TESTING:
-
-To run the suite of unit tests included with JsDoc Toolkit enter this
-on the command line:
-
-$ java -jar jsrun.jar app/run.js -T
-
-To see a dump of the internal data structure that JsDoc Toolkit has
-built from your source files use this command:
-
-$ java -jar jsrun.jar app/run.js mycode.js -Z
-
-======================================================================
-
-LICENSE:
-
-JSDoc.pm
-
-This project is based on the JSDoc.pm tool, created by Michael
-Mathews and Gabriel Reid. More information on JsDoc.pm can
-be found on the JSDoc.pm homepage: http://jsdoc.sourceforge.net/
-
-Complete documentation on JsDoc Toolkit can be found on the project
-wiki at http://code.google.com/p/jsdoc-toolkit/w/list
-
-Rhino
-
-Rhino (JavaScript in Java) is open source and licensed by Mozilla
-under the MPL 1.1 or later/GPL 2.0 or later licenses, the text of
-which is available at http://www.mozilla.org/MPL/
-
-You can obtain the source code for Rhino from the Mozilla web site at
-http://www.mozilla.org/rhino/download.html
-
-JsDoc Toolkit is a larger work that uses the Rhino JavaScript engine
-but is not derived from it in any way. The Rhino library is used 
-without modification and without any claims whatsoever.
-
-The Rhino Debugger
-
-You can obtain more information about the Rhino Debugger from the 
-Mozilla web site at http://www.mozilla.org/rhino/debugger.html
-
-JsDoc Toolkit is a larger work that uses the Rhino Debugger but
-is not derived from it in any way. The Rhino Debugger is used
-without modification and without any claims whatsoever.
-
-JsDoc Toolkit
-
-All code specific to JsDoc Toolkit are free, open source and licensed
-for use under the X11/MIT License.
-
-JsDoc Toolkit is Copyright (c)2009 Michael Mathews <micmath@gmail.com>
-
-This program is free software; you can redistribute it and/or
-modify it under the terms below.
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions: The above copyright notice and this
-permission notice must be included in all copies or substantial
-portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
--- a/sbin/res/jsdoc/app/frame.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,33 +0,0 @@
-IO.include("frame/Opt.js");
-IO.include("frame/Chain.js");
-IO.include("frame/Link.js");
-IO.include("frame/String.js");
-IO.include("frame/Hash.js");
-IO.include("frame/Namespace.js");
-//IO.include("frame/Reflection.js");
-
-/** A few helper functions to make life a little easier. */
-
-function defined(o) {
-	return (o !== undefined);
-}
-
-function copy(o) { // todo check for circular refs
-	if (o == null || typeof(o) != 'object') return o;
-	var c = new o.constructor();
-	for(var p in o)	c[p] = copy(o[p]);
-	return c;
-}
-
-function isUnique(arr) {
-	var l = arr.length;
-	for(var i = 0; i < l; i++ ) {
-		if (arr.lastIndexOf(arr[i]) > i) return false;
-	}
-	return true;
-}
-
-/** Returns the given string with all regex meta characters backslashed. */
-RegExp.escapeMeta = function(str) {
-	return str.replace(/([$^\\\/()|?+*\[\]{}.-])/g, "\\$1");
-}
--- a/sbin/res/jsdoc/app/frame/Chain.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,102 +0,0 @@
-/**@constructor*/
-function ChainNode(object, link) {
-	this.value = object;
-	this.link = link; // describes this node's relationship to the previous node
-}
-
-/**@constructor*/
-function Chain(valueLinks) {
-	this.nodes = [];
-	this.cursor = -1;
-	
-	if (valueLinks && valueLinks.length > 0) {
-		this.push(valueLinks[0], "//");
-		for (var i = 1, l = valueLinks.length; i < l; i+=2) {
-			this.push(valueLinks[i+1], valueLinks[i]);
-		}
-	}
-}
-
-Chain.prototype.push = function(o, link) {
-	if (this.nodes.length > 0 && link) this.nodes.push(new ChainNode(o, link));
-	else this.nodes.push(new ChainNode(o));
-}
-
-Chain.prototype.unshift = function(o, link) {
-	if (this.nodes.length > 0 && link) this.nodes[0].link = link;
-	this.nodes.unshift(new ChainNode(o));
-	this.cursor++;
-}
-
-Chain.prototype.get = function() {
-	if (this.cursor < 0 || this.cursor > this.nodes.length-1) return null;
-	return this.nodes[this.cursor];
-}
-
-Chain.prototype.first = function() {
-	this.cursor = 0;
-	return this.get();
-}
-
-Chain.prototype.last = function() {
-	this.cursor = this.nodes.length-1;
-	return this.get();
-}
-
-Chain.prototype.next = function() {
-	this.cursor++;
-	return this.get();
-}
-
-Chain.prototype.prev = function() {
-	this.cursor--;
-	return this.get();
-}
-
-Chain.prototype.toString = function() {
-	var string = "";
-	for (var i = 0, l = this.nodes.length; i < l; i++) {
-		if (this.nodes[i].link) string += " -("+this.nodes[i].link+")-> ";
-		string += this.nodes[i].value.toString();
-	}
-	return string;
-}
-
-Chain.prototype.joinLeft = function() {
-	var result = "";
-	for (var i = 0, l = this.cursor; i < l; i++) {
-		if (result && this.nodes[i].link) result += this.nodes[i].link;
-		result += this.nodes[i].value.toString();
-	}
-	return result;
-}
-
-
-/* USAGE:
-
-var path = "one/two/three.four/five-six";
-var pathChain = new Chain(path.split(/([\/.-])/));
-print(pathChain);
-
-var lineage = new Chain();
-lineage.push("Port");
-lineage.push("Les", "son");
-lineage.push("Dawn", "daughter");
-lineage.unshift("Purdie", "son");
-
-print(lineage);
-
-// walk left
-for (var node = lineage.last(); node !== null; node = lineage.prev()) {
-	print("< "+node.value);
-}
-
-// walk right
-var node = lineage.first()
-while (node !== null) {
-	print(node.value);
-	node = lineage.next();
-	if (node && node.link) print("had a "+node.link+" named");
-}
-
-*/
\ No newline at end of file
--- a/sbin/res/jsdoc/app/frame/Dumper.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,144 +0,0 @@
-/**
- * @class
-<pre>
-This is a lightly modified version of Kevin Jones' JavaScript
-library Data.Dump. To download the original visit:
-    <a href="http://openjsan.org/doc/k/ke/kevinj/Data/Dump/">http://openjsan.org/doc/k/ke/kevinj/Data/Dump/</a>
-
-AUTHORS
-
-The Data.Dump JavaScript module is written by Kevin Jones 
-(kevinj@cpan.org), based on Data::Dump by Gisle Aas (gisle@aas.no),
-based on Data::Dumper by Gurusamy Sarathy (gsar@umich.edu).
-
-COPYRIGHT
-
-Copyright 2007 Kevin Jones. Copyright 1998-2000,2003-2004 Gisle Aas.
-Copyright 1996-1998 Gurusamy Sarathy.
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the Perl Artistic License
-
-See http://www.perl.com/perl/misc/Artistic.html
-</pre>
- * @static
- */
-Dumper = {
-	/** @param [...] The objects to dump. */
-	dump: function () {
-	    if (arguments.length > 1)
-	        return this._dump(arguments);
-	    else if (arguments.length == 1)
-	        return this._dump(arguments[0]);
-	    else
-	        return "()";
-	},
-	
-	_dump: function (obj) {
-		if (typeof obj == 'undefined') return 'undefined';
-		var out;
-		if (obj.serialize) { return obj.serialize(); }
-		var type = this._typeof(obj);
-		if (obj.circularReference) obj.circularReference++;
-		switch (type) {
-			case 'circular':
-				out = "{ //circularReference\n}";
-				break;
-			case 'object':
-				var pairs = new Array;
-				
-				for (var prop in obj) {
-					if (prop != "circularReference" && obj.hasOwnProperty(prop)) { //hide inherited properties
-						pairs.push(prop + ': ' + this._dump(obj[prop]));
-					}
-				}
-	
-				out = '{' + this._format_list(pairs) + '}';
-				break;
-	
-			case 'string':
-				for (var prop in Dumper.ESC) {
-					if (Dumper.ESC.hasOwnProperty(prop)) {
-						obj = obj.replace(prop, Dumper.ESC[prop]);
-					}
-				}
-	
-			// Escape UTF-8 Strings
-				if (obj.match(/^[\x00-\x7f]*$/)) {
-					out = '"' + obj.replace(/\"/g, "\\\"").replace(/([\n\r]+)/g, "\\$1") + '"';
-				}
-				else {
-					out = "unescape('"+escape(obj)+"')";
-				}
-				break;
-	
-			case 'array':
-				var elems = new Array;
-	
-				for (var i=0; i<obj.length; i++) {
-					elems.push( this._dump(obj[i]) );
-				}
-	
-				out = '[' + this._format_list(elems) + ']';
-				break;
-	
-			case 'date':
-			// firefox returns GMT strings from toUTCString()...
-			var utc_string = obj.toUTCString().replace(/GMT/,'UTC');
-				out = 'new Date("' + utc_string + '")';
-				break;
-	
-			case 'element':
-				// DOM element
-				out = this._dump_dom(obj);
-				break;
-		
-				default:
-					out = obj;
-		}
-	
-		out = String(out).replace(/\n/g, '\n    ');
-		out = out.replace(/\n    (.*)$/,"\n$1");
-	
-		return out;
-	},
-	
-	_format_list: function (list) {
-		if (!list.length) return '';
-		var nl = list.toString().length > 60 ? '\n' : ' ';
-		return nl + list.join(',' + nl) + nl;
-    },
-    
-    _typeof: function (obj) {
-    	if (obj && obj.circularReference && obj.circularReference > 1) return 'circular';
-		if (Array.prototype.isPrototypeOf(obj)) return 'array';
-		if (Date.prototype.isPrototypeOf(obj)) return 'date';
-		if (typeof obj.nodeType != 'undefined') return 'element';
-		return typeof(obj);
-	},
-	
-	_dump_dom: function (obj) {
-		return '"' + Dumper.nodeTypes[obj.nodeType] + '"';
-	}
-};
-
-Dumper.ESC = {
-    "\t": "\\t",
-    "\n": "\\n",
-    "\f": "\\f"
-};
-
-Dumper.nodeTypes = {
-    1: "ELEMENT_NODE",
-    2: "ATTRIBUTE_NODE",
-    3: "TEXT_NODE",
-    4: "CDATA_SECTION_NODE",
-    5: "ENTITY_REFERENCE_NODE",
-    6: "ENTITY_NODE",
-    7: "PROCESSING_INSTRUCTION_NODE",
-    8: "COMMENT_NODE",
-    9: "DOCUMENT_NODE",
-    10: "DOCUMENT_TYPE_NODE",
-    11: "DOCUMENT_FRAGMENT_NODE",
-    12: "NOTATION_NODE"
-};
\ No newline at end of file
--- a/sbin/res/jsdoc/app/frame/Hash.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,84 +0,0 @@
-/**
-	@constructor
-	@example
-	var _index = new Hash();
-	_index.set("a", "apple");
-	_index.set("b", "blue");
-	_index.set("c", "coffee");
-
-	for (var p = _index.first(); p; p = _index.next()) {
-		print(p.key+" is for "+p.value);
-	}
-	
- */
-var Hash = function() {
-	this._map = {};
-	this._keys = [];
-	this._vals = [];
-	this.reset();
-}
-
-Hash.prototype.set = function(k, v) {
-	if (k != "") {
-		this._keys.push(k);
-		this._map["="+k] = this._vals.length;
-		this._vals.push(v);
-	}
-}
-
-Hash.prototype.replace = function(k, k2, v) {
-	if (k == k2) return;
-
-	var offset = this._map["="+k];
-	this._keys[offset] = k2;
-	if (typeof v != "undefined") this._vals[offset] = v;
-	this._map["="+k2] = offset;
-	delete(this._map["="+k]);
-}
-
-Hash.prototype.drop = function(k) {
-	if (k != "") {
-		var offset = this._map["="+k];
-		this._keys.splice(offset, 1);
-		this._vals.splice(offset, 1);
-		delete(this._map["="+k]);
-		for (var p in this._map) {
-			if (this._map[p] >= offset) this._map[p]--;
-		}
-		if (this._cursor >= offset && this._cursor > 0) this._cursor--;
-	}
-}
-
-Hash.prototype.get = function(k) {
-	if (k != "") {
-		return this._vals[this._map["="+k]];
-	}
-}
-
-Hash.prototype.keys = function() {
-	return this._keys;
-}
-
-Hash.prototype.hasKey = function(k) {
-	if (k != "") {
-		return (typeof this._map["="+k] != "undefined");
-	}
-}
-
-Hash.prototype.values = function() {
-	return this._vals;
-}
-
-Hash.prototype.reset = function() {
-	this._cursor = 0;
-}
-
-Hash.prototype.first = function() {
-	this.reset();
-	return this.next();
-}
-
-Hash.prototype.next = function() {
-	if (this._cursor++ < this._keys.length)
-		return {key: this._keys[this._cursor-1], value: this._vals[this._cursor-1]};
-}
\ No newline at end of file
--- a/sbin/res/jsdoc/app/frame/Link.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,173 +0,0 @@
-/** Handle the creation of HTML links to documented symbols.
-	@constructor
-*/
-function Link() {
-	this.alias = "";
-	this.src = "";
-	this.file = "";
-	this.text = "";
-	this.innerName = "";
-	this.classLink = false;
-	this.targetName = "";
-	
-	this.target = function(targetName) {
-		if (defined(targetName)) this.targetName = targetName;
-		return this;
-	}
-	this.inner = function(inner) {
-		if (defined(inner)) this.innerName = inner;
-		return this;
-	}
-	this.withText = function(text) {
-		if (defined(text)) this.text = text;
-		return this;
-	}
-	this.toSrc = function(filename) {
-		if (defined(filename)) this.src = filename;
-		return this;
-	}
-	this.toSymbol = function(alias) {
-		if (defined(alias)) this.alias = new String(alias);
-		return this;
-	}
-	this.toClass = function(alias) {
-		this.classLink = true;
-		return this.toSymbol(alias);
-	}
-	this.toFile = function(file) {
-		if (defined(file)) this.file = file;
-		return this;
-	}
-	
-	this.toString = function() {
-		var linkString;
-		var thisLink = this;
-
-		if (this.alias) {
-			linkString = this.alias.replace(/(^|[^a-z$0-9_#.:^-])([|a-z$0-9_#.:^-]+)($|[^a-z$0-9_#.:^-])/i,
-				function(match, prematch, symbolName, postmatch) {
-					var symbolNames = symbolName.split("|");
-					var links = [];
-					for (var i = 0, l = symbolNames.length; i < l; i++) {
-						thisLink.alias = symbolNames[i];
-						links.push(thisLink._makeSymbolLink(symbolNames[i]));
-					}
-					return prematch+links.join("|")+postmatch;
-				}
-			);
-		}
-		else if (this.src) {
-			linkString = thisLink._makeSrcLink(this.src);
-		}
-		else if (this.file) {
-			linkString = thisLink._makeFileLink(this.file);
-		}
-
-		return linkString;
-	}
-}
-
-/** prefixed for hashes */
-Link.hashPrefix = "";
-
-/** Appended to the front of relative link paths. */
-Link.base = "";
-
-Link.symbolNameToLinkName = function(symbol) {
-	var linker = "",
-		ns = "";
-	
-	if (symbol.isStatic) linker = ".";
-	else if (symbol.isInner) linker = "-";
-	
-	if (symbol.isEvent && !/^event:/.test(symbol.name)) {
-		ns = "event:";
-	}
-	return Link.hashPrefix+linker+ns+symbol.name;
-}
-
-Link.getSymbol= function(alias) {
-    var symbol= Link.symbolSet.getSymbol(alias);
-    
-    if (symbol)
-        return symbol;
-        
-    if ('#'!==alias.charAt(0) || !Link.currentSymbol)
-        return null;
-    
-    //  resolve relative name
-    var container= Link.currentSymbol;
-    
-    while (container)
-    {
-        symbol= Link.symbolSet.getSymbol(container.alias + alias);
-        if (symbol)
-            return symbol;
-        
-        //  No superclass
-        if (!container.augments.length)
-            return null;
-        
-        container= Link.symbolSet.getSymbol(container.augments[0].desc);
-    }
-    
-    return null;
-}
-
-/** Create a link to another symbol. */
-Link.prototype._makeSymbolLink = function(alias) {
-	var linkBase = Link.base+publish.conf.symbolsDir;
-	var linkTo = Link.getSymbol(alias);
-	var linkPath;
-	var target = (this.targetName)? " target=\""+this.targetName+"\"" : "";
-
-	// if there is no symbol by that name just return the name unaltered
-	if (!linkTo)
-	    return this.text || alias;
-	
-	// it's a symbol in another file
-	else {
-		if (!linkTo.is("CONSTRUCTOR") && !linkTo.isNamespace) { // it's a method or property
-			linkPath= (Link.filemap) ? Link.filemap[linkTo.memberOf] :
-				      escape(linkTo.memberOf) || "_global_";
-				linkPath += publish.conf.ext + "#" + Link.symbolNameToLinkName(linkTo);
-		}
-		else {
-			linkPath = (Link.filemap)? Link.filemap[linkTo.alias] : escape(linkTo.alias);
-			linkPath += publish.conf.ext;// + (this.classLink? "":"#" + Link.hashPrefix + "constructor");
-		}
-		linkPath = linkBase + linkPath
-	}
-        
-	var linkText= this.text || alias;
-    
-	var link = {linkPath: linkPath, linkText: linkText, linkInner: (this.innerName? "#"+this.innerName : "")};
-	
-	if (typeof JSDOC.PluginManager != "undefined") {
-		JSDOC.PluginManager.run("onSymbolLink", link);
-	}
-	
-	return "<a href=\""+link.linkPath+link.linkInner+"\""+target+">"+link.linkText+"</a>";
-}
-
-/** Create a link to a source file. */
-Link.prototype._makeSrcLink = function(srcFilePath) {
-	var target = (this.targetName)? " target=\""+this.targetName+"\"" : "";
-		
-	// transform filepath into a filename
-	var srcFile = srcFilePath.replace(/\.\.?[\\\/]/g, "").replace(/[:\\\/]/g, "_");
-	var outFilePath = Link.base + publish.conf.srcDir + srcFile + publish.conf.ext;
-
-	if (!this.text) this.text = FilePath.fileName(srcFilePath);
-	return "<a href=\""+outFilePath+"\""+target+">"+this.text+"</a>";
-}
-
-/** Create a link to a source file. */
-Link.prototype._makeFileLink = function(filePath) {
-	var target = (this.targetName)? " target=\""+this.targetName+"\"" : "";
-		
-	var outFilePath =  Link.base + filePath;
-
-	if (!this.text) this.text = filePath;
-	return "<a href=\""+outFilePath+"\""+target+">"+this.text+"</a>";
-}
\ No newline at end of file
--- a/sbin/res/jsdoc/app/frame/Namespace.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,10 +0,0 @@
-_global_ = this;
-
-function Namespace(name, f) {
-	var n = name.split(".");
-	for (var o = _global_, i = 0, l = n.length; i < l; i++) {
-		o = o[n[i]] = o[n[i]] || {};
-	}
-	
-	if (f) f();
-}
\ No newline at end of file
--- a/sbin/res/jsdoc/app/frame/Opt.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,134 +0,0 @@
-/** @namespace */
-Opt = {
-	/**
-	 * Get commandline option values.
-	 * @param {Array} args Commandline arguments. Like ["-a=xml", "-b", "--class=new", "--debug"]
-	 * @param {object} optNames Map short names to long names. Like {a:"accept", b:"backtrace", c:"class", d:"debug"}.
-	 * @return {object} Short names and values. Like {a:"xml", b:true, c:"new", d:true}
-	 */
-	get: function(args, optNames) {
-		var opt = {"_": []}; // the unnamed option allows multiple values
-		for (var i = 0; i < args.length; i++) {
-			var arg = new String(args[i]);
-			var name;
-			var value;
-			if (arg.charAt(0) == "-") {
-				if (arg.charAt(1) == "-") { // it's a longname like --foo
-					arg = arg.substring(2);
-					var m = arg.split("=");
-					name = m.shift();
-					value = m.shift();
-					if (typeof value == "undefined") value = true;
-					
-					for (var n in optNames) { // convert it to a shortname
-						if (name == optNames[n]) {
-							name = n;
-						}
-					}
-				}
-				else { // it's a shortname like -f
-					arg = arg.substring(1);
-					var m = arg.split("=");
-					name = m.shift();
-					value = m.shift();
-					if (typeof value == "undefined") value = true;
-					
-					for (var n in optNames) { // find the matching key
-						if (name == n || name+'[]' == n) {
-							name = n;
-							break;
-						}
-					}
-				}
-				if (name.match(/(.+)\[\]$/)) { // it's an array type like n[]
-					name = RegExp.$1;
-					if (!opt[name]) opt[name] = [];
-				}
-				
-				if (opt[name] && opt[name].push) {
-					opt[name].push(value);
-				}
-				else {
-					opt[name] = value;
-				}
-			}
-			else { // not associated with any optname
-				opt._.push(args[i]);
-			}
-		}
-		return opt;
-	}
-}
-
-/*t:
-	plan(11, "Testing Opt.");
-	
-	is(
-		typeof Opt,
-		"object",
-		"Opt is an object."
-	);
-	
-	is(
-		typeof Opt.get,
-		"function",
-		"Opt.get is a function."
-	);
-	
-	var optNames = {a:"accept", b:"backtrace", c:"class", d:"debug", "e[]":"exceptions"};
-	var t_options = Opt.get(["-a=xml", "-b", "--class=new", "--debug", "-e=one", "-e=two", "foo", "bar"], optNames);
-	
-	is(
-		t_options.a,
-		"xml",
-		"an option defined with a short name can be accessed by its short name."
-	);
-	
-	is(
-		t_options.b,
-		true,
-		"an option defined with a short name and no value are true."
-	);
-	
-	is(
-		t_options.c,
-		"new",
-		"an option defined with a long name can be accessed by its short name."
-	);
-	
-	is(
-		t_options.d,
-		true,
-		"an option defined with a long name and no value are true."
-	);
-	
-	is(
-		typeof t_options.e,
-		"object",
-		"an option that can accept multiple values is defined."
-	);
-	
-	is(
-		t_options.e.length,
-		2,
-		"an option that can accept multiple values can have more than one value."
-	);
-	
-	is(
-		t_options.e[1],
-		"two",
-		"an option that can accept multiple values can be accessed as an array."
-	);
-	
-	is(
-		typeof t_options._,
-		"object",
-		"the property '_' is defined for unnamed options."
-	);
-	
-	is(
-		t_options._[0],
-		"foo",
-		"the property '_' can be accessed as an array."
-	);
- */
\ No newline at end of file
--- a/sbin/res/jsdoc/app/frame/Reflection.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,26 +0,0 @@
-/**@constructor*/
-function Reflection(obj) {
-	this.obj = obj;
-}
-
-Reflection.prototype.getConstructorName = function() {
-	if (this.obj.constructor.name) return this.obj.constructor.name;
-	var src = this.obj.constructor.toSource();
-	var name = src.substring(name.indexOf("function")+8, src.indexOf('(')).replace(/ /g,'');
-	return name;
-}
-
-Reflection.prototype.getMethod = function(name) {
-	for (var p in this.obj) {
-		if (p == name && typeof(this.obj[p]) == "function") return this.obj[p];
-	}
-	return null;
-}
-
-Reflection.prototype.getParameterNames = function() {
-	var src = this.obj.toSource();
-	src = src.substring(
-		src.indexOf("(", 8)+1, src.indexOf(")")
-	);
-	return src.split(/, ?/);
-}
--- a/sbin/res/jsdoc/app/frame/String.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,93 +0,0 @@
-/**
-	@name String
-	@class Additions to the core string object.
-*/
-
-/** @author Steven Levithan, released as public domain. */
-String.prototype.trim = function() {
-	var str = this.replace(/^\s+/, '');
-	for (var i = str.length - 1; i >= 0; i--) {
-		if (/\S/.test(str.charAt(i))) {
-			str = str.substring(0, i + 1);
-			break;
-		}
-	}
-	return str;
-}
-/*t:
-	plan(6, "Testing String.prototype.trim.");
-	
-	var s = "   a bc   ".trim();
-	is(s, "a bc", "multiple spaces front and back are trimmed.");
-
-	s = "a bc\n\n".trim();
-	is(s, "a bc", "newlines only in back are trimmed.");
-	
-	s = "\ta bc".trim();
-	is(s, "a bc", "tabs only in front are trimmed.");
-	
-	s = "\n \t".trim();
-	is(s, "", "an all-space string is trimmed to empty.");
-	
-	s = "a b\nc".trim();
-	is(s, "a b\nc", "a string with no spaces in front or back is trimmed to itself.");
-	
-	s = "".trim();
-	is(s, "", "an empty string is trimmed to empty.");
-
-*/
-
-String.prototype.balance = function(open, close) {
-	var i = 0;
-	while (this.charAt(i) != open) {
-		if (i == this.length) return [-1, -1];
-		i++;
-	}
-	
-	var j = i+1;
-	var balance = 1;
-	while (j < this.length) {
-		if (this.charAt(j) == open) balance++;
-		if (this.charAt(j) == close) balance--;
-		if (balance == 0) break;
-		j++;
-		if (j == this.length) return [-1, -1];
-	}
-	
-	return [i, j];
-}
-/*t:
-	plan(16, "Testing String.prototype.balance.");
-	
-	var s = "{abc}".balance("{","}");
-	is(s[0], 0, "opener in first is found.");
-	is(s[1], 4, "closer in last is found.");
-	
-	s = "ab{c}de".balance("{","}");
-	is(s[0], 2, "opener in middle is found.");
-	is(s[1], 4, "closer in middle is found.");
-	
-	s = "a{b{c}de}f".balance("{","}");
-	is(s[0], 1, "nested opener is found.");
-	is(s[1], 8, "nested closer is found.");
-	
-	s = "{}".balance("{","}");
-	is(s[0], 0, "opener with no content is found.");
-	is(s[1], 1, "closer with no content is found.");
-	
-	s = "".balance("{","}");
-	is(s[0], -1, "empty string opener is -1.");
-	is(s[1], -1, "empty string closer is -1.");
-	
-	s = "{abc".balance("{","}");
-	is(s[0], -1, "opener with no closer returns -1.");
-	is(s[1], -1, "no closer returns -1.");
-	
-	s = "abc".balance("{","}");
-	is(s[0], -1, "no opener or closer returns -1 for opener.");
-	is(s[1], -1, "no opener or closer returns -1 for closer.");
-	
-	s = "a<bc}de".balance("<","}");
-	is(s[0], 1, "unmatching opener is found.");
-	is(s[1], 4, "unmatching closer is found.");
-*/
\ No newline at end of file
--- a/sbin/res/jsdoc/app/frame/Testrun.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,129 +0,0 @@
-/**
- * @fileOverview
- * @name JsTestrun
- * @author Michael Mathews micmath@gmail.com
- * @url $HeadURL: https://jsdoc-toolkit.googlecode.com/svn/tags/jsdoc_toolkit-2.4.0/jsdoc-toolkit/app/frame/Testrun.js $
- * @revision $Id: Testrun.js 418 2008-01-15 21:40:33Z micmath $
- * @license <a href="http://en.wikipedia.org/wiki/MIT_License">X11/MIT License</a>
- *          (See the accompanying README file for full details.)
- */
- 
-/**
-	Yet another unit testing tool for JavaScript.
-	@author Michael Mathews <a href="mailto:micmath@gmail.com">micmath@gmail.com</a>
-	@param {object} testCases Properties are testcase names, values are functions to execute as tests.
-*/
-function testrun(testCases) {
-	var ran = 0;
-	for (t in testCases) {
-		var result = testCases[t]();
-		ran++;
-	}
-	
-	return testrun.reportOut+"-------------------------------\n"+((testrun.fails>0)? ":( Failed "+testrun.fails+"/" : ":) Passed all ")+testrun.count+" test"+((testrun.count == 1)? "":"s")+".\n";
-}
-
-
-testrun.count = 0;
-testrun.current = null;
-testrun.passes = 0;
-testrun.fails = 0;
-testrun.reportOut = "";
-
-/** @private */
-testrun.report = function(text) {
-	testrun.reportOut += text+"\n";
-}
-
-/**
-	Check if test evaluates to true.
-	@param {string} test To be evaluated.
-	@param {string} message Optional. To be displayed in the report.
-	@return {boolean} True if the string test evaluates to true.
-*/
-ok = function(test, message) {
-	testrun.count++;
-	
-	var result;
-	try {
-		result = eval(test);
-		
-		if (result) {
-			testrun.passes++;
-			testrun.report("    OK "+testrun.count+" - "+((message != null)? message : ""));
-		}
-		else {
-			testrun.fails++;
-			testrun.report("NOT OK "+testrun.count+" - "+((message != null)? message : ""));
-		}
-	}
-	catch(e) {
-		testrun.fails++
-		testrun.report("NOT OK "+testrun.count+" - "+((message != null)? message : ""));
-
-	}
-}
-
-/**
-	Check if test is same as expected.
-	@param {string} test To be evaluated.
-	@param {string} expected
-	@param {string} message Optional. To be displayed in the report. 
-	@return {boolean} True if (test == expected). Note that the comparison is not a strict equality check.
-*/
-is = function(test, expected, message) {
-	testrun.count++;
-	
-	var result;
-	try {
-		result = eval(test);
-		
-		if (result == expected) {
-			testrun.passes++
-			testrun.report("    OK "+testrun.count+" - "+((message != null)? message : ""));
-		}
-		else {
-			testrun.fails++
-			testrun.report("NOT OK "+testrun.count+" - "+((message != null)? message : ""));
-			testrun.report("expected: "+expected);
-			testrun.report("     got: "+result);
-		}
-	}
-	catch(e) {
-		testrun.fails++
-		testrun.report("NOT OK "+testrun.count+" - "+((message != null)? message : ""));
-		testrun.report("expected: "+expected);
-		testrun.report("     got: "+result);}
-}
-
-/**
-	Check if test matches pattern.
-	@param {string} test To be evaluated.
-	@param {string} pattern Used to create a RegExp.
-	@param {string} message Optional. To be displayed in the report.
-	@return {boolean} True if test matches pattern.
-*/
-like = function(test, pattern, message) {
-	testrun.count++;
-
-	var result;
-	try {
-		result = eval(test);
-		var rgx = new RegExp(pattern);
-		
-		if (rgx.test(result)) {
-			testrun.passes++
-			testrun.report("    OK "+testrun.count+" - "+((message != null)? message : ""));
-		}
-		else {
-			testrun.fails++
-			testrun.report("NOT OK "+testrun.count+" - "+((message != null)? message : ""));
-			testrun.report("       this: "+result);
-			testrun.report("is not like: "+pattern);
-		}
-	}
-	catch(e) {
-		testrun.fails++
-		testrun.report("NOT OK "+testrun.count+" - "+((message != null)? message : ""));
-	}
-}
\ No newline at end of file
--- a/sbin/res/jsdoc/app/handlers/FOODOC.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,26 +0,0 @@
-/**
-   This is the main container for the FOODOC handler.
-   @namespace
-*/
-FOODOC = {
-};
-
-/** The current version string of this application. */
-FOODOC.VERSION = "1.0";
-
-FOODOC.handle = function(srcFile, src) {
-	LOG.inform("Handling file '" + srcFile + "'");
-	
-	return [
-		new JSDOC.Symbol(
-			"foo",
-			[],
-			"VIRTUAL",
-			new JSDOC.DocComment("/** This is a foo. */")
-		)
-	];
-};
-
-FOODOC.publish = function(symbolgroup) {
-	LOG.inform("Publishing symbolgroup.");
-};
--- a/sbin/res/jsdoc/app/handlers/XMLDOC.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,26 +0,0 @@
-/**
- * This is the main container for the XMLDOC handler.
- * @namespace
- * @author Brett Fattori (bfattori@fry.com)
- * @version $Revision: 498 $
- */
-XMLDOC = {
-	
-};
-
-/** The current version string of this application. */
-XMLDOC.VERSION = "1.0";
-
-/** Include the library necessary to handle XML files */
-IO.includeDir("handlers/XMLDOC/");
-
-/**
- * @type Symbol[]
- */
-XMLDOC.handle = function(srcFile, src) {
-	
-};
-
-XMLDOC.publish = function(symbolgroup) {
-	
-}
\ No newline at end of file
--- a/sbin/res/jsdoc/app/handlers/XMLDOC/DomReader.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,159 +0,0 @@
-LOG.inform("XMLDOC.DomReader loaded");
-
-XMLDOC.DomReader = function(root) {
-
-   this.dom = root;
-
-   /**
-    * The current node the reader is on
-    */
-   this.node = root;
-
-   /**
-    * Get the current node the reader is on
-    * @type XMLDOC.Parser.node
-    */
-   XMLDOC.DomReader.prototype.getNode = function() {
-      return this.node;
-   };
-
-   /**
-    * Set the node the reader should be positioned on.
-    * @param node {XMLDOC.Parser.node}
-    */
-   XMLDOC.DomReader.prototype.setNode = function(node) {
-      this.node = node;
-   };
-
-   /**
-    * A helper method to make sure the current node will
-    * never return null, unless null is passed as the root.
-    * @param step {String} An expression to evaluate - should return a node or null
-    */
-   XMLDOC.DomReader.prototype.navigate = function(step) {
-      var n;
-      if ((n = step) != null)
-      {
-         this.node = n;
-         return this.node;
-      }
-      return null;
-   };
-
-   /**
-    * Get the root node of the current node's document.
-    */
-   XMLDOC.DomReader.prototype.root = function() {
-      this.navigate(this.dom);
-   };
-
-   /**
-    * Get the parent of the current node.
-    */
-   XMLDOC.DomReader.prototype.parent = function() {
-      return this.navigate(this.node.parentNode());
-   };
-
-   /**
-    * Get the first child of the current node.
-    */
-   XMLDOC.DomReader.prototype.firstChild = function() {
-      return this.navigate(this.node.firstChild());
-   };
-
-   /**
-    * Get the last child of the current node.
-    */
-   XMLDOC.DomReader.prototype.lastChild = function() {
-      return this.navigate(this.node.lastChild());
-   };
-
-   /**
-    * Get the next sibling of the current node.
-    */
-   XMLDOC.DomReader.prototype.nextSibling = function() {
-      return this.navigate(this.node.nextSibling());
-   };
-
-   /**
-    * Get the previous sibling of the current node.
-    */
-   XMLDOC.DomReader.prototype.prevSibling = function() {
-      return this.navigate(this.node.prevSibling());
-   };
-
-   //===============================================================================================
-   // Support methods
-
-   /**
-    * Walk the tree starting with the current node, calling the plug-in for
-    * each node visited.  Each time the plug-in is called, the DomReader
-    * is passed as the only parameter.  Use the {@link XMLDOC.DomReader#getNode} method
-    * to access the current node.   <i>This method uses a depth first traversal pattern.</i>
-    *
-    * @param srcFile {String} The source file being evaluated
-    */
-   XMLDOC.DomReader.prototype.getSymbols = function(srcFile)
-   {
-      XMLDOC.DomReader.symbols = [];
-      XMLDOC.DomReader.currentFile = srcFile;
-      JSDOC.Symbol.srcFile = (srcFile || "");
-
-      if (defined(JSDOC.PluginManager)) {
-         JSDOC.PluginManager.run("onDomGetSymbols", this);
-      }
-
-      return XMLDOC.DomReader.symbols;
-   };
-
-   /**
-    * Find the node with the given name using a depth first traversal.
-    * Does not modify the DomReader's current node.
-    *
-    * @param name {String} The name of the node to find
-    * @return the node that was found, or null if not found
-    */
-   XMLDOC.DomReader.prototype.findNode = function(name)
-   {
-      var findNode = null;
-
-      // Start at the current node and move into the subtree,
-      // looking for the node with the given name
-      function deeper(node, find)
-      {
-         var look = null;
-
-         if (node) {
-            if (node.name == find)
-            {
-               return node;
-            }
-
-            if (node.firstChild())
-            {
-               look = deeper(node.firstChild(), find);
-            }
-
-            if (!look && node.nextSibling())
-            {
-               look = deeper(node.nextSibling(), find);
-            }
-         }
-
-         return look;
-      }
-
-      return deeper(this.getNode().firstChild(), name);
-   };
-
-   /**
-    * Find the next node with the given name using a depth first traversal.
-    *
-    * @param name {String} The name of the node to find
-    */
-   XMLDOC.DomReader.prototype.findPreviousNode = function(name)
-   {
-   };
-
-};
-
--- a/sbin/res/jsdoc/app/handlers/XMLDOC/XMLDoc.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
-LOG.inform("XMLDOC.symbolize loaded");
-
-/**
- * Convert the source file to a set of symbols
- */
-XMLDOC.symbolize = function(srcFile, src) {
-
-   LOG.inform("Symbolizing file '" + srcFile + "'");
-
-   // XML files already have a defined structure, so we don't need to
-   // do anything but parse them.  The DOM reader can create a symbol
-   // table from the parsed XML.
-   var dr = new XMLDOC.DomReader(XMLDOC.Parser.parse(src));
-   return dr.getSymbols(srcFile);
-
-};
--- a/sbin/res/jsdoc/app/handlers/XMLDOC/XMLParse.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,292 +0,0 @@
-LOG.inform("XMLDOC.Parser loaded");
-
-/**
- * XML Parser object.  Returns an {@link #XMLDOC.Parser.node} which is
- * the root element of the parsed document.
- * <p/>
- * By default, this parser will only handle well formed XML.  To
- * allow the parser to handle HTML, set the <tt>XMLDOC.Parser.strictMode</tt>
- * variable to <tt>false</tt> before calling <tt>XMLDOC.Parser.parse()</tt>.
- * <p/>
- * <i>Note: If you pass poorly formed XML, it will cause the parser to throw
- * an exception.</i>
- *
- * @author Brett Fattori (bfattori@fry.com)
- * @author $Author: micmath $
- * @version $Revision: 497 $
- */
-XMLDOC.Parser = {};
-
-/**
- * Strict mode setting.  Setting this to false allows HTML-style source to
- * be parsed.  Normally, well formed XML has defined end tags, or empty tags
- * are properly formed.  Default: <tt>true</tt>
- * @type Boolean
- */
-XMLDOC.Parser.strictMode = true;
-
-/**
- * A node in an XML Document.  Node types are ROOT, ELEMENT, COMMENT, PI, and TEXT.
- * @param parent {XMLDOC.Parser.node} The parent node
- * @param name {String} The node name
- * @param type {String} One of the types
- */
-XMLDOC.Parser.node = function(parent, name, type)
-{
-   this.name = name;
-   this.type = type || "ELEMENT";
-   this.parent = parent;
-   this.charData = "";
-   this.attrs = {};
-   this.nodes = [];
-   this.cPtr = 0;
-
-   XMLDOC.Parser.node.prototype.getAttributeNames = function() {
-      var a = [];
-      for (var o in this.attrs)
-      {
-         a.push(o);
-      }
-
-      return a;
-   };
-
-   XMLDOC.Parser.node.prototype.getAttribute = function(attr) {
-      return this.attrs[attr];
-   };
-
-   XMLDOC.Parser.node.prototype.setAttribute = function(attr, val) {
-      this.attrs[attr] = val;
-   };
-
-   XMLDOC.Parser.node.prototype.getChild = function(idx) {
-      return this.nodes[idx];
-   };
-
-   XMLDOC.Parser.node.prototype.parentNode = function() {
-      return this.parent;
-   };
-
-   XMLDOC.Parser.node.prototype.firstChild = function() {
-      return this.nodes[0];
-   };
-
-   XMLDOC.Parser.node.prototype.lastChild = function() {
-      return this.nodes[this.nodes.length - 1];
-   };
-
-   XMLDOC.Parser.node.prototype.nextSibling = function() {
-      var p = this.parent;
-      if (p && (p.nodes.indexOf(this) + 1 != p.nodes.length))
-      {
-         return p.getChild(p.nodes.indexOf(this) + 1);
-      }
-      return null;
-   };
-
-   XMLDOC.Parser.node.prototype.prevSibling = function() {
-      var p = this.parent;
-      if (p && (p.nodes.indexOf(this) - 1 >= 0))
-      {
-         return p.getChild(p.nodes.indexOf(this) - 1);
-      }
-      return null;
-   };
-};
-
-/**
- * Parse an XML Document from the specified source.  The XML should be
- * well formed, unless strict mode is disabled, then the parser will
- * handle HTML-style XML documents.
- * @param src {String} The source to parse
- */
-XMLDOC.Parser.parse = function(src)
-{
-   var A = [];
-
-   // Normailize whitespace
-   A = src.split("\r\n");
-   src = A.join("\n");
-   A = src.split("\r");
-   src = A.join("\n");
-
-   // Remove XML and DOCTYPE specifier
-   src.replace(/<\?XML .*\?>/i, "");
-   src.replace(/<!DOCTYPE .*\>/i, "");
-
-   // The document is the root node and cannot be modified or removed
-   var doc = new XMLDOC.Parser.node(null, "ROOT", "DOCUMENT");
-
-   // Let's break it down
-   XMLDOC.Parser.eat(doc, src);
-
-   return doc;
-};
-
-/**
- * The XML fragment processing routine.  This method is private and should not be called
- * directly.
- * @param parentNode {XMLDOC.Parser.node} The node which is the parent of this fragment
- * @param src {String} The source within the fragment to process
- * @private
- */
-XMLDOC.Parser.eat = function(parentNode, src)
-{
-   // A simple tag def
-   var reTag = new RegExp("<(!|)(\\?|--|)((.|\\s)*?)\\2>","g");
-
-   // Special tag types
-   var reCommentTag = /<!--((.|\s)*?)-->/;
-   var rePITag = /<\?((.|\s)*?)\?>/;
-
-   // A start tag (with potential empty marker)
-   var reStartTag = /<(.*?)( +([\w_\-]*)=(\"|')(.*)\4)*(\/)?>/;
-
-   // An empty HTML style tag (not proper XML, but we'll accept it so we can process HTML)
-   var reHTMLEmptyTag = /<(.*?)( +([\w_\-]*)=(\"|')(.*)\4)*>/;
-
-   // Fully enclosing tag with nested tags
-   var reEnclosingTag = /<(.*?)( +([\w_\-]*)=(\"|')(.*?)\4)*>((.|\s)*?)<\/\1>/;
-
-   // Breaks down attributes
-   var reAttributes = new RegExp(" +([\\w_\\-]*)=(\"|')(.*?)\\2","g");
-
-   // Find us a tag
-   var tag;
-   while ((tag = reTag.exec(src)) != null)
-   {
-      if (tag.index > 0)
-      {
-         // The next tag has some text before it
-         var text = src.substring(0, tag.index).replace(/^[ \t\n]+((.|\n)*?)[ \t\n]+$/, "$1");
-
-         if (text.length > 0 && (text != "\n"))
-         {
-            var txtnode = new XMLDOC.Parser.node(parentNode, "", "TEXT");
-            txtnode.charData = text;
-
-            // Append the new text node
-            parentNode.nodes.push(txtnode);
-         }
-
-         // Reset the lastIndex of reTag
-         reTag.lastIndex -= src.substring(0, tag.index).length;
-
-         // Eat the text
-         src = src.substring(tag.index);
-      }
-
-      if (reCommentTag.test(tag[0]))
-      {
-         // Is this a comment?
-         var comment = new XMLDOC.Parser.node(parentNode, "", "COMMENT");
-         comment.charData = reCommentTag.exec(tag[0])[1];
-
-         // Append the comment
-         parentNode.nodes.push(comment);
-
-         // Move the lastIndex of reTag
-         reTag.lastIndex -= tag[0].length;
-
-         // Eat the tag
-         src = src.replace(reCommentTag, "");
-      }
-      else if (rePITag.test(tag[0]))
-      {
-         // Is this a processing instruction?
-         var pi = new XMLDOC.Parser.node(parentNode, "", "PI");
-         pi.charData = rePITag.exec(tag[0])[1];
-
-         // Append the processing instruction
-         parentNode.nodes.push(pi);
-
-         // Move the lastIndex of reTag
-         reTag.lastIndex -= tag[0].length;
-
-         // Eat the tag
-         src = src.replace(rePITag, "");
-      }
-      else if (reStartTag.test(tag[0]))
-      {
-         // Break it down
-         var e = reStartTag.exec(tag[0]);
-         var elem = new XMLDOC.Parser.node(parentNode, e[1], "ELEMENT");
-
-         // Get attributes from the tag
-         var a;
-         while ((a = reAttributes.exec(e[2])) != null )
-         {
-            elem.attrs[a[1]] = a[3];
-         }
-
-         // Is this an empty XML-style tag?
-         if (e[6] == "/")
-         {
-            // Append the empty element
-            parentNode.nodes.push(elem);
-
-            // Move the lastIndex of reTag (include the start tag length)
-            reTag.lastIndex -= e[0].length;
-
-            // Eat the tag
-            src = src.replace(reStartTag, "");
-         }
-         else
-         {
-            // Check for malformed XML tags
-            var htmlParsed = false;
-            var htmlStartTag = reHTMLEmptyTag.exec(src);
-
-            // See if there isn't an end tag within this block
-            var reHTMLEndTag = new RegExp("</" + htmlStartTag[1] + ">");
-            var htmlEndTag = reHTMLEndTag.exec(src);
-
-            if (XMLDOC.Parser.strictMode && htmlEndTag == null)
-            {
-               // Poorly formed XML fails in strict mode
-               var err = new Error("Malformed XML passed to XMLDOC.Parser... Error contains malformed 'src'");
-               err.src = src;
-               throw err;
-            }
-            else if (htmlEndTag == null)
-            {
-               // This is an HTML-style empty tag, store the element for it in non-strict mode
-               parentNode.nodes.push(elem);
-
-               // Eat the tag
-               src = src.replace(reHTMLEmptyTag, "");
-               htmlParsed = true;
-            }
-
-            // If we didn't parse HTML-style, it must be an enclosing tag
-            if (!htmlParsed)
-            {
-               var enc = reEnclosingTag.exec(src);
-
-               // Go deeper into the document
-               XMLDOC.Parser.eat(elem, enc[6]);
-
-               // Append the new element node
-               parentNode.nodes.push(elem);
-
-               // Eat the tag
-               src = src.replace(reEnclosingTag, "");
-            }
-         }
-
-         // Reset the lastIndex of reTag
-         reTag.lastIndex = 0;
-      }
-   }
-
-   // No tag was found... append the text if there is any
-   src = src.replace(/^[ \t\n]+((.|\n)*?)[ \t\n]+$/, "$1");
-   if (src.length > 0 && (src != "\n"))
-   {
-      var txtNode = new XMLDOC.Parser.node(parentNode, "", "TEXT");
-      txtNode.charData = src;
-
-      // Append the new text node
-      parentNode.nodes.push(txtNode);
-   }
-};
--- a/sbin/res/jsdoc/app/lib/JSDOC.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,106 +0,0 @@
-/**
-	@overview
-	@date $Date: 2010-06-13 22:02:44 +0100 (Sun, 13 Jun 2010) $
-	@version $Revision: 837 $ 
-	@location $HeadURL: https://jsdoc-toolkit.googlecode.com/svn/tags/jsdoc_toolkit-2.4.0/jsdoc-toolkit/app/lib/JSDOC.js $
-	@name JSDOC.js
- */
-
-/**
-	This is the main container for the JSDOC application.
-	@namespace
-*/
-JSDOC = {
-};
-
-/**
-	@requires Opt
- */
-if (typeof arguments == "undefined") arguments = [];
-JSDOC.opt = Opt.get(
-	arguments, 
-	{
-		a: "allfunctions", 
-		c: "conf",
-		d: "directory",
-		"D[]": "define",
-		e: "encoding",
-		"E[]": "exclude",
-		h: "help",
-		m: "multiple",
-		n: "nocode",
-		o: "out",
-		p: "private",
-		q: "quiet",
-		r: "recurse",
-		S: "securemodules",
-		s: "suppress",
-		t: "template",
-		T: "testmode",
-		u: "unique",
-		v: "verbose",
-		x: "ext"
-	}
-);
-
-/** The current version string of this application. */
-JSDOC.VERSION = "2.4.0";
-
-/** Print out usage information and quit. */
-JSDOC.usage = function() {
-	print("USAGE: java -jar jsrun.jar app/run.js [OPTIONS] <SRC_DIR> <SRC_FILE> ...");
-	print("");
-	print("OPTIONS:");
-	print("  -a or --allfunctions\n          Include all functions, even undocumented ones.\n");
-	print("  -c or --conf\n          Load a configuration file.\n");
-	print("  -d=<PATH> or --directory=<PATH>\n          Output to this directory (defaults to \"out\").\n");
-	print("  -D=\"myVar:My value\" or --define=\"myVar:My value\"\n          Multiple. Define a variable, available in JsDoc as JSDOC.opt.D.myVar.\n");
-	print("  -e=<ENCODING> or --encoding=<ENCODING>\n          Use this encoding to read and write files.\n");
-	print("  -E=\"REGEX\" or --exclude=\"REGEX\"\n          Multiple. Exclude files based on the supplied regex.\n");
-	print("  -h or --help\n          Show this message and exit.\n");
-	print("  -m or --multiples\n          Don't warn about symbols being documented more than once.\n");
-	print("  -n or --nocode\n          Ignore all code, only document comments with @name tags.\n");
-	print("  -o=<PATH> or --out=<PATH>\n          Print log messages to a file (defaults to stdout).\n");
-	print("  -p or --private\n          Include symbols tagged as private, underscored and inner symbols.\n");
-	print("  -q or --quiet\n          Do not output any messages, not even warnings.\n");
-	print("  -r=<DEPTH> or --recurse=<DEPTH>\n          Descend into src directories.\n");
-	print("  -s or --suppress\n          Suppress source code output.\n");
-	print("  -S or --securemodules\n          Use Secure Modules mode to parse source code.\n");
-	print("  -t=<PATH> or --template=<PATH>\n          Required. Use this template to format the output.\n");
-	print("  -T or --test\n          Run all unit tests and exit.\n");
-	print("  -u or --unique\n          Force file names to be unique, but not based on symbol names.\n");
-	print("  -v or --verbose\n          Provide verbose feedback about what is happening.\n");
-	print("  -x=<EXT>[,EXT]... or --ext=<EXT>[,EXT]...\n          Scan source files with the given extension/s (defaults to js).\n");
-	
-	quit();
-}
-
-/*t:
-	plan(4, "Testing JSDOC namespace.");
-	
-	is(
-		typeof JSDOC,
-		"object",
-		"JSDOC.usage is a function."
-	);
-	
-	is(
-		typeof JSDOC.VERSION,
-		"string",
-		"JSDOC.VERSION is a string."
-	);
-	
-	is(
-		typeof JSDOC.usage,
-		"function",
-		"JSDOC.usage is a function."
-	);
-	
-	is(
-		typeof JSDOC.opt,
-		"object",
-		"JSDOC.opt is a object."
-	);
- */
-
-if (this.IO) IO.includeDir("lib/JSDOC/");
--- a/sbin/res/jsdoc/app/lib/JSDOC/DocComment.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,204 +0,0 @@
-if (typeof JSDOC == "undefined") JSDOC = {};
-
-/**
-	Create a new DocComment. This takes a raw documentation comment,
-	and wraps it in useful accessors.
-	@class Represents a documentation comment object.
- */ 
-JSDOC.DocComment = function(/**String*/comment) {
-	this.init();
-	if (typeof comment != "undefined") {
-		this.parse(comment);
-	}
-}
-
-JSDOC.DocComment.prototype.init = function() {
-	this.isUserComment = true;
-	this.src           = "";
-	this.meta          = "";
-	this.tagTexts      = [];
-	this.tags          = [];
-}
-
-/**
-	@requires JSDOC.DocTag
- */
-JSDOC.DocComment.prototype.parse = function(/**String*/comment) {
-	if (comment == "") {
-		comment = "/** @desc */";
-		this.isUserComment = false;
-	}
-	
-	this.src = JSDOC.DocComment.unwrapComment(comment);
-	
-	this.meta = "";
-	if (this.src.indexOf("#") == 0) {
-		this.src.match(/#(.+[+-])([\s\S]*)$/);
-		if (RegExp.$1) this.meta = RegExp.$1;
-		if (RegExp.$2) this.src = RegExp.$2;
-	}
-	
-	if (typeof JSDOC.PluginManager != "undefined") {
-		JSDOC.PluginManager.run("onDocCommentSrc", this);
-	}
-	
-	this.fixDesc();
-
-	this.src = JSDOC.DocComment.shared+"\n"+this.src;
-	
-	this.tagTexts = 
-		this.src
-		.split(/(^|[\r\n])\s*@/)
-		.filter(function($){return $.match(/\S/)});
-	
-	/**
-		The tags found in the comment.
-		@type JSDOC.DocTag[]
-	 */
-	this.tags = this.tagTexts.map(function($){return new JSDOC.DocTag($)});
-	
-	if (typeof JSDOC.PluginManager != "undefined") {
-		JSDOC.PluginManager.run("onDocCommentTags", this);
-	}
-}
-
-/*t:
-	plan(5, "testing JSDOC.DocComment");
-	requires("../frame/String.js");
-	requires("../lib/JSDOC/DocTag.js");
-	
-	var com = new JSDOC.DocComment("/**@foo some\n* comment here*"+"/");
-	is(com.tagTexts[0], "foo some\ncomment here", "first tag text is found.");
-	is(com.tags[0].title, "foo", "the title is found in a comment with one tag.");
-	
-	var com = new JSDOC.DocComment("/** @foo first\n* @bar second*"+"/");
-	is(com.getTag("bar").length, 1, "getTag() returns one tag by that title.");
-	
-	JSDOC.DocComment.shared = "@author John Smith";
-	var com = new JSDOC.DocComment("/**@foo some\n* comment here*"+"/");
-	is(com.tags[0].title, "author", "shared comment is added.");
-	is(com.tags[1].title, "foo", "shared comment is added to existing tag.");
-*/
-
-/**
-	If no @desc tag is provided, this function will add it.
- */
-JSDOC.DocComment.prototype.fixDesc = function() {
-	if (this.meta && this.meta != "@+") return;
-	if (/^\s*[^@\s]/.test(this.src)) {				
-		this.src = "@desc "+this.src;
-	}
-}
-
-/*t:
-	plan(5, "testing JSDOC.DocComment#fixDesc");
-	
-	var com = new JSDOC.DocComment();
-	
-	com.src = "this is a desc\n@author foo";
-	com.fixDesc();
-	is(com.src, "@desc this is a desc\n@author foo", "if no @desc tag is provided one is added.");
-
-	com.src = "x";
-	com.fixDesc();
-	is(com.src, "@desc x", "if no @desc tag is provided one is added to a single character.");
-
-	com.src = "\nx";
-	com.fixDesc();
-	is(com.src, "@desc \nx", "if no @desc tag is provided one is added to return and character.");
-	
-	com.src = " ";
-	com.fixDesc();
-	is(com.src, " ", "if no @desc tag is provided one is not added to just whitespace.");
-
-	com.src = "";
-	com.fixDesc();
-	is(com.src, "", "if no @desc tag is provided one is not added to empty.");
-*/
-
-/**
-	Remove slash-star comment wrapper from a raw comment string.
-	@type String
- */
-JSDOC.DocComment.unwrapComment = function(/**String*/comment) {
-	if (!comment) return "";
-	var unwrapped = comment.replace(/(^\/\*\*|\*\/$)/g, "").replace(/^\s*\* ?/gm, "");
-	return unwrapped;
-}
-
-/*t:
-	plan(5, "testing JSDOC.DocComment.unwrapComment");
-	
-	var com = "/**x*"+"/";
-	var unwrapped = JSDOC.DocComment.unwrapComment(com);
-	is(unwrapped, "x", "a single character jsdoc is found.");
-	
-	com = "/***x*"+"/";
-	unwrapped = JSDOC.DocComment.unwrapComment(com);
-	is(unwrapped, "x", "three stars are allowed in the opener.");
-	
-	com = "/****x*"+"/";
-	unwrapped = JSDOC.DocComment.unwrapComment(com);
-	is(unwrapped, "*x", "fourth star in the opener is kept.");
-	
-	com = "/**x\n * y\n*"+"/";
-	unwrapped = JSDOC.DocComment.unwrapComment(com);
-	is(unwrapped, "x\ny\n", "leading stars and spaces are trimmed.");
-	
-	com = "/**x\n *   y\n*"+"/";
-	unwrapped = JSDOC.DocComment.unwrapComment(com);
-	is(unwrapped, "x\n  y\n", "only first space after leading stars are trimmed.");
-*/
-
-/**
-	Provides a printable version of the comment.
-	@type String
- */
-JSDOC.DocComment.prototype.toString = function() {
-	return this.src;
-}
-
-/*t:
-	plan(1, "testing JSDOC.DocComment#fixDesc");
-	var com = new JSDOC.DocComment();
-	com.src = "foo";
-	is(""+com, "foo", "stringifying a comment returns the unwrapped src.");
-*/
-
-/**
-	Given the title of a tag, returns all tags that have that title.
-	@type JSDOC.DocTag[]
- */
-JSDOC.DocComment.prototype.getTag = function(/**String*/tagTitle) {
-	return this.tags.filter(function($){return $.title == tagTitle});
-}
-
-JSDOC.DocComment.prototype.deleteTag = function(/**String*/tagTitle) {
-	this.tags = this.tags.filter(function($){return $.title != tagTitle})
-}
-
-/*t:
-	plan(1, "testing JSDOC.DocComment#getTag");
-	requires("../frame/String.js");
-	requires("../lib/JSDOC/DocTag.js");
-	
-	var com = new JSDOC.DocComment("/**@foo some\n* @bar\n* @bar*"+"/");
-	is(com.getTag("bar").length, 2, "getTag returns expected number of tags.");
-*/
-
-/**
-	Used to store the currently shared tag text.
-*/
-JSDOC.DocComment.shared = "";
-
-/*t:
-	plan(2, "testing JSDOC.DocComment.shared");
-	requires("../frame/String.js");
-	requires("../lib/JSDOC/DocTag.js");
-	
-	JSDOC.DocComment.shared = "@author Michael";
-	
-	var com = new JSDOC.DocComment("/**@foo\n* @foo*"+"/");
-	is(com.getTag("author").length, 1, "getTag returns shared tag.");
-	is(com.getTag("foo").length, 2, "getTag returns unshared tags too.");
-*/
\ No newline at end of file
--- a/sbin/res/jsdoc/app/lib/JSDOC/DocTag.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,294 +0,0 @@
-if (typeof JSDOC == "undefined") JSDOC = {};
-
-/**
-	@constructor
- */
-JSDOC.DocTag = function(src) {
-	this.init();
-	if (typeof src != "undefined") {
-		this.parse(src);
-	}
-}
-
-/**
-	Create and initialize the properties of this.
- */
-JSDOC.DocTag.prototype.init = function() {
-	this.title        = "";
-	this.type         = "";
-	this.name         = "";
-	this.isOptional   = false;
-	this.defaultValue = "";
-	this.desc         = "";
-	
-	return this;
-}
-
-/**
-	Populate the properties of this from the given tag src.
-	@param {string} src
- */
-JSDOC.DocTag.prototype.parse = function(src) {
-	if (typeof src != "string") throw "src must be a string not "+(typeof src);
-
-	try {
-		src = this.nibbleTitle(src);
-		if (JSDOC.PluginManager) {
-			JSDOC.PluginManager.run("onDocTagSynonym", this);
-		}
-		
-		src = this.nibbleType(src);
-		
-		// only some tags are allowed to have names.
-		if (this.title == "param" || this.title == "property" || this.title == "config") { // @config is deprecated
-			src = this.nibbleName(src);
-		}
-	}
-	catch(e) {
-		if (LOG) LOG.warn(e);
-		else throw e;
-	}
-	this.desc = src; // whatever is left
-	
-	// example tags need to have whitespace preserved
-	if (this.title != "example") this.desc = this.desc.trim();
-	
-	if (JSDOC.PluginManager) {
-		JSDOC.PluginManager.run("onDocTag", this);
-	}
-}
-
-/**
-	Automatically called when this is stringified.
- */
-JSDOC.DocTag.prototype.toString = function() {
-	return this.desc;
-}
-
-/*t:
-	plan(1, "testing JSDOC.DocTag#toString");
-	
-	var tag = new JSDOC.DocTag("param {object} date A valid date.");
-	is(""+tag, "A valid date.", "stringifying a tag returns the desc.");
- */
-
-/**
-	Find and shift off the title of a tag.
-	@param {string} src
-	@return src
- */
-JSDOC.DocTag.prototype.nibbleTitle = function(src) {
-	if (typeof src != "string") throw "src must be a string not "+(typeof src);
-	
-	var parts = src.match(/^\s*(\S+)(?:\s([\s\S]*))?$/);
-
-	if (parts && parts[1]) this.title = parts[1];
-	if (parts && parts[2]) src = parts[2];
-	else src = "";
-	
-	return src;
-}
-
-/*t:
-	plan(8, "testing JSDOC.DocTag#nibbleTitle");
-	
-	var tag = new JSDOC.DocTag();
-	
-	tag.init().nibbleTitle("aTitleGoesHere");
-	is(tag.title, "aTitleGoesHere", "a title can be found in a single-word string.");
-	
-	var src = tag.init().nibbleTitle("aTitleGoesHere and the rest");
-	is(tag.title, "aTitleGoesHere", "a title can be found in a multi-word string.");
-	is(src, "and the rest", "the rest is returned when the title is nibbled off.");
-	
-	src = tag.init().nibbleTitle("");
-	is(tag.title, "", "given an empty string the title is empty.");
-	is(src, "", "the rest is empty when the tag is empty.");
-
-	var src = tag.init().nibbleTitle(" aTitleGoesHere\n  a description");
-	is(tag.title, "aTitleGoesHere", "leading and trailing spaces are not part of the title.");
-	is(src, "  a description", "leading spaces (less one) are part of the description.");
-
-	tag.init().nibbleTitle("a.Title::Goes_Here foo");
-	is(tag.title, "a.Title::Goes_Here", "titles with punctuation are allowed.");
- */
-
-/**
-	Find and shift off the type of a tag.
-	@requires frame/String.js
-	@param {string} src
-	@return src
- */
-JSDOC.DocTag.prototype.nibbleType = function(src) {
-	if (typeof src != "string") throw "src must be a string not "+(typeof src);
-	
-	if (src.match(/^\s*\{/)) {
-		var typeRange = src.balance("{", "}");
-		if (typeRange[1] == -1) {
-			throw "Malformed comment tag ignored. Tag type requires an opening { and a closing }: "+src;
-		}
-		this.type = src.substring(typeRange[0]+1, typeRange[1]).trim();
-		this.type = this.type.replace(/\s*,\s*/g, "|"); // multiples can be separated by , or |
-		src = src.substring(typeRange[1]+1);
-	}
-	
-	return src;
-}
-
-/*t:
-	plan(5, "testing JSDOC.DocTag.parser.nibbleType");
-	requires("../frame/String.js");
-	
-	var tag = new JSDOC.DocTag();
-	
-	tag.init().nibbleType("{String[]} aliases");
-	is(tag.type, "String[]", "type can have non-alpha characters.");
-	
-	tag.init().nibbleType("{ aTypeGoesHere  } etc etc");
-	is(tag.type, "aTypeGoesHere", "type is trimmed.");
-	
-	tag.init().nibbleType("{ oneType, twoType ,\n threeType  } etc etc");
-	is(tag.type, "oneType|twoType|threeType", "multiple types can be separated by commas.");
-	
-	var error;
-	try { tag.init().nibbleType("{widget foo"); }
-	catch(e) { error = e; }
-	is(typeof error, "string", "malformed tag type throws error.");
-	isnt(error.indexOf("Malformed"), -1, "error message tells tag is malformed.");
- */
-
-/**
-	Find and shift off the name of a tag.
-	@requires frame/String.js
-	@param {string} src
-	@return src
- */
-JSDOC.DocTag.prototype.nibbleName = function(src) {
-	if (typeof src != "string") throw "src must be a string not "+(typeof src);
-	
-	src = src.trim();
-	
-	// is optional?
-	if (src.charAt(0) == "[") {
-		var nameRange = src.balance("[", "]");
-		if (nameRange[1] == -1) {
-			throw "Malformed comment tag ignored. Tag optional name requires an opening [ and a closing ]: "+src;
-		}
-		this.name = src.substring(nameRange[0]+1, nameRange[1]).trim();
-		this.isOptional = true;
-		
-		src = src.substring(nameRange[1]+1);
-		
-		// has default value?
-		var nameAndValue = this.name.split("=");
-		if (nameAndValue.length) {
-			this.name = nameAndValue.shift().trim();
-			this.defaultValue = nameAndValue.join("=");
-		}
-	}
-	else {
-		var parts = src.match(/^(\S+)(?:\s([\s\S]*))?$/);
-		if (parts) {
-			if (parts[1]) this.name = parts[1];
-			if (parts[2]) src = parts[2].trim();
-			else src = "";
-		}
-	}	
-
-	return src;
-}
-
-/*t:
-	requires("../frame/String.js");
-	plan(9, "testing JSDOC.DocTag.parser.nibbleName");
-	
-	var tag = new JSDOC.DocTag();
-	
-	tag.init().nibbleName("[foo] This is a description.");
-	is(tag.isOptional, true, "isOptional syntax is detected.");
-	is(tag.name, "foo", "optional param name is found.");
- 	
-	tag.init().nibbleName("[foo] This is a description.");
-	is(tag.isOptional, true, "isOptional syntax is detected when no type.");
-	is(tag.name, "foo", "optional param name is found when no type.");
-	
-	tag.init().nibbleName("[foo=7] This is a description.");
- 	is(tag.name, "foo", "optional param name is found when default value.");
- 	is(tag.defaultValue, 7, "optional param default value is found when default value.");
- 	
- 	//tag.init().nibbleName("[foo= a value] This is a description.");
- 	//is(tag.defaultValue, " a value", "optional param default value is found when default value has spaces (issue #112).");
- 	
- 	tag.init().nibbleName("[foo=[]] This is a description.");
- 	is(tag.defaultValue, "[]", "optional param default value is found when default value is [] (issue #95).");
- 	
- 	tag.init().nibbleName("[foo=a=b] This is a description.");
- 	is(tag.name, "foo", "optional param name is found when default value is a=b.");
- 	is(tag.defaultValue, "a=b", "optional param default value is found when default value is a=b.")
- */
-
-/*t:
-	plan(32, "Testing JSDOC.DocTag.parser.");
-	requires("../frame/String.js");
-	
- 	var tag = new JSDOC.DocTag();
- 	
- 	is(typeof tag, "object", "JSDOC.DocTag.parser with an empty string returns an object.");
- 	is(typeof tag.title, "string", "returned object has a string property 'title'.");
- 	is(typeof tag.type, "string", "returned object has a string property 'type'.");
- 	is(typeof tag.name, "string", "returned object has a string property 'name'.");
- 	is(typeof tag.defaultValue, "string", "returned object has a string property 'defaultValue'.");
- 	is(typeof tag.isOptional, "boolean", "returned object has a boolean property 'isOptional'.");
- 	is(typeof tag.desc, "string", "returned object has a string property 'desc'.");
-  
-  	tag = new JSDOC.DocTag("param {widget} foo");
-  	is(tag.title, "param", "param title is found.");
-  	is(tag.name, "foo", "param name is found when desc is missing.");
- 	is(tag.desc, "", "param desc is empty when missing.");
- 	
- 	tag = new JSDOC.DocTag("param {object} date A valid date.");
- 	is(tag.name, "date", "param name is found with a type.");
- 	is(tag.type, "object", "param type is found.");
- 	is(tag.desc, "A valid date.", "param desc is found with a type.");
- 	
-  	tag = new JSDOC.DocTag("param aName a description goes\n    here.");
-	is(tag.name, "aName", "param name is found without a type.");
- 	is(tag.desc, "a description goes\n    here.", "param desc is found without a type.");
- 	
- 	tag = new JSDOC.DocTag("param {widget}");
- 	is(tag.name, "", "param name is empty when it is not given.");
-	
-	tag = new JSDOC.DocTag("param {widget} [foo] This is a description.");
-	is(tag.name, "foo", "optional param name is found.");
-	
-	tag = new JSDOC.DocTag("return {aType} This is a description.");
-	is(tag.type, "aType", "when return tag has no name, type is found.");
-	is(tag.desc, "This is a description.", "when return tag has no name, desc is found.");
-	
-	tag = new JSDOC.DocTag("author Joe Coder <jcoder@example.com>");
-	is(tag.title, "author", "author tag has a title.");
-	is(tag.type, "", "the author tag has no type.");
-	is(tag.name, "", "the author tag has no name.");
-	is(tag.desc, "Joe Coder <jcoder@example.com>", "author tag has desc.");
-	
-	tag = new JSDOC.DocTag("private \t\n  ");
-	is(tag.title, "private", "private tag has a title.");
-	is(tag.type, "", "the private tag has no type.");
-	is(tag.name, "", "the private tag has no name.");
-	is(tag.desc, "", "private tag has no desc.");
-
-	tag = new JSDOC.DocTag("example\n   example(code);\n   more();");
-	is(tag.desc, "   example(code);\n   more();", "leading whitespace (less one) in examples code is preserved.");
-	
-	tag = new JSDOC.DocTag("param theName  \n");
-	is(tag.name, "theName", "name only is found.");
-	
-	tag = new JSDOC.DocTag("type theDesc  \n");
-	is(tag.desc, "theDesc", "desc only is found.");
-	
-	tag = new JSDOC.DocTag("type {theType} \n");
-	is(tag.type, "theType", "type only is found.");
-	
-	tag = new JSDOC.DocTag("");
-	is(tag.title, "", "title is empty when tag is empty.");
- */
\ No newline at end of file
--- a/sbin/res/jsdoc/app/lib/JSDOC/JsDoc.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,140 +0,0 @@
-/**
-	@constructor
-	@param [opt] Used to override the commandline options. Useful for testing.
-	@version $Id: JsDoc.js 831 2010-03-09 14:24:56Z micmath $
-*/
-JSDOC.JsDoc = function(/**object*/ opt) {
-	if (opt) {
-		JSDOC.opt = opt;
-	}
-	
-	if (JSDOC.opt.h) {
-		JSDOC.usage();
-		quit();
-	}
-	
-	// defend against options that are not sane 
-	if (JSDOC.opt._.length == 0) {
-		LOG.warn("No source files to work on. Nothing to do.");
-		quit();
-	}
-	if (JSDOC.opt.t === true || JSDOC.opt.d === true) {
-		JSDOC.usage();
-	}
-	
-	if (typeof JSDOC.opt.d == "string") {
-		if (!JSDOC.opt.d.charAt(JSDOC.opt.d.length-1).match(/[\\\/]/)) {
-			JSDOC.opt.d = JSDOC.opt.d+"/";
-		}
-		LOG.inform("Output directory set to '"+JSDOC.opt.d+"'.");
-		IO.mkPath(JSDOC.opt.d);
-	}
-	if (JSDOC.opt.e) IO.setEncoding(JSDOC.opt.e);
-	
-	// the -r option: scan source directories recursively
-	if (typeof JSDOC.opt.r == "boolean") JSDOC.opt.r = 10;
-	else if (!isNaN(parseInt(JSDOC.opt.r))) JSDOC.opt.r = parseInt(JSDOC.opt.r);
-	else JSDOC.opt.r = 1;
-	
-	// the -D option: define user variables
-	var D = {};
-	if (JSDOC.opt.D) {
-		for (var i = 0; i < JSDOC.opt.D.length; i++) {
-			var param = JSDOC.opt.D[i];
-			// remove first and last character if both == "
-			if ( 
-				param.length > 1
-				&& param.charAt(0) == '"'
-				&& param.charAt(param.length-1) == '"'
-			) {
-				param = param.substr(1, param.length-2);
-			}
-			var defineParts = param.split(":");
-			if (defineParts && defineParts.length > 1) {
-				for ( var dpIdx = 2; dpIdx < defineParts.length; dpIdx++ ) {
-					defineParts[1] += ':' + defineParts[dpIdx];
-				}
-				D[defineParts[0]] = defineParts[1];
-			}
-		}
-	}
-	JSDOC.opt.D = D;
-	// combine any conf file D options with the commandline D options
-	if (defined(JSDOC.conf)) for (var c in JSDOC.conf.D) {
- 		if (!defined(JSDOC.opt.D[c])) {
- 			JSDOC.opt.D[c] = JSDOC.conf.D[c];
- 		}
- 	}
-	
-	// Give plugins a chance to initialize
-	if (defined(JSDOC.PluginManager)) {
-		JSDOC.PluginManager.run("onInit", JSDOC.opt);
-	}
-
-	JSDOC.opt.srcFiles = JSDOC.JsDoc._getSrcFiles();
-	JSDOC.JsDoc._parseSrcFiles();
-	JSDOC.JsDoc.symbolSet = JSDOC.Parser.symbols;
-}
-
-/**
-	Retrieve source file list.
-	@returns {String[]} The pathnames of the files to be parsed.
- */
-JSDOC.JsDoc._getSrcFiles = function() {
-	JSDOC.JsDoc.srcFiles = [];
-	
-	var ext = ["js"];
-	if (JSDOC.opt.x) {
-		ext = JSDOC.opt.x.split(",").map(function($) {return $.toLowerCase()});
-	}
-	
-	for (var i = 0; i < JSDOC.opt._.length; i++) {
-		JSDOC.JsDoc.srcFiles = JSDOC.JsDoc.srcFiles.concat(
-			IO.ls(JSDOC.opt._[i], JSDOC.opt.r).filter(
-				function($) {
-					var thisExt = $.split(".").pop().toLowerCase();
-					
-					if (JSDOC.opt.E) {
-						for(var n = 0; n < JSDOC.opt.E.length; n++) {
-							if ($.match(new RegExp(JSDOC.opt.E[n]))) {
-								LOG.inform("Excluding " + $);
-								return false; // if the file matches the regex then it's excluded.
-							}
-						}
-					}
-					
-					return (ext.indexOf(thisExt) > -1); // we're only interested in files with certain extensions
-				}
-			)
-		);
-	}
-	
-	return JSDOC.JsDoc.srcFiles;
-}
-
-JSDOC.JsDoc._parseSrcFiles = function() {
-	JSDOC.Parser.init();
-	for (var i = 0, l = JSDOC.JsDoc.srcFiles.length; i < l; i++) {
-		var srcFile = JSDOC.JsDoc.srcFiles[i];
-		
-		if (JSDOC.opt.v) LOG.inform("Parsing file: " + srcFile);
-		
-		try {
-			var src = IO.readFile(srcFile);
-		}
-		catch(e) {
-			LOG.warn("Can't read source file '"+srcFile+"': "+e.message);
-		}
-
-		var tr = new JSDOC.TokenReader();
-		var ts = new JSDOC.TokenStream(tr.tokenize(new JSDOC.TextStream(src)));
-
-		JSDOC.Parser.parse(ts, srcFile);
-
-	}
-	JSDOC.Parser.finish();
-
-	if (JSDOC.PluginManager) {
-		JSDOC.PluginManager.run("onFinishedParsing", JSDOC.Parser.symbols);
-	}
-}
--- a/sbin/res/jsdoc/app/lib/JSDOC/JsPlate.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,109 +0,0 @@
-/**
-	@constructor
-*/
-JSDOC.JsPlate = function(templateFile) {
-	if (templateFile) this.template = IO.readFile(templateFile);
-	
-	this.templateFile = templateFile;
-	this.code = "";
-	this.parse();
-}
-
-JSDOC.JsPlate.prototype.parse = function() {
-	this.template = this.template.replace(/\{#[\s\S]+?#\}/gi, "");
-	this.code = "var output=\u001e"+this.template;
-
-	this.code = this.code.replace(
-		/<for +each="(.+?)" +in="(.+?)" *>/gi, 
-		function (match, eachName, inName) {
-			return "\u001e;\rvar $"+eachName+"_keys = keys("+inName+");\rfor(var $"+eachName+"_i = 0; $"+eachName+"_i < $"+eachName+"_keys.length; $"+eachName+"_i++) {\rvar $"+eachName+"_last = ($"+eachName+"_i == $"+eachName+"_keys.length-1);\rvar $"+eachName+"_key = $"+eachName+"_keys[$"+eachName+"_i];\rvar "+eachName+" = "+inName+"[$"+eachName+"_key];\routput+=\u001e";
-		}
-	);	
-	this.code = this.code.replace(/<if test="(.+?)">/g, "\u001e;\rif ($1) { output+=\u001e");
-	this.code = this.code.replace(/<elseif test="(.+?)"\s*\/>/g, "\u001e;}\relse if ($1) { output+=\u001e");
-	this.code = this.code.replace(/<else\s*\/>/g, "\u001e;}\relse { output+=\u001e");
-	this.code = this.code.replace(/<\/(if|for)>/g, "\u001e;\r};\routput+=\u001e");
-	this.code = this.code.replace(
-		/\{\+\s*([\s\S]+?)\s*\+\}/gi,
-		function (match, code) {
-			code = code.replace(/"/g, "\u001e"); // prevent qoute-escaping of inline code
-			code = code.replace(/(\r?\n)/g, " ");
-			return "\u001e+ ("+code+") +\u001e";
-		}
-	);
-	this.code = this.code.replace(
-		/\{!\s*([\s\S]+?)\s*!\}/gi,
-		function (match, code) {
-			code = code.replace(/"/g, "\u001e"); // prevent qoute-escaping of inline code
-			code = code.replace(/(\n)/g, " ");
-			return "\u001e; "+code+";\routput+=\u001e";
-		}
-	);
-	this.code = this.code+"\u001e;";
-
-	this.code = this.code.replace(/(\r?\n)/g, "\\n");
-	this.code = this.code.replace(/"/g, "\\\"");
-	this.code = this.code.replace(/\u001e/g, "\"");
-}
-
-JSDOC.JsPlate.prototype.toCode = function() {
-	return this.code;
-}
-
-JSDOC.JsPlate.keys = function(obj) {
-	var keys = [];
-	if (obj.constructor.toString().indexOf("Array") > -1) {
-		for (var i = 0; i < obj.length; i++) {
-			keys.push(i);
-		}
-	}
-	else {
-		for (var i in obj) {
-			keys.push(i);
-		}
-	}
-	return keys;
-};
-
-JSDOC.JsPlate.values = function(obj) {
-	var values = [];
-	if (obj.constructor.toString().indexOf("Array") > -1) {
-		for (var i = 0; i < obj.length; i++) {
-			values.push(obj[i]);
-		}
-	}
-	else {
-		for (var i in obj) {
-			values.push(obj[i]);
-		}
-	}
-	return values;
-};
-
-JSDOC.JsPlate.prototype.process = function(data, compact) {
-	var keys = JSDOC.JsPlate.keys;
-	var values = JSDOC.JsPlate.values;
-	
-	try {
-		eval(this.code);
-	}
-	catch (e) {
-		print(">> There was an error evaluating the compiled code from template: "+this.templateFile);
-		print("   The error was on line "+e.lineNumber+" "+e.name+": "+e.message);
-		var lines = this.code.split("\r");
-		if (e.lineNumber-2 >= 0) print("line "+(e.lineNumber-1)+": "+lines[e.lineNumber-2]);
-		print("line "+e.lineNumber+": "+lines[e.lineNumber-1]);
-		print("");
-	}
-	
-	if (compact) { // patch by mcbain.asm
- 		// Remove lines that contain only space-characters, usually left by lines in the template
- 		// which originally only contained JSPlate tags or code. This makes it easier to write
- 		// non-tricky templates which still put out nice code (not bloated with extra lines).
- 		// Lines purposely left blank (just a line ending) are left alone.
- 		output = output.replace(/\s+?(\r?)\n/g, "$1\n");
- 	}
- 	
-	/*debug*///print(this.code);
-	return output;
-}
\ No newline at end of file
--- a/sbin/res/jsdoc/app/lib/JSDOC/Lang.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,144 +0,0 @@
-/**
-	@namespace
-*/
-JSDOC.Lang = {
-}
-
-JSDOC.Lang.isBuiltin = function(name) {
-	return (JSDOC.Lang.isBuiltin.coreObjects.indexOf(name) > -1);
-}
-JSDOC.Lang.isBuiltin.coreObjects = ['_global_', 'Array', 'Boolean', 'Date', 'Error', 'Function', 'Math', 'Number', 'Object', 'RegExp', 'String'];
-
-JSDOC.Lang.whitespace = function(ch) {
-	return JSDOC.Lang.whitespace.names[ch];
-}
-JSDOC.Lang.whitespace.names = {
-	" ":      "SPACE",
-	"\f":     "FORMFEED",
-	"\t":     "TAB",
-	"\u0009": "UNICODE_TAB",
-	"\u000A": "UNICODE_NBR",
-	"\u0008": "VERTICAL_TAB"
-};
-
-JSDOC.Lang.newline = function(ch) {
-	return JSDOC.Lang.newline.names[ch];
-}
-JSDOC.Lang.newline.names = {
-	"\n":     "NEWLINE",
-	"\r":     "RETURN",
-	"\u000A": "UNICODE_LF",
-	"\u000D": "UNICODE_CR",
-	"\u2029": "UNICODE_PS",
-	"\u2028": "UNICODE_LS"
-};
-
-JSDOC.Lang.keyword = function(word) {
-	return JSDOC.Lang.keyword.names["="+word];
-}
-JSDOC.Lang.keyword.names = {
-	"=break":      "BREAK",
-	"=case":       "CASE",
-	"=catch":      "CATCH",
-	"=const":      "VAR",
-	"=continue":   "CONTINUE",
-	"=default":    "DEFAULT",
-	"=delete":     "DELETE",
-	"=do":         "DO",
-	"=else":       "ELSE",
-	"=false":      "FALSE",
-	"=finally":    "FINALLY",
-	"=for":        "FOR",
-	"=function":   "FUNCTION",
-	"=if":         "IF",
-	"=in":         "IN",
-	"=instanceof": "INSTANCEOF",
-	"=new":        "NEW",
-	"=null":       "NULL",
-	"=return":     "RETURN",
-	"=switch":     "SWITCH",
-	"=this":       "THIS",
-	"=throw":      "THROW",
-	"=true":       "TRUE",
-	"=try":        "TRY",
-	"=typeof":     "TYPEOF",
-	"=void":       "VOID",
-	"=while":      "WHILE",
-	"=with":       "WITH",
-	"=var":        "VAR"
-};
-
-JSDOC.Lang.punc = function(ch) {
-	return JSDOC.Lang.punc.names[ch];
-}
-JSDOC.Lang.punc.names = {
-	";":   "SEMICOLON",
-	",":   "COMMA",
-	"?":   "HOOK",
-	":":   "COLON",
-	"||":  "OR", 
-	"&&":  "AND",
-	"|":   "BITWISE_OR",
-	"^":   "BITWISE_XOR",
-	"&":   "BITWISE_AND",
-	"===": "STRICT_EQ", 
-	"==":  "EQ",
-	"=":   "ASSIGN",
-	"!==": "STRICT_NE",
-	"!=":  "NE",
-	"<<":  "LSH",
-	"<=":  "LE", 
-	"<":   "LT",
-	">>>": "URSH",
-	">>":  "RSH",
-	">=":  "GE",
-	">":   "GT", 
-	"++":  "INCREMENT",
-	"--":  "DECREMENT",
-	"+":   "PLUS",
-	"-":   "MINUS",
-	"*":   "MUL",
-	"/":   "DIV", 
-	"%":   "MOD",
-	"!":   "NOT",
-	"~":   "BITWISE_NOT",
-	".":   "DOT",
-	"[":   "LEFT_BRACKET",
-	"]":   "RIGHT_BRACKET",
-	"{":   "LEFT_CURLY",
-	"}":   "RIGHT_CURLY",
-	"(":   "LEFT_PAREN",
-	")":   "RIGHT_PAREN"
-};
-
-JSDOC.Lang.matching = function(name) {
-	return JSDOC.Lang.matching.names[name];
-}
-JSDOC.Lang.matching.names = {
-	"LEFT_PAREN": "RIGHT_PAREN",
-	"RIGHT_PAREN": "LEFT_PAREN",
-	"LEFT_CURLY": "RIGHT_CURLY",
-	"RIGHT_CURLY": "LEFT_CURLY",
-	"LEFT_BRACE": "RIGHT_BRACE",
-	"RIGHT_BRACE": "LEFT_BRACE"
-}
-
-JSDOC.Lang.isNumber = function(str) {
-	return /^(\.[0-9]|[0-9]+\.|[0-9])[0-9]*([eE][+-][0-9]+)?$/i.test(str);
-}
-
-JSDOC.Lang.isHexDec = function(str) {
-	return /^0x[0-9A-F]+$/i.test(str);
-}
-
-JSDOC.Lang.isWordChar = function(str) {
-	return /^[a-zA-Z0-9$_.]+$/.test(str);
-}
-
-JSDOC.Lang.isSpace = function(str) {
-	return (typeof JSDOC.Lang.whitespace(str) != "undefined");
-}
-
-JSDOC.Lang.isNewline = function(str) {
-	return (typeof JSDOC.Lang.newline(str) != "undefined");
-}
\ No newline at end of file
--- a/sbin/res/jsdoc/app/lib/JSDOC/Parser.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,146 +0,0 @@
-if (typeof JSDOC == "undefined") JSDOC = {};
-
-/**
-	@namespace
-	@requires JSDOC.Walker
-	@requires JSDOC.Symbol
-	@requires JSDOC.DocComment
-*/
-JSDOC.Parser = {
-	conf: {
-		ignoreCode:               JSDOC.opt.n,
-		ignoreAnonymous:           true, // factory: true
-		treatUnderscoredAsPrivate: true, // factory: true
-		explain:                   false // factory: false
-	},
-	
-	addSymbol: function(symbol) {
-
-		if (JSDOC.Parser.rename) {
-			for (var n in JSDOC.Parser.rename) {
-				if (symbol.alias.indexOf(n) == 0) {
-					if (symbol.name == symbol.alias) {
-						symbol.name = symbol.name.replace(n, JSDOC.Parser.rename[n]);
-					}
-					symbol.alias = symbol.alias.replace(n, JSDOC.Parser.rename[n]);
-				}
-			}
-		}
-		
-		if (JSDOC.opt.S) {
-			if (typeof JSDOC.Parser.secureModules == "undefined") JSDOC.Parser.secureModules = {};
-			if (/^exports\./.test(symbol.alias)) {
-				symbol.srcFile.match(/(^|[\\\/])([^\\\/]+)\.js/i);
-				var fileNS = RegExp.$2;
-				
-				// need to create the namespace associated with this file first
-				if (!JSDOC.Parser.secureModules[fileNS]) {
-					JSDOC.Parser.secureModules[fileNS] = 1;
-					var nsSymbol = new JSDOC.Symbol(fileNS, [], "GLOBAL", new JSDOC.DocComment(""));
-					nsSymbol.isNamespace = true;
-					nsSymbol.srcFile = "";
-					nsSymbol.isPrivate = false;
-					nsSymbol.srcFile = symbol.srcFile;
-					nsSymbol.desc = (JSDOC.Parser.symbols.getSymbol(symbol.srcFile) || {desc: ""}).desc;
-					JSDOC.Parser.addSymbol(nsSymbol);
-				}
-				
-				symbol.alias = symbol.alias.replace(/^exports\./, fileNS + '.');
-				symbol.name = symbol.name.replace(/^exports\./, '');
-				symbol.memberOf = fileNS;
-				symbol.isStatic = true;
-			}
-		}
-
-		// if a symbol alias is documented more than once the first one with the user docs wins
-		if (JSDOC.Parser.symbols.hasSymbol(symbol.alias)) {
- 			var oldSymbol = JSDOC.Parser.symbols.getSymbol(symbol.alias);
-			if (oldSymbol.comment.isUserComment) {
-				if (JSDOC.opt.m) return;
-				if (symbol.comment.isUserComment) { // old and new are both documented
-					LOG.warn("The symbol '"+symbol.alias+"' is documented more than once.");
-					return;
-				}
-				else { // old is documented but new isn't
-					return;
-				}
-			}
-		}
-		
-		// we don't document anonymous things
-		if (JSDOC.Parser.conf.ignoreAnonymous && symbol.name.match(/\$anonymous\b/)) return;
-
-		// uderscored things may be treated as if they were marked private, this cascades
-		if (JSDOC.Parser.conf.treatUnderscoredAsPrivate && symbol.name.match(/[.#-]_[^.#-]+$/)) {
-			if (!symbol.comment.getTag("public").length > 0) symbol.isPrivate = true;
-		}
-		
-		// -p flag is required to document private things
-		if (!JSDOC.opt.p && symbol.isPrivate) return; // issue #161 fixed by mcbain.asm
-		
-		// ignored things are not documented, this doesn't cascade
-		if (symbol.isIgnored) return;
-		JSDOC.Parser.symbols.addSymbol(symbol);
-	},
-	
-	addBuiltin: function(name) {
-		var builtin = new JSDOC.Symbol(name, [], "CONSTRUCTOR", new JSDOC.DocComment(""));
-		builtin.isNamespace = true;
-		builtin.srcFile = "";
-		builtin.isPrivate = false;
-		JSDOC.Parser.addSymbol(builtin);
-		return builtin;
-	},
-	
-	init: function() {
-		JSDOC.Parser.symbols = new JSDOC.SymbolSet();
-		JSDOC.Parser.walker = new JSDOC.Walker();
-	},
-	
-	finish: function() {
-		JSDOC.Parser.symbols.relate();		
-		
-		// make a litle report about what was found
-		if (JSDOC.Parser.conf.explain) {
-			var symbols = JSDOC.Parser.symbols.toArray();
-			var srcFile = "";
-			for (var i = 0, l = symbols.length; i < l; i++) {
-				var symbol = symbols[i];
-				if (srcFile != symbol.srcFile) {
-					srcFile = symbol.srcFile;
-					print("\n"+srcFile+"\n-------------------");
-				}
-				print(i+":\n  alias => "+symbol.alias + "\n  name => "+symbol.name+ "\n  isa => "+symbol.isa + "\n  memberOf => " + symbol.memberOf + "\n  isStatic => " + symbol.isStatic + ",  isInner => " + symbol.isInner+ ",  isPrivate => " + symbol.isPrivate);
-			}
-			print("-------------------\n");
-		}
-	}
-}
-
-JSDOC.Parser.parse = function(/**JSDOC.TokenStream*/ts, /**String*/srcFile) {
-	JSDOC.Symbol.srcFile = (srcFile || "");
-	JSDOC.DocComment.shared = ""; // shared comments don't cross file boundaries
-	
-	if (!JSDOC.Parser.walker) JSDOC.Parser.init();
-	JSDOC.Parser.walker.walk(ts); // adds to our symbols
-	
-	// filter symbols by option
-	for (var p = JSDOC.Parser.symbols._index.first(); p; p = JSDOC.Parser.symbols._index.next()) {
-		var symbol = p.value;
-		
-		if (!symbol) continue;
-		
-		if (symbol.is("FILE") || symbol.is("GLOBAL")) {
-			continue;
-		}
-		else if (!JSDOC.opt.a && !symbol.comment.isUserComment) {
-			JSDOC.Parser.symbols.deleteSymbol(symbol.alias);
-		}
-		
-		if (/#$/.test(symbol.alias)) { // we don't document prototypes
-			JSDOC.Parser.symbols.deleteSymbol(symbol.alias);
-		}
-	}
-	
-	return JSDOC.Parser.symbols.toArray();
-}
--- a/sbin/res/jsdoc/app/lib/JSDOC/PluginManager.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,33 +0,0 @@
-/**
-	@namespace Holds functionality related to running plugins.
-*/
-JSDOC.PluginManager = {
-}
-
-/**
-	@param name A unique name that identifies that plugin.
-	@param handlers A collection of named functions. The names correspond to hooks in the core code.
-*/
-JSDOC.PluginManager.registerPlugin = function(/**String*/name, /**Object*/handlers) {
-	if (!defined(JSDOC.PluginManager.plugins))
-		/** The collection of all plugins. Requires a unique name for each.
-		*/
-		JSDOC.PluginManager.plugins = {};
-	
-	
-	JSDOC.PluginManager.plugins[name] = handlers;
-}
-
-/**
-	@param hook The name of the hook that is being caught.
-	@param target Any object. This will be passed as the only argument to the handler whose
-	name matches the hook name. Handlers cannot return a value, so must modify the target
-	object to have an effect.
-*/
-JSDOC.PluginManager.run = function(/**String*/hook, /**Mixed*/target) {
-	for (var name in JSDOC.PluginManager.plugins) {
-		if (defined(JSDOC.PluginManager.plugins[name][hook])) {
-			JSDOC.PluginManager.plugins[name][hook](target);
-		}
-	}
-}
--- a/sbin/res/jsdoc/app/lib/JSDOC/Symbol.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,644 +0,0 @@
-if (typeof JSDOC == "undefined") JSDOC = {};
-
-/**
-	Create a new Symbol.
-	@class Represents a symbol in the source code.
- */
-JSDOC.Symbol = function() {
-	this.init();
-	if (arguments.length) this.populate.apply(this, arguments);
-}
-
-JSDOC.Symbol.count = 0;
-
-JSDOC.Symbol.prototype.init = function() {
-	this._name = "";
-	this._params = [];
-	this.$args = [];
-	this.addOn = "";
-	this.alias = "";
-	this.augments = [];
-	this.author = "";
-	this.classDesc = "";
-	this.comment = {};
-	this.defaultValue = undefined;
-	this.deprecated = "";
-	this.desc = "";
-	this.example = [];
-	this.exceptions = [];
-	this.fires = [];
-	this.id = JSDOC.Symbol.count++;
-	this.inherits = [];
-	this.inheritsFrom = [];
-	this.isa = "OBJECT";
-	this.isConstant = false;
-	this.isEvent = false;
-	this.isIgnored = false;
-	this.isInner = false;
-	this.isNamespace = false;
-	this.isPrivate = false;
-	this.isStatic = false;
-	this.memberOf = "";
-	this.methods = [];
-	this.properties = [];
-	this.requires = [];
-	this.returns = [];
-	this.see = [];
-	this.since = "";
-	this.srcFile = {};
-	this.type = "";
-	this.version = "";
-}
-
-JSDOC.Symbol.prototype.serialize = function() {
-	var keys = [];
-	for (var p in this) {
-		keys.push (p);
-	}
-	keys = keys.sort();
-	
-	var out = "";
-	for (var i in keys) {
-		if (typeof this[keys[i]] == "function") continue;
-		out += keys[i]+" => "+Dumper.dump(this[keys[i]])+",\n";
-	}
-	return "\n{\n" + out + "}\n";
-}
-
-JSDOC.Symbol.prototype.clone = function() {
-	var clone = new JSDOC.Symbol();
-	clone.populate.apply(clone, this.$args); // repopulate using the original arguments
-	clone.srcFile = this.srcFile; // not the current srcFile, the one when the original was made
-	return clone;
-}
-
-JSDOC.Symbol.prototype.__defineSetter__("name",
-	function(n) { n = n.replace(/^_global_[.#-]/, ""); n = n.replace(/\.prototype\.?/g, '#'); this._name = n; }
-);
-JSDOC.Symbol.prototype.__defineGetter__("name",
-	function() { return this._name; }
-);
-JSDOC.Symbol.prototype.__defineSetter__("params", 
-	function(v) {
-		for (var i = 0, l = v.length; i < l; i++) {
-			if (v[i].constructor != JSDOC.DocTag) { // may be a generic object parsed from signature, like {type:..., name:...}
-				this._params[i] = new JSDOC.DocTag("param"+((v[i].type)?" {"+v[i].type+"}":"")+" "+v[i].name);
-			}
-			else {
-				this._params[i] = v[i];
-			}
-		}
-	}
-);
-JSDOC.Symbol.prototype.__defineGetter__("params",
-	function() { return this._params; }
-);
-
-JSDOC.Symbol.prototype.getEvents = function() {
-	var events = [];
-	for (var i = 0, l = this.methods.length; i < l; i++) {
-		if (this.methods[i].isEvent) {
-			this.methods[i].name = this.methods[i].name.replace("event:", "");
-			events.push(this.methods[i]);
-		}
-	}
-	return events;
-}
-
-JSDOC.Symbol.prototype.getMethods = function() {
-	var nonEvents = [];
-	for (var i = 0, l = this.methods.length; i < l; i++) {
-		if (!this.methods[i].isEvent) {
-			nonEvents.push(this.methods[i]);
-		}
-	}
-	return nonEvents;
-}
-
-
-JSDOC.Symbol.prototype.populate = function(
-		/** String */ name,
-		/** Object[] */ params,
-		/** String */ isa,
-		/** JSDOC.DocComment */ comment
-) {
-	this.$args = arguments;
-	
-	this.name = name;
-	this.alias = this.name;
-	
-	this.params = params;
-	this.isa = (isa == "VIRTUAL")? "OBJECT":isa;
-	this.comment = comment || new JSDOC.DocComment("");
-	this.srcFile = JSDOC.Symbol.srcFile;
-	
-	if (this.is("FILE") && !this.alias) this.alias = this.srcFile;
-
-	this.setTags();
-	
-	if (typeof JSDOC.PluginManager != "undefined") {
-		JSDOC.PluginManager.run("onSymbol", this);
-	}
-}
-
-JSDOC.Symbol.prototype.setTags = function() {
-	// @author
-	var authors = this.comment.getTag("author");
-	if (authors.length) {
-		this.author = authors.map(function($){return $.desc;}).join(", ");
-	}
-	
-	/*t:
-		plan(34, "testing JSDOC.Symbol");
-		
-		requires("../lib/JSDOC/DocComment.js");
-		requires("../frame/String.js");
-		requires("../lib/JSDOC/DocTag.js");
-
-		var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@author Joe Smith*"+"/"));
-		is(sym.author, "Joe Smith", "@author tag, author is found.");
-	*/
-	
-	// @desc
-	var descs = this.comment.getTag("desc");
-	if (descs.length) {
-		this.desc = descs.map(function($){return $.desc;}).join("\n"); // multiple descriptions are concatenated into one
-	}
-	
-	/*t:
-		var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@desc This is a description.*"+"/"));
-		is(sym.desc, "This is a description.", "@desc tag, description is found.");
-	*/
-	
-	// @overview
-	if (this.is("FILE")) {
-		if (!this.alias) this.alias = this.srcFile;
-		
-		var overviews = this.comment.getTag("overview");
-		if (overviews.length) {
-			this.desc = [this.desc].concat(overviews.map(function($){return $.desc;})).join("\n");
-		}
-	}
-	
-	/*t:
-		var sym = new JSDOC.Symbol("foo", [], "FILE", new JSDOC.DocComment("/**@overview This is an overview.*"+"/"));
-		is(sym.desc, "\nThis is an overview.", "@overview tag, description is found.");
-	*/
-	
-	// @since
-	var sinces = this.comment.getTag("since");
-	if (sinces.length) {
-		this.since = sinces.map(function($){return $.desc;}).join(", ");
-	}
-	
-	/*t:
-		var sym = new JSDOC.Symbol("foo", [], "FILE", new JSDOC.DocComment("/**@since 1.01*"+"/"));
-		is(sym.since, "1.01", "@since tag, description is found.");
-	*/
-	
-	// @constant
-	if (this.comment.getTag("constant").length) {
-		this.isConstant = true;
-	}
-	
-	/*t:
-		var sym = new JSDOC.Symbol("foo", [], "FILE", new JSDOC.DocComment("/**@constant*"+"/"));
-		is(sym.isConstant, true, "@constant tag, isConstant set.");
-	*/
-	
-	// @version
-	var versions = this.comment.getTag("version");
-	if (versions.length) {
-		this.version = versions.map(function($){return $.desc;}).join(", ");
-	}
-	
-	/*t:
-		var sym = new JSDOC.Symbol("foo", [], "FILE", new JSDOC.DocComment("/**@version 2.0x*"+"/"));
-		is(sym.version, "2.0x", "@version tag, version is found.");
-	*/
-	
-	// @deprecated
-	var deprecateds = this.comment.getTag("deprecated");
-	if (deprecateds.length) {
-		this.deprecated = deprecateds.map(function($){return $.desc;}).join("\n");
-	}
-	
-	/*t:
-		var sym = new JSDOC.Symbol("foo", [], "FILE", new JSDOC.DocComment("/**@deprecated Use other method.*"+"/"));
-		is(sym.deprecated, "Use other method.", "@deprecated tag, desc is found.");
-	*/
-	
-	// @example
-	var examples = this.comment.getTag("example");
-	if (examples.length) {
-		this.example = examples.map(
-			// trim trailing whitespace
-			function($) {
-				$.desc = $.desc.replace(/\s+$/, "");
-				return $;
-			}
-		);
-	}
-	
-	/*t:
-		var sym = new JSDOC.Symbol("foo", [], "FILE", new JSDOC.DocComment("/**@example This\n  is an example. \n*"+"/"));
-		isnt(typeof sym.example[0], "undefined", "@example tag, creates sym.example array.");
-		is(sym.example[0], "This\n  is an example.", "@example tag, desc is found.");
-	*/
-	
-	// @see
-	var sees = this.comment.getTag("see");
-	if (sees.length) {
-		var thisSee = this.see;
-		sees.map(function($){thisSee.push($.desc);});
-	}
-	
-	/*t:
-		var sym = new JSDOC.Symbol("foo", [], "FILE", new JSDOC.DocComment("/**@see The other thing.*"+"/"));
-		is(sym.see, "The other thing.", "@see tag, desc is found.");
-	*/
-	
-	// @class
-	var classes = this.comment.getTag("class");
-	if (classes.length) {
-		this.isa = "CONSTRUCTOR";
-		this.classDesc = classes[0].desc; // desc can't apply to the constructor as there is none.
-	}
-	
-	/*t:
-		var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@class This describes the class.*"+"/"));
-		is(sym.isa, "CONSTRUCTOR", "@class tag, makes symbol a constructor.");
-		is(sym.classDesc, "This describes the class.", "@class tag, class description is found.");
-	*/
-	
-	// @namespace
-	var namespaces = this.comment.getTag("namespace");
-	if (namespaces.length) {
-		this.classDesc = namespaces[0].desc;
-		this.isNamespace = true;
-	}
-	
-	/*t:
-		var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@namespace This describes the namespace.*"+"/"));
-		is(sym.classDesc, "This describes the namespace.", "@namespace tag, class description is found.");
-	*/
-	
-	// @param
-	var params = this.comment.getTag("param");
-	if (params.length) {
-		// user-defined params overwrite those with same name defined by the parser
-		var thisParams = this.params;
-
-		if (thisParams.length == 0) { // none exist yet, so just bung all these user-defined params straight in
-			this.params = params;
-		}
-		else { // need to overlay these user-defined params on to existing parser-defined params
-			for (var i = 0, l = params.length; i < l; i++) {
-				if (thisParams[i]) {
-					if (params[i].type) thisParams[i].type = params[i].type;
-					thisParams[i].name = params[i].name;
-					thisParams[i].desc = params[i].desc;
-					thisParams[i].isOptional = params[i].isOptional;
-					thisParams[i].defaultValue = params[i].defaultValue;
-				}
-				else thisParams[i] = params[i];
-			}
-		}
-	}
-	
-	/*t:
-		var sym = new JSDOC.Symbol("foo", [{type: "array", name: "pages"}], "FUNCTION", new JSDOC.DocComment("/**Description.*"+"/"));
-		is(sym.params.length, 1, "parser defined param is found.");
-		
-		sym = new JSDOC.Symbol("foo", [], "FUNCTION", new JSDOC.DocComment("/**Description.\n@param {array} pages*"+"/"));
-		is(sym.params.length, 1, "user defined param is found.");
-		is(sym.params[0].type, "array", "user defined param type is found.");
-		is(sym.params[0].name, "pages", "user defined param name is found.");
-		
-		sym = new JSDOC.Symbol("foo", [{type: "array", name: "pages"}], "FUNCTION", new JSDOC.DocComment("/**Description.\n@param {string} uid*"+"/"));
-		is(sym.params.length, 1, "user defined param overwrites parser defined param.");
-		is(sym.params[0].type, "string", "user defined param type overwrites parser defined param type.");
-		is(sym.params[0].name, "uid", "user defined param name overwrites parser defined param name.");
-	
-		sym = new JSDOC.Symbol("foo", [{type: "array", name: "pages"}, {type: "number", name: "count"}], "FUNCTION", new JSDOC.DocComment("/**Description.\n@param {string} uid*"+"/"));
-		is(sym.params.length, 2, "user defined params  overlay parser defined params.");
-		is(sym.params[1].type, "number", "user defined param type overlays parser defined param type.");
-		is(sym.params[1].name, "count", "user defined param name overlays parser defined param name.");
-
-		sym = new JSDOC.Symbol("foo", [], "FUNCTION", new JSDOC.DocComment("/**Description.\n@param {array} pages The pages description.*"+"/"));
-		is(sym.params.length, 1, "user defined param with description is found.");
-		is(sym.params[0].desc, "The pages description.", "user defined param description is found.");
-	*/
-	
-	// @constructor
-	if (this.comment.getTag("constructor").length) {
-		this.isa = "CONSTRUCTOR";
-	}
-	
-	/*t:
-		var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@constructor*"+"/"));
-		is(sym.isa, "CONSTRUCTOR", "@constructor tag, makes symbol a constructor.");
-	*/
-	
-	// @static
-	if (this.comment.getTag("static").length) {
-		this.isStatic = true;
-		if (this.isa == "CONSTRUCTOR") {
-			this.isNamespace = true;
-		}
-	}
-	
-	/*t:
-		var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@static\n@constructor*"+"/"));
-		is(sym.isStatic, true, "@static tag, makes isStatic true.");
-		is(sym.isNamespace, true, "@static and @constructor tag, makes isNamespace true.");
-	*/
-	
-	// @inner
-	if (this.comment.getTag("inner").length) {
-		this.isInner = true;
-		this.isStatic = false;
-	}
-	
-	/*t:
-		var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@inner*"+"/"));
-		is(sym.isStatic, false, "@inner tag, makes isStatic false.");
-		is(sym.isInner, true, "@inner makes isInner true.");
-	*/
-	
-	// @name
-	var names = this.comment.getTag("name");
-	if (names.length) {
-		this.name = names[0].desc;
-	}
-	
-	/*t:
-		// todo
-	*/
-	
-	// @field
-	if (this.comment.getTag("field").length) {
-		this.isa = "OBJECT";
-	}
-	
-	/*t:
-		var sym = new JSDOC.Symbol("foo", [], "FUNCTION", new JSDOC.DocComment("/**@field*"+"/"));
-		is(sym.isa, "OBJECT", "@field tag, makes symbol an object.");
-	*/
-	
-	// @function
-	if (this.comment.getTag("function").length) {
-		this.isa = "FUNCTION";
-		if (/event:/.test(this.alias)) this.isEvent = true;
-	}
-	
-	/*t:
-		var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@function*"+"/"));
-		is(sym.isa, "FUNCTION", "@function tag, makes symbol a function.");
-	*/
-	
-	// @event
-	var events = this.comment.getTag("event");
-	if (events.length) {
-		this.isa = "FUNCTION";
-		this.isEvent = true;
-		if (!/event:/.test(this.alias))
-			this.alias = this.alias.replace(/^(.*[.#-])([^.#-]+)$/, "$1event:$2");
-	}
-	
-	/*t:
-		var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@event*"+"/"));
-		is(sym.isa, "FUNCTION", "@event tag, makes symbol a function.");
-		is(sym.isEvent, true, "@event makes isEvent true.");
-	*/
-	
-	// @fires
-	var fires = this.comment.getTag("fires");
-	if (fires.length) {
-		for (var i = 0; i < fires.length; i++) {
-			this.fires.push(fires[i].desc);
-		}
-	}
-	
-	/*t:
-		// todo
-	*/
-	
-	// @property
-	var properties = this.comment.getTag("property");
-	if (properties.length) {
-		thisProperties = this.properties;
-		for (var i = 0; i < properties.length; i++) {
-			var property = new JSDOC.Symbol(this.alias+"#"+properties[i].name, [], "OBJECT", new JSDOC.DocComment("/**"+properties[i].desc+"*/"));
-			// TODO: shouldn't the following happen in the addProperty method of Symbol?
-			if (properties[i].type) property.type = properties[i].type;
-			if (properties[i].defaultValue) property.defaultValue = properties[i].defaultValue;
-			this.addProperty(property);
-			if (!JSDOC.Parser.symbols.getSymbolByName(property.name))
-				JSDOC.Parser.addSymbol(property);
-		}
-	}
-	
-	/*t:
-		// todo
-	*/
-
-	// @return
-	var returns = this.comment.getTag("return");
-	if (returns.length) { // there can be many return tags in a single doclet
-		this.returns = returns;
-		this.type = returns.map(function($){return $.type}).join(", ");
-	}
-	
-	/*t:
-		// todo
-	*/
-	
-	// @exception
-	this.exceptions = this.comment.getTag("throws");
-	
-	/*t:
-		// todo
-	*/
-	
-	// @requires
-	var requires = this.comment.getTag("requires");
-	if (requires.length) {
-		this.requires = requires.map(function($){return $.desc});
-	}
-	
-	/*t:
-		// todo
-	*/
-	
-	// @type
-	var types = this.comment.getTag("type");
-	if (types.length) {
-		this.type = types[0].desc; //multiple type tags are ignored
-	}
-	
-	/*t:
-		// todo
-	*/
-	
-	// @private
-	if (this.comment.getTag("private").length || this.isInner) {
-		this.isPrivate = true;
-	}
-	
-	// @ignore
-	if (this.comment.getTag("ignore").length) {
-		this.isIgnored = true;
-	}
-	
-	/*t:
-		// todo
-	*/
-	
-	// @inherits ... as ...
-	var inherits = this.comment.getTag("inherits");
-	if (inherits.length) {
-		for (var i = 0; i < inherits.length; i++) {
-			if (/^\s*([a-z$0-9_.#:-]+)(?:\s+as\s+([a-z$0-9_.#:-]+))?/i.test(inherits[i].desc)) {
-				var inAlias = RegExp.$1;
-				var inAs = RegExp.$2 || inAlias;
-
-				if (inAlias) inAlias = inAlias.replace(/\.prototype\.?/g, "#");
-				
-				if (inAs) {
-					inAs = inAs.replace(/\.prototype\.?/g, "#");
-					inAs = inAs.replace(/^this\.?/, "#");
-				}
-
-				if (inAs.indexOf(inAlias) != 0) { //not a full namepath
-					var joiner = ".";
-					if (this.alias.charAt(this.alias.length-1) == "#" || inAs.charAt(0) == "#") {
-						joiner = "";
-					}
-					inAs = this.alias + joiner + inAs;
-				}
-			}
-			this.inherits.push({alias: inAlias, as: inAs});
-		}
-	}
-	
-	/*t:
-		// todo
-	*/
-	
-	// @augments
-	this.augments = this.comment.getTag("augments");
-	
-	// @default
-	var defaults = this.comment.getTag("default");
-	if (defaults.length) {
-		if (this.is("OBJECT")) {
-			this.defaultValue = defaults[0].desc;
-		}
-	}
-	
-	/*t:
-		// todo
-	*/
-	
-	// @memberOf
-	var memberOfs = this.comment.getTag("memberOf");
-	if (memberOfs.length) {
-		this.memberOf = memberOfs[0].desc;
-		this.memberOf = this.memberOf.replace(/\.prototype\.?/g, "#");
-	}
-
-	/*t:
-		// todo
-	*/
-	
-	// @public
-	if (this.comment.getTag("public").length) {
-		this.isPrivate = false;
-	}
-	
-	/*t:
-		// todo
-	*/
-		
-	if (JSDOC.PluginManager) {
-		JSDOC.PluginManager.run("onSetTags", this);
-	}
-}
-
-JSDOC.Symbol.prototype.is = function(what) {
-	return this.isa === what;
-}
-
-JSDOC.Symbol.prototype.isBuiltin = function() {
-	return JSDOC.Lang.isBuiltin(this.alias);
-}
-
-JSDOC.Symbol.prototype.setType = function(/**String*/comment, /**Boolean*/overwrite) {
-	if (!overwrite && this.type) return;
-	var typeComment = JSDOC.DocComment.unwrapComment(comment);
-	this.type = typeComment;
-}
-
-JSDOC.Symbol.prototype.inherit = function(symbol) {
-	if (!this.hasMember(symbol.name) && !symbol.isInner) {
-		if (symbol.is("FUNCTION"))
-			this.methods.push(symbol);
-		else if (symbol.is("OBJECT"))
-			this.properties.push(symbol);
-	}
-}
-
-JSDOC.Symbol.prototype.hasMember = function(name) {
-	return (this.hasMethod(name) || this.hasProperty(name));
-}
-
-JSDOC.Symbol.prototype.addMember = function(symbol) {
-	if (symbol.is("FUNCTION")) { this.addMethod(symbol); }
-	else if (symbol.is("OBJECT")) { this.addProperty(symbol); }
-}
-
-JSDOC.Symbol.prototype.hasMethod = function(name) {
-	var thisMethods = this.methods;
-	for (var i = 0, l = thisMethods.length; i < l; i++) {
-		if (thisMethods[i].name == name) return true;
-		if (thisMethods[i].alias == name) return true;
-	}
-	return false;
-}
-
-JSDOC.Symbol.prototype.addMethod = function(symbol) {
-	var methodAlias = symbol.alias;
-	var thisMethods = this.methods;
-	for (var i = 0, l = thisMethods.length; i < l; i++) {
-		if (thisMethods[i].alias == methodAlias) {
-			thisMethods[i] = symbol; // overwriting previous method
-			return;
-		}
-	}
-	thisMethods.push(symbol); // new method with this alias
-}
-
-JSDOC.Symbol.prototype.hasProperty = function(name) {
-	var thisProperties = this.properties;
-	for (var i = 0, l = thisProperties.length; i < l; i++) {
-		if (thisProperties[i].name == name) return true;
-		if (thisProperties[i].alias == name) return true;
-	}
-	return false;
-}
-
-JSDOC.Symbol.prototype.addProperty = function(symbol) {
-	var propertyAlias = symbol.alias;
-	var thisProperties = this.properties;
-	for (var i = 0, l = thisProperties.length; i < l; i++) {
-		if (thisProperties[i].alias == propertyAlias) {
-			thisProperties[i] = symbol; // overwriting previous property
-			return;
-		}
-	}
-
-	thisProperties.push(symbol); // new property with this alias
-}
-
-JSDOC.Symbol.srcFile = ""; //running reference to the current file being parsed
--- a/sbin/res/jsdoc/app/lib/JSDOC/SymbolSet.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,243 +0,0 @@
-/** @constructor */
-JSDOC.SymbolSet = function() {
-	this.init();
-}
-
-JSDOC.SymbolSet.prototype.init = function() {
-	this._index = new Hash();
-}
-
-JSDOC.SymbolSet.prototype.keys = function() {
-	return this._index.keys();
-}
-
-JSDOC.SymbolSet.prototype.hasSymbol = function(alias) {
-	return this._index.hasKey(alias);
-}
-
-JSDOC.SymbolSet.prototype.addSymbol = function(symbol) {
-	if (JSDOC.opt.a && this.hasSymbol(symbol.alias)) {
-		LOG.warn("Overwriting symbol documentation for: " + symbol.alias + ".");
-		this.deleteSymbol(symbol.alias);
-	}
-	this._index.set(symbol.alias, symbol);
-}
-
-JSDOC.SymbolSet.prototype.getSymbol = function(alias) {
-	if (this.hasSymbol(alias)) return this._index.get(alias);
-}
-
-JSDOC.SymbolSet.prototype.getSymbolByName = function(name) {
-	for (var p = this._index.first(); p; p = this._index.next()) {
-		var symbol = p.value;
-		if (symbol.name == name) return symbol;
-	}
-}
-
-JSDOC.SymbolSet.prototype.toArray = function() {
-	return this._index.values();
-}
-
-JSDOC.SymbolSet.prototype.deleteSymbol = function(alias) {
-	if (!this.hasSymbol(alias)) return;
-	this._index.drop(alias);
-}
-
-JSDOC.SymbolSet.prototype.renameSymbol = function(oldName, newName) {
-	// todo: should check if oldname or newname already exist
-	this._index.replace(oldName, newName);
-	this._index.get(newName).alias = newName;
-	return newName;
-}
-
-JSDOC.SymbolSet.prototype.relate = function() {
-	this.resolveBorrows();
-	this.resolveMemberOf();
-	this.resolveAugments();
-}
-
-JSDOC.SymbolSet.prototype.resolveBorrows = function() {
-	for (var p = this._index.first(); p; p = this._index.next()) {
-		var symbol = p.value;
-		if (symbol.is("FILE") || symbol.is("GLOBAL")) continue;
-		
-		var borrows = symbol.inherits;
-		for (var i = 0; i < borrows.length; i++) {
-		
-if (/#$/.test(borrows[i].alias)) {
-	LOG.warn("Attempted to borrow entire instance of "+borrows[i].alias+" but that feature is not yet implemented.");
-	return;
-}
-			var borrowed = this.getSymbol(borrows[i].alias);
-			
-			if (!borrowed) {
-				LOG.warn("Can't borrow undocumented "+borrows[i].alias+".");
-				continue;
-			}
-
-			if (borrows[i].as == borrowed.alias) {
-				var assumedName = borrowed.name.split(/([#.-])/).pop();
-				borrows[i].as = symbol.name+RegExp.$1+assumedName;
-				LOG.inform("Assuming borrowed as name is "+borrows[i].as+" but that feature is experimental.");
-			}
-			
-			var borrowAsName = borrows[i].as;
-			var borrowAsAlias = borrowAsName;
-			if (!borrowAsName) {
-				LOG.warn("Malformed @borrow, 'as' is required.");
-				continue;
-			}
-			
-			if (borrowAsName.length > symbol.alias.length && borrowAsName.indexOf(symbol.alias) == 0) {
-				borrowAsName = borrowAsName.replace(borrowed.alias, "")
-			}
-			else {
-				var joiner = "";
-				if (borrowAsName.charAt(0) != "#") joiner = ".";
-				borrowAsAlias = borrowed.alias + joiner + borrowAsName;
-			}
-			
-			borrowAsName = borrowAsName.replace(/^[#.]/, "");
-					
-			if (this.hasSymbol(borrowAsAlias)) continue;
-
-			var clone = borrowed.clone();
-			clone.name = borrowAsName;
-			clone.alias = borrowAsAlias;
-			this.addSymbol(clone);
-		}
-	}
-}
-
-JSDOC.SymbolSet.prototype.resolveMemberOf = function() {
-	for (var p = this._index.first(); p; p = this._index.next()) {
-		var symbol = p.value;
-
-		if (symbol.is("FILE") || symbol.is("GLOBAL")) continue;
-		
-		// the memberOf value was provided in the @memberOf tag
-		else if (symbol.memberOf) {			
-			// like foo.bar is a memberOf foo
-			if (symbol.alias.indexOf(symbol.memberOf) == 0) {
-				var memberMatch = new RegExp("^("+symbol.memberOf+")[.#-]?(.+)$");
-				var aliasParts = symbol.alias.match(memberMatch);
-				
-				if (aliasParts) {
-					symbol.memberOf = aliasParts[1];
-					symbol.name = aliasParts[2];
-				}
-				
-				var nameParts = symbol.name.match(memberMatch);
-
-				if (nameParts) {
-					symbol.name = nameParts[2];
-				}
-			}
-			// like bar is a memberOf foo
-			else {
-				var joiner = symbol.memberOf.charAt(symbol.memberOf.length-1);
-				if (!/[.#-]/.test(joiner)) symbol.memberOf += ".";
-				this.renameSymbol(symbol.alias, symbol.memberOf + symbol.name);
-			}
-		}
-		// the memberOf must be calculated
-		else {
-			var parts = symbol.alias.match(/^(.*[.#-])([^.#-]+)$/);
-
-			if (parts) {
-				symbol.memberOf = parts[1];
-				symbol.name = parts[2];				
-			}
-		}
-
-		// set isStatic, isInner
-		if (symbol.memberOf) {
-			switch (symbol.memberOf.charAt(symbol.memberOf.length-1)) {
-				case '#' :
-					symbol.isStatic = false;
-					symbol.isInner = false;
-				break;
-				case '.' :
-					symbol.isStatic = true;
-					symbol.isInner = false;
-				break;
-				case '-' :
-					symbol.isStatic = false;
-					symbol.isInner = true;
-				break;
-				default: // memberOf ends in none of the above
-					symbol.isStatic = true;
-				break;
-			}
-		}
-		
-		// unowned methods and fields belong to the global object
-		if (!symbol.is("CONSTRUCTOR") && !symbol.isNamespace && symbol.memberOf == "") {
-			symbol.memberOf = "_global_";
-		}
-
-		// clean up
-		if (symbol.memberOf.match(/[.#-]$/)) {
-			symbol.memberOf = symbol.memberOf.substr(0, symbol.memberOf.length-1);
-		}
-		// add to parent's methods or properties list
-		if (symbol.memberOf) {
-
-			var container = this.getSymbol(symbol.memberOf);
-			if (!container) {
-				if (JSDOC.Lang.isBuiltin(symbol.memberOf)) container = JSDOC.Parser.addBuiltin(symbol.memberOf);
-				else {
-					LOG.warn("Trying to document "+symbol.name +" as a member of undocumented symbol "+symbol.memberOf+".");
-				}
-			}
-			
-			if (container) container.addMember(symbol);
-		}
-	}
-}
-
-JSDOC.SymbolSet.prototype.resolveAugments = function() {
-	for (var p = this._index.first(); p; p = this._index.next()) {
-		var symbol = p.value;
-		
-		if (symbol.alias == "_global_" || symbol.is("FILE")) continue;
-		JSDOC.SymbolSet.prototype.walk.apply(this, [symbol]);
-	}
-}
-
-JSDOC.SymbolSet.prototype.walk = function(symbol) {
-	var augments = symbol.augments;
-	for(var i = 0; i < augments.length; i++) {
-		var contributer = this.getSymbol(augments[i]);
-		if (!contributer && JSDOC.Lang.isBuiltin(''+augments[i])) {
-			contributer = new JSDOC.Symbol("_global_."+augments[i], [], augments[i], new JSDOC.DocComment("Built in."));
-			contributer.isNamespace = true;
-			contributer.srcFile = "";
-			contributer.isPrivate = false;
-			JSDOC.Parser.addSymbol(contributer);
-		}
-		
-		if (contributer) {			
-			if (contributer.augments.length) {
-				JSDOC.SymbolSet.prototype.walk.apply(this, [contributer]);
-			}
-			
-			symbol.inheritsFrom.push(contributer.alias);
-			//if (!isUnique(symbol.inheritsFrom)) {
-			//	LOG.warn("Can't resolve augments: Circular reference: "+symbol.alias+" inherits from "+contributer.alias+" more than once.");
-			//}
-			//else {
-				var cmethods = contributer.methods;
-				var cproperties = contributer.properties;
-				
-				for (var ci = 0, cl = cmethods.length; ci < cl; ci++) {
-					if (!cmethods[ci].isStatic) symbol.inherit(cmethods[ci]);
-				}
-				for (var ci = 0, cl = cproperties.length; ci < cl; ci++) {
-					if (!cproperties[ci].isStatic) symbol.inherit(cproperties[ci]);
-				}	
-			//}
-		}
-		else LOG.warn("Can't augment contributer: "+augments[i]+", not found.");
-	}
-}
--- a/sbin/res/jsdoc/app/lib/JSDOC/TextStream.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,41 +0,0 @@
-
-/**
-	@constructor
-*/
-JSDOC.TextStream = function(text) {
-	if (typeof(text) == "undefined") text = "";
-	text = ""+text;
-	this.text = text;
-	this.cursor = 0;
-}
-
-JSDOC.TextStream.prototype.look = function(n) {
-	if (typeof n == "undefined") n = 0;
-	
-	if (this.cursor+n < 0 || this.cursor+n >= this.text.length) {
-		var result = new String("");
-		result.eof = true;
-		return result;
-	}
-	return this.text.charAt(this.cursor+n);
-}
-
-JSDOC.TextStream.prototype.next = function(n) {
-	if (typeof n == "undefined") n = 1;
-	if (n < 1) return null;
-	
-	var pulled = "";
-	for (var i = 0; i < n; i++) {
-		if (this.cursor+i < this.text.length) {
-			pulled += this.text.charAt(this.cursor+i);
-		}
-		else {
-			var result = new String("");
-			result.eof = true;
-			return result;
-		}
-	}
-
-	this.cursor += n;
-	return pulled;
-}
\ No newline at end of file
--- a/sbin/res/jsdoc/app/lib/JSDOC/Token.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,18 +0,0 @@
-if (typeof JSDOC == "undefined") JSDOC = {};
-
-/**
-	@constructor
-*/
-JSDOC.Token = function(data, type, name) {
-	this.data = data;
-	this.type = type;
-	this.name = name;
-}
-
-JSDOC.Token.prototype.toString = function() { 
-	return "<"+this.type+" name=\""+this.name+"\">"+this.data+"</"+this.type+">";
-}
-
-JSDOC.Token.prototype.is = function(what) {
-	return this.name === what || this.type === what;
-}
\ No newline at end of file
--- a/sbin/res/jsdoc/app/lib/JSDOC/TokenReader.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,332 +0,0 @@
-if (typeof JSDOC == "undefined") JSDOC = {};
-
-/**
-	@class Search a {@link JSDOC.TextStream} for language tokens.
-*/
-JSDOC.TokenReader = function() {
-	this.keepDocs = true;
-	this.keepWhite = false;
-	this.keepComments = false;
-}
-
-/**
-	@type {JSDOC.Token[]}
- */
-JSDOC.TokenReader.prototype.tokenize = function(/**JSDOC.TextStream*/stream) {
-	var tokens = [];
-	/**@ignore*/ tokens.last    = function() { return tokens[tokens.length-1]; }
-	/**@ignore*/ tokens.lastSym = function() {
-		for (var i = tokens.length-1; i >= 0; i--) {
-			if (!(tokens[i].is("WHIT") || tokens[i].is("COMM"))) return tokens[i];
-		}
-	}
-
-	while (!stream.look().eof) {
-		if (this.read_mlcomment(stream, tokens)) continue;
-		if (this.read_slcomment(stream, tokens)) continue;
-		if (this.read_dbquote(stream, tokens))   continue;
-		if (this.read_snquote(stream, tokens))   continue;
-		if (this.read_regx(stream, tokens))      continue;
-		if (this.read_numb(stream, tokens))      continue;
-		if (this.read_punc(stream, tokens))      continue;
-		if (this.read_newline(stream, tokens))   continue;
-		if (this.read_space(stream, tokens))     continue;
-		if (this.read_word(stream, tokens))      continue;
-		
-		// if execution reaches here then an error has happened
-		tokens.push(new JSDOC.Token(stream.next(), "TOKN", "UNKNOWN_TOKEN"));
-	}
-	return tokens;
-}
-
-/**
-	@returns {Boolean} Was the token found?
- */
-JSDOC.TokenReader.prototype.read_word = function(/**JSDOC.TokenStream*/stream, tokens) {
-	var found = "";
-	while (!stream.look().eof && JSDOC.Lang.isWordChar(stream.look())) {
-		found += stream.next();
-	}
-	
-	if (found === "") {
-		return false;
-	}
-	else {
-		var name;
-		if ((name = JSDOC.Lang.keyword(found))) tokens.push(new JSDOC.Token(found, "KEYW", name));
-		else tokens.push(new JSDOC.Token(found, "NAME", "NAME"));
-		return true;
-	}
-}
-
-/**
-	@returns {Boolean} Was the token found?
- */
-JSDOC.TokenReader.prototype.read_punc = function(/**JSDOC.TokenStream*/stream, tokens) {
-	var found = "";
-	var name;
-	while (!stream.look().eof && JSDOC.Lang.punc(found+stream.look())) {
-		found += stream.next();
-	}
-	
-	if (found === "") {
-		return false;
-	}
-	else {
-		tokens.push(new JSDOC.Token(found, "PUNC", JSDOC.Lang.punc(found)));
-		return true;
-	}
-}
-
-/**
-	@returns {Boolean} Was the token found?
- */
-JSDOC.TokenReader.prototype.read_space = function(/**JSDOC.TokenStream*/stream, tokens) {
-	var found = "";
-	
-	while (!stream.look().eof && JSDOC.Lang.isSpace(stream.look())) {
-		found += stream.next();
-	}
-	
-	if (found === "") {
-		return false;
-	}
-	else {
-		if (this.collapseWhite) found = " ";
-		if (this.keepWhite) tokens.push(new JSDOC.Token(found, "WHIT", "SPACE"));
-		return true;
-	}
-}
-
-/**
-	@returns {Boolean} Was the token found?
- */
-JSDOC.TokenReader.prototype.read_newline = function(/**JSDOC.TokenStream*/stream, tokens) {
-	var found = "";
-	
-	while (!stream.look().eof && JSDOC.Lang.isNewline(stream.look())) {
-		found += stream.next();
-	}
-	
-	if (found === "") {
-		return false;
-	}
-	else {
-		if (this.collapseWhite) found = "\n";
-		if (this.keepWhite) tokens.push(new JSDOC.Token(found, "WHIT", "NEWLINE"));
-		return true;
-	}
-}
-
-/**
-	@returns {Boolean} Was the token found?
- */
-JSDOC.TokenReader.prototype.read_mlcomment = function(/**JSDOC.TokenStream*/stream, tokens) {
-	if (stream.look() == "/" && stream.look(1) == "*") {
-		var found = stream.next(2);
-		
-		while (!stream.look().eof && !(stream.look(-1) == "/" && stream.look(-2) == "*")) {
-			found += stream.next();
-		}
-		
-		// to start doclet we allow /** or /*** but not /**/ or /****
-		if (/^\/\*\*([^\/]|\*[^*])/.test(found) && this.keepDocs) tokens.push(new JSDOC.Token(found, "COMM", "JSDOC"));
-		else if (this.keepComments) tokens.push(new JSDOC.Token(found, "COMM", "MULTI_LINE_COMM"));
-		return true;
-	}
-	return false;
-}
-
-/**
-	@returns {Boolean} Was the token found?
- */
-JSDOC.TokenReader.prototype.read_slcomment = function(/**JSDOC.TokenStream*/stream, tokens) {
-	var found;
-	if (
-		(stream.look() == "/" && stream.look(1) == "/" && (found=stream.next(2)))
-		|| 
-		(stream.look() == "<" && stream.look(1) == "!" && stream.look(2) == "-" && stream.look(3) == "-" && (found=stream.next(4)))
-	) {
-		
-		while (!stream.look().eof && !JSDOC.Lang.isNewline(stream.look())) {
-			found += stream.next();
-		}
-		
-		if (this.keepComments) {
-			tokens.push(new JSDOC.Token(found, "COMM", "SINGLE_LINE_COMM"));
-		}
-		return true;
-	}
-	return false;
-}
-
-/**
-	@returns {Boolean} Was the token found?
- */
-JSDOC.TokenReader.prototype.read_dbquote = function(/**JSDOC.TokenStream*/stream, tokens) {
-	if (stream.look() == "\"") {
-		// find terminator
-		var string = stream.next();
-		
-		while (!stream.look().eof) {
-			if (stream.look() == "\\") {
-				if (JSDOC.Lang.isNewline(stream.look(1))) {
-					do {
-						stream.next();
-					} while (!stream.look().eof && JSDOC.Lang.isNewline(stream.look()));
-					string += "\\\n";
-				}
-				else {
-					string += stream.next(2);
-				}
-			}
-			else if (stream.look() == "\"") {
-				string += stream.next();
-				tokens.push(new JSDOC.Token(string, "STRN", "DOUBLE_QUOTE"));
-				return true;
-			}
-			else {
-				string += stream.next();
-			}
-		}
-	}
-	return false; // error! unterminated string
-}
-
-/**
-	@returns {Boolean} Was the token found?
- */
-JSDOC.TokenReader.prototype.read_snquote = function(/**JSDOC.TokenStream*/stream, tokens) {
-	if (stream.look() == "'") {
-		// find terminator
-		var string = stream.next();
-		
-		while (!stream.look().eof) {
-			if (stream.look() == "\\") { // escape sequence
-				string += stream.next(2);
-			}
-			else if (stream.look() == "'") {
-				string += stream.next();
-				tokens.push(new JSDOC.Token(string, "STRN", "SINGLE_QUOTE"));
-				return true;
-			}
-			else {
-				string += stream.next();
-			}
-		}
-	}
-	return false; // error! unterminated string
-}
-
-/**
-	@returns {Boolean} Was the token found?
- */
-JSDOC.TokenReader.prototype.read_numb = function(/**JSDOC.TokenStream*/stream, tokens) {
-	if (stream.look() === "0" && stream.look(1) == "x") {
-		return this.read_hex(stream, tokens);
-	}
-	
-	var found = "";
-	
-	while (!stream.look().eof && JSDOC.Lang.isNumber(found+stream.look())){
-		found += stream.next();
-	}
-	
-	if (found === "") {
-		return false;
-	}
-	else {
-		if (/^0[0-7]/.test(found)) tokens.push(new JSDOC.Token(found, "NUMB", "OCTAL"));
-		else tokens.push(new JSDOC.Token(found, "NUMB", "DECIMAL"));
-		return true;
-	}
-}
-/*t:
-	requires("../lib/JSDOC/TextStream.js");
-	requires("../lib/JSDOC/Token.js");
-	requires("../lib/JSDOC/Lang.js");
-	
-	plan(3, "testing JSDOC.TokenReader.prototype.read_numb");
-	
-	//// setup
-	var src = "function foo(num){while (num+8.0 >= 0x20 && num < 0777){}}";
-	var tr = new JSDOC.TokenReader();
-	var tokens = tr.tokenize(new JSDOC.TextStream(src));
-	
-	var hexToken, octToken, decToken;
-	for (var i = 0; i < tokens.length; i++) {
-		if (tokens[i].name == "HEX_DEC") hexToken = tokens[i];
-		if (tokens[i].name == "OCTAL") octToken = tokens[i];
-		if (tokens[i].name == "DECIMAL") decToken = tokens[i];
-	}
-	////
-	
-	is(decToken.data, "8.0", "decimal number is found in source.");
-	is(hexToken.data, "0x20", "hexdec number is found in source (issue #99).");
-	is(octToken.data, "0777", "octal number is found in source.");
-*/
-
-/**
-	@returns {Boolean} Was the token found?
- */
-JSDOC.TokenReader.prototype.read_hex = function(/**JSDOC.TokenStream*/stream, tokens) {
-	var found = stream.next(2);
-	
-	while (!stream.look().eof) {
-		if (JSDOC.Lang.isHexDec(found) && !JSDOC.Lang.isHexDec(found+stream.look())) { // done
-			tokens.push(new JSDOC.Token(found, "NUMB", "HEX_DEC"));
-			return true;
-		}
-		else {
-			found += stream.next();
-		}
-	}
-	return false;
-}
-
-/**
-	@returns {Boolean} Was the token found?
- */
-JSDOC.TokenReader.prototype.read_regx = function(/**JSDOC.TokenStream*/stream, tokens) {
-	var last;
-	if (
-		stream.look() == "/"
-		&& 
-		(
-			
-			(
-				!(last = tokens.lastSym()) // there is no last, the regex is the first symbol
-				|| 
-				(
-					   !last.is("NUMB")
-					&& !last.is("NAME")
-					&& !last.is("RIGHT_PAREN")
-					&& !last.is("RIGHT_BRACKET")
-				)
-			)
-		)
-	) {
-		var regex = stream.next();
-		
-		while (!stream.look().eof) {
-			if (stream.look() == "\\") { // escape sequence
-				regex += stream.next(2);
-			}
-			else if (stream.look() == "/") {
-				regex += stream.next();
-				
-				while (/[gmi]/.test(stream.look())) {
-					regex += stream.next();
-				}
-				
-				tokens.push(new JSDOC.Token(regex, "REGX", "REGX"));
-				return true;
-			}
-			else {
-				regex += stream.next();
-			}
-		}
-		// error: unterminated regex
-	}
-	return false;
-}
--- a/sbin/res/jsdoc/app/lib/JSDOC/TokenStream.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,133 +0,0 @@
-if (typeof JSDOC == "undefined") JSDOC = {};
-
-/**
-	@constructor
-*/
-JSDOC.TokenStream = function(tokens) {
-	this.tokens = (tokens || []);
-	this.rewind();
-}
-
-/**
-	@constructor
-	@private
-*/
-function VoidToken(/**String*/type) {
-	this.toString = function() {return "<VOID type=\""+type+"\">"};
-	this.is = function(){return false;}
-}
-
-JSDOC.TokenStream.prototype.rewind = function() {
-	this.cursor = -1;
-}
-
-/**
-	@type JSDOC.Token
-*/
-JSDOC.TokenStream.prototype.look = function(/**Number*/n, /**Boolean*/considerWhitespace) {
-	if (typeof n == "undefined") n = 0;
-
-	if (considerWhitespace == true) {
-		if (this.cursor+n < 0 || this.cursor+n > this.tokens.length) return {};
-		return this.tokens[this.cursor+n];
-	}
-	else {
-		var count = 0;
-		var i = this.cursor;
-
-		while (true) {
-			if (i < 0) return new JSDOC.Token("", "VOID", "START_OF_STREAM");
-			else if (i > this.tokens.length) return new JSDOC.Token("", "VOID", "END_OF_STREAM");
-
-			if (i != this.cursor && (this.tokens[i] === undefined || this.tokens[i].is("WHIT"))) {
-				if (n < 0) i--; else i++;
-				continue;
-			}
-			
-			if (count == Math.abs(n)) {
-				return this.tokens[i];
-			}
-			count++;
-			(n < 0)? i-- : i++;
-		}
-
-		return new JSDOC.Token("", "VOID", "STREAM_ERROR"); // because null isn't an object and caller always expects an object
-	}
-}
-
-/**
-	@type JSDOC.Token|JSDOC.Token[]
-*/
-JSDOC.TokenStream.prototype.next = function(/**Number*/howMany) {
-	if (typeof howMany == "undefined") howMany = 1;
-	if (howMany < 1) return null;
-	var got = [];
-
-	for (var i = 1; i <= howMany; i++) {
-		if (this.cursor+i >= this.tokens.length) {
-			return null;
-		}
-		got.push(this.tokens[this.cursor+i]);
-	}
-	this.cursor += howMany;
-
-	if (howMany == 1) {
-		return got[0];
-	}
-	else return got;
-}
-
-/**
-	@type JSDOC.Token[]
-*/
-JSDOC.TokenStream.prototype.balance = function(/**String*/start, /**String*/stop) {
-	if (!stop) stop = JSDOC.Lang.matching(start);
-	
-	var depth = 0;
-	var got = [];
-	var started = false;
-	
-	while ((token = this.look())) {
-		if (token.is(start)) {
-			depth++;
-			started = true;
-		}
-		
-		if (started) {
-			got.push(token);
-		}
-		
-		if (token.is(stop)) {
-			depth--;
-			if (depth == 0) return got;
-		}
-		if (!this.next()) break;
-	}
-}
-
-JSDOC.TokenStream.prototype.getMatchingToken = function(/**String*/start, /**String*/stop) {
-	var depth = 0;
-	var cursor = this.cursor;
-	
-	if (!start) {
-		start = JSDOC.Lang.matching(stop);
-		depth = 1;
-	}
-	if (!stop) stop = JSDOC.Lang.matching(start);
-	
-	while ((token = this.tokens[cursor])) {
-		if (token.is(start)) {
-			depth++;
-		}
-		
-		if (token.is(stop) && cursor) {
-			depth--;
-			if (depth == 0) return this.tokens[cursor];
-		}
-		cursor++;
-	}
-}
-
-JSDOC.TokenStream.prototype.insertAhead = function(/**JSDOC.Token*/token) {
-	this.tokens.splice(this.cursor+1, 0, token);
-}
\ No newline at end of file
--- a/sbin/res/jsdoc/app/lib/JSDOC/Util.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,32 +0,0 @@
-/**
- * @namespace
- * @deprecated Use {@link FilePath} instead.
- */
-JSDOC.Util = {
-}
-
-/**
- * @deprecated Use {@link FilePath.fileName} instead.
- */
-JSDOC.Util.fileName = function(path) {
-	LOG.warn("JSDOC.Util.fileName is deprecated. Use FilePath.fileName instead.");
-	var nameStart = Math.max(path.lastIndexOf("/")+1, path.lastIndexOf("\\")+1, 0);
-	return path.substring(nameStart);
-}
-
-/**
- * @deprecated Use {@link FilePath.fileExtension} instead.
- */
-JSDOC.Util.fileExtension = function(filename) {
-	LOG.warn("JSDOC.Util.fileExtension is deprecated. Use FilePath.fileExtension instead.");
-	return filename.split(".").pop().toLowerCase();
-};
-
-/**
- * @deprecated Use {@link FilePath.dir} instead.
- */
-JSDOC.Util.dir = function(path) {
-	LOG.warn("JSDOC.Util.dir is deprecated. Use FilePath.dir instead.");
-	var nameStart = Math.max(path.lastIndexOf("/")+1, path.lastIndexOf("\\")+1, 0);
-	return path.substring(0, nameStart-1);
-}
--- a/sbin/res/jsdoc/app/lib/JSDOC/Walker.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,507 +0,0 @@
-if (typeof JSDOC == "undefined") JSDOC = {};
-
-/** @constructor */
-JSDOC.Walker = function(/**JSDOC.TokenStream*/ts) {
-	this.init();
-	if (typeof ts != "undefined") {
-		this.walk(ts);
-	}
-}
-
-JSDOC.Walker.prototype.init = function() {
-	this.ts = null;
-
-	var globalSymbol = new JSDOC.Symbol("_global_", [], "GLOBAL", new JSDOC.DocComment(""));
-	globalSymbol.isNamespace = true;
-	globalSymbol.srcFile = "";
-	globalSymbol.isPrivate = false;
-	JSDOC.Parser.addSymbol(globalSymbol);
-	this.lastDoc = null;
-	this.token = null;
-	
-	/**
-		The chain of symbols under which we are currently nested.
-		@type Array
-	*/
-	this.namescope = [globalSymbol];
-	this.namescope.last = function(n){ if (!n) n = 0; return this[this.length-(1+n)] || "" };
-}
-
-JSDOC.Walker.prototype.walk = function(/**JSDOC.TokenStream*/ts) {
-	this.ts = ts;
-	while (this.token = this.ts.look()) {
-		if (this.token.popNamescope) {
-			
-			var symbol = this.namescope.pop();
-			if (symbol.is("FUNCTION")) {
-				if (this.ts.look(1).is("LEFT_PAREN") && symbol.comment.getTag("function").length == 0) {
-					symbol.isa = "OBJECT";
-				}
-			}
-		}
-		this.step();
-		if (!this.ts.next()) break;
-	}
-}
-
-JSDOC.Walker.prototype.step = function() {
-	if (this.token.is("JSDOC")) { // it's a doc comment
-	
-		var doc = new JSDOC.DocComment(this.token.data);
-		
-				
-		if (doc.getTag("exports").length > 0) {
-			var exports = doc.getTag("exports")[0];
-
-			exports.desc.match(/(\S+) as (\S+)/i);
-			var n1 = RegExp.$1;
-			var n2 = RegExp.$2;
-			
-			if (!n1 && n2) throw "@exports tag requires a value like: 'name as ns.name'";
-			
-			JSDOC.Parser.rename = (JSDOC.Parser.rename || {});	
-			JSDOC.Parser.rename[n1] = n2
-		}
-		
-		if (doc.getTag("lends").length > 0) {
-			var lends = doc.getTag("lends")[0];
-
-			var name = lends.desc
-			if (!name) throw "@lends tag requires a value.";
-			
-			var symbol = new JSDOC.Symbol(name, [], "OBJECT", doc);
-			
-			this.namescope.push(symbol);
-			
-			var matching = this.ts.getMatchingToken("LEFT_CURLY");
-			if (matching) matching.popNamescope = name;
-			else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + ".");
-			
-			this.lastDoc = null;
-			return true;
-		}
-		else if (doc.getTag("name").length > 0 && doc.getTag("overview").length == 0) { // it's a virtual symbol
-			var virtualName = doc.getTag("name")[0].desc;
-			if (!virtualName) throw "@name tag requires a value.";
-			
-			if (doc.getTag("memberOf").length > 0) {
-				virtualName = (doc.getTag("memberOf")[0] + "." + virtualName)
-					.replace(/([#.])\./, "$1");
-				doc.deleteTag("memberOf");
-			}
-
-			var symbol = new JSDOC.Symbol(virtualName, [], "VIRTUAL", doc);
-			
-			JSDOC.Parser.addSymbol(symbol);
-			
-			this.lastDoc = null;
-			return true;
-		}
-		else if (doc.meta) { // it's a meta doclet
-			if (doc.meta == "@+") JSDOC.DocComment.shared = doc.src;
-			else if (doc.meta == "@-") JSDOC.DocComment.shared = "";
-			else if (doc.meta == "nocode+") JSDOC.Parser.conf.ignoreCode = true;
-			else if (doc.meta == "nocode-") JSDOC.Parser.conf.ignoreCode = JSDOC.opt.n;
-			else throw "Unrecognized meta comment: "+doc.meta;
-			
-			this.lastDoc = null;
-			return true;
-		}
-		else if (doc.getTag("overview").length > 0) { // it's a file overview
-			symbol = new JSDOC.Symbol("", [], "FILE", doc);
-			
-			JSDOC.Parser.addSymbol(symbol);
-			
-			this.lastDoc = null;
-			return true;
-		}
-		else {
-			this.lastDoc = doc;
-			return false;
-		}
-	}
-	else if (!JSDOC.Parser.conf.ignoreCode) { // it's code
-		if (this.token.is("NAME")) { // it's the name of something
-			var symbol;
-			var name = this.token.data;
-			var doc = null; if (this.lastDoc) doc = this.lastDoc;
-			var params = [];
-		
-			// it's inside an anonymous object
-			if (this.ts.look(1).is("COLON") && this.ts.look(-1).is("LEFT_CURLY") && !(this.ts.look(-2).is("JSDOC") || this.namescope.last().comment.getTag("lends").length || this.ts.look(-2).is("ASSIGN") || this.ts.look(-2).is("COLON"))) {
-				name = "$anonymous";
-				name = this.namescope.last().alias+"-"+name
-					
-				params = [];
-				
-				symbol = new JSDOC.Symbol(name, params, "OBJECT", doc);
-
-				JSDOC.Parser.addSymbol(symbol);
-				
-				this.namescope.push(symbol);
-				
-				var matching = this.ts.getMatchingToken(null, "RIGHT_CURLY");
-				if (matching) matching.popNamescope = name;
-				else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + ".");
-			}
-			// function foo() {}
-			else if (this.ts.look(-1).is("FUNCTION") && this.ts.look(1).is("LEFT_PAREN")) {
-				var isInner;
-				
-				if (this.lastDoc) doc = this.lastDoc;
-				
-				if (doc && doc.getTag("memberOf").length > 0) {
-					name = (doc.getTag("memberOf")[0]+"."+name).replace("#.", "#");
-					doc.deleteTag("memberOf");
-				}
-				else {
-					name = this.namescope.last().alias+"-"+name;
-					if (!this.namescope.last().is("GLOBAL")) isInner = true;
-				}
-				
-				if (!this.namescope.last().is("GLOBAL")) isInner = true;
-				
-				params = JSDOC.Walker.onParamList(this.ts.balance("LEFT_PAREN"));
-
-				symbol = new JSDOC.Symbol(name, params, "FUNCTION", doc);
-				if (isInner) symbol.isInner = true;
-
-				if (this.ts.look(1).is("JSDOC")) {
-					var inlineReturn = ""+this.ts.look(1).data;
-					inlineReturn = inlineReturn.replace(/(^\/\*\* *| *\*\/$)/g, "");
-					symbol.type = inlineReturn;
-				}
-				
-				JSDOC.Parser.addSymbol(symbol);
-				
-				this.namescope.push(symbol);
-				
-				var matching = this.ts.getMatchingToken("LEFT_CURLY");
-				if (matching) matching.popNamescope = name;
-				else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + ".");
-			}
-			// foo = function() {}
-			else if (this.ts.look(1).is("ASSIGN") && this.ts.look(2).is("FUNCTION")) {
-				var constructs;
-				var isConstructor = false;
-				if (doc && (constructs = doc.getTag("constructs")) && constructs.length) {
-					if (constructs[0].desc) {
-						name = constructs[0].desc;
-						isConstructor = true;
-					}
-				}
-					
-				var isInner;
-				if (this.ts.look(-1).is("VAR") || this.isInner) {
-					if (doc && doc.getTag("memberOf").length > 0) {
-						name = (doc.getTag("memberOf")[0]+"."+name).replace("#.", "#");
-						doc.deleteTag("memberOf");
-					}
-					else {
-						name = this.namescope.last().alias+"-"+name;
-						if (!this.namescope.last().is("GLOBAL")) isInner = true;
-					}
-					if (!this.namescope.last().is("GLOBAL")) isInner = true;
-				}
-				else if (name.indexOf("this.") == 0) {
-					name = this.resolveThis(name);
-				}
-
-				if (this.lastDoc) doc = this.lastDoc;
-				params = JSDOC.Walker.onParamList(this.ts.balance("LEFT_PAREN"));
-				
-				symbol = new JSDOC.Symbol(name, params, "FUNCTION", doc);
-
-				if (isInner) symbol.isInner = true;
-				if (isConstructor) symbol.isa = "CONSTRUCTOR";
-				
-				if (this.ts.look(1).is("JSDOC")) {
-					var inlineReturn = ""+this.ts.look(1).data;
-					inlineReturn = inlineReturn.replace(/(^\/\*\* *| *\*\/$)/g, "");
-					symbol.type = inlineReturn;
-				}
-
-				JSDOC.Parser.addSymbol(symbol);
-				
-				this.namescope.push(symbol);
-				
-				var matching = this.ts.getMatchingToken("LEFT_CURLY");
-				if (matching) matching.popNamescope = name;
-				else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + ".");
-			}
-			// foo = new function() {} or foo = (function() {}
-			else if (this.ts.look(1).is("ASSIGN") && (this.ts.look(2).is("NEW") || this.ts.look(2).is("LEFT_PAREN")) && this.ts.look(3).is("FUNCTION")) {
-				var isInner;
-				if (this.ts.look(-1).is("VAR") || this.isInner) {
-					name = this.namescope.last().alias+"-"+name
-					if (!this.namescope.last().is("GLOBAL")) isInner = true;
-				}
-				else if (name.indexOf("this.") == 0) {
-					name = this.resolveThis(name);
-				}
-
-				this.ts.next(3); // advance past the "new" or "("
-				
-				if (this.lastDoc) doc = this.lastDoc;
-				params = JSDOC.Walker.onParamList(this.ts.balance("LEFT_PAREN"));
-				
-				symbol = new JSDOC.Symbol(name, params, "OBJECT", doc);
-				if (isInner) symbol.isInner = true;
-				
-				if (this.ts.look(1).is("JSDOC")) {
-					var inlineReturn = ""+this.ts.look(1).data;
-					inlineReturn = inlineReturn.replace(/(^\/\*\* *| *\*\/$)/g, "");
-					symbol.type = inlineReturn;
-				}
-				
-				JSDOC.Parser.addSymbol(symbol);
-				
-				symbol.scopeType = "INSTANCE";
-				this.namescope.push(symbol);
-				
-				var matching = this.ts.getMatchingToken("LEFT_CURLY");
-				if (matching) matching.popNamescope = name;
-				else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + ".");
-			}
-			// foo: function() {}
-			else if (this.ts.look(1).is("COLON") && this.ts.look(2).is("FUNCTION")) {
-				name = (this.namescope.last().alias+"."+name).replace("#.", "#");
-				
-				if (this.lastDoc) doc = this.lastDoc;
-				params = JSDOC.Walker.onParamList(this.ts.balance("LEFT_PAREN"));
-				
-				if (doc && doc.getTag("constructs").length) {
-					name = name.replace(/\.prototype(\.|$)/, "#");
-					
-					if (name.indexOf("#") > -1) name = name.match(/(^[^#]+)/)[0];
-					else name = this.namescope.last().alias;
-
-					symbol = new JSDOC.Symbol(name, params, "CONSTRUCTOR", doc);
-				}
-				else {
-					symbol = new JSDOC.Symbol(name, params, "FUNCTION", doc);
-				}
-				
-				if (this.ts.look(1).is("JSDOC")) {
-					var inlineReturn = ""+this.ts.look(1).data;
-					inlineReturn = inlineReturn.replace(/(^\/\*\* *| *\*\/$)/g, "");
-					symbol.type = inlineReturn;
-				}
-				
-				JSDOC.Parser.addSymbol(symbol);
-				
-				this.namescope.push(symbol);
-				
-				var matching = this.ts.getMatchingToken("LEFT_CURLY");
-				if (matching) matching.popNamescope = name;
-				else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + ".");
-			}
-			// foo = {}
-			else if (this.ts.look(1).is("ASSIGN") && this.ts.look(2).is("LEFT_CURLY")) {
-				var isInner;
-				if (this.ts.look(-1).is("VAR") || this.isInner) {
-					name = this.namescope.last().alias+"-"+name
-					if (!this.namescope.last().is("GLOBAL")) isInner = true;
-				}
-				else if (name.indexOf("this.") == 0) {
-					name = this.resolveThis(name);
-				}
-				
-				if (this.lastDoc) doc = this.lastDoc;
-				
-				symbol = new JSDOC.Symbol(name, params, "OBJECT", doc);
-				if (isInner) symbol.isInner = true;
-				
-			
-				if (doc) JSDOC.Parser.addSymbol(symbol);
-
-				this.namescope.push(symbol);
-				
-				var matching = this.ts.getMatchingToken("LEFT_CURLY");
-				if (matching) matching.popNamescope = name;
-				else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + ".");
-			}
-			// var foo;
-			else if (this.ts.look(1).is("SEMICOLON")) {
-				var isInner;
-
-				if (this.ts.look(-1).is("VAR") || this.isInner) {
-					name = this.namescope.last().alias+"-"+name
-					if (!this.namescope.last().is("GLOBAL")) isInner = true;
-					
-					if (this.lastDoc) doc = this.lastDoc;
-				
-					symbol = new JSDOC.Symbol(name, params, "OBJECT", doc);
-					if (isInner) symbol.isInner = true;
-					
-				
-					if (doc) JSDOC.Parser.addSymbol(symbol);
-				}
-			}
-			// foo = x
-			else if (this.ts.look(1).is("ASSIGN")) {				
-				var isInner;
-				if (this.ts.look(-1).is("VAR") || this.isInner) {
-					name = this.namescope.last().alias+"-"+name
-					if (!this.namescope.last().is("GLOBAL")) isInner = true;
-				}
-				else if (name.indexOf("this.") == 0) {
-					name = this.resolveThis(name);
-				}
-				
-				if (this.lastDoc) doc = this.lastDoc;
-				
-				symbol = new JSDOC.Symbol(name, params, "OBJECT", doc);
-				if (isInner) symbol.isInner = true;
-				
-			
-				if (doc) JSDOC.Parser.addSymbol(symbol);
-			}
-			// foo: {}
-			else if (this.ts.look(1).is("COLON") && this.ts.look(2).is("LEFT_CURLY")) {
-				name = (this.namescope.last().alias+"."+name).replace("#.", "#");
-				
-				if (this.lastDoc) doc = this.lastDoc;
-				
-				symbol = new JSDOC.Symbol(name, params, "OBJECT", doc);
-				
-			
-				if (doc) JSDOC.Parser.addSymbol(symbol);
-				
-				this.namescope.push(symbol);
-				
-				var matching = this.ts.getMatchingToken("LEFT_CURLY");
-				if (matching) matching.popNamescope = name;
-				else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + ".");
-			}
-			// foo: x
-			else if (this.ts.look(1).is("COLON")) {
-				name = (this.namescope.last().alias+"."+name).replace("#.", "#");;
-				
-				if (this.lastDoc) doc = this.lastDoc;
-				
-				symbol = new JSDOC.Symbol(name, params, "OBJECT", doc);
-				
-			
-				if (doc) JSDOC.Parser.addSymbol(symbol);
-			}
-			// foo(...)
-			else if (this.ts.look(1).is("LEFT_PAREN")) {
-				if (typeof JSDOC.PluginManager != "undefined") {
-					var functionCall = {name: name};
-				
-					var cursor = this.ts.cursor;
-					params = JSDOC.Walker.onParamList(this.ts.balance("LEFT_PAREN"));
-					this.ts.cursor = cursor;
-					
-					for (var i = 0; i < params.length; i++)
-						functionCall["arg" + (i + 1)] = params[i].name;
-				
-					JSDOC.PluginManager.run("onFunctionCall", functionCall);
-					if (functionCall.doc) {
-						this.ts.insertAhead(new JSDOC.Token(functionCall.doc, "COMM", "JSDOC"));
-					}
-				}
-			}
-			this.lastDoc = null;
-		}
-		else if (this.token.is("FUNCTION")) { // it's an anonymous function
-			if (
-				(!this.ts.look(-1).is("COLON") || !this.ts.look(-1).is("ASSIGN"))
-				&& !this.ts.look(1).is("NAME")
-			) {
-				if (this.lastDoc) doc = this.lastDoc;
-				
-				name = "$anonymous";
-				name = this.namescope.last().alias+"-"+name
-				
-				params = JSDOC.Walker.onParamList(this.ts.balance("LEFT_PAREN"));
-				
-				symbol = new JSDOC.Symbol(name, params, "FUNCTION", doc);
-				
-				JSDOC.Parser.addSymbol(symbol);
-				
-				this.namescope.push(symbol);
-				
-				var matching = this.ts.getMatchingToken("LEFT_CURLY");
-				if (matching) matching.popNamescope = name;
-				else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + ".");
-			}
-		}
-	}
-	return true;
-}
-
-/**
-	Resolves what "this." means when it appears in a name.
-	@param name The name that starts with "this.".
-	@returns The name with "this." resolved.
- */
-JSDOC.Walker.prototype.resolveThis = function(name) {
-	name.match(/^this\.(.+)$/)
-	var nameFragment = RegExp.$1;
-	if (!nameFragment) return name;
-	
-	var symbol = this.namescope.last();
-	var scopeType = symbol.scopeType || symbol.isa;
-
-	// if we are in a constructor function, `this` means the instance
-	if (scopeType == "CONSTRUCTOR") {
-		name = symbol.alias+"#"+nameFragment;
-	}
-	
-	// if we are in an anonymous constructor function, `this` means the instance
-	else if (scopeType == "INSTANCE") {
-		name = symbol.alias+"."+nameFragment;
-	}
-	
-	// if we are in a function, `this` means the container (possibly the global)
-	else if (scopeType == "FUNCTION") {
-		// in a method of a prototype, so `this` means the constructor
-		if (symbol.alias.match(/(^.*)[#.-][^#.-]+/)) {
-			var parentName = RegExp.$1;
-			var parent = JSDOC.Parser.symbols.getSymbol(parentName);
-
-			if (!parent) {
-				if (JSDOC.Lang.isBuiltin(parentName)) parent = JSDOC.Parser.addBuiltin(parentName);
-				else {
-					if (symbol.alias.indexOf("$anonymous") < 0) // these will be ignored eventually
-						LOG.warn("Trying to document "+symbol.alias+" without first documenting "+parentName+".");
-				}
-			}
-			if (parent) name = parentName+(parent.is("CONSTRUCTOR")?"#":".")+nameFragment;
-		}
-		else {
-			parent = this.namescope.last(1);
-			name = parent.alias+(parent.is("CONSTRUCTOR")?"#":".")+nameFragment;
-		}
-	}
-	// otherwise it means the global
-	else {
-		name = nameFragment;
-	}
-	
-	return name;
-}
-
-JSDOC.Walker.onParamList = function(/**Array*/paramTokens) {
-	if (!paramTokens) {
-		LOG.warn("Malformed parameter list. Can't parse code.");
-		return [];
-	}
-	var params = [];
-	for (var i = 0, l = paramTokens.length; i < l; i++) {
-		if (paramTokens[i].is("JSDOC")) {
-			var paramType = paramTokens[i].data.replace(/(^\/\*\* *| *\*\/$)/g, "");
-			
-			if (paramTokens[i+1] && paramTokens[i+1].is("NAME")) {
-				i++;
-				params.push({type: paramType, name: paramTokens[i].data});
-			}
-		}
-		else if (paramTokens[i].is("NAME")) {
-			params.push({name: paramTokens[i].data});
-		}
-	}
-	return params;
-}
--- a/sbin/res/jsdoc/app/main.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,111 +0,0 @@
-/**
- * @version $Id: main.js 818 2009-11-08 14:51:41Z micmath $
- */
-
-function main() {
-	IO.include("lib/JSDOC.js");
-	IO.includeDir("plugins/");
-	
-	// process the options
-	
-	// the -c option: options are defined in a configuration file
-	if (JSDOC.opt.c) {
-		eval("JSDOC.conf = " + IO.readFile(JSDOC.opt.c));
-		
-		LOG.inform("Using configuration file at '"+JSDOC.opt.c+"'.");
-		
-		for (var c in JSDOC.conf) {
-			if (c !== "D" && !defined(JSDOC.opt[c])) { // commandline overrules config file
-				JSDOC.opt[c] = JSDOC.conf[c];
-			}
-		}
-		
-		if (typeof JSDOC.conf["_"] != "undefined") {
-			JSDOC.opt["_"] = JSDOC.opt["_"].concat(JSDOC.conf["_"]);
-		}
-		
-		LOG.inform("With configuration: ");
-		for (var o in JSDOC.opt) {
-			LOG.inform("    "+o+": "+JSDOC.opt[o]);
-		}
-	}
-	
-	// be verbose
-	if (JSDOC.opt.v) LOG.verbose = true;
-	
-	// send log messages to a file
-	if (JSDOC.opt.o) LOG.out = IO.open(JSDOC.opt.o);
-	
-	// run the unit tests
-	if (JSDOC.opt.T) {
-		LOG.inform("JsDoc Toolkit running in test mode at "+new Date()+".");
-		IO.include("frame/Testrun.js");
-		IO.include("test.js");
-	}
-	else {
-		// a template must be defined and must be a directory path
-		if (!JSDOC.opt.t && System.getProperty("jsdoc.template.dir")) {
-			JSDOC.opt.t = System.getProperty("jsdoc.template.dir");
-		}
-		if (JSDOC.opt.t && SYS.slash != JSDOC.opt.t.slice(-1)) {
-			JSDOC.opt.t += SYS.slash;
-		}
-		
-		// verbose messages about the options we were given
-		LOG.inform("JsDoc Toolkit main() running at "+new Date()+".");
-		LOG.inform("With options: ");
-		for (var o in JSDOC.opt) {
-			LOG.inform("    "+o+": "+JSDOC.opt[o]);
-		}
-		
-		// initialize and build a symbolSet from your code
-		JSDOC.JsDoc();
-		
-		// debugger's option: dump the entire symbolSet produced from your code
-		if (JSDOC.opt.Z) {
-			LOG.warn("So you want to see the data structure, eh? This might hang if you have circular refs...");
-			IO.include("frame/Dumper.js");
-			var symbols = JSDOC.JsDoc.symbolSet.toArray();
-			for (var i = 0, l = symbols.length; i < l; i++) {
-				var symbol = symbols[i];
-				print("// symbol: " + symbol.alias);
-				print(symbol.serialize());
-			}
-		}
-		else {
-			if (typeof JSDOC.opt.t != "undefined") {
-				try {
-					// a file named "publish.js" must exist in the template directory
-					load(JSDOC.opt.t+"publish.js");
-					
-					// and must define a function named "publish"
-					if (!publish) {
-						LOG.warn("No publish() function is defined in that template so nothing to do.");
-					}
-					else {
-						// which will be called with the symbolSet produced from your code
-						publish(JSDOC.JsDoc.symbolSet);
-					}
-				}
-				catch(e) {
-					LOG.warn("Sorry, that doesn't seem to be a valid template: "+JSDOC.opt.t+"publish.js : "+e);
-				}
-			}
-			else {
-				LOG.warn("No template given. Might as well read the usage notes.");
-				JSDOC.usage();
-			}
-		}
-	}
-	
-	// notify of any warnings
-	if (!JSDOC.opt.q && LOG.warnings.length) {
-		print(LOG.warnings.length+" warning"+(LOG.warnings.length != 1? "s":"")+".");
-	}
-	
-	// stop sending log messages to a file
-	if (LOG.out) {
-		LOG.out.flush();
-		LOG.out.close();
-	}
-}
\ No newline at end of file
--- a/sbin/res/jsdoc/app/plugins/commentSrcJson.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,20 +0,0 @@
-JSDOC.PluginManager.registerPlugin(
-	"JSDOC.commentSrcJson",
-	{
-		onDocCommentSrc: function(comment) {
-			var json;
-			if (/^\s*@json\b/.test(comment)) {
-				comment.src = new String(comment.src).replace("@json", "");
-
-				eval("json = "+comment.src);
-				var tagged = "";
-				for (var i in json) {
-					var tag = json[i];
-					// todo handle cases where tag is an object
-					tagged += "@"+i+" "+tag+"\n";
-				}
-				comment.src = tagged;
-			}
-		}
-	}
-);
\ No newline at end of file
--- a/sbin/res/jsdoc/app/plugins/frameworkPrototype.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
-JSDOC.PluginManager.registerPlugin(
-	"JSDOC.frameworkPrototype",
-	{
-		onPrototypeClassCreate: function(classCreator) {
-			var desc = "";
-			if (classCreator.comment) {
-				desc = classCreator.comment;
-			}
-			var insert = desc+"/** @name "+classCreator.name+"\n@constructor\n@scope "+classCreator.name+".prototype */"
-			
-			insert = insert.replace(/\*\/\/\*\*/g, "\n");
-			/*DEBUG*///print("insert is "+insert);
-			classCreator.addComment.data = insert;
-		}
-	}
-);
--- a/sbin/res/jsdoc/app/plugins/functionCall.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,10 +0,0 @@
-JSDOC.PluginManager.registerPlugin(
-	"JSDOC.functionCall",
-	{
-		onFunctionCall: function(functionCall) {
-			if (functionCall.name == "dojo.define" && functionCall.arg1) {
-				functionCall.doc = "/** @lends "+eval(functionCall.arg1)+".prototype */";
-			}
-		}
-	}
-);
\ No newline at end of file
--- a/sbin/res/jsdoc/app/plugins/publishSrcHilite.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,62 +0,0 @@
-JSDOC.PluginManager.registerPlugin(
-	"JSDOC.publishSrcHilite",
-	{
-		onPublishSrc: function(src) {
-			if (src.path in JsHilite.cache) {
-				return; // already generated src code
-			}
-			else JsHilite.cache[src.path] = true;
-		
-			try {
-				var sourceCode = IO.readFile(src.path);
-			}
-			catch(e) {
-				print(e.message);
-				quit();
-			}
-
-			var hiliter = new JsHilite(sourceCode, src.charset);
-			src.hilited = hiliter.hilite();
-		}
-	}
-);
-
-function JsHilite(src, charset) {
-
-	var tr = new JSDOC.TokenReader();
-	
-	tr.keepComments = true;
-	tr.keepDocs = true;
-	tr.keepWhite = true;
-	
-	this.tokens = tr.tokenize(new JSDOC.TextStream(src));
-	
-	// TODO is redefining toString() the best way?
-	JSDOC.Token.prototype.toString = function() { 
-		return "<span class=\""+this.type+"\">"+this.data.replace(/</g, "&lt;")+"</span>";
-	}
-	
-	if (!charset) charset = "utf-8";
-	
-	this.header = '<html><head><meta http-equiv="content-type" content="text/html; charset='+charset+'"> '+
-	"<style>\n\
-	.KEYW {color: #933;}\n\
-	.COMM {color: #bbb; font-style: italic;}\n\
-	.NUMB {color: #393;}\n\
-	.STRN {color: #393;}\n\
-	.REGX {color: #339;}\n\
-	.line {border-right: 1px dotted #666; color: #666; font-style: normal;}\n\
-	</style></head><body><pre>";
-	this.footer = "</pre></body></html>";
-	this.showLinenumbers = true;
-}
-
-JsHilite.cache = {};
-
-JsHilite.prototype.hilite = function() {
-	var hilited = this.tokens.join("");
-	var line = 1;
-	if (this.showLinenumbers) hilited = hilited.replace(/(^|\n)/g, function(m){return m+"<span class='line'>"+((line<10)? " ":"")+((line<100)? " ":"")+(line++)+"</span> "});
-	
-	return this.header+hilited+this.footer;
-}
\ No newline at end of file
--- a/sbin/res/jsdoc/app/plugins/symbolLink.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,10 +0,0 @@
-JSDOC.PluginManager.registerPlugin(
-	"JSDOC.symbolLink",
-	{
-		onSymbolLink: function(link) {
-			// modify link.linkPath (the href part of the link)
-			// or link.linkText (the text displayed)
-			// or link.linkInner (the #name part of the link)
-		}
-	}
-);
\ No newline at end of file
--- a/sbin/res/jsdoc/app/plugins/tagParamConfig.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,31 +0,0 @@
-JSDOC.PluginManager.registerPlugin(
-	"JSDOC.tagParamConfig",
-	{
-		onDocCommentTags: function(comment) {
-			var currentParam = null;
-			var tags = comment.tags;
-			for (var i = 0, l = tags.length; i < l; i++) {
-				
-				if (tags[i].title == "param") {
-					if (tags[i].name.indexOf(".") == -1) {
-						currentParam = i;
-					}
-				}
-				else if (tags[i].title == "config") {
-					tags[i].title = "param";
-					if (currentParam == null) {
-						tags[i].name = "arguments"+"."+tags[i].name;
-					}
-					else if (tags[i].name.indexOf(tags[currentParam].name+".") != 0) {
-						tags[i].name = tags[currentParam].name+"."+tags[i].name;
-					}
-					currentParam != null
-					//tags[currentParam].properties.push(tags[i]);
-				}
-				else {
-					currentParam = null;
-				}
-			}
-		}
-	}
-);
--- a/sbin/res/jsdoc/app/plugins/tagSynonyms.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,43 +0,0 @@
-JSDOC.PluginManager.registerPlugin(
-	"JSDOC.tagSynonyms",
-	{
-		onDocCommentSrc: function(comment) {
-			comment.src = comment.src.replace(/@methodOf\b/i, "@function\n@memberOf");
-			comment.src = comment.src.replace(/@fieldOf\b/i, "@field\n@memberOf");
-		},
-		
-		onDocCommentTags: function(comment) {
-			for (var i = 0, l = comment.tags.length; i < l; i++) {
-				var title = comment.tags[i].title.toLowerCase();
-				var syn;
-				if ((syn = JSDOC.tagSynonyms.synonyms["="+title])) {
-					comment.tags[i].title = syn;
-				}
-			}
-		}
-	}
-);
-
-new Namespace(
-	"JSDOC.tagSynonyms",
-	function() {
-		JSDOC.tagSynonyms.synonyms = {
-			"=member":             "memberOf",
-			"=memberof":           "memberOf",
-			"=description":        "desc",
-			"=exception":          "throws",
-			"=argument":           "param",
-			"=returns":            "return",
-			"=classdescription":   "class",
-			"=fileoverview":       "overview",
-			"=extends":            "augments",
-			"=base":               "augments",
-			"=projectdescription": "overview",
-			"=classdescription":   "class",
-			"=link":               "see",
-			"=borrows":            "inherits",
-			"=scope":              "lends",
-			"=construct":          "constructor"
-		}
-	}
-);
\ No newline at end of file
--- a/sbin/res/jsdoc/app/run.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,348 +0,0 @@
-/**
- * @fileOverview
- * A bootstrap script that creates some basic required objects
- * for loading other scripts.
- * @author Michael Mathews, micmath@gmail.com
- * @version $Id: run.js 756 2009-01-07 21:32:58Z micmath $
- */
-
-/**
- * @namespace Keep track of any messages from the running script.
- */
-LOG = {
-	warn: function(msg, e) {
-		if (JSDOC.opt.q) return;
-		if (e) msg = e.fileName+", line "+e.lineNumber+": "+msg;
-		
-		msg = ">> WARNING: "+msg;
-		LOG.warnings.push(msg);
-		if (LOG.out) LOG.out.write(msg+"\n");
-		else print(msg);
-	},
-
-	inform: function(msg) {
-		if (JSDOC.opt.q) return;
-		msg = " > "+msg;
-		if (LOG.out) LOG.out.write(msg+"\n");
-		else if (typeof LOG.verbose != "undefined" && LOG.verbose) print(msg);
-	}
-};
-LOG.warnings = [];
-LOG.verbose = false
-LOG.out = undefined;
-
-/**
- *	@class Manipulate a filepath.
- */
-function FilePath(absPath, separator) {
-	this.slash =  separator || "/"; 
-	this.root = this.slash;
-	this.path = [];
-	this.file = "";
-	
-	var parts = absPath.split(/[\\\/]/);
-	if (parts) {
-		if (parts.length) this.root = parts.shift() + this.slash;
-		if (parts.length) this.file =  parts.pop()
-		if (parts.length) this.path = parts;
-	}
-	
-	this.path = this.resolvePath();
-}
-
-/** Collapse any dot-dot or dot items in a filepath. */
-FilePath.prototype.resolvePath = function() {
-	var resolvedPath = [];
-	for (var i = 0; i < this.path.length; i++) {
-		if (this.path[i] == "..") resolvedPath.pop();
-		else if (this.path[i] != ".") resolvedPath.push(this.path[i]);
-	}
-	return resolvedPath;
-}
-
-/** Trim off the filename. */
-FilePath.prototype.toDir = function() {
-	if (this.file) this.file = "";
-	return this;
-}
-
-/** Go up a directory. */
-FilePath.prototype.upDir = function() {
-	this.toDir();
-	if (this.path.length) this.path.pop();
-	return this;
-}
-
-FilePath.prototype.toString = function() {
-	return this.root
-		+ this.path.join(this.slash)
-		+ ((this.path.length > 0)? this.slash : "")
-		+ this.file;
-}
-
-/**
- * Turn a path into just the name of the file.
- */
-FilePath.fileName = function(path) {
-	var nameStart = Math.max(path.lastIndexOf("/")+1, path.lastIndexOf("\\")+1, 0);
-	return path.substring(nameStart);
-}
-
-/**
- * Get the extension of a filename
- */
-FilePath.fileExtension = function(filename) {
-   return filename.split(".").pop().toLowerCase();
-};
-
-/**
- * Turn a path into just the directory part.
- */
-FilePath.dir = function(path) {
-	var nameStart = Math.max(path.lastIndexOf("/")+1, path.lastIndexOf("\\")+1, 0);
-	return path.substring(0, nameStart-1);
-}
-
-
-importClass(java.lang.System);
-
-/**
- * @namespace A collection of information about your system.
- */
-SYS = {
-	/**
-	 * Information about your operating system: arch, name, version.
-	 * @type string
-	 */
-	os: [
-		new String(System.getProperty("os.arch")),
-		new String(System.getProperty("os.name")),
-		new String(System.getProperty("os.version"))
-	].join(", "),
-	
-	/**
-	 * Which way does your slash lean.
-	 * @type string
-	 */
-	slash: System.getProperty("file.separator")||"/",
-	
-	/**
-	 * The path to the working directory where you ran java.
-	 * @type string
-	 */
-	userDir: new String(System.getProperty("user.dir")),
-	
-	/**
-	 * Where is Java's home folder.
-	 * @type string
-	 */
-	javaHome: new String(System.getProperty("java.home")),
-	
-	/**
-	 * The absolute path to the directory containing this script.
-	 * @type string
-	 */
-	pwd: undefined
-};
-
-// jsrun appends an argument, with the path to here.
-if (arguments[arguments.length-1].match(/^-j=(.+)/)) {
-	if (RegExp.$1.charAt(0) == SYS.slash || RegExp.$1.charAt(1) == ":") { // absolute path to here
-		SYS.pwd = new FilePath(RegExp.$1).toDir().toString();
-	}
-	else { // relative path to here
-		SYS.pwd = new FilePath(SYS.userDir + SYS.slash + RegExp.$1).toDir().toString();
-	}
-	arguments.pop();
-}
-else {
-	print("The run.js script requires you use jsrun.jar.");
-	quit();
-}
-
-// shortcut
-var File = Packages.java.io.File;
-
-/**
- * @namespace A collection of functions that deal with reading a writing to disk.
- */
-IO = {
-
-	/**
-	 * Create a new file in the given directory, with the given name and contents.
-	 */
-	saveFile: function(/**string*/ outDir, /**string*/ fileName, /**string*/ content) {
-		var out = new Packages.java.io.PrintWriter(
-			new Packages.java.io.OutputStreamWriter(
-				new Packages.java.io.FileOutputStream(outDir+SYS.slash+fileName),
-				IO.encoding
-			)
-		);
-		out.write(content);
-		out.flush();
-		out.close();
-	},
-	
-	/**
-	 * @type string
-	 */
-	readFile: function(/**string*/ path) {
-		if (!IO.exists(path)) {
-			throw "File doesn't exist there: "+path;
-		}
-		return readFile(path, IO.encoding);
-	},
-
-	/**
-	 * @param inFile 
-	 * @param outDir
-	 * @param [fileName=The original filename]
-	 */
-	copyFile: function(/**string*/ inFile, /**string*/ outDir, /**string*/ fileName) {
-		if (fileName == null) fileName = FilePath.fileName(inFile);
-	
-		var inFile = new File(inFile);
-		var outFile = new File(outDir+SYS.slash+fileName);
-		
-		var bis = new Packages.java.io.BufferedInputStream(new Packages.java.io.FileInputStream(inFile), 4096);
-		var bos = new Packages.java.io.BufferedOutputStream(new Packages.java.io.FileOutputStream(outFile), 4096);
-		var theChar;
-		while ((theChar = bis.read()) != -1) {
-			bos.write(theChar);
-		}
-		bos.close();
-		bis.close();
-	},
-
-	/**
-	 * Creates a series of nested directories.
-	 */
-	mkPath: function(/**Array*/ path) {
-		if (path.constructor != Array) path = path.split(/[\\\/]/);
-		var make = "";
-		for (var i = 0, l = path.length; i < l; i++) {
-			make += path[i] + SYS.slash;
-			if (! IO.exists(make)) {
-				IO.makeDir(make);
-			}
-		}
-	},
-	
-	/**
-	 * Creates a directory at the given path.
-	 */
-	makeDir: function(/**string*/ path) {
-		(new File(path)).mkdir();
-	},
-
-	/**
-	 * @type string[]
-	 * @param dir The starting directory to look in.
-	 * @param [recurse=1] How many levels deep to scan.
-	 * @returns An array of all the paths to files in the given dir.
-	 */
-	ls: function(/**string*/ dir, /**number*/ recurse, _allFiles, _path) {
-		if (_path === undefined) { // initially
-			var _allFiles = [];
-			var _path = [dir];
-		}
-		if (_path.length == 0) return _allFiles;
-		if (recurse === undefined) recurse = 1;
-		
-		dir = new File(dir);
-		if (!dir.directory) return [String(dir)];
-		var files = dir.list();
-		
-		for (var f = 0; f < files.length; f++) {
-			var file = String(files[f]);
-			if (file.match(/^\.[^\.\/\\]/)) continue; // skip dot files
-	
-			if ((new File(_path.join(SYS.slash)+SYS.slash+file)).list()) { // it's a directory
-				_path.push(file);
-				if (_path.length-1 < recurse) IO.ls(_path.join(SYS.slash), recurse, _allFiles, _path);
-				_path.pop();
-			}
-			else {
-				_allFiles.push((_path.join(SYS.slash)+SYS.slash+file).replace(SYS.slash+SYS.slash, SYS.slash));
-			}
-		}
-	
-		return _allFiles;
-	},
-
-	/**
-	 * @type boolean
-	 */
-	exists: function(/**string*/ path) {
-		file = new File(path);
-	
-		if (file.isDirectory()){
-			return true;
-		}
-		if (!file.exists()){
-			return false;
-		}
-		if (!file.canRead()){
-			return false;
-		}
-		return true;
-	},
-
-	/**
-	 * 
-	 */
-	open: function(/**string*/ path, /**string*/ append) {
-		var append = true;
-		var outFile = new File(path);
-		var out = new Packages.java.io.PrintWriter(
-			new Packages.java.io.OutputStreamWriter(
-				new Packages.java.io.FileOutputStream(outFile, append),
-				IO.encoding
-			)
-		);
-		return out;
-	},
-
-	/**
-	 * Sets {@link IO.encoding}.
-	 * Encoding is used when reading and writing text to files,
-	 * and in the meta tags of HTML output.
-	 */
-	setEncoding: function(/**string*/ encoding) {
-		if (/ISO-8859-([0-9]+)/i.test(encoding)) {
-			IO.encoding = "ISO8859_"+RegExp.$1;
-		}
-		else {
-			IO.encoding = encoding;
-		}
-	},
-
-	/**
-	 * @default "utf-8"
-	 * @private
-	 */
-	encoding: "utf-8",
-	
-	/**
-	 * Load the given script.
-	 */
-	include: function(relativePath) {
-		load(SYS.pwd+relativePath);
-	},
-	
-	/**
-	 * Loads all scripts from the given directory path.
-	 */
-	includeDir: function(path) {
-		if (!path) return;
-		
-		for (var lib = IO.ls(SYS.pwd+path), i = 0; i < lib.length; i++) 
-			if (/\.js$/i.test(lib[i])) load(lib[i]);
-	}
-}
-
-// now run the application
-IO.include("frame.js");
-IO.include("main.js");
-
-main();
--- a/sbin/res/jsdoc/app/t/TestDoc.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,144 +0,0 @@
-var TestDoc = {
-	fails: 0,
-	plans: 0,
-	passes: 0,
-	results: []
-};
-
-TestDoc.record = function(result) {
-	TestDoc.results.push(result);
-	if (typeof result.verdict == "boolean") {
-		if (result.verdict === false) TestDoc.fails++;
-		if (result.verdict === true) TestDoc.passes++;
-	}
-}
-
-TestDoc.prove = function(filePath) {
-	if (typeof document != "undefined" && typeof document.write != "undefined") {
-		if (TestDoc.console) print = function(s) { TestDoc.console.appendChild(document.createTextNode(s+"\n")); }
-		else print = function(s) { document.write(s+"<br />"); }
-	}
-	TestDoc.run(TestDoc.readFile(filePath));
-}
-
-TestDoc.run = function(src) {
-	try { eval(src); } catch(e) { print("# ERROR! "+e); }
-	
-	var chunks = src.split(/\/\*t:/);
-	
-	var run = function(chunk) {
-		// local shortcuts
-		var is = TestDoc.assertEquals;
-		var isnt = TestDoc.assertNotEquals;
-		var plan = TestDoc.plan;
-		var requires = TestDoc.requires;
-		
-		try { eval(chunk); } catch(e) { print("# ERROR! "+e); }
-	}
-	for (var start = -1, end = 0; (start = src.indexOf("/*t:", end)) > end; start = end) {
-		run(
-			src.substring(
-				start+4,
-				(end = src.indexOf("*/", start))
-			)
-		);
-	}
-}
-
-TestDoc.Result = function(verdict, message) {
-	this.verdict = verdict;
-	this.message = message;
-}
-
-TestDoc.Result.prototype.toString = function() {
-	if (typeof this.verdict == "boolean") {
-		return (this.verdict? "ok" : "not ok") + " " + (++TestDoc.report.counter) + " - " + this.message;
-	}
-	
-	return "# " + this.message;
-}
-
-TestDoc.requires = function(file) {
-	if (!TestDoc.requires.loaded[file]) {
-		load(file);
-		TestDoc.requires.loaded[file] = true;
-	}
-}
-TestDoc.requires.loaded = {};
-
-TestDoc.report = function() {
-	TestDoc.report.counter = 0;
-	print("1.."+TestDoc.plans);
-	for (var i = 0; i < TestDoc.results.length; i++) {
-		print(TestDoc.results[i]);
-	}
-	print("----------------------------------------");
-	if (TestDoc.fails == 0 && TestDoc.passes == TestDoc.plans) {
-		print("All tests successful.");
-	}
-	else {
-		print("Failed " + TestDoc.fails + "/" + TestDoc.plans + " tests, "+((TestDoc.plans == 0)? 0 : Math.round(TestDoc.passes/(TestDoc.passes+TestDoc.fails)*10000)/100)+"% okay. Planned to run "+TestDoc.plans+", did run "+(TestDoc.passes+TestDoc.fails)+".")
-	}
-}
-
-TestDoc.plan = function(n, message) {
-	TestDoc.plans += n;
-	TestDoc.record(new TestDoc.Result(null, message+" ("+n+" tests)"));
-}
-
-TestDoc.assertEquals = function(a, b, message) {
-	var result = (a == b);
-	if (!result) message += "\n#\n# " + a + " does not equal " + b + "\n#";
-	TestDoc.record(new TestDoc.Result(result, message));
-}
-
-TestDoc.assertNotEquals = function(a, b, message) {
-	var result = (a != b);
-	if (!result) message += "\n#\n# " + a + " equals " + b + "\n#";
-	TestDoc.record(new TestDoc.Result(result, message));
-}
-
-TestDoc.readFile = (function(){
-	// rhino
-	if (typeof readFile == "function") {
-		return function(url) {
-			var text = readFile(url);
-			return text || "";
-		}
-	}
-
-	// a web browser
-	else {
-		return function(url) {
-			var httpRequest;
-		
-			if (window.XMLHttpRequest) { // Mozilla, Safari, etc
-				httpRequest = new XMLHttpRequest();
-			} 
-			else if (window.ActiveXObject) { // IE
-				try {
-					httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
-				} 
-				catch (e) {
-				   try {
-						httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
-					} 
-					catch (e) {
-					}
-				}
-			}
-		
-			if (!httpRequest) { throw "Cannot create HTTP Request."; }
-			
-			httpRequest.open('GET', url, false);
-			httpRequest.send('');
-			if (httpRequest.readyState == 4) {
-				if (httpRequest.status >= 400) {
-					throw "The HTTP Request returned an error code: "+httpRequest.status;
-				}
-			}
-			
-			return httpRequest.responseText || "";
-		}
-	}
-})();
--- a/sbin/res/jsdoc/app/t/runner.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-// try: java -jar ../../jsrun.jar runner.js
-
-load("TestDoc.js");
-
-TestDoc.prove("../frame/Opt.js");
-TestDoc.prove("../lib/JSDOC.js");
-TestDoc.prove("../frame/String.js");
-TestDoc.prove("../lib/JSDOC/DocTag.js");
-TestDoc.prove("../lib/JSDOC/DocComment.js");
-TestDoc.prove("../lib/JSDOC/TokenReader.js");
-TestDoc.prove("../lib/JSDOC/Symbol.js");
-
-TestDoc.report();
--- a/sbin/res/jsdoc/app/test.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,342 +0,0 @@
-load("app/frame/Dumper.js");
-function symbolize(opt) {
-	symbols = null;
-	JSDOC.JsDoc(opt);
-	symbols = JSDOC.JsDoc.symbolSet;
-}
-
-var testCases = [
-	function() {
-		symbolize({a:true, p:true, _: [SYS.pwd+"test/overview.js"]});
-		//print(Dumper.dump(symbols));	
-		is('symbols.getSymbolByName("My Cool Library").name', 'My Cool Library', 'File overview can be found by alias.');		
-	}
-	,
-	function() {
-		symbolize({_: [SYS.pwd+"test/name.js"]});
-
-		is('symbols.getSymbol("Response").name', "Response", 'Virtual class name is found.');
-		is('symbols.getSymbol("Response#text").alias', "Response#text", 'Virtual method name is found.');
-		is('symbols.getSymbol("Response#text").memberOf', "Response", 'Virtual method parent name is found.');
-	}
-	,
-	function() {
-		symbolize({a:true, p:true, _: [SYS.pwd+"test/prototype.js"]});
-
-		is('symbols.getSymbol("Article").name', "Article", 'Function set to constructor prototype with inner constructor name is found.');
-		is('symbols.getSymbol("Article").hasMethod("init")', true, 'The initializer method name of prototype function is correct.');
-		is('symbols.getSymbol("Article").hasMember("counter")', true, 'A static property set in the prototype definition is found.');
-		is('symbols.getSymbol("Article").hasMember("title")', true, 'An instance property set in the prototype is found.');
-		is('symbols.getSymbol("Article#title").isStatic', false, 'An instance property has isStatic set to false.');
-		is('symbols.getSymbol("Article.counter").name', "counter", 'A static property set in the initializer has the name set correctly.');
-		is('symbols.getSymbol("Article.counter").memberOf', "Article", 'A static property set in the initializer has the memberOf set correctly.');
-		is('symbols.getSymbol("Article.counter").isStatic', true, 'A static property set in the initializer has isStatic set to true.');
-	}
-	,
-	function() {
-		symbolize({a:true, _: [SYS.pwd+"test/prototype_oblit.js"]});
-		
-		is('symbols.getSymbol("Article").name', "Article", 'Oblit set to constructor prototype name is found.');
-		is('typeof symbols.getSymbol("Article.prototype")', "undefined", 'The prototype oblit is not a symbol.');
-		is('symbols.getSymbol("Article#getTitle").name', "getTitle", 'The nonstatic method name of prototype oblit is correct.');
-		is('symbols.getSymbol("Article#getTitle").alias', "Article#getTitle", 'The alias of non-static method of prototype oblit is correct.');
-		is('symbols.getSymbol("Article#getTitle").isStatic', false, 'The isStatic of a nonstatic method of prototype oblit is correct.');
-		is('symbols.getSymbol("Article.getTitle").name', "getTitle", 'The static method name of prototype oblit is correct.');
-		is('symbols.getSymbol("Article.getTitle").isStatic', true, 'The isStatic of a static method of prototype oblit is correct.');
-		is('symbols.getSymbol("Article#getTitle").isa', "FUNCTION", 'The isa of non-static method of prototype oblit is correct.');
-		is('symbols.getSymbol("Article.getTitle").alias', "Article.getTitle", 'The alias of a static method of prototype oblit is correct.');
-		is('symbols.getSymbol("Article.getTitle").isa', "FUNCTION", 'The isa of static method of prototype oblit is correct.');
-	}
-	,
-	function() {
-		symbolize({a:true, p:true, _: [SYS.pwd+"test/prototype_oblit_constructor.js"]});
-		
-		is('symbols.getSymbol("Article").name', "Article", 'Oblit set to constructor prototype with inner constructor name is found.');
-		is('symbols.getSymbol("Article#init").name', "init", 'The initializer method name of prototype oblit is correct.');
-		is('symbols.getSymbol("Article").hasMember("pages")', true, 'Property set by initializer method "this" is on the outer constructor.');
-		is('symbols.getSymbol("Article#Title").name', "Title", 'Name of the inner constructor name is found.');
-		is('symbols.getSymbol("Article#Title").memberOf', "Article", 'The memberOf of the inner constructor name is found.');
-		is('symbols.getSymbol("Article#Title").isa', "CONSTRUCTOR", 'The isa of the inner constructor name is constructor.');
-		is('symbols.getSymbol("Article#Title").hasMember("title")', true, 'A property set on the inner constructor "this"  is on the inner constructor.');
-	}
-	,
-	function() {
-		symbolize({a:true, p:true, _: [SYS.pwd+"test/inner.js"]});
-		
-		is('symbols.getSymbol("Outer").name', "Outer", 'Outer constructor prototype name is found.');
-		is('symbols.getSymbol("Outer").methods.length', 1, 'Inner function doesnt appear as a method of the outer.');
-		is('symbols.getSymbol("Outer").hasMethod("open")', true, 'Outer constructors methods arent affected by inner function.');
-		is('symbols.getSymbol("Outer-Inner").alias', "Outer-Inner", 'Alias of inner function is found.');
-		is('symbols.getSymbol("Outer-Inner").isa', "CONSTRUCTOR", 'isa of inner function constructor is found.');
-		is('symbols.getSymbol("Outer-Inner").memberOf', "Outer", 'The memberOf of inner function is found.');
-		is('symbols.getSymbol("Outer-Inner").name', "Inner", 'The name of inner function is found.');
-		is('symbols.getSymbol("Outer-Inner#name").name', "name", 'A member of the inner function constructor, attached to "this" is found on inner.');
-		is('symbols.getSymbol("Outer-Inner#name").memberOf', "Outer-Inner", 'The memberOf of an inner function member is found.');		
-	}
-	,
-	function() {
-		symbolize({a:true, _: [SYS.pwd+"test/prototype_nested.js"]});
-		
-		is('symbols.getSymbol("Word").name', "Word", 'Base constructor name is found.');
-		is('symbols.getSymbol("Word").hasMethod("reverse")', true, 'Base constructor method is found.');
-		is('symbols.getSymbol("Word").methods.length', 1, 'Base constructor has only one method.');
-		is('symbols.getSymbol("Word").memberOf', "", 'Base constructor memberOf is empty.');
-		is('symbols.getSymbol("Word#reverse").name', "reverse", 'Member of constructor prototype name is found.');
-		is('symbols.getSymbol("Word#reverse").memberOf', "Word", 'Member of constructor prototype memberOf is found.');
-		is('symbols.getSymbol("Word#reverse.utf8").name', "utf8", 'Member of constructor prototype method name is found.');
-		is('symbols.getSymbol("Word#reverse.utf8").memberOf', "Word#reverse", 'Static nested member memberOf is found.');
-	}
-	,
-	function() {
-		symbolize({a:true, _: [SYS.pwd+"test/namespace_nested.js"]});
-		
-		is('symbols.getSymbol("ns1").name', "ns1", 'Base namespace name is found.');
-		is('symbols.getSymbol("ns1").memberOf', "", 'Base namespace memberOf is empty (its a constructor).');
-		is('symbols.getSymbol("ns1.ns2").name', "ns2", 'Nested namespace name is found.');
- 		is('symbols.getSymbol("ns1.ns2").alias', "ns1.ns2", 'Nested namespace alias is found.');
- 		is('symbols.getSymbol("ns1.ns2").memberOf', "ns1", 'Nested namespace memberOf is found.');
- 		is('symbols.getSymbol("ns1.ns2.Function1").name', "Function1", 'Method of nested namespace name is found.');
- 		is('symbols.getSymbol("ns1.ns2.Function1").memberOf', "ns1.ns2", 'Constructor of nested namespace memberOf is found.');			
-	}
-	,
-	function() {
-		symbolize({a:true, p:true, _: [SYS.pwd+"test/functions_nested.js"]});
-		
-		is('symbols.getSymbol("Zop").name', "Zop", 'Any constructor name is found.');
-		is('symbols.getSymbol("Zop").isa', "CONSTRUCTOR", 'It isa constructor.');
-		is('symbols.getSymbol("Zop").hasMethod("zap")', true, 'Its method name, set later, is in methods array.');
-		is('symbols.getSymbol("Foo").name', "Foo", 'The containing constructor name is found.');
-		is('symbols.getSymbol("Foo").hasMethod("methodOne")', true, 'Its method name is found.');
-		is('symbols.getSymbol("Foo").hasMethod("methodTwo")', true, 'Its second method name is found.');
-		is('symbols.getSymbol("Foo#methodOne").alias', "Foo#methodOne", 'A methods alias is found.');
-		is('symbols.getSymbol("Foo#methodOne").isStatic', false, 'A methods is not static.');
-		is('symbols.getSymbol("Bar").name', "Bar", 'A global function declared inside another function is found.');
-		is('symbols.getSymbol("Bar").isa', "FUNCTION", 'It isa function.');
-		is('symbols.getSymbol("Bar").memberOf', "_global_", 'It is global.');
-		is('symbols.getSymbol("Foo-inner").name', "inner", 'An inner functions name is found.');
-		is('symbols.getSymbol("Foo-inner").memberOf', "Foo", 'It is member of the outer function.');
-		is('symbols.getSymbol("Foo-inner").isInner', true, 'It is an inner function.');
-	}
-	,
-	function() {
-		symbolize({a:true, _: [SYS.pwd+"test/memberof_constructor.js"]});
-		
-		is('symbols.getSymbol("Circle#Tangent").name', "Tangent", 'Constructor set on prototype using @member has correct name.');
- 		is('symbols.getSymbol("Circle#Tangent").memberOf', "Circle", 'Constructor set on prototype using @member has correct memberOf.');
- 		is('symbols.getSymbol("Circle#Tangent").alias', "Circle#Tangent", 'Constructor set on prototype using @member has correct alias.');
- 		is('symbols.getSymbol("Circle#Tangent").isa', "CONSTRUCTOR", 'Constructor set on prototype using @member has correct isa.');
-		is('symbols.getSymbol("Circle#Tangent").isStatic', false, 'Constructor set on prototype using @member is not static.');
-		is('symbols.getSymbol("Circle#Tangent#getDiameter").name', "getDiameter", 'Method set on prototype using @member has correct name.');
-		is('symbols.getSymbol("Circle#Tangent#getDiameter").memberOf', "Circle#Tangent", 'Method set on prototype using @member has correct memberOf.');
-		is('symbols.getSymbol("Circle#Tangent#getDiameter").alias', "Circle#Tangent#getDiameter", 'Method set on prototype using @member has correct alias.');
-		is('symbols.getSymbol("Circle#Tangent#getDiameter").isa', "FUNCTION", 'Method set on prototype using @member has correct isa.');
-		is('symbols.getSymbol("Circle#Tangent#getDiameter").isStatic', false, 'Method set on prototype using @member is not static.');
-	}
-	,
-	function() {
-		symbolize({a:true, p: true,  _: [SYS.pwd+"test/memberof.js"]});
-		
-		is('symbols.getSymbol("pack.install").alias', "pack.install", 'Using @memberOf sets alias, when parent name is in memberOf tag.');
-		is('symbols.getSymbol("pack.install.overwrite").name', "install.overwrite", 'Using @memberOf sets name, even if the name is dotted.');
-		is('symbols.getSymbol("pack.install.overwrite").memberOf', "pack", 'Using @memberOf sets memberOf.');
- 		is('symbols.getSymbol("pack.install.overwrite").isStatic', true, 'Using @memberOf with value not ending in octothorp sets isStatic to true.');
-	}
-	,
-	function() {
-		symbolize({a:true, p: true,  _: [SYS.pwd+"test/memberof2.js"]});
-		
-		is('symbols.getSymbol("Foo#bar").alias', "Foo#bar", 'An inner function can be documented as an instance method.');
-		is('symbols.getSymbol("Foo.zip").alias', "Foo.zip", 'An inner function can be documented as a static method.');
-		is('symbols.getSymbol("Foo.Fiz").alias', "Foo.Fiz", 'An inner function can be documented as a static constructor.');
-		is('symbols.getSymbol("Foo.Fiz#fipple").alias', "Foo.Fiz#fipple", 'An inner function can be documented as a static constructor with a method.');
-		is('symbols.getSymbol("Foo#blat").alias', "Foo#blat", 'An global function can be documented as an instance method.');
-	}
-	,
-	function() {
-		symbolize({a:true, p: true,  _: [SYS.pwd+"test/memberof3.js"]});
-		
-		is('symbols.getSymbol("Foo#bar").alias', "Foo#bar", 'A virtual field can be documented as an instance method.');
-		is('symbols.getSymbol("Foo2#bar").alias', "Foo2#bar", 'A virtual field with the same name can be documented as an instance method.');
-	}
-	,
-	function() {
-		symbolize({a:true, p:true, _: [SYS.pwd+"test/borrows.js"]});
-
-		is('symbols.getSymbol("Layout").name', "Layout", 'Constructor can be found.');
-		is('symbols.getSymbol("Layout").hasMethod("init")', true, 'Constructor method name can be found.');
-		is('symbols.getSymbol("Layout").hasMember("orientation")', true, 'Constructor property name can be found.');
-		
-		is('symbols.getSymbol("Page").hasMethod("reset")', true, 'Second constructor method name can be found.');
-		is('symbols.getSymbol("Page").hasMember("orientation")', true, 'Second constructor borrowed property name can be found in properties.');
-		is('symbols.getSymbol("Page#orientation").memberOf', "Page", 'Second constructor borrowed property memberOf can be found.');
-		is('symbols.getSymbol("Page-getInnerElements").alias', "Page-getInnerElements", 'Can borrow an inner function and it is still inner.');
-		is('symbols.getSymbol("Page.units").alias', "Page.units", 'Can borrow a static function and it is still static.');
-		
-		is('symbols.getSymbol("ThreeColumnPage#init").alias', "ThreeColumnPage#init", 'Third constructor method can be found even though method with same name is borrowed.');
-		is('symbols.getSymbol("ThreeColumnPage#reset").alias', "ThreeColumnPage#reset", 'Borrowed method can be found.');
-		is('symbols.getSymbol("ThreeColumnPage#orientation").alias', "ThreeColumnPage#orientation", 'Twice borrowed method can be found.');
-	
-	}
-	,
-	function() {
-		symbolize({a:true, p:true, _: [SYS.pwd+"test/borrows2.js"]});
-
-		is('symbols.getSymbol("Foo").hasMethod("my_zop")', true, 'Borrowed method can be found.');		
-		is('symbols.getSymbol("Bar").hasMethod("my_zip")', true, 'Second borrowed method can be found.');
-	}
-	,
-	function() {
-		symbolize({a:true, p:true, _: [SYS.pwd+"test/constructs.js"]});
-
-		is('symbols.getSymbol("Person").hasMethod("say")', true, 'The constructs tag creates a class that lends can add a method to.');		
-	}
-	,
-	function() {
-		symbolize({a: true, _: [SYS.pwd+"test/augments.js", SYS.pwd+"test/augments2.js"]});
-		
-		is('symbols.getSymbol("Page").augments[0]', "Layout", 'An augmented class can be found.');
-		is('symbols.getSymbol("Page#reset").alias', "Page#reset", 'Method of augmenter can be found.');
-		is('symbols.getSymbol("Page").hasMethod("Layout#init")', true, 'Method from augmented can be found.');
-		is('symbols.getSymbol("Page").hasMember("Layout#orientation")', true, 'Property from augmented can be found.');
-		is('symbols.getSymbol("Page").methods.length', 3, 'Methods of augmented class are included in methods array.');
-	
-		is('symbols.getSymbol("ThreeColumnPage").augments[0]', "Page", 'The extends tag is a synonym for augments.');
-		is('symbols.getSymbol("ThreeColumnPage").hasMethod("ThreeColumnPage#init")', true, 'Local method overrides augmented method of same name.');
-		is('symbols.getSymbol("ThreeColumnPage").methods.length', 3, 'Local method count is right.');
-		
-		is('symbols.getSymbol("NewsletterPage").augments[0]', "ThreeColumnPage", 'Can augment across file boundaries.');
-		is('symbols.getSymbol("NewsletterPage").augments.length', 2, 'Multiple augments are supported.');
-		is('symbols.getSymbol("NewsletterPage").inherits[0].alias', "Junkmail#annoy", 'Inherited method with augments.');
-		is('symbols.getSymbol("NewsletterPage").methods.length', 6, 'Methods of augmented class are included in methods array across files.');
-		is('symbols.getSymbol("NewsletterPage").properties.length', 1, 'Properties of augmented class are included in properties array across files.');
-	}
-	,
-	function() {
-		symbolize({a:true, _: [SYS.pwd+"test/static_this.js"]});
-		
-		is('symbols.getSymbol("box.holder").name', "holder", 'Static namespace name can be found.');
-		is('symbols.getSymbol("box.holder.foo").name', "foo", 'Static namespace method name can be found.');
-		is('symbols.getSymbol("box.holder").isStatic', true, 'Static namespace method is static.');
-		
-		is('symbols.getSymbol("box.holder.counter").name', "counter", 'Instance namespace property name set on "this" can be found.');
-		is('symbols.getSymbol("box.holder.counter").alias', "box.holder.counter", 'Instance namespace property alias set on "this" can be found.');
-		is('symbols.getSymbol("box.holder.counter").memberOf', "box.holder", 'Static namespace property memberOf set on "this" can be found.');
-	}
-	,
-	function() {
-		symbolize({a:true, p: true, _: [SYS.pwd+"test/lend.js"]});
-
-		is('symbols.getSymbol("Person").name', "Person", 'Class defined in lend comment is found.');
-		is('symbols.getSymbol("Person").hasMethod("initialize")', true, 'Lent instance method name can be found.');
-		is('symbols.getSymbol("Person").hasMethod("say")', true, 'Second instance method can be found.');
-		is('symbols.getSymbol("Person#sing").isStatic', false, 'Instance method is known to be not static.');
-		
-		is('symbols.getSymbol("Person.getCount").name', "getCount", 'Static method name from second lend comment can be found.');
-		is('symbols.getSymbol("Person.getCount").isStatic', true, 'Static method from second lend comment is known to be static.');
-	
-		is('LOG.warnings.filter(function($){if($.indexOf("notok") > -1) return $}).length', 1, 'A warning is emitted when lending to an undocumented parent.');
-	}
-	,
-	function() {
-		symbolize({a:true, _: [SYS.pwd+"test/param_inline.js"]});
-	
-		is('symbols.getSymbol("Layout").params[0].type', "int", 'Inline param name is set.');
-		is('symbols.getSymbol("Layout").params[0].desc', "The number of columns.", 'Inline param desc is set from comment.');
-		is('symbols.getSymbol("Layout#getElement").params[0].name', "id", 'User defined param documentation takes precedence over parser defined.');
-		is('symbols.getSymbol("Layout#getElement").params[0].isOptional', true, 'Default for param is to not be optional.');
-		is('symbols.getSymbol("Layout#getElement").params[1].isOptional', false, 'Can mark a param as being optional.');
-		is('symbols.getSymbol("Layout#getElement").params[1].type', "number|string", 'Type of inline param doc can have multiple values.');
-		is('symbols.getSymbol("Layout#Canvas").params[0].type', "", 'Type can be not defined for some params.');
-		is('symbols.getSymbol("Layout#Canvas").params[2].type', "int", 'Type can be defined inline for only some params.');
-		is('symbols.getSymbol("Layout#rotate").params.length', 0, 'Docomments inside function sig is ignored without a param.');
-		is('symbols.getSymbol("Layout#init").params[2].type', "zoppler", 'Doc comment type overrides inline type for param with same name.');
-	}
-	,
-	function() {
-		symbolize({a: true, _: [SYS.pwd+"test/shared.js", SYS.pwd+"test/shared2.js"]});
-
-		is('symbols.getSymbol("Array#some").name', 'some', 'The name of a symbol in a shared section is found.');
-		is('symbols.getSymbol("Array#some").alias', 'Array#some', 'The alias of a symbol in a shared section is found.');
-		is('symbols.getSymbol("Array#some").desc', "Extension to builtin array.", 'A description can be shared.');
-		is('symbols.getSymbol("Array#filter").desc', "Extension to builtin array.\nChange every element of an array.", 'A shared description is appended.');
-		is('symbols.getSymbol("Queue").desc', "A first in, first out data structure.", 'A description is not shared when outside a shared section.');
-		is('symbols.getSymbol("Queue.rewind").alias', "Queue.rewind", 'Second shared tag can be started.');
-		is('symbols.getSymbol("startOver").alias', "startOver", 'Shared tag doesnt cross over files.');
-	}
-	,
-	function() {
-		symbolize({a: true, _: [SYS.pwd+"test/config.js"]});
-		is('symbols.getSymbol("Contact").params[0].name', 'person', 'The name of a param is found.');
-		is('symbols.getSymbol("Contact").params[1].name', 'person.name', 'The name of a param set with a dot name is found.');
-		is('symbols.getSymbol("Contact").params[2].name', 'person.age', 'The name of a second param set with a dot name is found.');
-		is('symbols.getSymbol("Contact").params[4].name', 'connection', 'The name of a param after config is found.');
-		
-		is('symbols.getSymbol("Family").params[0].name', 'persons', 'Another name of a param is found.');
-		is('symbols.getSymbol("Family").params[1].name', 'persons.Father', 'The name of a param+config is found.');
-		is('symbols.getSymbol("Family").params[2].name', 'persons.Mother', 'The name of a second param+config is found.');
-		is('symbols.getSymbol("Family").params[3].name', 'persons.Children', 'The name of a third param+config is found.');	
-	}
-	,
-	function() {
-		symbolize({a:true, p:true, _: [SYS.pwd+"test/ignore.js"]});
-		is('LOG.warnings.filter(function($){if($.indexOf("undocumented symbol Ignored") > -1) return $}).length', 1, 'A warning is emitted when documenting members of an ignored parent.');
-	}
-	,
-	function() {
-		symbolize({a:true, p:true, _: [SYS.pwd+"test/functions_anon.js"]});
-		is('symbols.getSymbol("a.b").alias', 'a.b', 'In anonymous constructor this is found to be the container object.');
-		is('symbols.getSymbol("a.f").alias', 'a.f', 'In anonymous constructor this can have a method.');
-		is('symbols.getSymbol("a.c").alias', 'a.c', 'In anonymous constructor method this is found to be the container object.');
-		is('symbols.getSymbol("g").alias', 'g', 'In anonymous function executed inline this is the global.');
-		is('symbols.getSymbol("bar2.p").alias', 'bar2.p', 'In named constructor executed inline this is the container object.');
-		is('symbols.getSymbol("module.pub").alias', 'module.pub', 'In parenthesized anonymous function executed inline function scoped variables arent documented.');
-	}
-	,
-	function() {
-		symbolize({a:true, p:true, _: [SYS.pwd+"test/oblit_anon.js"]});
-		is('symbols.getSymbol("opt").name', 'opt', 'Anonymous object properties are created.');
-		is('symbols.getSymbol("opt.conf.keep").alias', 'opt.conf.keep', 'Anonymous object first property is assigned to $anonymous.');
-		is('symbols.getSymbol("opt.conf.base").alias', 'opt.conf.base', 'Anonymous object second property is assigned to $anonymous.');
-	}
-	,
-	function() {
-		symbolize({a:true, p:true, _: [SYS.pwd+"test/params_optional.js"]});
-		is('symbols.getSymbol("Document").params.length', 3, 'Correct number of params are found when optional param syntax is used.');
-		is('symbols.getSymbol("Document").params[1].name', "id", 'Name of optional param is found.');
-		is('symbols.getSymbol("Document").params[1].isOptional', true, 'Optional param is marked isOptional.');
-		is('symbols.getSymbol("Document").params[2].name', "title", 'Name of optional param with default value is found.');
-		is('symbols.getSymbol("Document").params[2].isOptional', true, 'Optional param with default value is marked isOptional.');
-		is('symbols.getSymbol("Document").params[2].defaultValue', " This is untitled.", 'Optional param default value is found.');
-	}
-	,
-	function() {
-		symbolize({a:true, p:true, _: [SYS.pwd+"test/synonyms.js"]});
-		is('symbols.getSymbol("myObject.myFunc").type', 'function', 'Type can be set to function.');
-	}
-	,
-	function() {
-		symbolize({a:true, p:true, _: [SYS.pwd+"test/event.js"]});
-		is('symbols.getSymbol("Kitchen#event:cakeEaten").isEvent', true, 'Function with event prefix is an event.');
-		is('symbols.getSymbol("Kitchen#cakeEaten").isa', "FUNCTION", 'Function with same name as event isa function.');
-	}
-	,
-	function() {
-		symbolize({x:"js", a:true, _: [SYS.pwd+"test/scripts/"]});
-		is('JSDOC.JsDoc.srcFiles.length', 1, 'Only js files are scanned when -x=js.');
-	}
-	,
-	function() {
-		symbolize({x:"js", a:true, _: [SYS.pwd+"test/exports.js"]});
-		is('symbols.getSymbol("mxn.Map#doThings").name', 'doThings', 'Exports creates a documentation alias that can have methods.');
-	}
-	,
-	function() {
-		symbolize({p:true, a:true, _: [SYS.pwd+"test/module.js"]});
-		is('symbols.getSymbol("myProject.myModule.myPublicMethod").name', 'myPublicMethod', 'A function wrapped in parens can be recognized.');
-		is('symbols.getSymbol("myProject.myModule-myPrivateMethod").name', 'myPrivateMethod', 'A private method in the scope of a function wrapped in parens can be recognized.');
-		is('symbols.getSymbol("myProject.myModule-myPrivateVar").name', 'myPrivateVar', 'A private member in the scope of a function wrapped in parens can be recognized.');
-	}
-];
-
-//// run and print results
-print(testrun(testCases));
--- a/sbin/res/jsdoc/app/test/addon.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
-String.prototype.reverse = function() {
-}
-
-String.prototype.reverse.utf8 = function() {
-}
-
-Function.count = function() {
-}
-
-/** @memberOf Function */
-Function.count.reset = function() {
-}
-
-/** @memberOf Function */
-count.getValue = function() {
-}
-
-/** @memberOf Function.prototype */
-getSig = function() {
-}
-
-/** @memberOf Function.prototype */
-Function.prototype.getProps = function() {
-}
--- a/sbin/res/jsdoc/app/test/anon_inner.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-/**
- * @name bar
- * @namespace
- */
- 
-new function() {
-    /**
-     * @name bar-foo
-     * @function
-     * @param {number} x
-     */
-    function foo(x) {
-    }
-}
\ No newline at end of file
--- a/sbin/res/jsdoc/app/test/augments.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,31 +0,0 @@
-/**
-@constructor
-*/
-function Layout(p) {
-	this.init = function(p) {
-	}
-	
-	this.getId = function() {
-	}
-	
-	/** @type Page */
-	this.orientation = "landscape";
-}
-
-/**
-@constructor
-@augments Layout
-*/
-function Page() {
-	this.reset = function(b) {
-	}
-}
-
-/**
-@extends Page
-@constructor
-*/
-function ThreeColumnPage() {
-	this.init = function(resetCode) {
-	}
-}
--- a/sbin/res/jsdoc/app/test/augments2.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,26 +0,0 @@
-/**
-@constructor
-*/
-function LibraryItem() {
-	this.reserve = function() {
-	}
-}
-
-/**
-@constructor
-*/
-function Junkmail() {
-	this.annoy = function() {
-	}
-}
-
-/**
-@inherits Junkmail.prototype.annoy as pester
-@augments ThreeColumnPage
-@augments LibraryItem
-@constructor
-*/
-function NewsletterPage() {
-	this.getHeadline = function() {
-	}
-}
--- a/sbin/res/jsdoc/app/test/borrows.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,46 +0,0 @@
-/**
-@constructor
-*/
-function Layout(p) {
-	/** initilize 1 */
-	this.init = function(p) {
-	}
-	
-	/** get the id */
-	this.getId = function() {
-	}
-	
-	/** @type string */
-	this.orientation = "landscape";
-	
-	function getInnerElements(elementSecretId){
-	}
-}
-
-/** A static method. */
-Layout.units = function() {
-}
-
-/**
-@constructor
-@borrows Layout#orientation
-@borrows Layout-getInnerElements
-@borrows Layout.units
-*/
-function Page() {
-	/** reset the page */
-	this.reset = function(b) {
-	}
-}
-
-/**
-@constructor
-@borrows Layout.prototype.orientation as this.orientation
-@borrows Layout.prototype.init as #init
-@inherits Page.prototype.reset as #reset
-*/
-function ThreeColumnPage() {
-	/** initilize 2 */
-	this.init = function(p) {
-	}
-}
--- a/sbin/res/jsdoc/app/test/borrows2.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,23 +0,0 @@
-// testing circular borrows
-
-/**
-	@class
-	@borrows Bar#zop as this.my_zop
-*/
-function Foo() {
-	/** this is a zip. */
-	this.zip = function() {}
-	
-	this.my_zop = new Bar().zop;
-}
-
-/**
-	@class
-	@borrows Foo#zip as this.my_zip
-*/
-function Bar() {
-	/** this is a zop. */
-	this.zop = function() {}
-	
-	this.my_zip = new Foo().zip;
-}
\ No newline at end of file
--- a/sbin/res/jsdoc/app/test/config.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,22 +0,0 @@
-/**
- * @constructor
- * @param person The person.
- * @param {string} person.name The person's name.
- * @config {integer} age The person's age.
- * @config [id=1] Optional id number to use.
- * @param connection
- */
-function Contact(person, connection) {
-
-}
-
-/**
- * @constructor
- * @param persons
- * @config {string} Father The paternal person.
- * @config {string} Mother The maternal person.
- * @config {string[]} Children And the rest.
- */
-function Family(/**Object*/persons) {
-
-}
--- a/sbin/res/jsdoc/app/test/constructs.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,18 +0,0 @@
-var Person = makeClass(
-    /**
-      @scope Person
-    */
-    {
-        /**
-        	This is just another way to define a constructor.
-        	@constructs
-        	@param {string} name The name of the person.
-         */
-        initialize: function(name) {
-            this.name = name;
-        },
-        say: function(message) {
-            return this.name + " says: " + message;
-        }
-    }
-);
\ No newline at end of file
--- a/sbin/res/jsdoc/app/test/encoding.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,10 +0,0 @@
-
-/**
- * @Constructor
- * @desc 配置文件
- * @class 什么也不返回
- */
-function Test(conf) {
-    // do something;
-}
-
--- a/sbin/res/jsdoc/app/test/encoding_other.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,12 +0,0 @@
-
-/**
- * @Constructor
- * @desc 
- * @class  
- */
-function Test(conf) {
-    // do something;
-}
-
-// run with commanline option -e=iso-8859-5
-
--- a/sbin/res/jsdoc/app/test/event.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,54 +0,0 @@
-/**
- * @name Kitchen
- * @constructor
- * @fires Bakery#event:donutOrdered
- */
-
-/**
- * Fired when some cake is eaten.
- * @name Kitchen#event:cakeEaten
- * @function
- * @param {Number} pieces The number of pieces eaten.
- */
-
-/**
- * Find out if cake was eaten.
- * @name Kitchen#cakeEaten
- * @function
- * @param {Boolean} wasEaten
- */
-
-/**
- * @name getDesert
- * @function
- * @fires Kitchen#event:cakeEaten
- */
- 
-/**
- * @name Bakery
- * @constructor
- * @extends Kitchen
- */
-
-/**
- * Fired when a donut order is made.
- * @name Bakery#event:donutOrdered
- * @event
- * @param {Event} e The event object.
- * @param {String} [e.topping] Optional sprinkles.
- */
-
-/**
- * @constructor
- * @borrows Bakery#event:donutOrdered as this.event:cakeOrdered
- */
-function CakeShop() {
-}
-
-/** @event */
-CakeShop.prototype.icingReady = function(isPink) {
-}
-
-/** @event */
-function amHungry(/**Boolean*/enoughToEatAHorse) {
-}
\ No newline at end of file
--- a/sbin/res/jsdoc/app/test/exports.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-/** @namespace */
-var mxn = {};
-
-(function(){ 
-    /** @exports Map as mxn.Map */
-    var Map =
-        /** @constructor */
-        mxn.Map = function() {
-        };
-    
-    /** A method. */
-    Map.prototype.doThings = function() {
-    };
-})();
\ No newline at end of file
--- a/sbin/res/jsdoc/app/test/functions_anon.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,39 +0,0 @@
-/** an anonymous constructor executed inline */
-a = new function() {
-	/** a.b*/
-    this.b = 1;
-    /** a.f */
-    this.f = function() {
-    	/** a.c */
-    	this.c = 2;
-    }
-}
-
-
-/**
-	named function executed inline
-*/
-bar1 = function Zoola1() {
-	/** property of global */
-	this.g = 1;
-}();
-
-/**
-	named constructor executed inline
-*/
-bar2 = new function Zoola2() {
-	/** property of bar */
-	this.p = 1;
-};
-
-/** module pattern */
-module = (function () {
-	/** won't appear in documentation */
-	var priv = 1;
-	
-	/** @scope module */
-	return {
-		/** will appear as a property of module */
-		pub: 1
-	}
-})();
--- a/sbin/res/jsdoc/app/test/functions_nested.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,33 +0,0 @@
-/** @constructor */
-function Zop() {
-}
-
-/**
- @class
-*/
-Foo = function(id) {
-	// this is a bit twisted, but if you call Foo() you will then
-	// modify Foo(). This is kinda, sorta non-insane, because you
-	// would have to call Foo() 100% of the time to use Foo's methods
-	Foo.prototype.methodOne = function(bar) {
-	  alert(bar);
-	};
-	
-	// same again
-	Foo.prototype.methodTwo = function(bar2) {
-	  alert(bar2);
-	};
-	
-	// and these are only executed if the enclosing function is actually called
-	// and who knows if that will ever happen?
-	Bar = function(pez) {
-	  alert(pez);
-	};
-	Zop.prototype.zap = function(p){
-		alert(p);
-	};
-	
-	// but this is only visible inside Foo
-	function inner() {
-	}
-};
--- a/sbin/res/jsdoc/app/test/global.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-/** ecks */
-var x = [1, 2, 4];
-
-var y = {
-	foo: function(){
-	}
-}
-
-bar = function() {
-}
-
-function zop() {
-}
--- a/sbin/res/jsdoc/app/test/globals.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-function example(/**Circle*/a, b) {
-	/** a global defined in function  */
-	var number = a;
-	
-	var hideNumber = function(){
-	}
-	
-	setNumber = function(){
-	}
-	alert('You have chosen: ' + b);
-}
-
-function initPage() {
-	var supported = document.createElement && document.getElementsByTagName;
-	if (!supported) return;
-	// start of DOM script
-	var x = document.getElementById('writeroot');
-	// etc.
-}
-
-/** an example var */
-var document = new Document(x, y);
-
-var getNumber = function(){
-}
\ No newline at end of file
--- a/sbin/res/jsdoc/app/test/ignore.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,10 +0,0 @@
-/**
- * A test constructor.
- * @constructor
- * @ignore
- */
-function Ignored() {
-	/** a method */
-    this.bar = function() {
-    }
-}
\ No newline at end of file
--- a/sbin/res/jsdoc/app/test/inner.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
-/**
- * @constructor
- */
-function Outer() {
-  /**
-   * @constructor
-   */
-  function Inner(name) {
-    /** The name of this. */
-    this.name = name;
-  }
-
-  this.open = function(name) {
-    return (new Inner(name));
-  }
-}
\ No newline at end of file
--- a/sbin/res/jsdoc/app/test/jsdoc_test.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,477 +0,0 @@
-/** 
- * @fileoverview This file is to be used for testing the JSDoc parser
- * It is not intended to be an example of good JavaScript OO-programming,
- * nor is it intended to fulfill any specific purpose apart from 
- * demonstrating the functionality of the 
- * <a href='http://sourceforge.net/projects/jsdoc'>JSDoc</a> parser
- *
- * @author Gabriel Reid gab_reid@users.sourceforge.net
- * @version 0.1 
- */
-
-
-/**
- * Construct a new Shape object.
- * @class This is the basic Shape class.  
- * It can be considered an abstract class, even though no such thing
- * really existing in JavaScript
- * @constructor
- * @throws MemoryException if there is no more memory 
- * @throws GeneralShapeException rarely (if ever)
- * @return {Shape|Coordinate} A new shape.
- */
-function Shape(){
-  
-   /**
-    * This is an example of a function that is not given as a property
-    * of a prototype, but instead it is assigned within a constructor.
-    * For inner functions like this to be picked up by the parser, the
-    * function that acts as a constructor <b>must</b> be denoted with
-    * the <b>&#64;constructor</b> tag in its comment.
-    * @type String
-    */
-   this.getClassName = function(){
-      return "Shape";
-   }
-
-   /** 
-    * This is an inner method, just used here as an example
-    * @since version 0.5
-    * @author Sue Smart
-    */
-   function addReference(){
-       // Do nothing...
-   }
-   
-}
-
-/**
- * Create a new Hexagon instance.
- * @extends Shape
- * @class Hexagon is a class that is a <i>logical</i> sublcass of 
- * {@link Shape} (thanks to the <code>&#64;extends</code> tag), but in 
- * reality it is completely unrelated to Shape.
- * @param {int} sideLength The length of one side for the new Hexagon
- * @example
- * var h = new Hexagon(2);
- * @example
- * if (hasHex) {
- *     hex   = new Hexagon(5);
- *     color = hex.getColor();
- * }
- */
-function Hexagon(sideLength) {
-}
-
-
-/**
- * This is an unattached (static) function that adds two integers together.
- * @param {int} One The first number to add 
- * @param {int} Two The second number to add 
- * @author Gabriel Reid
- * @deprecated So you shouldn't use it anymore! Use {@link Shape#getClassName} instead.
- */
-function Add(One, Two){
-    return One + Two;
-}
-
-
-/**
- * The color of this shape
- * @type Color
- */
-Shape.prototype.color = null;
-
-/**
- * The border of this shape. 
- * @field
- * @type int
- */
-Shape.prototype.border = function(){return border;};
-
-/*
- * These are all the instance method implementations for Shape
- */
-
-/**
- * Get the coordinates of this shape. It is assumed that we're always talking
- * about shapes in a 2D location here.
- * @requires The {@link Shape} class
- * @returns A Coordinate object representing the location of this Shape
- * @type Coordinate[]
- */
-Shape.prototype.getCoords = function(){
-   return this.coords;
-}
-
-/**
- * Get the color of this shape.
- * @see #setColor
- * @see The <a href="http://example.com">Color</a> library.
- * @link Shape
- * @type Color
- */
-Shape.prototype.getColor = function(){
-   return this.color;
-}
-
-/**
- * Set the coordinates for this Shape
- * @param {Coordinate} coordinates The coordinates to set for this Shape
- */
-Shape.prototype.setCoords = function(coordinates){
-   this.coords = coordinates;
-}
-
-/**
- * Set the color for this Shape
- * @param {Color} color The color to set for this Shape
- * @param other There is no other param, but it can still be documented if
- *              optional parameters are used
- * @throws NonExistantColorException (no, not really!)
- * @see #getColor
- */
-Shape.prototype.setColor = function(color){
-   this.color = color;
-}
-
-/**
- * Clone this shape
- * @returns A copy of this shape
- * @type Shape
- * @author Gabriel Reid
- */
-Shape.prototype.clone = function(){
-   return new Shape();
-}
-
-/**
- * Create a new Rectangle instance. 
- * @class A basic rectangle class, inherits from Shape.
- * This class could be considered a concrete implementation class
- * @constructor
- * @param {int} width The optional width for this Rectangle
- * @param {int} height Thie optional height for this Rectangle
- * @author Gabriel Reid
- * @see Shape is the base class for this
- * @augments Shape
- * @hilited
- */
-function Rectangle(width, // This is the width 
-                  height // This is the height
-                  ){
-   if (width){
-      this.width = width;
-      if (height){
-	 this.height = height;
-      }
-   }
-}
-
-
-/* Inherit from Shape */
-Rectangle.prototype = new Shape();
-
-/**
- * Value to represent the width of the Rectangle.
- * <br>Text in <b>bold</b> and <i>italic</i> and a 
- * link to <a href="http://sf.net">SourceForge</a>
- * @private
- * @type int
- */
-Rectangle.prototype.width = 0;
-
-/**
- * Value to represent the height of the Rectangle
- * @private
- * @type int
- */
-Rectangle.prototype.height = 0;
-
-/**
- * Get the type of this object. 
- * @type String
- */
-Rectangle.prototype.getClassName= function(){
-    return "Rectangle";
-}
-
-/**
- * Get the value of the width for the Rectangle
- * @type int
- * @see Rectangle#setWidth
- */
-Rectangle.prototype.getWidth = function(){
-   return this.width;
-}
-
-/**
- * Get the value of the height for the Rectangle.
- * Another getter is the {@link Shape#getColor} method in the 
- * {@link Shape} base class.  
- * @return The height of this Rectangle
- * @type int
- * @see Rectangle#setHeight
- */
-Rectangle.prototype.getHeight = function(){
-    return this.height;
-}
-
-/**
- * Set the width value for this Rectangle.
- * @param {int} width The width value to be set
- * @see #setWidth
- */
-Rectangle.prototype.setWidth = function(width){
-   this.width = width;
-}
-
-/**
- * Set the height value for this Rectangle.
- * @param {int} height The height value to be set
- * @see #getHeight
- */
-Rectangle.prototype.setHeight = function(height){
-   this.height = height;
-}
-
-/**
- * Get the value for the total area of this Rectangle
- * @return total area of this Rectangle
- * @type int
- */
-Rectangle.prototype.getArea = function(){
-   return width * height;
-}
-
-
-/**
- * Create a new Square instance.
- * @class A Square is a subclass of {@link Rectangle}
- * @param {int} width The optional width for this Rectangle
- * @param {int} height The optional height for this Rectangle
- * @augments Rectangle
- */
-function Square(width, height){
-   if (width){
-      this.width = width;
-      if (height){
-	 this.height = height;
-      }
-   } 
-   
-}
-
-/* Square is a subclass of Rectangle */
-Square.prototype = new Rectangle();
-
-/**
- * Set the width value for this Shape.
- * @param {int} width The width value to be set
- * @see #getWidth
- */
-Square.prototype.setWidth = function(width){
-   this.width = this.height = width;
-}
-
-/**
- * Set the height value for this Shape 
- * Sets the {@link Rectangle#height} attribute in the Rectangle.
- * @param {int} height The height value to be set
- */
-Square.prototype.setHeight = function(height){
-   this.height = this.width = height;
-}
-
-
-/**
- * Create a new Circle instance based on a radius.
- * @class Circle class is another subclass of Shape
- * @extends Shape
- * @param {int} radius The optional radius of this {@link Circle }
- * @mixin Square.prototype.setWidth as this.setDiameter
- */
-function Circle(radius){
-   if (radius) {
-      /** The radius of the this Circle. */
-      this.radius = radius;
-   }
-}
-
-/* Circle inherits from {@link Shape} */
-Circle.prototype = new Shape();
-
-/** 
- * The radius value for this Circle 
- * @private
- * @type int
- */
-Circle.prototype.radius = 0;
-
-/** 
- * A very simple class (static) field that is also a constant
- * @final
- * @type float
- */
-Circle.PI = 3.14;
-
-/**
- * Get the radius value for this Circle
- * @type int
- * @see #setRadius
- */
-Circle.prototype.getRadius = function(){
-   return this.radius;
-}
-
-/** 
- * Set the radius value for this Circle
- * @param {int} radius The {@link Circle#radius} value to set
- * @see #getRadius
- */
-Circle.prototype.setRadius = function(radius){
-   this.radius = radius;
-}
-
-/** 
- * An example of a  class (static) method that acts as a factory for Circle
- * objects. Given a radius value, this method creates a new Circle.
- * @param {int} radius The radius value to use for the new Circle.
- * @type Circle
- */
-Circle.createCircle = function(radius){
-    return new Circle(radius);
-}
-
-
-/**
- * Create a new Coordinate instance based on x and y grid data.
- * @class Coordinate is a class that can encapsulate location information.
- * @param {int} [x=0] The optional x portion of the Coordinate
- * @param {int} [y=0] The optinal y portion of the Coordinate
- */
-function Coordinate(x, y){
-   if (x){
-      this.x = x;
-      if (y){
-	 this.y = y;
-      }
-   }
-}
-
-/** 
- * The x portion of the Coordinate 
- * @type int
- * @see #getX
- * @see #setX
- */
-Coordinate.prototype.x = 0;
-
-/** 
- * The y portion of the Coordinate 
- * @type int
- * @see #getY
- * @see #setY
- */
-Coordinate.prototype.y = 0;
-
-/**
- * Gets the x portion of the Coordinate.
- * @type int
- * @see #setX
- */
-Coordinate.prototype.getX = function(){
-   return this.x;
-}
-
-/** 
- * Get the y portion of the Coordinate.
- * @type int
- * @see #setY
- */
-Coordinate.prototype.getY = function(){
-   return this.y;
-}
-
-/**
- * Sets the x portion of the Coordinate.
- * @param {int} x The x value to set
- * @see #getX
- */
-Coordinate.prototype.setX = function(x){
-   this.x = x;
-}
-
-/** 
- * Sets the y portion of the Coordinate.
- * @param {int} y The y value to set
- * @see #getY
- */
-Coordinate.prototype.setY = function(y){
-   this.y = y;
-}
-
-/**
- * @class This class exists to demonstrate the assignment of a class prototype
- * as an anonymous block.
- */
-function ShapeFactory(){
-}
-
-ShapeFactory.prototype = {
-   /** 
-    * Creates a new {@link Shape} instance.
-    * @return A new {@link Shape}
-    * @type Shape
-    */
-   createShape: function(){
-      return new Shape();
-   }
-}
-
-/**
- * An example of a singleton class
- * @param ... Arguments represent {@link coordinate}s in the shape.
- * @constructor
- */
-MySingletonShapeFactory = function(){
-
-   /**
-    * Get the next {@link Shape}
-    * @type Shape
-    * @return A new {@link Shape}
-    */
-   this.getShape = function(){ 
-      return null; 
-   }
-
-}
-
-
-/** 
- * Create a new Foo instance.
- * @class This is the Foo class. It exists to demonstrate 'nested' classes.
- * @constructor 
- * @see Foo.Bar
- */
-function Foo(){}
-
-/** 
- * Creates a new instance of Bar.
- * @class This class exists to demonstrate 'nested' classes.
- * @constructor 
- * @see Foo.Bar
- */
-function Bar(){}
-
-/** 
- * Nested class
- * @constructor 
- */
-Foo.Bar = function(){
-	/** The x. */ this.x = 2;
-}
-
-Foo.Bar.prototype = new Bar();
-/** The y. */ 
-Foo.Bar.prototype.y = '3';
--- a/sbin/res/jsdoc/app/test/lend.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,33 +0,0 @@
- /** @class  */
-var Person = Class.create(
-    /**
-      @lends Person.prototype
-    */
-    {
-      initialize: function(name) {
-            this.name = name;
-        },
-        say: function(message) {
-            return this.name + ': ' + message;
-        }
-    }
- );
-
-/** @lends Person.prototype */
-{
-	/** like say but more musical */
-	sing: function(song) {
-	}
-}
-
-/** @lends Person */
-{
-	getCount: function() {
-	}
-}
-
-/** @lends Unknown.prototype */
-{
-	notok: function() {
-	}
-}
\ No newline at end of file
--- a/sbin/res/jsdoc/app/test/memberof.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,19 +0,0 @@
-/** @constructor */
-pack = function() {
-	this.init = function(){}
-	function config(){}
-}
- 
- pack.build = function(task) {};
-
-/** @memberOf pack */
-pack.install = function() {}
-
-/** @memberOf pack */
-pack.install.overwrite = function() {}
-
-/** @memberOf pack */
-clean = function() {}
-
-/** @memberOf pack-config */
-install = function() {};
--- a/sbin/res/jsdoc/app/test/memberof2.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,38 +0,0 @@
-/**
- * @constructor
- */
-function Foo() {
-    /**
-    	@memberOf Foo.prototype
-    */
-    function bar(a, b) {
-    }
-    
-    /**
-    	@memberOf Foo
-    */
-    var zip = function(p, q) {
-    }
-    
-    /**
-    	@memberOf Foo
-    */
-    function zop( x,y ) {
-    }
-    
-    /**
-    	@memberOf Foo
-    	@constructor
-    */
-    function Fiz() {
-    	/** A method of Foo#Fiz. */
-    	this.fipple = function(fop){}
-    }
-}
-
-/**
-	@memberOf Foo#
- */
-var blat = function() {
-
-}
\ No newline at end of file
--- a/sbin/res/jsdoc/app/test/memberof3.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,33 +0,0 @@
-/**
-* @name Foo
-* @class
-*/
-
-/**#@+
-* @memberOf Foo#
-* @field
-*/
-
-/**
-* @name bar
-* @type Object[]
-*/
-
-/**#@-*/
-
-/**
-* @name Foo2
-* @class
-*/
-
-/**#@+
-* @memberOf Foo2#
-* @field
-*/
-
-/**
-* @name bar
-* @type Object[]
-*/
-
-/**#@-*/
\ No newline at end of file
--- a/sbin/res/jsdoc/app/test/memberof_constructor.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,17 +0,0 @@
-/** @constructor */
-function Circle(){}
-
-/**
-	@constructor
-	@memberOf Circle#
- */
-Circle.prototype.Tangent = function(){};
-
-// renaming Circle#Tangent to Circle#Circle#Tangent
-
-/**
-	@memberOf Circle#Tangent#
- */
-Circle.prototype.Tangent.prototype.getDiameter = function(){};
-
-
--- a/sbin/res/jsdoc/app/test/module.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,17 +0,0 @@
-/** @namespace */
-myProject = myProject || {};
-
-/** @namespace */
-myProject.myModule = (function () {
-	/** describe myPrivateVar here */
-	var myPrivateVar = "";
-
-	var myPrivateMethod = function () {
-	}
-
-	/** @scope myProject.myModule */
-	return {
-		myPublicMethod: function () {
-		}
-	};
-})();
\ No newline at end of file
--- a/sbin/res/jsdoc/app/test/multi_methods.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-
-/**
-	Get the entire flavor.
-	@name flavor^3
-	@function
-	@returns {Object} The entire flavor hash.
-*/
-/**
-	Get a named flavor.
-	@name flavor^2
-	@function
-	@param {String} name The name of the flavor to get.
-	@returns {String} The value of that flavor.
-*/
-/**
-	Set the flavor.
-	@param {String} name The name of the flavor to set.
-	@param {String} value The value of the flavor.
-	@returns {String} The value of that flavor.
-*/
-function flavor(name, value) {
-	if (arguments.length > 1) flavor[name] = value;
-	else if (arguments.length == 1) return flavor[name];
-	else return flavor;
-}
\ No newline at end of file
--- a/sbin/res/jsdoc/app/test/name.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,19 +0,0 @@
-/**
- @name Response
- @class
-*/
-
-Response.prototype = {
-	/**
-	 @name Response#text
-	 @function
-	 @description
-		Gets the body of the response as plain text
-	 @returns {String}
-		Response as text
-	*/
-
-	text: function() {
-		return this.nativeResponse.responseText;
-	}
-}
\ No newline at end of file
--- a/sbin/res/jsdoc/app/test/namespace_nested.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,23 +0,0 @@
-/** 
-	@namespace This is the first namespace.
-*/
-ns1 = {};
-
-/** 
-	This is the second namespace.
-	@namespace
-*/
-ns1.ns2 = {};
-
-/**
-	This part of ns1.ns2
-	@constructor
-*/
-ns1.ns2.Function1 = function() {
-};
-
-ns1.staticFunction = function() {
-};
-
-/** A static field in a namespace. */
-ns1.ns2.staticField = 1;
--- a/sbin/res/jsdoc/app/test/nocode.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-/**#nocode+*/
-    /**
-      @name star
-      @function
-    */
-    function blahblah() {
-    
-    }
-/**#nocode-*/
-
-function yaddayadda() {
-
-}
\ No newline at end of file
--- a/sbin/res/jsdoc/app/test/oblit_anon.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,20 +0,0 @@
-/** the options */
-opt = Opt.get(
-	arguments, 
-	{
-	 d: "directory",
-	 c: "conf",
-	 "D[]": "define"
-	}
-);
-
-/** configuration */
-opt.conf = {
-	/** keep */
-	keep: true,
-	/** base */
-	base: getBase(this, {p: properties})
-}
-
-
-
--- a/sbin/res/jsdoc/app/test/overview.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,20 +0,0 @@
-/**
- * @overview This "library" contains a 
- *               lot of classes and functions.
- * @example
- <pre>
-	var x (x < 1);
-	alert("This 'is' \"code\"");
- </pre>
- * @name My Cool Library
- * @author 	Joe Smith jsmith@company.com
- * @version 	0.1 
- */
- 
-/** 
- * Gets the current foo 
- * @param {String} fooId	The unique identifier for the foo.
- * @return {Object}	Returns the current foo.
- */
-function getFoo(fooID){
-}
\ No newline at end of file
--- a/sbin/res/jsdoc/app/test/param_inline.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,37 +0,0 @@
-/**
-	@constructor
-	@param columns The number of columns.
-*/
-function Layout(/**int*/columns){
-	/**
-		@param [id] The id of the element.
-		@param elName The name of the element.
-	*/
-	this.getElement = function(
-		/** string */ elName,
-		/** number|string */ id
-	) {
-	};
-	
-	/** 
-		@constructor
-	 */
-	this.Canvas = function(top, left, /**int*/width, height) {
-		/** Is it initiated yet? */
-		this.initiated = true;
-	}
-	
-	this.rotate = function(/**nothing*/) {
-	}
-	
-	/** 
-	@param x
-	@param y
-	@param {zoppler} z*/
-	this.init = function(x, y, /**abbler*/z) {
-		/** The xyz. */
-		this.xyz = x+y+z;
-		this.getXyz = function() {
-		}
-	}
-}
--- a/sbin/res/jsdoc/app/test/params_optional.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,8 +0,0 @@
-
-/**
- * @param {Page[]} pages
- * @param {number} [id] Specifies the id, if applicable.
- * @param {String} [title = This is untitled.] Specifies the title.
- */
-function Document(pages, id, title){
-}
\ No newline at end of file
--- a/sbin/res/jsdoc/app/test/prototype.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,17 +0,0 @@
-/** @constructor */
-function Article() {
-}
-
-Article.prototype.init = function(title) {
-	/** the instance title */
-	this.title = title;
-	
-	/** the static counter */
-	Article.counter = 1;
-}
-
-a = new Article();
-a.Init("my title");
-
-print(a.title);
-print(Article.counter);
\ No newline at end of file
--- a/sbin/res/jsdoc/app/test/prototype_nested.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,9 +0,0 @@
-/** @constructor */
-function Word() {
-}
-
-Word.prototype.reverse = function() {
-}
-
-Word.prototype.reverse.utf8 = function() {
-}
\ No newline at end of file
--- a/sbin/res/jsdoc/app/test/prototype_oblit.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-/** @constructor */
-function Article() {
-}
-
-Article.prototype = {
-	/** instance get title */
-	getTitle: function(){
-	}
-}
-
-/** static get title */
-Article.getTitle = function(){
-}
\ No newline at end of file
--- a/sbin/res/jsdoc/app/test/prototype_oblit_constructor.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
-/** @constructor */
-function Article() {
-}
-
-Article.prototype = {
-	/** @constructor */
-	Title: function(title) {
-		/** the value of the Title instance */
-		this.title = title;
-	},
-	
-	init: function(pages) {
-		/** the value of the pages of the Article instance */
-		this.pages = pages;
-	}
-}
-
-f = new Article();
-f.init("one two three");
-
-t = new f.Title("my title");
-
-print(f.pages);
-print(t.title);
\ No newline at end of file
--- a/sbin/res/jsdoc/app/test/public.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,10 +0,0 @@
-/**@constructor*/
-function Foo() {
-	/**
-		@public
-		@static
-		@field
-	*/
-	var bar = function(x) {
-	}
-}
\ No newline at end of file
--- a/sbin/res/jsdoc/app/test/scripts/code.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-/**
-	@class
- */
-function thisiscode() {
-}
\ No newline at end of file
--- a/sbin/res/jsdoc/app/test/scripts/notcode.txt	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-(This is not code)
-function foo(){{{{
-(
-!
-@
\ No newline at end of file
--- a/sbin/res/jsdoc/app/test/shared.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-
-/**
- * Builtin object.
- * @class
- * @name Array
- */
- 
-/**#@+
- * Extension to builtin array.
- * @memberOf Array
- * @method
- */
- 
-/**
- * @returns Boolen if some array members...
- */
-Array.prototype.some = function(){};
-
-/**
- * Change every element of an array.
- * @returns Filtered array copy.
- */
-Array.prototype.filter = function(){};
-
-/**#@-*/
-
-
-/**
- * A first in, first out data structure.
- * @constructor
- */
-Queue = function(){};
-
-/**#@+
- * Extension to Queue.
- * @memberOf Queue
- */
-
-rewind = function(){
-}
-
-// should close automatically here.
\ No newline at end of file
--- a/sbin/res/jsdoc/app/test/shared2.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-startOver = function(){
-}
\ No newline at end of file
--- a/sbin/res/jsdoc/app/test/shortcuts.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,22 +0,0 @@
-// /**#=+
-//  * {
-//  *	'D': 'Date.prototype',
-//  *	'$N': 'Number'
-//  * }
-//  */
-// var D = Date.prototype,
-// $N = Number;
-// 
-// D.locale = function(){
-// };
-// 
-// /**
-// 	@return {string} The cardinal number string.
-// */
-// $N.nth = function(n){
-// };
-// 
-// LOAD.file = function(){
-// }
-// 
-// /**#=-*/
\ No newline at end of file
--- a/sbin/res/jsdoc/app/test/static_this.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-/** the parent */
-var box = {};
-
-/** @namespace */
-box.holder = {}
-
-box.holder.foo = function() {
-	/** the counter */
-	this.counter = 1;
-}
-
-box.holder.foo();
-print(box.holder.counter);
--- a/sbin/res/jsdoc/app/test/synonyms.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,31 +0,0 @@
-/**
-	@class
-	@inherits Bar#zop as #my_zop
-*/
-function Foo() {
-	/** this is a zip. */
-	this.zip = function() {}
-	
-	/** from Bar */
-	this.my_zop = new Bar().zop;
-}
-
-/**
-	@class
-	@borrows Foo#zip as this.my_zip
-*/
-function Bar() {
-	/** this is a zop. */
-	this.zop = function() {}
-	
-	/** from Foo */
-	this.my_zip = new Foo().zip;
-}
-
-/** @namespace */
-var myObject = {
-	/**
-		@type function
-	*/
-	myFunc: getFunction()
-}
\ No newline at end of file
--- a/sbin/res/jsdoc/app/test/tosource.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,23 +0,0 @@
-/**
- * @param {Object} object
- * @return {string}
- */
-function valueOf(object) {}
-
-/**
- * @param {Object} object
- * @return {string}
- */
-function toString(object) {}
-
-/**
- * @param {Object} object
- * @return {string}
- */
-function toSource(object) {}
-
-/**
- * @param {Object} object
- * @return {string}
- */
-function constructor(object) {}
\ No newline at end of file
--- a/sbin/res/jsdoc/app/test/variable_redefine.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-/** @constructor */
-function Foo() {
-	var bar = 1;
-	bar = 2; // redefining a private
-	
-	this.baz = 1;
-	baz = 2; // global
-	
-	/** a private */
-	var blap = {
-		/** in here */
-		tada: 1
-	}
-}
\ No newline at end of file
--- a/sbin/res/jsdoc/changes.txt	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,124 +0,0 @@
-== 2.4.0 ==
-
-  * Fixed bug that added mutiple symbols with the same name to docs.
-  * Added support for the -m option to suppress warnings for multiple docs.
-  * Added patch by brownsea42 to support quoted user variables on the command line. ( issue #281 )
-  * Fixed bug that sometimes caused links to events to be incorrect. ( issue #292 )
-  
-== 2.3.3 ==
-
-  * Fixed bug that made all fields declared with the @property tag static. ( issue #262 )
-  * Minor fix to better handle trailing slash on path to template (from jwmetrocat). ( issue #237 )
-  * Fix for @memberOf when applied to inner members. ( issue #264 )
-  * Fix for @memberOf when applied to symbols documented with @name. ( issue #260 )
-  * Applied patch from kunhualqk, fix for bug where @link to borrowed member did not resolve to parent class. ( issue #218 )
-  * Fix for @requires not linking back to the required class
-  * Added experimental support for @constructs to have an argument, the class name, when applied to a function assignment.
-  
-== 2.3.2 ==
-
- * Minor update to the usage notes and corrected the version number displayed in the output.
-
-== 2.3.1 ==
-
- * Fixed HTML typo in allfiles template. ( issue #228 )
- * Modified template to display version information for classes.
- * Modified template to better support multiple methods with the same name.
- * Fixed bug that caused template to error when backtick characters appeared around class names.
-
-== 2.3.0 ==
-
-  * Added option -u, --unique to avoid bug that causes multiple symbols with names that differ only by case to overwrite each others output on case-insensitive filesystems. ( issue #162 )
-  * Fixed bug where {@links} in @deprecated tags did not resolve. ( issue #220 )
-  * Fixed bug that caused parens around a function to make it to be unrecognized. ( issue #213 )
-  * Fixed bug prevented explicit links to named anchors from working (thanks katgao.pku). ( issue #215 )
-  * Fixed bug that prevented full description from appearing in file overview. ( issue #224 )
-  
-== 2.2.1 ==
-
-  * Fixed bug with class template, where sorting of methods was accidentally removed (thanks dezfowler).
-  * Added missing test files for the @exports unit tests.
-
-== 2.2.0 ==
-
-  * Fixed bug that caused exception when given a folder containing non-js files, even with the x commandline option set to "js". ( issue #193 )
-  * Fixed typo in index template [patch submitted by olle]. ( issue #198 )
-  * Modified @borrows tag experimentally to allow for missing "as ..." clause.
-  * Added support for the @exports tag, to allow one symbol to be documented as another.
-  * Added support for the -S option to document code following the Secure Modules pattern.
-  
-== 2.1.0 ==
-
-  * Added support for the @event tag.
-  * Fixed bug that prevented the : character from appearing in symbol names.
-  * Fixed bug that prevented underscored symbols marked with @public being tagged as private. (issue #184 )
-  * Fixed bug that randomly affected the @memberOf tag when the name of the symbol did not include the parent name.
-  * Fixed bug that prevented templates that were not in the jsdoc-toolkit folder from being found. ( issue #176 )
-  * Added ability to check for trailing slash on template path. ( issue #177 )
-  * Modified classDesc so that it no longer is appended with the constructor desc.
-  * Fixed call to plugin onDocCommentSrc.
-  * Added missing support for inline doc comments for function return types. ( issue #189 )
-  * Added command line option -q, --quiet.
-  * Added command line option -E, --exclude. ( issue #143 )
-  * Added 2 more hooks for plugins. ( issue #163 )
-  * Added support for extending built-ins. ( issue #160 )
-  * Added "compact" option to JSDOC.JsPlate.prototype.process. ( issue #159 )
-  * @augments no longer documents static members as inherited. ( issue #138 )
-  * @link to a class now goes to the page for that class, not the constructor. ( issue #178 )
-  * Warnings of mismatched curly brace now include filename. ( issue #166 )
-  * Fixed bug affecting template paths loaded via a configuration file when the trailing slash is missing. ( issue #191 )
-  * Minor optimizations.
-
-== 2.0.2 ==
-
-  * Fixed bug that sometimes caused an example of division in the source code to be interpretted as a regex by the JsDoc Toolkit analyzer. ( issue #158 )
-  * Fixed a bug that prevented private variables marked as @public from appearing in the documentation. ( issue #161 )
-  * Fixed bug that prevented variable names with underscored properties from appearing in summaries. ( issue #173 )
-
-== 2.0.1 ==
-
-  * Fixed bug that prevented @fileOverview tag from being recognized.
-  * Added support for @fieldOf as a synonym for @field plus @memberOf.
-  * Added support for @name tag in a @fileOverview comment to control the displayed name of the file.
-  * Added support for multiple @example tags. ( issue #152 )
-  * Modified style sheet of jsdoc template to make more readable. ( issue #151 )
-  * Fixed bug that prevented @since documentation from displaying correctly when it appeared in a class. ( issue #150 )
-  * Fixed bug that caused inhertited properties to sometimes not resolve correctly. ( issue #144 )
-  * Modified so that trailing whitespace in @example is always trimmed. ( issue #153 )
-  * Added support for elseif to JsPlate. (hat tip to fredck)
-  * Added support for @location urls in the @overview comment to the jsdoc template.
-
-== Changes From Versions 1.4.0 to 2.0.0 ==
-
-  * Upgraded included version of Rhino from 1.6 to 1.7R1.
-  * Removed circular references in parsed documentation objects.
-  * Improved inheritance handling, now properties and events can be inherited same as methods.
-  * Improved handling of cross-file relationships, now having two related objects in separate files is not a problem.
-  * Improved ability to recognize membership of previously defined objects.
-  * Added ability to redefine parsing behavior with plugins.
-  * @methodOf is a synonym for @function and @memberOf.
-  * Added @default to document default values of members that are objects.
-  * Added ability to parse and refer to inner functions.
-  * Fixed bug that appeared when calling a method to set properties of the instance referred to by "this".
-  * Added ability to automatically create links to other symbols.
-  * New "jsdoc" template now produces fully W3C valid XHTML.
-  * Inline parameter type hint comments are now documented.
-  * Fixed error: Locally scoped variables (declared with var) no longer appear as global.
-  * It is now possible to run JsDoc Toolkit from any directory.
-  * Added support for inline {@link ...} tags.
-  * Added support for the -H command-line option to allow for custom content handlers.
-  * Tag names @inherits and @scope changed to @borrows and @lends.
-  ? Combining @constructor in a doclet with @lends now supported.
-  * Multiple @lend tags now supported.
-  * Added support for the @constructs tag, used inside a @lends block.
-  * Added support for the @constant tag.
-  * Fixed bug that prevented the use of [] as a default value.
-  * Added support for the @field tag.
-  * Added support for the @public tag (applied to inner functions).
-  * @namespace tag can now be applied to functions, not just object literals.
-  * Added support for the -s command line option to suppress source code output.
-  * Added new unit test framework.
-  * Underscored symbols are now treated as if they have a @private tag by default.
-  * Improved support for anonymous constructors.
-  * Added support for the nocode meta tag.
-  
\ No newline at end of file
--- a/sbin/res/jsdoc/conf/sample.conf	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,31 +0,0 @@
-/*
-	This is an example of one way you could set up a configuration file to more
-	conveniently define some commandline options. You might like to do this if
-	you frequently reuse the same options. Note that you don't need to define
-	every option in this file, you can combine a configuration file with
-	additional options on the commandline if your wish.
-	
-	You would include this configuration file by running JsDoc Toolkit like so:
-	java -jar jsrun.jar app/run.js -c=conf/sample.conf
-
-*/
-
-{
-	// source files to use
-	_: ['app/test/jsdoc_test.js'],
-	
-	// document all functions, even uncommented ones
-	a: true,
-	
-	// including those marked @private
-	p: true,
-	
-	// some extra variables I want to include
-	D: {generatedBy: "Michael Mathews", copyright: "2008"},
-	
-	// use this directory as the output directory
-	d: "docs",
-	
-	// use this template
-	t: "templates/jsdoc"
-}
\ No newline at end of file
--- a/sbin/res/jsdoc/java/build.xml	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,36 +0,0 @@
-<project>
-   <target name="clean">
-        <delete dir="build"/>
-    </target>
-
-    <target name="compile">
-        <mkdir dir="build/classes"/>
-        <javac 
-         srcdir="src" destdir="build/classes"
-         classpath="./classes/js.jar"
-        />
-    </target>
-
-    <target name="jar">
-        <mkdir dir="build/jar"/>
-        <jar destfile="build/jar/jsrun.jar" basedir="build/classes">
-            <manifest>
-               <attribute name="Main-Class" value="JsRun"/>
-               <attribute name="Class-Path" value="./java/classes/js.jar"/>
-            </manifest>
-        </jar>
-    </target>
-    
-    <target name="debugjar">
-        <mkdir dir="build/jar"/>
-        <jar destfile="build/jar/jsdebug.jar" basedir="build/classes">
-            <manifest>
-               <attribute name="Main-Class" value="JsDebugRun"/>
-               <attribute name="Class-Path" value="./java/classes/js.jar"/>
-            </manifest>
-        </jar>
-    </target>
-
-    <target name="clean-build" depends="clean,compile,jar"/>
-    <target name="clean-debug" depends="clean,compile,debugjar"/>
-</project>
\ No newline at end of file
--- a/sbin/res/jsdoc/java/build_1.4.xml	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,36 +0,0 @@
-<project default="clean-build"><!-- use this build script if you are stuck with ant version 1.4 -->
-   <target name="clean">
-        <delete dir="build"/>
-    </target>
-
-    <target name="compile">
-        <mkdir dir="build/classes"/>
-        <javac 
-         srcdir="src" destdir="build/classes"
-         classpath="./classes/js.jar"
-        />
-    </target>
-
-    <target name="jar">
-        <mkdir dir="build/jar"/>
-        <jar jarfile="build/jar/jsrun.jar" basedir="build/classes">
-            <manifest>
-               <attribute name="Main-Class" value="JsRun"/>
-               <attribute name="Class-Path" value="./java/classes/js.jar"/>
-            </manifest>
-        </jar>
-    </target>
-    
-    <target name="debugjar">
-        <mkdir dir="build/jar"/>
-        <jar jarfile="build/jar/jsdebug.jar" basedir="build/classes">
-            <manifest>
-               <attribute name="Main-Class" value="JsDebugRun"/>
-               <attribute name="Class-Path" value="./java/classes/js.jar"/>
-            </manifest>
-        </jar>
-    </target>
-
-    <target name="clean-build" depends="clean,compile,jar"/>
-    <target name="clean-debug" depends="clean,compile,debugjar"/>
-</project>
Binary file sbin/res/jsdoc/java/classes/js.jar has changed
--- a/sbin/res/jsdoc/java/src/JsDebugRun.java	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,21 +0,0 @@
-/**
- * A trivial bootstrap class that simply adds the path to the
- * .js file as an argument to the Rhino call. This little hack
- * allows the code in the .js file to have access to it's own 
- * path via the Rhino arguments object. This is necessary to 
- * allow the .js code to find resource files in a location 
- * relative to itself.
- *
- * USAGE: java -jar jsdebug.jar path/to/file.js
- */
-public class JsDebugRun {
-	public static void main(String[] args) {
-		String[] jsargs = {"-j="+args[0]};
-		
-		String[] allArgs = new String[jsargs.length + args.length];
-		System.arraycopy(args, 0, allArgs, 0, args.length);
-		System.arraycopy(jsargs, 0, allArgs, args.length ,jsargs.length);
-
-		org.mozilla.javascript.tools.debugger.Main.main(allArgs);
-    }
-}
--- a/sbin/res/jsdoc/java/src/JsRun.java	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,21 +0,0 @@
-/**
- * A trivial bootstrap class that simply adds the path to the
- * .js file as an argument to the Rhino call. This little hack
- * allows the code in the .js file to have access to it's own 
- * path via the Rhino arguments object. This is necessary to 
- * allow the .js code to find resource files in a location 
- * relative to itself.
- *
- * USAGE: java -jar jsrun.jar path/to/file.js
- */
-public class JsRun {
-	public static void main(String[] args) {
-		String[] jsargs = {"-j="+args[0]};
-		
-		String[] allArgs = new String[jsargs.length + args.length];
-		System.arraycopy(args, 0, allArgs, 0, args.length);
-		System.arraycopy(jsargs, 0, allArgs, args.length ,jsargs.length);
-
-		org.mozilla.javascript.tools.shell.Main.main(allArgs);
-    }
-}
Binary file sbin/res/jsdoc/jsdebug.jar has changed
Binary file sbin/res/jsdoc/jsrun.jar has changed
--- a/sbin/res/jsdoc/jsrun.sh	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,52 +0,0 @@
-#!/bin/ksh
-
-# launcher script for jsdoc
-# Author: Avi Deitcher
-#
-# This program is released under the MIT License as follows:
-
-# Copyright (c) 2008-2009 Atomic Inc <avi@jsorm.com>
-#
-#Permission is hereby granted, free of charge, to any person
-#obtaining a copy of this software and associated documentation
-#files (the "Software"), to deal in the Software without
-#restriction, including without limitation the rights to use,
-#copy, modify, merge, publish, distribute, sublicense, and/or sell
-#copies of the Software, and to permit persons to whom the
-#Software is furnished to do so, subject to the following
-#conditions:
-##
-#The above copyright notice and this permission notice shall be
-#included in all copies or substantial portions of the Software.
-#
-#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-#EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-#OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-#NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-#HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-#WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-#FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-#OTHER DEALINGS IN THE SOFTWARE.
-#
-
-
-if [[ -n "$JSDOCDIR" ]]; then
-        _DOCDIR="-Djsdoc.dir=$JSDOCDIR"
-        _APPDIR="$JSDOCDIR/app"
-	_BASEDIR="$JSDOCDIR"
-else
-        _DOCDIR=""
-        _APPDIR="./app"
-	_BASEDIR="."
-fi
-
-if [[ -n "$JSDOCTEMPLATEDIR" ]]; then
-        _TDIR="-Djsdoc.template.dir=$JSDOCTEMPLATEDIR"
-else
-        _TDIR=""
-fi
-
-CMD="java $_DOCDIR $_TDIR -jar $_BASEDIR/jsrun.jar $_APPDIR/run.js $@"
-echo $CMD
-$CMD
-
--- a/sbin/res/jsdoc/out/jsdoc/files.html	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,216 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-	<head>
-		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
-		
-		<title>JsDoc Reference - File Index</title>
-		<meta name="generator" content="JsDoc Toolkit" />
-		
-		<style type="text/css">
-		/* default.css */
-body
-{
-	font: 12px "Lucida Grande", Tahoma, Arial, Helvetica, sans-serif;
-	width: 800px;
-}
-
-.header
-{
-	clear: both;
-	background-color: #ccc;
-	padding: 8px;
-}
-
-h1
-{
-	font-size: 150%;
-	font-weight: bold;
-	padding: 0;
-	margin: 1em 0 0 .3em;
-}
-
-hr
-{
-	border: none 0;
-	border-top: 1px solid #7F8FB1;
-	height: 1px;
-}
-
-pre.code
-{
-	display: block;
-	padding: 8px;
-	border: 1px dashed #ccc;
-}
-
-#index
-{
-	margin-top: 24px;
-	float: left;
-	width: 160px;
-	position: absolute;
-	left: 8px;
-	background-color: #F3F3F3;
-	padding: 8px;
-}
-
-#content
-{
-	margin-left: 190px;
-	width: 600px;
-}
-
-.classList
-{
-	list-style-type: none;
-	padding: 0;
-	margin: 0 0 0 8px;
-	font-family: arial, sans-serif;
-	font-size: 1em;
-	overflow: auto;
-}
-
-.classList li
-{
-	padding: 0;
-	margin: 0 0 8px 0;
-}
-
-.summaryTable { width: 100%; }
-
-h1.classTitle
-{
-	font-size:170%;
-	line-height:130%;
-}
-
-h2 { font-size: 110%; }
-caption, div.sectionTitle
-{
-	background-color: #7F8FB1;
-	color: #fff;
-	font-size:130%;
-	text-align: left;
-	padding: 2px 6px 2px 6px;
-	border: 1px #7F8FB1 solid;
-}
-
-div.sectionTitle { margin-bottom: 8px; }
-.summaryTable thead { display: none; }
-
-.summaryTable td
-{
-	vertical-align: top;
-	padding: 4px;
-	border-bottom: 1px #7F8FB1 solid;
-	border-right: 1px #7F8FB1 solid;
-}
-
-/*col#summaryAttributes {}*/
-.summaryTable td.attributes
-{
-	border-left: 1px #7F8FB1 solid;
-	width: 140px;
-	text-align: right;
-}
-
-td.attributes, .fixedFont
-{
-	line-height: 15px;
-	color: #002EBE;
-	font-family: "Courier New",Courier,monospace;
-	font-size: 13px;
-}
-
-.summaryTable td.nameDescription
-{
-	text-align: left;
-	font-size: 13px;
-	line-height: 15px;
-}
-
-.summaryTable td.nameDescription, .description
-{
-	line-height: 15px;
-	padding: 4px;
-	padding-left: 4px;
-}
-
-.summaryTable { margin-bottom: 8px; }
-
-ul.inheritsList
-{
-	list-style: square;
-	margin-left: 20px;
-	padding-left: 0;
-}
-
-.detailList {
-	margin-left: 20px; 
-	line-height: 15px;
-}
-.detailList dt { margin-left: 20px; }
-
-.detailList .heading
-{
-	font-weight: bold;
-	padding-bottom: 6px;
-	margin-left: 0;
-}
-
-.light, td.attributes, .light a:link, .light a:visited
-{
-	color: #777;
-	font-style: italic;
-}
-
-.fineprint
-{
-	text-align: right;
-	font-size: 10px;
-}
-		</style>
-	</head>
-	
-	<body>
-		<div id="header">
-</div>
-		
-		<div id="index">
-			<div align="center"><a href="index.html">Class Index</a>
-| <a href="files.html">File Index</a></div>
-<hr />
-<h2>Classes</h2>
-<ul class="classList">
-	
-	<li><i><a href="symbols/_global_.html">_global_</a></i></li>
-	
-</ul>
-<hr />
-		</div>
-		
-		<div id="content">
-			<h1 class="classTitle">File Index</h1>
-			
-			
-			<div>
-				<h2><a href="symbols/src/LdtPlayer-release.js.html">LdtPlayer-release.js</a></h2>
-				
-				<dl>
-					
-					
-					
-					
-				</dl>
-			</div>
-			<hr />
-			
-			
-		</div>
-		<div class="fineprint" style="clear:both">
-			
-			Documentation generated by <a href="http://code.google.com/p/jsdoc-toolkit/" target="_blankt">JsDoc Toolkit</a> 2.4.0 on Fri Dec 23 2011 10:50:32 GMT+0100 (CET)
-		</div>
-	</body>
-</html>
\ No newline at end of file
--- a/sbin/res/jsdoc/out/jsdoc/index.html	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,210 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-	<head>
-		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
-		
-		<title>JsDoc Reference - Index</title>
-		<meta name="generator" content="JsDoc Toolkit" />
-		
-		<style type="text/css">
-		/* default.css */
-body
-{
-	font: 12px "Lucida Grande", Tahoma, Arial, Helvetica, sans-serif;
-	width: 800px;
-}
-
-.header
-{
-	clear: both;
-	background-color: #ccc;
-	padding: 8px;
-}
-
-h1
-{
-	font-size: 150%;
-	font-weight: bold;
-	padding: 0;
-	margin: 1em 0 0 .3em;
-}
-
-hr
-{
-	border: none 0;
-	border-top: 1px solid #7F8FB1;
-	height: 1px;
-}
-
-pre.code
-{
-	display: block;
-	padding: 8px;
-	border: 1px dashed #ccc;
-}
-
-#index
-{
-	margin-top: 24px;
-	float: left;
-	width: 160px;
-	position: absolute;
-	left: 8px;
-	background-color: #F3F3F3;
-	padding: 8px;
-}
-
-#content
-{
-	margin-left: 190px;
-	width: 600px;
-}
-
-.classList
-{
-	list-style-type: none;
-	padding: 0;
-	margin: 0 0 0 8px;
-	font-family: arial, sans-serif;
-	font-size: 1em;
-	overflow: auto;
-}
-
-.classList li
-{
-	padding: 0;
-	margin: 0 0 8px 0;
-}
-
-.summaryTable { width: 100%; }
-
-h1.classTitle
-{
-	font-size:170%;
-	line-height:130%;
-}
-
-h2 { font-size: 110%; }
-caption, div.sectionTitle
-{
-	background-color: #7F8FB1;
-	color: #fff;
-	font-size:130%;
-	text-align: left;
-	padding: 2px 6px 2px 6px;
-	border: 1px #7F8FB1 solid;
-}
-
-div.sectionTitle { margin-bottom: 8px; }
-.summaryTable thead { display: none; }
-
-.summaryTable td
-{
-	vertical-align: top;
-	padding: 4px;
-	border-bottom: 1px #7F8FB1 solid;
-	border-right: 1px #7F8FB1 solid;
-}
-
-/*col#summaryAttributes {}*/
-.summaryTable td.attributes
-{
-	border-left: 1px #7F8FB1 solid;
-	width: 140px;
-	text-align: right;
-}
-
-td.attributes, .fixedFont
-{
-	line-height: 15px;
-	color: #002EBE;
-	font-family: "Courier New",Courier,monospace;
-	font-size: 13px;
-}
-
-.summaryTable td.nameDescription
-{
-	text-align: left;
-	font-size: 13px;
-	line-height: 15px;
-}
-
-.summaryTable td.nameDescription, .description
-{
-	line-height: 15px;
-	padding: 4px;
-	padding-left: 4px;
-}
-
-.summaryTable { margin-bottom: 8px; }
-
-ul.inheritsList
-{
-	list-style: square;
-	margin-left: 20px;
-	padding-left: 0;
-}
-
-.detailList {
-	margin-left: 20px; 
-	line-height: 15px;
-}
-.detailList dt { margin-left: 20px; }
-
-.detailList .heading
-{
-	font-weight: bold;
-	padding-bottom: 6px;
-	margin-left: 0;
-}
-
-.light, td.attributes, .light a:link, .light a:visited
-{
-	color: #777;
-	font-style: italic;
-}
-
-.fineprint
-{
-	text-align: right;
-	font-size: 10px;
-}
-		</style>
-	</head>
-	
-	<body>
-		<div id="header">
-</div>
-		
-		<div id="index">
-			<div align="center"><a href="index.html">Class Index</a>
-| <a href="files.html">File Index</a></div>
-<hr />
-<h2>Classes</h2>
-<ul class="classList">
-	
-	<li><i><a href="symbols/_global_.html">_global_</a></i></li>
-	
-</ul>
-<hr />
-		</div>
-		
-		<div id="content">
-			<h1 class="classTitle">Class Index</h1>
-			
-			
-			<div>
-				<h2><a href="symbols/_global_.html">_global_</a></h2>
-				
-			</div>
-			<hr />
-			
-			
-		</div>
-		<div class="fineprint" style="clear:both">
-			
-			Documentation generated by <a href="http://code.google.com/p/jsdoc-toolkit/" target="_blankt">JsDoc Toolkit</a> 2.4.0 on Fri Dec 23 2011 10:50:32 GMT+0100 (CET)
-		</div>
-	</body>
-</html>
\ No newline at end of file
--- a/sbin/res/jsdoc/out/jsdoc/symbols/_global_.html	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,778 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-	<head>
-		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
-		<meta name="generator" content="JsDoc Toolkit" />
-		
-		<title>JsDoc Reference - _global_</title>
-
-		<style type="text/css">
-			/* default.css */
-body
-{
-	font: 12px "Lucida Grande", Tahoma, Arial, Helvetica, sans-serif;
-	width: 800px;
-}
-
-.header
-{
-	clear: both;
-	background-color: #ccc;
-	padding: 8px;
-}
-
-h1
-{
-	font-size: 150%;
-	font-weight: bold;
-	padding: 0;
-	margin: 1em 0 0 .3em;
-}
-
-hr
-{
-	border: none 0;
-	border-top: 1px solid #7F8FB1;
-	height: 1px;
-}
-
-pre.code
-{
-	display: block;
-	padding: 8px;
-	border: 1px dashed #ccc;
-}
-
-#index
-{
-	margin-top: 24px;
-	float: left;
-	width: 160px;
-	position: absolute;
-	left: 8px;
-	background-color: #F3F3F3;
-	padding: 8px;
-}
-
-#content
-{
-	margin-left: 190px;
-	width: 600px;
-}
-
-.classList
-{
-	list-style-type: none;
-	padding: 0;
-	margin: 0 0 0 8px;
-	font-family: arial, sans-serif;
-	font-size: 1em;
-	overflow: auto;
-}
-
-.classList li
-{
-	padding: 0;
-	margin: 0 0 8px 0;
-}
-
-.summaryTable { width: 100%; }
-
-h1.classTitle
-{
-	font-size:170%;
-	line-height:130%;
-}
-
-h2 { font-size: 110%; }
-caption, div.sectionTitle
-{
-	background-color: #7F8FB1;
-	color: #fff;
-	font-size:130%;
-	text-align: left;
-	padding: 2px 6px 2px 6px;
-	border: 1px #7F8FB1 solid;
-}
-
-div.sectionTitle { margin-bottom: 8px; }
-.summaryTable thead { display: none; }
-
-.summaryTable td
-{
-	vertical-align: top;
-	padding: 4px;
-	border-bottom: 1px #7F8FB1 solid;
-	border-right: 1px #7F8FB1 solid;
-}
-
-/*col#summaryAttributes {}*/
-.summaryTable td.attributes
-{
-	border-left: 1px #7F8FB1 solid;
-	width: 140px;
-	text-align: right;
-}
-
-td.attributes, .fixedFont
-{
-	line-height: 15px;
-	color: #002EBE;
-	font-family: "Courier New",Courier,monospace;
-	font-size: 13px;
-}
-
-.summaryTable td.nameDescription
-{
-	text-align: left;
-	font-size: 13px;
-	line-height: 15px;
-}
-
-.summaryTable td.nameDescription, .description
-{
-	line-height: 15px;
-	padding: 4px;
-	padding-left: 4px;
-}
-
-.summaryTable { margin-bottom: 8px; }
-
-ul.inheritsList
-{
-	list-style: square;
-	margin-left: 20px;
-	padding-left: 0;
-}
-
-.detailList {
-	margin-left: 20px; 
-	line-height: 15px;
-}
-.detailList dt { margin-left: 20px; }
-
-.detailList .heading
-{
-	font-weight: bold;
-	padding-bottom: 6px;
-	margin-left: 0;
-}
-
-.light, td.attributes, .light a:link, .light a:visited
-{
-	color: #777;
-	font-style: italic;
-}
-
-.fineprint
-{
-	text-align: right;
-	font-size: 10px;
-}
-		</style>
-	</head>
-
-	<body>
-<!-- ============================== header ================================= -->	
-		<!-- begin static/header.html -->
-		<div id="header">
-</div>
-		<!-- end static/header.html -->
-
-<!-- ============================== classes index ============================ -->
-		<div id="index">
-			<!-- begin publish.classesIndex -->
-			<div align="center"><a href="../index.html">Class Index</a>
-| <a href="../files.html">File Index</a></div>
-<hr />
-<h2>Classes</h2>
-<ul class="classList">
-	
-	<li><i><a href="../symbols/_global_.html">_global_</a></i></li>
-	
-</ul>
-<hr />
-			<!-- end publish.classesIndex -->
-		</div>
-		
-		<div id="content">
-<!-- ============================== class title ============================ -->
-			<h1 class="classTitle">
-				
-				Built-In Namespace _global_
-			</h1>
-
-<!-- ============================== class summary ========================== -->			
-			<p class="description">
-				
-				
-			
-				
-				
-				
-			</p>
-
-<!-- ============================== constructor summary ==================== -->			
-			
-
-<!-- ============================== properties summary ===================== -->
-			
-				
-				
-				<table class="summaryTable" cellspacing="0" summary="A summary of the fields documented in the class _global_.">
-					<caption>Field Summary</caption>
-					<thead>
-						<tr>
-							<th scope="col">Field Attributes</th>
-							<th scope="col">Field Name and Description</th>
-						</tr>
-					</thead>
-					<tbody>
-					
-						<tr>
-							<td class="attributes">&nbsp;</td>
-							<td class="nameDescription">
-								<div class="fixedFont">
-								<b><a href="../symbols/_global_.html#Mustache">Mustache</a></b>
-								</div>
-								<div class="description"></div>
-							</td>
-						</tr>
-					
-					</tbody>
-				</table>
-				
-				
-				
-			
-
-<!-- ============================== methods summary ======================== -->
-			
-				
-				
-				<table class="summaryTable" cellspacing="0" summary="A summary of the methods documented in the class _global_.">
-					<caption>Method Summary</caption>
-					<thead>
-						<tr>
-							<th scope="col">Method Attributes</th>
-							<th scope="col">Method Name and Description</th>
-						</tr>
-					</thead>
-					<tbody>
-					
-						<tr>
-							<td class="attributes">&nbsp;</td>
-							<td class="nameDescription">
-								<div class="fixedFont"><b><a href="../symbols/_global_.html#b">b</a></b>(a)
-								</div>
-								<div class="description"></div>
-							</td>
-						</tr>
-					
-						<tr>
-							<td class="attributes">&nbsp;</td>
-							<td class="nameDescription">
-								<div class="fixedFont"><b><a href="../symbols/_global_.html#Clusters">Clusters</a></b>(json)
-								</div>
-								<div class="description"></div>
-							</td>
-						</tr>
-					
-						<tr>
-							<td class="attributes">&nbsp;</td>
-							<td class="nameDescription">
-								<div class="fixedFont"><b><a href="../symbols/_global_.html#d">d</a></b>()
-								</div>
-								<div class="description"></div>
-							</td>
-						</tr>
-					
-						<tr>
-							<td class="attributes">&nbsp;</td>
-							<td class="nameDescription">
-								<div class="fixedFont"><b><a href="../symbols/_global_.html#finished_cb">finished_cb</a></b>()
-								</div>
-								<div class="description"></div>
-							</td>
-						</tr>
-					
-						<tr>
-							<td class="attributes">&nbsp;</td>
-							<td class="nameDescription">
-								<div class="fixedFont"><b><a href="../symbols/_global_.html#Frames">Frames</a></b>(json)
-								</div>
-								<div class="description"></div>
-							</td>
-						</tr>
-					
-						<tr>
-							<td class="attributes">&nbsp;</td>
-							<td class="nameDescription">
-								<div class="fixedFont"><b><a href="../symbols/_global_.html#handler">handler</a></b>()
-								</div>
-								<div class="description"></div>
-							</td>
-						</tr>
-					
-						<tr>
-							<td class="attributes">&nbsp;</td>
-							<td class="nameDescription">
-								<div class="fixedFont"><b><a href="../symbols/_global_.html#J">J</a></b>(a, c)
-								</div>
-								<div class="description"></div>
-							</td>
-						</tr>
-					
-						<tr>
-							<td class="attributes">&nbsp;</td>
-							<td class="nameDescription">
-								<div class="fixedFont"><b><a href="../symbols/_global_.html#log_error">log_error</a></b>(msg, err)
-								</div>
-								<div class="description"></div>
-							</td>
-						</tr>
-					
-						<tr>
-							<td class="attributes">&nbsp;</td>
-							<td class="nameDescription">
-								<div class="fixedFont"><b><a href="../symbols/_global_.html#log_msg">log_msg</a></b>(msg)
-								</div>
-								<div class="description"></div>
-							</td>
-						</tr>
-					
-						<tr>
-							<td class="attributes">&nbsp;</td>
-							<td class="nameDescription">
-								<div class="fixedFont"><b><a href="../symbols/_global_.html#ready_cb">ready_cb</a></b>()
-								</div>
-								<div class="description"></div>
-							</td>
-						</tr>
-					
-					</tbody>
-				</table>
-				
-				
-				
-			
-<!-- ============================== events summary ======================== -->
-			
-
-<!-- ============================== constructor details ==================== -->		
-			
-
-<!-- ============================== field details ========================== -->		
-			
-				<div class="sectionTitle">
-					Field Detail
-				</div>
-				
-					<a name="Mustache"> </a>
-					<div class="fixedFont">
-					
-					
-					<b>Mustache</b>
-					
-					</div>
-					<div class="description">
-						
-						
-							<br />
-							<i>Defined in: </i> <a href="../symbols/src/LdtPlayer-release.js.html">LdtPlayer-release.js</a>.
-						
-						
-					</div>
-					
-					
-
-						
-						
-						
-						
-
-					
-				
-			
-
-<!-- ============================== method details ========================= -->		
-			
-				<div class="sectionTitle">
-					Method Detail
-				</div>
-				
-					<a name="b"> </a>
-					<div class="fixedFont">
-					
-					
-					<b>b</b>(a)
-					
-					</div>
-					<div class="description">
-						
-						
-							<br />
-							<i>Defined in: </i> <a href="../symbols/src/LdtPlayer-release.js.html">LdtPlayer-release.js</a>.
-						
-						
-					</div>
-					
-					
-					
-						
-							<dl class="detailList">
-							<dt class="heading">Parameters:</dt>
-							
-								<dt>
-									<b>a</b>
-									
-								</dt>
-								<dd></dd>
-							
-							</dl>
-						
-						
-						
-						
-						
-						
-						
-
-					<hr />
-				
-					<a name="Clusters"> </a>
-					<div class="fixedFont">
-					
-					
-					<b>Clusters</b>(json)
-					
-					</div>
-					<div class="description">
-						
-						
-							<br />
-							<i>Defined in: </i> <a href="../symbols/src/LdtPlayer-release.js.html">LdtPlayer-release.js</a>.
-						
-						
-					</div>
-					
-					
-					
-						
-							<dl class="detailList">
-							<dt class="heading">Parameters:</dt>
-							
-								<dt>
-									<b>json</b>
-									
-								</dt>
-								<dd></dd>
-							
-							</dl>
-						
-						
-						
-						
-						
-						
-						
-
-					<hr />
-				
-					<a name="d"> </a>
-					<div class="fixedFont">
-					
-					
-					<b>d</b>()
-					
-					</div>
-					<div class="description">
-						
-						
-							<br />
-							<i>Defined in: </i> <a href="../symbols/src/LdtPlayer-release.js.html">LdtPlayer-release.js</a>.
-						
-						
-					</div>
-					
-					
-					
-						
-						
-						
-						
-						
-						
-						
-
-					<hr />
-				
-					<a name="finished_cb"> </a>
-					<div class="fixedFont">
-					
-					
-					<b>finished_cb</b>()
-					
-					</div>
-					<div class="description">
-						
-						
-							<br />
-							<i>Defined in: </i> <a href="../symbols/src/LdtPlayer-release.js.html">LdtPlayer-release.js</a>.
-						
-						
-					</div>
-					
-					
-					
-						
-						
-						
-						
-						
-						
-						
-
-					<hr />
-				
-					<a name="Frames"> </a>
-					<div class="fixedFont">
-					
-					
-					<b>Frames</b>(json)
-					
-					</div>
-					<div class="description">
-						
-						
-							<br />
-							<i>Defined in: </i> <a href="../symbols/src/LdtPlayer-release.js.html">LdtPlayer-release.js</a>.
-						
-						
-					</div>
-					
-					
-					
-						
-							<dl class="detailList">
-							<dt class="heading">Parameters:</dt>
-							
-								<dt>
-									<b>json</b>
-									
-								</dt>
-								<dd></dd>
-							
-							</dl>
-						
-						
-						
-						
-						
-						
-						
-
-					<hr />
-				
-					<a name="handler"> </a>
-					<div class="fixedFont">
-					
-					
-					<b>handler</b>()
-					
-					</div>
-					<div class="description">
-						
-						
-							<br />
-							<i>Defined in: </i> <a href="../symbols/src/LdtPlayer-release.js.html">LdtPlayer-release.js</a>.
-						
-						
-					</div>
-					
-					
-					
-						
-						
-						
-						
-						
-						
-						
-
-					<hr />
-				
-					<a name="J"> </a>
-					<div class="fixedFont">
-					
-					
-					<b>J</b>(a, c)
-					
-					</div>
-					<div class="description">
-						
-						
-							<br />
-							<i>Defined in: </i> <a href="../symbols/src/LdtPlayer-release.js.html">LdtPlayer-release.js</a>.
-						
-						
-					</div>
-					
-					
-					
-						
-							<dl class="detailList">
-							<dt class="heading">Parameters:</dt>
-							
-								<dt>
-									<b>a</b>
-									
-								</dt>
-								<dd></dd>
-							
-								<dt>
-									<b>c</b>
-									
-								</dt>
-								<dd></dd>
-							
-							</dl>
-						
-						
-						
-						
-						
-						
-						
-
-					<hr />
-				
-					<a name="log_error"> </a>
-					<div class="fixedFont">
-					
-					
-					<b>log_error</b>(msg, err)
-					
-					</div>
-					<div class="description">
-						
-						
-							<br />
-							<i>Defined in: </i> <a href="../symbols/src/LdtPlayer-release.js.html">LdtPlayer-release.js</a>.
-						
-						
-					</div>
-					
-					
-					
-						
-							<dl class="detailList">
-							<dt class="heading">Parameters:</dt>
-							
-								<dt>
-									<b>msg</b>
-									
-								</dt>
-								<dd></dd>
-							
-								<dt>
-									<b>err</b>
-									
-								</dt>
-								<dd></dd>
-							
-							</dl>
-						
-						
-						
-						
-						
-						
-						
-
-					<hr />
-				
-					<a name="log_msg"> </a>
-					<div class="fixedFont">
-					
-					
-					<b>log_msg</b>(msg)
-					
-					</div>
-					<div class="description">
-						
-						
-							<br />
-							<i>Defined in: </i> <a href="../symbols/src/LdtPlayer-release.js.html">LdtPlayer-release.js</a>.
-						
-						
-					</div>
-					
-					
-					
-						
-							<dl class="detailList">
-							<dt class="heading">Parameters:</dt>
-							
-								<dt>
-									<b>msg</b>
-									
-								</dt>
-								<dd></dd>
-							
-							</dl>
-						
-						
-						
-						
-						
-						
-						
-
-					<hr />
-				
-					<a name="ready_cb"> </a>
-					<div class="fixedFont">
-					
-					
-					<b>ready_cb</b>()
-					
-					</div>
-					<div class="description">
-						
-						
-							<br />
-							<i>Defined in: </i> <a href="../symbols/src/LdtPlayer-release.js.html">LdtPlayer-release.js</a>.
-						
-						
-					</div>
-					
-					
-					
-						
-						
-						
-						
-						
-						
-						
-
-					
-				
-			
-			
-<!-- ============================== event details ========================= -->		
-			
-			
-			<hr />
-		</div>
-
-		
-<!-- ============================== footer ================================= -->
-		<div class="fineprint" style="clear:both">
-			
-			Documentation generated by <a href="http://code.google.com/p/jsdoc-toolkit/" target="_blank">JsDoc Toolkit</a> 2.4.0 on Fri Dec 23 2011 10:50:32 GMT+0100 (CET)
-		</div>
-	</body>
-</html>
--- a/sbin/res/jsdoc/out/jsdoc/symbols/src/LdtPlayer-release.js.html	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3549 +0,0 @@
-<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"> <style>
-	.KEYW {color: #933;}
-	.COMM {color: #bbb; font-style: italic;}
-	.NUMB {color: #393;}
-	.STRN {color: #393;}
-	.REGX {color: #339;}
-	.line {border-right: 1px dotted #666; color: #666; font-style: normal;}
-	</style></head><body><pre><span class='line'>  1</span> <span class="COMM">/* 
-<span class='line'>  2</span>  * 	
-<span class='line'>  3</span>  *	Copyright 2010 Institut de recherche et d'innovation 
-<span class='line'>  4</span>  *	contributor(s) : Samuel Huron 
-<span class='line'>  5</span>  *	 
-<span class='line'>  6</span>  *	contact@iri.centrepompidou.fr
-<span class='line'>  7</span>  *	http://www.iri.centrepompidou.fr 
-<span class='line'>  8</span>  *	 
-<span class='line'>  9</span>  *	This software is a computer program whose purpose is to show and add annotations on a video .
-<span class='line'> 10</span>  *	This software is governed by the CeCILL-C license under French law and
-<span class='line'> 11</span>  *	abiding by the rules of distribution of free software. You can  use, 
-<span class='line'> 12</span>  *	modify and/ or redistribute the software under the terms of the CeCILL-C
-<span class='line'> 13</span>  *	license as circulated by CEA, CNRS and INRIA at the following URL
-<span class='line'> 14</span>  *	"http://www.cecill.info". 
-<span class='line'> 15</span>  *	
-<span class='line'> 16</span>  *	The fact that you are presently reading this means that you have had
-<span class='line'> 17</span>  *	knowledge of the CeCILL-C license and that you accept its terms.
-<span class='line'> 18</span> */</span><span class="WHIT">
-<span class='line'> 19</span> </span><span class="COMM">/*! LAB.js (LABjs :: Loading And Blocking JavaScript)
-<span class='line'> 20</span>     v2.0.3 (c) Kyle Simpson
-<span class='line'> 21</span>     MIT License
-<span class='line'> 22</span> */</span><span class="WHIT">
-<span class='line'> 23</span> 
-<span class='line'> 24</span> </span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">global</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'> 25</span> </span><span class="WHIT">	</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">_$LAB</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">global.$LAB</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'> 26</span> </span><span class="WHIT">	
-<span class='line'> 27</span> 		</span><span class="COMM">// constants for the valid keys of the options object</span><span class="WHIT">
-<span class='line'> 28</span> </span><span class="WHIT">		</span><span class="NAME">_UseLocalXHR</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"UseLocalXHR"</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'> 29</span> </span><span class="WHIT">		</span><span class="NAME">_AlwaysPreserveOrder</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"AlwaysPreserveOrder"</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'> 30</span> </span><span class="WHIT">		</span><span class="NAME">_AllowDuplicates</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"AllowDuplicates"</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'> 31</span> </span><span class="WHIT">		</span><span class="NAME">_CacheBust</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"CacheBust"</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'> 32</span> </span><span class="WHIT">		</span><span class="COMM">/*!START_DEBUG*/</span><span class="NAME">_Debug</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"Debug"</span><span class="PUNC">,</span><span class="COMM">/*!END_DEBUG*/</span><span class="WHIT">
-<span class='line'> 33</span> </span><span class="WHIT">		</span><span class="NAME">_BasePath</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"BasePath"</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'> 34</span> </span><span class="WHIT">		
-<span class='line'> 35</span> 		</span><span class="COMM">// stateless variables used across all $LAB instances</span><span class="WHIT">
-<span class='line'> 36</span> </span><span class="WHIT">		</span><span class="NAME">root_page</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="REGX">/^[^?#]*\//</span><span class="PUNC">.</span><span class="NAME">exec</span><span class="PUNC">(</span><span class="NAME">location.href</span><span class="PUNC">)</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'> 37</span> </span><span class="WHIT">		</span><span class="NAME">root_domain</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="REGX">/^\w+\:\/\/\/?[^\/]+/</span><span class="PUNC">.</span><span class="NAME">exec</span><span class="PUNC">(</span><span class="NAME">root_page</span><span class="PUNC">)</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'> 38</span> </span><span class="WHIT">		</span><span class="NAME">append_to</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">document.head</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">document.getElementsByTagName</span><span class="PUNC">(</span><span class="STRN">"head"</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'> 39</span> </span><span class="WHIT">		
-<span class='line'> 40</span> 		</span><span class="COMM">// inferences... ick, but still necessary</span><span class="WHIT">
-<span class='line'> 41</span> </span><span class="WHIT">		</span><span class="NAME">opera_or_gecko</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">global.opera</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">Object.prototype.toString.call</span><span class="PUNC">(</span><span class="NAME">global.opera</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">"[object Opera]"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="STRN">"MozAppearance"</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">document.documentElement.style</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'> 42</span> 
-<span class='line'> 43</span> </span><span class="COMM">/*!START_DEBUG*/</span><span class="WHIT">
-<span class='line'> 44</span> </span><span class="WHIT">		</span><span class="COMM">// console.log() and console.error() wrappers</span><span class="WHIT">
-<span class='line'> 45</span> </span><span class="WHIT">		</span><span class="NAME">log_msg</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT"> 
-<span class='line'> 46</span> 		</span><span class="NAME">log_error</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">log_msg</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'> 47</span> </span><span class="COMM">/*!END_DEBUG*/</span><span class="WHIT">
-<span class='line'> 48</span> </span><span class="WHIT">		
-<span class='line'> 49</span> 		</span><span class="COMM">// feature sniffs (yay!)</span><span class="WHIT">
-<span class='line'> 50</span> </span><span class="WHIT">		</span><span class="NAME">test_script_elem</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">document.createElement</span><span class="PUNC">(</span><span class="STRN">"script"</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'> 51</span> </span><span class="WHIT">		</span><span class="NAME">explicit_preloading</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">test_script_elem.preload</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">"boolean"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="COMM">// http://wiki.whatwg.org/wiki/Script_Execution_Control#Proposal_1_.28Nicholas_Zakas.29</span><span class="WHIT">
-<span class='line'> 52</span> </span><span class="WHIT">		</span><span class="NAME">real_preloading</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">explicit_preloading</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">test_script_elem.readyState</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">test_script_elem.readyState</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">"uninitialized"</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="COMM">// will a script preload with `src` set before DOM append?</span><span class="WHIT">
-<span class='line'> 53</span> </span><span class="WHIT">		</span><span class="NAME">script_ordered_async</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="NAME">real_preloading</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">test_script_elem.async</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="COMM">// http://wiki.whatwg.org/wiki/Dynamic_Script_Execution_Order</span><span class="WHIT">
-<span class='line'> 54</span> </span><span class="WHIT">		
-<span class='line'> 55</span> 		</span><span class="COMM">// XHR preloading (same-domain) and cache-preloading (remote-domain) are the fallbacks (for some browsers)</span><span class="WHIT">
-<span class='line'> 56</span> </span><span class="WHIT">		</span><span class="NAME">xhr_or_cache_preloading</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="NAME">real_preloading</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="NAME">script_ordered_async</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="NAME">opera_or_gecko</span><span class="WHIT">
-<span class='line'> 57</span> </span><span class="WHIT">	</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'> 58</span> 
-<span class='line'> 59</span> </span><span class="COMM">/*!START_DEBUG*/</span><span class="WHIT">
-<span class='line'> 60</span> </span><span class="WHIT">	</span><span class="COMM">// define console wrapper functions if applicable</span><span class="WHIT">
-<span class='line'> 61</span> </span><span class="WHIT">	</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">global.console</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">global.console.log</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'> 62</span> </span><span class="WHIT">		</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">global.console.error</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="NAME">global.console.error</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">global.console.log</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'> 63</span> </span><span class="WHIT">		</span><span class="NAME">log_msg</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">msg</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">global.console.log</span><span class="PUNC">(</span><span class="NAME">msg</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'> 64</span> </span><span class="WHIT">		</span><span class="NAME">log_error</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">msg</span><span class="PUNC">,</span><span class="NAME">err</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">global.console.error</span><span class="PUNC">(</span><span class="NAME">msg</span><span class="PUNC">,</span><span class="NAME">err</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'> 65</span> </span><span class="WHIT">	</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'> 66</span> </span><span class="COMM">/*!END_DEBUG*/</span><span class="WHIT">
-<span class='line'> 67</span> 
-<span class='line'> 68</span> </span><span class="WHIT">	</span><span class="COMM">// test for function</span><span class="WHIT">
-<span class='line'> 69</span> </span><span class="WHIT">	</span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">is_func</span><span class="PUNC">(</span><span class="NAME">func</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">Object.prototype.toString.call</span><span class="PUNC">(</span><span class="NAME">func</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">"[object Function]"</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'> 70</span> 
-<span class='line'> 71</span> </span><span class="WHIT">	</span><span class="COMM">// test for array</span><span class="WHIT">
-<span class='line'> 72</span> </span><span class="WHIT">	</span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">is_array</span><span class="PUNC">(</span><span class="NAME">arr</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">Object.prototype.toString.call</span><span class="PUNC">(</span><span class="NAME">arr</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">"[object Array]"</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'> 73</span> 
-<span class='line'> 74</span> </span><span class="WHIT">	</span><span class="COMM">// make script URL absolute/canonical</span><span class="WHIT">
-<span class='line'> 75</span> </span><span class="WHIT">	</span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">canonical_uri</span><span class="PUNC">(</span><span class="NAME">src</span><span class="PUNC">,</span><span class="NAME">base_path</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'> 76</span> </span><span class="WHIT">		</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">absolute_regex</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="REGX">/^\w+\:\/\//</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'> 77</span> </span><span class="WHIT">		
-<span class='line'> 78</span> 		</span><span class="COMM">// is `src` is protocol-relative (begins with // or ///), prepend protocol</span><span class="WHIT">
-<span class='line'> 79</span> </span><span class="WHIT">		</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="REGX">/^\/\/\/?/</span><span class="PUNC">.</span><span class="NAME">test</span><span class="PUNC">(</span><span class="NAME">src</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'> 80</span> </span><span class="WHIT">			</span><span class="NAME">src</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">location.protocol</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">src</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'> 81</span> </span><span class="WHIT">		</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'> 82</span> </span><span class="WHIT">		</span><span class="COMM">// is `src` page-relative? (not an absolute URL, and not a domain-relative path, beginning with /)</span><span class="WHIT">
-<span class='line'> 83</span> </span><span class="WHIT">		</span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">absolute_regex.test</span><span class="PUNC">(</span><span class="NAME">src</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">src.charAt</span><span class="PUNC">(</span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="STRN">"/"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'> 84</span> </span><span class="WHIT">			</span><span class="COMM">// prepend `base_path`, if any</span><span class="WHIT">
-<span class='line'> 85</span> </span><span class="WHIT">			</span><span class="NAME">src</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">base_path</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">src</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'> 86</span> </span><span class="WHIT">		</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'> 87</span> </span><span class="WHIT">		</span><span class="COMM">// make sure to return `src` as absolute</span><span class="WHIT">
-<span class='line'> 88</span> </span><span class="WHIT">		</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">absolute_regex.test</span><span class="PUNC">(</span><span class="NAME">src</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="NAME">src</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">(</span><span class="NAME">src.charAt</span><span class="PUNC">(</span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">"/"</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="NAME">root_domain</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">root_page</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">src</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'> 89</span> </span><span class="WHIT">	</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'> 90</span> 
-<span class='line'> 91</span> </span><span class="WHIT">	</span><span class="COMM">// merge `source` into `target`</span><span class="WHIT">
-<span class='line'> 92</span> </span><span class="WHIT">	</span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">merge_objs</span><span class="PUNC">(</span><span class="NAME">source</span><span class="PUNC">,</span><span class="NAME">target</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'> 93</span> </span><span class="WHIT">		</span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">k</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">source</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">source.hasOwnProperty</span><span class="PUNC">(</span><span class="NAME">k</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'> 94</span> </span><span class="WHIT">			</span><span class="NAME">target</span><span class="PUNC">[</span><span class="NAME">k</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">source</span><span class="PUNC">[</span><span class="NAME">k</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">// TODO: does this need to be recursive for our purposes?</span><span class="WHIT">
-<span class='line'> 95</span> </span><span class="WHIT">		</span><span class="PUNC">}</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'> 96</span> </span><span class="WHIT">		</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">target</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'> 97</span> </span><span class="WHIT">	</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'> 98</span> 
-<span class='line'> 99</span> </span><span class="WHIT">	</span><span class="COMM">// does the chain group have any ready-to-execute scripts?</span><span class="WHIT">
-<span class='line'>100</span> </span><span class="WHIT">	</span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">check_chain_group_scripts_ready</span><span class="PUNC">(</span><span class="NAME">chain_group</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>101</span> </span><span class="WHIT">		</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">any_scripts_ready</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>102</span> </span><span class="WHIT">		</span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">&lt;</span><span class="NAME">chain_group.scripts.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>103</span> </span><span class="WHIT">			</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">chain_group.scripts</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">ready</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">chain_group.scripts</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">exec_trigger</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>104</span> </span><span class="WHIT">				</span><span class="NAME">any_scripts_ready</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>105</span> </span><span class="WHIT">				</span><span class="NAME">chain_group.scripts</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">exec_trigger</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>106</span> </span><span class="WHIT">				</span><span class="NAME">chain_group.scripts</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">exec_trigger</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>107</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>108</span> </span><span class="WHIT">		</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>109</span> </span><span class="WHIT">		</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">any_scripts_ready</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>110</span> </span><span class="WHIT">	</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>111</span> 
-<span class='line'>112</span> </span><span class="WHIT">	</span><span class="COMM">// creates a script load listener</span><span class="WHIT">
-<span class='line'>113</span> </span><span class="WHIT">	</span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">create_script_load_listener</span><span class="PUNC">(</span><span class="NAME">elem</span><span class="PUNC">,</span><span class="NAME">registry_item</span><span class="PUNC">,</span><span class="NAME">flag</span><span class="PUNC">,</span><span class="NAME">onload</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>114</span> </span><span class="WHIT">		</span><span class="NAME">elem.onload</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">elem.onreadystatechange</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>115</span> </span><span class="WHIT">			</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">(</span><span class="NAME">elem.readyState</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">elem.readyState</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="STRN">"complete"</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">elem.readyState</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="STRN">"loaded"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">registry_item</span><span class="PUNC">[</span><span class="NAME">flag</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="KEYW">return</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>116</span> </span><span class="WHIT">			</span><span class="NAME">elem.onload</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">elem.onreadystatechange</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>117</span> </span><span class="WHIT">			</span><span class="NAME">onload</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>118</span> </span><span class="WHIT">		</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>119</span> </span><span class="WHIT">	</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>120</span> 
-<span class='line'>121</span> </span><span class="WHIT">	</span><span class="COMM">// script executed handler</span><span class="WHIT">
-<span class='line'>122</span> </span><span class="WHIT">	</span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">script_executed</span><span class="PUNC">(</span><span class="NAME">registry_item</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>123</span> </span><span class="WHIT">		</span><span class="NAME">registry_item.ready</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">registry_item.finished</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>124</span> </span><span class="WHIT">		</span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">&lt;</span><span class="NAME">registry_item.finished_listeners.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>125</span> </span><span class="WHIT">			</span><span class="NAME">registry_item.finished_listeners</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>126</span> </span><span class="WHIT">		</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>127</span> </span><span class="WHIT">		</span><span class="NAME">registry_item.ready_listeners</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>128</span> </span><span class="WHIT">		</span><span class="NAME">registry_item.finished_listeners</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>129</span> </span><span class="WHIT">	</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>130</span> 
-<span class='line'>131</span> </span><span class="WHIT">	</span><span class="COMM">// make the request for a scriptha</span><span class="WHIT">
-<span class='line'>132</span> </span><span class="WHIT">	</span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">request_script</span><span class="PUNC">(</span><span class="NAME">chain_opts</span><span class="PUNC">,</span><span class="NAME">script_obj</span><span class="PUNC">,</span><span class="NAME">registry_item</span><span class="PUNC">,</span><span class="NAME">onload</span><span class="PUNC">,</span><span class="NAME">preload_this_script</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>133</span> </span><span class="WHIT">		</span><span class="COMM">// setTimeout() "yielding" prevents some weird race/crash conditions in older browsers</span><span class="WHIT">
-<span class='line'>134</span> </span><span class="WHIT">		</span><span class="NAME">setTimeout</span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>135</span> </span><span class="WHIT">			</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">script</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">src</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">script_obj.real_src</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">xhr</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>136</span> </span><span class="WHIT">			
-<span class='line'>137</span> 			</span><span class="COMM">// don't proceed until `append_to` is ready to append to</span><span class="WHIT">
-<span class='line'>138</span> </span><span class="WHIT">			</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="STRN">"item"</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">append_to</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="COMM">// check if `append_to` ref is still a live node list</span><span class="WHIT">
-<span class='line'>139</span> </span><span class="WHIT">				</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">append_to</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="COMM">// `append_to` node not yet ready</span><span class="WHIT">
-<span class='line'>140</span> </span><span class="WHIT">					</span><span class="COMM">// try again in a little bit -- note: will re-call the anonymous function in the outer setTimeout, not the parent `request_script()`</span><span class="WHIT">
-<span class='line'>141</span> </span><span class="WHIT">					</span><span class="NAME">setTimeout</span><span class="PUNC">(</span><span class="NAME">arguments.callee</span><span class="PUNC">,</span><span class="NUMB">25</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>142</span> </span><span class="WHIT">					</span><span class="KEYW">return</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>143</span> </span><span class="WHIT">				</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>144</span> </span><span class="WHIT">				</span><span class="COMM">// reassign from live node list ref to pure node ref -- avoids nasty IE bug where changes to DOM invalidate live node lists</span><span class="WHIT">
-<span class='line'>145</span> </span><span class="WHIT">				</span><span class="NAME">append_to</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">append_to</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>146</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>147</span> </span><span class="WHIT">			</span><span class="NAME">script</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">document.createElement</span><span class="PUNC">(</span><span class="STRN">"script"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>148</span> </span><span class="WHIT">			</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">script_obj.type</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="NAME">script.type</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">script_obj.type</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>149</span> </span><span class="WHIT">			</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">script_obj.charset</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="NAME">script.charset</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">script_obj.charset</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>150</span> </span><span class="WHIT">			
-<span class='line'>151</span> 			</span><span class="COMM">// should preloading be used for this script?</span><span class="WHIT">
-<span class='line'>152</span> </span><span class="WHIT">			</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">preload_this_script</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>153</span> </span><span class="WHIT">				</span><span class="COMM">// real script preloading?</span><span class="WHIT">
-<span class='line'>154</span> </span><span class="WHIT">				</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">real_preloading</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>155</span> </span><span class="WHIT">					</span><span class="COMM">/*!START_DEBUG*/</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">chain_opts</span><span class="PUNC">[</span><span class="NAME">_Debug</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="NAME">log_msg</span><span class="PUNC">(</span><span class="STRN">"start script preload: "</span><span class="PUNC">+</span><span class="NAME">src</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="COMM">/*!END_DEBUG*/</span><span class="WHIT">
-<span class='line'>156</span> </span><span class="WHIT">					</span><span class="NAME">registry_item.elem</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">script</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>157</span> </span><span class="WHIT">					</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">explicit_preloading</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="COMM">// explicit preloading (aka, Zakas' proposal)</span><span class="WHIT">
-<span class='line'>158</span> </span><span class="WHIT">						</span><span class="NAME">script.preload</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>159</span> </span><span class="WHIT">						</span><span class="NAME">script.onpreload</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">onload</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>160</span> </span><span class="WHIT">					</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>161</span> </span><span class="WHIT">					</span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>162</span> </span><span class="WHIT">						</span><span class="NAME">script.onreadystatechange</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>163</span> </span><span class="WHIT">							</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">script.readyState</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">"loaded"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="NAME">onload</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>164</span> </span><span class="WHIT">						</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>165</span> </span><span class="WHIT">					</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>166</span> </span><span class="WHIT">					</span><span class="NAME">script.src</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">src</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>167</span> </span><span class="WHIT">					</span><span class="COMM">// NOTE: no append to DOM yet, appending will happen when ready to execute</span><span class="WHIT">
-<span class='line'>168</span> </span><span class="WHIT">				</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>169</span> </span><span class="WHIT">				</span><span class="COMM">// same-domain and XHR allowed? use XHR preloading</span><span class="WHIT">
-<span class='line'>170</span> </span><span class="WHIT">				</span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">preload_this_script</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">src.indexOf</span><span class="PUNC">(</span><span class="NAME">root_domain</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">chain_opts</span><span class="PUNC">[</span><span class="NAME">_UseLocalXHR</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>171</span> </span><span class="WHIT">					</span><span class="NAME">xhr</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">XMLHttpRequest</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">// note: IE never uses XHR (it supports true preloading), so no more need for ActiveXObject fallback for IE &lt;= 7</span><span class="WHIT">
-<span class='line'>172</span> </span><span class="WHIT">					</span><span class="COMM">/*!START_DEBUG*/</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">chain_opts</span><span class="PUNC">[</span><span class="NAME">_Debug</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="NAME">log_msg</span><span class="PUNC">(</span><span class="STRN">"start script preload (xhr): "</span><span class="PUNC">+</span><span class="NAME">src</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="COMM">/*!END_DEBUG*/</span><span class="WHIT">
-<span class='line'>173</span> </span><span class="WHIT">					</span><span class="NAME">xhr.onreadystatechange</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>174</span> </span><span class="WHIT">						</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">xhr.readyState</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="NUMB">4</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>175</span> </span><span class="WHIT">							</span><span class="NAME">xhr.onreadystatechange</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">// fix a memory leak in IE</span><span class="WHIT">
-<span class='line'>176</span> </span><span class="WHIT">							</span><span class="NAME">registry_item.text</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">xhr.responseText</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">"\n//@ sourceURL="</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">src</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">// http://blog.getfirebug.com/2009/08/11/give-your-eval-a-name-with-sourceurl/</span><span class="WHIT">
-<span class='line'>177</span> </span><span class="WHIT">							</span><span class="NAME">onload</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>178</span> </span><span class="WHIT">						</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>179</span> </span><span class="WHIT">					</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>180</span> </span><span class="WHIT">					</span><span class="NAME">xhr.open</span><span class="PUNC">(</span><span class="STRN">"GET"</span><span class="PUNC">,</span><span class="NAME">src</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>181</span> </span><span class="WHIT">					</span><span class="NAME">xhr.send</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>182</span> </span><span class="WHIT">				</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>183</span> </span><span class="WHIT">				</span><span class="COMM">// as a last resort, use cache-preloading</span><span class="WHIT">
-<span class='line'>184</span> </span><span class="WHIT">				</span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>185</span> </span><span class="WHIT">					</span><span class="COMM">/*!START_DEBUG*/</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">chain_opts</span><span class="PUNC">[</span><span class="NAME">_Debug</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="NAME">log_msg</span><span class="PUNC">(</span><span class="STRN">"start script preload (cache): "</span><span class="PUNC">+</span><span class="NAME">src</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="COMM">/*!END_DEBUG*/</span><span class="WHIT">
-<span class='line'>186</span> </span><span class="WHIT">					</span><span class="NAME">script.type</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"text/cache-script"</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>187</span> </span><span class="WHIT">					</span><span class="NAME">create_script_load_listener</span><span class="PUNC">(</span><span class="NAME">script</span><span class="PUNC">,</span><span class="NAME">registry_item</span><span class="PUNC">,</span><span class="STRN">"ready"</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>188</span> </span><span class="WHIT">						</span><span class="NAME">append_to.removeChild</span><span class="PUNC">(</span><span class="NAME">script</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>189</span> </span><span class="WHIT">						</span><span class="NAME">onload</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>190</span> </span><span class="WHIT">					</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>191</span> </span><span class="WHIT">					</span><span class="NAME">script.src</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">src</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>192</span> </span><span class="WHIT">					</span><span class="NAME">append_to.insertBefore</span><span class="PUNC">(</span><span class="NAME">script</span><span class="PUNC">,</span><span class="NAME">append_to.firstChild</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>193</span> </span><span class="WHIT">				</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>194</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>195</span> </span><span class="WHIT">			</span><span class="COMM">// use async=false for ordered async? parallel-load-serial-execute http://wiki.whatwg.org/wiki/Dynamic_Script_Execution_Order</span><span class="WHIT">
-<span class='line'>196</span> </span><span class="WHIT">			</span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">script_ordered_async</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>197</span> </span><span class="WHIT">				</span><span class="COMM">/*!START_DEBUG*/</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">chain_opts</span><span class="PUNC">[</span><span class="NAME">_Debug</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="NAME">log_msg</span><span class="PUNC">(</span><span class="STRN">"start script load (ordered async): "</span><span class="PUNC">+</span><span class="NAME">src</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="COMM">/*!END_DEBUG*/</span><span class="WHIT">
-<span class='line'>198</span> </span><span class="WHIT">				</span><span class="NAME">script.async</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>199</span> </span><span class="WHIT">				</span><span class="NAME">create_script_load_listener</span><span class="PUNC">(</span><span class="NAME">script</span><span class="PUNC">,</span><span class="NAME">registry_item</span><span class="PUNC">,</span><span class="STRN">"finished"</span><span class="PUNC">,</span><span class="NAME">onload</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>200</span> </span><span class="WHIT">				</span><span class="NAME">script.src</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">src</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>201</span> </span><span class="WHIT">				</span><span class="NAME">append_to.insertBefore</span><span class="PUNC">(</span><span class="NAME">script</span><span class="PUNC">,</span><span class="NAME">append_to.firstChild</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>202</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>203</span> </span><span class="WHIT">			</span><span class="COMM">// otherwise, just a normal script element</span><span class="WHIT">
-<span class='line'>204</span> </span><span class="WHIT">			</span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>205</span> </span><span class="WHIT">				</span><span class="COMM">/*!START_DEBUG*/</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">chain_opts</span><span class="PUNC">[</span><span class="NAME">_Debug</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="NAME">log_msg</span><span class="PUNC">(</span><span class="STRN">"start script load: "</span><span class="PUNC">+</span><span class="NAME">src</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="COMM">/*!END_DEBUG*/</span><span class="WHIT">
-<span class='line'>206</span> </span><span class="WHIT">				</span><span class="NAME">create_script_load_listener</span><span class="PUNC">(</span><span class="NAME">script</span><span class="PUNC">,</span><span class="NAME">registry_item</span><span class="PUNC">,</span><span class="STRN">"finished"</span><span class="PUNC">,</span><span class="NAME">onload</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>207</span> </span><span class="WHIT">				</span><span class="NAME">script.src</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">src</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>208</span> </span><span class="WHIT">				</span><span class="NAME">append_to.insertBefore</span><span class="PUNC">(</span><span class="NAME">script</span><span class="PUNC">,</span><span class="NAME">append_to.firstChild</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>209</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>210</span> </span><span class="WHIT">		</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="NUMB">0</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>211</span> </span><span class="WHIT">	</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>212</span> </span><span class="WHIT">		
-<span class='line'>213</span> 	</span><span class="COMM">// create a clean instance of $LAB</span><span class="WHIT">
-<span class='line'>214</span> </span><span class="WHIT">	</span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">create_sandbox</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>215</span> </span><span class="WHIT">		</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">global_defaults</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>216</span> </span><span class="WHIT">			</span><span class="NAME">can_use_preloading</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">real_preloading</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">xhr_or_cache_preloading</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>217</span> </span><span class="WHIT">			</span><span class="NAME">queue</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>218</span> </span><span class="WHIT">			</span><span class="NAME">registry</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>219</span> </span><span class="WHIT">			</span><span class="NAME">instanceAPI</span><span class="WHIT">
-<span class='line'>220</span> </span><span class="WHIT">		</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>221</span> </span><span class="WHIT">		
-<span class='line'>222</span> 		</span><span class="COMM">// global defaults</span><span class="WHIT">
-<span class='line'>223</span> </span><span class="WHIT">		</span><span class="NAME">global_defaults</span><span class="PUNC">[</span><span class="NAME">_UseLocalXHR</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>224</span> </span><span class="WHIT">		</span><span class="NAME">global_defaults</span><span class="PUNC">[</span><span class="NAME">_AlwaysPreserveOrder</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>225</span> </span><span class="WHIT">		</span><span class="NAME">global_defaults</span><span class="PUNC">[</span><span class="NAME">_AllowDuplicates</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>226</span> </span><span class="WHIT">		</span><span class="NAME">global_defaults</span><span class="PUNC">[</span><span class="NAME">_CacheBust</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>227</span> </span><span class="WHIT">		</span><span class="COMM">/*!START_DEBUG*/</span><span class="NAME">global_defaults</span><span class="PUNC">[</span><span class="NAME">_Debug</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="COMM">/*!END_DEBUG*/</span><span class="WHIT">
-<span class='line'>228</span> </span><span class="WHIT">		</span><span class="NAME">global_defaults</span><span class="PUNC">[</span><span class="NAME">_BasePath</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>229</span> 
-<span class='line'>230</span> </span><span class="WHIT">		</span><span class="COMM">// execute a script that has been preloaded already</span><span class="WHIT">
-<span class='line'>231</span> </span><span class="WHIT">		</span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">execute_preloaded_script</span><span class="PUNC">(</span><span class="NAME">chain_opts</span><span class="PUNC">,</span><span class="NAME">script_obj</span><span class="PUNC">,</span><span class="NAME">registry_item</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>232</span> </span><span class="WHIT">			</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">script</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>233</span> </span><span class="WHIT">			
-<span class='line'>234</span> 			</span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">preload_execute_finished</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>235</span> </span><span class="WHIT">				</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">script</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="COMM">// make sure this only ever fires once</span><span class="WHIT">
-<span class='line'>236</span> </span><span class="WHIT">					</span><span class="NAME">script</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>237</span> </span><span class="WHIT">					</span><span class="NAME">script_executed</span><span class="PUNC">(</span><span class="NAME">registry_item</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>238</span> </span><span class="WHIT">				</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>239</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>240</span> </span><span class="WHIT">			
-<span class='line'>241</span> 			</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">registry</span><span class="PUNC">[</span><span class="NAME">script_obj.src</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">finished</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="KEYW">return</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>242</span> </span><span class="WHIT">			</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">chain_opts</span><span class="PUNC">[</span><span class="NAME">_AllowDuplicates</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="NAME">registry</span><span class="PUNC">[</span><span class="NAME">script_obj.src</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">finished</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>243</span> </span><span class="WHIT">			
-<span class='line'>244</span> 			</span><span class="NAME">script</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">registry_item.elem</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">document.createElement</span><span class="PUNC">(</span><span class="STRN">"script"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>245</span> </span><span class="WHIT">			</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">script_obj.type</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="NAME">script.type</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">script_obj.type</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>246</span> </span><span class="WHIT">			</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">script_obj.charset</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="NAME">script.charset</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">script_obj.charset</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>247</span> </span><span class="WHIT">			</span><span class="NAME">create_script_load_listener</span><span class="PUNC">(</span><span class="NAME">script</span><span class="PUNC">,</span><span class="NAME">registry_item</span><span class="PUNC">,</span><span class="STRN">"finished"</span><span class="PUNC">,</span><span class="NAME">preload_execute_finished</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>248</span> </span><span class="WHIT">			
-<span class='line'>249</span> 			</span><span class="COMM">// script elem was real-preloaded</span><span class="WHIT">
-<span class='line'>250</span> </span><span class="WHIT">			</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">registry_item.elem</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>251</span> </span><span class="WHIT">				</span><span class="NAME">registry_item.elem</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>252</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>253</span> </span><span class="WHIT">			</span><span class="COMM">// script was XHR preloaded</span><span class="WHIT">
-<span class='line'>254</span> </span><span class="WHIT">			</span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">registry_item.text</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>255</span> </span><span class="WHIT">				</span><span class="NAME">script.onload</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">script.onreadystatechange</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">;</span><span class="WHIT">	</span><span class="COMM">// script injection doesn't fire these events</span><span class="WHIT">
-<span class='line'>256</span> </span><span class="WHIT">				</span><span class="NAME">script.text</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">registry_item.text</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>257</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>258</span> </span><span class="WHIT">			</span><span class="COMM">// script was cache-preloaded</span><span class="WHIT">
-<span class='line'>259</span> </span><span class="WHIT">			</span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>260</span> </span><span class="WHIT">				</span><span class="NAME">script.src</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">script_obj.real_src</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>261</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>262</span> </span><span class="WHIT">			</span><span class="NAME">append_to.insertBefore</span><span class="PUNC">(</span><span class="NAME">script</span><span class="PUNC">,</span><span class="NAME">append_to.firstChild</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>263</span> 
-<span class='line'>264</span> </span><span class="WHIT">			</span><span class="COMM">// manually fire execution callback for injected scripts, since events don't fire</span><span class="WHIT">
-<span class='line'>265</span> </span><span class="WHIT">			</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">registry_item.text</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>266</span> </span><span class="WHIT">				</span><span class="NAME">preload_execute_finished</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>267</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>268</span> </span><span class="WHIT">		</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>269</span> </span><span class="WHIT">	
-<span class='line'>270</span> 		</span><span class="COMM">// process the script request setup</span><span class="WHIT">
-<span class='line'>271</span> </span><span class="WHIT">		</span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">do_script</span><span class="PUNC">(</span><span class="NAME">chain_opts</span><span class="PUNC">,</span><span class="NAME">script_obj</span><span class="PUNC">,</span><span class="NAME">chain_group</span><span class="PUNC">,</span><span class="NAME">preload_this_script</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>272</span> </span><span class="WHIT">			</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">registry_item</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>273</span> </span><span class="WHIT">				</span><span class="NAME">registry_items</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>274</span> </span><span class="WHIT">				</span><span class="NAME">ready_cb</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">script_obj.ready_cb</span><span class="PUNC">(</span><span class="NAME">script_obj</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">execute_preloaded_script</span><span class="PUNC">(</span><span class="NAME">chain_opts</span><span class="PUNC">,</span><span class="NAME">script_obj</span><span class="PUNC">,</span><span class="NAME">registry_item</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>275</span> </span><span class="WHIT">				</span><span class="NAME">finished_cb</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">script_obj.finished_cb</span><span class="PUNC">(</span><span class="NAME">script_obj</span><span class="PUNC">,</span><span class="NAME">chain_group</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>276</span> </span><span class="WHIT">			</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>277</span> </span><span class="WHIT">			
-<span class='line'>278</span> 			</span><span class="NAME">script_obj.src</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">canonical_uri</span><span class="PUNC">(</span><span class="NAME">script_obj.src</span><span class="PUNC">,</span><span class="NAME">chain_opts</span><span class="PUNC">[</span><span class="NAME">_BasePath</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>279</span> </span><span class="WHIT">			</span><span class="NAME">script_obj.real_src</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">script_obj.src</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> 
-<span class='line'>280</span> 				</span><span class="COMM">// append cache-bust param to URL?</span><span class="WHIT">
-<span class='line'>281</span> </span><span class="WHIT">				</span><span class="PUNC">(</span><span class="NAME">chain_opts</span><span class="PUNC">[</span><span class="NAME">_CacheBust</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">(</span><span class="REGX">/\?.*$/</span><span class="PUNC">.</span><span class="NAME">test</span><span class="PUNC">(</span><span class="NAME">script_obj.src</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="STRN">"&_"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"?_"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="PUNC">~</span><span class="PUNC">~</span><span class="PUNC">(</span><span class="NAME">Math.random</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">*</span><span class="NUMB">1</span><span class="NAME">E9</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">"="</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">)</span><span class="WHIT">
-<span class='line'>282</span> </span><span class="WHIT">			</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>283</span> </span><span class="WHIT">			
-<span class='line'>284</span> 			</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">registry</span><span class="PUNC">[</span><span class="NAME">script_obj.src</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="NAME">registry</span><span class="PUNC">[</span><span class="NAME">script_obj.src</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="NAME">items</span><span class="PUNC">:</span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="NAME">finished</span><span class="PUNC">:</span><span class="KEYW">false</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>285</span> </span><span class="WHIT">			</span><span class="NAME">registry_items</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">registry</span><span class="PUNC">[</span><span class="NAME">script_obj.src</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">items</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>286</span> 
-<span class='line'>287</span> </span><span class="WHIT">			</span><span class="COMM">// allowing duplicates, or is this the first recorded load of this script?</span><span class="WHIT">
-<span class='line'>288</span> </span><span class="WHIT">			</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">chain_opts</span><span class="PUNC">[</span><span class="NAME">_AllowDuplicates</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">registry_items.length</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>289</span> </span><span class="WHIT">				</span><span class="NAME">registry_item</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">registry_items</span><span class="PUNC">[</span><span class="NAME">registry_items.length</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>290</span> </span><span class="WHIT">					</span><span class="NAME">ready</span><span class="PUNC">:</span><span class="KEYW">false</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>291</span> </span><span class="WHIT">					</span><span class="NAME">finished</span><span class="PUNC">:</span><span class="KEYW">false</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>292</span> </span><span class="WHIT">					</span><span class="NAME">ready_listeners</span><span class="PUNC">:</span><span class="PUNC">[</span><span class="NAME">ready_cb</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>293</span> </span><span class="WHIT">					</span><span class="NAME">finished_listeners</span><span class="PUNC">:</span><span class="PUNC">[</span><span class="NAME">finished_cb</span><span class="PUNC">]</span><span class="WHIT">
-<span class='line'>294</span> </span><span class="WHIT">				</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>295</span> 
-<span class='line'>296</span> </span><span class="WHIT">				</span><span class="NAME">request_script</span><span class="PUNC">(</span><span class="NAME">chain_opts</span><span class="PUNC">,</span><span class="NAME">script_obj</span><span class="PUNC">,</span><span class="NAME">registry_item</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>297</span> </span><span class="WHIT">					</span><span class="COMM">// which callback type to pass?</span><span class="WHIT">
-<span class='line'>298</span> </span><span class="WHIT">					</span><span class="PUNC">(</span><span class="WHIT">
-<span class='line'>299</span> </span><span class="WHIT">					 	</span><span class="PUNC">(</span><span class="NAME">preload_this_script</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="COMM">// depends on script-preloading</span><span class="WHIT">
-<span class='line'>300</span> </span><span class="WHIT">						</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>301</span> </span><span class="WHIT">							</span><span class="NAME">registry_item.ready</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>302</span> </span><span class="WHIT">							</span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">&lt;</span><span class="NAME">registry_item.ready_listeners.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>303</span> </span><span class="WHIT">								</span><span class="NAME">registry_item.ready_listeners</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>304</span> </span><span class="WHIT">							</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>305</span> </span><span class="WHIT">							</span><span class="NAME">registry_item.ready_listeners</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>306</span> </span><span class="WHIT">						</span><span class="PUNC">}</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT">
-<span class='line'>307</span> </span><span class="WHIT">						</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">script_executed</span><span class="PUNC">(</span><span class="NAME">registry_item</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>308</span> </span><span class="WHIT">					</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>309</span> </span><span class="WHIT">					</span><span class="COMM">// signal if script-preloading should be used or not</span><span class="WHIT">
-<span class='line'>310</span> </span><span class="WHIT">					</span><span class="NAME">preload_this_script</span><span class="WHIT">
-<span class='line'>311</span> </span><span class="WHIT">				</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>312</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>313</span> </span><span class="WHIT">			</span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>314</span> </span><span class="WHIT">				</span><span class="NAME">registry_item</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">registry_items</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>315</span> </span><span class="WHIT">				</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">registry_item.finished</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>316</span> </span><span class="WHIT">					</span><span class="NAME">finished_cb</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>317</span> </span><span class="WHIT">				</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>318</span> </span><span class="WHIT">				</span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>319</span> </span><span class="WHIT">					</span><span class="NAME">registry_item.finished_listeners.push</span><span class="PUNC">(</span><span class="NAME">finished_cb</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>320</span> </span><span class="WHIT">				</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>321</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>322</span> </span><span class="WHIT">		</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>323</span> 
-<span class='line'>324</span> </span><span class="WHIT">		</span><span class="COMM">// creates a closure for each separate chain spawned from this $LAB instance, to keep state cleanly separated between chains</span><span class="WHIT">
-<span class='line'>325</span> </span><span class="WHIT">		</span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">create_chain</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>326</span> </span><span class="WHIT">			</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">chainedAPI</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>327</span> </span><span class="WHIT">				</span><span class="NAME">chain_opts</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">merge_objs</span><span class="PUNC">(</span><span class="NAME">global_defaults</span><span class="PUNC">,</span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>328</span> </span><span class="WHIT">				</span><span class="NAME">chain</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>329</span> </span><span class="WHIT">				</span><span class="NAME">exec_cursor</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>330</span> </span><span class="WHIT">				</span><span class="NAME">scripts_currently_loading</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>331</span> </span><span class="WHIT">				</span><span class="NAME">group</span><span class="WHIT">
-<span class='line'>332</span> </span><span class="WHIT">			</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>333</span> </span><span class="WHIT">			
-<span class='line'>334</span> 			</span><span class="COMM">// called when a script has finished preloading</span><span class="WHIT">
-<span class='line'>335</span> </span><span class="WHIT">			</span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">chain_script_ready</span><span class="PUNC">(</span><span class="NAME">script_obj</span><span class="PUNC">,</span><span class="NAME">exec_trigger</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>336</span> </span><span class="WHIT">				</span><span class="COMM">/*!START_DEBUG*/</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">chain_opts</span><span class="PUNC">[</span><span class="NAME">_Debug</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="NAME">log_msg</span><span class="PUNC">(</span><span class="STRN">"script preload finished: "</span><span class="PUNC">+</span><span class="NAME">script_obj.real_src</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="COMM">/*!END_DEBUG*/</span><span class="WHIT">
-<span class='line'>337</span> </span><span class="WHIT">				</span><span class="NAME">script_obj.ready</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>338</span> </span><span class="WHIT">				</span><span class="NAME">script_obj.exec_trigger</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">exec_trigger</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>339</span> </span><span class="WHIT">				</span><span class="NAME">advance_exec_cursor</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">// will only check for 'ready' scripts to be executed</span><span class="WHIT">
-<span class='line'>340</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>341</span> 
-<span class='line'>342</span> </span><span class="WHIT">			</span><span class="COMM">// called when a script has finished executing</span><span class="WHIT">
-<span class='line'>343</span> </span><span class="WHIT">			</span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">chain_script_executed</span><span class="PUNC">(</span><span class="NAME">script_obj</span><span class="PUNC">,</span><span class="NAME">chain_group</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>344</span> </span><span class="WHIT">				</span><span class="COMM">/*!START_DEBUG*/</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">chain_opts</span><span class="PUNC">[</span><span class="NAME">_Debug</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="NAME">log_msg</span><span class="PUNC">(</span><span class="STRN">"script execution finished: "</span><span class="PUNC">+</span><span class="NAME">script_obj.real_src</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="COMM">/*!END_DEBUG*/</span><span class="WHIT">
-<span class='line'>345</span> </span><span class="WHIT">				</span><span class="NAME">script_obj.ready</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">script_obj.finished</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>346</span> </span><span class="WHIT">				</span><span class="NAME">script_obj.exec_trigger</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>347</span> </span><span class="WHIT">				</span><span class="COMM">// check if chain group is all finished</span><span class="WHIT">
-<span class='line'>348</span> </span><span class="WHIT">				</span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">&lt;</span><span class="NAME">chain_group.scripts.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>349</span> </span><span class="WHIT">					</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">chain_group.scripts</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">finished</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="KEYW">return</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>350</span> </span><span class="WHIT">				</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>351</span> </span><span class="WHIT">				</span><span class="COMM">// chain_group is all finished if we get this far</span><span class="WHIT">
-<span class='line'>352</span> </span><span class="WHIT">				</span><span class="NAME">chain_group.finished</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>353</span> </span><span class="WHIT">				</span><span class="NAME">advance_exec_cursor</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>354</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>355</span> 
-<span class='line'>356</span> </span><span class="WHIT">			</span><span class="COMM">// main driver for executing each part of the chain</span><span class="WHIT">
-<span class='line'>357</span> </span><span class="WHIT">			</span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">advance_exec_cursor</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>358</span> </span><span class="WHIT">				</span><span class="KEYW">while</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">exec_cursor</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">chain.length</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>359</span> </span><span class="WHIT">					</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">is_func</span><span class="PUNC">(</span><span class="NAME">chain</span><span class="PUNC">[</span><span class="NAME">exec_cursor</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>360</span> </span><span class="WHIT">						</span><span class="COMM">/*!START_DEBUG*/</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">chain_opts</span><span class="PUNC">[</span><span class="NAME">_Debug</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="NAME">log_msg</span><span class="PUNC">(</span><span class="STRN">"$LAB.wait() executing: "</span><span class="PUNC">+</span><span class="NAME">chain</span><span class="PUNC">[</span><span class="NAME">exec_cursor</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="COMM">/*!END_DEBUG*/</span><span class="WHIT">
-<span class='line'>361</span> </span><span class="WHIT">						</span><span class="KEYW">try</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">chain</span><span class="PUNC">[</span><span class="NAME">exec_cursor</span><span class="PUNC">++</span><span class="PUNC">]</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">catch</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">err</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>362</span> </span><span class="WHIT">							</span><span class="COMM">/*!START_DEBUG*/</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">chain_opts</span><span class="PUNC">[</span><span class="NAME">_Debug</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="NAME">log_error</span><span class="PUNC">(</span><span class="STRN">"$LAB.wait() error caught: "</span><span class="PUNC">,</span><span class="NAME">err</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="COMM">/*!END_DEBUG*/</span><span class="WHIT">
-<span class='line'>363</span> </span><span class="WHIT">						</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>364</span> </span><span class="WHIT">						</span><span class="KEYW">continue</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>365</span> </span><span class="WHIT">					</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>366</span> </span><span class="WHIT">					</span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">chain</span><span class="PUNC">[</span><span class="NAME">exec_cursor</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">finished</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>367</span> </span><span class="WHIT">						</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">check_chain_group_scripts_ready</span><span class="PUNC">(</span><span class="NAME">chain</span><span class="PUNC">[</span><span class="NAME">exec_cursor</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="KEYW">continue</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>368</span> </span><span class="WHIT">						</span><span class="KEYW">break</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>369</span> </span><span class="WHIT">					</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>370</span> </span><span class="WHIT">					</span><span class="NAME">exec_cursor</span><span class="PUNC">++</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>371</span> </span><span class="WHIT">				</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>372</span> </span><span class="WHIT">				</span><span class="COMM">// we've reached the end of the chain (so far)</span><span class="WHIT">
-<span class='line'>373</span> </span><span class="WHIT">				</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">exec_cursor</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="NAME">chain.length</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>374</span> </span><span class="WHIT">					</span><span class="NAME">scripts_currently_loading</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>375</span> </span><span class="WHIT">					</span><span class="NAME">group</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>376</span> </span><span class="WHIT">				</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>377</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>378</span> </span><span class="WHIT">			
-<span class='line'>379</span> 			</span><span class="COMM">// setup next chain script group</span><span class="WHIT">
-<span class='line'>380</span> </span><span class="WHIT">			</span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">init_script_chain_group</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>381</span> </span><span class="WHIT">				</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">group</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="NAME">group.scripts</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>382</span> </span><span class="WHIT">					</span><span class="NAME">chain.push</span><span class="PUNC">(</span><span class="NAME">group</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="NAME">scripts</span><span class="PUNC">:</span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="NAME">finished</span><span class="PUNC">:</span><span class="KEYW">true</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>383</span> </span><span class="WHIT">				</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>384</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>385</span> 
-<span class='line'>386</span> </span><span class="WHIT">			</span><span class="COMM">// API for $LAB chains</span><span class="WHIT">
-<span class='line'>387</span> </span><span class="WHIT">			</span><span class="NAME">chainedAPI</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>388</span> </span><span class="WHIT">				</span><span class="COMM">// start loading one or more scripts</span><span class="WHIT">
-<span class='line'>389</span> </span><span class="WHIT">				</span><span class="NAME">script</span><span class="PUNC">:</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>390</span> </span><span class="WHIT">					</span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">&lt;</span><span class="NAME">arguments.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>391</span> </span><span class="WHIT">						</span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">script_obj</span><span class="PUNC">,</span><span class="NAME">script_list</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>392</span> </span><span class="WHIT">							</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">splice_args</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>393</span> </span><span class="WHIT">							
-<span class='line'>394</span> 							</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">is_array</span><span class="PUNC">(</span><span class="NAME">script_obj</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>395</span> </span><span class="WHIT">								</span><span class="NAME">script_list</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="NAME">script_obj</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>396</span> </span><span class="WHIT">							</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>397</span> </span><span class="WHIT">							</span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">j</span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">j</span><span class="PUNC">&lt;</span><span class="NAME">script_list.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">j</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>398</span> </span><span class="WHIT">								</span><span class="NAME">init_script_chain_group</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>399</span> </span><span class="WHIT">								</span><span class="NAME">script_obj</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">script_list</span><span class="PUNC">[</span><span class="NAME">j</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>400</span> </span><span class="WHIT">								
-<span class='line'>401</span> 								</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">is_func</span><span class="PUNC">(</span><span class="NAME">script_obj</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="NAME">script_obj</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">script_obj</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>402</span> </span><span class="WHIT">								</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">script_obj</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="KEYW">continue</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>403</span> </span><span class="WHIT">								</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">is_array</span><span class="PUNC">(</span><span class="NAME">script_obj</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>404</span> </span><span class="WHIT">									</span><span class="COMM">// set up an array of arguments to pass to splice()</span><span class="WHIT">
-<span class='line'>405</span> </span><span class="WHIT">									</span><span class="NAME">splice_args</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">slice.call</span><span class="PUNC">(</span><span class="NAME">script_obj</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">// first include the actual array elements we want to splice in</span><span class="WHIT">
-<span class='line'>406</span> </span><span class="WHIT">									</span><span class="NAME">splice_args.unshift</span><span class="PUNC">(</span><span class="NAME">j</span><span class="PUNC">,</span><span class="NUMB">1</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">// next, put the `index` and `howMany` parameters onto the beginning of the splice-arguments array</span><span class="WHIT">
-<span class='line'>407</span> </span><span class="WHIT">									</span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">splice.apply</span><span class="PUNC">(</span><span class="NAME">script_list</span><span class="PUNC">,</span><span class="NAME">splice_args</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">// use the splice-arguments array as arguments for splice()</span><span class="WHIT">
-<span class='line'>408</span> </span><span class="WHIT">									</span><span class="NAME">j</span><span class="PUNC">--</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">// adjust `j` to account for the loop's subsequent `j++`, so that the next loop iteration uses the same `j` index value</span><span class="WHIT">
-<span class='line'>409</span> </span><span class="WHIT">									</span><span class="KEYW">continue</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>410</span> </span><span class="WHIT">								</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>411</span> </span><span class="WHIT">								</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">script_obj</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">"string"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="NAME">script_obj</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="NAME">src</span><span class="PUNC">:</span><span class="NAME">script_obj</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>412</span> </span><span class="WHIT">								</span><span class="NAME">script_obj</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">merge_objs</span><span class="PUNC">(</span><span class="NAME">script_obj</span><span class="PUNC">,</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>413</span> </span><span class="WHIT">									</span><span class="NAME">ready</span><span class="PUNC">:</span><span class="KEYW">false</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>414</span> </span><span class="WHIT">									</span><span class="NAME">ready_cb</span><span class="PUNC">:</span><span class="NAME">chain_script_ready</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>415</span> </span><span class="WHIT">									</span><span class="NAME">finished</span><span class="PUNC">:</span><span class="KEYW">false</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>416</span> </span><span class="WHIT">									</span><span class="NAME">finished_cb</span><span class="PUNC">:</span><span class="NAME">chain_script_executed</span><span class="WHIT">
-<span class='line'>417</span> </span><span class="WHIT">								</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>418</span> </span><span class="WHIT">								</span><span class="NAME">group.finished</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>419</span> </span><span class="WHIT">								</span><span class="NAME">group.scripts.push</span><span class="PUNC">(</span><span class="NAME">script_obj</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>420</span> </span><span class="WHIT">								
-<span class='line'>421</span> 								</span><span class="NAME">do_script</span><span class="PUNC">(</span><span class="NAME">chain_opts</span><span class="PUNC">,</span><span class="NAME">script_obj</span><span class="PUNC">,</span><span class="NAME">group</span><span class="PUNC">,</span><span class="PUNC">(</span><span class="NAME">can_use_preloading</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">scripts_currently_loading</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>422</span> </span><span class="WHIT">								</span><span class="NAME">scripts_currently_loading</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>423</span> </span><span class="WHIT">								
-<span class='line'>424</span> 								</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">chain_opts</span><span class="PUNC">[</span><span class="NAME">_AlwaysPreserveOrder</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="NAME">chainedAPI.wait</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>425</span> </span><span class="WHIT">							</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>426</span> </span><span class="WHIT">						</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">(</span><span class="NAME">arguments</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="NAME">arguments</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>427</span> </span><span class="WHIT">					</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>428</span> </span><span class="WHIT">					</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">chainedAPI</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>429</span> </span><span class="WHIT">				</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>430</span> </span><span class="WHIT">				</span><span class="COMM">// force LABjs to pause in execution at this point in the chain, until the execution thus far finishes, before proceeding</span><span class="WHIT">
-<span class='line'>431</span> </span><span class="WHIT">				</span><span class="NAME">wait</span><span class="PUNC">:</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>432</span> </span><span class="WHIT">					</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">arguments.length</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>433</span> </span><span class="WHIT">						</span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">&lt;</span><span class="NAME">arguments.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>434</span> </span><span class="WHIT">							</span><span class="NAME">chain.push</span><span class="PUNC">(</span><span class="NAME">arguments</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>435</span> </span><span class="WHIT">						</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>436</span> </span><span class="WHIT">						</span><span class="NAME">group</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">chain</span><span class="PUNC">[</span><span class="NAME">chain.length</span><span class="PUNC">-</span><span class="NUMB">1</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>437</span> </span><span class="WHIT">					</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>438</span> </span><span class="WHIT">					</span><span class="KEYW">else</span><span class="WHIT"> </span><span class="NAME">group</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>439</span> </span><span class="WHIT">					
-<span class='line'>440</span> 					</span><span class="NAME">advance_exec_cursor</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>441</span> </span><span class="WHIT">					
-<span class='line'>442</span> 					</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">chainedAPI</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>443</span> </span><span class="WHIT">				</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>444</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>445</span> 
-<span class='line'>446</span> </span><span class="WHIT">			</span><span class="COMM">// the first chain link API (includes `setOptions` only this first time)</span><span class="WHIT">
-<span class='line'>447</span> </span><span class="WHIT">			</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>448</span> </span><span class="WHIT">				</span><span class="NAME">script</span><span class="PUNC">:</span><span class="NAME">chainedAPI.script</span><span class="PUNC">,</span><span class="WHIT"> 
-<span class='line'>449</span> 				</span><span class="NAME">wait</span><span class="PUNC">:</span><span class="NAME">chainedAPI.wait</span><span class="PUNC">,</span><span class="WHIT"> 
-<span class='line'>450</span> 				</span><span class="NAME">setOptions</span><span class="PUNC">:</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">opts</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>451</span> </span><span class="WHIT">					</span><span class="NAME">merge_objs</span><span class="PUNC">(</span><span class="NAME">opts</span><span class="PUNC">,</span><span class="NAME">chain_opts</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>452</span> </span><span class="WHIT">					</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">chainedAPI</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>453</span> </span><span class="WHIT">				</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>454</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>455</span> </span><span class="WHIT">		</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>456</span> 
-<span class='line'>457</span> </span><span class="WHIT">		</span><span class="COMM">// API for each initial $LAB instance (before chaining starts)</span><span class="WHIT">
-<span class='line'>458</span> </span><span class="WHIT">		</span><span class="NAME">instanceAPI</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>459</span> </span><span class="WHIT">			</span><span class="COMM">// main API functions</span><span class="WHIT">
-<span class='line'>460</span> </span><span class="WHIT">			</span><span class="NAME">setGlobalDefaults</span><span class="PUNC">:</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">opts</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>461</span> </span><span class="WHIT">				</span><span class="NAME">merge_objs</span><span class="PUNC">(</span><span class="NAME">opts</span><span class="PUNC">,</span><span class="NAME">global_defaults</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>462</span> </span><span class="WHIT">				</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">instanceAPI</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>463</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>464</span> </span><span class="WHIT">			</span><span class="NAME">setOptions</span><span class="PUNC">:</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>465</span> </span><span class="WHIT">				</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">create_chain</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">setOptions.apply</span><span class="PUNC">(</span><span class="KEYW">null</span><span class="PUNC">,</span><span class="NAME">arguments</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>466</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>467</span> </span><span class="WHIT">			</span><span class="NAME">script</span><span class="PUNC">:</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>468</span> </span><span class="WHIT">				</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">create_chain</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">script.apply</span><span class="PUNC">(</span><span class="KEYW">null</span><span class="PUNC">,</span><span class="NAME">arguments</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>469</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>470</span> </span><span class="WHIT">			</span><span class="NAME">wait</span><span class="PUNC">:</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>471</span> </span><span class="WHIT">				</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">create_chain</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">wait.apply</span><span class="PUNC">(</span><span class="KEYW">null</span><span class="PUNC">,</span><span class="NAME">arguments</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>472</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>473</span> 
-<span class='line'>474</span> </span><span class="WHIT">			</span><span class="COMM">// built-in queuing for $LAB `script()` and `wait()` calls</span><span class="WHIT">
-<span class='line'>475</span> </span><span class="WHIT">			</span><span class="COMM">// useful for building up a chain programmatically across various script locations, and simulating</span><span class="WHIT">
-<span class='line'>476</span> </span><span class="WHIT">			</span><span class="COMM">// execution of the chain</span><span class="WHIT">
-<span class='line'>477</span> </span><span class="WHIT">			</span><span class="NAME">queueScript</span><span class="PUNC">:</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>478</span> </span><span class="WHIT">				</span><span class="NAME">queue</span><span class="PUNC">[</span><span class="NAME">queue.length</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="NAME">type</span><span class="PUNC">:</span><span class="STRN">"script"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">args</span><span class="PUNC">:</span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">slice.call</span><span class="PUNC">(</span><span class="NAME">arguments</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>479</span> </span><span class="WHIT">				</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">instanceAPI</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>480</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>481</span> </span><span class="WHIT">			</span><span class="NAME">queueWait</span><span class="PUNC">:</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>482</span> </span><span class="WHIT">				</span><span class="NAME">queue</span><span class="PUNC">[</span><span class="NAME">queue.length</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="NAME">type</span><span class="PUNC">:</span><span class="STRN">"wait"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">args</span><span class="PUNC">:</span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">slice.call</span><span class="PUNC">(</span><span class="NAME">arguments</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>483</span> </span><span class="WHIT">				</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">instanceAPI</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>484</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>485</span> </span><span class="WHIT">			</span><span class="NAME">runQueue</span><span class="PUNC">:</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>486</span> </span><span class="WHIT">				</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">$L</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">instanceAPI</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">len</span><span class="PUNC">=</span><span class="NAME">queue.length</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">=</span><span class="NAME">len</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">val</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>487</span> </span><span class="WHIT">				</span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">;</span><span class="PUNC">--</span><span class="NAME">i</span><span class="PUNC">>=</span><span class="NUMB">0</span><span class="PUNC">;</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>488</span> </span><span class="WHIT">					</span><span class="NAME">val</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">queue.shift</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>489</span> </span><span class="WHIT">					</span><span class="NAME">$L</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">$L</span><span class="PUNC">[</span><span class="NAME">val.type</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">apply</span><span class="PUNC">(</span><span class="KEYW">null</span><span class="PUNC">,</span><span class="NAME">val.args</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>490</span> </span><span class="WHIT">				</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>491</span> </span><span class="WHIT">				</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">$L</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>492</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>493</span> 
-<span class='line'>494</span> </span><span class="WHIT">			</span><span class="COMM">// rollback `[global].$LAB` to what it was before this file was loaded, the return this current instance of $LAB</span><span class="WHIT">
-<span class='line'>495</span> </span><span class="WHIT">			</span><span class="NAME">noConflict</span><span class="PUNC">:</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>496</span> </span><span class="WHIT">				</span><span class="NAME">global.$LAB</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_$LAB</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>497</span> </span><span class="WHIT">				</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">instanceAPI</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>498</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>499</span> 
-<span class='line'>500</span> </span><span class="WHIT">			</span><span class="COMM">// create another clean instance of $LAB</span><span class="WHIT">
-<span class='line'>501</span> </span><span class="WHIT">			</span><span class="NAME">sandbox</span><span class="PUNC">:</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>502</span> </span><span class="WHIT">				</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">create_sandbox</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>503</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>504</span> </span><span class="WHIT">		</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>505</span> 
-<span class='line'>506</span> </span><span class="WHIT">		</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">instanceAPI</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>507</span> </span><span class="WHIT">	</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>508</span> 
-<span class='line'>509</span> </span><span class="WHIT">	</span><span class="COMM">// create the main instance of $LAB</span><span class="WHIT">
-<span class='line'>510</span> </span><span class="WHIT">	</span><span class="NAME">global.$LAB</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">create_sandbox</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>511</span> 
-<span class='line'>512</span> 
-<span class='line'>513</span> </span><span class="WHIT">	</span><span class="COMM">/* The following "hack" was suggested by Andrea Giammarchi and adapted from: http://webreflection.blogspot.com/2009/11/195-chars-to-help-lazy-loading.html
-<span class='line'>514</span> 	   NOTE: this hack only operates in FF and then only in versions where document.readyState is not present (FF &lt; 3.6?).
-<span class='line'>515</span> 	   
-<span class='line'>516</span> 	   The hack essentially "patches" the **page** that LABjs is loaded onto so that it has a proper conforming document.readyState, so that if a script which does 
-<span class='line'>517</span> 	   proper and safe dom-ready detection is loaded onto a page, after dom-ready has passed, it will still be able to detect this state, by inspecting the now hacked 
-<span class='line'>518</span> 	   document.readyState property. The loaded script in question can then immediately trigger any queued code executions that were waiting for the DOM to be ready. 
-<span class='line'>519</span> 	   For instance, jQuery 1.4+ has been patched to take advantage of document.readyState, which is enabled by this hack. But 1.3.2 and before are **not** safe or 
-<span class='line'>520</span> 	   fixed by this hack, and should therefore **not** be lazy-loaded by script loader tools such as LABjs.
-<span class='line'>521</span> 	*/</span><span class="WHIT"> 
-<span class='line'>522</span> 	</span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">addEvent</span><span class="PUNC">,</span><span class="NAME">domLoaded</span><span class="PUNC">,</span><span class="NAME">handler</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>523</span> </span><span class="WHIT">		</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">document.readyState</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">document</span><span class="PUNC">[</span><span class="NAME">addEvent</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>524</span> </span><span class="WHIT">			</span><span class="NAME">document.readyState</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"loading"</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>525</span> </span><span class="WHIT">			</span><span class="NAME">document</span><span class="PUNC">[</span><span class="NAME">addEvent</span><span class="PUNC">]</span><span class="PUNC">(</span><span class="NAME">domLoaded</span><span class="PUNC">,</span><span class="NAME">handler</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>526</span> </span><span class="WHIT">				</span><span class="NAME">document.removeEventListener</span><span class="PUNC">(</span><span class="NAME">domLoaded</span><span class="PUNC">,</span><span class="NAME">handler</span><span class="PUNC">,</span><span class="KEYW">false</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>527</span> </span><span class="WHIT">				</span><span class="NAME">document.readyState</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"complete"</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>528</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="KEYW">false</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>529</span> </span><span class="WHIT">		</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>530</span> </span><span class="WHIT">	</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">(</span><span class="STRN">"addEventListener"</span><span class="PUNC">,</span><span class="STRN">"DOMContentLoaded"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>531</span> 
-<span class='line'>532</span> </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="COMM">/*
-<span class='line'>533</span>   mustache.js — Logic-less templates in JavaScript
-<span class='line'>534</span> 
-<span class='line'>535</span>   See http://mustache.github.com/ for more info.
-<span class='line'>536</span> */</span><span class="WHIT">
-<span class='line'>537</span> 
-<span class='line'>538</span> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">Mustache</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>539</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">Renderer</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>540</span> 
-<span class='line'>541</span> </span><span class="WHIT">  </span><span class="NAME">Renderer.prototype</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>542</span> </span><span class="WHIT">    </span><span class="NAME">otag</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"{{"</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>543</span> </span><span class="WHIT">    </span><span class="NAME">ctag</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"}}"</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>544</span> </span><span class="WHIT">    </span><span class="NAME">pragmas</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>545</span> </span><span class="WHIT">    </span><span class="NAME">buffer</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>546</span> </span><span class="WHIT">    </span><span class="NAME">pragmas_implemented</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>547</span> </span><span class="WHIT">      </span><span class="STRN">"IMPLICIT-ITERATOR"</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="WHIT">
-<span class='line'>548</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>549</span> </span><span class="WHIT">    </span><span class="NAME">context</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>550</span> 
-<span class='line'>551</span> </span><span class="WHIT">    </span><span class="NAME">render</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">template</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">context</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">partials</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">in_recursion</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>552</span> </span><span class="WHIT">      </span><span class="COMM">// reset buffer & set context</span><span class="WHIT">
-<span class='line'>553</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">in_recursion</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>554</span> </span><span class="WHIT">        </span><span class="NAME">this.context</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">context</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>555</span> </span><span class="WHIT">        </span><span class="NAME">this.buffer</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">// TODO: make this non-lazy</span><span class="WHIT">
-<span class='line'>556</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>557</span> 
-<span class='line'>558</span> </span><span class="WHIT">      </span><span class="COMM">// fail fast</span><span class="WHIT">
-<span class='line'>559</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">this.includes</span><span class="PUNC">(</span><span class="STRN">""</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">template</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>560</span> </span><span class="WHIT">        </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">in_recursion</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>561</span> </span><span class="WHIT">          </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">template</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>562</span> </span><span class="WHIT">        </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>563</span> </span><span class="WHIT">          </span><span class="NAME">this.send</span><span class="PUNC">(</span><span class="NAME">template</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>564</span> </span><span class="WHIT">          </span><span class="KEYW">return</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>565</span> </span><span class="WHIT">        </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>566</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>567</span> 
-<span class='line'>568</span> </span><span class="WHIT">      </span><span class="NAME">template</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.render_pragmas</span><span class="PUNC">(</span><span class="NAME">template</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>569</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">html</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.render_section</span><span class="PUNC">(</span><span class="NAME">template</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">context</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">partials</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>570</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">in_recursion</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>571</span> </span><span class="WHIT">        </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">this.render_tags</span><span class="PUNC">(</span><span class="NAME">html</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">context</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">partials</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">in_recursion</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>572</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>573</span> 
-<span class='line'>574</span> </span><span class="WHIT">      </span><span class="NAME">this.render_tags</span><span class="PUNC">(</span><span class="NAME">html</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">context</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">partials</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">in_recursion</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>575</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>576</span> 
-<span class='line'>577</span> </span><span class="WHIT">    </span><span class="COMM">/*
-<span class='line'>578</span>       Sends parsed lines
-<span class='line'>579</span>     */</span><span class="WHIT">
-<span class='line'>580</span> </span><span class="WHIT">    </span><span class="NAME">send</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">line</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>581</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">line</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>582</span> </span><span class="WHIT">        </span><span class="NAME">this.buffer.push</span><span class="PUNC">(</span><span class="NAME">line</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>583</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>584</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>585</span> 
-<span class='line'>586</span> </span><span class="WHIT">    </span><span class="COMM">/*
-<span class='line'>587</span>       Looks for %PRAGMAS
-<span class='line'>588</span>     */</span><span class="WHIT">
-<span class='line'>589</span> </span><span class="WHIT">    </span><span class="NAME">render_pragmas</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">template</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>590</span> </span><span class="WHIT">      </span><span class="COMM">// no pragmas</span><span class="WHIT">
-<span class='line'>591</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">this.includes</span><span class="PUNC">(</span><span class="STRN">"%"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">template</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>592</span> </span><span class="WHIT">        </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">template</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>593</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>594</span> 
-<span class='line'>595</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">that</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">this</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>596</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">regex</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">RegExp</span><span class="PUNC">(</span><span class="NAME">this.otag</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">"%([\\w-]+) ?([\\w]+=[\\w]+)?"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT">
-<span class='line'>597</span> </span><span class="WHIT">            </span><span class="NAME">this.ctag</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"g"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>598</span> </span><span class="WHIT">      </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">template.replace</span><span class="PUNC">(</span><span class="NAME">regex</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">match</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">pragma</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">options</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>599</span> </span><span class="WHIT">        </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">that.pragmas_implemented</span><span class="PUNC">[</span><span class="NAME">pragma</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>600</span> </span><span class="WHIT">          </span><span class="KEYW">throw</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="NAME">message</span><span class="PUNC">:</span><span class="WHIT"> 
-<span class='line'>601</span>             </span><span class="STRN">"This implementation of mustache doesn't understand the '"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT">
-<span class='line'>602</span> </span><span class="WHIT">            </span><span class="NAME">pragma</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">"' pragma"</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>603</span> </span><span class="WHIT">        </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>604</span> </span><span class="WHIT">        </span><span class="NAME">that.pragmas</span><span class="PUNC">[</span><span class="NAME">pragma</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>605</span> </span><span class="WHIT">        </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">options</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>606</span> </span><span class="WHIT">          </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">opts</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">options.split</span><span class="PUNC">(</span><span class="STRN">"="</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>607</span> </span><span class="WHIT">          </span><span class="NAME">that.pragmas</span><span class="PUNC">[</span><span class="NAME">pragma</span><span class="PUNC">]</span><span class="PUNC">[</span><span class="NAME">opts</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">opts</span><span class="PUNC">[</span><span class="NUMB">1</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>608</span> </span><span class="WHIT">        </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>609</span> </span><span class="WHIT">        </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>610</span> </span><span class="WHIT">        </span><span class="COMM">// ignore unknown pragmas silently</span><span class="WHIT">
-<span class='line'>611</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>612</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>613</span> 
-<span class='line'>614</span> </span><span class="WHIT">    </span><span class="COMM">/*
-<span class='line'>615</span>       Tries to find a partial in the curent scope and render it
-<span class='line'>616</span>     */</span><span class="WHIT">
-<span class='line'>617</span> </span><span class="WHIT">    </span><span class="NAME">render_partial</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">name</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">context</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">partials</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>618</span> </span><span class="WHIT">      </span><span class="NAME">name</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.trim</span><span class="PUNC">(</span><span class="NAME">name</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>619</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">partials</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">partials</span><span class="PUNC">[</span><span class="NAME">name</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>620</span> </span><span class="WHIT">        </span><span class="KEYW">throw</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="NAME">message</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"unknown_partial '"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">name</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">"'"</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>621</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>622</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">context</span><span class="PUNC">[</span><span class="NAME">name</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="STRN">"object"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>623</span> </span><span class="WHIT">        </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">this.render</span><span class="PUNC">(</span><span class="NAME">partials</span><span class="PUNC">[</span><span class="NAME">name</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">context</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">partials</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>624</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>625</span> </span><span class="WHIT">      </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">this.render</span><span class="PUNC">(</span><span class="NAME">partials</span><span class="PUNC">[</span><span class="NAME">name</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">context</span><span class="PUNC">[</span><span class="NAME">name</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">partials</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>626</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>627</span> 
-<span class='line'>628</span> </span><span class="WHIT">    </span><span class="COMM">/*
-<span class='line'>629</span>       Renders inverted (^) and normal (#) sections
-<span class='line'>630</span>     */</span><span class="WHIT">
-<span class='line'>631</span> </span><span class="WHIT">    </span><span class="NAME">render_section</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">template</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">context</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">partials</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>632</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">this.includes</span><span class="PUNC">(</span><span class="STRN">"#"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">template</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="NAME">this.includes</span><span class="PUNC">(</span><span class="STRN">"^"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">template</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>633</span> </span><span class="WHIT">        </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">template</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>634</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>635</span> 
-<span class='line'>636</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">that</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">this</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>637</span> </span><span class="WHIT">      </span><span class="COMM">// CSW - Added "+?" so it finds the tighest bound, not the widest</span><span class="WHIT">
-<span class='line'>638</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">regex</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">RegExp</span><span class="PUNC">(</span><span class="NAME">this.otag</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">"(\\^|\\#)\\s*(.+)\\s*"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">this.ctag</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT">
-<span class='line'>639</span> </span><span class="WHIT">              </span><span class="STRN">"\n*([\\s\\S]+?)"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">this.otag</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">"\\/\\s*\\2\\s*"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">this.ctag</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT">
-<span class='line'>640</span> </span><span class="WHIT">              </span><span class="STRN">"\\s*"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"mg"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>641</span> 
-<span class='line'>642</span> </span><span class="WHIT">      </span><span class="COMM">// for each {{#foo}}{{/foo}} section do...</span><span class="WHIT">
-<span class='line'>643</span> </span><span class="WHIT">      </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">template.replace</span><span class="PUNC">(</span><span class="NAME">regex</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">match</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">type</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">name</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">content</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>644</span> </span><span class="WHIT">        </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">value</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">that.find</span><span class="PUNC">(</span><span class="NAME">name</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">context</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>645</span> </span><span class="WHIT">        </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">type</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">"^"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="COMM">// inverted section</span><span class="WHIT">
-<span class='line'>646</span> </span><span class="WHIT">          </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">value</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">that.is_array</span><span class="PUNC">(</span><span class="NAME">value</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">value.length</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>647</span> </span><span class="WHIT">            </span><span class="COMM">// false or empty list, render it</span><span class="WHIT">
-<span class='line'>648</span> </span><span class="WHIT">            </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">that.render</span><span class="PUNC">(</span><span class="NAME">content</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">context</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">partials</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>649</span> </span><span class="WHIT">          </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>650</span> </span><span class="WHIT">            </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>651</span> </span><span class="WHIT">          </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>652</span> </span><span class="WHIT">        </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">type</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">"#"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="COMM">// normal section</span><span class="WHIT">
-<span class='line'>653</span> </span><span class="WHIT">          </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">that.is_array</span><span class="PUNC">(</span><span class="NAME">value</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="COMM">// Enumerable, Let's loop!</span><span class="WHIT">
-<span class='line'>654</span> </span><span class="WHIT">            </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">that.map</span><span class="PUNC">(</span><span class="NAME">value</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">row</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>655</span> </span><span class="WHIT">              </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">that.render</span><span class="PUNC">(</span><span class="NAME">content</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">that.create_context</span><span class="PUNC">(</span><span class="NAME">row</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>656</span> </span><span class="WHIT">                </span><span class="NAME">partials</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>657</span> </span><span class="WHIT">            </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">join</span><span class="PUNC">(</span><span class="STRN">""</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>658</span> </span><span class="WHIT">          </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">that.is_object</span><span class="PUNC">(</span><span class="NAME">value</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="COMM">// Object, Use it as subcontext!</span><span class="WHIT">
-<span class='line'>659</span> </span><span class="WHIT">            </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">that.render</span><span class="PUNC">(</span><span class="NAME">content</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">that.create_context</span><span class="PUNC">(</span><span class="NAME">value</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>660</span> </span><span class="WHIT">              </span><span class="NAME">partials</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>661</span> </span><span class="WHIT">          </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">value</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">"function"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>662</span> </span><span class="WHIT">            </span><span class="COMM">// higher order section</span><span class="WHIT">
-<span class='line'>663</span> </span><span class="WHIT">            </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">value.call</span><span class="PUNC">(</span><span class="NAME">context</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">content</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">text</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>664</span> </span><span class="WHIT">              </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">that.render</span><span class="PUNC">(</span><span class="NAME">text</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">context</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">partials</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>665</span> </span><span class="WHIT">            </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>666</span> </span><span class="WHIT">          </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">value</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="COMM">// boolean section</span><span class="WHIT">
-<span class='line'>667</span> </span><span class="WHIT">            </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">that.render</span><span class="PUNC">(</span><span class="NAME">content</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">context</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">partials</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>668</span> </span><span class="WHIT">          </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>669</span> </span><span class="WHIT">            </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>670</span> </span><span class="WHIT">          </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>671</span> </span><span class="WHIT">        </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>672</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>673</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>674</span> 
-<span class='line'>675</span> </span><span class="WHIT">    </span><span class="COMM">/*
-<span class='line'>676</span>       Replace {{foo}} and friends with values from our view
-<span class='line'>677</span>     */</span><span class="WHIT">
-<span class='line'>678</span> </span><span class="WHIT">    </span><span class="NAME">render_tags</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">template</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">context</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">partials</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">in_recursion</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>679</span> </span><span class="WHIT">      </span><span class="COMM">// tit for tat</span><span class="WHIT">
-<span class='line'>680</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">that</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">this</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>681</span> 
-<span class='line'>682</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">new_regex</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>683</span> </span><span class="WHIT">        </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">RegExp</span><span class="PUNC">(</span><span class="NAME">that.otag</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">"(=|!|>|\\{|%)?([^\\/#\\^]+?)\\1?"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT">
-<span class='line'>684</span> </span><span class="WHIT">          </span><span class="NAME">that.ctag</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">"+"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"g"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>685</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>686</span> 
-<span class='line'>687</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">regex</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">new_regex</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>688</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">tag_replace_callback</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">match</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">operator</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">name</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>689</span> </span><span class="WHIT">        </span><span class="KEYW">switch</span><span class="PUNC">(</span><span class="NAME">operator</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>690</span> </span><span class="WHIT">        </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">"!"</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="COMM">// ignore comments</span><span class="WHIT">
-<span class='line'>691</span> </span><span class="WHIT">          </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>692</span> </span><span class="WHIT">        </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">"="</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="COMM">// set new delimiters, rebuild the replace regexp</span><span class="WHIT">
-<span class='line'>693</span> </span><span class="WHIT">          </span><span class="NAME">that.set_delimiters</span><span class="PUNC">(</span><span class="NAME">name</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>694</span> </span><span class="WHIT">          </span><span class="NAME">regex</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">new_regex</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>695</span> </span><span class="WHIT">          </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>696</span> </span><span class="WHIT">        </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">">"</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="COMM">// render partial</span><span class="WHIT">
-<span class='line'>697</span> </span><span class="WHIT">          </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">that.render_partial</span><span class="PUNC">(</span><span class="NAME">name</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">context</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">partials</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>698</span> </span><span class="WHIT">        </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">"{"</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="COMM">// the triple mustache is unescaped</span><span class="WHIT">
-<span class='line'>699</span> </span><span class="WHIT">          </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">that.find</span><span class="PUNC">(</span><span class="NAME">name</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">context</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>700</span> </span><span class="WHIT">        </span><span class="KEYW">default</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="COMM">// escape the value</span><span class="WHIT">
-<span class='line'>701</span> </span><span class="WHIT">          </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">that.escape</span><span class="PUNC">(</span><span class="NAME">that.find</span><span class="PUNC">(</span><span class="NAME">name</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">context</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>702</span> </span><span class="WHIT">        </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>703</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>704</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">lines</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">template.split</span><span class="PUNC">(</span><span class="STRN">"\n"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>705</span> </span><span class="WHIT">      </span><span class="KEYW">for</span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">lines.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>706</span> </span><span class="WHIT">        </span><span class="NAME">lines</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">lines</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="NAME">regex</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">tag_replace_callback</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">this</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>707</span> </span><span class="WHIT">        </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">in_recursion</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>708</span> </span><span class="WHIT">          </span><span class="NAME">this.send</span><span class="PUNC">(</span><span class="NAME">lines</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>709</span> </span><span class="WHIT">        </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>710</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>711</span> 
-<span class='line'>712</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">in_recursion</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>713</span> </span><span class="WHIT">        </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">lines.join</span><span class="PUNC">(</span><span class="STRN">"\n"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>714</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>715</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>716</span> 
-<span class='line'>717</span> </span><span class="WHIT">    </span><span class="NAME">set_delimiters</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">delimiters</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>718</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">dels</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">delimiters.split</span><span class="PUNC">(</span><span class="STRN">" "</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>719</span> </span><span class="WHIT">      </span><span class="NAME">this.otag</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.escape_regex</span><span class="PUNC">(</span><span class="NAME">dels</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>720</span> </span><span class="WHIT">      </span><span class="NAME">this.ctag</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.escape_regex</span><span class="PUNC">(</span><span class="NAME">dels</span><span class="PUNC">[</span><span class="NUMB">1</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>721</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>722</span> 
-<span class='line'>723</span> </span><span class="WHIT">    </span><span class="NAME">escape_regex</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">text</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>724</span> </span><span class="WHIT">      </span><span class="COMM">// thank you Simon Willison</span><span class="WHIT">
-<span class='line'>725</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">arguments.callee.sRE</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>726</span> </span><span class="WHIT">        </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">specials</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="WHIT">
-<span class='line'>727</span> </span><span class="WHIT">          </span><span class="STRN">'/'</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'.'</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'*'</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'+'</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'?'</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'|'</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>728</span> </span><span class="WHIT">          </span><span class="STRN">'('</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">')'</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'['</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">']'</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'{'</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'}'</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'\\'</span><span class="WHIT">
-<span class='line'>729</span> </span><span class="WHIT">        </span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>730</span> </span><span class="WHIT">        </span><span class="NAME">arguments.callee.sRE</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">RegExp</span><span class="PUNC">(</span><span class="WHIT">
-<span class='line'>731</span> </span><span class="WHIT">          </span><span class="STRN">'(\\'</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">specials.join</span><span class="PUNC">(</span><span class="STRN">'|\\'</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">')'</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'g'</span><span class="WHIT">
-<span class='line'>732</span> </span><span class="WHIT">        </span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>733</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>734</span> </span><span class="WHIT">      </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">text.replace</span><span class="PUNC">(</span><span class="NAME">arguments.callee.sRE</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'\\$1'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>735</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>736</span> 
-<span class='line'>737</span> </span><span class="WHIT">    </span><span class="COMM">/*
-<span class='line'>738</span>       find `name` in current `context`. That is find me a value
-<span class='line'>739</span>       from the view object
-<span class='line'>740</span>     */</span><span class="WHIT">
-<span class='line'>741</span> </span><span class="WHIT">    </span><span class="NAME">find</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">name</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">context</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>742</span> </span><span class="WHIT">      </span><span class="NAME">name</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.trim</span><span class="PUNC">(</span><span class="NAME">name</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>743</span> 
-<span class='line'>744</span> </span><span class="WHIT">      </span><span class="COMM">// Checks whether a value is thruthy or false or 0</span><span class="WHIT">
-<span class='line'>745</span> </span><span class="WHIT">      </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">is_kinda_truthy</span><span class="PUNC">(</span><span class="NAME">bool</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>746</span> </span><span class="WHIT">        </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">bool</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">bool</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">bool</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>747</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>748</span> 
-<span class='line'>749</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">value</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>750</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">is_kinda_truthy</span><span class="PUNC">(</span><span class="NAME">context</span><span class="PUNC">[</span><span class="NAME">name</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>751</span> </span><span class="WHIT">        </span><span class="NAME">value</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">context</span><span class="PUNC">[</span><span class="NAME">name</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>752</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">is_kinda_truthy</span><span class="PUNC">(</span><span class="NAME">this.context</span><span class="PUNC">[</span><span class="NAME">name</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>753</span> </span><span class="WHIT">        </span><span class="NAME">value</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.context</span><span class="PUNC">[</span><span class="NAME">name</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>754</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>755</span> 
-<span class='line'>756</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">value</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">"function"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>757</span> </span><span class="WHIT">        </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">value.apply</span><span class="PUNC">(</span><span class="NAME">context</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>758</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>759</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">value</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>760</span> </span><span class="WHIT">        </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">value</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>761</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>762</span> </span><span class="WHIT">      </span><span class="COMM">// silently ignore unkown variables</span><span class="WHIT">
-<span class='line'>763</span> </span><span class="WHIT">      </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>764</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>765</span> 
-<span class='line'>766</span> </span><span class="WHIT">    </span><span class="COMM">// Utility methods</span><span class="WHIT">
-<span class='line'>767</span> 
-<span class='line'>768</span> </span><span class="WHIT">    </span><span class="COMM">/* includes tag */</span><span class="WHIT">
-<span class='line'>769</span> </span><span class="WHIT">    </span><span class="NAME">includes</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">needle</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">haystack</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>770</span> </span><span class="WHIT">      </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">haystack.indexOf</span><span class="PUNC">(</span><span class="NAME">this.otag</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">needle</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>771</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>772</span> 
-<span class='line'>773</span> </span><span class="WHIT">    </span><span class="COMM">/*
-<span class='line'>774</span>       Does away with nasty characters
-<span class='line'>775</span>     */</span><span class="WHIT">
-<span class='line'>776</span> </span><span class="WHIT">    </span><span class="NAME">escape</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">s</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>777</span> </span><span class="WHIT">      </span><span class="NAME">s</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">String</span><span class="PUNC">(</span><span class="NAME">s</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="STRN">""</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">s</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>778</span> </span><span class="WHIT">      </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">s.replace</span><span class="PUNC">(</span><span class="REGX">/&(?!\w+;)|["'&lt;>\\]/g</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">s</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>779</span> </span><span class="WHIT">        </span><span class="KEYW">switch</span><span class="PUNC">(</span><span class="NAME">s</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>780</span> </span><span class="WHIT">        </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">"&"</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="STRN">"&amp;"</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>781</span> </span><span class="WHIT">        </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">"\\"</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="STRN">"\\\\"</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>782</span> </span><span class="WHIT">        </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">'"'</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="STRN">'&quot;'</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>783</span> </span><span class="WHIT">        </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">"'"</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="STRN">'&#39;'</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>784</span> </span><span class="WHIT">        </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">"&lt;"</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="STRN">"&lt;"</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>785</span> </span><span class="WHIT">        </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">">"</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="STRN">"&gt;"</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>786</span> </span><span class="WHIT">        </span><span class="KEYW">default</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">s</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>787</span> </span><span class="WHIT">        </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>788</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>789</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>790</span> 
-<span class='line'>791</span> </span><span class="WHIT">    </span><span class="COMM">// by @langalex, support for arrays of strings</span><span class="WHIT">
-<span class='line'>792</span> </span><span class="WHIT">    </span><span class="NAME">create_context</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">_context</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>793</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">this.is_object</span><span class="PUNC">(</span><span class="NAME">_context</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>794</span> </span><span class="WHIT">        </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">_context</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>795</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>796</span> </span><span class="WHIT">        </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">iterator</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"."</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>797</span> </span><span class="WHIT">        </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">this.pragmas</span><span class="PUNC">[</span><span class="STRN">"IMPLICIT-ITERATOR"</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>798</span> </span><span class="WHIT">          </span><span class="NAME">iterator</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.pragmas</span><span class="PUNC">[</span><span class="STRN">"IMPLICIT-ITERATOR"</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">iterator</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>799</span> </span><span class="WHIT">        </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>800</span> </span><span class="WHIT">        </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">ctx</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>801</span> </span><span class="WHIT">        </span><span class="NAME">ctx</span><span class="PUNC">[</span><span class="NAME">iterator</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_context</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>802</span> </span><span class="WHIT">        </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">ctx</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>803</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>804</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>805</span> 
-<span class='line'>806</span> </span><span class="WHIT">    </span><span class="NAME">is_object</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>807</span> </span><span class="WHIT">      </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">a</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">"object"</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>808</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>809</span> 
-<span class='line'>810</span> </span><span class="WHIT">    </span><span class="NAME">is_array</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>811</span> </span><span class="WHIT">      </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">Object.prototype.toString.call</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'[object Array]'</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>812</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>813</span> 
-<span class='line'>814</span> </span><span class="WHIT">    </span><span class="COMM">/*
-<span class='line'>815</span>       Gets rid of leading and trailing whitespace
-<span class='line'>816</span>     */</span><span class="WHIT">
-<span class='line'>817</span> </span><span class="WHIT">    </span><span class="NAME">trim</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">s</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>818</span> </span><span class="WHIT">      </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">s.replace</span><span class="PUNC">(</span><span class="REGX">/^\s*|\s*$/g</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>819</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>820</span> 
-<span class='line'>821</span> </span><span class="WHIT">    </span><span class="COMM">/*
-<span class='line'>822</span>       Why, why, why? Because IE. Cry, cry cry.
-<span class='line'>823</span>     */</span><span class="WHIT">
-<span class='line'>824</span> </span><span class="WHIT">    </span><span class="NAME">map</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">array</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">fn</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>825</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">array.map</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">"function"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>826</span> </span><span class="WHIT">        </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">array.map</span><span class="PUNC">(</span><span class="NAME">fn</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>827</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>828</span> </span><span class="WHIT">        </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">r</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>829</span> </span><span class="WHIT">        </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">l</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">array.length</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>830</span> </span><span class="WHIT">        </span><span class="KEYW">for</span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">l</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>831</span> </span><span class="WHIT">          </span><span class="NAME">r.push</span><span class="PUNC">(</span><span class="NAME">fn</span><span class="PUNC">(</span><span class="NAME">array</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>832</span> </span><span class="WHIT">        </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>833</span> </span><span class="WHIT">        </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">r</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>834</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>835</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>836</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>837</span> 
-<span class='line'>838</span> </span><span class="WHIT">  </span><span class="KEYW">return</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>839</span> </span><span class="WHIT">    </span><span class="NAME">name</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"mustache.js"</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>840</span> </span><span class="WHIT">    </span><span class="NAME">version</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"0.3.1-dev"</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>841</span> 
-<span class='line'>842</span> </span><span class="WHIT">    </span><span class="COMM">/*
-<span class='line'>843</span>       Turns a template and view into HTML
-<span class='line'>844</span>     */</span><span class="WHIT">
-<span class='line'>845</span> </span><span class="WHIT">    </span><span class="NAME">to_html</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">template</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">view</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">partials</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">send_fun</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>846</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">renderer</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">Renderer</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>847</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">send_fun</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>848</span> </span><span class="WHIT">        </span><span class="NAME">renderer.send</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">send_fun</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>849</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>850</span> </span><span class="WHIT">      </span><span class="NAME">renderer.render</span><span class="PUNC">(</span><span class="NAME">template</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">view</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">partials</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>851</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">send_fun</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>852</span> </span><span class="WHIT">        </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">renderer.buffer.join</span><span class="PUNC">(</span><span class="STRN">"\n"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>853</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>854</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>855</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>856</span> </span><span class="PUNC">}</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>857</span> </span><span class="COMM">// Underscore.js 1.2.3</span><span class="WHIT">
-<span class='line'>858</span> </span><span class="COMM">// (c) 2009-2011 Jeremy Ashkenas, DocumentCloud Inc.</span><span class="WHIT">
-<span class='line'>859</span> </span><span class="COMM">// Underscore is freely distributable under the MIT license.</span><span class="WHIT">
-<span class='line'>860</span> </span><span class="COMM">// Portions of Underscore are inspired or borrowed from Prototype,</span><span class="WHIT">
-<span class='line'>861</span> </span><span class="COMM">// Oliver Steele's Functional, and John Resig's Micro-Templating.</span><span class="WHIT">
-<span class='line'>862</span> </span><span class="COMM">// For all details and documentation:</span><span class="WHIT">
-<span class='line'>863</span> </span><span class="COMM">// http://documentcloud.github.com/underscore</span><span class="WHIT">
-<span class='line'>864</span> </span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">r</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">===</span><span class="NAME">c</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">!==</span><span class="NUMB">0</span><span class="PUNC">||</span><span class="NUMB">1</span><span class="PUNC">/</span><span class="NAME">a</span><span class="PUNC">==</span><span class="NUMB">1</span><span class="PUNC">/</span><span class="NAME">c</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">==</span><span class="KEYW">null</span><span class="PUNC">||</span><span class="NAME">c</span><span class="PUNC">==</span><span class="KEYW">null</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">===</span><span class="NAME">c</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">a._chain</span><span class="PUNC">)</span><span class="NAME">a</span><span class="PUNC">=</span><span class="NAME">a._wrapped</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">c._chain</span><span class="PUNC">)</span><span class="NAME">c</span><span class="PUNC">=</span><span class="NAME">c._wrapped</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">a.isEqual</span><span class="PUNC">&&</span><span class="NAME">b.isFunction</span><span class="PUNC">(</span><span class="NAME">a.isEqual</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a.isEqual</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">c.isEqual</span><span class="PUNC">&&</span><span class="NAME">b.isFunction</span><span class="PUNC">(</span><span class="NAME">c.isEqual</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">c.isEqual</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">=</span><span class="NAME">l.call</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">!=</span><span class="NAME">l.call</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="KEYW">switch</span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">"[object String]"</span><span class="PUNC">:</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">==</span><span class="NAME">String</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">"[object Number]"</span><span class="PUNC">:</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">!=</span><span class="PUNC">+</span><span class="NAME">a</span><span class="PUNC">?</span><span class="NAME">c</span><span class="PUNC">!=</span><span class="PUNC">+</span><span class="NAME">c</span><span class="PUNC">:</span><span class="NAME">a</span><span class="PUNC">==</span><span class="NUMB">0</span><span class="PUNC">?</span><span class="NUMB">1</span><span class="PUNC">/</span><span class="NAME">a</span><span class="PUNC">==</span><span class="NUMB">1</span><span class="PUNC">/</span><span class="NAME">c</span><span class="PUNC">:</span><span class="NAME">a</span><span class="PUNC">==</span><span class="PUNC">+</span><span class="NAME">c</span><span class="PUNC">;</span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">"[object Date]"</span><span class="PUNC">:</span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">"[object Boolean]"</span><span class="PUNC">:</span><span class="KEYW">return</span><span class="PUNC">+</span><span class="NAME">a</span><span class="PUNC">==</span><span class="PUNC">+</span><span class="NAME">c</span><span class="PUNC">;</span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">"[object RegExp]"</span><span class="PUNC">:</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a.source</span><span class="PUNC">==</span><span class="WHIT">
-<span class='line'>865</span> </span><span class="NAME">c.source</span><span class="PUNC">&&</span><span class="NAME">a.global</span><span class="PUNC">==</span><span class="NAME">c.global</span><span class="PUNC">&&</span><span class="NAME">a.multiline</span><span class="PUNC">==</span><span class="NAME">c.multiline</span><span class="PUNC">&&</span><span class="NAME">a.ignoreCase</span><span class="PUNC">==</span><span class="NAME">c.ignoreCase</span><span class="PUNC">}</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">!=</span><span class="STRN">"object"</span><span class="PUNC">||</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">c</span><span class="PUNC">!=</span><span class="STRN">"object"</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="KEYW">for</span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">f</span><span class="PUNC">=</span><span class="NAME">d.length</span><span class="PUNC">;</span><span class="NAME">f</span><span class="PUNC">--</span><span class="PUNC">;</span><span class="PUNC">)</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">d</span><span class="PUNC">[</span><span class="NAME">f</span><span class="PUNC">]</span><span class="PUNC">==</span><span class="NAME">a</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="NAME">d.push</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">f</span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">,</span><span class="NAME">g</span><span class="PUNC">=</span><span class="KEYW">true</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">==</span><span class="STRN">"[object Array]"</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">f</span><span class="PUNC">=</span><span class="NAME">a.length</span><span class="PUNC">,</span><span class="NAME">g</span><span class="PUNC">=</span><span class="NAME">f</span><span class="PUNC">==</span><span class="NAME">c.length</span><span class="PUNC">)</span><span class="KEYW">for</span><span class="PUNC">(</span><span class="PUNC">;</span><span class="NAME">f</span><span class="PUNC">--</span><span class="PUNC">;</span><span class="PUNC">)</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="PUNC">(</span><span class="NAME">g</span><span class="PUNC">=</span><span class="NAME">f</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">==</span><span class="NAME">f</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">c</span><span class="PUNC">&&</span><span class="NAME">r</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">[</span><span class="NAME">f</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">[</span><span class="NAME">f</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="KEYW">break</span><span class="PUNC">}</span><span class="KEYW">else</span><span class="PUNC">{</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="STRN">"constructor"</span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">!=</span><span class="STRN">"constructor"</span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">c</span><span class="PUNC">||</span><span class="NAME">a.constructor</span><span class="PUNC">!=</span><span class="NAME">c.constructor</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="KEYW">for</span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">h</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">)</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">m.call</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">h</span><span class="PUNC">)</span><span class="PUNC">&&</span><span class="PUNC">(</span><span class="NAME">f</span><span class="PUNC">++</span><span class="PUNC">,</span><span class="PUNC">!</span><span class="PUNC">(</span><span class="NAME">g</span><span class="PUNC">=</span><span class="NAME">m.call</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">h</span><span class="PUNC">)</span><span class="PUNC">&&</span><span class="NAME">r</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">[</span><span class="NAME">h</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">[</span><span class="NAME">h</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="KEYW">break</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">g</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">for</span><span class="PUNC">(</span><span class="NAME">h</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">c</span><span class="PUNC">)</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">m.call</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>866</span> </span><span class="NAME">h</span><span class="PUNC">)</span><span class="PUNC">&&</span><span class="PUNC">!</span><span class="NAME">f</span><span class="PUNC">--</span><span class="PUNC">)</span><span class="KEYW">break</span><span class="PUNC">;</span><span class="NAME">g</span><span class="PUNC">=</span><span class="PUNC">!</span><span class="NAME">f</span><span class="PUNC">}</span><span class="PUNC">}</span><span class="NAME">d.pop</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">g</span><span class="PUNC">}</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">s</span><span class="PUNC">=</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="NAME">F</span><span class="PUNC">=</span><span class="NAME">s._</span><span class="PUNC">,</span><span class="NAME">o</span><span class="PUNC">=</span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="NAME">k</span><span class="PUNC">=</span><span class="NAME">Array.prototype</span><span class="PUNC">,</span><span class="NAME">p</span><span class="PUNC">=</span><span class="NAME">Object.prototype</span><span class="PUNC">,</span><span class="NAME">i</span><span class="PUNC">=</span><span class="NAME">k.slice</span><span class="PUNC">,</span><span class="NAME">G</span><span class="PUNC">=</span><span class="NAME">k.concat</span><span class="PUNC">,</span><span class="NAME">H</span><span class="PUNC">=</span><span class="NAME">k.unshift</span><span class="PUNC">,</span><span class="NAME">l</span><span class="PUNC">=</span><span class="NAME">p.toString</span><span class="PUNC">,</span><span class="NAME">m</span><span class="PUNC">=</span><span class="NAME">p.hasOwnProperty</span><span class="PUNC">,</span><span class="NAME">v</span><span class="PUNC">=</span><span class="NAME">k.forEach</span><span class="PUNC">,</span><span class="NAME">w</span><span class="PUNC">=</span><span class="NAME">k.map</span><span class="PUNC">,</span><span class="NAME">x</span><span class="PUNC">=</span><span class="NAME">k.reduce</span><span class="PUNC">,</span><span class="NAME">y</span><span class="PUNC">=</span><span class="NAME">k.reduceRight</span><span class="PUNC">,</span><span class="NAME">z</span><span class="PUNC">=</span><span class="NAME">k.filter</span><span class="PUNC">,</span><span class="NAME">A</span><span class="PUNC">=</span><span class="NAME">k.every</span><span class="PUNC">,</span><span class="NAME">B</span><span class="PUNC">=</span><span class="NAME">k.some</span><span class="PUNC">,</span><span class="NAME">q</span><span class="PUNC">=</span><span class="NAME">k.indexOf</span><span class="PUNC">,</span><span class="NAME">C</span><span class="PUNC">=</span><span class="NAME">k.lastIndexOf</span><span class="PUNC">,</span><span class="NAME">p</span><span class="PUNC">=</span><span class="NAME">Array.isArray</span><span class="PUNC">,</span><span class="NAME">I</span><span class="PUNC">=</span><span class="NAME">Object.keys</span><span class="PUNC">,</span><span class="NAME">t</span><span class="PUNC">=</span><span class="NAME">Function.prototype.bind</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">n</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">exports</span><span class="PUNC">!==</span><span class="STRN">"undefined"</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">module</span><span class="PUNC">!==</span><span class="STRN">"undefined"</span><span class="PUNC">&&</span><span class="NAME">module.exports</span><span class="PUNC">)</span><span class="NAME">exports</span><span class="PUNC">=</span><span class="NAME">module.exports</span><span class="PUNC">=</span><span class="NAME">b</span><span class="PUNC">;</span><span class="NAME">exports._</span><span class="PUNC">=</span><span class="NAME">b</span><span class="PUNC">}</span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">define</span><span class="PUNC">===</span><span class="STRN">"function"</span><span class="PUNC">&&</span><span class="WHIT">
-<span class='line'>867</span> </span><span class="NAME">define.amd</span><span class="PUNC">?</span><span class="NAME">define</span><span class="PUNC">(</span><span class="STRN">"underscore"</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">:</span><span class="NAME">s._</span><span class="PUNC">=</span><span class="NAME">b</span><span class="PUNC">;</span><span class="NAME">b.VERSION</span><span class="PUNC">=</span><span class="STRN">"1.2.3"</span><span class="PUNC">;</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">j</span><span class="PUNC">=</span><span class="NAME">b.each</span><span class="PUNC">=</span><span class="NAME">b.forEach</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">!=</span><span class="KEYW">null</span><span class="PUNC">)</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">v</span><span class="PUNC">&&</span><span class="NAME">a.forEach</span><span class="PUNC">===</span><span class="NAME">v</span><span class="PUNC">)</span><span class="NAME">a.forEach</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">a.length</span><span class="PUNC">===</span><span class="PUNC">+</span><span class="NAME">a.length</span><span class="PUNC">)</span><span class="KEYW">for</span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">,</span><span class="NAME">f</span><span class="PUNC">=</span><span class="NAME">a.length</span><span class="PUNC">;</span><span class="NAME">e</span><span class="PUNC">&lt;</span><span class="NAME">f</span><span class="PUNC">;</span><span class="NAME">e</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">e</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">&&</span><span class="NAME">c.call</span><span class="PUNC">(</span><span class="NAME">b</span><span class="PUNC">,</span><span class="NAME">a</span><span class="PUNC">[</span><span class="NAME">e</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="NAME">e</span><span class="PUNC">,</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">===</span><span class="NAME">o</span><span class="PUNC">)</span><span class="KEYW">break</span><span class="PUNC">}</span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">for</span><span class="PUNC">(</span><span class="NAME">e</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">)</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">m.call</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">e</span><span class="PUNC">)</span><span class="PUNC">&&</span><span class="NAME">c.call</span><span class="PUNC">(</span><span class="NAME">b</span><span class="PUNC">,</span><span class="NAME">a</span><span class="PUNC">[</span><span class="NAME">e</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="NAME">e</span><span class="PUNC">,</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">===</span><span class="NAME">o</span><span class="PUNC">)</span><span class="KEYW">break</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.map</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">=</span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">==</span><span class="KEYW">null</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">w</span><span class="PUNC">&&</span><span class="NAME">a.map</span><span class="PUNC">===</span><span class="NAME">w</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a.map</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="NAME">j</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">g</span><span class="PUNC">,</span><span class="NAME">h</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">e</span><span class="PUNC">[</span><span class="NAME">e.length</span><span class="PUNC">]</span><span class="PUNC">=</span><span class="NAME">c.call</span><span class="PUNC">(</span><span class="NAME">b</span><span class="PUNC">,</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">g</span><span class="PUNC">,</span><span class="NAME">h</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.reduce</span><span class="PUNC">=</span><span class="NAME">b.foldl</span><span class="PUNC">=</span><span class="NAME">b.inject</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>868</span> </span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">,</span><span class="NAME">e</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">f</span><span class="PUNC">=</span><span class="NAME">arguments.length</span><span class="PUNC">></span><span class="NUMB">2</span><span class="PUNC">;</span><span class="NAME">a</span><span class="PUNC">==</span><span class="KEYW">null</span><span class="PUNC">&&</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">=</span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">x</span><span class="PUNC">&&</span><span class="NAME">a.reduce</span><span class="PUNC">===</span><span class="NAME">x</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">&&</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">=</span><span class="NAME">b.bind</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">e</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="NAME">f</span><span class="PUNC">?</span><span class="NAME">a.reduce</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">:</span><span class="NAME">a.reduce</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="NAME">j</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">,</span><span class="NAME">i</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">f</span><span class="PUNC">?</span><span class="NAME">d</span><span class="PUNC">=</span><span class="NAME">c.call</span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">,</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">,</span><span class="NAME">i</span><span class="PUNC">)</span><span class="PUNC">:</span><span class="PUNC">(</span><span class="NAME">d</span><span class="PUNC">=</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">f</span><span class="PUNC">=</span><span class="KEYW">true</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">f</span><span class="PUNC">)</span><span class="KEYW">throw</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">TypeError</span><span class="PUNC">(</span><span class="STRN">"Reduce of empty array with no initial value"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.reduceRight</span><span class="PUNC">=</span><span class="NAME">b.foldr</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">,</span><span class="NAME">e</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">f</span><span class="PUNC">=</span><span class="NAME">arguments.length</span><span class="PUNC">></span><span class="NUMB">2</span><span class="PUNC">;</span><span class="NAME">a</span><span class="PUNC">==</span><span class="KEYW">null</span><span class="PUNC">&&</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">=</span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">y</span><span class="PUNC">&&</span><span class="NAME">a.reduceRight</span><span class="PUNC">===</span><span class="NAME">y</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">&&</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">=</span><span class="NAME">b.bind</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">e</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="NAME">f</span><span class="PUNC">?</span><span class="NAME">a.reduceRight</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">:</span><span class="NAME">a.reduceRight</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">g</span><span class="PUNC">=</span><span class="NAME">b.toArray</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">reverse</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="NAME">e</span><span class="PUNC">&&</span><span class="PUNC">!</span><span class="NAME">f</span><span class="PUNC">&&</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">=</span><span class="NAME">b.bind</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">e</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">f</span><span class="PUNC">?</span><span class="NAME">b.reduce</span><span class="PUNC">(</span><span class="NAME">g</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>869</span> </span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">,</span><span class="NAME">e</span><span class="PUNC">)</span><span class="PUNC">:</span><span class="NAME">b.reduce</span><span class="PUNC">(</span><span class="NAME">g</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.find</span><span class="PUNC">=</span><span class="NAME">b.detect</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">;</span><span class="NAME">D</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">g</span><span class="PUNC">,</span><span class="NAME">h</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">c.call</span><span class="PUNC">(</span><span class="NAME">b</span><span class="PUNC">,</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">g</span><span class="PUNC">,</span><span class="NAME">h</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">=</span><span class="NAME">a</span><span class="PUNC">,</span><span class="KEYW">true</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.filter</span><span class="PUNC">=</span><span class="NAME">b.select</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">=</span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">==</span><span class="KEYW">null</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">z</span><span class="PUNC">&&</span><span class="NAME">a.filter</span><span class="PUNC">===</span><span class="NAME">z</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a.filter</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="NAME">j</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">g</span><span class="PUNC">,</span><span class="NAME">h</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">c.call</span><span class="PUNC">(</span><span class="NAME">b</span><span class="PUNC">,</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">g</span><span class="PUNC">,</span><span class="NAME">h</span><span class="PUNC">)</span><span class="PUNC">&&</span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">[</span><span class="NAME">e.length</span><span class="PUNC">]</span><span class="PUNC">=</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.reject</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">=</span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">==</span><span class="KEYW">null</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">;</span><span class="NAME">j</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">g</span><span class="PUNC">,</span><span class="NAME">h</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">c.call</span><span class="PUNC">(</span><span class="NAME">b</span><span class="PUNC">,</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">g</span><span class="PUNC">,</span><span class="NAME">h</span><span class="PUNC">)</span><span class="PUNC">||</span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">[</span><span class="NAME">e.length</span><span class="PUNC">]</span><span class="PUNC">=</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.every</span><span class="PUNC">=</span><span class="NAME">b.all</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">=</span><span class="KEYW">true</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">==</span><span class="KEYW">null</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">A</span><span class="PUNC">&&</span><span class="NAME">a.every</span><span class="PUNC">===</span><span class="NAME">A</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a.every</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>870</span> </span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="NAME">j</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">g</span><span class="PUNC">,</span><span class="NAME">h</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">=</span><span class="NAME">e</span><span class="PUNC">&&</span><span class="NAME">c.call</span><span class="PUNC">(</span><span class="NAME">b</span><span class="PUNC">,</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">g</span><span class="PUNC">,</span><span class="NAME">h</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">o</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">D</span><span class="PUNC">=</span><span class="NAME">b.some</span><span class="PUNC">=</span><span class="NAME">b.any</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">c</span><span class="PUNC">||</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">=</span><span class="NAME">b.identity</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">=</span><span class="KEYW">false</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">==</span><span class="KEYW">null</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">B</span><span class="PUNC">&&</span><span class="NAME">a.some</span><span class="PUNC">===</span><span class="NAME">B</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a.some</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="NAME">j</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">,</span><span class="NAME">h</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">||</span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">=</span><span class="NAME">c.call</span><span class="PUNC">(</span><span class="NAME">d</span><span class="PUNC">,</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">,</span><span class="NAME">h</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">o</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="PUNC">!</span><span class="PUNC">!</span><span class="NAME">e</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.include</span><span class="PUNC">=</span><span class="NAME">b.contains</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">=</span><span class="KEYW">false</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">==</span><span class="KEYW">null</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">q</span><span class="PUNC">&&</span><span class="NAME">a.indexOf</span><span class="PUNC">===</span><span class="NAME">q</span><span class="PUNC">?</span><span class="NAME">a.indexOf</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">!=</span><span class="PUNC">-</span><span class="NUMB">1</span><span class="PUNC">:</span><span class="NAME">b</span><span class="PUNC">=</span><span class="NAME">D</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">===</span><span class="NAME">c</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.invoke</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">=</span><span class="NAME">i.call</span><span class="PUNC">(</span><span class="NAME">arguments</span><span class="PUNC">,</span><span class="NUMB">2</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">b.map</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="PUNC">(</span><span class="NAME">c.call</span><span class="PUNC">?</span><span class="NAME">c</span><span class="PUNC">||</span><span class="NAME">a</span><span class="PUNC">:</span><span class="NAME">a</span><span class="PUNC">[</span><span class="NAME">c</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">apply</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>871</span> </span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.pluck</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">b.map</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">[</span><span class="NAME">c</span><span class="PUNC">]</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.max</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">c</span><span class="PUNC">&&</span><span class="NAME">b.isArray</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">Math.max.apply</span><span class="PUNC">(</span><span class="NAME">Math</span><span class="PUNC">,</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">c</span><span class="PUNC">&&</span><span class="NAME">b.isEmpty</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="PUNC">-</span><span class="NAME">Infinity</span><span class="PUNC">;</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">=</span><span class="PUNC">{</span><span class="NAME">computed</span><span class="PUNC">:</span><span class="PUNC">-</span><span class="NAME">Infinity</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">j</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">,</span><span class="NAME">h</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">b</span><span class="PUNC">=</span><span class="NAME">c</span><span class="PUNC">?</span><span class="NAME">c.call</span><span class="PUNC">(</span><span class="NAME">d</span><span class="PUNC">,</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">,</span><span class="NAME">h</span><span class="PUNC">)</span><span class="PUNC">:</span><span class="NAME">a</span><span class="PUNC">;</span><span class="NAME">b</span><span class="PUNC">>=</span><span class="NAME">e.computed</span><span class="PUNC">&&</span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">=</span><span class="PUNC">{</span><span class="NAME">value</span><span class="PUNC">:</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">computed</span><span class="PUNC">:</span><span class="NAME">b</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">e.value</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.min</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">c</span><span class="PUNC">&&</span><span class="NAME">b.isArray</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">Math.min.apply</span><span class="PUNC">(</span><span class="NAME">Math</span><span class="PUNC">,</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">c</span><span class="PUNC">&&</span><span class="NAME">b.isEmpty</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">Infinity</span><span class="PUNC">;</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">=</span><span class="PUNC">{</span><span class="NAME">computed</span><span class="PUNC">:</span><span class="NAME">Infinity</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">j</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">,</span><span class="NAME">h</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">b</span><span class="PUNC">=</span><span class="NAME">c</span><span class="PUNC">?</span><span class="NAME">c.call</span><span class="PUNC">(</span><span class="NAME">d</span><span class="PUNC">,</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">,</span><span class="NAME">h</span><span class="PUNC">)</span><span class="PUNC">:</span><span class="NAME">a</span><span class="PUNC">;</span><span class="NAME">b</span><span class="PUNC">&lt;</span><span class="NAME">e.computed</span><span class="PUNC">&&</span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">=</span><span class="PUNC">{</span><span class="NAME">value</span><span class="PUNC">:</span><span class="NAME">a</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>872</span> </span><span class="NAME">computed</span><span class="PUNC">:</span><span class="NAME">b</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">e.value</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.shuffle</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">c</span><span class="PUNC">=</span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">;</span><span class="NAME">j</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">f</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">f</span><span class="PUNC">==</span><span class="NUMB">0</span><span class="PUNC">?</span><span class="NAME">c</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">=</span><span class="NAME">a</span><span class="PUNC">:</span><span class="PUNC">(</span><span class="NAME">b</span><span class="PUNC">=</span><span class="NAME">Math.floor</span><span class="PUNC">(</span><span class="NAME">Math.random</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">*</span><span class="PUNC">(</span><span class="NAME">f</span><span class="PUNC">+</span><span class="NUMB">1</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">[</span><span class="NAME">f</span><span class="PUNC">]</span><span class="PUNC">=</span><span class="NAME">c</span><span class="PUNC">[</span><span class="NAME">b</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">[</span><span class="NAME">b</span><span class="PUNC">]</span><span class="PUNC">=</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">c</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.sortBy</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">b.pluck</span><span class="PUNC">(</span><span class="NAME">b.map</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">,</span><span class="NAME">g</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="PUNC">{</span><span class="NAME">value</span><span class="PUNC">:</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">criteria</span><span class="PUNC">:</span><span class="NAME">c.call</span><span class="PUNC">(</span><span class="NAME">d</span><span class="PUNC">,</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">,</span><span class="NAME">g</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">sort</span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">=</span><span class="NAME">a.criteria</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">=</span><span class="NAME">c.criteria</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">&lt;</span><span class="NAME">d</span><span class="PUNC">?</span><span class="PUNC">-</span><span class="NUMB">1</span><span class="PUNC">:</span><span class="NAME">b</span><span class="PUNC">></span><span class="NAME">d</span><span class="PUNC">?</span><span class="NUMB">1</span><span class="PUNC">:</span><span class="NUMB">0</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="STRN">"value"</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.groupBy</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">=</span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="NAME">e</span><span class="PUNC">=</span><span class="NAME">b.isFunction</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">?</span><span class="NAME">c</span><span class="PUNC">:</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">[</span><span class="NAME">c</span><span class="PUNC">]</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">j</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">c</span><span class="PUNC">=</span><span class="NAME">e</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="PUNC">(</span><span class="NAME">d</span><span class="PUNC">[</span><span class="NAME">c</span><span class="PUNC">]</span><span class="PUNC">||</span><span class="PUNC">(</span><span class="NAME">d</span><span class="PUNC">[</span><span class="NAME">c</span><span class="PUNC">]</span><span class="PUNC">=</span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">push</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.sortedIndex</span><span class="PUNC">=</span><span class="WHIT">
-<span class='line'>873</span> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">d</span><span class="PUNC">||</span><span class="PUNC">(</span><span class="NAME">d</span><span class="PUNC">=</span><span class="NAME">b.identity</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">for</span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">,</span><span class="NAME">f</span><span class="PUNC">=</span><span class="NAME">a.length</span><span class="PUNC">;</span><span class="NAME">e</span><span class="PUNC">&lt;</span><span class="NAME">f</span><span class="PUNC">;</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">g</span><span class="PUNC">=</span><span class="NAME">e</span><span class="PUNC">+</span><span class="NAME">f</span><span class="PUNC">>></span><span class="NUMB">1</span><span class="PUNC">;</span><span class="NAME">d</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">[</span><span class="NAME">g</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">&lt;</span><span class="NAME">d</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">?</span><span class="NAME">e</span><span class="PUNC">=</span><span class="NAME">g</span><span class="PUNC">+</span><span class="NUMB">1</span><span class="PUNC">:</span><span class="NAME">f</span><span class="PUNC">=</span><span class="NAME">g</span><span class="PUNC">}</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.toArray</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="PUNC">!</span><span class="NAME">a</span><span class="PUNC">?</span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">:</span><span class="NAME">a.toArray</span><span class="PUNC">?</span><span class="NAME">a.toArray</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">:</span><span class="NAME">b.isArray</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">?</span><span class="NAME">i.call</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">:</span><span class="NAME">b.isArguments</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">?</span><span class="NAME">i.call</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">:</span><span class="NAME">b.values</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.size</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">b.toArray</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">length</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.first</span><span class="PUNC">=</span><span class="NAME">b.head</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">!=</span><span class="KEYW">null</span><span class="PUNC">&&</span><span class="PUNC">!</span><span class="NAME">d</span><span class="PUNC">?</span><span class="NAME">i.call</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NUMB">0</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">:</span><span class="NAME">a</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.initial</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">i.call</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NUMB">0</span><span class="PUNC">,</span><span class="NAME">a.length</span><span class="PUNC">-</span><span class="PUNC">(</span><span class="NAME">b</span><span class="PUNC">==</span><span class="KEYW">null</span><span class="PUNC">||</span><span class="NAME">d</span><span class="PUNC">?</span><span class="NUMB">1</span><span class="PUNC">:</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.last</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">!=</span><span class="KEYW">null</span><span class="PUNC">&&</span><span class="PUNC">!</span><span class="NAME">d</span><span class="PUNC">?</span><span class="NAME">i.call</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">Math.max</span><span class="PUNC">(</span><span class="NAME">a.length</span><span class="PUNC">-</span><span class="NAME">b</span><span class="PUNC">,</span><span class="NUMB">0</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">:</span><span class="NAME">a</span><span class="PUNC">[</span><span class="NAME">a.length</span><span class="PUNC">-</span><span class="WHIT">
-<span class='line'>874</span> </span><span class="NUMB">1</span><span class="PUNC">]</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.rest</span><span class="PUNC">=</span><span class="NAME">b.tail</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">i.call</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">==</span><span class="KEYW">null</span><span class="PUNC">||</span><span class="NAME">d</span><span class="PUNC">?</span><span class="NUMB">1</span><span class="PUNC">:</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.compact</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">b.filter</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="PUNC">!</span><span class="PUNC">!</span><span class="NAME">a</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.flatten</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">b.reduce</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">e</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">b.isArray</span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a.concat</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">?</span><span class="NAME">e</span><span class="PUNC">:</span><span class="NAME">b.flatten</span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="NAME">a</span><span class="PUNC">[</span><span class="NAME">a.length</span><span class="PUNC">]</span><span class="PUNC">=</span><span class="NAME">e</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.without</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">b.difference</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">i.call</span><span class="PUNC">(</span><span class="NAME">arguments</span><span class="PUNC">,</span><span class="NUMB">1</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.uniq</span><span class="PUNC">=</span><span class="NAME">b.unique</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">=</span><span class="NAME">d</span><span class="PUNC">?</span><span class="NAME">b.map</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">:</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">e</span><span class="PUNC">=</span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="NAME">b.reduce</span><span class="PUNC">(</span><span class="NAME">d</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">d</span><span class="PUNC">,</span><span class="NAME">g</span><span class="PUNC">,</span><span class="NAME">h</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NUMB">0</span><span class="PUNC">==</span><span class="NAME">h</span><span class="PUNC">||</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">===</span><span class="KEYW">true</span><span class="PUNC">?</span><span class="NAME">b.last</span><span class="PUNC">(</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">!=</span><span class="NAME">g</span><span class="PUNC">:</span><span class="PUNC">!</span><span class="NAME">b.include</span><span class="PUNC">(</span><span class="NAME">d</span><span class="PUNC">,</span><span class="NAME">g</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="NAME">d</span><span class="PUNC">[</span><span class="NAME">d.length</span><span class="PUNC">]</span><span class="PUNC">=</span><span class="NAME">g</span><span class="PUNC">,</span><span class="NAME">e</span><span class="PUNC">[</span><span class="NAME">e.length</span><span class="PUNC">]</span><span class="PUNC">=</span><span class="NAME">a</span><span class="PUNC">[</span><span class="NAME">h</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>875</span> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.union</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">b.uniq</span><span class="PUNC">(</span><span class="NAME">b.flatten</span><span class="PUNC">(</span><span class="NAME">arguments</span><span class="PUNC">,</span><span class="KEYW">true</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.intersection</span><span class="PUNC">=</span><span class="NAME">b.intersect</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">c</span><span class="PUNC">=</span><span class="NAME">i.call</span><span class="PUNC">(</span><span class="NAME">arguments</span><span class="PUNC">,</span><span class="NUMB">1</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">b.filter</span><span class="PUNC">(</span><span class="NAME">b.uniq</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">b.every</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">b.indexOf</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">>=</span><span class="NUMB">0</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.difference</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">c</span><span class="PUNC">=</span><span class="NAME">b.flatten</span><span class="PUNC">(</span><span class="NAME">i.call</span><span class="PUNC">(</span><span class="NAME">arguments</span><span class="PUNC">,</span><span class="NUMB">1</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">b.filter</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="PUNC">!</span><span class="NAME">b.include</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.zip</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">for</span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">=</span><span class="NAME">i.call</span><span class="PUNC">(</span><span class="NAME">arguments</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">=</span><span class="NAME">b.max</span><span class="PUNC">(</span><span class="NAME">b.pluck</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="STRN">"length"</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">=</span><span class="NAME">Array</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="NAME">e</span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">;</span><span class="NAME">e</span><span class="PUNC">&lt;</span><span class="NAME">c</span><span class="PUNC">;</span><span class="NAME">e</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="NAME">d</span><span class="PUNC">[</span><span class="NAME">e</span><span class="PUNC">]</span><span class="PUNC">=</span><span class="NAME">b.pluck</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="STRN">""</span><span class="PUNC">+</span><span class="NAME">e</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.indexOf</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>876</span> </span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">==</span><span class="KEYW">null</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="PUNC">-</span><span class="NUMB">1</span><span class="PUNC">;</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">d</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">=</span><span class="NAME">b.sortedIndex</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="NAME">a</span><span class="PUNC">[</span><span class="NAME">d</span><span class="PUNC">]</span><span class="PUNC">===</span><span class="NAME">c</span><span class="PUNC">?</span><span class="NAME">d</span><span class="PUNC">:</span><span class="PUNC">-</span><span class="NUMB">1</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">q</span><span class="PUNC">&&</span><span class="NAME">a.indexOf</span><span class="PUNC">===</span><span class="NAME">q</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a.indexOf</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">for</span><span class="PUNC">(</span><span class="NAME">d</span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">,</span><span class="NAME">e</span><span class="PUNC">=</span><span class="NAME">a.length</span><span class="PUNC">;</span><span class="NAME">d</span><span class="PUNC">&lt;</span><span class="NAME">e</span><span class="PUNC">;</span><span class="NAME">d</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">d</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">&&</span><span class="NAME">a</span><span class="PUNC">[</span><span class="NAME">d</span><span class="PUNC">]</span><span class="PUNC">===</span><span class="NAME">c</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="PUNC">-</span><span class="NUMB">1</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.lastIndexOf</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">==</span><span class="KEYW">null</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="PUNC">-</span><span class="NUMB">1</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">C</span><span class="PUNC">&&</span><span class="NAME">a.lastIndexOf</span><span class="PUNC">===</span><span class="NAME">C</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a.lastIndexOf</span><span class="PUNC">(</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">for</span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">=</span><span class="NAME">a.length</span><span class="PUNC">;</span><span class="NAME">d</span><span class="PUNC">--</span><span class="PUNC">;</span><span class="PUNC">)</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">d</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">&&</span><span class="NAME">a</span><span class="PUNC">[</span><span class="NAME">d</span><span class="PUNC">]</span><span class="PUNC">===</span><span class="NAME">b</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="PUNC">-</span><span class="NUMB">1</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.range</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">arguments.length</span><span class="PUNC">&lt;=</span><span class="NUMB">1</span><span class="PUNC">&&</span><span class="PUNC">(</span><span class="NAME">b</span><span class="PUNC">=</span><span class="NAME">a</span><span class="PUNC">||</span><span class="NUMB">0</span><span class="PUNC">,</span><span class="NAME">a</span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">for</span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">=</span><span class="NAME">arguments</span><span class="PUNC">[</span><span class="NUMB">2</span><span class="PUNC">]</span><span class="PUNC">||</span><span class="NUMB">1</span><span class="PUNC">,</span><span class="NAME">e</span><span class="PUNC">=</span><span class="NAME">Math.max</span><span class="PUNC">(</span><span class="NAME">Math.ceil</span><span class="PUNC">(</span><span class="PUNC">(</span><span class="NAME">b</span><span class="PUNC">-</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">/</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="NUMB">0</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="NAME">f</span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">,</span><span class="NAME">g</span><span class="PUNC">=</span><span class="NAME">Array</span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="NAME">f</span><span class="PUNC">&lt;</span><span class="NAME">e</span><span class="PUNC">;</span><span class="PUNC">)</span><span class="NAME">g</span><span class="PUNC">[</span><span class="NAME">f</span><span class="PUNC">++</span><span class="PUNC">]</span><span class="PUNC">=</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">a</span><span class="PUNC">+</span><span class="PUNC">=</span><span class="NAME">d</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">g</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>877</span> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">E</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.bind</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">,</span><span class="NAME">e</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">a.bind</span><span class="PUNC">===</span><span class="NAME">t</span><span class="PUNC">&&</span><span class="NAME">t</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">t.apply</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">i.call</span><span class="PUNC">(</span><span class="NAME">arguments</span><span class="PUNC">,</span><span class="NUMB">1</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">b.isFunction</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="KEYW">throw</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">TypeError</span><span class="PUNC">;</span><span class="NAME">e</span><span class="PUNC">=</span><span class="NAME">i.call</span><span class="PUNC">(</span><span class="NAME">arguments</span><span class="PUNC">,</span><span class="NUMB">2</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="WHIT"> </span><span class="KEYW">instanceof</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a.apply</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">e.concat</span><span class="PUNC">(</span><span class="NAME">i.call</span><span class="PUNC">(</span><span class="NAME">arguments</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="NAME">E.prototype</span><span class="PUNC">=</span><span class="NAME">a.prototype</span><span class="PUNC">;</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">=</span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">E</span><span class="PUNC">,</span><span class="NAME">g</span><span class="PUNC">=</span><span class="NAME">a.apply</span><span class="PUNC">(</span><span class="NAME">b</span><span class="PUNC">,</span><span class="NAME">e.concat</span><span class="PUNC">(</span><span class="NAME">i.call</span><span class="PUNC">(</span><span class="NAME">arguments</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">Object</span><span class="PUNC">(</span><span class="NAME">g</span><span class="PUNC">)</span><span class="PUNC">===</span><span class="NAME">g</span><span class="PUNC">?</span><span class="NAME">g</span><span class="PUNC">:</span><span class="NAME">b</span><span class="PUNC">}</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.bindAll</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">c</span><span class="PUNC">=</span><span class="NAME">i.call</span><span class="PUNC">(</span><span class="NAME">arguments</span><span class="PUNC">,</span><span class="NUMB">1</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="NAME">c.length</span><span class="PUNC">==</span><span class="NUMB">0</span><span class="PUNC">&&</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">=</span><span class="NAME">b.functions</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="NAME">j</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">a</span><span class="PUNC">[</span><span class="NAME">c</span><span class="PUNC">]</span><span class="PUNC">=</span><span class="NAME">b.bind</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">[</span><span class="NAME">c</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.memoize</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>878</span> </span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">=</span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">c</span><span class="PUNC">||</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">=</span><span class="NAME">b.identity</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">=</span><span class="NAME">c.apply</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="NAME">arguments</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">m.call</span><span class="PUNC">(</span><span class="NAME">d</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">?</span><span class="NAME">d</span><span class="PUNC">[</span><span class="NAME">b</span><span class="PUNC">]</span><span class="PUNC">:</span><span class="NAME">d</span><span class="PUNC">[</span><span class="NAME">b</span><span class="PUNC">]</span><span class="PUNC">=</span><span class="NAME">a.apply</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="NAME">arguments</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.delay</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">=</span><span class="NAME">i.call</span><span class="PUNC">(</span><span class="NAME">arguments</span><span class="PUNC">,</span><span class="NUMB">2</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">setTimeout</span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a.apply</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.defer</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">b.delay.apply</span><span class="PUNC">(</span><span class="NAME">b</span><span class="PUNC">,</span><span class="PUNC">[</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NUMB">1</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">concat</span><span class="PUNC">(</span><span class="NAME">i.call</span><span class="PUNC">(</span><span class="NAME">arguments</span><span class="PUNC">,</span><span class="NUMB">1</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.throttle</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">,</span><span class="NAME">e</span><span class="PUNC">,</span><span class="NAME">f</span><span class="PUNC">,</span><span class="NAME">g</span><span class="PUNC">,</span><span class="NAME">h</span><span class="PUNC">,</span><span class="NAME">i</span><span class="PUNC">=</span><span class="NAME">b.debounce</span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">h</span><span class="PUNC">=</span><span class="NAME">g</span><span class="PUNC">=</span><span class="KEYW">false</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">d</span><span class="PUNC">=</span><span class="KEYW">this</span><span class="PUNC">;</span><span class="NAME">e</span><span class="PUNC">=</span><span class="NAME">arguments</span><span class="PUNC">;</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">;</span><span class="NAME">f</span><span class="PUNC">||</span><span class="PUNC">(</span><span class="NAME">f</span><span class="PUNC">=</span><span class="NAME">setTimeout</span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">f</span><span class="PUNC">=</span><span class="KEYW">null</span><span class="PUNC">;</span><span class="NAME">h</span><span class="PUNC">&&</span><span class="NAME">a.apply</span><span class="PUNC">(</span><span class="NAME">d</span><span class="PUNC">,</span><span class="NAME">e</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="NAME">i</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="NAME">g</span><span class="PUNC">?</span><span class="NAME">h</span><span class="PUNC">=</span><span class="KEYW">true</span><span class="PUNC">:</span><span class="WHIT">
-<span class='line'>879</span> </span><span class="NAME">a.apply</span><span class="PUNC">(</span><span class="NAME">d</span><span class="PUNC">,</span><span class="NAME">e</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="NAME">i</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="NAME">g</span><span class="PUNC">=</span><span class="KEYW">true</span><span class="PUNC">}</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.debounce</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">=</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="NAME">f</span><span class="PUNC">=</span><span class="NAME">arguments</span><span class="PUNC">;</span><span class="NAME">clearTimeout</span><span class="PUNC">(</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="NAME">d</span><span class="PUNC">=</span><span class="NAME">setTimeout</span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">d</span><span class="PUNC">=</span><span class="KEYW">null</span><span class="PUNC">;</span><span class="NAME">a.apply</span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">,</span><span class="NAME">f</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.once</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">=</span><span class="KEYW">false</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">b</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">;</span><span class="NAME">b</span><span class="PUNC">=</span><span class="KEYW">true</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">=</span><span class="NAME">a.apply</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="NAME">arguments</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.wrap</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">=</span><span class="NAME">G.apply</span><span class="PUNC">(</span><span class="PUNC">[</span><span class="NAME">a</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="NAME">arguments</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">b.apply</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.compose</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">=</span><span class="NAME">arguments</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">for</span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">=</span><span class="NAME">arguments</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">=</span><span class="NAME">a.length</span><span class="PUNC">-</span><span class="NUMB">1</span><span class="PUNC">;</span><span class="NAME">d</span><span class="PUNC">>=</span><span class="NUMB">0</span><span class="PUNC">;</span><span class="NAME">d</span><span class="PUNC">--</span><span class="PUNC">)</span><span class="NAME">b</span><span class="PUNC">=</span><span class="PUNC">[</span><span class="NAME">a</span><span class="PUNC">[</span><span class="NAME">d</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">apply</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">}</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.after</span><span class="PUNC">=</span><span class="WHIT">
-<span class='line'>880</span> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">&lt;=</span><span class="NUMB">0</span><span class="PUNC">?</span><span class="NAME">b</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">:</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">--</span><span class="NAME">a</span><span class="PUNC">&lt;</span><span class="NUMB">1</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">b.apply</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="NAME">arguments</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.keys</span><span class="PUNC">=</span><span class="NAME">I</span><span class="PUNC">||</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">!==</span><span class="NAME">Object</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="KEYW">throw</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">TypeError</span><span class="PUNC">(</span><span class="STRN">"Invalid object"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">=</span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">;</span><span class="KEYW">for</span><span class="PUNC">(</span><span class="NAME">d</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">)</span><span class="NAME">m.call</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">&&</span><span class="PUNC">(</span><span class="NAME">b</span><span class="PUNC">[</span><span class="NAME">b.length</span><span class="PUNC">]</span><span class="PUNC">=</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.values</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">b.map</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b.identity</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.functions</span><span class="PUNC">=</span><span class="NAME">b.methods</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">c</span><span class="PUNC">=</span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">;</span><span class="KEYW">for</span><span class="PUNC">(</span><span class="NAME">d</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">)</span><span class="NAME">b.isFunction</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">[</span><span class="NAME">d</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">&&</span><span class="NAME">c.push</span><span class="PUNC">(</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">c.sort</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.extend</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">j</span><span class="PUNC">(</span><span class="NAME">i.call</span><span class="PUNC">(</span><span class="NAME">arguments</span><span class="PUNC">,</span><span class="NUMB">1</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">for</span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">d</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">)</span><span class="NAME">b</span><span class="PUNC">[</span><span class="NAME">d</span><span class="PUNC">]</span><span class="PUNC">!==</span><span class="KEYW">void</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">&&</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">[</span><span class="NAME">d</span><span class="PUNC">]</span><span class="PUNC">=</span><span class="NAME">b</span><span class="PUNC">[</span><span class="NAME">d</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.defaults</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">j</span><span class="PUNC">(</span><span class="NAME">i.call</span><span class="PUNC">(</span><span class="NAME">arguments</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>881</span> </span><span class="NUMB">1</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">for</span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">d</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">)</span><span class="NAME">a</span><span class="PUNC">[</span><span class="NAME">d</span><span class="PUNC">]</span><span class="PUNC">==</span><span class="KEYW">null</span><span class="PUNC">&&</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">[</span><span class="NAME">d</span><span class="PUNC">]</span><span class="PUNC">=</span><span class="NAME">b</span><span class="PUNC">[</span><span class="NAME">d</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.clone</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="PUNC">!</span><span class="NAME">b.isObject</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">?</span><span class="NAME">a</span><span class="PUNC">:</span><span class="NAME">b.isArray</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">?</span><span class="NAME">a.slice</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">:</span><span class="NAME">b.extend</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.tap</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">b</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.isEqual</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">r</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">,</span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.isEmpty</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">b.isArray</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">||</span><span class="NAME">b.isString</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a.length</span><span class="PUNC">===</span><span class="NUMB">0</span><span class="PUNC">;</span><span class="KEYW">for</span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">c</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">)</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">m.call</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.isElement</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="PUNC">!</span><span class="PUNC">!</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">&&</span><span class="NAME">a.nodeType</span><span class="PUNC">==</span><span class="NUMB">1</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.isArray</span><span class="PUNC">=</span><span class="NAME">p</span><span class="PUNC">||</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">l.call</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">==</span><span class="STRN">"[object Array]"</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.isObject</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">===</span><span class="WHIT">
-<span class='line'>882</span> </span><span class="NAME">Object</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.isArguments</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">l.call</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">==</span><span class="STRN">"[object Arguments]"</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">b.isArguments</span><span class="PUNC">(</span><span class="NAME">arguments</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="NAME">b.isArguments</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="PUNC">!</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">a</span><span class="PUNC">||</span><span class="PUNC">!</span><span class="NAME">m.call</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="STRN">"callee"</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.isFunction</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">l.call</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">==</span><span class="STRN">"[object Function]"</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.isString</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">l.call</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">==</span><span class="STRN">"[object String]"</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.isNumber</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">l.call</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">==</span><span class="STRN">"[object Number]"</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.isNaN</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">!==</span><span class="NAME">a</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.isBoolean</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">===</span><span class="KEYW">true</span><span class="PUNC">||</span><span class="NAME">a</span><span class="PUNC">===</span><span class="KEYW">false</span><span class="PUNC">||</span><span class="NAME">l.call</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">==</span><span class="STRN">"[object Boolean]"</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.isDate</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">l.call</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">==</span><span class="WHIT">
-<span class='line'>883</span> </span><span class="STRN">"[object Date]"</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.isRegExp</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">l.call</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">==</span><span class="STRN">"[object RegExp]"</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.isNull</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">===</span><span class="KEYW">null</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.isUndefined</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">===</span><span class="KEYW">void</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.noConflict</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">s._</span><span class="PUNC">=</span><span class="NAME">F</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">this</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.identity</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.times</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">for</span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">;</span><span class="NAME">e</span><span class="PUNC">&lt;</span><span class="NAME">a</span><span class="PUNC">;</span><span class="NAME">e</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="NAME">b.call</span><span class="PUNC">(</span><span class="NAME">d</span><span class="PUNC">,</span><span class="NAME">e</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.escape</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="PUNC">(</span><span class="STRN">""</span><span class="PUNC">+</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="REGX">/&/g</span><span class="PUNC">,</span><span class="STRN">"&amp;"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="REGX">/&lt;/g</span><span class="PUNC">,</span><span class="STRN">"&lt;"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="REGX">/>/g</span><span class="PUNC">,</span><span class="STRN">"&gt;"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="REGX">/"/g</span><span class="PUNC">,</span><span class="STRN">"&quot;"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="REGX">/'/g</span><span class="PUNC">,</span><span class="STRN">"&#x27;"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="REGX">/\//g</span><span class="PUNC">,</span><span class="STRN">"&#x2F;"</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.mixin</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">j</span><span class="PUNC">(</span><span class="NAME">b.functions</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">J</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>884</span> </span><span class="NAME">b</span><span class="PUNC">[</span><span class="NAME">c</span><span class="PUNC">]</span><span class="PUNC">=</span><span class="NAME">a</span><span class="PUNC">[</span><span class="NAME">c</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">K</span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">;</span><span class="NAME">b.uniqueId</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">=</span><span class="NAME">K</span><span class="PUNC">++</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">?</span><span class="NAME">a</span><span class="PUNC">+</span><span class="NAME">b</span><span class="PUNC">:</span><span class="NAME">b</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.templateSettings</span><span class="PUNC">=</span><span class="PUNC">{</span><span class="NAME">evaluate</span><span class="PUNC">:</span><span class="REGX">/&lt;%([\s\S]+?)%>/g</span><span class="PUNC">,</span><span class="NAME">interpolate</span><span class="PUNC">:</span><span class="REGX">/&lt;%=([\s\S]+?)%>/g</span><span class="PUNC">,</span><span class="NAME">escape</span><span class="PUNC">:</span><span class="REGX">/&lt;%-([\s\S]+?)%>/g</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.template</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">=</span><span class="NAME">b.templateSettings</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">=</span><span class="STRN">"var __p=[],print=function(){__p.push.apply(__p,arguments);};with(obj||{}){__p.push('"</span><span class="PUNC">+</span><span class="NAME">a.replace</span><span class="PUNC">(</span><span class="REGX">/\\/g</span><span class="PUNC">,</span><span class="STRN">"\\\\"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="REGX">/'/g</span><span class="PUNC">,</span><span class="STRN">"\\'"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="NAME">d.escape</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="STRN">"',_.escape("</span><span class="PUNC">+</span><span class="NAME">b.replace</span><span class="PUNC">(</span><span class="REGX">/\\'/g</span><span class="PUNC">,</span><span class="STRN">"'"</span><span class="PUNC">)</span><span class="PUNC">+</span><span class="STRN">"),'"</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="NAME">d.interpolate</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="STRN">"',"</span><span class="PUNC">+</span><span class="NAME">b.replace</span><span class="PUNC">(</span><span class="REGX">/\\'/g</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>885</span> </span><span class="STRN">"'"</span><span class="PUNC">)</span><span class="PUNC">+</span><span class="STRN">",'"</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="NAME">d.evaluate</span><span class="PUNC">||</span><span class="KEYW">null</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="STRN">"');"</span><span class="PUNC">+</span><span class="NAME">b.replace</span><span class="PUNC">(</span><span class="REGX">/\\'/g</span><span class="PUNC">,</span><span class="STRN">"'"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="REGX">/[\r\n\t]/g</span><span class="PUNC">,</span><span class="STRN">" "</span><span class="PUNC">)</span><span class="PUNC">+</span><span class="STRN">";__p.push('"</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="REGX">/\r/g</span><span class="PUNC">,</span><span class="STRN">"\\r"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="REGX">/\n/g</span><span class="PUNC">,</span><span class="STRN">"\\n"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="REGX">/\t/g</span><span class="PUNC">,</span><span class="STRN">"\\t"</span><span class="PUNC">)</span><span class="PUNC">+</span><span class="STRN">"');}return __p.join('');"</span><span class="PUNC">,</span><span class="NAME">e</span><span class="PUNC">=</span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">Function</span><span class="PUNC">(</span><span class="STRN">"obj"</span><span class="PUNC">,</span><span class="STRN">"_"</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">c</span><span class="PUNC">?</span><span class="NAME">e</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">:</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">e.call</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">n</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">this._wrapped</span><span class="PUNC">=</span><span class="NAME">a</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.prototype</span><span class="PUNC">=</span><span class="NAME">n.prototype</span><span class="PUNC">;</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">u</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">c</span><span class="PUNC">?</span><span class="NAME">b</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">chain</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">:</span><span class="NAME">a</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="NAME">J</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">n.prototype</span><span class="PUNC">[</span><span class="NAME">a</span><span class="PUNC">]</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">=</span><span class="NAME">i.call</span><span class="PUNC">(</span><span class="NAME">arguments</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="NAME">H.call</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">this._wrapped</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">u</span><span class="PUNC">(</span><span class="NAME">c.apply</span><span class="PUNC">(</span><span class="NAME">b</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>886</span> </span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="NAME">this._chain</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.mixin</span><span class="PUNC">(</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="NAME">j</span><span class="PUNC">(</span><span class="STRN">"pop,push,reverse,shift,sort,splice,unshift"</span><span class="PUNC">.</span><span class="NAME">split</span><span class="PUNC">(</span><span class="STRN">","</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">=</span><span class="NAME">k</span><span class="PUNC">[</span><span class="NAME">a</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="NAME">n.prototype</span><span class="PUNC">[</span><span class="NAME">a</span><span class="PUNC">]</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">b.apply</span><span class="PUNC">(</span><span class="NAME">this._wrapped</span><span class="PUNC">,</span><span class="NAME">arguments</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">u</span><span class="PUNC">(</span><span class="NAME">this._wrapped</span><span class="PUNC">,</span><span class="NAME">this._chain</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="NAME">j</span><span class="PUNC">(</span><span class="PUNC">[</span><span class="STRN">"concat"</span><span class="PUNC">,</span><span class="STRN">"join"</span><span class="PUNC">,</span><span class="STRN">"slice"</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">=</span><span class="NAME">k</span><span class="PUNC">[</span><span class="NAME">a</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="NAME">n.prototype</span><span class="PUNC">[</span><span class="NAME">a</span><span class="PUNC">]</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">u</span><span class="PUNC">(</span><span class="NAME">b.apply</span><span class="PUNC">(</span><span class="NAME">this._wrapped</span><span class="PUNC">,</span><span class="NAME">arguments</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="NAME">this._chain</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="NAME">n.prototype.chain</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">this._chain</span><span class="PUNC">=</span><span class="KEYW">true</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">this</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">n.prototype.value</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">this._wrapped</span><span class="PUNC">}</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">call</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>887</span> </span><span class="COMM">/* main file */</span><span class="WHIT">
-<span class='line'>888</span> 
-<span class='line'>889</span> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">window.IriSP</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">window.__IriSP</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> 
-<span class='line'>890</span> 	</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">IriSP</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT"> 
-<span class='line'>891</span> 	</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">__IriSP</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">/* for backward compatibility */</span><span class="WHIT">
-<span class='line'>892</span> </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>893</span> 
-<span class='line'>894</span> </span><span class="NAME">IriSP.loadLibs</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">libs</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">config</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">metadata_url</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">callback</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>895</span> </span><span class="WHIT">    </span><span class="COMM">// Localize jQuery variable</span><span class="WHIT">
-<span class='line'>896</span> </span><span class="WHIT">		</span><span class="NAME">IriSP.jQuery</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>897</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">$L</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">$LAB.script</span><span class="PUNC">(</span><span class="NAME">libs.jQuery</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">script</span><span class="PUNC">(</span><span class="NAME">libs.swfObject</span><span class="PUNC">)</span><span class="WHIT">
-<span class='line'>898</span> </span><span class="WHIT">                </span><span class="PUNC">.</span><span class="NAME">script</span><span class="PUNC">(</span><span class="NAME">libs.jQueryUI</span><span class="PUNC">)</span><span class="WHIT">
-<span class='line'>899</span> </span><span class="WHIT">                                   
-<span class='line'>900</span>     </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">config.player.type</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">"jwplayer"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>901</span> </span><span class="WHIT">      </span><span class="COMM">// load our popcorn.js lookalike</span><span class="WHIT">
-<span class='line'>902</span> </span><span class="WHIT">      </span><span class="NAME">$L</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">$L.script</span><span class="PUNC">(</span><span class="NAME">libs.jwplayer</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>903</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>904</span> </span><span class="WHIT">      </span><span class="COMM">// load the real popcorn</span><span class="WHIT">
-<span class='line'>905</span> </span><span class="WHIT">      </span><span class="NAME">$L</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">$L.script</span><span class="PUNC">(</span><span class="NAME">libs.popcorn</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">script</span><span class="PUNC">(</span><span class="NAME">libs</span><span class="PUNC">[</span><span class="STRN">"popcorn.code"</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>906</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">config.player.type</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">"youtube"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>907</span> </span><span class="WHIT">        </span><span class="NAME">$L</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">$L.script</span><span class="PUNC">(</span><span class="NAME">libs</span><span class="PUNC">[</span><span class="STRN">"popcorn.youtube"</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>908</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT"> 
-<span class='line'>909</span>       </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">config.player.type</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">"vimeo"</span><span class="PUNC">)</span><span class="WHIT">
-<span class='line'>910</span> </span><span class="WHIT">        </span><span class="NAME">$L</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">$L.script</span><span class="PUNC">(</span><span class="NAME">libs</span><span class="PUNC">[</span><span class="STRN">"popcorn.vimeo"</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>911</span> </span><span class="WHIT">      
-<span class='line'>912</span>       </span><span class="COMM">/* do nothing for html5 */</span><span class="WHIT">
-<span class='line'>913</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT">       
-<span class='line'>914</span>     
-<span class='line'>915</span>     </span><span class="COMM">/* widget specific requirements */</span><span class="WHIT">
-<span class='line'>916</span> </span><span class="WHIT">    </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">idx</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">config.gui.widgets</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>917</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">config.gui.widgets</span><span class="PUNC">[</span><span class="NAME">idx</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">type</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">"PolemicWidget"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">        
-<span class='line'>918</span>         </span><span class="NAME">$L.script</span><span class="PUNC">(</span><span class="NAME">libs.raphael</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>919</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>920</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>921</span> </span><span class="WHIT">    
-<span class='line'>922</span>     </span><span class="COMM">// same for modules</span><span class="WHIT">
-<span class='line'>923</span> </span><span class="WHIT">    </span><span class="COMM">/*
-<span class='line'>924</span>     for (var idx in config.modules) {
-<span class='line'>925</span>       if (config.modules[idx].type === "PolemicWidget")
-<span class='line'>926</span>         $L.script(libs.raphaelJs);
-<span class='line'>927</span>     }
-<span class='line'>928</span>     */</span><span class="WHIT">
-<span class='line'>929</span> 
-<span class='line'>930</span> </span><span class="WHIT">    </span><span class="NAME">$L.wait</span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>931</span> </span><span class="WHIT">      </span><span class="NAME">IriSP.jQuery</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">window.jQuery.noConflict</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>932</span> </span><span class="WHIT">      </span><span class="NAME">IriSP._</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">window._.noConflict</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>933</span> </span><span class="WHIT">      </span><span class="NAME">IriSP.underscore</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP._</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>934</span> </span><span class="WHIT">      
-<span class='line'>935</span>       </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">css_link_jquery</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"&lt;link>"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> 
-<span class='line'>936</span>         </span><span class="NAME">rel</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"stylesheet"</span><span class="PUNC">,</span><span class="WHIT"> 
-<span class='line'>937</span>         </span><span class="NAME">type</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"text/css"</span><span class="PUNC">,</span><span class="WHIT"> 
-<span class='line'>938</span>         </span><span class="NAME">href</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">libs.cssjQueryUI</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>939</span> </span><span class="WHIT">        </span><span class="STRN">'class'</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"dynamic_css"</span><span class="WHIT">
-<span class='line'>940</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>941</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">css_link_custom</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"&lt;link>"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> 
-<span class='line'>942</span>         </span><span class="NAME">rel</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"stylesheet"</span><span class="PUNC">,</span><span class="WHIT"> 
-<span class='line'>943</span>         </span><span class="NAME">type</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"text/css"</span><span class="PUNC">,</span><span class="WHIT"> 
-<span class='line'>944</span>         </span><span class="NAME">href</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">config.gui.css</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>945</span> </span><span class="WHIT">        </span><span class="STRN">'class'</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"dynamic_css"</span><span class="WHIT">
-<span class='line'>946</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>947</span> </span><span class="WHIT">      
-<span class='line'>948</span>       </span><span class="NAME">css_link_jquery.appendTo</span><span class="PUNC">(</span><span class="STRN">'head'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>949</span> </span><span class="WHIT">      </span><span class="NAME">css_link_custom.appendTo</span><span class="PUNC">(</span><span class="STRN">'head'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>950</span> </span><span class="WHIT">          
-<span class='line'>951</span>       </span><span class="NAME">IriSP.setupDataLoader</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>952</span> </span><span class="WHIT">      </span><span class="NAME">IriSP.__dataloader.get</span><span class="PUNC">(</span><span class="NAME">metadata_url</span><span class="PUNC">,</span><span class="WHIT"> 
-<span class='line'>953</span>           </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">data</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>954</span> </span><span class="WHIT">            </span><span class="COMM">/* save the data so that we could re-use it to
-<span class='line'>955</span>                configure the video
-<span class='line'>956</span>             */</span><span class="WHIT">
-<span class='line'>957</span> </span><span class="WHIT">            </span><span class="NAME">IriSP.__jsonMetadata</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">data</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>958</span> </span><span class="WHIT">            </span><span class="NAME">callback.call</span><span class="PUNC">(</span><span class="NAME">window</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>959</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>960</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>961</span> </span><span class="NAME">IriSP.annotation_template</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"{{! template for an annotation displayed in a segmentWidget }}&lt;div title='{{divTitle}}' id='{{id}}'	class='Ldt-iri-chapter' 	style='left: {{startPixel}}px;          width: {{pxWidth}}px;          background-color:#{{hexa_color}};' 	>&lt;/div>"</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>962</span> </span><span class="NAME">IriSP.annotationWidget_template</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"{{! template for the annotation widget }}&lt;div class='Ldt-AnnotationsWidget'>  &lt;!-- ugly div because we want to have a double border -->  &lt;div class='Ldt-Annotation-DoubleBorder'>      &lt;div class='Ldt-AnnotationContent'>        &lt;div class='Ldt-AnnotationShareIcons'>         &lt;a class='Ldt-fbShare' href=''>&lt;img src='{{img_dir}}/facebook.png' alt='share on facebook'>&lt;/img>&lt;/a>         &lt;a class='Ldt-TwShare' href=''>&lt;img src='{{img_dir}}/twitter.png' alt='share on twitter'>&lt;/img>&lt;/a>         &lt;a class='Ldt-GplusShare' href=''>&lt;img src='{{img_dir}}/google.png' alt='share on google+'>&lt;/img>&lt;/a>      &lt;/div>		  &lt;div class='Ldt-SaTitle'>&lt;/div>	  	&lt;div class='Ldt-SaDescription'>&lt;/div>    &lt;/div>  &lt;/div>&lt;/div>"</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>963</span> </span><span class="NAME">IriSP.annotation_loading_template</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"{{! template shown while the annotation widget is loading }}&lt;div id='Ldt-load-container'>&lt;div id='Ldt-loader'>&nbsp;&lt;/div> Chargement... &lt;/div>"</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>964</span> </span><span class="NAME">IriSP.arrowWidget_template</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"&lt;div class='Ldt-arrowWidget'>&lt;/div>"</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>965</span> </span><span class="NAME">IriSP.overlay_marker_template</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"{{! the template for the small bars which is z-indexed over our segment widget }}&lt;div class='Ldt-SegmentPositionMarker' style='background-color: #F7268E;'>&lt;/div>"</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>966</span> </span><span class="NAME">IriSP.player_template</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"{{! template for the radio player }}&lt;div class='Ldt-controler demo'>	&lt;div class='Ldt-LeftPlayerControls'>    &lt;div class='Ldt-button Ldt-CtrlPlay'>&lt;/div>		&lt;div class='Ldt-button Ldt-CtrlAnnotate'>&lt;/div>    &lt;div class='Ldt-button Ldt-CtrlSearch'>&lt;/div>	&lt;/div>		&lt;div class='Ldt-RightPlayerControls'>    &lt;div class='Ldt-Time'>      &lt;div class='Ldt-ElapsedTime'>&lt;/div>      &lt;div class='Ldt-TimeSeparator'>/&lt;/div>      &lt;div class='Ldt-TotalTime'>&lt;/div>    &lt;/div>		&lt;div class='Ldt-button Ldt-CtrlSound'>&lt;/div>	&lt;/div>&lt;/div>"</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>967</span> </span><span class="NAME">IriSP.search_template</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"{{! template for the search container }}&lt;div class='LdtSearchContainer'	style='margin-left: {{margin_left}}; position: absolute; margin-top: -60px;'>	&lt;div class='LdtSearch'		style='display: none; background-color: #EEE; width: 165px; boder: 1px; border-color: #CFCFCF; position: absolute; text-align: center;'>		&lt;input class='LdtSearchInput'			style='margin-top: 2px; margin-bottom: 2px;' />	&lt;/div>&lt;/div>&lt;div class='cleaner'>&lt;/div>"</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>968</span> </span><span class="NAME">IriSP.share_template</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"{{! social network sharing template }}&lt;a onclick='__IriSP.MyApiPlayer.share(\'delicious\');' title='partager avec delicious'>&lt;span class='share shareDelicious'>&nbsp;&lt;/span>&lt;/a>		&lt;a onclick='__IriSP.MyApiPlayer.share(\'facebook\');' title='partager avec facebook'> &lt;span class='share shareFacebook'>&nbsp;&lt;/span>&lt;/a>&lt;a onclick='__IriSP.MyApiPlayer.share(\'twitter\');' title='partager avec twitter'>  &lt;span class='share shareTwitter'>&nbsp;&lt;/span>&lt;/a>&lt;a onclick='__IriSP.MyApiPlayer.share(\'myspace\');' title='partager avec Myspace'>  &lt;span class='share shareMySpace'>&nbsp;&lt;/span>&lt;/a>"</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>969</span> </span><span class="NAME">IriSP.sliderWidget_template</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"{{! template for the slider widget - it's composed of two divs we one overlayed on top    of the other }}&lt;div class='Ldt-sliderBackground'>&lt;/div>&lt;div class='Ldt-sliderForeground'>&lt;/div>&lt;div class='Ldt-sliderPositionMarker'>&lt;/div>"</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>970</span> </span><span class="NAME">IriSP.tooltip_template</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"{{! template used by the jquery ui tooltip }}&lt;div class='Ldt-tooltip'>  &lt;div class='title'>{{title}}&lt;/div>  &lt;div class='time'>{{begin}} : {{end}} &lt;/div>  &lt;div class='description'>{{description}}&lt;/div>&lt;/div>"</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>971</span> </span><span class="NAME">IriSP.tooltipWidget_template</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"{{! template for the tooltip widget }}&lt;div class='tip'>	&lt;div class='tipcolor' style='height:10px;width:10px'>&lt;/div>	&lt;div class='tiptext'>&lt;/div>"</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>972</span> </span><span class="NAME">IriSP.tweetWidget_template</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"{{! template for the tweet widget }}&lt;div class='Ldt-tweetWidget'>  &lt;div class='Ldt-tweet-DoubleBorder'>      &lt;img src='{{img_dir}}/minimize.png' class='Ldt-tweetWidgetKeepOpen' alt='dont minimize automatically'>&lt;/img>      &lt;img src='{{img_dir}}/minimize.png' class='Ldt-tweetWidgetMinimize' alt='minimize window'>&lt;/img>      &lt;div class='Ldt-tweetAvatar'>&lt;/div>      &lt;img src='{{img_dir}}/profile_arrow.png' class='Ldt-tweetAvatar-profileArrow'>&lt;/img>      &lt;div class='Ldt-tweetContents'>&lt;/div>      &lt;a href='' target='_blank' class='Ldt-Retweet'>&lt;div class='Ldt-RetweetIcon'>&lt;/div> - Retweet &lt;/a>      &lt;a href='' target='_blank' class='Ldt-TweetReply'>&lt;div class='Ldt-TweetReplyIcon'>&lt;/div> - Reply&lt;/a>  &lt;/div>&lt;/div>"</span><span class="PUNC">;</span><span class="COMM">/* wrapper that simulates popcorn.js because
-<span class='line'>973</span>    popcorn is a bit unstable at the time */</span><span class="WHIT">
-<span class='line'>974</span> 
-<span class='line'>975</span> </span><span class="NAME">IriSP.PopcornReplacement</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>976</span> </span><span class="WHIT">  </span><span class="NAME">msgPump</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="WHIT"> </span><span class="COMM">/* used by jquery to receive and send messages */</span><span class="WHIT">
-<span class='line'>977</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>978</span> 
-<span class='line'>979</span> </span><span class="NAME">IriSP.PopcornReplacement.media</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> 
-<span class='line'>980</span>   </span><span class="STRN">"paused"</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>981</span> </span><span class="WHIT">  </span><span class="STRN">"muted"</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="WHIT">
-<span class='line'>982</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>983</span> 
-<span class='line'>984</span> </span><span class="NAME">IriSP.PopcornReplacement.listen</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">msg</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">callback</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>985</span> </span><span class="COMM">//  IriSP.jQuery(IriSP.PopcornReplacement.msgPump).bind(msg, function(event, rest) { callback(rest); });</span><span class="WHIT">
-<span class='line'>986</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">IriSP.PopcornReplacement.msgPump.hasOwnProperty</span><span class="PUNC">(</span><span class="NAME">msg</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
-<span class='line'>987</span> </span><span class="WHIT">    </span><span class="NAME">IriSP.PopcornReplacement.msgPump</span><span class="PUNC">[</span><span class="NAME">msg</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>988</span> 
-<span class='line'>989</span> </span><span class="WHIT">  </span><span class="NAME">IriSP.PopcornReplacement.msgPump</span><span class="PUNC">[</span><span class="NAME">msg</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">push</span><span class="PUNC">(</span><span class="NAME">callback</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>990</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>991</span> 
-<span class='line'>992</span> </span><span class="NAME">IriSP.PopcornReplacement.trigger</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">msg</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">params</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>993</span> </span><span class="COMM">//  IriSP.jQuery(IriSP.PopcornReplacement.msgPump).trigger(msg, params);</span><span class="WHIT">
-<span class='line'>994</span> </span><span class="WHIT">  
-<span class='line'>995</span>   </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">IriSP.PopcornReplacement.msgPump.hasOwnProperty</span><span class="PUNC">(</span><span class="NAME">msg</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
-<span class='line'>996</span> </span><span class="WHIT">    </span><span class="KEYW">return</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>997</span> 
-<span class='line'>998</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">d</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.PopcornReplacement.msgPump</span><span class="PUNC">[</span><span class="NAME">msg</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>999</span> </span><span class="WHIT">  </span><span class="KEYW">for</span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">entry</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1000</span> </span><span class="WHIT">    </span><span class="NAME">d</span><span class="PUNC">[</span><span class="NAME">entry</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">call</span><span class="PUNC">(</span><span class="NAME">window</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">params</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1001</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1002</span> 
-<span class='line'>1003</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1004</span> 
-<span class='line'>1005</span> </span><span class="NAME">IriSP.PopcornReplacement.guid</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">prefix</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1006</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">str</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'</span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="REGX">/[xy]/g</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1007</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">r</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.random</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">*</span><span class="NUMB">16</span><span class="PUNC">|</span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">v</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">c</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">'x'</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="NAME">r</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">r</span><span class="PUNC">&</span><span class="NUMB">0x3</span><span class="PUNC">|</span><span class="NUMB">0x8</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1008</span> </span><span class="WHIT">      </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">v.toString</span><span class="PUNC">(</span><span class="NUMB">16</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1009</span> </span><span class="WHIT">   </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1010</span> 
-<span class='line'>1011</span> </span><span class="WHIT">  </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">prefix</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">str</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1012</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1013</span> 
-<span class='line'>1014</span> </span><span class="NAME">IriSP.PopcornReplacement.__initApi</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1015</span> </span><span class="WHIT">  </span><span class="NAME">IriSP.PopcornReplacement.trigger</span><span class="PUNC">(</span><span class="STRN">"loadedmetadata"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">// we've done more than loading metadata of course,</span><span class="WHIT">
-<span class='line'>1016</span> </span><span class="WHIT">                                                      </span><span class="COMM">// but popcorn doesn't need to know more.</span><span class="WHIT">
-<span class='line'>1017</span> </span><span class="WHIT">  </span><span class="NAME">IriSP.PopcornReplacement.media.muted</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">jwplayer</span><span class="PUNC">(</span><span class="NAME">IriSP.PopcornReplacement._container</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">getMute</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1018</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1019</span> 
-<span class='line'>1020</span> </span><span class="NAME">IriSP.PopcornReplacement.jwplayer</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">container</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">options</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1021</span> </span><span class="WHIT">  </span><span class="NAME">IriSP.PopcornReplacement._container</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">container.slice</span><span class="PUNC">(</span><span class="NUMB">1</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">//eschew the '#'</span><span class="WHIT">
-<span class='line'>1022</span> </span><span class="WHIT">  </span><span class="NAME">options.events</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1023</span> </span><span class="WHIT">      </span><span class="NAME">onReady</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">IriSP.PopcornReplacement.__initApi</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>1024</span> </span><span class="WHIT">      </span><span class="NAME">onTime</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">IriSP.PopcornReplacement.__timeHandler</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>1025</span> </span><span class="WHIT">      </span><span class="NAME">onPlay</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">IriSP.PopcornReplacement.__playHandler</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>1026</span> </span><span class="WHIT">      </span><span class="NAME">onPause</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">IriSP.PopcornReplacement.__pauseHandler</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>1027</span> </span><span class="WHIT">      </span><span class="NAME">onSeek</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">IriSP.PopcornReplacement.__seekHandler</span><span class="WHIT"> 
-<span class='line'>1028</span>       </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1029</span> </span><span class="WHIT">    
-<span class='line'>1030</span>   </span><span class="NAME">jwplayer</span><span class="PUNC">(</span><span class="NAME">IriSP.PopcornReplacement._container</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">setup</span><span class="PUNC">(</span><span class="NAME">options</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1031</span> </span><span class="WHIT">  </span><span class="NAME">IriSP.PopcornReplacement.media.duration</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">options.duration</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1032</span> </span><span class="WHIT">  </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">IriSP.PopcornReplacement</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1033</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1034</span> 
-<span class='line'>1035</span> </span><span class="NAME">IriSP.PopcornReplacement.currentTime</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">time</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1036</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">time</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1037</span> </span><span class="WHIT">      </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">jwplayer</span><span class="PUNC">(</span><span class="NAME">IriSP.PopcornReplacement._container</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">getPosition</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">            
-<span class='line'>1038</span>   </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1039</span> </span><span class="WHIT">     </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">currentTime</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="NAME">time</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1040</span> </span><span class="WHIT">     </span><span class="NAME">jwplayer</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">IriSP.PopcornReplacement._container</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">seek</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">currentTime</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1041</span> </span><span class="WHIT">     </span><span class="NAME">IriSP.PopcornReplacement.trigger</span><span class="PUNC">(</span><span class="STRN">"seeked"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1042</span> </span><span class="WHIT">     </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">jwplayer</span><span class="PUNC">(</span><span class="NAME">IriSP.PopcornReplacement._container</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">getPosition</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">            
-<span class='line'>1043</span>   </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1044</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1045</span> 
-<span class='line'>1046</span> </span><span class="NAME">IriSP.PopcornReplacement.play</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1047</span> </span><span class="WHIT">      </span><span class="NAME">IriSP.PopcornReplacement.media.paused</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1048</span> </span><span class="WHIT">      </span><span class="NAME">IriSP.PopcornReplacement.trigger</span><span class="PUNC">(</span><span class="STRN">"play"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1049</span> </span><span class="COMM">//      IriSP.PopcornReplacement.trigger("playing");</span><span class="WHIT">
-<span class='line'>1050</span> </span><span class="WHIT">      </span><span class="NAME">jwplayer</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">IriSP.PopcornReplacement._container</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">play</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1051</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1052</span> </span><span class="WHIT">    
-<span class='line'>1053</span> </span><span class="NAME">IriSP.PopcornReplacement.pause</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1054</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="NAME">IriSP.PopcornReplacement.media.paused</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1055</span> </span><span class="WHIT">        </span><span class="NAME">IriSP.PopcornReplacement.media.paused</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1056</span> </span><span class="WHIT">        </span><span class="NAME">IriSP.PopcornReplacement.trigger</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"pause"</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1057</span> </span><span class="WHIT">        </span><span class="NAME">jwplayer</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">IriSP.PopcornReplacement._container</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">pause</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1058</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1059</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1060</span> 
-<span class='line'>1061</span> </span><span class="NAME">IriSP.PopcornReplacement.muted</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">val</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1062</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">val</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1063</span> 
-<span class='line'>1064</span> </span><span class="WHIT">    </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">jwplayer</span><span class="PUNC">(</span><span class="NAME">IriSP.PopcornReplacement._container</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">getMute</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="NAME">val</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1065</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">val</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1066</span> </span><span class="WHIT">        </span><span class="NAME">jwplayer</span><span class="PUNC">(</span><span class="NAME">IriSP.PopcornReplacement._container</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">setMute</span><span class="PUNC">(</span><span class="KEYW">true</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1067</span> </span><span class="WHIT">        </span><span class="NAME">IriSP.PopcornReplacement.media.muted</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1068</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1069</span> </span><span class="WHIT">        </span><span class="NAME">jwplayer</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">IriSP.PopcornReplacement._container</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">setMute</span><span class="PUNC">(</span><span class="KEYW">false</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1070</span> </span><span class="WHIT">        </span><span class="NAME">IriSP.PopcornReplacement.media.muted</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1071</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1072</span> 
-<span class='line'>1073</span> </span><span class="WHIT">      </span><span class="NAME">IriSP.PopcornReplacement.trigger</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"volumechange"</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1074</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1075</span> </span><span class="WHIT">    
-<span class='line'>1076</span>     </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">jwplayer</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">IriSP.PopcornReplacement._container</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">getMute</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1077</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1078</span> </span><span class="WHIT">    </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">jwplayer</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">IriSP.PopcornReplacement._container</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">getMute</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1079</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1080</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1081</span> 
-<span class='line'>1082</span> </span><span class="NAME">IriSP.PopcornReplacement.mute</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.PopcornReplacement.muted</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1083</span> 
-<span class='line'>1084</span> </span><span class="NAME">IriSP.PopcornReplacement.__codes</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1085</span> </span><span class="NAME">IriSP.PopcornReplacement.code</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">options</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1086</span> </span><span class="WHIT">  </span><span class="NAME">IriSP.PopcornReplacement.__codes.push</span><span class="PUNC">(</span><span class="NAME">options</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1087</span> </span><span class="WHIT">  </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">IriSP.PopcornReplacement</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1088</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1089</span> 
-<span class='line'>1090</span> </span><span class="NAME">IriSP.PopcornReplacement.__runCode</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1091</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">currentTime</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">jwplayer</span><span class="PUNC">(</span><span class="NAME">IriSP.PopcornReplacement._container</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">getPosition</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1092</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1093</span> </span><span class="WHIT">  </span><span class="KEYW">for</span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">IriSP.PopcornReplacement.__codes.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1094</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">c</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.PopcornReplacement.__codes</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1095</span> </span><span class="WHIT">    </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">currentTime</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="NAME">c.start</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1096</span> </span><span class="WHIT">      </span><span class="NAME">c.onStart</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1097</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1098</span> </span><span class="WHIT">    
-<span class='line'>1099</span>     </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">currentTime</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="NAME">c.end</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1100</span> </span><span class="WHIT">      </span><span class="NAME">c.onEnd</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1101</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1102</span> 
-<span class='line'>1103</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1104</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1105</span> 
-<span class='line'>1106</span> </span><span class="COMM">/* called everytime the player updates itself 
-<span class='line'>1107</span>    (onTime event)
-<span class='line'>1108</span>  */</span><span class="WHIT">
-<span class='line'>1109</span> 
-<span class='line'>1110</span> </span><span class="NAME">IriSP.PopcornReplacement.__timeHandler</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">event</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1111</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">pos</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">event.position</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1112</span> 
-<span class='line'>1113</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1114</span> </span><span class="WHIT">  </span><span class="KEYW">for</span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">IriSP.PopcornReplacement.__codes.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1115</span> </span><span class="WHIT">     </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">c</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.PopcornReplacement.__codes</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1116</span> </span><span class="WHIT">     
-<span class='line'>1117</span>      </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">pos</span><span class="WHIT"> </span><span class="PUNC">>=</span><span class="WHIT"> </span><span class="NAME">c.start</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">pos</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">c.end</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> 
-<span class='line'>1118</span>          </span><span class="NAME">pos</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NUMB">0.1</span><span class="WHIT"> </span><span class="PUNC">&lt;=</span><span class="WHIT"> </span><span class="NAME">c.start</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">       
-<span class='line'>1119</span>         </span><span class="NAME">c.onStart</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1120</span> </span><span class="WHIT">     </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1121</span> </span><span class="WHIT"> 
-<span class='line'>1122</span>      </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">pos</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NAME">c.start</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">pos</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NAME">c.end</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> 
-<span class='line'>1123</span>          </span><span class="NAME">pos</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NUMB">0.1</span><span class="WHIT"> </span><span class="PUNC">&lt;=</span><span class="WHIT"> </span><span class="NAME">c.end</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1124</span> </span><span class="WHIT">         </span><span class="NAME">console.log</span><span class="PUNC">(</span><span class="STRN">"eonedn"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1125</span> </span><span class="WHIT">        </span><span class="NAME">c.onEnd</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1126</span> </span><span class="WHIT">     </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1127</span> </span><span class="WHIT">   
-<span class='line'>1128</span>   </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1129</span> </span><span class="WHIT"> 
-<span class='line'>1130</span>   </span><span class="NAME">IriSP.PopcornReplacement.trigger</span><span class="PUNC">(</span><span class="STRN">"timeupdate"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1131</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1132</span> 
-<span class='line'>1133</span> </span><span class="NAME">IriSP.PopcornReplacement.__seekHandler</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">event</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1134</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1135</span> </span><span class="WHIT">  
-<span class='line'>1136</span>   </span><span class="KEYW">for</span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">IriSP.PopcornReplacement.__codes.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1137</span> </span><span class="WHIT">     </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">c</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.PopcornReplacement.__codes</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1138</span> </span><span class="WHIT">    
-<span class='line'>1139</span>      </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">event.position</span><span class="WHIT"> </span><span class="PUNC">>=</span><span class="WHIT"> </span><span class="NAME">c.start</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">event.position</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">c.end</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">        
-<span class='line'>1140</span>         </span><span class="NAME">c.onEnd</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1141</span> </span><span class="WHIT">     </span><span class="PUNC">}</span><span class="WHIT">         
-<span class='line'>1142</span>    </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1143</span> 
-<span class='line'>1144</span> </span><span class="WHIT">   </span><span class="KEYW">for</span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">IriSP.PopcornReplacement.__codes.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1145</span> </span><span class="WHIT">     </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">c</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.PopcornReplacement.__codes</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1146</span> 
-<span class='line'>1147</span> </span><span class="WHIT">     </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">event.offset</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="PUNC">)</span><span class="WHIT">
-<span class='line'>1148</span> </span><span class="WHIT">       </span><span class="NAME">event.offset</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1149</span> </span><span class="WHIT">           
-<span class='line'>1150</span>      </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">event.offset</span><span class="WHIT"> </span><span class="PUNC">>=</span><span class="WHIT"> </span><span class="NAME">c.start</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">event.offset</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">c.end</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> 
-<span class='line'>1151</span>        </span><span class="NAME">c.onStart</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1152</span> </span><span class="WHIT">     </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1153</span> </span><span class="WHIT">     
-<span class='line'>1154</span>    </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1155</span> 
-<span class='line'>1156</span> </span><span class="WHIT">  </span><span class="NAME">IriSP.PopcornReplacement.trigger</span><span class="PUNC">(</span><span class="STRN">"timeupdate"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1157</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1158</span> 
-<span class='line'>1159</span> 
-<span class='line'>1160</span> </span><span class="NAME">IriSP.PopcornReplacement.__playHandler</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">event</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1161</span> </span><span class="WHIT">  </span><span class="NAME">IriSP.PopcornReplacement.media.paused</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1162</span> </span><span class="WHIT">  </span><span class="NAME">IriSP.PopcornReplacement.trigger</span><span class="PUNC">(</span><span class="STRN">"play"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1163</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1164</span> 
-<span class='line'>1165</span> </span><span class="NAME">IriSP.PopcornReplacement.__pauseHandler</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">event</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1166</span> </span><span class="WHIT">  </span><span class="NAME">IriSP.PopcornReplacement.media.paused</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1167</span> </span><span class="WHIT">  </span><span class="NAME">IriSP.PopcornReplacement.trigger</span><span class="PUNC">(</span><span class="STRN">"pause"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1168</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1169</span> 
-<span class='line'>1170</span> </span><span class="NAME">IriSP.PopcornReplacement.roundTime</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1171</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">currentTime</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.PopcornReplacement.currentTime</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1172</span> </span><span class="WHIT">  </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">Math.round</span><span class="PUNC">(</span><span class="NAME">currentTime</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1173</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1174</span> </span><span class="COMM">/* utils.js - various utils that don't belong anywhere else */</span><span class="WHIT">
-<span class='line'>1175</span> 
-<span class='line'>1176</span> </span><span class="COMM">/* trace function, for debugging */</span><span class="WHIT">
-<span class='line'>1177</span> 
-<span class='line'>1178</span> </span><span class="NAME">IriSP.traceNum</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1179</span> </span><span class="NAME">IriSP.trace</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">msg</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">value</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1180</span> </span><span class="COMM">/*
-<span class='line'>1181</span> 	if( IriSP.config.gui.debug === true ) {
-<span class='line'>1182</span> 		IriSP.traceNum += 1;
-<span class='line'>1183</span> 		IriSP.jQuery( "&lt;div>"+IriSP.traceNum+" - "+msg+" : "+value+"&lt;/div>" ).appendTo( "#Ldt-output" );
-<span class='line'>1184</span> 	}
-<span class='line'>1185</span> */</span><span class="WHIT">
-<span class='line'>1186</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1187</span> 
-<span class='line'>1188</span> </span><span class="COMM">/* used in callbacks - because in callbacks we lose "this",
-<span class='line'>1189</span>    we need to have a special function which wraps "this" in 
-<span class='line'>1190</span>    a closure. This way, the 
-<span class='line'>1191</span> */</span><span class="WHIT">   
-<span class='line'>1192</span> </span><span class="NAME">IriSP.wrap</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">obj</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">fn</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1193</span> </span><span class="WHIT">  </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">    
-<span class='line'>1194</span>     </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">args</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Array.prototype.slice.call</span><span class="PUNC">(</span><span class="NAME">arguments</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1195</span> </span><span class="WHIT">    </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">fn.apply</span><span class="PUNC">(</span><span class="NAME">obj</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">args</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1196</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1197</span> </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1198</span> 
-<span class='line'>1199</span> </span><span class="COMM">/* convert a time to a percentage in the media */</span><span class="WHIT">
-<span class='line'>1200</span> </span><span class="NAME">IriSP.timeToPourcent</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">time</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">timetotal</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1201</span> </span><span class="WHIT">	</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">time</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.abs</span><span class="PUNC">(</span><span class="NAME">time</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1202</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">timetotal</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.abs</span><span class="PUNC">(</span><span class="NAME">timetotal</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1203</span> </span><span class="WHIT">  
-<span class='line'>1204</span> 	</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">Math.floor</span><span class="PUNC">(</span><span class="PUNC">(</span><span class="NAME">time</span><span class="PUNC">/</span><span class="NAME">timetotal</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="NUMB">100</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1205</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1206</span> 
-<span class='line'>1207</span> </span><span class="NAME">IriSP.padWithZeros</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">num</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1208</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">Math.abs</span><span class="PUNC">(</span><span class="NAME">num</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NUMB">10</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1209</span> </span><span class="WHIT">    </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="STRN">"0"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">num.toString</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1210</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1211</span> </span><span class="WHIT">    </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">num.toString</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1212</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1213</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1214</span> </span><span class="COMM">/* convert a number of seconds to a tuple of the form 
-<span class='line'>1215</span>    [hours, minutes, seconds]
-<span class='line'>1216</span> */</span><span class="WHIT">
-<span class='line'>1217</span> </span><span class="NAME">IriSP.secondsToTime</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">secs</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">  
-<span class='line'>1218</span>   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">hours</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.abs</span><span class="PUNC">(</span><span class="NAME">parseInt</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">secs</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">3600</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">%</span><span class="WHIT"> </span><span class="NUMB">24</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1219</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">minutes</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.abs</span><span class="PUNC">(</span><span class="NAME">parseInt</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">secs</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">60</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">%</span><span class="WHIT"> </span><span class="NUMB">60</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1220</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">seconds</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">parseFloat</span><span class="PUNC">(</span><span class="NAME">Math.abs</span><span class="PUNC">(</span><span class="NAME">secs</span><span class="WHIT"> </span><span class="PUNC">%</span><span class="WHIT"> </span><span class="NUMB">60</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">toFixed</span><span class="PUNC">(</span><span class="NUMB">0</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1221</span> </span><span class="WHIT">  
-<span class='line'>1222</span>   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">toString_fn</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1223</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">ret</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1224</span> </span><span class="WHIT">    </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">hours</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT">
-<span class='line'>1225</span> </span><span class="WHIT">       </span><span class="NAME">ret</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.padWithZeros</span><span class="PUNC">(</span><span class="NAME">this.hours</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">":"</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1226</span> </span><span class="WHIT">    </span><span class="NAME">ret</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.padWithZeros</span><span class="PUNC">(</span><span class="NAME">this.minutes</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">":"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">IriSP.padWithZeros</span><span class="PUNC">(</span><span class="NAME">this.seconds</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1227</span> 
-<span class='line'>1228</span> </span><span class="WHIT">    </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">ret</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1229</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1230</span> </span><span class="WHIT">  </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="STRN">"hours"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">hours</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"minutes"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">minutes</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"seconds"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">seconds</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">toString</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">toString_fn</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1231</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1232</span> 
-<span class='line'>1233</span> </span><span class="NAME">IriSP.secondsToString</span><span class="WHIT">
-<span class='line'>1234</span> 
-<span class='line'>1235</span> </span><span class="COMM">/* format a tweet - replaces @name by a link to the profile, #hashtag, etc. */</span><span class="WHIT">
-<span class='line'>1236</span> </span><span class="NAME">IriSP.formatTweet</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">tweet</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1237</span> </span><span class="WHIT">  </span><span class="COMM">/*
-<span class='line'>1238</span>     an array of arrays which hold a regexp and its replacement.
-<span class='line'>1239</span>   */</span><span class="WHIT">
-<span class='line'>1240</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">regExps</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="WHIT">
-<span class='line'>1241</span> </span><span class="WHIT">    </span><span class="COMM">/* copied from http://codegolf.stackexchange.com/questions/464/shortest-url-regex-match-in-javascript/480#480 */</span><span class="WHIT">
-<span class='line'>1242</span> </span><span class="WHIT">    </span><span class="PUNC">[</span><span class="REGX">/((https?:\/\/)?[\w-]+(\.[\w-]+)+\.?(:\d+)?(\/\S*)?)/gi</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"&lt;a href='$1'>$1&lt;/a>"</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>1243</span> </span><span class="WHIT">    </span><span class="PUNC">[</span><span class="REGX">/@(\w+)/gi</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"&lt;a href='http://twitter.com/$1'>@$1&lt;/a>"</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="COMM">// matches a @handle</span><span class="WHIT">
-<span class='line'>1244</span> </span><span class="WHIT">    </span><span class="PUNC">[</span><span class="REGX">/#(\w+)/gi</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"&lt;a href='http://twitter.com/search?q=%23$1'>#$1&lt;/a>"</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="COMM">// matches a hashtag</span><span class="WHIT">
-<span class='line'>1245</span> </span><span class="WHIT">    </span><span class="PUNC">[</span><span class="REGX">/(\+\+)/gi</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"&lt;span class='Ldt-PolemicPlusPlus'>$1&lt;/span>"</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>1246</span> </span><span class="WHIT">    </span><span class="PUNC">[</span><span class="REGX">/(--)/gi</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"&lt;span class='Ldt-PolemicMinusMinus'>$1&lt;/span>"</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>1247</span> </span><span class="WHIT">    </span><span class="PUNC">[</span><span class="REGX">/(==)/gi</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"&lt;span class='Ldt-PolemicEqualEqual'>$1&lt;/span>"</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>1248</span> </span><span class="WHIT">    </span><span class="PUNC">[</span><span class="REGX">/(\?\?)/gi</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"&lt;span class='Ldt-PolemicQuestion'>$1&lt;/span>"</span><span class="PUNC">]</span><span class="WHIT">
-<span class='line'>1249</span> </span><span class="WHIT">  </span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT"> 
-<span class='line'>1250</span> 
-<span class='line'>1251</span>   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1252</span> </span><span class="WHIT">  </span><span class="KEYW">for</span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">regExps.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1253</span> </span><span class="WHIT">     </span><span class="NAME">tweet</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">tweet.replace</span><span class="PUNC">(</span><span class="NAME">regExps</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">regExps</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">[</span><span class="NUMB">1</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1254</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1255</span> </span><span class="WHIT">  
-<span class='line'>1256</span>   </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">tweet</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1257</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1258</span> 
-<span class='line'>1259</span> </span><span class="NAME">IriSP.countProperties</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">obj</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1260</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">count</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1261</span> 
-<span class='line'>1262</span> </span><span class="WHIT">    </span><span class="KEYW">for</span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">prop</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">obj</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1263</span> </span><span class="WHIT">        </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">obj.hasOwnProperty</span><span class="PUNC">(</span><span class="NAME">prop</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
-<span class='line'>1264</span> </span><span class="WHIT">                </span><span class="PUNC">++</span><span class="NAME">count</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1265</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1266</span> 
-<span class='line'>1267</span> </span><span class="WHIT">    </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">count</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1268</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1269</span> 
-<span class='line'>1270</span> </span><span class="COMM">// conversion de couleur Decimal vers HexaDecimal || 000 si fff</span><span class="WHIT">
-<span class='line'>1271</span> </span><span class="NAME">IriSP.DEC_HEXA_COLOR</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">dec</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1272</span> </span><span class="WHIT">	 </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">hexa</span><span class="PUNC">=</span><span class="STRN">'0123456789ABCDEF'</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1273</span> </span><span class="WHIT">   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">hex</span><span class="PUNC">=</span><span class="STRN">''</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1274</span> </span><span class="WHIT">	 </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">tmp</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1275</span> </span><span class="WHIT">	 </span><span class="KEYW">while</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">dec</span><span class="PUNC">></span><span class="NUMB">15</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1276</span> </span><span class="WHIT">		  </span><span class="NAME">tmp</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">dec</span><span class="PUNC">-</span><span class="PUNC">(</span><span class="NAME">Math.floor</span><span class="PUNC">(</span><span class="NAME">dec</span><span class="PUNC">/</span><span class="NUMB">16</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">*</span><span class="NUMB">16</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1277</span> </span><span class="WHIT">		  </span><span class="NAME">hex</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">hexa.charAt</span><span class="PUNC">(</span><span class="NAME">tmp</span><span class="PUNC">)</span><span class="PUNC">+</span><span class="NAME">hex</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1278</span> </span><span class="WHIT">		  </span><span class="NAME">dec</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.floor</span><span class="PUNC">(</span><span class="NAME">dec</span><span class="PUNC">/</span><span class="NUMB">16</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1279</span> </span><span class="WHIT">	 </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1280</span> </span><span class="WHIT">	 </span><span class="NAME">hex</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">hexa.charAt</span><span class="PUNC">(</span><span class="NAME">dec</span><span class="PUNC">)</span><span class="PUNC">+</span><span class="NAME">hex</span><span class="PUNC">;</span><span class="WHIT">	 
-<span class='line'>1281</span> 	 </span><span class="KEYW">return</span><span class="PUNC">(</span><span class="NAME">hex</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1282</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1283</span> 
-<span class='line'>1284</span> </span><span class="COMM">/* shortcut to have global variables in templates */</span><span class="WHIT">
-<span class='line'>1285</span> </span><span class="NAME">IriSP.templToHTML</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">template</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">values</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1286</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">params</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.jQuery.extend</span><span class="PUNC">(</span><span class="NAME">IriSP.default_templates_vars</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">values</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1287</span> </span><span class="WHIT">  </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">Mustache.to_html</span><span class="PUNC">(</span><span class="NAME">template</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">params</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1288</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1289</span> 
-<span class='line'>1290</span> </span><span class="COMM">/* we need to be stricter than encodeURIComponent,
-<span class='line'>1291</span>    because of twitter
-<span class='line'>1292</span> */</span><span class="WHIT">  
-<span class='line'>1293</span> </span><span class="NAME">IriSP.encodeURI</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">str</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1294</span> </span><span class="WHIT">  </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">encodeURIComponent</span><span class="PUNC">(</span><span class="NAME">str</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="REGX">/!/g</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'%21'</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="REGX">/'/g</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'%27'</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="REGX">/\(/g</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'%28'</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="WHIT">  
-<span class='line'>1295</span>                                  </span><span class="NAME">replace</span><span class="PUNC">(</span><span class="REGX">/\)/g</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'%29'</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="REGX">/\*/g</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'%2A'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">  
-<span class='line'>1296</span> </span><span class="PUNC">}</span><span class="WHIT">  
-<span class='line'>1297</span> 
-<span class='line'>1298</span> </span><span class="NAME">IriSP.__guidCounter</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1299</span> </span><span class="NAME">IriSP.guid</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">prefix</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1300</span> </span><span class="WHIT">  </span><span class="NAME">IriSP.__guidCounter</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1301</span> </span><span class="WHIT">  </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">prefix</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">IriSP.__guidCounter</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1302</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1303</span> </span><span class="COMM">/* for ie compatibility
-<span class='line'>1304</span> if (Object.prototype.__defineGetter__&&!Object.defineProperty) {
-<span class='line'>1305</span>    Object.defineProperty=function(obj,prop,desc) {
-<span class='line'>1306</span>       if ("get" in desc) obj.__defineGetter__(prop,desc.get);
-<span class='line'>1307</span>       if ("set" in desc) obj.__defineSetter__(prop,desc.set);
-<span class='line'>1308</span>    }
-<span class='line'>1309</span> }
-<span class='line'>1310</span> */</span><span class="WHIT">
-<span class='line'>1311</span> </span><span class="COMM">/* data.js - this file deals with how the players gets and sends data */</span><span class="WHIT">
-<span class='line'>1312</span> 
-<span class='line'>1313</span> </span><span class="NAME">IriSP.DataLoader</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1314</span> </span><span class="WHIT">  </span><span class="NAME">this._cache</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1315</span> </span><span class="WHIT">  
-<span class='line'>1316</span>   </span><span class="COMM">/*
-<span class='line'>1317</span>     A structure to hold callbacks for specific urls. We need it because
-<span class='line'>1318</span>     ajax calls are asynchronous, so it means that sometimes we ask
-<span class='line'>1319</span>     multiple times for a ressource because the first call hasn't been
-<span class='line'>1320</span>     received yet.
-<span class='line'>1321</span>   */</span><span class="WHIT">
-<span class='line'>1322</span> </span><span class="WHIT">  </span><span class="NAME">this._callbacks</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1323</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1324</span> 
-<span class='line'>1325</span> </span><span class="NAME">IriSP.DataLoader.prototype.get</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">url</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">callback</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1326</span> 
-<span class='line'>1327</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">base_url</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">url.split</span><span class="PUNC">(</span><span class="STRN">"&"</span><span class="PUNC">)</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="WHIT">
-<span class='line'>1328</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">this._cache.hasOwnProperty</span><span class="PUNC">(</span><span class="NAME">base_url</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1329</span> </span><span class="WHIT">    </span><span class="NAME">callback</span><span class="PUNC">(</span><span class="NAME">this._cache</span><span class="PUNC">[</span><span class="NAME">base_url</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1330</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">  
-<span class='line'>1331</span>     </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">this._callbacks.hasOwnProperty</span><span class="PUNC">(</span><span class="NAME">base_url</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1332</span> </span><span class="WHIT">      </span><span class="NAME">this._callbacks</span><span class="PUNC">[</span><span class="NAME">base_url</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1333</span> </span><span class="WHIT">      </span><span class="NAME">this._callbacks</span><span class="PUNC">[</span><span class="NAME">base_url</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">push</span><span class="PUNC">(</span><span class="NAME">callback</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">   
-<span class='line'>1334</span>       </span><span class="COMM">/* we need a closure because this gets lost when it's called back */</span><span class="WHIT">
-<span class='line'>1335</span> </span><span class="WHIT">  
-<span class='line'>1336</span>       </span><span class="COMM">// uncomment you don't want to use caching.</span><span class="WHIT">
-<span class='line'>1337</span> </span><span class="WHIT">      </span><span class="COMM">// IriSP.jQuery.get(url, callback);</span><span class="WHIT">
-<span class='line'>1338</span> </span><span class="WHIT">      
-<span class='line'>1339</span>       </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">func</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">data</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1340</span> </span><span class="WHIT">                  </span><span class="NAME">this._cache</span><span class="PUNC">[</span><span class="NAME">base_url</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">data</span><span class="PUNC">;</span><span class="WHIT">                                
-<span class='line'>1341</span>                   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1342</span> </span><span class="WHIT">                  
-<span class='line'>1343</span>                   </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">this._callbacks</span><span class="PUNC">[</span><span class="NAME">base_url</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1344</span> </span><span class="WHIT">                    </span><span class="NAME">this._callbacks</span><span class="PUNC">[</span><span class="NAME">base_url</span><span class="PUNC">]</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">(</span><span class="NAME">this._cache</span><span class="PUNC">[</span><span class="NAME">base_url</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">                                  
-<span class='line'>1345</span>                   </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1346</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1347</span> </span><span class="WHIT">      
-<span class='line'>1348</span>       </span><span class="COMM">/* automagically choose between json and jsonp */</span><span class="WHIT">
-<span class='line'>1349</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">url.indexOf</span><span class="PUNC">(</span><span class="NAME">document.location.hostname</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="NUMB">1</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT">
-<span class='line'>1350</span> </span><span class="WHIT">          </span><span class="NAME">url.indexOf</span><span class="PUNC">(</span><span class="STRN">"http://"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="NUMB">1</span><span class="WHIT"> </span><span class="COMM">/* not a relative url */</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1351</span> </span><span class="WHIT">        </span><span class="COMM">// we contacting a foreign domain, use JSONP</span><span class="WHIT">
-<span class='line'>1352</span> 
-<span class='line'>1353</span> </span><span class="WHIT">        </span><span class="NAME">IriSP.jQuery.get</span><span class="PUNC">(</span><span class="NAME">url</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">func</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"jsonp"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1354</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1355</span> 
-<span class='line'>1356</span> </span><span class="WHIT">        </span><span class="COMM">// otherwise, hey, whatever rows your boat</span><span class="WHIT">
-<span class='line'>1357</span> </span><span class="WHIT">        </span><span class="NAME">IriSP.jQuery.get</span><span class="PUNC">(</span><span class="NAME">url</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">func</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1358</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1359</span> </span><span class="WHIT">    
-<span class='line'>1360</span>     </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1361</span> </span><span class="WHIT">      </span><span class="COMM">/* simply push the callback - it'll get called when the ressource
-<span class='line'>1362</span>          has been received */</span><span class="WHIT">
-<span class='line'>1363</span> </span><span class="WHIT">      
-<span class='line'>1364</span>       </span><span class="NAME">this._callbacks</span><span class="PUNC">[</span><span class="NAME">base_url</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">push</span><span class="PUNC">(</span><span class="NAME">callback</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">   
-<span class='line'>1365</span>    
-<span class='line'>1366</span>     </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1367</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1368</span> </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1369</span> 
-<span class='line'>1370</span> </span><span class="COMM">/* the base abstract "class" */</span><span class="WHIT">
-<span class='line'>1371</span> </span><span class="NAME">IriSP.Serializer</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">DataLoader</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">url</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1372</span> </span><span class="WHIT">  </span><span class="NAME">this._DataLoader</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">DataLoader</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1373</span> </span><span class="WHIT">  </span><span class="NAME">this._url</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">url</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1374</span> </span><span class="WHIT">  </span><span class="NAME">this._data</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1375</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1376</span> 
-<span class='line'>1377</span> </span><span class="NAME">IriSP.Serializer.prototype.serialize</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">data</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1378</span> </span><span class="NAME">IriSP.Serializer.prototype.deserialize</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">data</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1379</span> 
-<span class='line'>1380</span> </span><span class="NAME">IriSP.Serializer.prototype.currentMedia</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">  
-<span class='line'>1381</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1382</span> 
-<span class='line'>1383</span> </span><span class="NAME">IriSP.Serializer.prototype.sync</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">callback</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">  
-<span class='line'>1384</span>   </span><span class="NAME">callback.call</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this._data</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">  
-<span class='line'>1385</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1386</span> 
-<span class='line'>1387</span> </span><span class="NAME">IriSP.SerializerFactory</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">DataLoader</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1388</span> </span><span class="WHIT">  </span><span class="NAME">this._dataloader</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">DataLoader</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1389</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1390</span> 
-<span class='line'>1391</span> </span><span class="NAME">IriSP.SerializerFactory.prototype.getSerializer</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">metadataOptions</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1392</span> </span><span class="WHIT">  </span><span class="COMM">/* This function returns serializer set-up with the correct
-<span class='line'>1393</span>      configuration - takes a metadata struct describing the metadata source
-<span class='line'>1394</span>   */</span><span class="WHIT">
-<span class='line'>1395</span> </span><span class="WHIT">  
-<span class='line'>1396</span>   </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">metadataOptions</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">)</span><span class="WHIT">
-<span class='line'>1397</span> </span><span class="WHIT">    </span><span class="COMM">/* return an empty serializer */</span><span class="WHIT">
-<span class='line'>1398</span> </span><span class="WHIT">    </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">IriSP.Serializer</span><span class="PUNC">(</span><span class="STRN">""</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1399</span> </span><span class="WHIT">            
-<span class='line'>1400</span>   </span><span class="KEYW">switch</span><span class="PUNC">(</span><span class="NAME">metadataOptions.type</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1401</span> </span><span class="WHIT">    </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">"json"</span><span class="PUNC">:</span><span class="WHIT">
-<span class='line'>1402</span> </span><span class="WHIT">      </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">IriSP.JSONSerializer</span><span class="PUNC">(</span><span class="NAME">this._dataloader</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">metadataOptions.src</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1403</span> </span><span class="WHIT">      </span><span class="KEYW">break</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1404</span> </span><span class="WHIT">    
-<span class='line'>1405</span>     </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">"dummy"</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="COMM">/* only used for unit testing - not defined in production */</span><span class="WHIT">
-<span class='line'>1406</span> </span><span class="WHIT">      </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">IriSP.MockSerializer</span><span class="PUNC">(</span><span class="NAME">this._dataloader</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">metadataOptions.src</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1407</span> </span><span class="WHIT">      </span><span class="KEYW">break</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1408</span> </span><span class="WHIT">    
-<span class='line'>1409</span>     </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">"empty"</span><span class="PUNC">:</span><span class="WHIT">
-<span class='line'>1410</span> </span><span class="WHIT">      </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">IriSP.Serializer</span><span class="PUNC">(</span><span class="STRN">""</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"empty"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1411</span> </span><span class="WHIT">      </span><span class="KEYW">break</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1412</span> </span><span class="WHIT">      
-<span class='line'>1413</span>     </span><span class="KEYW">default</span><span class="PUNC">:</span><span class="WHIT">      
-<span class='line'>1414</span>       </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1415</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1416</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1417</span> </span><span class="COMM">/* site.js - all our site-dependent config : player chrome, cdn locations, etc...*/</span><span class="WHIT">
-<span class='line'>1418</span> 
-<span class='line'>1419</span> </span><span class="NAME">IriSP.lib</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> 
-<span class='line'>1420</span> 		</span><span class="NAME">jQuery</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.js"</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>1421</span> </span><span class="WHIT">		</span><span class="NAME">jQueryUI</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.4/jquery-ui.js"</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>1422</span> </span><span class="WHIT">		</span><span class="NAME">jQueryToolTip</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"http://cdn.jquerytools.org/1.2.4/all/jquery.tools.min.js"</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>1423</span> </span><span class="WHIT">		</span><span class="NAME">swfObject</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"http://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js"</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>1424</span> </span><span class="WHIT">		</span><span class="NAME">cssjQueryUI</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.4/themes/base/jquery-ui.css"</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>1425</span> </span><span class="WHIT">    </span><span class="NAME">popcorn</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"/mdp/src/js/libs/popcorn.js"</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>1426</span> </span><span class="WHIT">    </span><span class="NAME">jwplayer</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"/mdp/src/js/libs/jwplayer.js"</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>1427</span> </span><span class="WHIT">    </span><span class="NAME">popcornReplacement</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"/mdp/src/js/libs/pop.js"</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>1428</span> </span><span class="WHIT">    </span><span class="NAME">raphael</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"/mdp/src/js/libs/raphael.js"</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>1429</span> </span><span class="WHIT">    </span><span class="STRN">"popcorn.mediafragment"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"/mdp/src/js/libs/popcorn.mediafragment.js"</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>1430</span> </span><span class="WHIT">    </span><span class="STRN">"popcorn.code"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"/mdp/src/js/libs/popcorn.code.js"</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>1431</span> </span><span class="WHIT">    </span><span class="STRN">"popcorn.jwplayer"</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"/mdp/src/js/libs/popcorn.jwplayer.js"</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>1432</span> </span><span class="WHIT">    </span><span class="STRN">"popcorn.youtube"</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"/mdp/src/js/libs/popcorn.youtube.js"</span><span class="WHIT">
-<span class='line'>1433</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1434</span> 
-<span class='line'>1435</span> </span><span class="COMM">//Player Configuration </span><span class="WHIT">
-<span class='line'>1436</span> </span><span class="NAME">IriSP.config</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1437</span> 
-<span class='line'>1438</span> </span><span class="NAME">IriSP.widgetsDefaults</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1439</span> </span><span class="WHIT">  </span><span class="STRN">"LayoutManager"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="NAME">spacer_div_height</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"0px"</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>1440</span> </span><span class="WHIT">  </span><span class="STRN">"PlayerWidget"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>1441</span> </span><span class="WHIT">  </span><span class="STRN">"AnnotationsWidget"</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1442</span> </span><span class="WHIT">    </span><span class="STRN">"share_text"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"I'm watching "</span><span class="PUNC">,</span><span class="WHIT">     
-<span class='line'>1443</span>     </span><span class="STRN">"fb_link"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"http://www.facebook.com/share.php?u="</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>1444</span> </span><span class="WHIT">    </span><span class="STRN">"tw_link"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"http://twitter.com/home?status="</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>1445</span> </span><span class="WHIT">    </span><span class="STRN">"gplus_link"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">""</span><span class="WHIT">
-<span class='line'>1446</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>1447</span> </span><span class="WHIT">  </span><span class="STRN">"TweetsWidget"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1448</span> </span><span class="WHIT">      </span><span class="NAME">default_profile_picture</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"https://si0.twimg.com/sticky/default_profile_images/default_profile_1_normal.png"</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>1449</span> </span><span class="WHIT">      </span><span class="NAME">tweet_display_period</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">10000</span><span class="WHIT"> </span><span class="COMM">// how long do we show a tweet ?</span><span class="WHIT">
-<span class='line'>1450</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>1451</span> </span><span class="WHIT">  </span><span class="STRN">"SliderWidget"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1452</span> </span><span class="WHIT">      </span><span class="NAME">minimize_period</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">850</span><span class="WHIT"> </span><span class="COMM">// how long does the slider stays maximized after the user leaves the zone ?</span><span class="WHIT">
-<span class='line'>1453</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>1454</span> </span><span class="WHIT">  </span><span class="STRN">"Main"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1455</span> </span><span class="WHIT">      </span><span class="NAME">autoplay</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="WHIT">
-<span class='line'>1456</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1457</span> </span><span class="WHIT">  
-<span class='line'>1458</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1459</span> 
-<span class='line'>1460</span> </span><span class="NAME">IriSP.paths</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1461</span> </span><span class="COMM">//  "imgs": "/tweetlive/res/metadataplayer/src/css/imgs"</span><span class="WHIT">
-<span class='line'>1462</span> </span><span class="WHIT">  </span><span class="STRN">"imgs"</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"/mdp/src/css/imgs"</span><span class="WHIT">
-<span class='line'>1463</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1464</span> </span><span class="NAME">IriSP.default_templates_vars</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1465</span> </span><span class="WHIT">  </span><span class="STRN">"img_dir"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">IriSP.paths.imgs</span><span class="WHIT"> 
-<span class='line'>1466</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1467</span> 
-<span class='line'>1468</span> </span><span class="COMM">/* ui.js - ui related functions */</span><span class="WHIT">
-<span class='line'>1469</span> 
-<span class='line'>1470</span> </span><span class="COMM">/* FIXME: use an sharing library */</span><span class="WHIT">
-<span class='line'>1471</span> </span><span class="NAME">IriSP.LdtShareTool</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.share_template</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">/* the contents come from share.html */</span><span class="WHIT">
-<span class='line'>1472</span> 
-<span class='line'>1473</span> </span><span class="NAME">IriSP.createPlayerChrome</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1474</span> </span><span class="WHIT">	</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">width</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.config.gui.width</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1475</span> </span><span class="WHIT">	</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">height</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.config.gui.height</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1476</span> </span><span class="WHIT">	</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">heightS</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.config.gui.height</span><span class="PUNC">-</span><span class="NUMB">20</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1477</span> </span><span class="WHIT">	
-<span class='line'>1478</span> 	</span><span class="COMM">// AUDIO  */</span><span class="WHIT">
-<span class='line'>1479</span> </span><span class="WHIT">	</span><span class="COMM">// PB dans le html : ; </span><span class="WHIT">
-<span class='line'>1480</span> </span><span class="WHIT">	</span><span class="NAME">IriSP.trace</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"__IriSP.createMyHtml"</span><span class="PUNC">,</span><span class="NAME">IriSP.config.gui.container</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1481</span> 
-<span class='line'>1482</span> </span><span class="WHIT">	
-<span class='line'>1483</span> 	</span><span class="COMM">/* FIXME : factor this in another file */</span><span class="WHIT">
-<span class='line'>1484</span> </span><span class="WHIT">	</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">IriSP.config.gui.mode</span><span class="PUNC">==</span><span class="STRN">"radio"</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1485</span> 
-<span class='line'>1486</span> </span><span class="WHIT">		</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"#"</span><span class="PUNC">+</span><span class="NAME">IriSP.config.gui.container</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">before</span><span class="PUNC">(</span><span class="NAME">IriSP.search_template</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1487</span> </span><span class="WHIT">		</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">radioPlayer</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Mustache.to_html</span><span class="PUNC">(</span><span class="NAME">IriSP.radio_template</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="STRN">"share_template"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">IriSP.share_template</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1488</span> </span><span class="WHIT">		</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="NAME">radioPlayer</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">appendTo</span><span class="PUNC">(</span><span class="STRN">"#"</span><span class="PUNC">+</span><span class="NAME">IriSP.config.gui.container</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1489</span> 
-<span class='line'>1490</span> </span><span class="WHIT">		</span><span class="COMM">// special tricks for IE 7</span><span class="WHIT">
-<span class='line'>1491</span> </span><span class="WHIT">		</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">IriSP.jQuery.browser.msie</span><span class="PUNC">==</span><span class="KEYW">true</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">IriSP.jQuery.browser.version</span><span class="PUNC">==</span><span class="STRN">"7.0"</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1492</span> </span><span class="WHIT">			</span><span class="COMM">//LdtSearchContainer</span><span class="WHIT">
-<span class='line'>1493</span> </span><span class="WHIT">			</span><span class="COMM">//__IriSP.jQuery("#LdtPlayer").attr("margin-top","50px");</span><span class="WHIT">
-<span class='line'>1494</span> </span><span class="WHIT">			</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#Ldt-Root"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">css</span><span class="PUNC">(</span><span class="STRN">"padding-top"</span><span class="PUNC">,</span><span class="STRN">"25px"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1495</span> </span><span class="WHIT">			</span><span class="NAME">IriSP.trace</span><span class="PUNC">(</span><span class="STRN">"__IriSP.createHtml"</span><span class="PUNC">,</span><span class="STRN">"IE7 SPECIAL "</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1496</span> </span><span class="WHIT">		</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1497</span> </span><span class="WHIT">	</span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">IriSP.config.gui.mode</span><span class="PUNC">==</span><span class="STRN">"video"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1498</span> </span><span class="WHIT">	
-<span class='line'>1499</span> 		</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">videoPlayer</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Mustache.to_html</span><span class="PUNC">(</span><span class="NAME">IriSP.video_template</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="STRN">"share_template"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">IriSP.share_template</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"heightS"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">heightS</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1500</span> </span><span class="WHIT">		</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="NAME">videoPlayer</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">appendTo</span><span class="PUNC">(</span><span class="STRN">"#"</span><span class="PUNC">+</span><span class="NAME">IriSP.config.gui.container</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1501</span> </span><span class="WHIT">	</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1502</span> </span><span class="WHIT">	
-<span class='line'>1503</span> 	</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#Ldt-Annotations"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">width</span><span class="PUNC">(</span><span class="NAME">width</span><span class="PUNC">-</span><span class="PUNC">(</span><span class="NUMB">75</span><span class="PUNC">*</span><span class="NUMB">2</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1504</span> </span><span class="WHIT">	</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#Ldt-Show-Arrow-container"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">width</span><span class="PUNC">(</span><span class="NAME">width</span><span class="PUNC">-</span><span class="PUNC">(</span><span class="NUMB">75</span><span class="PUNC">*</span><span class="NUMB">2</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1505</span> </span><span class="WHIT">	</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#Ldt-ShowAnnotation-audio"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">width</span><span class="PUNC">(</span><span class="NAME">width</span><span class="PUNC">-</span><span class="NUMB">10</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1506</span> </span><span class="WHIT">	</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#Ldt-ShowAnnotation-video"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">width</span><span class="PUNC">(</span><span class="NAME">width</span><span class="PUNC">-</span><span class="NUMB">10</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1507</span> </span><span class="WHIT">	</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#Ldt-SaKeyword"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">width</span><span class="PUNC">(</span><span class="NAME">width</span><span class="PUNC">-</span><span class="NUMB">10</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1508</span> </span><span class="WHIT">	</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#Ldt-controler"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">width</span><span class="PUNC">(</span><span class="NAME">width</span><span class="PUNC">-</span><span class="NUMB">10</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1509</span> </span><span class="WHIT">	</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#Ldt-Control"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="STRN">"z-index"</span><span class="PUNC">,</span><span class="STRN">"100"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1510</span> </span><span class="WHIT">	</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#Ldt-controler"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">hide</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1511</span> </span><span class="WHIT">	
-<span class='line'>1512</span> 	</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="NAME">IriSP.annotation_loading_template</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">appendTo</span><span class="PUNC">(</span><span class="STRN">"#Ldt-ShowAnnotation-audio"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1513</span> 
-<span class='line'>1514</span> </span><span class="WHIT">	</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">IriSP.config.gui.mode</span><span class="PUNC">==</span><span class="STRN">'radio'</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1515</span> </span><span class="WHIT">		</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#Ldt-load-container"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="STRN">"width"</span><span class="PUNC">,</span><span class="NAME">IriSP.config.gui.width</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1516</span> </span><span class="WHIT">	</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1517</span> </span><span class="WHIT">	</span><span class="COMM">// Show or not the output</span><span class="WHIT">
-<span class='line'>1518</span> </span><span class="WHIT">	</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">IriSP.config.gui.debug</span><span class="PUNC">===</span><span class="KEYW">true</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1519</span> </span><span class="WHIT">		</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#Ldt-output"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">show</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1520</span> </span><span class="WHIT">	</span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1521</span> </span><span class="WHIT">		</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#Ldt-output"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">hide</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1522</span> </span><span class="WHIT">	</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1523</span> </span><span class="WHIT">	
-<span class='line'>1524</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1525</span> 
-<span class='line'>1526</span> 
-<span class='line'>1527</span> </span><span class="COMM">/* create the buttons and the slider   */</span><span class="WHIT">
-<span class='line'>1528</span> </span><span class="NAME">IriSP.createInterface</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">width</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">height</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">duration</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1529</span> </span><span class="WHIT">		
-<span class='line'>1530</span> 		</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"#Ldt-controler"</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">show</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1531</span> </span><span class="WHIT">		</span><span class="COMM">//__IriSP.jQuery("#Ldt-Root").css('display','visible');</span><span class="WHIT">
-<span class='line'>1532</span> </span><span class="WHIT">		</span><span class="NAME">IriSP.trace</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"__IriSP.createInterface"</span><span class="WHIT"> </span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">width</span><span class="PUNC">+</span><span class="STRN">","</span><span class="PUNC">+</span><span class="NAME">height</span><span class="PUNC">+</span><span class="STRN">","</span><span class="PUNC">+</span><span class="NAME">duration</span><span class="PUNC">+</span><span class="STRN">","</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1533</span> </span><span class="WHIT">		
-<span class='line'>1534</span> 		</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"#Ldt-ShowAnnotation"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">click</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> 
-<span class='line'>1535</span> 			 </span><span class="COMM">//__IriSP.jQuery(this).slideUp(); </span><span class="WHIT">
-<span class='line'>1536</span> </span><span class="WHIT">		</span><span class="PUNC">}</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1537</span> 
-<span class='line'>1538</span> </span><span class="WHIT">		</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">LdtpPlayerY</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#Ldt-PlaceHolder"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="STRN">"top"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1539</span> </span><span class="WHIT">		</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">LdtpPlayerX</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#Ldt-PlaceHolder"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="STRN">"left"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1540</span> </span><span class="WHIT">		
-<span class='line'>1541</span> 		</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"#slider-range-min"</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">slider</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="COMM">//range: "min",</span><span class="WHIT">
-<span class='line'>1542</span> </span><span class="WHIT">			</span><span class="NAME">value</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>1543</span> </span><span class="WHIT">			</span><span class="NAME">min</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>1544</span> </span><span class="WHIT">			</span><span class="NAME">max</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">duration</span><span class="PUNC">/</span><span class="NUMB">1000</span><span class="PUNC">,</span><span class="COMM">//1:54:52.66 = 3600+3240+</span><span class="WHIT">
-<span class='line'>1545</span> </span><span class="WHIT">			</span><span class="NAME">step</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">0.1</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>1546</span> </span><span class="WHIT">			</span><span class="NAME">slide</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">event</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">ui</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1547</span> </span><span class="WHIT">				
-<span class='line'>1548</span> 				</span><span class="COMM">//__IriSP.jQuery("#amount").val(ui.value+" s");</span><span class="WHIT">
-<span class='line'>1549</span> </span><span class="WHIT">				</span><span class="COMM">//player.sendEvent('SEEK', ui.value)</span><span class="WHIT">
-<span class='line'>1550</span> </span><span class="WHIT">				</span><span class="NAME">IriSP.MyApiPlayer.seek</span><span class="PUNC">(</span><span class="NAME">ui.value</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1551</span> </span><span class="WHIT">				</span><span class="COMM">//changePageUrlOffset(ui.value);</span><span class="WHIT">
-<span class='line'>1552</span> </span><span class="WHIT">				</span><span class="COMM">//player.sendEvent('PAUSE')</span><span class="WHIT">
-<span class='line'>1553</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1554</span> </span><span class="WHIT">		</span><span class="PUNC">}</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1555</span> </span><span class="WHIT">		
-<span class='line'>1556</span> 		</span><span class="NAME">IriSP.trace</span><span class="PUNC">(</span><span class="STRN">"__IriSP.createInterface"</span><span class="PUNC">,</span><span class="STRN">"ICI"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1557</span> </span><span class="WHIT">		</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#amount"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">val</span><span class="PUNC">(</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#slider-range-min"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">slider</span><span class="PUNC">(</span><span class="STRN">"value"</span><span class="PUNC">)</span><span class="PUNC">+</span><span class="STRN">" s"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1558</span> </span><span class="WHIT">		</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">".Ldt-Control1 button:first"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">button</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1559</span> </span><span class="WHIT">			</span><span class="NAME">icons</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1560</span> </span><span class="WHIT">				</span><span class="NAME">primary</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">'ui-icon-play'</span><span class="WHIT">
-<span class='line'>1561</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>1562</span> </span><span class="WHIT">			</span><span class="NAME">text</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="WHIT">
-<span class='line'>1563</span> </span><span class="WHIT">		</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">next</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">button</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1564</span> </span><span class="WHIT">			</span><span class="NAME">icons</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1565</span> </span><span class="WHIT">				</span><span class="NAME">primary</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">'ui-icon-seek-next'</span><span class="WHIT">
-<span class='line'>1566</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>1567</span> </span><span class="WHIT">			 </span><span class="NAME">text</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="WHIT">
-<span class='line'>1568</span> </span><span class="WHIT">		</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1569</span> </span><span class="WHIT">		</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">".Ldt-Control2 button:first"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">button</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1570</span> </span><span class="WHIT">			</span><span class="NAME">icons</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1571</span> </span><span class="WHIT">				</span><span class="NAME">primary</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">'ui-icon-search'</span><span class="COMM">//,</span><span class="WHIT">
-<span class='line'>1572</span> </span><span class="WHIT">				</span><span class="COMM">//secondary: 'ui-icon-volume-off'</span><span class="WHIT">
-<span class='line'>1573</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>1574</span> </span><span class="WHIT">			</span><span class="NAME">text</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="WHIT">
-<span class='line'>1575</span> </span><span class="WHIT">		</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">next</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">button</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1576</span> </span><span class="WHIT">			</span><span class="NAME">icons</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1577</span> </span><span class="WHIT">				</span><span class="NAME">primary</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">'ui-icon-volume-on'</span><span class="WHIT">
-<span class='line'>1578</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>1579</span> </span><span class="WHIT">			 </span><span class="NAME">text</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="WHIT">
-<span class='line'>1580</span> </span><span class="WHIT">		</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1581</span> 
-<span class='line'>1582</span> </span><span class="WHIT">		</span><span class="COMM">// /!\ PB A MODIFIER </span><span class="WHIT">
-<span class='line'>1583</span> </span><span class="WHIT">		</span><span class="COMM">//__IriSP.MyTags.draw();</span><span class="WHIT">
-<span class='line'>1584</span> </span><span class="WHIT">		</span><span class="NAME">IriSP.trace</span><span class="PUNC">(</span><span class="STRN">"__IriSP.createInterface"</span><span class="PUNC">,</span><span class="STRN">"ICI2"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1585</span> </span><span class="WHIT">		</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"#ldt-CtrlPlay"</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"style"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"background-color:#CD21C24;"</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1586</span> </span><span class="WHIT">		
-<span class='line'>1587</span> 		</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"#Ldt-load-container"</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">hide</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1588</span> </span><span class="WHIT">		
-<span class='line'>1589</span> 		</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">IriSP.config.gui.mode</span><span class="PUNC">==</span><span class="STRN">"radio"</span><span class="WHIT"> </span><span class="PUNC">&</span><span class="WHIT"> </span><span class="NAME">IriSP.jQuery.browser.msie</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1590</span> </span><span class="WHIT">			</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"#Ldtplayer1"</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"height"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"0"</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1591</span> </span><span class="WHIT">		</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1592</span> </span><span class="WHIT">		</span><span class="NAME">IriSP.trace</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"__IriSP.createInterface"</span><span class="WHIT"> </span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"3"</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1593</span> 
-<span class='line'>1594</span> </span><span class="WHIT">		</span><span class="NAME">IriSP.trace</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"__IriSP.createInterface"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"END"</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1595</span> </span><span class="WHIT">		
-<span class='line'>1596</span> 	</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1597</span> </span><span class="COMM">/* the widget classes and definitions */</span><span class="WHIT">
-<span class='line'>1598</span> 
-<span class='line'>1599</span> </span><span class="NAME">IriSP.Widget</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">Popcorn</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">config</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Serializer</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1600</span> 
-<span class='line'>1601</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">config</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">config</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1602</span> </span><span class="WHIT">    </span><span class="NAME">config</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1603</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1604</span> </span><span class="WHIT">  
-<span class='line'>1605</span>   </span><span class="NAME">this._Popcorn</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Popcorn</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1606</span> </span><span class="WHIT">  </span><span class="NAME">this._config</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">config</span><span class="PUNC">;</span><span class="WHIT">  
-<span class='line'>1607</span>   </span><span class="NAME">this._serializer</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Serializer</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1608</span> </span><span class="WHIT">  
-<span class='line'>1609</span>   </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">config.hasOwnProperty</span><span class="PUNC">(</span><span class="STRN">"container"</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1610</span> </span><span class="WHIT">     </span><span class="NAME">this._id</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">config.container</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1611</span> </span><span class="WHIT">     </span><span class="NAME">this.selector</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">this._id</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1612</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1613</span> 
-<span class='line'>1614</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">config.hasOwnProperty</span><span class="PUNC">(</span><span class="STRN">"spacer"</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1615</span> </span><span class="WHIT">     </span><span class="NAME">this._spacerId</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">config.spacer</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1616</span> </span><span class="WHIT">     </span><span class="NAME">this.spacer</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">this._spacerId</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1617</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1618</span> 
-<span class='line'>1619</span> 
-<span class='line'>1620</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">config.hasOwnProperty</span><span class="PUNC">(</span><span class="STRN">"width"</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1621</span> </span><span class="WHIT">     </span><span class="COMM">// this.width and not this._width because we consider it public.</span><span class="WHIT">
-<span class='line'>1622</span> </span><span class="WHIT">     </span><span class="NAME">this.width</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">config.width</span><span class="PUNC">;</span><span class="WHIT">     
-<span class='line'>1623</span>   </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1624</span> </span><span class="WHIT">  
-<span class='line'>1625</span>   </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">config.hasOwnProperty</span><span class="PUNC">(</span><span class="STRN">"height"</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">    
-<span class='line'>1626</span>      </span><span class="NAME">this.height</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">config.height</span><span class="PUNC">;</span><span class="WHIT">     
-<span class='line'>1627</span>   </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1628</span> </span><span class="WHIT">  
-<span class='line'>1629</span>   </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">config.hasOwnProperty</span><span class="PUNC">(</span><span class="STRN">"heightmax"</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1630</span> </span><span class="WHIT">     </span><span class="NAME">this.heightmax</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">config.heightmax</span><span class="PUNC">;</span><span class="WHIT">     
-<span class='line'>1631</span>   </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1632</span> 
-<span class='line'>1633</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">config.hasOwnProperty</span><span class="PUNC">(</span><span class="STRN">"widthmax"</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1634</span> </span><span class="WHIT">     </span><span class="NAME">this.widthmax</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">config.widthmax</span><span class="PUNC">;</span><span class="WHIT">     
-<span class='line'>1635</span>   </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1636</span> </span><span class="WHIT">  
-<span class='line'>1637</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1638</span> 
-<span class='line'>1639</span> </span><span class="NAME">IriSP.Widget.prototype.draw</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1640</span> </span><span class="WHIT">  </span><span class="COMM">/* implemented by "sub-classes" */</span><span class="WHIT">  
-<span class='line'>1641</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1642</span> 
-<span class='line'>1643</span> </span><span class="NAME">IriSP.Widget.prototype.redraw</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1644</span> </span><span class="WHIT">  </span><span class="COMM">/* implemented by "sub-classes" */</span><span class="WHIT">  
-<span class='line'>1645</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1646</span> </span><span class="COMM">/* modules are non-graphical entities, similar to widgets */</span><span class="WHIT">
-<span class='line'>1647</span> 
-<span class='line'>1648</span> </span><span class="NAME">IriSP.Module</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">Popcorn</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">config</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Serializer</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1649</span> 
-<span class='line'>1650</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">config</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">config</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1651</span> </span><span class="WHIT">    </span><span class="NAME">config</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1652</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1653</span> </span><span class="WHIT">  
-<span class='line'>1654</span>   </span><span class="NAME">this._Popcorn</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Popcorn</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1655</span> </span><span class="WHIT">  </span><span class="NAME">this._config</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">config</span><span class="PUNC">;</span><span class="WHIT">  
-<span class='line'>1656</span>   </span><span class="NAME">this._serializer</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Serializer</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1657</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1658</span> </span><span class="COMM">/* layout.js - very basic layout management */</span><span class="WHIT">
-<span class='line'>1659</span> 
-<span class='line'>1660</span> </span><span class="COMM">/*
-<span class='line'>1661</span>   a layout manager manages a div and the layout of objects
-<span class='line'>1662</span>   inside it.
-<span class='line'>1663</span> */</span><span class="WHIT">
-<span class='line'>1664</span> 
-<span class='line'>1665</span> </span><span class="NAME">IriSP.LayoutManager</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">options</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1666</span> </span><span class="WHIT">    </span><span class="NAME">this._Popcorn</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1667</span> </span><span class="WHIT">    </span><span class="NAME">this._widgets</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1668</span> </span><span class="WHIT">    
-<span class='line'>1669</span>     </span><span class="NAME">this._div</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"LdtPlayer"</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1670</span> </span><span class="WHIT">    </span><span class="NAME">this._width</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">640</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1671</span> </span><span class="WHIT">    
-<span class='line'>1672</span>     </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">options</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1673</span> </span><span class="WHIT">      </span><span class="NAME">options</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1674</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1675</span> </span><span class="WHIT">    
-<span class='line'>1676</span>     </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">options.hasOwnProperty</span><span class="PUNC">(</span><span class="STRN">'container'</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1677</span> </span><span class="WHIT">      </span><span class="NAME">this._div</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">options.container</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1678</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1679</span> 
-<span class='line'>1680</span> </span><span class="WHIT">    </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">options.hasOwnProperty</span><span class="PUNC">(</span><span class="STRN">'width'</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1681</span> </span><span class="WHIT">      </span><span class="NAME">this._width</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">options.width</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1682</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT">    
-<span class='line'>1683</span>     
-<span class='line'>1684</span>     </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">options.hasOwnProperty</span><span class="PUNC">(</span><span class="STRN">'height'</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1685</span> </span><span class="WHIT">      </span><span class="NAME">this._height</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">options.height</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1686</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT"> 
-<span class='line'>1687</span>     
-<span class='line'>1688</span>     </span><span class="COMM">/* this is a shortcut */</span><span class="WHIT">
-<span class='line'>1689</span> </span><span class="WHIT">    </span><span class="NAME">this.selector</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">this._div</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1690</span> </span><span class="WHIT">    
-<span class='line'>1691</span>     </span><span class="NAME">this.selector.css</span><span class="PUNC">(</span><span class="STRN">"width"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this._width</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1692</span> </span><span class="WHIT">    
-<span class='line'>1693</span>     </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">this._height</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">)</span><span class="WHIT">
-<span class='line'>1694</span> </span><span class="WHIT">      </span><span class="NAME">this.selector.css</span><span class="PUNC">(</span><span class="STRN">"height"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this._height</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1695</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1696</span> 
-<span class='line'>1697</span> </span><span class="COMM">/* we need this special setter because of a chicken and egg problem :
-<span class='line'>1698</span>    we want the manager to use popcorn but the popcorn div will be managed
-<span class='line'>1699</span>    by the manager. So we need a way to set the instance the manager uses
-<span class='line'>1700</span> */</span><span class="WHIT">
-<span class='line'>1701</span> </span><span class="WHIT">   
-<span class='line'>1702</span> </span><span class="NAME">IriSP.LayoutManager.prototype.setPopcornInstance</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">popcorn</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1703</span> </span><span class="WHIT">    </span><span class="NAME">this._Popcorn</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">popcorn</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1704</span> </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1705</span> 
-<span class='line'>1706</span> </span><span class="COMM">/* stem is a string to append to the id of the widget */</span><span class="WHIT">
-<span class='line'>1707</span> </span><span class="NAME">IriSP.LayoutManager.prototype.createDiv</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">stem</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1708</span> </span><span class="WHIT">    </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">stem</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="PUNC">)</span><span class="WHIT">
-<span class='line'>1709</span> </span><span class="WHIT">       </span><span class="NAME">stem</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1710</span> 
-<span class='line'>1711</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">newDiv</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.guid</span><span class="PUNC">(</span><span class="NAME">this._div</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">"_widget_"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">stem</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">"_"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1712</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">spacerDiv</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.guid</span><span class="PUNC">(</span><span class="STRN">"LdtPlayer_spacer_"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1713</span> </span><span class="WHIT">    </span><span class="NAME">this._widgets.push</span><span class="PUNC">(</span><span class="NAME">newDiv</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1714</span> 
-<span class='line'>1715</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">divTempl</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"&lt;div id='{{id}}' style='width: {{width}}px; position: relative;'>&lt;/div"</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1716</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">spacerTempl</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"&lt;div id='{{spacer_id}}' style='width: {{width}}px; position: relative; height: {{spacer_div_height}};'>&lt;/div"</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1717</span> </span><span class="WHIT">    
-<span class='line'>1718</span>     </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">divCode</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Mustache.to_html</span><span class="PUNC">(</span><span class="NAME">divTempl</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="NAME">id</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">newDiv</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">width</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">this._width</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1719</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">spacerCode</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Mustache.to_html</span><span class="PUNC">(</span><span class="NAME">spacerTempl</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="NAME">spacer_id</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">spacerDiv</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">width</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">this._width</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>1720</span> </span><span class="WHIT">                                                    </span><span class="NAME">spacer_div_height</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">IriSP.widgetsDefaults.LayoutManager.spacer_div_height</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1721</span> 
-<span class='line'>1722</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.append</span><span class="PUNC">(</span><span class="NAME">divCode</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1723</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.append</span><span class="PUNC">(</span><span class="NAME">spacerCode</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1724</span> 
-<span class='line'>1725</span> </span><span class="WHIT">    </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="NAME">newDiv</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">spacerDiv</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1726</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1727</span> </span><span class="COMM">/* init.js - initialization and configuration of Popcorn and the widgets
-<span class='line'>1728</span> exemple json configuration:
-<span class='line'>1729</span>  
-<span class='line'>1730</span>  */</span><span class="WHIT">
-<span class='line'>1731</span> 
-<span class='line'>1732</span> </span><span class="NAME">IriSP.setupDataLoader</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1733</span> </span><span class="WHIT">  </span><span class="COMM">/* we set it up separately because we need to
-<span class='line'>1734</span>      get data at the very beginning, for instance when
-<span class='line'>1735</span>      setting up the video */</span><span class="WHIT">
-<span class='line'>1736</span> </span><span class="WHIT">  </span><span class="NAME">IriSP.__dataloader</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">IriSP.DataLoader</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1737</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1738</span> 
-<span class='line'>1739</span> </span><span class="NAME">IriSP.configurePopcorn</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">layoutManager</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">options</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1740</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">pop</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1741</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">ret</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">layoutManager.createDiv</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> 
-<span class='line'>1742</span>     </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">containerDiv</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">ret</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1743</span> </span><span class="WHIT">    
-<span class='line'>1744</span>     </span><span class="KEYW">switch</span><span class="PUNC">(</span><span class="NAME">options.type</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1745</span> </span><span class="WHIT">      </span><span class="COMM">/*
-<span class='line'>1746</span>         todo : dynamically create the div/video tag which
-<span class='line'>1747</span>         will contain the video.
-<span class='line'>1748</span>       */</span><span class="WHIT">
-<span class='line'>1749</span> </span><span class="WHIT">      </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">"html5"</span><span class="PUNC">:</span><span class="WHIT">
-<span class='line'>1750</span> </span><span class="WHIT">           </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">tmpId</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Popcorn.guid</span><span class="PUNC">(</span><span class="STRN">"video"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> 
-<span class='line'>1751</span>            </span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">containerDiv</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">append</span><span class="PUNC">(</span><span class="STRN">"&lt;video src='"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">options.file</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">"' id='"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">tmpId</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">"'>&lt;/video>"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1752</span> 
-<span class='line'>1753</span> </span><span class="WHIT">           </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">options.hasOwnProperty</span><span class="PUNC">(</span><span class="STRN">"width"</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
-<span class='line'>1754</span> </span><span class="WHIT">             </span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">containerDiv</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">css</span><span class="PUNC">(</span><span class="STRN">"width"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">options.width</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1755</span> </span><span class="WHIT">           
-<span class='line'>1756</span>            </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">options.hasOwnProperty</span><span class="PUNC">(</span><span class="STRN">"height"</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
-<span class='line'>1757</span> </span><span class="WHIT">             </span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">containerDiv</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">css</span><span class="PUNC">(</span><span class="STRN">"height"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">options.height</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1758</span> 
-<span class='line'>1759</span> </span><span class="WHIT">           </span><span class="NAME">pop</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Popcorn</span><span class="PUNC">(</span><span class="STRN">"#"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">tmpId</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1760</span> </span><span class="WHIT">        </span><span class="KEYW">break</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1761</span> </span><span class="WHIT">        
-<span class='line'>1762</span>       </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">"jwplayer"</span><span class="PUNC">:</span><span class="WHIT">
-<span class='line'>1763</span> </span><span class="WHIT">          </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">opts</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.jQuery.extend</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">options</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1764</span> </span><span class="WHIT">          </span><span class="KEYW">delete</span><span class="WHIT"> </span><span class="NAME">opts.container</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1765</span> 
-<span class='line'>1766</span> </span><span class="WHIT">          </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">options.provider</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">"rtmp"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1767</span> </span><span class="WHIT">            </span><span class="COMM">/* exit if we can't access the metadata */</span><span class="WHIT">
-<span class='line'>1768</span> </span><span class="WHIT">            </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">IriSP.__jsonMetadata</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1769</span> </span><span class="WHIT">                </span><span class="KEYW">break</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1770</span> </span><span class="WHIT">            </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1771</span> 
-<span class='line'>1772</span> 
-<span class='line'>1773</span> </span><span class="WHIT">            </span><span class="COMM">// the json format is totally illogical</span><span class="WHIT">
-<span class='line'>1774</span> </span><span class="WHIT">            </span><span class="NAME">opts.streamer</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.__jsonMetadata</span><span class="PUNC">[</span><span class="STRN">"medias"</span><span class="PUNC">]</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">[</span><span class="STRN">"meta"</span><span class="PUNC">]</span><span class="PUNC">[</span><span class="STRN">"item"</span><span class="PUNC">]</span><span class="PUNC">[</span><span class="STRN">"value"</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1775</span> </span><span class="WHIT">            </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">source</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.__jsonMetadata</span><span class="PUNC">[</span><span class="STRN">"medias"</span><span class="PUNC">]</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">[</span><span class="STRN">"href"</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1776</span> 
-<span class='line'>1777</span> </span><span class="WHIT">            </span><span class="COMM">// the source if a full url but jwplayer wants an url relative to the</span><span class="WHIT">
-<span class='line'>1778</span> </span><span class="WHIT">            </span><span class="COMM">// streamer url, so we've got to remove the common part.</span><span class="WHIT">
-<span class='line'>1779</span> </span><span class="WHIT">            </span><span class="NAME">opts.file</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">source.slice</span><span class="PUNC">(</span><span class="NAME">opts.streamer.length</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1780</span> </span><span class="WHIT">          </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1781</span> </span><span class="WHIT">            </span><span class="COMM">/* other providers type, video for instance -
-<span class='line'>1782</span>                pass everything as is */</span><span class="WHIT">
-<span class='line'>1783</span> </span><span class="WHIT">          </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1784</span> 
-<span class='line'>1785</span> </span><span class="WHIT">          </span><span class="NAME">pop</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.PopcornReplacement.jwplayer</span><span class="PUNC">(</span><span class="STRN">"#"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">containerDiv</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">opts</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1786</span> </span><span class="WHIT">        </span><span class="KEYW">break</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1787</span> </span><span class="WHIT">      
-<span class='line'>1788</span>       </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">"youtube"</span><span class="PUNC">:</span><span class="WHIT">
-<span class='line'>1789</span> </span><span class="WHIT">          </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">opts</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.jQuery.extend</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">options</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1790</span> </span><span class="WHIT">          </span><span class="KEYW">delete</span><span class="WHIT"> </span><span class="NAME">opts.container</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1791</span> </span><span class="WHIT">          </span><span class="NAME">opts.controls</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1792</span> </span><span class="WHIT">          </span><span class="NAME">opts.autostart</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1793</span> </span><span class="WHIT">          </span><span class="NAME">templ</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"width: {{width}}px; height: {{height}}px;"</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1794</span> </span><span class="WHIT">          </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">str</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Mustache.to_html</span><span class="PUNC">(</span><span class="NAME">templ</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="NAME">width</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">opts.width</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">height</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">opts.height</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">    
-<span class='line'>1795</span>           </span><span class="COMM">// Popcorn.youtube wants us to specify the size of the player in the style attribute of its container div.</span><span class="WHIT">
-<span class='line'>1796</span> </span><span class="WHIT">          </span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">containerDiv</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="STRN">"style"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">str</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1797</span> </span><span class="WHIT">          
-<span class='line'>1798</span>           </span><span class="NAME">pop</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Popcorn.youtube</span><span class="PUNC">(</span><span class="STRN">"#"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">containerDiv</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">opts.video</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">opts</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1799</span> </span><span class="WHIT">        </span><span class="KEYW">break</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1800</span> </span><span class="WHIT">        
-<span class='line'>1801</span>       </span><span class="KEYW">default</span><span class="PUNC">:</span><span class="WHIT">
-<span class='line'>1802</span> </span><span class="WHIT">        </span><span class="NAME">pop</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1803</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1804</span> </span><span class="WHIT">    
-<span class='line'>1805</span>     </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">pop</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1806</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1807</span> 
-<span class='line'>1808</span> </span><span class="NAME">IriSP.configureWidgets</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">popcornInstance</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">layoutManager</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">guiOptions</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1809</span> </span><span class="WHIT"> 
-<span class='line'>1810</span>   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">serialFactory</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">IriSP.SerializerFactory</span><span class="PUNC">(</span><span class="NAME">IriSP.__dataloader</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1811</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">params</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="NAME">width</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">guiOptions.width</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">height</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">guiOptions.height</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1812</span> 
-<span class='line'>1813</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">ret_widgets</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1814</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">index</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1815</span> </span><span class="WHIT">  
-<span class='line'>1816</span>   </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">index</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">index</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">guiOptions.widgets.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">index</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">    
-<span class='line'>1817</span>     </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">widgetConfig</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">guiOptions.widgets</span><span class="PUNC">[</span><span class="NAME">index</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1818</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">widget</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.instantiateWidget</span><span class="PUNC">(</span><span class="NAME">popcornInstance</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">serialFactory</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">layoutManager</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">widgetConfig</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1819</span> </span><span class="WHIT">    </span><span class="NAME">ret_widgets.push</span><span class="PUNC">(</span><span class="NAME">widget</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1820</span> </span><span class="WHIT">   
-<span class='line'>1821</span>   </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1822</span> 
-<span class='line'>1823</span> </span><span class="WHIT">  </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">ret_widgets</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1824</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1825</span> 
-<span class='line'>1826</span> </span><span class="NAME">IriSP.configureModules</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">popcornInstance</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">modulesList</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1827</span> </span><span class="WHIT"> 
-<span class='line'>1828</span>   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">serialFactory</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">IriSP.SerializerFactory</span><span class="PUNC">(</span><span class="NAME">IriSP.__dataloader</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1829</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">ret_modules</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1830</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">index</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1831</span> </span><span class="WHIT">  
-<span class='line'>1832</span>   </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">index</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">index</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">modulesList.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">index</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">    
-<span class='line'>1833</span>     </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">moduleConfig</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">modulesList</span><span class="PUNC">[</span><span class="NAME">index</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1834</span> </span><span class="WHIT">    
-<span class='line'>1835</span>     </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">serializer</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">serialFactory.getSerializer</span><span class="PUNC">(</span><span class="NAME">moduleConfig.metadata</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1836</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">module</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">IriSP</span><span class="PUNC">[</span><span class="NAME">moduleConfig.type</span><span class="PUNC">]</span><span class="PUNC">(</span><span class="NAME">popcornInstance</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">moduleConfig</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">serializer</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">    
-<span class='line'>1837</span>     </span><span class="NAME">ret_modules.push</span><span class="PUNC">(</span><span class="NAME">module</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1838</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1839</span> 
-<span class='line'>1840</span> </span><span class="WHIT">  </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">ret_modules</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1841</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1842</span> 
-<span class='line'>1843</span> </span><span class="NAME">IriSP.instantiateWidget</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">popcornInstance</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">serialFactory</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">layoutManager</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">widgetConfig</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1844</span> </span><span class="WHIT">    </span><span class="COMM">/* create div returns us a container for the widget and a spacer */</span><span class="WHIT">
-<span class='line'>1845</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">ret</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">layoutManager.createDiv</span><span class="PUNC">(</span><span class="NAME">widgetConfig.type</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">        
-<span class='line'>1846</span>     </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">container</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">ret</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1847</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">spacer</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">ret</span><span class="PUNC">[</span><span class="NUMB">1</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1848</span> 
-<span class='line'>1849</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">arr</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.jQuery.extend</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">widgetConfig</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1850</span> </span><span class="WHIT">    </span><span class="NAME">arr.container</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">container</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1851</span> </span><span class="WHIT">    </span><span class="NAME">arr.spacer</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">spacer</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1852</span> </span><span class="WHIT">    
-<span class='line'>1853</span>     </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">serializer</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">serialFactory.getSerializer</span><span class="PUNC">(</span><span class="NAME">widgetConfig.metadata</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">    
-<span class='line'>1854</span>     
-<span class='line'>1855</span>     </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">serializer</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="PUNC">)</span><span class="WHIT">   
-<span class='line'>1856</span>       </span><span class="NAME">debugger</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1857</span> </span><span class="WHIT">    
-<span class='line'>1858</span>     </span><span class="COMM">// instantiate the object passed as a string</span><span class="WHIT">
-<span class='line'>1859</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">widget</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">IriSP</span><span class="PUNC">[</span><span class="NAME">widgetConfig.type</span><span class="PUNC">]</span><span class="PUNC">(</span><span class="NAME">popcornInstance</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">arr</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">serializer</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">    
-<span class='line'>1860</span>     
-<span class='line'>1861</span>     </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">widgetConfig.hasOwnProperty</span><span class="PUNC">(</span><span class="STRN">"requires"</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1862</span> </span><span class="WHIT">      </span><span class="COMM">// also create the widgets this one depends on.</span><span class="WHIT">
-<span class='line'>1863</span> </span><span class="WHIT">      </span><span class="COMM">// the dependency widget is available in the parent widget context as</span><span class="WHIT">
-<span class='line'>1864</span> </span><span class="WHIT">      </span><span class="COMM">// this.WidgetName (for instance, this.TipWidget);</span><span class="WHIT">
-<span class='line'>1865</span> </span><span class="WHIT">      
-<span class='line'>1866</span>       </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1867</span> </span><span class="WHIT">      </span><span class="KEYW">for</span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">widgetConfig.requires.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1868</span> </span><span class="WHIT">        </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">widgetName</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">widgetConfig.requires</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">[</span><span class="STRN">"type"</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1869</span> </span><span class="WHIT">        </span><span class="NAME">widget</span><span class="PUNC">[</span><span class="NAME">widgetName</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.instantiateWidget</span><span class="PUNC">(</span><span class="NAME">popcornInstance</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">serialFactory</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">layoutManager</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">widgetConfig.requires</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1870</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1871</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT">       
-<span class='line'>1872</span>      
-<span class='line'>1873</span>     </span><span class="NAME">serializer.sync</span><span class="PUNC">(</span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="NAME">widget</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">this.draw</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1874</span> </span><span class="WHIT">    </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">widget</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1875</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1876</span> </span><span class="COMM">/* mediafragment module */</span><span class="WHIT">
-<span class='line'>1877</span> 
-<span class='line'>1878</span> </span><span class="NAME">IriSP.MediaFragment</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">Popcorn</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">config</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Serializer</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1879</span> </span><span class="WHIT">  </span><span class="NAME">IriSP.Module.call</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Popcorn</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">config</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Serializer</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1880</span> 
-<span class='line'>1881</span> </span><span class="WHIT">  </span><span class="NAME">this.mutex</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">/* a mutex because we access the url from two different functions */</span><span class="WHIT">
-<span class='line'>1882</span> 
-<span class='line'>1883</span> </span><span class="WHIT">  </span><span class="NAME">this._Popcorn.listen</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"loadedmetadata"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.MediaFragment.advanceTime</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1884</span> </span><span class="WHIT">  </span><span class="NAME">this._Popcorn.listen</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"pause"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.MediaFragment.updateTime</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1885</span> </span><span class="WHIT">  </span><span class="NAME">this._Popcorn.listen</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"seeked"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.MediaFragment.updateTime</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1886</span> </span><span class="WHIT">  </span><span class="NAME">this._Popcorn.listen</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"IriSP.PolemicTweet.click"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.MediaFragment.updateAnnotation</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1887</span> </span><span class="WHIT">  </span><span class="NAME">this._Popcorn.listen</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"IriSP.SegmentsWidget.click"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.MediaFragment.updateAnnotation</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1888</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1889</span> 
-<span class='line'>1890</span> </span><span class="NAME">IriSP.MediaFragment.advanceTime</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1891</span> </span><span class="WHIT">             </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">url</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">window.location.href</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1892</span> 
-<span class='line'>1893</span> </span><span class="WHIT">              </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">url.split</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"#"</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">[</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="WHIT"> </span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1894</span> </span><span class="WHIT">                  </span><span class="NAME">pageoffset</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">url.split</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"#"</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">[</span><span class="NUMB">1</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1895</span> 
-<span class='line'>1896</span> </span><span class="WHIT">                  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">pageoffset.substring</span><span class="PUNC">(</span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">2</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">"t="</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1897</span> </span><span class="WHIT">                    </span><span class="COMM">// timecode </span><span class="WHIT">
-<span class='line'>1898</span> </span><span class="WHIT">                    </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">pageoffset.substring</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NUMB">2</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1899</span> </span><span class="WHIT">                    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">offsettime</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">pageoffset.substring</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NUMB">2</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1900</span> </span><span class="WHIT">                    </span><span class="NAME">this._Popcorn.currentTime</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">parseFloat</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">offsettime</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1901</span> </span><span class="WHIT">                    </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1902</span> </span><span class="WHIT">                  </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">pageoffset.substring</span><span class="PUNC">(</span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">2</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">"a="</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1903</span> </span><span class="WHIT">                    </span><span class="COMM">// annotation</span><span class="WHIT">
-<span class='line'>1904</span> </span><span class="WHIT">                    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">annotationId</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">pageoffset.substring</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NUMB">2</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1905</span> 
-<span class='line'>1906</span> </span><span class="WHIT">                    </span><span class="COMM">// there's no better way than that because</span><span class="WHIT">
-<span class='line'>1907</span> </span><span class="WHIT">                    </span><span class="COMM">// of possible race conditions</span><span class="WHIT">
-<span class='line'>1908</span> </span><span class="WHIT">                    </span><span class="NAME">this._serializer.sync</span><span class="PUNC">(</span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1909</span> </span><span class="WHIT">                          </span><span class="NAME">IriSP.MediaFragment.lookupAnnotation.call</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">annotationId</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> 
-<span class='line'>1910</span>                           </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1911</span> </span><span class="WHIT">                  </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1912</span> </span><span class="WHIT">              </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1913</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1914</span> 
-<span class='line'>1915</span> </span><span class="NAME">IriSP.MediaFragment.updateTime</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1916</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">this.mutex</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1917</span> </span><span class="WHIT">    </span><span class="KEYW">return</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1918</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1919</span> 
-<span class='line'>1920</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">history</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">window.history</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1921</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="NAME">history.pushState</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1922</span> </span><span class="WHIT">    </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1923</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1924</span> </span><span class="WHIT">  
-<span class='line'>1925</span>   </span><span class="NAME">splitArr</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">window.location.href.split</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"#"</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="WHIT">
-<span class='line'>1926</span> </span><span class="WHIT">  </span><span class="NAME">history.replaceState</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">splitArr</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">"#t="</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">this._Popcorn.currentTime</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">toFixed</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NUMB">2</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1927</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1928</span> 
-<span class='line'>1929</span> 
-<span class='line'>1930</span> </span><span class="NAME">IriSP.MediaFragment.updateAnnotation</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">annotationId</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1931</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">_this</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">this</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1932</span> </span><span class="WHIT">  </span><span class="NAME">this.mutex</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1933</span> 
-<span class='line'>1934</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">history</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">window.history</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1935</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="NAME">history.pushState</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1936</span> </span><span class="WHIT">    </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1937</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1938</span> </span><span class="WHIT">  
-<span class='line'>1939</span>   </span><span class="NAME">splitArr</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">window.location.href.split</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"#"</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="WHIT">
-<span class='line'>1940</span> </span><span class="WHIT">  </span><span class="NAME">history.replaceState</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">splitArr</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">"#a="</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">annotationId</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1941</span> </span><span class="WHIT"> 
-<span class='line'>1942</span>   </span><span class="NAME">window.setTimeout</span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">_this.mutex</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">50</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1943</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1944</span> 
-<span class='line'>1945</span> </span><span class="COMM">// lookup and seek to the beginning of an annotation</span><span class="WHIT">
-<span class='line'>1946</span> </span><span class="NAME">IriSP.MediaFragment.lookupAnnotation</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">annotationId</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1947</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">annotation</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1948</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">annotations</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._serializer._data.annotations</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1949</span> 
-<span class='line'>1950</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1951</span> </span><span class="WHIT">  </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">annotations.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1952</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">annotations</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">id</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">annotationId</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1953</span> </span><span class="WHIT">        </span><span class="NAME">annotation</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">annotations</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1954</span> </span><span class="WHIT">        </span><span class="KEYW">break</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1955</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1956</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1957</span> 
-<span class='line'>1958</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">annotation</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1959</span> </span><span class="WHIT">    </span><span class="NAME">this._Popcorn.currentTime</span><span class="PUNC">(</span><span class="NAME">annotation.begin</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">1000</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1960</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>1961</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1962</span> </span><span class="NAME">IriSP.AnnotationsWidget</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">Popcorn</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">config</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Serializer</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1963</span> </span><span class="WHIT">  </span><span class="NAME">IriSP.Widget.call</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Popcorn</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">config</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Serializer</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1964</span> </span><span class="WHIT">  
-<span class='line'>1965</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1966</span> 
-<span class='line'>1967</span> 
-<span class='line'>1968</span> </span><span class="NAME">IriSP.AnnotationsWidget.prototype</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">IriSP.Widget</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1969</span> 
-<span class='line'>1970</span> </span><span class="NAME">IriSP.AnnotationsWidget.prototype.clear</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>1971</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-SaTitle"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">text</span><span class="PUNC">(</span><span class="STRN">""</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1972</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-SaDescription"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">text</span><span class="PUNC">(</span><span class="STRN">""</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1973</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-SaKeywordText"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">text</span><span class="PUNC">(</span><span class="STRN">""</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1974</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1975</span> 
-<span class='line'>1976</span> </span><span class="NAME">IriSP.AnnotationsWidget.prototype.displayAnnotation</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">annotation</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">   
-<span class='line'>1977</span> 
-<span class='line'>1978</span>     </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">title</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">annotation.content.title</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1979</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">description</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">annotation.content.description</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1980</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">keywords</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">  </span><span class="STRN">""</span><span class="WHIT"> </span><span class="COMM">// FIXME;</span><span class="WHIT">
-<span class='line'>1981</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">begin</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="NAME">annotation.begin</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">1000</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1982</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">end</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="NAME">annotation.end</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">1000</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1983</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">duration</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="NAME">this._serializer.currentMedia</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">meta</span><span class="PUNC">[</span><span class="STRN">"dc:duration"</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1984</span> </span><span class="WHIT">    
-<span class='line'>1985</span>     </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">title_templ</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"{{title}} - ( {{begin}} - {{end}} )"</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1986</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">endstr</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Mustache.to_html</span><span class="PUNC">(</span><span class="NAME">title_templ</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="NAME">title</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">title</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">begin</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">IriSP.secondsToTime</span><span class="PUNC">(</span><span class="NAME">begin</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">end</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">IriSP.secondsToTime</span><span class="PUNC">(</span><span class="NAME">end</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1987</span> 
-<span class='line'>1988</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-SaTitle"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">text</span><span class="PUNC">(</span><span class="NAME">endstr</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1989</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-SaDescription"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">text</span><span class="PUNC">(</span><span class="NAME">description</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1990</span> </span><span class="WHIT">    
-<span class='line'>1991</span>     </span><span class="COMM">// update sharing buttons</span><span class="WHIT">
-<span class='line'>1992</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">defaults</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.widgetsDefaults.AnnotationsWidget</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1993</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">text</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">defaults.share_text</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1994</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">fb_link</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">defaults.fb_link</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1995</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">tw_link</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">defaults.tw_link</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1996</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">gplus_link</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">defaults.gplus_link</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1997</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">url</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">document.location.href</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">"#a="</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">annotation.id</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1998</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-fbShare"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="STRN">"href"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">fb_link</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">IriSP.encodeURI</span><span class="PUNC">(</span><span class="NAME">text</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">IriSP.encodeURI</span><span class="PUNC">(</span><span class="NAME">url</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>1999</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-TwShare"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="STRN">"href"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">tw_link</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">IriSP.encodeURI</span><span class="PUNC">(</span><span class="NAME">text</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">IriSP.encodeURI</span><span class="PUNC">(</span><span class="NAME">url</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2000</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-GplusShare"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="STRN">"href"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">fb_link</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">IriSP.encodeURI</span><span class="PUNC">(</span><span class="NAME">text</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">IriSP.encodeURI</span><span class="PUNC">(</span><span class="NAME">url</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2001</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2002</span> 
-<span class='line'>2003</span> </span><span class="NAME">IriSP.AnnotationsWidget.prototype.clearWidget</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2004</span> 
-<span class='line'>2005</span> </span><span class="WHIT">    
-<span class='line'>2006</span>     </span><span class="COMM">/* retract the pane between two annotations */</span><span class="WHIT">
-<span class='line'>2007</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-SaTitle"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">text</span><span class="PUNC">(</span><span class="STRN">""</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2008</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-SaDescription"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">text</span><span class="PUNC">(</span><span class="STRN">""</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2009</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-SaKeywordText"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">html</span><span class="PUNC">(</span><span class="STRN">""</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2010</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-ShowAnnotation"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">slideUp</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2011</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2012</span> 
-<span class='line'>2013</span> </span><span class="NAME">IriSP.AnnotationsWidget.prototype.draw</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2014</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">_this</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">this</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2015</span> 
-<span class='line'>2016</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">annotationMarkup</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.templToHTML</span><span class="PUNC">(</span><span class="NAME">IriSP.annotationWidget_template</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2017</span> </span><span class="WHIT">	</span><span class="NAME">this.selector.append</span><span class="PUNC">(</span><span class="NAME">annotationMarkup</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2018</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">view</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2019</span> 
-<span class='line'>2020</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">this._serializer._data.views</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">this._serializer._data.views</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">)</span><span class="WHIT">
-<span class='line'>2021</span> </span><span class="WHIT">     </span><span class="NAME">view</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._serializer._data.views</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2022</span> 
-<span class='line'>2023</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">view_type</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2024</span> 
-<span class='line'>2025</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">view</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">view.annotation_types</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">view.annotation_types.length</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2026</span> </span><span class="WHIT">          </span><span class="NAME">view_type</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">view.annotation_types</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2027</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>2028</span> </span><span class="WHIT"> 
-<span class='line'>2029</span>   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">annotations</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._serializer._data.annotations</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2030</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2031</span> </span><span class="WHIT">  
-<span class='line'>2032</span> 	</span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">annotations</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">    
-<span class='line'>2033</span>     </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">annotation</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">annotations</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2034</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">begin</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.round</span><span class="PUNC">(</span><span class="PUNC">(</span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">annotation.begin</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">1000</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2035</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">end</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.round</span><span class="PUNC">(</span><span class="PUNC">(</span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">annotation.end</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">1000</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2036</span> 
-<span class='line'>2037</span> </span><span class="WHIT">    </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">view_type</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="STRN">""</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">annotation.meta</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">annotation.meta</span><span class="PUNC">[</span><span class="STRN">"id-ref"</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT">
-<span class='line'>2038</span> </span><span class="WHIT">          </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">annotation.meta</span><span class="PUNC">[</span><span class="STRN">"id-ref"</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="NAME">view_type</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2039</span> </span><span class="WHIT">        </span><span class="KEYW">continue</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2040</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>2041</span> 
-<span class='line'>2042</span> 
-<span class='line'>2043</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">conf</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="NAME">start</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">begin</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">end</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">end</span><span class="PUNC">,</span><span class="WHIT"> 
-<span class='line'>2044</span>                 </span><span class="NAME">onStart</span><span class="PUNC">:</span><span class="WHIT"> 
-<span class='line'>2045</span>                        </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">annotation</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> 
-<span class='line'>2046</span>                         </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> 
-<span class='line'>2047</span>                             </span><span class="NAME">_this.displayAnnotation</span><span class="PUNC">(</span><span class="NAME">annotation</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> 
-<span class='line'>2048</span>                           
-<span class='line'>2049</span>                         </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">(</span><span class="NAME">annotation</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>2050</span> </span><span class="WHIT">                </span><span class="NAME">onEnd</span><span class="PUNC">:</span><span class="WHIT"> 
-<span class='line'>2051</span>                        </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">_this.clearWidget.call</span><span class="PUNC">(</span><span class="NAME">_this</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>2052</span> </span><span class="WHIT">                </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2053</span> </span><span class="WHIT">    </span><span class="NAME">this._Popcorn</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._Popcorn.code</span><span class="PUNC">(</span><span class="NAME">conf</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">                                             
-<span class='line'>2054</span>   </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>2055</span> 
-<span class='line'>2056</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2057</span> </span><span class="NAME">IriSP.ArrowWidget</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">Popcorn</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">config</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Serializer</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2058</span> </span><span class="WHIT">  </span><span class="NAME">IriSP.Widget.call</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Popcorn</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">config</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Serializer</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2059</span> 
-<span class='line'>2060</span> </span><span class="WHIT">  </span><span class="NAME">this._oldAnnotation</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2061</span> </span><span class="WHIT">  
-<span class='line'>2062</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2063</span> 
-<span class='line'>2064</span> 
-<span class='line'>2065</span> </span><span class="NAME">IriSP.ArrowWidget.prototype</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">IriSP.Widget</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2066</span> 
-<span class='line'>2067</span> </span><span class="NAME">IriSP.ArrowWidget.prototype.clear</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2068</span> 
-<span class='line'>2069</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2070</span> 
-<span class='line'>2071</span> </span><span class="NAME">IriSP.ArrowWidget.prototype.clearWidget</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2072</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2073</span> 
-<span class='line'>2074</span> </span><span class="NAME">IriSP.ArrowWidget.prototype.draw</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2075</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">templ</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Mustache.to_html</span><span class="PUNC">(</span><span class="NAME">IriSP.arrowWidget_template</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2076</span> </span><span class="WHIT">  </span><span class="NAME">this.selector.append</span><span class="PUNC">(</span><span class="NAME">templ</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2077</span> </span><span class="WHIT">  </span><span class="NAME">this._Popcorn.listen</span><span class="PUNC">(</span><span class="STRN">"timeupdate"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.timeUpdateHandler</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2078</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2079</span> 
-<span class='line'>2080</span> </span><span class="NAME">IriSP.ArrowWidget.prototype.timeUpdateHandler</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">percents</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2081</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">currentTime</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._Popcorn.currentTime</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2082</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">currentAnnotation</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._serializer.currentAnnotations</span><span class="PUNC">(</span><span class="NAME">currentTime</span><span class="PUNC">)</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">// FIXME : use the others ?</span><span class="WHIT">
-<span class='line'>2083</span> 
-<span class='line'>2084</span> </span><span class="WHIT">  </span><span class="COMM">/* move the arrow only if the current annotation changes */</span><span class="WHIT">
-<span class='line'>2085</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">currentAnnotation</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="NAME">this._oldAnnotation</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2086</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">begin</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">currentAnnotation.begin</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">1000</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2087</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">end</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">currentAnnotation.end</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">1000</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2088</span> 
-<span class='line'>2089</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">duration</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="NAME">this._serializer.currentMedia</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">meta</span><span class="PUNC">[</span><span class="STRN">"dc:duration"</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">1000</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2090</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">middle_time</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">begin</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">end</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">2</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2091</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">percents</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.floor</span><span class="PUNC">(</span><span class="PUNC">(</span><span class="NAME">middle_time</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NAME">duration</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="NUMB">100</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2092</span> 
-<span class='line'>2093</span> </span><span class="WHIT">    </span><span class="COMM">// we need to apply a fix because the arrow has a certain length</span><span class="WHIT">
-<span class='line'>2094</span> </span><span class="WHIT">    </span><span class="COMM">// it's half the length of the arrow (27 / 2). We need to convert</span><span class="WHIT">
-<span class='line'>2095</span> </span><span class="WHIT">    </span><span class="COMM">// it in percents though.</span><span class="WHIT">
-<span class='line'>2096</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">totalWidth</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.selector.width</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2097</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">correction</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">(</span><span class="NUMB">27</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">2</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NAME">totalWidth</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="NUMB">100</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2098</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">corrected_percents</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">percents</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">correction</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2099</span> 
-<span class='line'>2100</span> </span><span class="WHIT">    </span><span class="COMM">/* don't move out of the screen */</span><span class="WHIT">
-<span class='line'>2101</span> </span><span class="WHIT">    </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">corrected_percents</span><span class="WHIT"> </span><span class="PUNC">&lt;=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT">
-<span class='line'>2102</span> </span><span class="WHIT">      </span><span class="NAME">corrected_percents</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2103</span> 
-<span class='line'>2104</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.children</span><span class="PUNC">(</span><span class="STRN">".Ldt-arrowWidget"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">animate</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="STRN">"left"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">corrected_percents</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">"%"</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2105</span> 
-<span class='line'>2106</span> </span><span class="WHIT">    </span><span class="NAME">this._oldAnnotation</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">currentAnnotation</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2107</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>2108</span> </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>2109</span> </span><span class="NAME">IriSP.PlayerWidget</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">Popcorn</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">config</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Serializer</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2110</span> </span><span class="WHIT">  </span><span class="NAME">IriSP.Widget.call</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Popcorn</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">config</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Serializer</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2111</span> </span><span class="WHIT">  
-<span class='line'>2112</span>   </span><span class="NAME">this._searchBlockOpen</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2113</span> </span><span class="WHIT">  </span><span class="NAME">this._searchLastValue</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2114</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2115</span> 
-<span class='line'>2116</span> </span><span class="NAME">IriSP.PlayerWidget.prototype</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">IriSP.Widget</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2117</span> 
-<span class='line'>2118</span> </span><span class="NAME">IriSP.PlayerWidget.prototype.draw</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2119</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">self</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">this</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2120</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">width</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.width</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2121</span> </span><span class="WHIT">	</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">height</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.height</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2122</span> </span><span class="WHIT">	</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">heightS</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.height</span><span class="PUNC">-</span><span class="NUMB">20</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2123</span> </span><span class="WHIT">	  
-<span class='line'>2124</span> 	</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">Player_templ</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Mustache.to_html</span><span class="PUNC">(</span><span class="NAME">IriSP.player_template</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="STRN">"share_template"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">IriSP.share_template</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2125</span> </span><span class="WHIT">  </span><span class="NAME">this.selector.append</span><span class="PUNC">(</span><span class="NAME">Player_templ</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">		
-<span class='line'>2126</span> 	
-<span class='line'>2127</span>   </span><span class="NAME">this.selector.children</span><span class="PUNC">(</span><span class="STRN">".Ldt-controler"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">show</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2128</span> </span><span class="WHIT">    
-<span class='line'>2129</span>   </span><span class="COMM">// handle clicks by the user on the video.</span><span class="WHIT">
-<span class='line'>2130</span> </span><span class="WHIT">  </span><span class="NAME">this._Popcorn.listen</span><span class="PUNC">(</span><span class="STRN">"play"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.playButtonUpdater</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2131</span> </span><span class="WHIT">  </span><span class="NAME">this._Popcorn.listen</span><span class="PUNC">(</span><span class="STRN">"pause"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.playButtonUpdater</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2132</span> </span><span class="WHIT">  
-<span class='line'>2133</span>   </span><span class="NAME">this._Popcorn.listen</span><span class="PUNC">(</span><span class="STRN">"volumechange"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.muteButtonUpdater</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2134</span> 
-<span class='line'>2135</span> </span><span class="WHIT">  </span><span class="NAME">this._Popcorn.listen</span><span class="PUNC">(</span><span class="STRN">"timeupdate"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.timeDisplayUpdater</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2136</span> </span><span class="WHIT">  </span><span class="NAME">this._Popcorn.listen</span><span class="PUNC">(</span><span class="STRN">"IriSP.search.matchFound"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.searchMatch</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2137</span> </span><span class="WHIT">  </span><span class="NAME">this._Popcorn.listen</span><span class="PUNC">(</span><span class="STRN">"IriSP.search.noMatchFound"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.searchNoMatch</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2138</span> </span><span class="WHIT">  
-<span class='line'>2139</span>   
-<span class='line'>2140</span>   </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-CtrlPlay"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">click</span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">self.playHandler.call</span><span class="PUNC">(</span><span class="NAME">self</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2141</span> </span><span class="WHIT">  </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-CtrlNext"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">click</span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2142</span> </span><span class="WHIT">  </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-CtrlSearch"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">click</span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">self.searchButtonHandler.call</span><span class="PUNC">(</span><span class="NAME">self</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2143</span> </span><span class="WHIT">  
-<span class='line'>2144</span>   </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">'.Ldt-CtrlSound'</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">click</span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">self.muteHandler.call</span><span class="PUNC">(</span><span class="NAME">self</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2145</span> 
-<span class='line'>2146</span> </span><span class="WHIT">  </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-CtrlPlay"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"style"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"background-color:#CD21C24;"</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2147</span> </span><span class="WHIT">  
-<span class='line'>2148</span>   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">searchButtonPos</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-CtrlSearch"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">position</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2149</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">searchBox</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Mustache.to_html</span><span class="PUNC">(</span><span class="NAME">IriSP.search_template</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="NAME">margin_left</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">searchButtonPos.left</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">"px"</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2150</span> </span><span class="WHIT">  </span><span class="NAME">this.selector.append</span><span class="PUNC">(</span><span class="NAME">searchBox</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2151</span> </span><span class="WHIT">  
-<span class='line'>2152</span>   </span><span class="COMM">// trigger an IriSP.PlayerWidget.MouseOver to the widgets that are interested (i.e : sliderWidget)</span><span class="WHIT">
-<span class='line'>2153</span> </span><span class="WHIT">  </span><span class="NAME">this.selector.hover</span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">self._Popcorn.trigger</span><span class="PUNC">(</span><span class="STRN">"IriSP.PlayerWidget.MouseOver"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT"> 
-<span class='line'>2154</span>                       </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">self._Popcorn.trigger</span><span class="PUNC">(</span><span class="STRN">"IriSP.PlayerWidget.MouseOut"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2155</span> </span><span class="WHIT"> 
-<span class='line'>2156</span>   </span><span class="NAME">this.muteButtonUpdater</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">/* some player - jwplayer notable - save the state of the mute button between sessions */</span><span class="WHIT">
-<span class='line'>2157</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2158</span> 
-<span class='line'>2159</span> </span><span class="COMM">/* Update the elasped time div */</span><span class="WHIT">
-<span class='line'>2160</span> </span><span class="NAME">IriSP.PlayerWidget.prototype.timeDisplayUpdater</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2161</span> </span><span class="WHIT">  
-<span class='line'>2162</span>   </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">this._previousSecond</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">)</span><span class="WHIT">
-<span class='line'>2163</span> </span><span class="WHIT">    </span><span class="NAME">this._previousSecond</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._Popcorn.roundTime</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2164</span> </span><span class="WHIT">  
-<span class='line'>2165</span>   </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2166</span> </span><span class="WHIT">    </span><span class="COMM">/* we're still in the same second, so it's not necessary to update time */</span><span class="WHIT">
-<span class='line'>2167</span> </span><span class="WHIT">    </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">this._Popcorn.roundTime</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="NAME">this._previousSecond</span><span class="PUNC">)</span><span class="WHIT">
-<span class='line'>2168</span> </span><span class="WHIT">      </span><span class="KEYW">return</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2169</span> </span><span class="WHIT">      
-<span class='line'>2170</span>   </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>2171</span> </span><span class="WHIT">  
-<span class='line'>2172</span>   </span><span class="COMM">// we get it at each call because it may change.</span><span class="WHIT">
-<span class='line'>2173</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">duration</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="NAME">this._serializer.currentMedia</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">meta</span><span class="PUNC">[</span><span class="STRN">"dc:duration"</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">1000</span><span class="PUNC">;</span><span class="WHIT"> 
-<span class='line'>2174</span>   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">totalTime</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.secondsToTime</span><span class="PUNC">(</span><span class="NAME">duration</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2175</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">elapsedTime</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.secondsToTime</span><span class="PUNC">(</span><span class="NAME">this._Popcorn.currentTime</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2176</span> </span><span class="WHIT">  
-<span class='line'>2177</span>   </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-ElapsedTime"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">html</span><span class="PUNC">(</span><span class="NAME">elapsedTime.toString</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2178</span> </span><span class="WHIT">  </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-TotalTime"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">html</span><span class="PUNC">(</span><span class="NAME">totalTime.toString</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2179</span> </span><span class="WHIT">  </span><span class="NAME">this._previousSecond</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._Popcorn.roundTime</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2180</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2181</span> 
-<span class='line'>2182</span> </span><span class="COMM">/* update the icon of the button - separate function from playHandler
-<span class='line'>2183</span>    because in some cases (for instance, when the user directly clicks on
-<span class='line'>2184</span>    the jwplayer window) we have to change the icon without playing/pausing
-<span class='line'>2185</span> */</span><span class="WHIT">
-<span class='line'>2186</span> </span><span class="NAME">IriSP.PlayerWidget.prototype.playButtonUpdater</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2187</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">status</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._Popcorn.media.paused</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2188</span> </span><span class="WHIT">  
-<span class='line'>2189</span>   </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">status</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">        
-<span class='line'>2190</span>     </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-CtrlPlay"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="STRN">"title"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"Play"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2191</span> </span><span class="WHIT">   
-<span class='line'>2192</span>     </span><span class="COMM">// we use templToHTML because it has some predefined</span><span class="WHIT">
-<span class='line'>2193</span> </span><span class="WHIT">    </span><span class="COMM">// vars like where to get the images</span><span class="WHIT">
-<span class='line'>2194</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">templ</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.templToHTML</span><span class="PUNC">(</span><span class="STRN">"url({{img_dir}}/play_sprite.png)"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2195</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-CtrlPlay"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">css</span><span class="PUNC">(</span><span class="STRN">"background-image"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">templ</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2196</span> 
-<span class='line'>2197</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2198</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-CtrlPlay"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="STRN">"title"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"Pause"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2199</span> 
-<span class='line'>2200</span> </span><span class="WHIT">    </span><span class="COMM">// we use templToHTML because it has some predefined</span><span class="WHIT">
-<span class='line'>2201</span> </span><span class="WHIT">    </span><span class="COMM">// vars like where to get the images</span><span class="WHIT">
-<span class='line'>2202</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">templ</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.templToHTML</span><span class="PUNC">(</span><span class="STRN">"url({{img_dir}}/pause_sprite.png)"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2203</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-CtrlPlay"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">css</span><span class="PUNC">(</span><span class="STRN">"background-image"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">templ</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2204</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">  
-<span class='line'>2205</span> 
-<span class='line'>2206</span>   </span><span class="KEYW">return</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2207</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2208</span> 
-<span class='line'>2209</span> 
-<span class='line'>2210</span> </span><span class="NAME">IriSP.PlayerWidget.prototype.playHandler</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2211</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">status</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._Popcorn.media.paused</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2212</span> </span><span class="WHIT">  
-<span class='line'>2213</span>   </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">status</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">        
-<span class='line'>2214</span>     </span><span class="NAME">this._Popcorn.play</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">   
-<span class='line'>2215</span>   </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2216</span> </span><span class="WHIT">    </span><span class="NAME">this._Popcorn.pause</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2217</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">  
-<span class='line'>2218</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2219</span> 
-<span class='line'>2220</span> </span><span class="NAME">IriSP.PlayerWidget.prototype.muteHandler</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2221</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">this._Popcorn.muted</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">    
-<span class='line'>2222</span>       </span><span class="NAME">this._Popcorn.mute</span><span class="PUNC">(</span><span class="KEYW">true</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2223</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2224</span> </span><span class="WHIT">      </span><span class="NAME">this._Popcorn.mute</span><span class="PUNC">(</span><span class="KEYW">false</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2225</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>2226</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2227</span> 
-<span class='line'>2228</span> </span><span class="NAME">IriSP.PlayerWidget.prototype.muteButtonUpdater</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2229</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">status</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._Popcorn.media.muted</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2230</span> </span><span class="WHIT">  
-<span class='line'>2231</span>   </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">status</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">        
-<span class='line'>2232</span>     </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-CtrlSound"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="STRN">"title"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"Unmute"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2233</span> </span><span class="WHIT">   
-<span class='line'>2234</span>     </span><span class="COMM">// we use templToHTML because it has some predefined</span><span class="WHIT">
-<span class='line'>2235</span> </span><span class="WHIT">    </span><span class="COMM">// vars like where to get the images</span><span class="WHIT">
-<span class='line'>2236</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">templ</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.templToHTML</span><span class="PUNC">(</span><span class="STRN">"url({{img_dir}}/sound_sprite.png)"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2237</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-CtrlSound"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">css</span><span class="PUNC">(</span><span class="STRN">"background-image"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">templ</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2238</span> 
-<span class='line'>2239</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2240</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-CtrlSound"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="STRN">"title"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"Mute"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2241</span> 
-<span class='line'>2242</span> </span><span class="WHIT">    </span><span class="COMM">// we use templToHTML because it has some predefined</span><span class="WHIT">
-<span class='line'>2243</span> </span><span class="WHIT">    </span><span class="COMM">// vars like where to get the images</span><span class="WHIT">
-<span class='line'>2244</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">templ</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.templToHTML</span><span class="PUNC">(</span><span class="STRN">"url({{img_dir}}/mute_sprite.png)"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2245</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-CtrlSound"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">css</span><span class="PUNC">(</span><span class="STRN">"background-image"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">templ</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2246</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">  
-<span class='line'>2247</span> 
-<span class='line'>2248</span>   </span><span class="KEYW">return</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2249</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2250</span> 
-<span class='line'>2251</span> 
-<span class='line'>2252</span> </span><span class="NAME">IriSP.PlayerWidget.prototype.searchButtonHandler</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2253</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">self</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">this</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2254</span> 
-<span class='line'>2255</span> </span><span class="WHIT">    </span><span class="COMM">/* show the search field if it is not shown */</span><span class="WHIT">
-<span class='line'>2256</span> </span><span class="WHIT">  	</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">this._searchBlockOpen</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">      
-<span class='line'>2257</span>       </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".LdtSearch"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">show</span><span class="PUNC">(</span><span class="NUMB">100</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2258</span> </span><span class="WHIT">      
-<span class='line'>2259</span>       </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".LdtSearchInput"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">css</span><span class="PUNC">(</span><span class="STRN">'background-color'</span><span class="PUNC">,</span><span class="STRN">'#fff'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2260</span> </span><span class="WHIT">      </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".LdtSearchInput"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">focus</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2261</span> </span><span class="WHIT">      </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".LdtSearchInput"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="STRN">'value'</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this._searchLastValue</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">      
-<span class='line'>2262</span>       </span><span class="NAME">this._Popcorn.trigger</span><span class="PUNC">(</span><span class="STRN">"IriSP.search"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this._searchLastValue</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">// trigger the search to make it more natural.</span><span class="WHIT">
-<span class='line'>2263</span> </span><span class="WHIT">      
-<span class='line'>2264</span>       </span><span class="NAME">this._searchBlockOpen</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">           
-<span class='line'>2265</span>       </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".LdtSearchInput"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">bind</span><span class="PUNC">(</span><span class="STRN">'keyup'</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">self.searchHandler.call</span><span class="PUNC">(</span><span class="NAME">self</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2266</span> </span><span class="WHIT">      
-<span class='line'>2267</span>       </span><span class="COMM">// we need this variable because some widget can find a match in</span><span class="WHIT">
-<span class='line'>2268</span> </span><span class="WHIT">      </span><span class="COMM">// their data while at the same time other's don't. As we want the</span><span class="WHIT">
-<span class='line'>2269</span> </span><span class="WHIT">      </span><span class="COMM">// search field to become green when there's a match, we need a </span><span class="WHIT">
-<span class='line'>2270</span> </span><span class="WHIT">      </span><span class="COMM">// variable to remember that we had one.</span><span class="WHIT">
-<span class='line'>2271</span> </span><span class="WHIT">      </span><span class="NAME">this._positiveMatch</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2272</span> 
-<span class='line'>2273</span> </span><span class="WHIT">      </span><span class="COMM">// tell the world the field is open</span><span class="WHIT">
-<span class='line'>2274</span> </span><span class="WHIT">      </span><span class="NAME">this._Popcorn.trigger</span><span class="PUNC">(</span><span class="STRN">"IriSP.search.open"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2275</span> </span><span class="WHIT">      
-<span class='line'>2276</span> 	</span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2277</span> </span><span class="WHIT">      </span><span class="NAME">this._searchLastValue</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".LdtSearchInput"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="STRN">'value'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2278</span> </span><span class="WHIT">      </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".LdtSearchInput"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="STRN">'value'</span><span class="PUNC">,</span><span class="STRN">''</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2279</span> </span><span class="WHIT">      </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".LdtSearch"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">hide</span><span class="PUNC">(</span><span class="NUMB">100</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2280</span> </span><span class="WHIT">      
-<span class='line'>2281</span>       </span><span class="COMM">// unbind the watcher event.</span><span class="WHIT">
-<span class='line'>2282</span> </span><span class="WHIT">      </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".LdtSearchInput"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">unbind</span><span class="PUNC">(</span><span class="STRN">'keypress set'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2283</span> </span><span class="WHIT">      </span><span class="NAME">this._searchBlockOpen</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2284</span> 
-<span class='line'>2285</span> </span><span class="WHIT">      </span><span class="NAME">this._positiveMatch</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2286</span> </span><span class="WHIT">      
-<span class='line'>2287</span>       </span><span class="NAME">this._Popcorn.trigger</span><span class="PUNC">(</span><span class="STRN">"IriSP.search.closed"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2288</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>2289</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2290</span> 
-<span class='line'>2291</span> </span><span class="COMM">/* this handler is called whenever the content of the search
-<span class='line'>2292</span>    field changes */</span><span class="WHIT">
-<span class='line'>2293</span> </span><span class="NAME">IriSP.PlayerWidget.prototype.searchHandler</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2294</span> </span><span class="WHIT">  </span><span class="NAME">this._searchLastValue</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".LdtSearchInput"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="STRN">'value'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2295</span> </span><span class="WHIT">  </span><span class="NAME">this._positiveMatch</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2296</span> </span><span class="WHIT">  
-<span class='line'>2297</span>   </span><span class="COMM">// do nothing if the search field is empty, instead of highlighting everything.</span><span class="WHIT">
-<span class='line'>2298</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">this._searchLastValue</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2299</span> </span><span class="WHIT">    </span><span class="NAME">this._Popcorn.trigger</span><span class="PUNC">(</span><span class="STRN">"IriSP.search.cleared"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2300</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".LdtSearchInput"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">css</span><span class="PUNC">(</span><span class="STRN">'background-color'</span><span class="PUNC">,</span><span class="STRN">''</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2301</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2302</span> </span><span class="WHIT">    </span><span class="NAME">this._Popcorn.trigger</span><span class="PUNC">(</span><span class="STRN">"IriSP.search"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this._searchLastValue</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2303</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>2304</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2305</span> 
-<span class='line'>2306</span> </span><span class="COMM">/*
-<span class='line'>2307</span>   handler for the IriSP.search.found message, which is sent by some views when they
-<span class='line'>2308</span>   highlight a match.
-<span class='line'>2309</span> */</span><span class="WHIT">
-<span class='line'>2310</span> </span><span class="NAME">IriSP.PlayerWidget.prototype.searchMatch</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2311</span> </span><span class="WHIT">  </span><span class="NAME">this._positiveMatch</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2312</span> </span><span class="WHIT">  </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".LdtSearchInput"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">css</span><span class="PUNC">(</span><span class="STRN">'background-color'</span><span class="PUNC">,</span><span class="STRN">'#e1ffe1'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2313</span> </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>2314</span> 
-<span class='line'>2315</span> </span><span class="COMM">/* the same, except that no value could be found */</span><span class="WHIT">
-<span class='line'>2316</span> </span><span class="NAME">IriSP.PlayerWidget.prototype.searchNoMatch</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2317</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">this._positiveMatch</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">)</span><span class="WHIT">
-<span class='line'>2318</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".LdtSearchInput"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">css</span><span class="PUNC">(</span><span class="STRN">'background-color'</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"#d62e3a"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2319</span> </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>2320</span> 
-<span class='line'>2321</span> </span><span class="COMM">/* 
-<span class='line'>2322</span>  *   
-<span class='line'>2323</span>  *  Copyright 2010 Institut de recherche et d'innovation 
-<span class='line'>2324</span>  *  contributor(s) : Samuel Huron 
-<span class='line'>2325</span>  *   
-<span class='line'>2326</span>  *  contact@iri.centrepompidou.fr
-<span class='line'>2327</span>  *  http://www.iri.centrepompidou.fr 
-<span class='line'>2328</span>  *   
-<span class='line'>2329</span>  *  This software is a computer program whose purpose is to show and add annotations on a video .
-<span class='line'>2330</span>  *  This software is governed by the CeCILL-C license under French law and
-<span class='line'>2331</span>  *  abiding by the rules of distribution of free software. You can  use, 
-<span class='line'>2332</span>  *  modify and/ or redistribute the software under the terms of the CeCILL-C
-<span class='line'>2333</span>  *  license as circulated by CEA, CNRS and INRIA at the following URL
-<span class='line'>2334</span>  *  "http://www.cecill.info". 
-<span class='line'>2335</span>  *  
-<span class='line'>2336</span>  *  The fact that you are presently reading this means that you have had
-<span class='line'>2337</span>  *  knowledge of the CeCILL-C license and that you accept its terms.
-<span class='line'>2338</span> */</span><span class="WHIT">
-<span class='line'>2339</span> </span><span class="COMM">// CHART TIMELINE / VERSION PROTOTYPE  ::</span><span class="WHIT">
-<span class='line'>2340</span> 
-<span class='line'>2341</span> </span><span class="NAME">IriSP.PolemicWidget</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">Popcorn</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">config</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Serializer</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2342</span> </span><span class="WHIT">  </span><span class="NAME">IriSP.Widget.call</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Popcorn</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">config</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Serializer</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2343</span> </span><span class="WHIT"> 
-<span class='line'>2344</span>   </span><span class="NAME">this.userPol</span><span class="WHIT">    </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">Array</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2345</span> </span><span class="WHIT">  </span><span class="NAME">this.userNoPol</span><span class="WHIT">  </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">Array</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2346</span> </span><span class="WHIT">  </span><span class="NAME">this.userst</span><span class="WHIT">      </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">Array</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2347</span> </span><span class="WHIT">  </span><span class="NAME">this.numberOfTweet</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2348</span> </span><span class="WHIT">  </span><span class="NAME">this.Users</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2349</span> </span><span class="WHIT">  </span><span class="NAME">this.TweetPolemic</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2350</span> </span><span class="WHIT">  </span><span class="NAME">this.yMax</span><span class="WHIT">        </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.height</span><span class="PUNC">;</span><span class="WHIT"> 
-<span class='line'>2351</span>   </span><span class="NAME">this.PaperSlider</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2352</span> </span><span class="WHIT">  </span><span class="NAME">this.heightOfChart</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2353</span> </span><span class="WHIT">  </span><span class="NAME">this.tweets</span><span class="WHIT">  </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">Array</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2354</span> </span><span class="WHIT">  </span><span class="NAME">this.svgElements</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2355</span> </span><span class="WHIT">  
-<span class='line'>2356</span>   </span><span class="COMM">// Make and define the Raphael area</span><span class="WHIT">
-<span class='line'>2357</span> </span><span class="WHIT">  </span><span class="NAME">this.paper</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Raphael</span><span class="PUNC">(</span><span class="NAME">document.getElementById</span><span class="PUNC">(</span><span class="NAME">this._id</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">config.width</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">config.height</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2358</span> </span><span class="WHIT">  
-<span class='line'>2359</span>   </span><span class="NAME">this.oldSearchMatches</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2360</span> 
-<span class='line'>2361</span> </span><span class="WHIT">  </span><span class="COMM">// event handlers</span><span class="WHIT">
-<span class='line'>2362</span> </span><span class="WHIT">  </span><span class="NAME">this._Popcorn.listen</span><span class="PUNC">(</span><span class="STRN">"IriSP.search"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">searchString</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">this.searchHandler</span><span class="PUNC">(</span><span class="NAME">searchString</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2363</span> </span><span class="WHIT">  </span><span class="NAME">this._Popcorn.listen</span><span class="PUNC">(</span><span class="STRN">"IriSP.search.closed"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.searchFieldClosedHandler</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2364</span> </span><span class="WHIT">  </span><span class="NAME">this._Popcorn.listen</span><span class="PUNC">(</span><span class="STRN">"IriSP.search.cleared"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.searchFieldClearedHandler</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2365</span> 
-<span class='line'>2366</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2367</span> 
-<span class='line'>2368</span> </span><span class="NAME">IriSP.PolemicWidget.prototype</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">IriSP.Widget</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2369</span> </span><span class="WHIT">  
-<span class='line'>2370</span> </span><span class="NAME">IriSP.PolemicWidget.prototype.draw</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2371</span> </span><span class="WHIT">  
-<span class='line'>2372</span>     </span><span class="COMM">// variable </span><span class="WHIT">
-<span class='line'>2373</span> </span><span class="WHIT">    </span><span class="COMM">// yMax</span><span class="WHIT">
-<span class='line'>2374</span> </span><span class="WHIT">    
-<span class='line'>2375</span>     </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">self</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">this</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2376</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">yCoef</span><span class="WHIT">        </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">2</span><span class="PUNC">;</span><span class="WHIT">             </span><span class="COMM">// coef for height of 1 tweet </span><span class="WHIT">
-<span class='line'>2377</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">frameSize</span><span class="WHIT">     </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">5</span><span class="PUNC">;</span><span class="WHIT">             </span><span class="COMM">// frame size </span><span class="WHIT">
-<span class='line'>2378</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">margin</span><span class="WHIT">         </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">            </span><span class="COMM">// marge between frame</span><span class="WHIT">
-<span class='line'>2379</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">lineSize</span><span class="WHIT">      </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.width</span><span class="PUNC">;</span><span class="WHIT">        </span><span class="COMM">// timeline pixel width </span><span class="WHIT">
-<span class='line'>2380</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">nbrframes</span><span class="WHIT">     </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">lineSize</span><span class="PUNC">/</span><span class="NAME">frameSize</span><span class="PUNC">;</span><span class="WHIT">     </span><span class="COMM">// frame numbers</span><span class="WHIT">
-<span class='line'>2381</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">numberOfTweet</span><span class="WHIT">   </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">            </span><span class="COMM">// number of tweet overide later </span><span class="WHIT">
-<span class='line'>2382</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">duration</span><span class="WHIT">      </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="NAME">this._serializer.currentMedia</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">meta</span><span class="PUNC">[</span><span class="STRN">"dc:duration"</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">      </span><span class="COMM">// timescale width </span><span class="WHIT">
-<span class='line'>2383</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">frameLength</span><span class="WHIT">   </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">lineSize</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NAME">frameSize</span><span class="PUNC">;</span><span class="WHIT">    </span><span class="COMM">// frame timescale  </span><span class="WHIT">
-<span class='line'>2384</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">timeline</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2385</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">colors</span><span class="WHIT">  </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">Array</span><span class="PUNC">(</span><span class="STRN">""</span><span class="PUNC">,</span><span class="STRN">"#1D973D"</span><span class="PUNC">,</span><span class="STRN">"#C5A62D"</span><span class="PUNC">,</span><span class="STRN">"#CE0A15"</span><span class="PUNC">,</span><span class="STRN">"#036AAE"</span><span class="PUNC">,</span><span class="STRN">"#585858"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2386</span> </span><span class="WHIT">    
-<span class='line'>2387</span>     </span><span class="COMM">// array </span><span class="WHIT">
-<span class='line'>2388</span> </span><span class="WHIT">    </span><span class="COMM">//var tweets  = new Array();</span><span class="WHIT">
-<span class='line'>2389</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">element</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">Array</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2390</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">cluster</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">Array</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2391</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">frames</span><span class="WHIT">  </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">Array</span><span class="PUNC">(</span><span class="NAME">frameLength</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2392</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">slices</span><span class="WHIT">  </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">Array</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2393</span> </span><span class="WHIT">    
-<span class='line'>2394</span>     
-<span class='line'>2395</span>     </span><span class="COMM">// Classes =======================================================================</span><span class="WHIT">
-<span class='line'>2396</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">Frames</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2397</span> </span><span class="WHIT">      
-<span class='line'>2398</span>       </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">Myclusters</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2399</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">x</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2400</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">y</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2401</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">width</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2402</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">height</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2403</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2404</span> </span><span class="WHIT">    </span><span class="NAME">Frames</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">json</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2405</span> </span><span class="WHIT">      </span><span class="COMM">// make my clusters</span><span class="WHIT">
-<span class='line'>2406</span> </span><span class="WHIT">      </span><span class="COMM">// ou Frame vide </span><span class="WHIT">
-<span class='line'>2407</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2408</span> </span><span class="WHIT">    </span><span class="NAME">Frames.prototype.draw</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2409</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2410</span> </span><span class="WHIT">    </span><span class="NAME">Frames.prototype.zoom</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2411</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2412</span> </span><span class="WHIT">    </span><span class="NAME">Frames.prototype.inside</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2413</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2414</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">Clusters</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2415</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">Object</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2416</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">yDist</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2417</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">x</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2418</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">y</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2419</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">width</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2420</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">height</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2421</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2422</span> </span><span class="WHIT">    </span><span class="NAME">Clusters</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">json</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2423</span> </span><span class="WHIT">      </span><span class="COMM">// make my object</span><span class="WHIT">
-<span class='line'>2424</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2425</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">Tweet</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2426</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2427</span> </span><span class="WHIT">    </span><span class="COMM">// Classes =======================================================================</span><span class="WHIT">
-<span class='line'>2428</span> 
-<span class='line'>2429</span> </span><span class="WHIT">    </span><span class="COMM">// Refactoring (parametere) ************************************************************</span><span class="WHIT">
-<span class='line'>2430</span> </span><span class="WHIT">    </span><span class="COMM">// color translastion</span><span class="WHIT">
-<span class='line'>2431</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">qTweet_0</span><span class="WHIT">  </span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2432</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">qTweet_Q</span><span class="WHIT">  </span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2433</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">qTweet_REF</span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2434</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">qTweet_OK</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2435</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">qTweet_KO</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2436</span> </span><span class="WHIT">    </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">colorTranslation</span><span class="PUNC">(</span><span class="NAME">value</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2437</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">value</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">"Q"</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2438</span> </span><span class="WHIT">        </span><span class="NAME">qTweet_Q</span><span class="PUNC">+</span><span class="PUNC">=</span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2439</span> </span><span class="WHIT">        </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NUMB">2</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2440</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">value</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="STRN">"REF"</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2441</span> </span><span class="WHIT">        </span><span class="NAME">qTweet_REF</span><span class="PUNC">+</span><span class="PUNC">=</span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2442</span> </span><span class="WHIT">        </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NUMB">4</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2443</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">value</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="STRN">"OK"</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2444</span> </span><span class="WHIT">        </span><span class="NAME">qTweet_OK</span><span class="PUNC">+</span><span class="PUNC">=</span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2445</span> </span><span class="WHIT">        </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2446</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">value</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="STRN">"KO"</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2447</span> </span><span class="WHIT">        </span><span class="NAME">qTweet_KO</span><span class="PUNC">+</span><span class="PUNC">=</span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2448</span> </span><span class="WHIT">        </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NUMB">3</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2449</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">value</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="STRN">""</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2450</span> </span><span class="WHIT">        </span><span class="NAME">qTweet_0</span><span class="PUNC">+</span><span class="PUNC">=</span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2451</span> </span><span class="WHIT">        </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NUMB">5</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2452</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>2453</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>2454</span> </span><span class="WHIT">    
-<span class='line'>2455</span> 
-<span class='line'>2456</span>       </span><span class="NAME">this._serializer.sync</span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">data</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">loaded_callback.call</span><span class="PUNC">(</span><span class="NAME">self</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">data</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2457</span> </span><span class="WHIT">      
-<span class='line'>2458</span>       </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">loaded_callback</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">json</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2459</span> 
-<span class='line'>2460</span> </span><span class="WHIT">        </span><span class="COMM">// get current view (the first ???)</span><span class="WHIT">
-<span class='line'>2461</span> </span><span class="WHIT">        </span><span class="NAME">view</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">json.views</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2462</span> </span><span class="WHIT">        
-<span class='line'>2463</span>         </span><span class="COMM">// the tweets are by definition of the second annotation type FIXME ?</span><span class="WHIT">
-<span class='line'>2464</span> </span><span class="WHIT">        </span><span class="NAME">tweet_annot_type</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2465</span> </span><span class="WHIT">        </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">view.annotation_types</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">view.annotation_types.length</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2466</span> </span><span class="WHIT">          </span><span class="NAME">tweet_annot_type</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">view.annotation_types</span><span class="PUNC">[</span><span class="NUMB">1</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2467</span> </span><span class="WHIT">        </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>2468</span> </span><span class="WHIT">      
-<span class='line'>2469</span>       </span><span class="KEYW">for</span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">json.annotations.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2470</span> </span><span class="WHIT">        </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">item</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">json.annotations</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">        
-<span class='line'>2471</span>         </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">MyTime</span><span class="WHIT">  </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.floor</span><span class="PUNC">(</span><span class="NAME">item.begin</span><span class="PUNC">/</span><span class="NAME">duration</span><span class="PUNC">*</span><span class="NAME">lineSize</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2472</span> </span><span class="WHIT">        </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">Myframe</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.floor</span><span class="PUNC">(</span><span class="NAME">MyTime</span><span class="PUNC">/</span><span class="NAME">lineSize</span><span class="PUNC">*</span><span class="NAME">frameLength</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2473</span> 
-<span class='line'>2474</span> </span><span class="WHIT">        </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">item.meta</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT"> 
-<span class='line'>2475</span>           </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">item.meta</span><span class="PUNC">[</span><span class="STRN">"id-ref"</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT">
-<span class='line'>2476</span> </span><span class="WHIT">          </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">item.meta</span><span class="PUNC">[</span><span class="STRN">"id-ref"</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">tweet_annot_type</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2477</span> </span><span class="WHIT">            
-<span class='line'>2478</span>           </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">MyTJson</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">JSON.parse</span><span class="PUNC">(</span><span class="NAME">item.meta</span><span class="PUNC">[</span><span class="STRN">'dc:source'</span><span class="PUNC">]</span><span class="PUNC">[</span><span class="STRN">'content'</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2479</span> </span><span class="WHIT">          
-<span class='line'>2480</span>             </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">item.content</span><span class="PUNC">[</span><span class="STRN">'polemics'</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="WHIT"> 
-<span class='line'>2481</span>             </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">item.content</span><span class="PUNC">[</span><span class="STRN">'polemics'</span><span class="PUNC">]</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2482</span> </span><span class="WHIT">            
-<span class='line'>2483</span>               </span><span class="COMM">// a tweet can have many polemics at the same time.</span><span class="WHIT">
-<span class='line'>2484</span> </span><span class="WHIT">              </span><span class="KEYW">for</span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">j</span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">j</span><span class="PUNC">&lt;</span><span class="NAME">item.content</span><span class="PUNC">[</span><span class="STRN">'polemics'</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">j</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2485</span> </span><span class="WHIT">                  
-<span class='line'>2486</span>                   </span><span class="NAME">this.tweets</span><span class="PUNC">[</span><span class="NAME">numberOfTweet</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2487</span> </span><span class="WHIT">                        </span><span class="NAME">id</span><span class="PUNC">:</span><span class="NAME">i</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>2488</span> </span><span class="WHIT">                        </span><span class="NAME">qualification</span><span class="PUNC">:</span><span class="NAME">colorTranslation</span><span class="PUNC">(</span><span class="NAME">item.content</span><span class="PUNC">[</span><span class="STRN">'polemics'</span><span class="PUNC">]</span><span class="PUNC">[</span><span class="NAME">j</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>2489</span> </span><span class="WHIT">                        </span><span class="NAME">yIndicator</span><span class="PUNC">:</span><span class="NAME">MyTime</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>2490</span> </span><span class="WHIT">                        </span><span class="NAME">yframe</span><span class="PUNC">:</span><span class="NAME">Myframe</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>2491</span> </span><span class="WHIT">                        </span><span class="NAME">title</span><span class="PUNC">:</span><span class="NAME">item.content</span><span class="PUNC">[</span><span class="STRN">'title'</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>2492</span> </span><span class="WHIT">                        </span><span class="NAME">timeframe</span><span class="PUNC">:</span><span class="NAME">item.begin</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>2493</span> </span><span class="WHIT">                        </span><span class="NAME">userId</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">MyTJson.id</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>2494</span> </span><span class="WHIT">                        </span><span class="NAME">userScreenName</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">MyTJson.screen_name</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>2495</span> </span><span class="WHIT">                        </span><span class="NAME">tsource</span><span class="PUNC">:</span><span class="NAME">MyTJson</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>2496</span> </span><span class="WHIT">                        </span><span class="NAME">cinecast_id</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">item.id</span><span class="WHIT">
-<span class='line'>2497</span> </span><span class="WHIT">                        </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2498</span> </span><span class="WHIT">                  </span><span class="NAME">numberOfTweet</span><span class="PUNC">+</span><span class="PUNC">=</span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2499</span> </span><span class="WHIT">                  
-<span class='line'>2500</span>               </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>2501</span> </span><span class="WHIT">          </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>2502</span> </span><span class="WHIT">          </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2503</span> </span><span class="WHIT">            </span><span class="NAME">this.tweets</span><span class="PUNC">[</span><span class="NAME">numberOfTweet</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2504</span> </span><span class="WHIT">                  </span><span class="NAME">id</span><span class="PUNC">:</span><span class="NAME">i</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>2505</span> </span><span class="WHIT">                  </span><span class="NAME">qualification</span><span class="PUNC">:</span><span class="NAME">colorTranslation</span><span class="PUNC">(</span><span class="STRN">""</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>2506</span> </span><span class="WHIT">                  </span><span class="NAME">yIndicator</span><span class="PUNC">:</span><span class="NAME">MyTime</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>2507</span> </span><span class="WHIT">                  </span><span class="NAME">yframe</span><span class="PUNC">:</span><span class="NAME">Myframe</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>2508</span> </span><span class="WHIT">                  </span><span class="NAME">title</span><span class="PUNC">:</span><span class="NAME">item.content</span><span class="PUNC">[</span><span class="STRN">'title'</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>2509</span> </span><span class="WHIT">                  </span><span class="NAME">timeframe</span><span class="PUNC">:</span><span class="NAME">item.begin</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>2510</span> </span><span class="WHIT">                  </span><span class="NAME">userId</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">MyTJson.id</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>2511</span> </span><span class="WHIT">                  </span><span class="NAME">userScreenName</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">MyTJson.screen_name</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>2512</span> </span><span class="WHIT">                  </span><span class="NAME">tsource</span><span class="PUNC">:</span><span class="NAME">MyTJson</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>2513</span> </span><span class="WHIT">                  </span><span class="NAME">cinecast_id</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">item.id</span><span class="WHIT">
-<span class='line'>2514</span> </span><span class="WHIT">            </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2515</span> </span><span class="WHIT">            </span><span class="NAME">numberOfTweet</span><span class="PUNC">+</span><span class="PUNC">=</span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2516</span> </span><span class="WHIT">          </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>2517</span> </span><span class="WHIT">          
-<span class='line'>2518</span>         </span><span class="PUNC">}</span><span class="WHIT"> 
-<span class='line'>2519</span>       </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">  
-<span class='line'>2520</span>       
-<span class='line'>2521</span>        </span><span class="NAME">DrawTweets.call</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">// FIXME: ugly.</span><span class="WHIT">
-<span class='line'>2522</span> </span><span class="WHIT">       
-<span class='line'>2523</span>       </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">      
-<span class='line'>2524</span> 
-<span class='line'>2525</span>     </span><span class="COMM">// tweet Drawing (in raphael) </span><span class="WHIT">
-<span class='line'>2526</span> </span><span class="WHIT">    </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">DrawTweets</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2527</span> </span><span class="WHIT">    </span><span class="COMM">// GROUPES TWEET ============================================</span><span class="WHIT">
-<span class='line'>2528</span> </span><span class="WHIT">    </span><span class="COMM">// Count nbr of cluster and tweet in a frame an save int in "frames"</span><span class="WHIT">
-<span class='line'>2529</span> </span><span class="WHIT">      </span><span class="NAME">numberOfTweet</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.tweets.length</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2530</span> </span><span class="WHIT">      </span><span class="KEYW">for</span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">&lt;</span><span class="NAME">nbrframes</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">  
-<span class='line'>2531</span>         </span><span class="KEYW">for</span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">j</span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">j</span><span class="PUNC">&lt;</span><span class="NAME">numberOfTweet</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">j</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">  
-<span class='line'>2532</span>         
-<span class='line'>2533</span>           </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="PUNC">==</span><span class="NAME">this.tweets</span><span class="PUNC">[</span><span class="NAME">j</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">yframe</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2534</span> </span><span class="WHIT">            
-<span class='line'>2535</span>             </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">k</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.tweets</span><span class="PUNC">[</span><span class="NAME">j</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">qualification</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2536</span> </span><span class="WHIT">            
-<span class='line'>2537</span>             </span><span class="COMM">// make array for frame cluster</span><span class="WHIT">
-<span class='line'>2538</span> </span><span class="WHIT">            </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">frames</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">==</span><span class="NAME">undefined</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2539</span> </span><span class="WHIT">              </span><span class="NAME">frames</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="NAME">id</span><span class="PUNC">:</span><span class="NAME">i</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>2540</span> </span><span class="WHIT">                     </span><span class="NAME">qualifVol</span><span class="PUNC">:</span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">Array</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>2541</span> </span><span class="WHIT">                     </span><span class="NAME">mytweetsID</span><span class="PUNC">:</span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">Array</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT">
-<span class='line'>2542</span> </span><span class="WHIT">                    </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2543</span> </span><span class="WHIT">            </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>2544</span> </span><span class="WHIT">            </span><span class="COMM">// add my tweet to frame</span><span class="WHIT">
-<span class='line'>2545</span> </span><span class="WHIT">            </span><span class="NAME">frames</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">mytweetsID.push</span><span class="PUNC">(</span><span class="NAME">this.tweets</span><span class="PUNC">[</span><span class="NAME">j</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2546</span> </span><span class="WHIT">            
-<span class='line'>2547</span>             </span><span class="COMM">// count opinion by frame</span><span class="WHIT">
-<span class='line'>2548</span> </span><span class="WHIT">            </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">frames</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">qualifVol</span><span class="PUNC">[</span><span class="NAME">k</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2549</span> </span><span class="WHIT">              </span><span class="NAME">frames</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">qualifVol</span><span class="PUNC">[</span><span class="NAME">k</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2550</span> </span><span class="WHIT">            </span><span class="PUNC">}</span><span class="KEYW">else</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2551</span> </span><span class="WHIT">              </span><span class="NAME">frames</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">qualifVol</span><span class="PUNC">[</span><span class="NAME">k</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2552</span> </span><span class="WHIT">            </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>2553</span> </span><span class="WHIT">            
-<span class='line'>2554</span>           </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>2555</span> </span><span class="WHIT">        </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>2556</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>2557</span> </span><span class="WHIT">    
-<span class='line'>2558</span>     </span><span class="COMM">// GROUPES TWEET ============================================    </span><span class="WHIT">
-<span class='line'>2559</span> </span><span class="WHIT">    </span><span class="COMM">// max of tweet by Frame </span><span class="WHIT">
-<span class='line'>2560</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">max</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> 
-<span class='line'>2561</span>       </span><span class="KEYW">for</span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">nbrframes</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2562</span> </span><span class="WHIT">        </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">moy</span><span class="WHIT">  </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2563</span> </span><span class="WHIT">        </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">j</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">j</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NUMB">6</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">j</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">    
-<span class='line'>2564</span>           </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">frames</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2565</span> </span><span class="WHIT">            </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">frames</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">qualifVol</span><span class="PUNC">[</span><span class="NAME">j</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2566</span> </span><span class="WHIT">              </span><span class="NAME">moy</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">frames</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">qualifVol</span><span class="PUNC">[</span><span class="NAME">j</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2567</span> </span><span class="WHIT">            </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>2568</span> </span><span class="WHIT">          </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>2569</span> </span><span class="WHIT">        </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>2570</span> </span><span class="WHIT">        
-<span class='line'>2571</span>         </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">moy</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NAME">max</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2572</span> </span><span class="WHIT">          </span><span class="NAME">max</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">moy</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2573</span> </span><span class="WHIT">        </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>2574</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>2575</span> </span><span class="WHIT">    
-<span class='line'>2576</span>       </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">tweetDrawed</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">Array</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2577</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">TweetHeight</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">5</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2578</span> </span><span class="WHIT">      
-<span class='line'>2579</span>       </span><span class="COMM">// DRAW  TWEETS ============================================</span><span class="WHIT">
-<span class='line'>2580</span> </span><span class="WHIT">      </span><span class="KEYW">for</span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">nbrframes</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2581</span> </span><span class="WHIT">        </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">addEheight</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">5</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2582</span> </span><span class="WHIT">        </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">frames</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">                
-<span class='line'>2583</span>           </span><span class="COMM">// by type </span><span class="WHIT">
-<span class='line'>2584</span> </span><span class="WHIT">          
-<span class='line'>2585</span>           </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">j</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">6</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">j</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="PUNC">-</span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">j</span><span class="PUNC">--</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2586</span> </span><span class="WHIT">            </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">frames</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">qualifVol</span><span class="PUNC">[</span><span class="NAME">j</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2587</span> </span><span class="WHIT">              </span><span class="COMM">// show tweet by type </span><span class="WHIT">
-<span class='line'>2588</span> </span><span class="WHIT">              </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">k</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">k</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">frames</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">mytweetsID.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">k</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2589</span> </span><span class="WHIT">              
-<span class='line'>2590</span>                 </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">frames</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">mytweetsID</span><span class="PUNC">[</span><span class="NAME">k</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">qualification</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="NAME">j</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">                
-<span class='line'>2591</span>                   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">x</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="NAME">frameSize</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2592</span> </span><span class="WHIT">                  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">y</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.heightmax</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">addEheight</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2593</span> </span><span class="WHIT">                  
-<span class='line'>2594</span>                   </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">this.yMax</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NAME">y</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2595</span> </span><span class="WHIT">                    </span><span class="NAME">this.yMax</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">y</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2596</span> </span><span class="WHIT">                  </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>2597</span> </span><span class="WHIT">                  
-<span class='line'>2598</span>                   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">e</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.paper.rect</span><span class="PUNC">(</span><span class="NAME">x</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">y</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">frameSize</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">margin</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">TweetHeight</span><span class="WHIT"> </span><span class="COMM">/* height */</span><span class="PUNC">)</span><span class="WHIT">
-<span class='line'>2599</span> </span><span class="WHIT">                                    </span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="NAME">stroke</span><span class="PUNC">:</span><span class="STRN">"#00"</span><span class="PUNC">,</span><span class="STRN">"stroke-width"</span><span class="PUNC">:</span><span class="NUMB">0.1</span><span class="PUNC">,</span><span class="WHIT">  </span><span class="NAME">fill</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">colors</span><span class="PUNC">[</span><span class="NAME">j</span><span class="PUNC">]</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">  
-<span class='line'>2600</span>                   
-<span class='line'>2601</span>                   </span><span class="NAME">addEheight</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">TweetHeight</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2602</span> </span><span class="WHIT">                  
-<span class='line'>2603</span>                   </span><span class="NAME">e.color</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">colors</span><span class="PUNC">[</span><span class="NAME">j</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2604</span> </span><span class="WHIT">                  </span><span class="NAME">e.time</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">frames</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">mytweetsID</span><span class="PUNC">[</span><span class="NAME">k</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">timeframe</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2605</span> </span><span class="WHIT">                  </span><span class="NAME">e.title</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">frames</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">mytweetsID</span><span class="PUNC">[</span><span class="NAME">k</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">title</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2606</span> </span><span class="WHIT">                  </span><span class="NAME">e.id</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">frames</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">mytweetsID</span><span class="PUNC">[</span><span class="NAME">k</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">cinecast_id</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2607</span> 
-<span class='line'>2608</span> </span><span class="WHIT">                  </span><span class="NAME">this.svgElements</span><span class="PUNC">[</span><span class="NAME">e.id</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2609</span> 
-<span class='line'>2610</span> </span><span class="WHIT">                  </span><span class="COMM">/*
-<span class='line'>2611</span>                   e.mouseover(function(element) { return function (event) {
-<span class='line'>2612</span>                         // event.clientX and event.clientY are to raphael what event.pageX and pageY are to jquery.                        
-<span class='line'>2613</span>                         self.TooltipWidget.show.call(self.TooltipWidget, element.title, element.attr("fill"), event.clientX - 106, event.clientY - 160);
-<span class='line'>2614</span>                         element.displayed = true;
-<span class='line'>2615</span>                   }}(e)).mouseout(function(element) { return function () {                          
-<span class='line'>2616</span>                           self.TooltipWidget.hide.call(self.TooltipWidget);
-<span class='line'>2617</span>                   }}(e)).mousedown(function () {
-<span class='line'>2618</span>                     self._Popcorn.currentTime(this.time/1000);
-<span class='line'>2619</span>                     self._Popcorn.trigger("IriSP.PolemicTweet.click", this.id); 
-<span class='line'>2620</span>                   });
-<span class='line'>2621</span>                   */</span><span class="WHIT">
-<span class='line'>2622</span> </span><span class="WHIT">                  
-<span class='line'>2623</span>                   </span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="NAME">e.node</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">mouseenter</span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">element</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">event</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">                        
-<span class='line'>2624</span>                         </span><span class="COMM">// event.clientX and event.clientY are to raphael what event.pageX and pageY are to jquery.                        </span><span class="WHIT">
-<span class='line'>2625</span> </span><span class="WHIT">                        </span><span class="NAME">self.TooltipWidget.show.call</span><span class="PUNC">(</span><span class="NAME">self.TooltipWidget</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">element.title</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">element.attr</span><span class="PUNC">(</span><span class="STRN">"fill"</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">event.pageX</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NUMB">106</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">event.pageY</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NUMB">160</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2626</span> </span><span class="WHIT">                        </span><span class="NAME">element.displayed</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2627</span> </span><span class="WHIT">                  </span><span class="PUNC">}</span><span class="PUNC">}</span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">mousedown</span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">element</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">                    
-<span class='line'>2628</span>                     </span><span class="NAME">self._Popcorn.currentTime</span><span class="PUNC">(</span><span class="NAME">element.time</span><span class="PUNC">/</span><span class="NUMB">1000</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2629</span> </span><span class="WHIT">                    </span><span class="NAME">self._Popcorn.trigger</span><span class="PUNC">(</span><span class="STRN">"IriSP.PolemicTweet.click"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">element.id</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> 
-<span class='line'>2630</span>                     </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>2631</span> </span><span class="WHIT">                  </span><span class="PUNC">}</span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">                  
-<span class='line'>2632</span>                   
-<span class='line'>2633</span>                   </span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="NAME">e.node</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="STRN">'id'</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'t'</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">k</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2634</span> </span><span class="WHIT">                  </span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="NAME">e.node</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="STRN">'title'</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">frames</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">mytweetsID</span><span class="PUNC">[</span><span class="NAME">k</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">title</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2635</span> </span><span class="WHIT">                  </span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="NAME">e.node</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="STRN">'begin'</span><span class="PUNC">,</span><span class="WHIT">  </span><span class="NAME">frames</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">mytweetsID</span><span class="PUNC">[</span><span class="NAME">k</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">timeframe</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">                  
-<span class='line'>2636</span>                 </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>2637</span> </span><span class="WHIT">              </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>2638</span> </span><span class="WHIT">            </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>2639</span> </span><span class="WHIT">          </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>2640</span> </span><span class="WHIT">        </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>2641</span> 
-<span class='line'>2642</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">    
-<span class='line'>2643</span>       </span><span class="COMM">// DRAW UI :: resize border and bgd      </span><span class="WHIT">
-<span class='line'>2644</span> </span><span class="WHIT">      </span><span class="NAME">this.paperBackground</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.paper.rect</span><span class="PUNC">(</span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.width</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.heightmax</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="NAME">fill</span><span class="PUNC">:</span><span class="STRN">"#F8F8F8"</span><span class="PUNC">,</span><span class="STRN">"stroke-width"</span><span class="PUNC">:</span><span class="NUMB">0.1</span><span class="PUNC">,</span><span class="NAME">opacity</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">  
-<span class='line'>2645</span> 
-<span class='line'>2646</span>       </span><span class="COMM">// outer borders</span><span class="WHIT">
-<span class='line'>2647</span> </span><span class="WHIT">      </span><span class="NAME">this.outerBorders</span><span class="WHIT">   </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2648</span> </span><span class="WHIT">      </span><span class="NAME">this.outerBorders.push</span><span class="PUNC">(</span><span class="NAME">this.paper.rect</span><span class="PUNC">(</span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.height</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.width</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="NAME">fill</span><span class="PUNC">:</span><span class="STRN">"#ababab"</span><span class="PUNC">,</span><span class="NAME">stroke</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"none"</span><span class="PUNC">,</span><span class="NAME">opacity</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">  
-<span class='line'>2649</span>       </span><span class="NAME">this.outerBorders.push</span><span class="PUNC">(</span><span class="NAME">this.paper.rect</span><span class="PUNC">(</span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.width</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="NAME">fill</span><span class="PUNC">:</span><span class="STRN">"#ababab"</span><span class="PUNC">,</span><span class="NAME">stroke</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"none"</span><span class="PUNC">,</span><span class="NAME">opacity</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">  
-<span class='line'>2650</span> 
-<span class='line'>2651</span>       </span><span class="COMM">// inner borders</span><span class="WHIT">
-<span class='line'>2652</span> </span><span class="WHIT">      </span><span class="NAME">this.innerBorders</span><span class="WHIT">   </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2653</span> </span><span class="WHIT">      </span><span class="NAME">this.innerBorders.push</span><span class="PUNC">(</span><span class="NAME">this.paper.rect</span><span class="PUNC">(</span><span class="NUMB">1</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.height</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NUMB">2</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.width</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="NAME">fill</span><span class="PUNC">:</span><span class="STRN">"#efefef"</span><span class="PUNC">,</span><span class="NAME">stroke</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"none"</span><span class="PUNC">,</span><span class="NAME">opacity</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">  
-<span class='line'>2654</span>       </span><span class="NAME">this.innerBorders.push</span><span class="PUNC">(</span><span class="NAME">this.paper.rect</span><span class="PUNC">(</span><span class="NUMB">1</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.width</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="NAME">fill</span><span class="PUNC">:</span><span class="STRN">"#efefef"</span><span class="PUNC">,</span><span class="NAME">stroke</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"none"</span><span class="PUNC">,</span><span class="NAME">opacity</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">  
-<span class='line'>2655</span>       </span><span class="NAME">this.innerBorders.push</span><span class="PUNC">(</span><span class="NAME">this.paper.rect</span><span class="PUNC">(</span><span class="NUMB">1</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.height</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NUMB">2</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="NAME">fill</span><span class="PUNC">:</span><span class="STRN">"#d0d1d1"</span><span class="PUNC">,</span><span class="NAME">stroke</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"none"</span><span class="PUNC">,</span><span class="NAME">opacity</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">0.8</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">  
-<span class='line'>2656</span>       </span><span class="NAME">this.innerBorders.push</span><span class="PUNC">(</span><span class="NAME">this.paper.rect</span><span class="PUNC">(</span><span class="NAME">this.width</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NUMB">2</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.height</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NUMB">2</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="NAME">fill</span><span class="PUNC">:</span><span class="STRN">"#efefef"</span><span class="PUNC">,</span><span class="NAME">stroke</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"none"</span><span class="PUNC">,</span><span class="NAME">opacity</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">  
-<span class='line'>2657</span> 
-<span class='line'>2658</span> 
-<span class='line'>2659</span> 
-<span class='line'>2660</span>       </span><span class="NAME">this.paperSlider</span><span class="WHIT">   </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.paper.rect</span><span class="PUNC">(</span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.heightmax</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="NAME">fill</span><span class="PUNC">:</span><span class="STRN">"#D4D5D5"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">stroke</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"none"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">opacity</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2661</span> </span><span class="WHIT">      
-<span class='line'>2662</span>       </span><span class="COMM">// the small white line displayed over the slider.</span><span class="WHIT">
-<span class='line'>2663</span> </span><span class="WHIT">      </span><span class="NAME">this.sliderTip</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.paper.rect</span><span class="PUNC">(</span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.heightmax</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="NAME">fill</span><span class="PUNC">:</span><span class="STRN">"#fc00ff"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">stroke</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"none"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">opacity</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2664</span> </span><span class="WHIT">      </span><span class="COMM">// decalage </span><span class="WHIT">
-<span class='line'>2665</span> </span><span class="WHIT">      </span><span class="COMM">// tweetSelection = this.paper.rect(-100,-100,5,5).attr({fill:"#fff",stroke: "none",opacity: 1});  </span><span class="WHIT">
-<span class='line'>2666</span> </span><span class="WHIT">      
-<span class='line'>2667</span>       
-<span class='line'>2668</span>       </span><span class="NAME">this.paperSlider.toBack</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2669</span> </span><span class="WHIT">      </span><span class="NAME">this.paperBackground.toBack</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2670</span> </span><span class="WHIT">      </span><span class="NAME">this.sliderTip.toFront</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2671</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>2672</span> </span><span class="WHIT">    
-<span class='line'>2673</span>     </span><span class="NAME">this.selector.mouseleave</span><span class="PUNC">(</span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">self.TooltipWidget.hide.call</span><span class="PUNC">(</span><span class="NAME">self.TooltipWidget</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2674</span> </span><span class="WHIT">    </span><span class="NAME">this._Popcorn.listen</span><span class="PUNC">(</span><span class="STRN">"timeupdate"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.sliderUpdater</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2675</span> </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>2676</span> 
-<span class='line'>2677</span> </span><span class="NAME">IriSP.PolemicWidget.prototype.sliderUpdater</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2678</span> 
-<span class='line'>2679</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">time</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="NAME">this._Popcorn.currentTime</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2680</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">duration</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="NAME">this._serializer.currentMedia</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">meta</span><span class="PUNC">[</span><span class="STRN">"dc:duration"</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2681</span> </span><span class="WHIT">    
-<span class='line'>2682</span>     </span><span class="NAME">this.paperSlider.attr</span><span class="PUNC">(</span><span class="STRN">"width"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">time</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">this.width</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">duration</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">1000</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2683</span> </span><span class="WHIT">        
-<span class='line'>2684</span>     </span><span class="NAME">this.sliderTip.attr</span><span class="PUNC">(</span><span class="STRN">"x"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">time</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">this.width</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">duration</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">1000</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2685</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2686</span> </span><span class="WHIT">    
-<span class='line'>2687</span> </span><span class="NAME">IriSP.PolemicWidget.prototype.searchHandler</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">searchString</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2688</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">searchString</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">)</span><span class="WHIT">
-<span class='line'>2689</span> </span><span class="WHIT">    </span><span class="KEYW">return</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2690</span> 
-<span class='line'>2691</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">matches</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._serializer.searchTweetsOccurences</span><span class="PUNC">(</span><span class="NAME">searchString</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2692</span> 
-<span class='line'>2693</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">IriSP.countProperties</span><span class="PUNC">(</span><span class="NAME">matches</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2694</span> </span><span class="WHIT">    </span><span class="NAME">this._Popcorn.trigger</span><span class="PUNC">(</span><span class="STRN">"IriSP.search.matchFound"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2695</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2696</span> </span><span class="WHIT">    </span><span class="NAME">this._Popcorn.trigger</span><span class="PUNC">(</span><span class="STRN">"IriSP.search.noMatchFound"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2697</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>2698</span> 
-<span class='line'>2699</span> </span><span class="WHIT">  </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">id</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">matches</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2700</span> </span><span class="WHIT">    </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">this.svgElements.hasOwnProperty</span><span class="PUNC">(</span><span class="NAME">id</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2701</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">e</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.svgElements</span><span class="PUNC">[</span><span class="NAME">id</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2702</span> </span><span class="WHIT">      </span><span class="NAME">this.svgElements</span><span class="PUNC">[</span><span class="NAME">id</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="NAME">fill</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"#fc00ff"</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2703</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>2704</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>2705</span> 
-<span class='line'>2706</span> </span><span class="WHIT">  </span><span class="COMM">// clean up the blocks that were in the previous search</span><span class="WHIT">
-<span class='line'>2707</span> </span><span class="WHIT">  </span><span class="COMM">// but who aren't in the current one.</span><span class="WHIT">
-<span class='line'>2708</span> </span><span class="WHIT">  </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">id</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">this.oldSearchMatches</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2709</span> </span><span class="WHIT">    </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">matches.hasOwnProperty</span><span class="PUNC">(</span><span class="NAME">id</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2710</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">e</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.svgElements</span><span class="PUNC">[</span><span class="NAME">id</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2711</span> </span><span class="WHIT">      </span><span class="NAME">e.attr</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="NAME">fill</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">e.color</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2712</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>2713</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>2714</span> </span><span class="WHIT">  
-<span class='line'>2715</span>   </span><span class="NAME">this.oldSearchMatches</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">matches</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2716</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2717</span> 
-<span class='line'>2718</span> </span><span class="NAME">IriSP.PolemicWidget.prototype.searchFieldClearedHandler</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2719</span> </span><span class="WHIT">  </span><span class="COMM">// clean up the blocks that were in the previous search</span><span class="WHIT">
-<span class='line'>2720</span> </span><span class="WHIT">  </span><span class="COMM">// but who aren't in the current one.</span><span class="WHIT">
-<span class='line'>2721</span> </span><span class="WHIT">  </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">id</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">this.oldSearchMatches</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2722</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">e</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.svgElements</span><span class="PUNC">[</span><span class="NAME">id</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2723</span> </span><span class="WHIT">      </span><span class="NAME">e.attr</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="NAME">fill</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">e.color</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2724</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>2725</span> </span><span class="WHIT"> 
-<span class='line'>2726</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2727</span> 
-<span class='line'>2728</span> </span><span class="NAME">IriSP.PolemicWidget.prototype.searchFieldClosedHandler</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2729</span> </span><span class="WHIT">  </span><span class="COMM">// clean up the blocks that were in the previous search</span><span class="WHIT">
-<span class='line'>2730</span> </span><span class="WHIT">  </span><span class="COMM">// but who aren't in the current one.</span><span class="WHIT">
-<span class='line'>2731</span> </span><span class="WHIT">  </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">id</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">this.oldSearchMatches</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2732</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">e</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.svgElements</span><span class="PUNC">[</span><span class="NAME">id</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2733</span> </span><span class="WHIT">      </span><span class="NAME">e.attr</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="NAME">fill</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">e.color</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2734</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>2735</span> </span><span class="WHIT"> 
-<span class='line'>2736</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2737</span> </span><span class="WHIT">   
-<span class='line'>2738</span> </span><span class="NAME">IriSP.SegmentsWidget</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">Popcorn</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">config</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Serializer</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2739</span> 
-<span class='line'>2740</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">self</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">this</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2741</span> </span><span class="WHIT">  </span><span class="NAME">IriSP.Widget.call</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Popcorn</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">config</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Serializer</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2742</span> </span><span class="WHIT">  </span><span class="NAME">this.oldSearchMatches</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2743</span> 
-<span class='line'>2744</span> </span><span class="WHIT">  </span><span class="COMM">// event handlers</span><span class="WHIT">
-<span class='line'>2745</span> </span><span class="WHIT">  </span><span class="NAME">this._Popcorn.listen</span><span class="PUNC">(</span><span class="STRN">"IriSP.search"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">searchString</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">self.searchHandler.call</span><span class="PUNC">(</span><span class="NAME">self</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">searchString</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2746</span> </span><span class="WHIT">  </span><span class="NAME">this._Popcorn.listen</span><span class="PUNC">(</span><span class="STRN">"IriSP.search.closed"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">self.searchFieldClosedHandler.call</span><span class="PUNC">(</span><span class="NAME">self</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2747</span> </span><span class="WHIT">  </span><span class="NAME">this._Popcorn.listen</span><span class="PUNC">(</span><span class="STRN">"IriSP.search.cleared"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">self.searchFieldClearedHandler.call</span><span class="PUNC">(</span><span class="NAME">self</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2748</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2749</span> 
-<span class='line'>2750</span> </span><span class="NAME">IriSP.SegmentsWidget.prototype</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">IriSP.Widget</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2751</span> 
-<span class='line'>2752</span> </span><span class="COMM">/* Get the width of a segment, in pixels. */</span><span class="WHIT">
-<span class='line'>2753</span> </span><span class="NAME">IriSP.SegmentsWidget.prototype.segmentToPixel</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">annotation</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">  
-<span class='line'>2754</span>   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">begin</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.round</span><span class="PUNC">(</span><span class="PUNC">(</span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">annotation.begin</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">1000</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2755</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">end</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.round</span><span class="PUNC">(</span><span class="PUNC">(</span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">annotation.end</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">1000</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">    
-<span class='line'>2756</span>   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">duration</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._serializer.currentMedia</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">meta</span><span class="PUNC">[</span><span class="STRN">"dc:duration"</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">1000</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2757</span> </span><span class="WHIT">  
-<span class='line'>2758</span>   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">startPourcent</span><span class="WHIT"> 	</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.timeToPourcent</span><span class="PUNC">(</span><span class="NAME">begin</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">duration</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2759</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">startPixel</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.floor</span><span class="PUNC">(</span><span class="NAME">this.selector.parent</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">width</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">startPourcent</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">100</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2760</span> </span><span class="WHIT">  
-<span class='line'>2761</span>   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">endPourcent</span><span class="WHIT"> 	</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.floor</span><span class="PUNC">(</span><span class="NAME">IriSP.timeToPourcent</span><span class="PUNC">(</span><span class="NAME">end</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">duration</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">startPourcent</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2762</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">endPixel</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.floor</span><span class="PUNC">(</span><span class="NAME">this.selector.parent</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">width</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">endPourcent</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">100</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2763</span> </span><span class="WHIT">  
-<span class='line'>2764</span>   </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">endPixel</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2765</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2766</span> 
-<span class='line'>2767</span> </span><span class="COMM">/* compute the total length of a group of segments */</span><span class="WHIT">
-<span class='line'>2768</span> </span><span class="NAME">IriSP.SegmentsWidget.prototype.segmentsLength</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">segmentsList</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2769</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">self</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">this</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2770</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">total</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2771</span> </span><span class="WHIT">  
-<span class='line'>2772</span>   </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">segmentsList.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT">
-<span class='line'>2773</span> </span><span class="WHIT">    </span><span class="NAME">total</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">self.segmentToPixel</span><span class="PUNC">(</span><span class="NAME">segmentsList</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">annotation</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2774</span> </span><span class="WHIT">  
-<span class='line'>2775</span>   </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">total</span><span class="PUNC">;</span><span class="WHIT">  
-<span class='line'>2776</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2777</span> 
-<span class='line'>2778</span> </span><span class="NAME">IriSP.SegmentsWidget.prototype.draw</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2779</span> 
-<span class='line'>2780</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">self</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">this</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2781</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">annotations</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._serializer._data.annotations</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2782</span> 
-<span class='line'>2783</span> </span><span class="WHIT">  </span><span class="NAME">this.selector.addClass</span><span class="PUNC">(</span><span class="STRN">"Ldt-SegmentsWidget"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2784</span> </span><span class="WHIT">  </span><span class="NAME">this.selector.append</span><span class="PUNC">(</span><span class="NAME">Mustache.to_html</span><span class="PUNC">(</span><span class="NAME">IriSP.overlay_marker_template</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2785</span> </span><span class="WHIT">          
-<span class='line'>2786</span>   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">view_type</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._serializer.getNonTweetIds</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">    
-<span class='line'>2787</span>   
-<span class='line'>2788</span>   </span><span class="NAME">this.positionMarker</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.selector.children</span><span class="PUNC">(</span><span class="STRN">":first"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2789</span> </span><span class="WHIT">  
-<span class='line'>2790</span>   </span><span class="NAME">this._Popcorn.listen</span><span class="PUNC">(</span><span class="STRN">"timeupdate"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.positionUpdater</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2791</span> </span><span class="WHIT">  
-<span class='line'>2792</span>   
-<span class='line'>2793</span>   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2794</span> </span><span class="WHIT">  
-<span class='line'>2795</span>   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">segments_annotations</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2796</span> </span><span class="WHIT">  
-<span class='line'>2797</span>   </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">annotations.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2798</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">annotation</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">annotations</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2799</span> 
-<span class='line'>2800</span> </span><span class="WHIT">    </span><span class="COMM">/* filter the annotations whose type is not the one we want */</span><span class="WHIT">
-<span class='line'>2801</span> </span><span class="WHIT">    </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">view_type</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="STRN">""</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">annotation.meta</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">annotation.meta</span><span class="PUNC">[</span><span class="STRN">"id-ref"</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT">
-<span class='line'>2802</span> </span><span class="WHIT">          </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">annotation.meta</span><span class="PUNC">[</span><span class="STRN">"id-ref"</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="NAME">view_type</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2803</span> </span><span class="WHIT">        </span><span class="KEYW">continue</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2804</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>2805</span> 
-<span class='line'>2806</span> </span><span class="WHIT">    </span><span class="NAME">segments_annotations.push</span><span class="PUNC">(</span><span class="NAME">annotation</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2807</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>2808</span> </span><span class="WHIT">    
-<span class='line'>2809</span>   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">totalWidth</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.selector.width</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">segments_annotations.length</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2810</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">lastSegment</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.underscore.max</span><span class="PUNC">(</span><span class="NAME">segments_annotations</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">annotation</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">annotation.end</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2811</span> </span><span class="WHIT">  
-<span class='line'>2812</span>   </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">segments_annotations.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2813</span> </span><span class="WHIT">  
-<span class='line'>2814</span>     </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">annotation</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">segments_annotations</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2815</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">begin</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">annotation.begin</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2816</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">end</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">annotation.end</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2817</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">duration</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._serializer.currentMedia</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">meta</span><span class="PUNC">[</span><span class="STRN">"dc:duration"</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2818</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">id</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">annotation.id</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2819</span> </span><span class="WHIT">        
-<span class='line'>2820</span>     </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">startPixel</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.floor</span><span class="PUNC">(</span><span class="NAME">this.selector.parent</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">width</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">begin</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NAME">duration</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2821</span> 
-<span class='line'>2822</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">endPixel</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.floor</span><span class="PUNC">(</span><span class="NAME">this.selector.parent</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">width</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">end</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NAME">duration</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2823</span> </span><span class="WHIT">    
-<span class='line'>2824</span>     </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">annotation.id</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="NAME">lastSegment.id</span><span class="PUNC">)</span><span class="WHIT"> 
-<span class='line'>2825</span>       </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">pxWidth</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">endPixel</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">startPixel</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2826</span> </span><span class="WHIT">    </span><span class="KEYW">else</span><span class="WHIT">
-<span class='line'>2827</span> </span><span class="WHIT">      </span><span class="COMM">/* the last segment has no segment following it */</span><span class="WHIT">
-<span class='line'>2828</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">pxWidth</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">endPixel</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">startPixel</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2829</span> </span><span class="WHIT"> 
-<span class='line'>2830</span>     </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">divTitle</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">annotation.content.title</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">" - "</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">annotation.content.description</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">substr</span><span class="PUNC">(</span><span class="NUMB">0</span><span class="PUNC">,</span><span class="NUMB">55</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2831</span> 
-<span class='line'>2832</span> </span><span class="WHIT">    </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">annotation.content.color</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="PUNC">)</span><span class="WHIT">
-<span class='line'>2833</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">color</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">annotation.content.color</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2834</span> </span><span class="WHIT">    </span><span class="KEYW">else</span><span class="WHIT">
-<span class='line'>2835</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">color</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">annotation.color</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2836</span> </span><span class="WHIT">    
-<span class='line'>2837</span>     </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">hexa_color</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.DEC_HEXA_COLOR</span><span class="PUNC">(</span><span class="NAME">color</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2838</span> 
-<span class='line'>2839</span> </span><span class="WHIT">    </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">hexa_color</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">"FFCC00"</span><span class="PUNC">)</span><span class="WHIT">
-<span class='line'>2840</span> </span><span class="WHIT">      </span><span class="NAME">hexa_color</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"333"</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2841</span> </span><span class="WHIT">    </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">hexa_color.length</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="NUMB">4</span><span class="PUNC">)</span><span class="WHIT">
-<span class='line'>2842</span> </span><span class="WHIT">      </span><span class="NAME">hexa_color</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">hexa_color</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'00'</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2843</span> </span><span class="WHIT">    
-<span class='line'>2844</span>     </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">annotationTemplate</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Mustache.to_html</span><span class="PUNC">(</span><span class="NAME">IriSP.annotation_template</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>2845</span> </span><span class="WHIT">        </span><span class="PUNC">{</span><span class="STRN">"divTitle"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">divTitle</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"id"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">id</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"startPixel"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">startPixel</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>2846</span> </span><span class="WHIT">        </span><span class="STRN">"pxWidth"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">pxWidth</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"hexa_color"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">hexa_color</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>2847</span> </span><span class="WHIT">        </span><span class="STRN">"seekPlace"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">Math.round</span><span class="PUNC">(</span><span class="NAME">begin</span><span class="PUNC">/</span><span class="NUMB">1000</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2848</span> 
-<span class='line'>2849</span> </span><span class="WHIT">        
-<span class='line'>2850</span>     </span><span class="NAME">this.selector.append</span><span class="PUNC">(</span><span class="NAME">annotationTemplate</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2851</span> </span><span class="WHIT">    
-<span class='line'>2852</span>     </span><span class="COMM">/* add a special class to the last segment and change its border */</span><span class="WHIT">
-<span class='line'>2853</span> </span><span class="WHIT">    </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">annotation.id</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">lastSegment.id</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2854</span> </span><span class="WHIT">        </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">"#"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">id</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">addClass</span><span class="PUNC">(</span><span class="STRN">"Ldt-lastSegment"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">        
-<span class='line'>2855</span>         </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-lastSegment"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">css</span><span class="PUNC">(</span><span class="STRN">"border-color"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"#"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">hexa_color</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">        
-<span class='line'>2856</span>     </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>2857</span> 
-<span class='line'>2858</span> </span><span class="WHIT">    </span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">id</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">fadeTo</span><span class="PUNC">(</span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">0.3</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2859</span> 
-<span class='line'>2860</span> </span><span class="WHIT">    </span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">id</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">mouseover</span><span class="PUNC">(</span><span class="WHIT">
-<span class='line'>2861</span> </span><span class="WHIT">    </span><span class="COMM">/* we wrap the handler in another function because js's scoping
-<span class='line'>2862</span>        rules are function-based - otherwise, the internal vars like
-<span class='line'>2863</span>        divTitle are preserved but they are looked-up from the draw
-<span class='line'>2864</span>        method scope, so after that the loop is run, so they're not
-<span class='line'>2865</span>        preserved */</span><span class="WHIT">
-<span class='line'>2866</span> </span><span class="WHIT">    </span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">divTitle</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> 
-<span class='line'>2867</span>      </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">event</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2868</span> </span><span class="WHIT">          </span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">animate</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="NAME">opacity</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">0.6</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">5</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2869</span> </span><span class="WHIT">          </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">offset</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">offset</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2870</span> </span><span class="WHIT">          </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">correction</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">outerWidth</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">2</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2871</span> 
-<span class='line'>2872</span> </span><span class="WHIT">          </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">offset_x</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">offset.left</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">correction</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NUMB">106</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2873</span> </span><span class="WHIT">          </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">offset_x</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT">
-<span class='line'>2874</span> </span><span class="WHIT">            </span><span class="NAME">offset_x</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2875</span> </span><span class="WHIT">                    
-<span class='line'>2876</span>           </span><span class="NAME">self.TooltipWidget.show</span><span class="PUNC">(</span><span class="NAME">divTitle</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">color</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">offset_x</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">event.pageY</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NUMB">160</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2877</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">(</span><span class="NAME">divTitle</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">mouseout</span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2878</span> </span><span class="WHIT">      </span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">animate</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="NAME">opacity</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">0.3</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">5</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2879</span> </span><span class="WHIT">      </span><span class="NAME">self.TooltipWidget.hide</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2880</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2881</span> 
-<span class='line'>2882</span> </span><span class="WHIT">    </span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">id</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">click</span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">_this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">annotation</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2883</span> </span><span class="WHIT">                                    </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">_this.clickHandler</span><span class="PUNC">(</span><span class="NAME">annotation</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2884</span> </span><span class="WHIT">                                 </span><span class="PUNC">}</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">annotation</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2885</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>2886</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2887</span> 
-<span class='line'>2888</span> </span><span class="COMM">/* restores the view after a search */</span><span class="WHIT">
-<span class='line'>2889</span> </span><span class="NAME">IriSP.SegmentsWidget.prototype.clear</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2890</span> </span><span class="WHIT">  </span><span class="NAME">this.selector.children</span><span class="PUNC">(</span><span class="STRN">".Ldt-iri-chapter"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">animate</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="NAME">opacity</span><span class="PUNC">:</span><span class="NUMB">0.3</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">100</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2891</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2892</span> 
-<span class='line'>2893</span> </span><span class="NAME">IriSP.SegmentsWidget.prototype.clickHandler</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">annotation</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2894</span> </span><span class="WHIT">  </span><span class="NAME">this._Popcorn.trigger</span><span class="PUNC">(</span><span class="STRN">"IriSP.SegmentsWidget.click"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">annotation.id</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2895</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">begin</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">annotation.begin</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">1000</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2896</span> </span><span class="WHIT">  </span><span class="NAME">this._Popcorn.currentTime</span><span class="PUNC">(</span><span class="NAME">Math.round</span><span class="PUNC">(</span><span class="NAME">begin</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2897</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2898</span> 
-<span class='line'>2899</span> </span><span class="NAME">IriSP.SegmentsWidget.prototype.searchHandler</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">searchString</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2900</span> 
-<span class='line'>2901</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">searchString</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">)</span><span class="WHIT">
-<span class='line'>2902</span> </span><span class="WHIT">    </span><span class="KEYW">return</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2903</span> 
-<span class='line'>2904</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">matches</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._serializer.searchOccurences</span><span class="PUNC">(</span><span class="NAME">searchString</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2905</span> 
-<span class='line'>2906</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">IriSP.countProperties</span><span class="PUNC">(</span><span class="NAME">matches</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2907</span> </span><span class="WHIT">    </span><span class="NAME">this._Popcorn.trigger</span><span class="PUNC">(</span><span class="STRN">"IriSP.search.matchFound"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2908</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2909</span> </span><span class="WHIT">    </span><span class="NAME">this._Popcorn.trigger</span><span class="PUNC">(</span><span class="STRN">"IriSP.search.noMatchFound"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2910</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>2911</span> 
-<span class='line'>2912</span> </span><span class="WHIT">  </span><span class="COMM">// un-highlight all the blocks</span><span class="WHIT">
-<span class='line'>2913</span> </span><span class="WHIT">  </span><span class="NAME">this.selector.children</span><span class="PUNC">(</span><span class="STRN">".Ldt-iri-chapter"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">css</span><span class="PUNC">(</span><span class="STRN">"opacity"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">0.1</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2914</span> </span><span class="WHIT"> 
-<span class='line'>2915</span>   </span><span class="COMM">// then highlight the ones with matches.</span><span class="WHIT">
-<span class='line'>2916</span> </span><span class="WHIT">  </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">id</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">matches</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2917</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">factor</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0.5</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">matches</span><span class="PUNC">[</span><span class="NAME">id</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="NUMB">0.2</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2918</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">"#"</span><span class="PUNC">+</span><span class="NAME">id</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">dequeue</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2919</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">"#"</span><span class="PUNC">+</span><span class="NAME">id</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">animate</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="NAME">opacity</span><span class="PUNC">:</span><span class="NAME">factor</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">200</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2920</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>2921</span> 
-<span class='line'>2922</span> </span><span class="WHIT"> 
-<span class='line'>2923</span>   </span><span class="NAME">this.oldSearchMatches</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">matches</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2924</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2925</span> 
-<span class='line'>2926</span> </span><span class="NAME">IriSP.SegmentsWidget.prototype.searchFieldClearedHandler</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2927</span> </span><span class="WHIT">  </span><span class="NAME">this.clear</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2928</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2929</span> 
-<span class='line'>2930</span> </span><span class="NAME">IriSP.SegmentsWidget.prototype.searchFieldClosedHandler</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2931</span> </span><span class="WHIT">  </span><span class="NAME">this.clear</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2932</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2933</span> 
-<span class='line'>2934</span> </span><span class="NAME">IriSP.SegmentsWidget.prototype.positionUpdater</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">  
-<span class='line'>2935</span>   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">duration</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._serializer.currentMedia</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">meta</span><span class="PUNC">[</span><span class="STRN">"dc:duration"</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">1000</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2936</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">time</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._Popcorn.currentTime</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2937</span> </span><span class="WHIT">  </span><span class="COMM">//var position 	= ((time / duration) * 100).toFixed(2);</span><span class="WHIT">
-<span class='line'>2938</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">position</span><span class="WHIT"> 	</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">(</span><span class="NAME">time</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NAME">duration</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="NUMB">100</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">toFixed</span><span class="PUNC">(</span><span class="NUMB">2</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2939</span> 
-<span class='line'>2940</span> </span><span class="WHIT">  </span><span class="NAME">this.positionMarker.css</span><span class="PUNC">(</span><span class="STRN">"left"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">position</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">"%"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">  
-<span class='line'>2941</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2942</span> </span><span class="NAME">IriSP.SliderWidget</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">Popcorn</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">config</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Serializer</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2943</span> </span><span class="WHIT">  </span><span class="NAME">IriSP.Widget.call</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Popcorn</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">config</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Serializer</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2944</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2945</span> 
-<span class='line'>2946</span> </span><span class="NAME">IriSP.SliderWidget.prototype</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">IriSP.Widget</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2947</span> 
-<span class='line'>2948</span> </span><span class="NAME">IriSP.SliderWidget.prototype.draw</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2949</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">self</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">this</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2950</span> 
-<span class='line'>2951</span> </span><span class="WHIT">  </span><span class="NAME">this.selector.append</span><span class="PUNC">(</span><span class="NAME">Mustache.to_html</span><span class="PUNC">(</span><span class="NAME">IriSP.sliderWidget_template</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2952</span> </span><span class="WHIT">  </span><span class="NAME">this.selector.addClass</span><span class="PUNC">(</span><span class="STRN">"Ldt-SliderMinimized"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2953</span> 
-<span class='line'>2954</span> </span><span class="WHIT">  </span><span class="NAME">this.sliderBackground</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-sliderBackground"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2955</span> </span><span class="WHIT">  </span><span class="NAME">this.sliderForeground</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-sliderForeground"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2956</span> </span><span class="WHIT">  </span><span class="NAME">this.positionMarker</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-sliderPositionMarker"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2957</span> 
-<span class='line'>2958</span> 
-<span class='line'>2959</span> </span><span class="WHIT">  </span><span class="COMM">// a special variable to stop methods from tinkering</span><span class="WHIT">
-<span class='line'>2960</span> </span><span class="WHIT">  </span><span class="COMM">// with the positionMarker when the user is dragging it</span><span class="WHIT">
-<span class='line'>2961</span> </span><span class="WHIT">  </span><span class="NAME">this.draggingOngoing</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2962</span> 
-<span class='line'>2963</span> </span><span class="WHIT">  </span><span class="COMM">// another special variable used by the timeout handler to</span><span class="WHIT">
-<span class='line'>2964</span> </span><span class="WHIT">  </span><span class="COMM">// open or close the slider.</span><span class="WHIT">
-<span class='line'>2965</span> </span><span class="WHIT">  </span><span class="NAME">this.sliderMaximized</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2966</span> </span><span class="WHIT">  </span><span class="NAME">this.timeOutId</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2967</span> 
-<span class='line'>2968</span> </span><span class="WHIT">  
-<span class='line'>2969</span>   </span><span class="NAME">this.positionMarker.draggable</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="NAME">axis</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"x"</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>2970</span> </span><span class="WHIT">  </span><span class="NAME">start</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.positionMarkerDraggingStartedHandler</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>2971</span> </span><span class="WHIT">  </span><span class="NAME">stop</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.positionMarkerDraggedHandler</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>2972</span> </span><span class="WHIT">  </span><span class="NAME">containment</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"parent"</span><span class="WHIT">
-<span class='line'>2973</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2974</span> </span><span class="WHIT">  </span><span class="NAME">this.positionMarker.css</span><span class="PUNC">(</span><span class="STRN">"position"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"absolute"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2975</span> </span><span class="WHIT">  
-<span class='line'>2976</span>   </span><span class="NAME">this.sliderBackground.click</span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">event</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">self.backgroundClickHandler.call</span><span class="PUNC">(</span><span class="NAME">self</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">event</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2977</span> </span><span class="WHIT">  </span><span class="NAME">this.sliderForeground.click</span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">event</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">self.foregroundClickHandler.call</span><span class="PUNC">(</span><span class="NAME">self</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">event</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2978</span> 
-<span class='line'>2979</span> </span><span class="WHIT">  </span><span class="NAME">this.selector.hover</span><span class="PUNC">(</span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.mouseOverHandler</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.mouseOutHandler</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2980</span> 
-<span class='line'>2981</span> </span><span class="WHIT">  </span><span class="COMM">// update the positions</span><span class="WHIT">
-<span class='line'>2982</span> </span><span class="WHIT">  </span><span class="NAME">this._Popcorn.listen</span><span class="PUNC">(</span><span class="STRN">"timeupdate"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.sliderUpdater</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2983</span> 
-<span class='line'>2984</span> </span><span class="WHIT">  </span><span class="COMM">// special messages :</span><span class="WHIT">
-<span class='line'>2985</span> </span><span class="WHIT">  </span><span class="NAME">this._Popcorn.listen</span><span class="PUNC">(</span><span class="STRN">"IriSP.PlayerWidget.MouseOver"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.mouseOverHandler</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2986</span> </span><span class="WHIT">  </span><span class="NAME">this._Popcorn.listen</span><span class="PUNC">(</span><span class="STRN">"IriSP.PlayerWidget.MouseOut"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.mouseOutHandler</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2987</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2988</span> 
-<span class='line'>2989</span> </span><span class="COMM">/* update the slider and the position marker as time passes */</span><span class="WHIT">
-<span class='line'>2990</span> </span><span class="NAME">IriSP.SliderWidget.prototype.sliderUpdater</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>2991</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">this.draggingOngoing</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">this._disableUpdate</span><span class="PUNC">)</span><span class="WHIT">
-<span class='line'>2992</span> </span><span class="WHIT">    </span><span class="KEYW">return</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2993</span> </span><span class="WHIT">  
-<span class='line'>2994</span>   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">time</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._Popcorn.currentTime</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2995</span> 
-<span class='line'>2996</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">duration</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._serializer.currentMedia</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">meta</span><span class="PUNC">[</span><span class="STRN">"dc:duration"</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">1000</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2997</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">percent</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">(</span><span class="NAME">time</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NAME">duration</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="NUMB">100</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">toFixed</span><span class="PUNC">(</span><span class="NUMB">2</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>2998</span> </span><span class="WHIT">  
-<span class='line'>2999</span>   </span><span class="COMM">/* we do these complicated calculations to center exactly
-<span class='line'>3000</span>      the position Marker */</span><span class="WHIT">
-<span class='line'>3001</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">pixels_to_percents</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">100</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NAME">this.selector.width</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">/* how much is a pixel in percents */</span><span class="WHIT">
-<span class='line'>3002</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">positionMarker_width</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.positionMarker.width</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3003</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">correction</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">pixels_to_percents</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="NAME">positionMarker_width</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">2</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3004</span> 
-<span class='line'>3005</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">newPos</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">percent</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">correction</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3006</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">newPos</span><span class="WHIT"> </span><span class="PUNC">&lt;=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT">
-<span class='line'>3007</span> </span><span class="WHIT">    </span><span class="NAME">newPos</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3008</span> </span><span class="WHIT">  
-<span class='line'>3009</span> 	</span><span class="NAME">this.sliderForeground.css</span><span class="PUNC">(</span><span class="STRN">"width"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">percent</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">"%"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3010</span> </span><span class="WHIT">	</span><span class="NAME">this.positionMarker.css</span><span class="PUNC">(</span><span class="STRN">"left"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">newPos</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">"%"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3011</span> 
-<span class='line'>3012</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3013</span> 
-<span class='line'>3014</span> </span><span class="NAME">IriSP.SliderWidget.prototype.backgroundClickHandler</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">event</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3015</span> </span><span class="WHIT">  </span><span class="COMM">/* this piece of code is a little bit convoluted - here's how it works :
-<span class='line'>3016</span>      we want to handle clicks on the progress bar and convert those to seeks in the media.
-<span class='line'>3017</span>      However, jquery only gives us a global position, and we want a number of pixels relative
-<span class='line'>3018</span>      to our container div, so we get the parent position, and compute an offset to this position,
-<span class='line'>3019</span>      and finally compute the progress ratio in the media.
-<span class='line'>3020</span>      Finally we multiply this ratio with the duration to get the correct time
-<span class='line'>3021</span>   */</span><span class="WHIT">
-<span class='line'>3022</span> 
-<span class='line'>3023</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">parentOffset</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.sliderBackground.parent</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">offset</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3024</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">width</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.sliderBackground.width</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3025</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">relX</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">event.pageX</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">parentOffset.left</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3026</span> 
-<span class='line'>3027</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">duration</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._serializer.currentMedia</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">meta</span><span class="PUNC">[</span><span class="STRN">"dc:duration"</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">1000</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3028</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">newTime</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">(</span><span class="NAME">relX</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NAME">width</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="NAME">duration</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">toFixed</span><span class="PUNC">(</span><span class="NUMB">2</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3029</span> 
-<span class='line'>3030</span> </span><span class="WHIT">  </span><span class="NAME">this._Popcorn.currentTime</span><span class="PUNC">(</span><span class="NAME">newTime</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3031</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3032</span> 
-<span class='line'>3033</span> </span><span class="COMM">/* same function as the previous one, except that it handles clicks
-<span class='line'>3034</span>    on the foreground element */</span><span class="WHIT">
-<span class='line'>3035</span> </span><span class="NAME">IriSP.SliderWidget.prototype.foregroundClickHandler</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">event</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3036</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">parentOffset</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.sliderForeground.parent</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">offset</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3037</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">width</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.sliderBackground.width</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3038</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">relX</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">event.pageX</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">parentOffset.left</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3039</span> 
-<span class='line'>3040</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">duration</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._serializer.currentMedia</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">meta</span><span class="PUNC">[</span><span class="STRN">"dc:duration"</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">1000</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3041</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">newTime</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">(</span><span class="NAME">relX</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NAME">width</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="NAME">duration</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">toFixed</span><span class="PUNC">(</span><span class="NUMB">2</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3042</span> 
-<span class='line'>3043</span> </span><span class="WHIT">  </span><span class="NAME">this._Popcorn.currentTime</span><span class="PUNC">(</span><span class="NAME">newTime</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3044</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3045</span> 
-<span class='line'>3046</span> </span><span class="COMM">/* handles mouse over the slider */</span><span class="WHIT">
-<span class='line'>3047</span> </span><span class="NAME">IriSP.SliderWidget.prototype.mouseOverHandler</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">event</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3048</span> </span><span class="WHIT">  
-<span class='line'>3049</span>   </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">this.timeOutId</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3050</span> </span><span class="WHIT">    </span><span class="NAME">window.clearTimeout</span><span class="PUNC">(</span><span class="NAME">this.timeOutId</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3051</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>3052</span> </span><span class="WHIT"> 
-<span class='line'>3053</span>   </span><span class="NAME">this.sliderMaximized</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3054</span> 
-<span class='line'>3055</span> </span><span class="WHIT">  </span><span class="NAME">this.sliderBackground.animate</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="STRN">"height"</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"9px"</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">100</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3056</span> </span><span class="WHIT">  </span><span class="NAME">this.sliderForeground.animate</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="STRN">"height"</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"9px"</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">100</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3057</span> </span><span class="WHIT">  </span><span class="NAME">this.positionMarker.animate</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="STRN">"height"</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"9px"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"width"</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"9px"</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">100</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3058</span> </span><span class="WHIT">  </span><span class="COMM">//this.positionMarker.css("margin-top", "-4px");</span><span class="WHIT">
-<span class='line'>3059</span> </span><span class="WHIT">  
-<span class='line'>3060</span> </span><span class="COMM">//  this.selector.removeClass("Ldt-SliderMinimized");</span><span class="WHIT">
-<span class='line'>3061</span> </span><span class="COMM">//  this.selector.addClass("Ldt-SliderMaximized");</span><span class="WHIT">
-<span class='line'>3062</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3063</span> 
-<span class='line'>3064</span> </span><span class="COMM">/* handles when the mouse leaves the slider */</span><span class="WHIT">
-<span class='line'>3065</span> </span><span class="NAME">IriSP.SliderWidget.prototype.mouseOutHandler</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">event</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3066</span> 
-<span class='line'>3067</span> </span><span class="WHIT">  </span><span class="NAME">this.timeOutId</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">window.setTimeout</span><span class="PUNC">(</span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.minimizeOnTimeout</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>3068</span> </span><span class="WHIT">                                     </span><span class="NAME">IriSP.widgetsDefaults.SliderWidget.minimize_period</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3069</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3070</span> 
-<span class='line'>3071</span> </span><span class="NAME">IriSP.SliderWidget.prototype.minimizeOnTimeout</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">event</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3072</span> </span><span class="WHIT">  </span><span class="NAME">this.sliderBackground.animate</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="STRN">"height"</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"5px"</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">100</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3073</span> </span><span class="WHIT">  </span><span class="NAME">this.sliderForeground.animate</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="STRN">"height"</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"5px"</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">100</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3074</span> </span><span class="WHIT">  </span><span class="NAME">this.positionMarker.animate</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="STRN">"height"</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"5px"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"width"</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"5px"</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">100</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3075</span> </span><span class="WHIT">  </span><span class="NAME">this.positionMarker.css</span><span class="PUNC">(</span><span class="STRN">"margin-top"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"0px"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3076</span> </span><span class="WHIT">  </span><span class="NAME">this.sliderMinimized</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3077</span> </span><span class="WHIT">  
-<span class='line'>3078</span> </span><span class="COMM">//  this.selector.removeClass("Ldt-SliderMaximized");</span><span class="WHIT">
-<span class='line'>3079</span> </span><span class="COMM">//  this.selector.addClass("Ldt-SliderMinimized");</span><span class="WHIT">
-<span class='line'>3080</span> 
-<span class='line'>3081</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3082</span> 
-<span class='line'>3083</span> </span><span class="COMM">// called when the user starts dragging the position indicator</span><span class="WHIT">
-<span class='line'>3084</span> </span><span class="NAME">IriSP.SliderWidget.prototype.positionMarkerDraggingStartedHandler</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">event</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">ui</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">  
-<span class='line'>3085</span>   </span><span class="NAME">this.draggingOngoing</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3086</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3087</span> 
-<span class='line'>3088</span> </span><span class="NAME">IriSP.SliderWidget.prototype.positionMarkerDraggedHandler</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">event</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">ui</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">   
-<span class='line'>3089</span>   </span><span class="NAME">this._disableUpdate</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">// disable slider position updates while dragging is ongoing.</span><span class="WHIT">
-<span class='line'>3090</span> </span><span class="WHIT">  </span><span class="NAME">window.setTimeout</span><span class="PUNC">(</span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">this._disableUpdate</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">500</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3091</span> 
-<span class='line'>3092</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">parentOffset</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.sliderForeground.parent</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">offset</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3093</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">width</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.sliderBackground.width</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3094</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">relX</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">event.pageX</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">parentOffset.left</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3095</span> 
-<span class='line'>3096</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">duration</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._serializer.currentMedia</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">meta</span><span class="PUNC">[</span><span class="STRN">"dc:duration"</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">1000</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3097</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">newTime</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">(</span><span class="NAME">relX</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NAME">width</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="NAME">duration</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">toFixed</span><span class="PUNC">(</span><span class="NUMB">2</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3098</span> 
-<span class='line'>3099</span> </span><span class="WHIT">  </span><span class="NAME">this._Popcorn.currentTime</span><span class="PUNC">(</span><span class="NAME">newTime</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3100</span> </span><span class="WHIT">  
-<span class='line'>3101</span>   </span><span class="NAME">this.draggingOngoing</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3102</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3103</span> 
-<span class='line'>3104</span> </span><span class="COMM">/* this widget displays a small tooltip */</span><span class="WHIT">
-<span class='line'>3105</span> </span><span class="NAME">IriSP.TooltipWidget</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">Popcorn</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">config</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Serializer</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3106</span> </span><span class="WHIT">  </span><span class="NAME">IriSP.Widget.call</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Popcorn</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">config</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Serializer</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3107</span> </span><span class="WHIT">  </span><span class="NAME">this._shown</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3108</span> </span><span class="WHIT">  </span><span class="NAME">this._displayedText</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3109</span> </span><span class="WHIT">  </span><span class="NAME">this._hideTimeout</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3110</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3111</span> 
-<span class='line'>3112</span> 
-<span class='line'>3113</span> </span><span class="NAME">IriSP.TooltipWidget.prototype</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">IriSP.Widget</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3114</span> 
-<span class='line'>3115</span> </span><span class="NAME">IriSP.TooltipWidget.prototype.draw</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3116</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">templ</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Mustache.to_html</span><span class="PUNC">(</span><span class="NAME">IriSP.tooltipWidget_template</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3117</span> 
-<span class='line'>3118</span> </span><span class="WHIT">  </span><span class="NAME">this.selector.append</span><span class="PUNC">(</span><span class="NAME">templ</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3119</span> </span><span class="WHIT">  </span><span class="NAME">this.hide</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3120</span> 
-<span class='line'>3121</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3122</span> 
-<span class='line'>3123</span> </span><span class="NAME">IriSP.TooltipWidget.prototype.clear</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3124</span> </span><span class="WHIT">	</span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".tiptext"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">text</span><span class="PUNC">(</span><span class="STRN">""</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3125</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3126</span> 
-<span class='line'>3127</span> </span><span class="NAME">IriSP.TooltipWidget.prototype.show</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">text</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">color</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">x</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">y</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3128</span> 
-<span class='line'>3129</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">this._displayedText</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="NAME">text</span><span class="PUNC">)</span><span class="WHIT">
-<span class='line'>3130</span> </span><span class="WHIT">    </span><span class="KEYW">return</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3131</span> </span><span class="WHIT">  
-<span class='line'>3132</span>   </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".tipcolor"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">css</span><span class="PUNC">(</span><span class="STRN">"background-color"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">color</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3133</span> </span><span class="WHIT">  </span><span class="NAME">this._displayedText</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">text</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3134</span> </span><span class="WHIT">	</span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".tiptext"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">text</span><span class="PUNC">(</span><span class="NAME">text</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3135</span> </span><span class="WHIT">  </span><span class="COMM">//this.selector.find(".tip").css("left", x).css("top", y);  </span><span class="WHIT">
-<span class='line'>3136</span> </span><span class="WHIT">  </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".tip"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">css</span><span class="PUNC">(</span><span class="STRN">"left"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">x</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">css</span><span class="PUNC">(</span><span class="STRN">"top"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">y</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3137</span> </span><span class="WHIT">  </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".tip"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">show</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3138</span> </span><span class="WHIT">  </span><span class="NAME">this._shown</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3139</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3140</span> 
-<span class='line'>3141</span> </span><span class="NAME">IriSP.TooltipWidget.prototype.hide</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">                                                   
-<span class='line'>3142</span>   </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".tip"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">hide</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3143</span> </span><span class="WHIT">  </span><span class="NAME">this._shown</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">  
-<span class='line'>3144</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="COMM">/* a widget that displays tweet - used in conjunction with the polemicWidget */</span><span class="WHIT">
-<span class='line'>3145</span> 
-<span class='line'>3146</span> </span><span class="NAME">IriSP.TweetsWidget</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">Popcorn</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">config</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Serializer</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3147</span> </span><span class="WHIT">  </span><span class="NAME">IriSP.Widget.call</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Popcorn</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">config</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Serializer</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3148</span> 
-<span class='line'>3149</span> </span><span class="WHIT">  </span><span class="NAME">this._displayingTweet</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3150</span> </span><span class="WHIT">  </span><span class="NAME">this._timeoutId</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">;</span><span class="WHIT">  
-<span class='line'>3151</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3152</span> 
-<span class='line'>3153</span> 
-<span class='line'>3154</span> </span><span class="NAME">IriSP.TweetsWidget.prototype</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">IriSP.Widget</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3155</span> 
-<span class='line'>3156</span> 
-<span class='line'>3157</span> </span><span class="NAME">IriSP.TweetsWidget.prototype.drawTweet</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">annotation</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3158</span> </span><span class="WHIT">    
-<span class='line'>3159</span>     </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">title</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.formatTweet</span><span class="PUNC">(</span><span class="NAME">annotation.content.title</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3160</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">img</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">annotation.content.img.src</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3161</span> </span><span class="WHIT">    </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">img</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">img</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">""</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">img</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">"None"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3162</span> </span><span class="WHIT">      </span><span class="NAME">img</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.widgetsDefaults.TweetsWidget.default_profile_picture</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3163</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>3164</span> 
-<span class='line'>3165</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">imageMarkup</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.templToHTML</span><span class="PUNC">(</span><span class="STRN">"&lt;img src='{{src}}' alt='user image'>&lt;/img>"</span><span class="PUNC">,</span><span class="WHIT"> 
-<span class='line'>3166</span>                                        </span><span class="PUNC">{</span><span class="NAME">src</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">img</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3167</span> </span><span class="WHIT">    
-<span class='line'>3168</span>     </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">annotation.meta</span><span class="PUNC">[</span><span class="STRN">"dc:source"</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">content</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3169</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">tweetContents</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">JSON.parse</span><span class="PUNC">(</span><span class="NAME">annotation.meta</span><span class="PUNC">[</span><span class="STRN">"dc:source"</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">content</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3170</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">creator</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">tweetContents.user.screen_name</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3171</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">real_name</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">tweetContents.user.name</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3172</span> 
-<span class='line'>3173</span> </span><span class="WHIT">      </span><span class="NAME">imageMarkup</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.templToHTML</span><span class="PUNC">(</span><span class="STRN">"&lt;a href='http://twitter.com/{{creator}}'>&lt;img src='{{src}}' alt='user image'>&lt;/img>&lt;/a>"</span><span class="PUNC">,</span><span class="WHIT"> 
-<span class='line'>3174</span>                                        </span><span class="PUNC">{</span><span class="NAME">src</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">img</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">creator</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">creator</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3175</span> </span><span class="WHIT">            
-<span class='line'>3176</span>       </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">formatted_date</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">Date</span><span class="PUNC">(</span><span class="NAME">tweetContents.created_at</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">toLocaleDateString</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3177</span> </span><span class="WHIT">      </span><span class="NAME">title</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.templToHTML</span><span class="PUNC">(</span><span class="STRN">"&lt;a class='Ldt-tweet_userHandle' href='http://twitter.com/{{creator}}'>@{{creator}}&lt;/a> - "</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> 
-<span class='line'>3178</span>                                 </span><span class="STRN">"&lt;div class='Ldt-tweet_realName'>{{real_name}}&lt;/div>"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT">
-<span class='line'>3179</span> </span><span class="WHIT">                                </span><span class="STRN">"&lt;div class='Ldt-tweet_tweetContents'>{{{ contents }}}&lt;/div>"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT">
-<span class='line'>3180</span> </span><span class="WHIT">                                </span><span class="STRN">"&lt;div class='Ldt-tweet_date'>{{ date }}&lt;/div>"</span><span class="PUNC">,</span><span class="WHIT"> 
-<span class='line'>3181</span>                                 </span><span class="PUNC">{</span><span class="NAME">creator</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">creator</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">real_name</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">real_name</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">contents</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">title</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">date</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">formatted_date</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3182</span> 
-<span class='line'>3183</span> </span><span class="WHIT">      </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-TweetReply"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="STRN">"href"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"http://twitter.com/home?status=@"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">creator</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">":%20"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3184</span> 
-<span class='line'>3185</span> 
-<span class='line'>3186</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">rtText</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Mustache.to_html</span><span class="PUNC">(</span><span class="STRN">"http://twitter.com/home?status=RT @{{creator}}: {{text}}"</span><span class="PUNC">,</span><span class="WHIT">
-<span class='line'>3187</span> </span><span class="WHIT">                                    </span><span class="PUNC">{</span><span class="NAME">creator</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">creator</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">text</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">IriSP.encodeURI</span><span class="PUNC">(</span><span class="NAME">annotation.content.title</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3188</span> </span><span class="WHIT">      </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-Retweet"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="STRN">"href"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">rtText</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3189</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>3190</span> 
-<span class='line'>3191</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-tweetContents"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">html</span><span class="PUNC">(</span><span class="NAME">title</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3192</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-tweetAvatar"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">html</span><span class="PUNC">(</span><span class="NAME">imageMarkup</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3193</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.show</span><span class="PUNC">(</span><span class="STRN">"blind"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">250</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> 
-<span class='line'>3194</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3195</span> 
-<span class='line'>3196</span> </span><span class="NAME">IriSP.TweetsWidget.prototype.displayTweet</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">annotation</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3197</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">this._displayingTweet</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3198</span> </span><span class="WHIT">    </span><span class="NAME">this._displayingTweet</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3199</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3200</span> </span><span class="WHIT">    </span><span class="NAME">window.clearTimeout</span><span class="PUNC">(</span><span class="NAME">this._timeoutId</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3201</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>3202</span> 
-<span class='line'>3203</span> </span><span class="WHIT">  </span><span class="NAME">this.drawTweet</span><span class="PUNC">(</span><span class="NAME">annotation</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3204</span> 
-<span class='line'>3205</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">time</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._Popcorn.currentTime</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">  
-<span class='line'>3206</span>   </span><span class="NAME">this._timeoutId</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">window.setTimeout</span><span class="PUNC">(</span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.clearPanel</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.widgetsDefaults.TweetsWidget.tweet_display_period</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3207</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3208</span> 
-<span class='line'>3209</span> 
-<span class='line'>3210</span> </span><span class="NAME">IriSP.TweetsWidget.prototype.clearPanel</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">  
-<span class='line'>3211</span>     </span><span class="NAME">this._displayingTweet</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3212</span> </span><span class="WHIT">    </span><span class="NAME">this._timeoutId</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3213</span> </span><span class="WHIT">    </span><span class="NAME">this.closePanel</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3214</span> </span><span class="WHIT">    
-<span class='line'>3215</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3216</span> 
-<span class='line'>3217</span> </span><span class="NAME">IriSP.TweetsWidget.prototype.closePanel</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3218</span> </span><span class="WHIT">    </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">this._timeoutId</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3219</span> </span><span class="WHIT">      </span><span class="COMM">/* we're called from the "close window" link */</span><span class="WHIT">
-<span class='line'>3220</span> </span><span class="WHIT">      </span><span class="COMM">/* cancel the timeout */</span><span class="WHIT">
-<span class='line'>3221</span> </span><span class="WHIT">      </span><span class="NAME">window.clearTimeout</span><span class="PUNC">(</span><span class="NAME">this._timeoutId</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3222</span> </span><span class="WHIT">      </span><span class="NAME">this._timeoutId</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3223</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>3224</span> </span><span class="WHIT">    
-<span class='line'>3225</span>     </span><span class="NAME">this.selector.hide</span><span class="PUNC">(</span><span class="STRN">"blind"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">400</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3226</span> </span><span class="WHIT">    
-<span class='line'>3227</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3228</span> 
-<span class='line'>3229</span> </span><span class="COMM">/* cancel the timeout if the user clicks on the keep panel open button */</span><span class="WHIT">
-<span class='line'>3230</span> </span><span class="NAME">IriSP.TweetsWidget.prototype.keepPanel</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3231</span> </span><span class="WHIT">    </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">this._timeoutId</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3232</span> </span><span class="WHIT">      </span><span class="COMM">/* we're called from the "close window" link */</span><span class="WHIT">
-<span class='line'>3233</span> </span><span class="WHIT">      </span><span class="COMM">/* cancel the timeout */</span><span class="WHIT">
-<span class='line'>3234</span> </span><span class="WHIT">      </span><span class="NAME">window.clearTimeout</span><span class="PUNC">(</span><span class="NAME">this._timeoutId</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3235</span> </span><span class="WHIT">      </span><span class="NAME">this._timeoutId</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3236</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>3237</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3238</span> 
-<span class='line'>3239</span> </span><span class="NAME">IriSP.TweetsWidget.prototype.draw</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3240</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">_this</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">this</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3241</span> </span><span class="WHIT">  
-<span class='line'>3242</span>   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">tweetMarkup</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.templToHTML</span><span class="PUNC">(</span><span class="NAME">IriSP.tweetWidget_template</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="STRN">"share_template"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">IriSP.share_template</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3243</span> </span><span class="WHIT">  </span><span class="NAME">this.selector.append</span><span class="PUNC">(</span><span class="NAME">tweetMarkup</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3244</span> </span><span class="WHIT">  </span><span class="NAME">this.selector.hide</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3245</span> </span><span class="WHIT">  </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-tweetWidgetMinimize"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">click</span><span class="PUNC">(</span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.closePanel</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3246</span> </span><span class="WHIT">  </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-tweetWidgetKeepOpen"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">click</span><span class="PUNC">(</span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.keepPanel</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3247</span> </span><span class="WHIT">  
-<span class='line'>3248</span>   </span><span class="NAME">this._Popcorn.listen</span><span class="PUNC">(</span><span class="STRN">"IriSP.PolemicTweet.click"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.PolemicTweetClickHandler</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3249</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3250</span> 
-<span class='line'>3251</span> </span><span class="NAME">IriSP.TweetsWidget.prototype.PolemicTweetClickHandler</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">tweet_id</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">  
-<span class='line'>3252</span>   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">index</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">annotation</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3253</span> </span><span class="WHIT">  </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">index</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">this._serializer._data.annotations</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3254</span> </span><span class="WHIT">    </span><span class="NAME">annotation</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._serializer._data.annotations</span><span class="PUNC">[</span><span class="NAME">index</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3255</span> </span><span class="WHIT">    
-<span class='line'>3256</span>     </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">annotation.id</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">tweet_id</span><span class="PUNC">)</span><span class="WHIT">
-<span class='line'>3257</span> </span><span class="WHIT">      </span><span class="KEYW">break</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3258</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>3259</span> </span><span class="WHIT">    
-<span class='line'>3260</span>   </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">annotation.id</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="NAME">tweet_id</span><span class="PUNC">)</span><span class="WHIT">
-<span class='line'>3261</span> </span><span class="WHIT">      </span><span class="COMM">/* we haven't found it */</span><span class="WHIT">
-<span class='line'>3262</span> </span><span class="WHIT">      </span><span class="KEYW">return</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3263</span> </span><span class="WHIT">  
-<span class='line'>3264</span>   </span><span class="NAME">this.displayTweet</span><span class="PUNC">(</span><span class="NAME">annotation</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3265</span> </span><span class="WHIT">  </span><span class="KEYW">return</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3266</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3267</span> 
-<span class='line'>3268</span> </span><span class="NAME">IriSP.JSONSerializer</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">DataLoader</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">url</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3269</span> </span><span class="WHIT">  </span><span class="NAME">IriSP.Serializer.call</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">DataLoader</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">url</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3270</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3271</span> 
-<span class='line'>3272</span> </span><span class="NAME">IriSP.JSONSerializer.prototype</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">IriSP.Serializer</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3273</span> 
-<span class='line'>3274</span> </span><span class="NAME">IriSP.JSONSerializer.prototype.serialize</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">data</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3275</span> </span><span class="WHIT">  </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">JSON.stringify</span><span class="PUNC">(</span><span class="NAME">data</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3276</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3277</span> 
-<span class='line'>3278</span> </span><span class="NAME">IriSP.JSONSerializer.prototype.deserialize</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">data</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3279</span> </span><span class="WHIT">  </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">JSON.parse</span><span class="PUNC">(</span><span class="NAME">data</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3280</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3281</span> 
-<span class='line'>3282</span> </span><span class="NAME">IriSP.JSONSerializer.prototype.sync</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">callback</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3283</span> </span><span class="WHIT">  </span><span class="COMM">/* we don't have to do much because jQuery handles json for us */</span><span class="WHIT">
-<span class='line'>3284</span> 
-<span class='line'>3285</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">self</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">this</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3286</span> 
-<span class='line'>3287</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">fn</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">data</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">      
-<span class='line'>3288</span>       </span><span class="NAME">self._data</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">data</span><span class="PUNC">;</span><span class="WHIT">      
-<span class='line'>3289</span>       </span><span class="COMM">// sort the data too     </span><span class="WHIT">
-<span class='line'>3290</span> </span><span class="WHIT">      </span><span class="NAME">self._data</span><span class="PUNC">[</span><span class="STRN">"annotations"</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">sort</span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">)</span><span class="WHIT"> 
-<span class='line'>3291</span>           </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">a_begin</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="NAME">a.begin</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3292</span> </span><span class="WHIT">            </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">b_begin</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="NAME">b.begin</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3293</span> </span><span class="WHIT">            </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a_begin</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">b_begin</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3294</span> </span><span class="WHIT">          </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3295</span> </span><span class="WHIT">     
-<span class='line'>3296</span>       </span><span class="NAME">callback</span><span class="PUNC">(</span><span class="NAME">data</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">      
-<span class='line'>3297</span>   </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3298</span> </span><span class="WHIT">  
-<span class='line'>3299</span>   </span><span class="NAME">this._DataLoader.get</span><span class="PUNC">(</span><span class="NAME">this._url</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">fn</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3300</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3301</span> 
-<span class='line'>3302</span> </span><span class="NAME">IriSP.JSONSerializer.prototype.currentMedia</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">  
-<span class='line'>3303</span>   </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">this._data.medias</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">/* FIXME: don't hardcode it */</span><span class="WHIT">
-<span class='line'>3304</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3305</span> 
-<span class='line'>3306</span> </span><span class="COMM">/* this function searches for an annotation which matches title, description and keyword 
-<span class='line'>3307</span>    "" matches any field. 
-<span class='line'>3308</span>    Note: it ignores tweets.
-<span class='line'>3309</span> */</span><span class="WHIT">    
-<span class='line'>3310</span> </span><span class="NAME">IriSP.JSONSerializer.prototype.searchAnnotations</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">title</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">description</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">keyword</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3311</span> </span><span class="WHIT">    </span><span class="COMM">/* we can have many types of annotations. We want search to only look for regular segments */</span><span class="WHIT">
-<span class='line'>3312</span> </span><span class="WHIT">    </span><span class="COMM">/* the next two lines are a bit verbose because for some test data, _serializer.data.view is either
-<span class='line'>3313</span>        null or undefined.
-<span class='line'>3314</span>     */</span><span class="WHIT">
-<span class='line'>3315</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">view</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3316</span> 
-<span class='line'>3317</span> </span><span class="WHIT">    </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">this._data.views</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">this._data.views</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">)</span><span class="WHIT">
-<span class='line'>3318</span> </span><span class="WHIT">       </span><span class="NAME">view</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._data.views</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3319</span> 
-<span class='line'>3320</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">searchViewType</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3321</span> 
-<span class='line'>3322</span> </span><span class="WHIT">    </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">view</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">view.annotation_types</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">view.annotation_types.length</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3323</span> </span><span class="WHIT">            </span><span class="NAME">searchViewType</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">view.annotation_types</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3324</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>3325</span> 
-<span class='line'>3326</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">filterfn</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">annotation</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3327</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">searchViewType</span><span class="WHIT">  </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="STRN">""</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> 
-<span class='line'>3328</span>           </span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">annotation.meta</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> 
-<span class='line'>3329</span>           </span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">annotation.meta</span><span class="PUNC">[</span><span class="STRN">"id-ref"</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT">
-<span class='line'>3330</span> </span><span class="WHIT">          </span><span class="NAME">annotation.meta</span><span class="PUNC">[</span><span class="STRN">"id-ref"</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="NAME">searchViewType</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3331</span> </span><span class="WHIT">        </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">// don't pass</span><span class="WHIT">
-<span class='line'>3332</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3333</span> </span><span class="WHIT">          </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3334</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>3335</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3336</span> 
-<span class='line'>3337</span> </span><span class="WHIT">    </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">this.searchAnnotationsFilter</span><span class="PUNC">(</span><span class="NAME">title</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">description</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">keyword</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">filterfn</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3338</span> 
-<span class='line'>3339</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3340</span> 
-<span class='line'>3341</span> </span><span class="COMM">/* only look for tweets */</span><span class="WHIT">
-<span class='line'>3342</span> </span><span class="NAME">IriSP.JSONSerializer.prototype.searchTweets</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">title</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">description</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">keyword</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3343</span> </span><span class="WHIT">    </span><span class="COMM">/* we can have many types of annotations. We want search to only look for regular segments */</span><span class="WHIT">
-<span class='line'>3344</span> </span><span class="WHIT">    </span><span class="COMM">/* the next two lines are a bit verbose because for some test data, _serializer.data.view is either
-<span class='line'>3345</span>        null or undefined.
-<span class='line'>3346</span>     */</span><span class="WHIT">
-<span class='line'>3347</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">view</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3348</span> 
-<span class='line'>3349</span> </span><span class="WHIT">    </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">this._data.views</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">this._data.views</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">)</span><span class="WHIT">
-<span class='line'>3350</span> </span><span class="WHIT">       </span><span class="NAME">view</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._data.views</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3351</span> 
-<span class='line'>3352</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">searchViewType</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3353</span> 
-<span class='line'>3354</span> </span><span class="WHIT">    </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">view</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">view.annotation_types</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">view.annotation_types.length</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3355</span> </span><span class="WHIT">            </span><span class="NAME">searchViewType</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">view.annotation_types</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3356</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>3357</span> 
-<span class='line'>3358</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">filterfn</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">annotation</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3359</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">searchViewType</span><span class="WHIT">  </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="STRN">""</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> 
-<span class='line'>3360</span>           </span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">annotation.meta</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> 
-<span class='line'>3361</span>           </span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">annotation.meta</span><span class="PUNC">[</span><span class="STRN">"id-ref"</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT">
-<span class='line'>3362</span> </span><span class="WHIT">          </span><span class="NAME">annotation.meta</span><span class="PUNC">[</span><span class="STRN">"id-ref"</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="NAME">searchViewType</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3363</span> </span><span class="WHIT">        </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">// pass</span><span class="WHIT">
-<span class='line'>3364</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3365</span> </span><span class="WHIT">          </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3366</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>3367</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3368</span> 
-<span class='line'>3369</span> </span><span class="WHIT">    </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">this.searchAnnotationsFilter</span><span class="PUNC">(</span><span class="NAME">title</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">description</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">keyword</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">filterfn</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3370</span> 
-<span class='line'>3371</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3372</span> 
-<span class='line'>3373</span> </span><span class="COMM">/*
-<span class='line'>3374</span>   the previous function call this one, which is more general:
-<span class='line'>3375</span>  */</span><span class="WHIT">    
-<span class='line'>3376</span> </span><span class="NAME">IriSP.JSONSerializer.prototype.searchAnnotationsFilter</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">title</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">description</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">keyword</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">filter</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3377</span> 
-<span class='line'>3378</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">rTitle</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3379</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">rDescription</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3380</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">rKeyword</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3381</span> </span><span class="WHIT">    </span><span class="COMM">/* match anything if given the empty string */</span><span class="WHIT">
-<span class='line'>3382</span> </span><span class="WHIT">    </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">title</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">)</span><span class="WHIT">
-<span class='line'>3383</span> </span><span class="WHIT">      </span><span class="NAME">title</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">".*"</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3384</span> </span><span class="WHIT">    </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">description</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">)</span><span class="WHIT">
-<span class='line'>3385</span> </span><span class="WHIT">      </span><span class="NAME">description</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">".*"</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3386</span> </span><span class="WHIT">    </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">keyword</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">)</span><span class="WHIT">
-<span class='line'>3387</span> </span><span class="WHIT">      </span><span class="NAME">keyword</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">".*"</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3388</span> </span><span class="WHIT">    
-<span class='line'>3389</span>     </span><span class="NAME">rTitle</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">RegExp</span><span class="PUNC">(</span><span class="NAME">title</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"i"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">  
-<span class='line'>3390</span>     </span><span class="NAME">rDescription</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">RegExp</span><span class="PUNC">(</span><span class="NAME">description</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"i"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">  
-<span class='line'>3391</span>     </span><span class="NAME">rKeyword</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">RegExp</span><span class="PUNC">(</span><span class="NAME">keyword</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"i"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">  
-<span class='line'>3392</span>     
-<span class='line'>3393</span>     </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">ret_array</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3394</span> </span><span class="WHIT">    
-<span class='line'>3395</span>     </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3396</span> </span><span class="WHIT">    </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">this._data.annotations</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3397</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">annotation</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._data.annotations</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3398</span> </span><span class="WHIT">      
-<span class='line'>3399</span>       </span><span class="COMM">/* filter the annotations whose type is not the one we want */</span><span class="WHIT">
-<span class='line'>3400</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">filter</span><span class="PUNC">(</span><span class="NAME">annotation</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3401</span> </span><span class="WHIT">          </span><span class="KEYW">continue</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3402</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>3403</span> </span><span class="WHIT">      
-<span class='line'>3404</span>       </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">rTitle.test</span><span class="PUNC">(</span><span class="NAME">annotation.content.title</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> 
-<span class='line'>3405</span>           </span><span class="NAME">rDescription.test</span><span class="PUNC">(</span><span class="NAME">annotation.content.description</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3406</span> </span><span class="WHIT">          </span><span class="COMM">/* FIXME : implement keyword support */</span><span class="WHIT">
-<span class='line'>3407</span> </span><span class="WHIT">          </span><span class="NAME">ret_array.push</span><span class="PUNC">(</span><span class="NAME">annotation</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3408</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>3409</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>3410</span> </span><span class="WHIT">    
-<span class='line'>3411</span>     </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">ret_array</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3412</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3413</span> 
-<span class='line'>3414</span> </span><span class="COMM">/* breaks a string in words and searches each of these words. Returns an array
-<span class='line'>3415</span>    of objects with the id of the annotation and its number of occurences.
-<span class='line'>3416</span>    
-<span class='line'>3417</span>    FIXME: optimize ? seems to be n^2 in the worst case.
-<span class='line'>3418</span> */</span><span class="WHIT">
-<span class='line'>3419</span> </span><span class="NAME">IriSP.JSONSerializer.prototype.searchOccurences</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">searchString</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3420</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">ret</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3421</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">keywords</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">searchString.split</span><span class="PUNC">(</span><span class="REGX">/\s+/</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3422</span> </span><span class="WHIT">  
-<span class='line'>3423</span>   </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">keywords</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3424</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">keyword</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">keywords</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3425</span> </span><span class="WHIT">    
-<span class='line'>3426</span>     </span><span class="COMM">// search this keyword in descriptions and title</span><span class="WHIT">
-<span class='line'>3427</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">found_annotations</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="WHIT">
-<span class='line'>3428</span> </span><span class="WHIT">    </span><span class="NAME">found_annotations</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">found_annotations.concat</span><span class="PUNC">(</span><span class="NAME">this.searchAnnotations</span><span class="PUNC">(</span><span class="NAME">keyword</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3429</span> </span><span class="WHIT">    </span><span class="NAME">found_annotations</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">found_annotations.concat</span><span class="PUNC">(</span><span class="NAME">this.searchAnnotations</span><span class="PUNC">(</span><span class="STRN">""</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">keyword</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3430</span> </span><span class="WHIT">    
-<span class='line'>3431</span>     </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">j</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">found_annotations</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3432</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">current_annotation</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">found_annotations</span><span class="PUNC">[</span><span class="NAME">j</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3433</span> </span><span class="WHIT">      
-<span class='line'>3434</span>       </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">ret.hasOwnProperty</span><span class="PUNC">(</span><span class="NAME">current_annotation.id</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3435</span> </span><span class="WHIT">        </span><span class="NAME">ret</span><span class="PUNC">[</span><span class="NAME">current_annotation.id</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3436</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3437</span> </span><span class="WHIT">        </span><span class="NAME">ret</span><span class="PUNC">[</span><span class="NAME">current_annotation.id</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3438</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>3439</span> </span><span class="WHIT">      
-<span class='line'>3440</span>     </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>3441</span> 
-<span class='line'>3442</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3443</span> </span><span class="WHIT">  
-<span class='line'>3444</span>   </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">ret</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3445</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3446</span> 
-<span class='line'>3447</span> </span><span class="COMM">/* breaks a string in words and searches each of these words. Returns an array
-<span class='line'>3448</span>    of objects with the id of the annotation and its number of occurences.
-<span class='line'>3449</span>    
-<span class='line'>3450</span>    FIXME: optimize ? seems to be n^2 in the worst case.
-<span class='line'>3451</span> */</span><span class="WHIT">
-<span class='line'>3452</span> </span><span class="NAME">IriSP.JSONSerializer.prototype.searchTweetsOccurences</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">searchString</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3453</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">ret</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3454</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">keywords</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">searchString.split</span><span class="PUNC">(</span><span class="REGX">/\s+/</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3455</span> </span><span class="WHIT">  
-<span class='line'>3456</span>   </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">keywords</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3457</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">keyword</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">keywords</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3458</span> </span><span class="WHIT">    
-<span class='line'>3459</span>     </span><span class="COMM">// search this keyword in descriptions and title</span><span class="WHIT">
-<span class='line'>3460</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">found_annotations</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="WHIT">
-<span class='line'>3461</span> </span><span class="WHIT">    </span><span class="NAME">found_annotations</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">found_annotations.concat</span><span class="PUNC">(</span><span class="NAME">this.searchTweets</span><span class="PUNC">(</span><span class="NAME">keyword</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3462</span> </span><span class="WHIT">    </span><span class="NAME">found_annotations</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">found_annotations.concat</span><span class="PUNC">(</span><span class="NAME">this.searchTweets</span><span class="PUNC">(</span><span class="STRN">""</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">keyword</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3463</span> </span><span class="WHIT">    
-<span class='line'>3464</span>     </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">j</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">found_annotations</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3465</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">current_annotation</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">found_annotations</span><span class="PUNC">[</span><span class="NAME">j</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3466</span> </span><span class="WHIT">      
-<span class='line'>3467</span>       </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">ret.hasOwnProperty</span><span class="PUNC">(</span><span class="NAME">current_annotation.id</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3468</span> </span><span class="WHIT">        </span><span class="NAME">ret</span><span class="PUNC">[</span><span class="NAME">current_annotation.id</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3469</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3470</span> </span><span class="WHIT">        </span><span class="NAME">ret</span><span class="PUNC">[</span><span class="NAME">current_annotation.id</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3471</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>3472</span> </span><span class="WHIT">      
-<span class='line'>3473</span>     </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>3474</span> 
-<span class='line'>3475</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3476</span> </span><span class="WHIT">  
-<span class='line'>3477</span>   </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">ret</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3478</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3479</span> 
-<span class='line'>3480</span> </span><span class="COMM">/* takes the currentTime and returns all the annotations that are displayable at the moment 
-<span class='line'>3481</span>    NB: only takes account the first type of annotations - ignores tweets 
-<span class='line'>3482</span>    currentTime is in seconds.
-<span class='line'>3483</span>  */</span><span class="WHIT">
-<span class='line'>3484</span> 
-<span class='line'>3485</span> </span><span class="NAME">IriSP.JSONSerializer.prototype.currentAnnotations</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">currentTime</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3486</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">view</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3487</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">currentTimeMs</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1000</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="NAME">currentTime</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3488</span> 
-<span class='line'>3489</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">this._data.views</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">this._data.views</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">)</span><span class="WHIT">
-<span class='line'>3490</span> </span><span class="WHIT">     </span><span class="NAME">view</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._data.views</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3491</span> 
-<span class='line'>3492</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">view_type</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3493</span> 
-<span class='line'>3494</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">view</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">view.annotation_types</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">view.annotation_types.length</span><span class="WHIT"> </span><span class="PUNC">>=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3495</span> </span><span class="WHIT">          </span><span class="NAME">view_type</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">view.annotation_types</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3496</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>3497</span> 
-<span class='line'>3498</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">ret_array</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3499</span> </span><span class="WHIT">  
-<span class='line'>3500</span>   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3501</span> </span><span class="WHIT"> 
-<span class='line'>3502</span>   </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">this._data.annotations</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3503</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">annotation</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._data.annotations</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3504</span> </span><span class="WHIT">    
-<span class='line'>3505</span>     </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">annotation.meta</span><span class="PUNC">[</span><span class="STRN">"id-ref"</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">view_type</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">annotation.begin</span><span class="WHIT"> </span><span class="PUNC">&lt;=</span><span class="WHIT"> </span><span class="NAME">currentTimeMs</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">annotation.end</span><span class="WHIT"> </span><span class="PUNC">>=</span><span class="WHIT"> </span><span class="NAME">currentTimeMs</span><span class="PUNC">)</span><span class="WHIT">
-<span class='line'>3506</span> </span><span class="WHIT">      </span><span class="NAME">ret_array.push</span><span class="PUNC">(</span><span class="NAME">annotation</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3507</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
-<span class='line'>3508</span> 
-<span class='line'>3509</span> </span><span class="WHIT">  </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">ret_array</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3510</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3511</span> 
-<span class='line'>3512</span> 
-<span class='line'>3513</span> </span><span class="COMM">/* this function returns a list of ids of tweet lines */</span><span class="WHIT">
-<span class='line'>3514</span> </span><span class="NAME">IriSP.JSONSerializer.prototype.getTweetIds</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3515</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">this._data.lists</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">this._data.lists</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">)</span><span class="WHIT">
-<span class='line'>3516</span> </span><span class="WHIT">    </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3517</span> 
-<span class='line'>3518</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">tweetsId</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3519</span> </span><span class="WHIT">  
-<span class='line'>3520</span>   </span><span class="COMM">/* first get the list containing the tweets */</span><span class="WHIT">
-<span class='line'>3521</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">tweets</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.underscore.filter</span><span class="PUNC">(</span><span class="NAME">this._data.lists</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">entry</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">entry.id.indexOf</span><span class="PUNC">(</span><span class="STRN">"tweet"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="NUMB">1</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3522</span> </span><span class="WHIT">  
-<span class='line'>3523</span>   </span><span class="COMM">// FIXME: collect tweets from multiple sources ?</span><span class="WHIT">
-<span class='line'>3524</span> </span><span class="WHIT">  </span><span class="NAME">tweetsId</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.underscore.pluck</span><span class="PUNC">(</span><span class="NAME">tweets</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">items</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"id-ref"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3525</span> 
-<span class='line'>3526</span> </span><span class="WHIT">  </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">tweetsId</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3527</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3528</span> 
-<span class='line'>3529</span> </span><span class="COMM">/* this function returns a list of lines which are not tweet lines */</span><span class="WHIT">
-<span class='line'>3530</span> </span><span class="NAME">IriSP.JSONSerializer.prototype.getNonTweetIds</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='line'>3531</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">this._data.lists</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">this._data.lists</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">)</span><span class="WHIT">
-<span class='line'>3532</span> </span><span class="WHIT">    </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3533</span> </span><span class="WHIT">  
-<span class='line'>3534</span>   </span><span class="COMM">/* get all the ids */</span><span class="WHIT">
-<span class='line'>3535</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">ids</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.underscore.map</span><span class="PUNC">(</span><span class="NAME">this._data.lists</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">entry</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">                                                         
-<span class='line'>3536</span>                                                          </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">IriSP.underscore.pluck</span><span class="PUNC">(</span><span class="NAME">entry.items</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"id-ref"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3537</span> </span><span class="WHIT">                                                         
-<span class='line'>3538</span>   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">illegal_values</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.getTweetIds</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3539</span> </span><span class="WHIT">  </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">IriSP.underscore.difference</span><span class="PUNC">(</span><span class="NAME">ids</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">illegal_values</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3540</span> </span><span class="WHIT">  
-<span class='line'>3541</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='line'>3542</span> </span></pre></body></html>
\ No newline at end of file
--- a/sbin/res/jsdoc/templates/jsdoc/allclasses.tmpl	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,17 +0,0 @@
-<div align="center">{+new Link().toFile("index.html").withText("Class Index")+}
-| {+new Link().toFile("files.html").withText("File Index")+}</div>
-<hr />
-<h2>Classes</h2>
-<ul class="classList">
-	<for each="thisClass" in="data">
-	<li>{!
-		if (thisClass.alias == "_global_") {
-			output += "<i>"+new Link().toClass(thisClass.alias)+"</i>";
-		}
-		else {
-			output += new Link().toClass(thisClass.alias);
-		}
-	!}</li>
-	</for>
-</ul>
-<hr />
\ No newline at end of file
--- a/sbin/res/jsdoc/templates/jsdoc/allfiles.tmpl	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,56 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-	<head>
-		<meta http-equiv="content-type" content="text/html; charset={+IO.encoding+}" />
-		{! Link.base = ""; /* all generated links will be relative to this */ !}
-		<title>JsDoc Reference - File Index</title>
-		<meta name="generator" content="JsDoc Toolkit" />
-		
-		<style type="text/css">
-		{+include("static/default.css")+}
-		</style>
-	</head>
-	
-	<body>
-		{+include("static/header.html")+}
-		
-		<div id="index">
-			{+publish.classesIndex+}
-		</div>
-		
-		<div id="content">
-			<h1 class="classTitle">File Index</h1>
-			
-			<for each="item" in="data">
-			<div>
-				<h2>{+new Link().toSrc(item.alias).withText(item.name)+}</h2>
-				<if test="item.desc">{+resolveLinks(item.desc)+}</if>
-				<dl>
-					<if test="item.author">
-						<dt class="heading">Author:</dt>
-						<dd>{+item.author+}</dd>
-					</if>
-					<if test="item.version">
-						<dt class="heading">Version:</dt>
-							<dd>{+item.version+}</dd>
-					</if>
-					{! var locations = item.comment.getTag('location').map(function($){return $.toString().replace(/(^\$ ?| ?\$$)/g, '').replace(/^HeadURL: https:/g, 'http:');}) !}
-					<if test="locations.length">
-						<dt class="heading">Location:</dt>
-							<for each="location" in="locations">
-							<dd><a href="{+location+}">{+location+}</a></dd>
-							</for>
-					</if>
-				</dl>
-			</div>
-			<hr />
-			</for>
-			
-		</div>
-		<div class="fineprint" style="clear:both">
-			<if test="JSDOC.opt.D.copyright">&copy;{+JSDOC.opt.D.copyright+}<br /></if>
-			Documentation generated by <a href="http://code.google.com/p/jsdoc-toolkit/" target="_blankt">JsDoc Toolkit</a> {+JSDOC.VERSION+} on {+new Date()+}
-		</div>
-	</body>
-</html>
\ No newline at end of file
--- a/sbin/res/jsdoc/templates/jsdoc/class.tmpl	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,649 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-	<head>
-		<meta http-equiv="content-type" content="text/html; charset={+IO.encoding+}" />
-		<meta name="generator" content="JsDoc Toolkit" />
-		{! Link.base = "../"; /* all generated links will be relative to this */ !}
-		<title>JsDoc Reference - {+data.alias+}</title>
-
-		<style type="text/css">
-			{+include("static/default.css")+}
-		</style>
-	</head>
-
-	<body>
-<!-- ============================== header ================================= -->	
-		<!-- begin static/header.html -->
-		{+include("static/header.html")+}
-		<!-- end static/header.html -->
-
-<!-- ============================== classes index ============================ -->
-		<div id="index">
-			<!-- begin publish.classesIndex -->
-			{+publish.classesIndex+}
-			<!-- end publish.classesIndex -->
-		</div>
-		
-		<div id="content">
-<!-- ============================== class title ============================ -->
-			<h1 class="classTitle">
-				{!
-					var classType = "";
-					
-					if (data.isBuiltin()) {
-						classType += "Built-In ";
-					}
-					
-					if (data.isNamespace) {
-						if (data.is('FUNCTION')) {
-							classType += "Function ";
-						}
-						classType += "Namespace ";
-					}
-					else {
-						classType += "Class ";
-					}
-				!}
-				{+classType+}{+data.alias+}
-			</h1>
-
-<!-- ============================== class summary ========================== -->			
-			<p class="description">
-				<if test="data.version"><br />Version
-					{+ data.version +}.<br />
-				</if>
-				<if test="data.augments.length"><br />Extends
-					{+
-						data.augments
-						.sort()
-						.map(
-							function($) { return new Link().toSymbol($); }
-						)
-						.join(", ")
-					+}.<br />
-				</if>
-			
-				{+resolveLinks(data.classDesc)+}
-				
-				<if test="!data.isBuiltin()">{# isn't defined in any file #}
-					<br /><i>Defined in: </i> {+new Link().toSrc(data.srcFile)+}.
-				</if>
-			</p>
-
-<!-- ============================== constructor summary ==================== -->			
-			<if test="!data.isBuiltin() && (data.isNamespace || data.is('CONSTRUCTOR'))">
-			<table class="summaryTable" cellspacing="0" summary="A summary of the constructor documented in the class {+data.alias+}.">
-				<caption>{+classType+}Summary</caption>
-				<thead>
-					<tr>
-						<th scope="col">Constructor Attributes</th>
-						<th scope="col">Constructor Name and Description</th>
-					</tr>
-				</thead>
-				<tbody>
-					<tr>
-						<td class="attributes">{!
-							if (data.isPrivate) output += "&lt;private&gt; ";
-							if (data.isInner) output += "&lt;inner&gt; ";
-						!}&nbsp;</td>
-						<td class="nameDescription" {!if (data.comment.getTag("hilited").length){output += 'style="color: red"'}!}>
-							<div class="fixedFont">
-								<b>{+ new Link().toSymbol(data.alias).inner('constructor')+}</b><if test="classType != 'Namespace '">{+ makeSignature(data.params) +}</if>
-							</div>
-							<div class="description">{+resolveLinks(summarize(data.desc))+}</div>
-						</td>
-					</tr>
-				</tbody>
-			</table>
-			</if>
-
-<!-- ============================== properties summary ===================== -->
-			<if test="data.properties.length">
-				{! var ownProperties = data.properties.filter(function($){return $.memberOf == data.alias && !$.isNamespace}).sort(makeSortby("name")); !}
-				<if test="ownProperties.length">
-				<table class="summaryTable" cellspacing="0" summary="A summary of the fields documented in the class {+data.alias+}.">
-					<caption>Field Summary</caption>
-					<thead>
-						<tr>
-							<th scope="col">Field Attributes</th>
-							<th scope="col">Field Name and Description</th>
-						</tr>
-					</thead>
-					<tbody>
-					<for each="member" in="ownProperties">
-						<tr>
-							<td class="attributes">{!
-								if (member.isPrivate) output += "&lt;private&gt; ";
-								if (member.isInner) output += "&lt;inner&gt; ";
-								if (member.isStatic) output += "&lt;static&gt; ";
-								if (member.isConstant) output += "&lt;constant&gt; ";
-							!}&nbsp;</td>
-							<td class="nameDescription">
-								<div class="fixedFont">
-								<if test="member.isStatic && member.memberOf != '_global_'">{+member.memberOf+}.</if><b>{+new Link().toSymbol(member.alias).withText(member.name)+}</b>
-								</div>
-								<div class="description">{+resolveLinks(summarize(member.desc))+}</div>
-							</td>
-						</tr>
-					</for>
-					</tbody>
-				</table>
-				</if>
-				
-				<if test="data.inheritsFrom.length">
-				<dl class="inheritsList">
-				{!
-					var borrowedMembers = data.properties.filter(function($) {return $.memberOf != data.alias});
-					
-					var contributers = [];
-					borrowedMembers.map(function($) {if (contributers.indexOf($.memberOf) < 0) contributers.push($.memberOf)});
-					for (var i = 0, l = contributers.length; i < l; i++) {
-						output +=
-							"<dt>Fields borrowed from class "+new Link().toSymbol(contributers[i])+": </dt>"
-							+
-							"<dd>" +
-							borrowedMembers
-							.filter(
-								function($) { return $.memberOf == contributers[i] }
-							)
-							.sort(makeSortby("name"))
-							.map(
-								function($) { return new Link().toSymbol($.alias).withText($.name) }
-							)
-							.join(", ")
-							+
-							"</dd>";
-					}
-				!}
-				</dl>
-				</if>
-			</if>
-
-<!-- ============================== methods summary ======================== -->
-			<if test="data.methods.length">
-				{! var ownMethods = data.methods.filter(function($){return $.memberOf == data.alias  && !$.isNamespace}).sort(makeSortby("name")); !}
-				<if test="ownMethods.length">
-				<table class="summaryTable" cellspacing="0" summary="A summary of the methods documented in the class {+data.alias+}.">
-					<caption>Method Summary</caption>
-					<thead>
-						<tr>
-							<th scope="col">Method Attributes</th>
-							<th scope="col">Method Name and Description</th>
-						</tr>
-					</thead>
-					<tbody>
-					<for each="member" in="ownMethods">
-						<tr>
-							<td class="attributes">{!
-								if (member.isPrivate) output += "&lt;private&gt; ";
-								if (member.isInner) output += "&lt;inner&gt; ";
-								if (member.isStatic) output += "&lt;static&gt; ";
-							!}&nbsp;</td>
-							<td class="nameDescription">
-								<div class="fixedFont"><if test="member.isStatic && member.memberOf != '_global_'">{+member.memberOf+}.</if><b>{+new Link().toSymbol(member.alias).withText(member.name.replace(/\^\d+$/, ''))+}</b>{+makeSignature(member.params)+}
-								</div>
-								<div class="description">{+resolveLinks(summarize(member.desc))+}</div>
-							</td>
-						</tr>
-					</for>
-					</tbody>
-				</table>
-				</if>
-				
-				<if test="data.inheritsFrom.length">
-				<dl class="inheritsList">
-				{!
-					var borrowedMembers = data.methods.filter(function($) {return $.memberOf != data.alias});
-					var contributers = [];
-					borrowedMembers.map(function($) {if (contributers.indexOf($.memberOf) < 0) contributers.push($.memberOf)});
-					for (var i = 0, l = contributers.length; i < l; i++) {
-						output +=
-							"<dt>Methods borrowed from class "+new Link().toSymbol(contributers[i])+": </dt>"
-							+
-							"<dd>" +
-							borrowedMembers
-							.filter(
-								function($) { return $.memberOf == contributers[i] }
-							)
-							.sort(makeSortby("name"))
-							.map(
-								function($) { return new Link().toSymbol($.alias).withText($.name) }
-							)
-							.join(", ")
-							+
-							"</dd>";
-					}
-				
-				!}
-				</dl>
-				</if>
-			</if>
-<!-- ============================== events summary ======================== -->
-			<if test="data.events.length">
-				{! var ownEvents = data.events.filter(function($){return $.memberOf == data.alias  && !$.isNamespace}).sort(makeSortby("name")); !}
-				<if test="ownEvents.length">
-				<table class="summaryTable" cellspacing="0" summary="A summary of the events documented in the class {+data.alias+}.">
-					<caption>Event Summary</caption>
-					<thead>
-						<tr>
-							<th scope="col">Event Attributes</th>
-							<th scope="col">Event Name and Description</th>
-						</tr>
-					</thead>
-					<tbody>
-					<for each="member" in="ownEvents">
-						<tr>
-							<td class="attributes">{!
-								if (member.isPrivate) output += "&lt;private&gt; ";
-								if (member.isInner) output += "&lt;inner&gt; ";
-								if (member.isStatic) output += "&lt;static&gt; ";
-							!}&nbsp;</td>
-							<td class="nameDescription">
-								<div class="fixedFont"><if test="member.isStatic && member.memberOf != '_global_'">{+member.memberOf+}.</if><b>{+new Link().toSymbol(member.alias).withText(member.name)+}</b>{+makeSignature(member.params)+}
-								</div>
-								<div class="description">{+resolveLinks(summarize(member.desc))+}</div>
-							</td>
-						</tr>
-					</for>
-					</tbody>
-				</table>
-				</if>
-				
-				<if test="data.inheritsFrom.length">
-				<dl class="inheritsList">
-				{!
-					var borrowedMembers = data.events.filter(function($) {return $.memberOf != data.alias});
-					var contributers = [];
-					borrowedMembers.map(function($) {if (contributers.indexOf($.memberOf) < 0) contributers.push($.memberOf)});
-					for (var i = 0, l = contributers.length; i < l; i++) {
-						output +=
-							"<dt>Events borrowed from class "+new Link().toSymbol(contributers[i])+": </dt>"
-							+
-							"<dd>" +
-							borrowedMembers
-							.filter(
-								function($) { return $.memberOf == contributers[i] }
-							)
-							.sort(makeSortby("name"))
-							.map(
-								function($) { return new Link().toSymbol($.alias).withText($.name) }
-							)
-							.join(", ")
-							+
-							"</dd>";
-					}
-				
-				!}
-				</dl>
-				</if>
-			</if>
-
-<!-- ============================== constructor details ==================== -->		
-			<if test="!data.isBuiltin() && (data.isNamespace || data.is('CONSTRUCTOR'))">
-			<div class="details"><a name="constructor"> </a>
-				<div class="sectionTitle">
-					{+classType+}Detail
-				</div>
-				
-				<div class="fixedFont">{!
-					if (data.isPrivate) output += "&lt;private&gt; ";
-					if (data.isInner) output += "&lt;inner&gt; ";
-				!}
-						<b>{+ data.alias +}</b><if test="classType != 'Namespace '">{+ makeSignature(data.params) +}</if>
-				</div>
-				
-				<div class="description">
-					{+resolveLinks(data.desc)+}
-					<if test="data.author"><br /><i>Author: </i>{+data.author+}.</if>
-				</div>
-				
-				<if test="data.example.length">
-				<for each="example" in="data.example">
-				<pre class="code">{+example+}</pre>
-				</for>
-				</if>
-				
-				
-					<if test="data.params.length">
-						<dl class="detailList">
-						<dt class="heading">Parameters:</dt>
-						<for each="item" in="data.params">
-							<dt>
-								{+((item.type)?""+("<span class=\"light fixedFont\">{"+(new Link().toSymbol(item.type)+"}</span> ")) : "")+} <b>{+item.name+}</b>
-								<if test="item.isOptional"><i>Optional<if test="item.defaultValue">, Default: {+item.defaultValue+}</if></i></if>
-							</dt>
-								<dd>{+resolveLinks(item.desc)+}</dd>
-						</for>
-						</dl>
-					</if>
-					<if test="data.deprecated">
-						<dl class="detailList">
-						<dt class="heading">Deprecated:</dt>
-						<dt>
-							{+resolveLinks(data.deprecated)+}
-						</dt>
-						</dl>
-					</if>
-					<if test="data.since">
-						<dl class="detailList">
-						<dt class="heading">Since:</dt>
-							<dd>{+ data.since +}</dd>
-						</dl>
-					</if>
-					<if test="data.exceptions.length">
-						<dl class="detailList">
-						<dt class="heading">Throws:</dt>
-						<for each="item" in="data.exceptions">
-							<dt>
-								{+((item.type)?"<span class=\"light fixedFont\">{"+(new Link().toSymbol(item.type))+"}</span> " : "")+} <b>{+item.name+}</b>
-							</dt>
-								<dd>{+resolveLinks(item.desc)+}</dd>
-						</for>
-						</dl>
-					</if>
-					<if test="data.returns.length">
-						<dl class="detailList">
-						<dt class="heading">Returns:</dt>
-						<for each="item" in="data.returns">
-								<dd>{+((item.type)?"<span class=\"light fixedFont\">{"+(new Link().toSymbol(item.type))+"}</span> " : "")+}{+resolveLinks(item.desc)+}</dd>
-						</for>
-						</dl>
-					</if>
-					<if test="data.requires.length">
-						<dl class="detailList">
-						<dt class="heading">Requires:</dt>
-						<for each="item" in="data.requires">
-							<dd>{+ new Link().toSymbol(item) +}</dd>
-						</for>
-						</dl>
-					</if>
-					<if test="data.see.length">
-						<dl class="detailList">
-						<dt class="heading">See:</dt>
-						<for each="item" in="data.see">
-							<dd>{+ new Link().toSymbol(item) +}</dd>
-						</for>
-						</dl>
-					</if>
-
-			</div>
-			</if>
-
-<!-- ============================== field details ========================== -->		
-			<if test="defined(ownProperties) && ownProperties.length">
-				<div class="sectionTitle">
-					Field Detail
-				</div>
-				<for each="member" in="ownProperties">
-					<a name="{+Link.symbolNameToLinkName(member)+}"> </a>
-					<div class="fixedFont">{!
-						if (member.isPrivate) output += "&lt;private&gt; ";
-						if (member.isInner) output += "&lt;inner&gt; ";
-						if (member.isStatic) output += "&lt;static&gt; ";
-						if (member.isConstant) output += "&lt;constant&gt; ";
-					!}
-					
-					<if test="member.type"><span class="light">{{+new Link().toSymbol(member.type)+}}</span></if>
-					<if test="member.isStatic && member.memberOf != '_global_'"><span class="light">{+member.memberOf+}.</span></if><b>{+member.name+}</b>
-					
-					</div>
-					<div class="description">
-						{+resolveLinks(member.desc)+}
-						<if test="member.srcFile != data.srcFile">
-							<br />
-							<i>Defined in: </i> {+new Link().toSrc(member.srcFile)+}.
-						</if>
-						<if test="member.author"><br /><i>Author: </i>{+member.author+}.</if>
-					</div>
-					
-					<if test="member.example.length">
-					<for each="example" in="member.example">
-					<pre class="code">{+example+}</pre>
-					</for>
-					</if>
-
-						<if test="member.deprecated">
-							<dl class="detailList">
-							<dt class="heading">Deprecated:</dt>
-							<dt>
-								{+ resolveLinks(member.deprecated) +}
-							</dt>
-							</dl>
-						</if>
-						<if test="member.since">
-							<dl class="detailList">
-							<dt class="heading">Since:</dt>
-								<dd>{+ member.since +}</dd>
-							</dl>
-						</if>
-						<if test="member.see.length">
-							<dl class="detailList">
-							<dt class="heading">See:</dt>
-							<for each="item" in="member.see">
-							<dd>{+ new Link().toSymbol(item) +}</dd>
-							</for>
-							</dl>
-						</if>
-						<if test="member.defaultValue">
-							<dl class="detailList">
-							<dt class="heading">Default Value:</dt>
-							<dd>
-								{+resolveLinks(member.defaultValue)+}
-							</dd>
-							</dl>
-						</if>
-
-					<if test="!$member_last"><hr /></if>
-				</for>
-			</if>
-
-<!-- ============================== method details ========================= -->		
-			<if test="defined(ownMethods) && ownMethods.length">
-				<div class="sectionTitle">
-					Method Detail
-				</div>
-				<for each="member" in="ownMethods">
-					<a name="{+Link.symbolNameToLinkName(member)+}"> </a>
-					<div class="fixedFont">{!
-						if (member.isPrivate) output += "&lt;private&gt; ";
-						if (member.isInner) output += "&lt;inner&gt; ";
-						if (member.isStatic) output += "&lt;static&gt; ";
-					!}
-					
-					<if test="member.type"><span class="light">{{+new Link().toSymbol(member.type)+}}</span></if>
-					<if test="member.isStatic && member.memberOf != '_global_'"><span class="light">{+member.memberOf+}.</span></if><b>{+member.name.replace(/\^\d+$/, '')+}</b>{+makeSignature(member.params)+}
-					
-					</div>
-					<div class="description">
-						{+resolveLinks(member.desc)+}
-						<if test="member.srcFile != data.srcFile">
-							<br />
-							<i>Defined in: </i> {+new Link().toSrc(member.srcFile)+}.
-						</if>
-						<if test="member.author"><br /><i>Author: </i>{+member.author+}.</if>
-					</div>
-					
-					<if test="member.example.length">
-					<for each="example" in="member.example">
-					<pre class="code">{+example+}</pre>
-					</for>
-					</if>
-					
-						<if test="member.params.length">
-							<dl class="detailList">
-							<dt class="heading">Parameters:</dt>
-							<for each="item" in="member.params">
-								<dt>
-									{+((item.type)?"<span class=\"light fixedFont\">{"+(new Link().toSymbol(item.type))+"}</span> " : "")+}<b>{+item.name+}</b>
-									<if test="item.isOptional"><i>Optional<if test="item.defaultValue">, Default: {+item.defaultValue+}</if></i></if>
-								</dt>
-								<dd>{+resolveLinks(item.desc)+}</dd>
-							</for>
-							</dl>
-						</if>
-						<if test="member.deprecated">
-							<dl class="detailList">
-							<dt class="heading">Deprecated:</dt>
-							<dt>
-								{+ resolveLinks(member.deprecated) +}
-							</dt>
-							</dl>
-						</if>
-						<if test="member.since">
-							<dl class="detailList">
-							<dt class="heading">Since:</dt>
-								<dd>{+ member.since +}</dd>
-							</dl>
-							</dl>
-						</if>
-						<if test="member.exceptions.length">
-							<dl class="detailList">
-							<dt class="heading">Throws:</dt>
-							<for each="item" in="member.exceptions">
-								<dt>
-									{+((item.type)?"<span class=\"light fixedFont\">{"+(new Link().toSymbol(item.type))+"}</span> " : "")+} <b>{+item.name+}</b>
-								</dt>
-								<dd>{+resolveLinks(item.desc)+}</dd>
-							</for>
-							</dl>
-						</if>
-						<if test="member.returns.length">
-							<dl class="detailList">
-							<dt class="heading">Returns:</dt>
-							<for each="item" in="member.returns">
-								<dd>{+((item.type)?"<span class=\"light fixedFont\">{"+(new Link().toSymbol(item.type))+"}</span> " : "")+}{+resolveLinks(item.desc)+}</dd>
-							</for>
-							</dl>
-						</if>
-						<if test="member.requires.length">
-							<dl class="detailList">
-							<dt class="heading">Requires:</dt>
-							<for each="item" in="member.requires">
-								<dd>{+ resolveLinks(item) +}</dd>
-							</for>
-							</dl>
-						</if>
-						<if test="member.see.length">
-							<dl class="detailList">
-							<dt class="heading">See:</dt>
-							<for each="item" in="member.see">
-								<dd>{+ new Link().toSymbol(item) +}</dd>
-							</for>
-							</dl>
-						</if>
-
-					<if test="!$member_last"><hr /></if>
-				</for>
-			</if>
-			
-<!-- ============================== event details ========================= -->		
-			<if test="defined(ownEvents) && ownEvents.length">
-				<div class="sectionTitle">
-					Event Detail
-				</div>
-				<for each="member" in="ownEvents">
-					<a name="{+Link.symbolNameToLinkName(member)+}"> </a>
-					<div class="fixedFont">{!
-						if (member.isPrivate) output += "&lt;private&gt; ";
-						if (member.isInner) output += "&lt;inner&gt; ";
-						if (member.isStatic) output += "&lt;static&gt; ";
-					!}
-					
-					<if test="member.type"><span class="light">{{+new Link().toSymbol(member.type)+}}</span></if>
-					<if test="member.isStatic && member.memberOf != '_global_'"><span class="light">{+member.memberOf+}.</span></if><b>{+member.name+}</b>{+makeSignature(member.params)+}
-					
-					</div>
-					<div class="description">
-						{+resolveLinks(member.desc)+}
-						<if test="member.srcFile != data.srcFile">
-							<br />
-							<i>Defined in: </i> {+new Link().toSrc(member.srcFile)+}.
-						</if>
-						<if test="member.author"><br /><i>Author: </i>{+member.author+}.</if>
-					</div>
-					
-					<if test="member.example.length">
-					<for each="example" in="member.example">
-					<pre class="code">{+example+}</pre>
-					</for>
-					</if>
-					
-						<if test="member.params.length">
-							<dl class="detailList">
-							<dt class="heading">Parameters:</dt>
-							<for each="item" in="member.params">
-								<dt>
-									{+((item.type)?"<span class=\"light fixedFont\">{"+(new Link().toSymbol(item.type))+"}</span> " : "")+}<b>{+item.name+}</b>
-									<if test="item.isOptional"><i>Optional<if test="item.defaultValue">, Default: {+item.defaultValue+}</if></i></if>
-								</dt>
-								<dd>{+ resolveLinks(item.desc) +}</dd>
-							</for>
-							</dl>
-						</if>
-						<if test="member.deprecated">
-							<dl class="detailList">
-							<dt class="heading">Deprecated:</dt>
-							<dt>
-								{+ resolveLinks(member.deprecated) +}
-							</dt>
-							</dl>
-						</if>
-						<if test="member.since">
-							<dl class="detailList">
-							<dt class="heading">Since:</dt>
-								<dd>{+ member.since +}</dd>
-							</dl>
-							</dl>
-						</if>
-						<if test="member.exceptions.length">
-							<dl class="detailList">
-							<dt class="heading">Throws:</dt>
-							<for each="item" in="member.exceptions">
-								<dt>
-									{+((item.type)?"<span class=\"light fixedFont\">{"+(new Link().toSymbol(item.type))+"}</span> " : "")+} <b>{+item.name+}</b>
-								</dt>
-								<dd>{+ resolveLinks(item.desc) +}</dd>
-							</for>
-							</dl>
-						</if>
-						<if test="member.returns.length">
-							<dl class="detailList">
-							<dt class="heading">Returns:</dt>
-							<for each="item" in="member.returns">
-								<dd>{+((item.type)?"<span class=\"light fixedFont\">{"+(new Link().toSymbol(item.type))+"}</span> " : "")+}{+resolveLinks(item.desc)+}</dd>
-							</for>
-							</dl>
-						</if>
-						<if test="member.requires.length">
-							<dl class="detailList">
-							<dt class="heading">Requires:</dt>
-							<for each="item" in="member.requires">
-								<dd>{+ resolveLinks(item) +}</dd>
-							</for>
-							</dl>
-						</if>
-						<if test="member.see.length">
-							<dl class="detailList">
-							<dt class="heading">See:</dt>
-							<for each="item" in="member.see">
-								<dd>{+ new Link().toSymbol(item) +}</dd>
-							</for>
-							</dl>
-						</if>
-
-					<if test="!$member_last"><hr /></if>
-				</for>
-			</if>
-			
-			<hr />
-		</div>
-
-		
-<!-- ============================== footer ================================= -->
-		<div class="fineprint" style="clear:both">
-			<if test="JSDOC.opt.D.copyright">&copy;{+JSDOC.opt.D.copyright+}<br /></if>
-			Documentation generated by <a href="http://code.google.com/p/jsdoc-toolkit/" target="_blank">JsDoc Toolkit</a> {+JSDOC.VERSION+} on {+new Date()+}
-		</div>
-	</body>
-</html>
--- a/sbin/res/jsdoc/templates/jsdoc/index.tmpl	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,39 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-	<head>
-		<meta http-equiv="content-type" content="text/html; charset={+IO.encoding+}" />
-		
-		<title>JsDoc Reference - Index</title>
-		<meta name="generator" content="JsDoc Toolkit" />
-		
-		<style type="text/css">
-		{+include("static/default.css")+}
-		</style>
-	</head>
-	
-	<body>
-		{+include("static/header.html")+}
-		
-		<div id="index">
-			{+publish.classesIndex+}
-		</div>
-		
-		<div id="content">
-			<h1 class="classTitle">Class Index</h1>
-			
-			<for each="thisClass" in="data">
-			<div>
-				<h2>{+(new Link().toSymbol(thisClass.alias))+}</h2>
-				{+resolveLinks(summarize(thisClass.classDesc))+}
-			</div>
-			<hr />
-			</for>
-			
-		</div>
-		<div class="fineprint" style="clear:both">
-			<if test="JSDOC.opt.D.copyright">&copy;{+JSDOC.opt.D.copyright+}<br /></if>
-			Documentation generated by <a href="http://code.google.com/p/jsdoc-toolkit/" target="_blankt">JsDoc Toolkit</a> {+JSDOC.VERSION+} on {+new Date()+}
-		</div>
-	</body>
-</html>
\ No newline at end of file
--- a/sbin/res/jsdoc/templates/jsdoc/publish.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,201 +0,0 @@
-/** Called automatically by JsDoc Toolkit. */
-function publish(symbolSet) {
-	publish.conf = {  // trailing slash expected for dirs
-		ext:         ".html",
-		outDir:      JSDOC.opt.d || SYS.pwd+"../out/jsdoc/",
-		templatesDir: JSDOC.opt.t || SYS.pwd+"../templates/jsdoc/",
-		symbolsDir:  "symbols/",
-		srcDir:      "symbols/src/"
-	};
-	
-	// is source output is suppressed, just display the links to the source file
-	if (JSDOC.opt.s && defined(Link) && Link.prototype._makeSrcLink) {
-		Link.prototype._makeSrcLink = function(srcFilePath) {
-			return "&lt;"+srcFilePath+"&gt;";
-		}
-	}
-	
-	// create the folders and subfolders to hold the output
-	IO.mkPath((publish.conf.outDir+"symbols/src").split("/"));
-		
-	// used to allow Link to check the details of things being linked to
-	Link.symbolSet = symbolSet;
-
-	// create the required templates
-	try {
-		var classTemplate = new JSDOC.JsPlate(publish.conf.templatesDir+"class.tmpl");
-		var classesTemplate = new JSDOC.JsPlate(publish.conf.templatesDir+"allclasses.tmpl");
-	}
-	catch(e) {
-		print("Couldn't create the required templates: "+e);
-		quit();
-	}
-	
-	// some ustility filters
-	function hasNoParent($) {return ($.memberOf == "")}
-	function isaFile($) {return ($.is("FILE"))}
-	function isaClass($) {return ($.is("CONSTRUCTOR") || $.isNamespace)}
-	
-	// get an array version of the symbolset, useful for filtering
-	var symbols = symbolSet.toArray();
-	
-	// create the hilited source code files
-	var files = JSDOC.opt.srcFiles;
- 	for (var i = 0, l = files.length; i < l; i++) {
- 		var file = files[i];
- 		var srcDir = publish.conf.outDir + "symbols/src/";
-		makeSrcFile(file, srcDir);
- 	}
- 	
- 	// get a list of all the classes in the symbolset
- 	var classes = symbols.filter(isaClass).sort(makeSortby("alias"));
-	
-	// create a filemap in which outfiles must be to be named uniquely, ignoring case
-	if (JSDOC.opt.u) {
-		var filemapCounts = {};
-		Link.filemap = {};
-		for (var i = 0, l = classes.length; i < l; i++) {
-			var lcAlias = classes[i].alias.toLowerCase();
-			
-			if (!filemapCounts[lcAlias]) filemapCounts[lcAlias] = 1;
-			else filemapCounts[lcAlias]++;
-			
-			Link.filemap[classes[i].alias] = 
-				(filemapCounts[lcAlias] > 1)?
-				lcAlias+"_"+filemapCounts[lcAlias] : lcAlias;
-		}
-	}
-	
-	// create a class index, displayed in the left-hand column of every class page
-	Link.base = "../";
- 	publish.classesIndex = classesTemplate.process(classes); // kept in memory
-	
-	// create each of the class pages
-	for (var i = 0, l = classes.length; i < l; i++) {
-		var symbol = classes[i];
-		
-		symbol.events = symbol.getEvents();   // 1 order matters
-		symbol.methods = symbol.getMethods(); // 2
-		
-		Link.currentSymbol= symbol;
-		var output = "";
-		output = classTemplate.process(symbol);
-		
-		IO.saveFile(publish.conf.outDir+"symbols/", ((JSDOC.opt.u)? Link.filemap[symbol.alias] : symbol.alias) + publish.conf.ext, output);
-	}
-	
-	// regenerate the index with different relative links, used in the index pages
-	Link.base = "";
-	publish.classesIndex = classesTemplate.process(classes);
-	
-	// create the class index page
-	try {
-		var classesindexTemplate = new JSDOC.JsPlate(publish.conf.templatesDir+"index.tmpl");
-	}
-	catch(e) { print(e.message); quit(); }
-	
-	var classesIndex = classesindexTemplate.process(classes);
-	IO.saveFile(publish.conf.outDir, "index"+publish.conf.ext, classesIndex);
-	classesindexTemplate = classesIndex = classes = null;
-	
-	// create the file index page
-	try {
-		var fileindexTemplate = new JSDOC.JsPlate(publish.conf.templatesDir+"allfiles.tmpl");
-	}
-	catch(e) { print(e.message); quit(); }
-	
-	var documentedFiles = symbols.filter(isaFile); // files that have file-level docs
-	var allFiles = []; // not all files have file-level docs, but we need to list every one
-	
-	for (var i = 0; i < files.length; i++) {
-		allFiles.push(new JSDOC.Symbol(files[i], [], "FILE", new JSDOC.DocComment("/** */")));
-	}
-	
-	for (var i = 0; i < documentedFiles.length; i++) {
-		var offset = files.indexOf(documentedFiles[i].alias);
-		allFiles[offset] = documentedFiles[i];
-	}
-		
-	allFiles = allFiles.sort(makeSortby("name"));
-
-	// output the file index page
-	var filesIndex = fileindexTemplate.process(allFiles);
-	IO.saveFile(publish.conf.outDir, "files"+publish.conf.ext, filesIndex);
-	fileindexTemplate = filesIndex = files = null;
-}
-
-
-/** Just the first sentence (up to a full stop). Should not break on dotted variable names. */
-function summarize(desc) {
-	if (typeof desc != "undefined")
-		return desc.match(/([\w\W]+?\.)[^a-z0-9_$]/i)? RegExp.$1 : desc;
-}
-
-/** Make a symbol sorter by some attribute. */
-function makeSortby(attribute) {
-	return function(a, b) {
-		if (a[attribute] != undefined && b[attribute] != undefined) {
-			a = a[attribute].toLowerCase();
-			b = b[attribute].toLowerCase();
-			if (a < b) return -1;
-			if (a > b) return 1;
-			return 0;
-		}
-	}
-}
-
-/** Pull in the contents of an external file at the given path. */
-function include(path) {
-	var path = publish.conf.templatesDir+path;
-	return IO.readFile(path);
-}
-
-/** Turn a raw source file into a code-hilited page in the docs. */
-function makeSrcFile(path, srcDir, name) {
-	if (JSDOC.opt.s) return;
-	
-	if (!name) {
-		name = path.replace(/\.\.?[\\\/]/g, "").replace(/[\\\/]/g, "_");
-		name = name.replace(/\:/g, "_");
-	}
-	
-	var src = {path: path, name:name, charset: IO.encoding, hilited: ""};
-	
-	if (defined(JSDOC.PluginManager)) {
-		JSDOC.PluginManager.run("onPublishSrc", src);
-	}
-
-	if (src.hilited) {
-		IO.saveFile(srcDir, name+publish.conf.ext, src.hilited);
-	}
-}
-
-/** Build output for displaying function parameters. */
-function makeSignature(params) {
-	if (!params) return "()";
-	var signature = "("
-	+
-	params.filter(
-		function($) {
-			return $.name.indexOf(".") == -1; // don't show config params in signature
-		}
-	).map(
-		function($) {
-			return $.name;
-		}
-	).join(", ")
-	+
-	")";
-	return signature;
-}
-
-/** Find symbol {@link ...} strings in text and turn into html links */
-function resolveLinks(str, from) {
-	str = str.replace(/\{@link ([^} ]+) ?\}/gi,
-		function(match, symbolName) {
-			return new Link().toSymbol(symbolName);
-		}
-	);
-	
-	return str;
-}
--- a/sbin/res/jsdoc/templates/jsdoc/static/default.css	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,162 +0,0 @@
-/* default.css */
-body
-{
-	font: 12px "Lucida Grande", Tahoma, Arial, Helvetica, sans-serif;
-	width: 800px;
-}
-
-.header
-{
-	clear: both;
-	background-color: #ccc;
-	padding: 8px;
-}
-
-h1
-{
-	font-size: 150%;
-	font-weight: bold;
-	padding: 0;
-	margin: 1em 0 0 .3em;
-}
-
-hr
-{
-	border: none 0;
-	border-top: 1px solid #7F8FB1;
-	height: 1px;
-}
-
-pre.code
-{
-	display: block;
-	padding: 8px;
-	border: 1px dashed #ccc;
-}
-
-#index
-{
-	margin-top: 24px;
-	float: left;
-	width: 160px;
-	position: absolute;
-	left: 8px;
-	background-color: #F3F3F3;
-	padding: 8px;
-}
-
-#content
-{
-	margin-left: 190px;
-	width: 600px;
-}
-
-.classList
-{
-	list-style-type: none;
-	padding: 0;
-	margin: 0 0 0 8px;
-	font-family: arial, sans-serif;
-	font-size: 1em;
-	overflow: auto;
-}
-
-.classList li
-{
-	padding: 0;
-	margin: 0 0 8px 0;
-}
-
-.summaryTable { width: 100%; }
-
-h1.classTitle
-{
-	font-size:170%;
-	line-height:130%;
-}
-
-h2 { font-size: 110%; }
-caption, div.sectionTitle
-{
-	background-color: #7F8FB1;
-	color: #fff;
-	font-size:130%;
-	text-align: left;
-	padding: 2px 6px 2px 6px;
-	border: 1px #7F8FB1 solid;
-}
-
-div.sectionTitle { margin-bottom: 8px; }
-.summaryTable thead { display: none; }
-
-.summaryTable td
-{
-	vertical-align: top;
-	padding: 4px;
-	border-bottom: 1px #7F8FB1 solid;
-	border-right: 1px #7F8FB1 solid;
-}
-
-/*col#summaryAttributes {}*/
-.summaryTable td.attributes
-{
-	border-left: 1px #7F8FB1 solid;
-	width: 140px;
-	text-align: right;
-}
-
-td.attributes, .fixedFont
-{
-	line-height: 15px;
-	color: #002EBE;
-	font-family: "Courier New",Courier,monospace;
-	font-size: 13px;
-}
-
-.summaryTable td.nameDescription
-{
-	text-align: left;
-	font-size: 13px;
-	line-height: 15px;
-}
-
-.summaryTable td.nameDescription, .description
-{
-	line-height: 15px;
-	padding: 4px;
-	padding-left: 4px;
-}
-
-.summaryTable { margin-bottom: 8px; }
-
-ul.inheritsList
-{
-	list-style: square;
-	margin-left: 20px;
-	padding-left: 0;
-}
-
-.detailList {
-	margin-left: 20px; 
-	line-height: 15px;
-}
-.detailList dt { margin-left: 20px; }
-
-.detailList .heading
-{
-	font-weight: bold;
-	padding-bottom: 6px;
-	margin-left: 0;
-}
-
-.light, td.attributes, .light a:link, .light a:visited
-{
-	color: #777;
-	font-style: italic;
-}
-
-.fineprint
-{
-	text-align: right;
-	font-size: 10px;
-}
\ No newline at end of file
--- a/sbin/res/jsdoc/templates/jsdoc/static/header.html	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-<div id="header">
-</div>
\ No newline at end of file
--- a/sbin/res/jsdoc/templates/jsdoc/static/index.html	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,19 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
-        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-	<meta http-equiv="content-type" content="text/html; charset=utf-8" />
-	<title>Generated Javascript Documentation</title>
-</head>
-<frameset cols="20%,80%">
-	<frame src="allclasses-frame.html" name="packageFrame" />
-	<frame src="splash.html" name="classFrame" />
-	<noframes>
-		<body>
-		<p>
-		This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client.
-		</p>
-		</body>
-	</noframes>
-</frameset>
-</html>
\ No newline at end of file
--- a/sbin/res/jsdoc/templates/jsdoc/symbol.tmpl	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,35 +0,0 @@
-<symbol alias="{+data.alias+}">
-	<name>{+data.name+}</name>
-	<memberOf>{+data.memberOf+}</memberOf>
-	<isStatic>{+data.isStatic+}</isStatic>
-	<isa>{+data.isa+}</isa>
-	<desc>{+data.desc+}</desc>
-	<classDesc>{+data.classDesc+}</classDesc>
-	
-	<methods><for each="method" in="data.methods">
-		<method>
-			<name>{+method.name+}</name>
-			<memberOf>{+method.memberOf+}</memberOf>
-			<isStatic>{+method.isStatic+}</isStatic>
-			<desc>{+method.desc+}</desc>
-			<params><for each="param" in="method.params">
-				<param>
-					<type>{+param.type+}</type>
-					<name>{+param.name+}</name>
-					<desc>{+param.desc+}</desc>
-					<defaultValue>{+param.defaultValue+}</defaultValue>
-				</param></for>
-			</params>
-		</method></for>
-	</methods>
-	
-	<properties><for each="property" in="data.properties">
-		<property>
-			<name>{+property.name+}</name>
-			<memberOf>{+property.memberOf+}</memberOf>
-			<isStatic>{+property.isStatic+}</isStatic>
-			<desc>{+property.desc+}</desc>
-			<type>{+property.type+}</type>
-		</property></for>
-	</properties>
-</symbol>
--- a/sbin/res/jslint-wrapper.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,51 +0,0 @@
-/* source comes from a similar jquery script */
-/* run it like this :  java -jar rhino.jar jslint-wrapper.js file.js */
-
-
-if (arguments.length == 1) {
-  jslint = "jslint.js"
-  srcfile = arguments[0];
-} else if (arguments.length != 2) {
-  print("jslint-wrapper jslint.js myfile.js");
-  quit();
-} else {
-  var jslint = arguments[0];
-  var srcfile = arguments[1];
-}
-
-src = readFile(srcfile, "utf8");
-load(jslint);
-  
-JSLINT(src, { browser: true, forin: true, maxerr: 5 });
-
-//All of the following are known issues that we think are 'ok'
-//(in contradiction with JSLint) more information here:
-//http://docs.jquery.com/JQuery_Core_Style_Guidelines
-var ok = {
-	"Expected an identifier and instead saw 'undefined' (a reserved word).": true,
-	"Use '===' to compare with 'null'.": true,
-	"Use '!==' to compare with 'null'.": true,
-	"Expected an assignment or function call and instead saw an expression.": true,
-	"Expected a 'break' statement before 'case'.": true,
-	"'e' is already defined.": true,
-  "Expected exactly one space between 'function' and '('": true
-};
-
-var e = JSLINT.errors, found = 0, w;
-
-for ( var i = 0; i < e.length; i++ ) {
-	w = e[i];
-
-	if ( !ok[ w.reason ] ) {
-		found++;
-		print( "\n" + w.evidence + "\n" );
-		print( "    Problem at line " + w.line + " character " + w.character + ": " + w.reason );
-	}
-}
-
-if ( found > 0 ) {
-	print( "\n" + found + " Error(s) found.\n" );
-
-} else {
-	print( "JSLint check passed.\n" );
-}
--- a/sbin/res/jslint.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,6917 +0,0 @@
-// jslint.js
-// 2011-10-17
-
-// Copyright (c) 2002 Douglas Crockford  (www.JSLint.com)
-
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-
-// The Software shall be used for Good, not Evil.
-
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-// WARNING: JSLint will hurt your feelings.
-
-// JSLINT is a global function. It takes two parameters.
-
-//     var myResult = JSLINT(source, option);
-
-// The first parameter is either a string or an array of strings. If it is a
-// string, it will be split on '\n' or '\r'. If it is an array of strings, it
-// is assumed that each string represents one line. The source can be a
-// JavaScript text, or HTML text, or a JSON text, or a CSS text.
-
-// The second parameter is an optional object of options that control the
-// operation of JSLINT. Most of the options are booleans: They are all
-// optional and have a default value of false. One of the options, predef,
-// can be an array of names, which will be used to declare global variables,
-// or an object whose keys are used as global names, with a boolean value
-// that determines if they are assignable.
-
-// If it checks out, JSLINT returns true. Otherwise, it returns false.
-
-// If false, you can inspect JSLINT.errors to find out the problems.
-// JSLINT.errors is an array of objects containing these properties:
-
-//  {
-//      line      : The line (relative to 0) at which the lint was found
-//      character : The character (relative to 0) at which the lint was found
-//      reason    : The problem
-//      evidence  : The text line in which the problem occurred
-//      raw       : The raw message before the details were inserted
-//      a         : The first detail
-//      b         : The second detail
-//      c         : The third detail
-//      d         : The fourth detail
-//  }
-
-// If a stopping error was found, a null will be the last element of the
-// JSLINT.errors array. A stopping error means that JSLint was not confident
-// enough to continue. It does not necessarily mean that the error was
-// especially heinous.
-
-// You can request a Function Report, which shows all of the functions
-// and the parameters and vars that they use. This can be used to find
-// implied global variables and other problems. The report is in HTML and
-// can be inserted in an HTML <body>.
-
-//     var myReport = JSLINT.report(errors_only);
-
-// If errors_only is true, then the report will be limited to only errors.
-
-// You can request a data structure that contains JSLint's results.
-
-//     var myData = JSLINT.data();
-
-// It returns a structure with this form:
-
-//     {
-//         errors: [
-//             {
-//                 line: NUMBER,
-//                 character: NUMBER,
-//                 reason: STRING,
-//                 evidence: STRING
-//             }
-//         ],
-//         functions: [
-//             {
-//                 name: STRING,
-//                 line: NUMBER,
-//                 last: NUMBER,
-//                 params: [
-//                     {
-//                         string: STRING
-//                     }
-//                 ],
-//                 closure: [
-//                     STRING
-//                 ],
-//                 var: [
-//                     STRING
-//                 ],
-//                 exception: [
-//                     STRING
-//                 ],
-//                 outer: [
-//                     STRING
-//                 ],
-//                 unused: [
-//                     STRING
-//                 ],
-//                 undef: [
-//                     STRING
-//                 ],
-//                 global: [
-//                     STRING
-//                 ],
-//                 label: [
-//                     STRING
-//                 ]
-//             }
-//         ],
-//         globals: [
-//             STRING
-//         ],
-//         member: {
-//             STRING: NUMBER
-//         },
-//         urls: [
-//             STRING
-//         ],
-//         json: BOOLEAN
-//     }
-
-// Empty arrays will not be included.
-
-// You can obtain the parse tree that JSLint constructed while parsing. The
-// latest tree is kept in JSLINT.tree. A nice stringication can be produced
-// with
-
-//     JSON.stringify(JSLINT.tree, [
-//         'string',  'arity', 'name',  'first',
-//         'second', 'third', 'block', 'else'
-//     ], 4));
-
-// JSLint provides three directives. They look like slashstar comments, and
-// allow for setting options, declaring global variables, and establishing a
-// set of allowed property names.
-
-// These directives respect function scope.
-
-// The jslint directive is a special comment that can set one or more options.
-// The current option set is
-
-//     adsafe     true, if ADsafe rules should be enforced
-//     bitwise    true, if bitwise operators should be allowed
-//     browser    true, if the standard browser globals should be predefined
-//     cap        true, if upper case HTML should be allowed
-//     confusion  true, if types can be used inconsistently
-//     'continue' true, if the continuation statement should be tolerated
-//     css        true, if CSS workarounds should be tolerated
-//     debug      true, if debugger statements should be allowed
-//     devel      true, if logging should be allowed (console, alert, etc.)
-//     eqeq       true, if == should be allowed
-//     es5        true, if ES5 syntax should be allowed
-//     evil       true, if eval should be allowed
-//     forin      true, if for in statements need not filter
-//     fragment   true, if HTML fragments should be allowed
-//     indent     the indentation factor
-//     maxerr     the maximum number of errors to allow
-//     maxlen     the maximum length of a source line
-//     newcap     true, if constructor names capitalization is ignored
-//     node       true, if Node.js globals should be predefined
-//     nomen      true, if names may have dangling _
-//     on         true, if HTML event handlers should be allowed
-//     passfail   true, if the scan should stop on first error
-//     plusplus   true, if increment/decrement should be allowed
-//     properties true, if all property names must be declared with /*properties*/
-//     regexp     true, if the . should be allowed in regexp literals
-//     rhino      true, if the Rhino environment globals should be predefined
-//     undef      true, if variables can be declared out of order
-//     unparam    true, if unused parameters should be tolerated
-//     safe       true, if use of some browser features should be restricted
-//     sloppy     true, if the 'use strict'; pragma is optional
-//     sub        true, if all forms of subscript notation are tolerated
-//     vars       true, if multiple var statements per function should be allowed
-//     white      true, if sloppy whitespace is tolerated
-//     widget     true  if the Yahoo Widgets globals should be predefined
-//     windows    true, if MS Windows-specific globals should be predefined
-
-// For example:
-
-/*jslint
-    evil: true, nomen: true, regexp: true
-*/
-
-// The properties directive declares an exclusive list of property names.
-// Any properties named in the program that are not in the list will
-// produce a warning.
-
-// For example:
-
-/*properties
-    '\b': string, '\t': string, '\n': string, '\f': string, '\r': string,
-    '!=': boolean, '!==': boolean, '"': string, '%': boolean, '\'': string,
-    '(begin)', '(breakage)': number, '(complexity)', '(confusion)': boolean,
-    '(context)': object, '(error)', '(identifier)', '(line)': number,
-    '(loopage)': number, '(name)', '(old_property_type)', '(params)',
-    '(scope)': object, '(token)', '(vars)', '(verb)', '*': boolean,
-    '+': boolean, '-': boolean, '/': *, '<': boolean, '<=': boolean,
-    '==': boolean, '===': boolean, '>': boolean, '>=': boolean,
-    ADSAFE: boolean, Array, Date, E: string, Function, LN10: string,
-    LN2: string, LOG10E: string, LOG2E: string, MAX_VALUE: string,
-    MIN_VALUE: string, NEGATIVE_INFINITY: string, Object, PI: string,
-    POSITIVE_INFINITY: string, SQRT1_2: string, SQRT2: string, '\\': string,
-    a: object, a_label: string, a_not_allowed: string, a_not_defined: string,
-    a_scope: string, abbr: object, acronym: object, address: object, adsafe,
-    adsafe_a: string, adsafe_autocomplete: string, adsafe_bad_id: string,
-    adsafe_div: string, adsafe_fragment: string, adsafe_go: string,
-    adsafe_html: string, adsafe_id: string, adsafe_id_go: string,
-    adsafe_lib: string, adsafe_lib_second: string, adsafe_missing_id: string,
-    adsafe_name_a: string, adsafe_placement: string, adsafe_prefix_a: string,
-    adsafe_script: string, adsafe_source: string, adsafe_subscript_a: string,
-    adsafe_tag: string, all: boolean, already_defined: string, and: string,
-    applet: object, apply: string, approved: array, area: object,
-    arity: string, article: object, aside: object, assign: boolean,
-    assign_exception: string, assignment_function_expression: string,
-    at: number, attribute_case_a: string, audio: object, autocomplete: string,
-    avoid_a: string, b: *, background: array, 'background-attachment': array,
-    'background-color': array, 'background-image': array,
-    'background-position': array, 'background-repeat': array,
-    bad_assignment: string, bad_color_a: string, bad_constructor: string,
-    bad_entity: string, bad_html: string, bad_id_a: string, bad_in_a: string,
-    bad_invocation: string, bad_name_a: string, bad_new: string,
-    bad_number: string, bad_operand: string, bad_style: string,
-    bad_type: string, bad_url_a: string, bad_wrap: string, base: object,
-    bdo: object, big: object, bind: string, bitwise: boolean, block: array,
-    blockquote: object, body: object, border: array, 'border-bottom': array,
-    'border-bottom-color', 'border-bottom-left-radius',
-    'border-bottom-right-radius', 'border-bottom-style': array,
-    'border-bottom-width', 'border-collapse': array, 'border-color': array,
-    'border-left': array, 'border-left-color', 'border-left-style': array,
-    'border-left-width', 'border-radius', 'border-right': array,
-    'border-right-color', 'border-right-style': array, 'border-right-width',
-    'border-spacing': array, 'border-style': array, 'border-top': array,
-    'border-top-color', 'border-top-left-radius', 'border-top-right-radius',
-    'border-top-style': array, 'border-top-width', 'border-width': array,
-    bottom: array, br: object, braille: boolean, browser: boolean,
-    button: object, c, call: string, canvas: object, cap, caption: object,
-    'caption-side': array, ceil: string, center: object, charAt: *,
-    charCodeAt: *, character, cite: object, clear: array, clip: array, closure,
-    cm: boolean, code: object, col: object, colgroup: object, color,
-    combine_var: string, command: object, concat: string,
-    conditional_assignment: string, confusing_a: string,
-    confusing_regexp: string, confusion: boolean, constructor: string,
-    constructor_name_a: string, content: array, continue, control_a: string,
-    'counter-increment': array, 'counter-reset': array, create: *, css: string,
-    cursor: array, d, dangerous_comment: string, dangling_a: string,
-    data: function object, datalist: object, dd: object, debug,
-    defineProperties: string, defineProperty: string, del: object,
-    deleted: string, details: object, devel: boolean, dfn: object,
-    dialog: object, dir: object, direction: array, display: array,
-    disrupt: boolean, div: object, dl: object, dt: object, duplicate_a: string,
-    edge: string, edition: string, else, em: *, embed: object,
-    embossed: boolean, empty: boolean, 'empty-cells': array,
-    empty_block: string, empty_case: string, empty_class: string,
-    entityify: function, eqeq, errors: array, es5: string, eval, every: string,
-    evidence, evil: string, ex: boolean, exception, exec: *,
-    expected_a: string, expected_a_at_b_c: string, expected_a_b: string,
-    expected_a_b_from_c_d: string, expected_at_a: string,
-    expected_attribute_a: string, expected_attribute_value_a: string,
-    expected_class_a: string, expected_fraction_a: string,
-    expected_id_a: string, expected_identifier_a: string,
-    expected_identifier_a_reserved: string, expected_lang_a: string,
-    expected_linear_a: string, expected_media_a: string,
-    expected_name_a: string, expected_nonstandard_style_attribute: string,
-    expected_number_a: string, expected_operator_a: string,
-    expected_percent_a: string, expected_positive_a: string,
-    expected_pseudo_a: string, expected_selector_a: string,
-    expected_small_a: string, expected_space_a_b: string,
-    expected_string_a: string, expected_style_attribute: string,
-    expected_style_pattern: string, expected_tagname_a: string,
-    expected_type_a: string, f: string, fieldset: object, figure: object,
-    filter: *, first: *, flag, float: array, floor: *, font: *, 'font-family',
-    'font-size': array, 'font-size-adjust': array, 'font-stretch': array,
-    'font-style': array, 'font-variant': array, 'font-weight': array,
-    footer: object, for, forEach: *, for_if: string, forin, form: object,
-    fragment, frame: object, frameset: object, freeze: string, from: number,
-    fromCharCode: function, fud: function, funct: object, function,
-    function_block: string, function_eval: string, function_loop: string,
-    function_statement: string, function_strict: string, functions: array,
-    getDate: string, getDay: string, getFullYear: string, getHours: string,
-    getMilliseconds: string, getMinutes: string, getMonth: string,
-    getOwnPropertyDescriptor: string, getOwnPropertyNames: string,
-    getPrototypeOf: string, getSeconds: string, getTime: string,
-    getTimezoneOffset: string, getUTCDate: string, getUTCDay: string,
-    getUTCFullYear: string, getUTCHours: string, getUTCMilliseconds: string,
-    getUTCMinutes: string, getUTCMonth: string, getUTCSeconds: string,
-    getYear: string, global, globals, h1: object, h2: object, h3: object,
-    h4: object, h5: object, h6: object, handheld: boolean, hasOwnProperty: *,
-    head: object, header: object, height: array, hgroup: object, hr: object,
-    'hta:application': object, html: *, html_confusion_a: string,
-    html_handlers: string, i: object, id: string, identifier: boolean,
-    identifier_function: string, iframe: object, img: object, immed: boolean,
-    implied_evil: string, in, indent: number, indexOf: *, infix_in: string,
-    init: function, input: object, ins: object, insecure_a: string,
-    isAlpha: function, isArray: function boolean, isDigit: function,
-    isExtensible: string, isFrozen: string, isNaN: string,
-    isPrototypeOf: string, isSealed: string, join: *, jslint: function boolean,
-    json: boolean, kbd: object, keygen: object, keys: *, label: object,
-    label_a_b: string, labeled: boolean, lang: string, lastIndex: string,
-    lastIndexOf: *, lbp: number, leading_decimal_a: string, led: function,
-    left: array, legend: object, length: *, 'letter-spacing': array,
-    li: object, lib: boolean, line: number, 'line-height': array, link: object,
-    'list-style': array, 'list-style-image': array,
-    'list-style-position': array, 'list-style-type': array, map: *,
-    margin: array, 'margin-bottom', 'margin-left', 'margin-right',
-    'margin-top', mark: object, 'marker-offset': array, match: function,
-    'max-height': array, 'max-width': array, maxerr: number,
-    maxlen: number, member: object, menu: object, message, meta: object,
-    meter: object, 'min-height': function, 'min-width': function,
-    missing_a: string, missing_a_after_b: string, missing_option: string,
-    missing_property: string, missing_space_a_b: string, missing_url: string,
-    missing_use_strict: string, mixed: string, mm: boolean, mode: string,
-    move_invocation: string, move_var: string, n: string, name: string,
-    name_function: string, nav: object, nested_comment: string,
-    newcap: boolean, node: boolean, noframes: object, nomen, noscript: object,
-    not: string, not_a_constructor: string, not_a_defined: string,
-    not_a_function: string, not_a_label: string, not_a_scope: string,
-    not_greater: string, now: string, nud: function, number: number,
-    object: object, ol: object, on, opacity, open: boolean, optgroup: object,
-    option: object, outer: regexp, outline: array, 'outline-color': array,
-    'outline-style': array, 'outline-width', output: object, overflow: array,
-    'overflow-x': array, 'overflow-y': array, p: object, padding: array,
-    'padding-bottom': function, 'padding-left': function,
-    'padding-right': function, 'padding-top': function,
-    'page-break-after': array, 'page-break-before': array, param: object,
-    parameter_a_get_b: string, parameter_set_a: string, params: array,
-    paren: boolean, parent: string, parse: string, passfail, pc: boolean,
-    plusplus, pop: *, position: array, postscript: boolean, pre: object,
-    predef, preventExtensions: string, print: boolean, progress: object,
-    projection: boolean, properties: boolean, propertyIsEnumerable: string,
-    prototype: string, pt: boolean, push: *, px: boolean, q: object, quote,
-    quotes: array, r: string, radix: string, range: function, raw,
-    read_only: string, reason, redefinition_a: string, reduce: string,
-    reduceRight: string, regexp, replace: function, report: function,
-    reserved: boolean, reserved_a: string, reverse: string, rhino: boolean,
-    right: array, rp: object, rt: object, ruby: object, safe: boolean,
-    samp: object, scanned_a_b: string, screen: boolean, script: object,
-    seal: string, search: function, second: *, section: object, select: object,
-    setDate: string, setDay: string, setFullYear: string, setHours: string,
-    setMilliseconds: string, setMinutes: string, setMonth: string,
-    setSeconds: string, setTime: string, setTimezoneOffset: string,
-    setUTCDate: string, setUTCDay: string, setUTCFullYear: string,
-    setUTCHours: string, setUTCMilliseconds: string, setUTCMinutes: string,
-    setUTCMonth: string, setUTCSeconds: string, setYear: string, shift: *,
-    slash_equal: string, slice: string, sloppy, small: object, some: string,
-    sort: *, source: object, span: object, speech: boolean, splice: string,
-    split: function, src, statement_block: string, stopping: string,
-    strange_loop: string, strict: string, string: string, stringify: string,
-    strong: object, style: *, styleproperty: regexp, sub: object,
-    subscript: string, substr: *, substring: string, sup: object,
-    supplant: function, t: string, table: object, 'table-layout': array,
-    tag_a_in_b: string, tbody: object, td: object, test: *,
-    'text-align': array, 'text-decoration': array, 'text-indent': function,
-    'text-shadow': array, 'text-transform': array, textarea: object,
-    tfoot: object, th: object, thead: object, third: array, thru: number,
-    time: object, title: object, toDateString: string, toExponential: string,
-    toFixed: string, toISOString: string, toJSON: string,
-    toLocaleDateString: string, toLocaleLowerCase: string,
-    toLocaleString: string, toLocaleTimeString: string,
-    toLocaleUpperCase: string, toLowerCase: *, toPrecision: string,
-    toString: function, toTimeString: string, toUTCString: string,
-    toUpperCase: *, token: function, too_long: string, too_many: string,
-    top: array, tr: object, trailing_decimal_a: string, tree: string,
-    trim: string, tt: object, tty: boolean, tv: boolean, type: string,
-    type_confusion_a_b: string, u: object, ul: object, unclosed: string,
-    unclosed_comment: string, unclosed_regexp: string, undef: boolean,
-    undefined, unescaped_a: string, unexpected_a: string,
-    unexpected_char_a_b: string, unexpected_comment: string,
-    unexpected_property_a: string, unexpected_space_a_b: string,
-    'unicode-bidi': array, unnecessary_initialize: string,
-    unnecessary_use: string, unparam, unreachable_a_b: string,
-    unrecognized_style_attribute_a: string, unrecognized_tag_a: string,
-    unsafe: string, unshift: string, unused: array, url: string, urls: array,
-    use_array: string, use_braces: string, use_charAt: string,
-    use_object: string, use_or: string, use_param: string,
-    used_before_a: string, valueOf: string, var: object, var_a_not: string,
-    vars, 'vertical-align': array, video: object, visibility: array,
-    warn: boolean, was: object, weird_assignment: string,
-    weird_condition: string, weird_new: string, weird_program: string,
-    weird_relation: string, weird_ternary: string, white: boolean,
-    'white-space': array, widget: boolean, width: array, windows: boolean,
-    'word-spacing': array, 'word-wrap': array, wrap: boolean,
-    wrap_immediate: string, wrap_regexp: string, write_is_wrong: string,
-    writeable: boolean, 'z-index': array
-*/
-
-// The global directive is used to declare global variables that can
-// be accessed by the program. If a declaration is true, then the variable
-// is writeable. Otherwise, it is read-only.
-
-// We build the application inside a function so that we produce only a single
-// global variable. That function will be invoked immediately, and its return
-// value is the JSLINT function itself. That function is also an object that
-// can contain data and other functions.
-
-var JSLINT = (function () {
-    'use strict';
-
-    function array_to_object(array, value) {
-
-// Make an object from an array of keys and a common value.
-
-        var i, length = array.length, object = {};
-        for (i = 0; i < length; i += 1) {
-            object[array[i]] = value;
-        }
-        return object;
-    }
-
-
-    var adsafe_id,      // The widget's ADsafe id.
-        adsafe_may,     // The widget may load approved scripts.
-        adsafe_top,     // At the top of the widget script.
-        adsafe_went,    // ADSAFE.go has been called.
-        anonname,       // The guessed name for anonymous functions.
-        approved,       // ADsafe approved urls.
-
-// These are operators that should not be used with the ! operator.
-
-        bang = {
-            '<'  : true,
-            '<=' : true,
-            '==' : true,
-            '===': true,
-            '!==': true,
-            '!=' : true,
-            '>'  : true,
-            '>=' : true,
-            '+'  : true,
-            '-'  : true,
-            '*'  : true,
-            '/'  : true,
-            '%'  : true
-        },
-
-// These are property names that should not be permitted in the safe subset.
-
-        banned = array_to_object([
-            'arguments', 'callee', 'caller', 'constructor', 'eval', 'prototype',
-            'stack', 'unwatch', 'valueOf', 'watch'
-        ], true),
-        begin,          // The root token
-
-// browser contains a set of global names that are commonly provided by a
-// web browser environment.
-
-        browser = array_to_object([
-            'clearInterval', 'clearTimeout', 'document', 'event', 'frames',
-            'history', 'Image', 'localStorage', 'location', 'name', 'navigator',
-            'Option', 'parent', 'screen', 'sessionStorage', 'setInterval',
-            'setTimeout', 'Storage', 'window', 'XMLHttpRequest'
-        ], false),
-
-// bundle contains the text messages.
-
-        bundle = {
-            a_label: "'{a}' is a statement label.",
-            a_not_allowed: "'{a}' is not allowed.",
-            a_not_defined: "'{a}' is not defined.",
-            a_scope: "'{a}' used out of scope.",
-            adsafe_a: "ADsafe violation: '{a}'.",
-            adsafe_autocomplete: "ADsafe autocomplete violation.",
-            adsafe_bad_id: "ADSAFE violation: bad id.",
-            adsafe_div: "ADsafe violation: Wrap the widget in a div.",
-            adsafe_fragment: "ADSAFE: Use the fragment option.",
-            adsafe_go: "ADsafe violation: Misformed ADSAFE.go.",
-            adsafe_html: "Currently, ADsafe does not operate on whole HTML " +
-                "documents. It operates on <div> fragments and .js files.",
-            adsafe_id: "ADsafe violation: id does not match.",
-            adsafe_id_go: "ADsafe violation: Missing ADSAFE.id or ADSAFE.go.",
-            adsafe_lib: "ADsafe lib violation.",
-            adsafe_lib_second: "ADsafe: The second argument to lib must be a function.",
-            adsafe_missing_id: "ADSAFE violation: missing ID_.",
-            adsafe_name_a: "ADsafe name violation: '{a}'.",
-            adsafe_placement: "ADsafe script placement violation.",
-            adsafe_prefix_a: "ADsafe violation: An id must have a '{a}' prefix",
-            adsafe_script: "ADsafe script violation.",
-            adsafe_source: "ADsafe unapproved script source.",
-            adsafe_subscript_a: "ADsafe subscript '{a}'.",
-            adsafe_tag: "ADsafe violation: Disallowed tag '{a}'.",
-            already_defined: "'{a}' is already defined.",
-            and: "The '&&' subexpression should be wrapped in parens.",
-            assign_exception: "Do not assign to the exception parameter.",
-            assignment_function_expression: "Expected an assignment or " +
-                "function call and instead saw an expression.",
-            attribute_case_a: "Attribute '{a}' not all lower case.",
-            avoid_a: "Avoid '{a}'.",
-            bad_assignment: "Bad assignment.",
-            bad_color_a: "Bad hex color '{a}'.",
-            bad_constructor: "Bad constructor.",
-            bad_entity: "Bad entity.",
-            bad_html: "Bad HTML string",
-            bad_id_a: "Bad id: '{a}'.",
-            bad_in_a: "Bad for in variable '{a}'.",
-            bad_invocation: "Bad invocation.",
-            bad_name_a: "Bad name: '{a}'.",
-            bad_new: "Do not use 'new' for side effects.",
-            bad_number: "Bad number '{a}'.",
-            bad_operand: "Bad operand.",
-            bad_style: "Bad style.",
-            bad_type: "Bad type.",
-            bad_url_a: "Bad url '{a}'.",
-            bad_wrap: "Do not wrap function literals in parens unless they " +
-                "are to be immediately invoked.",
-            combine_var: "Combine this with the previous 'var' statement.",
-            conditional_assignment: "Expected a conditional expression and " +
-                "instead saw an assignment.",
-            confusing_a: "Confusing use of '{a}'.",
-            confusing_regexp: "Confusing regular expression.",
-            constructor_name_a: "A constructor name '{a}' should start with " +
-                "an uppercase letter.",
-            control_a: "Unexpected control character '{a}'.",
-            css: "A css file should begin with @charset 'UTF-8';",
-            dangling_a: "Unexpected dangling '_' in '{a}'.",
-            dangerous_comment: "Dangerous comment.",
-            deleted: "Only properties should be deleted.",
-            duplicate_a: "Duplicate '{a}'.",
-            empty_block: "Empty block.",
-            empty_case: "Empty case.",
-            empty_class: "Empty class.",
-            es5: "This is an ES5 feature.",
-            evil: "eval is evil.",
-            expected_a: "Expected '{a}'.",
-            expected_a_b: "Expected '{a}' and instead saw '{b}'.",
-            expected_a_b_from_c_d: "Expected '{a}' to match '{b}' from line " +
-                "{c} and instead saw '{d}'.",
-            expected_at_a: "Expected an at-rule, and instead saw @{a}.",
-            expected_a_at_b_c: "Expected '{a}' at column {b}, not column {c}.",
-            expected_attribute_a: "Expected an attribute, and instead saw [{a}].",
-            expected_attribute_value_a: "Expected an attribute value and " +
-                "instead saw '{a}'.",
-            expected_class_a: "Expected a class, and instead saw .{a}.",
-            expected_fraction_a: "Expected a number between 0 and 1 and " +
-                "instead saw '{a}'",
-            expected_id_a: "Expected an id, and instead saw #{a}.",
-            expected_identifier_a: "Expected an identifier and instead saw '{a}'.",
-            expected_identifier_a_reserved: "Expected an identifier and " +
-                "instead saw '{a}' (a reserved word).",
-            expected_linear_a: "Expected a linear unit and instead saw '{a}'.",
-            expected_lang_a: "Expected a lang code, and instead saw :{a}.",
-            expected_media_a: "Expected a CSS media type, and instead saw '{a}'.",
-            expected_name_a: "Expected a name and instead saw '{a}'.",
-            expected_nonstandard_style_attribute: "Expected a non-standard " +
-                "style attribute and instead saw '{a}'.",
-            expected_number_a: "Expected a number and instead saw '{a}'.",
-            expected_operator_a: "Expected an operator and instead saw '{a}'.",
-            expected_percent_a: "Expected a percentage and instead saw '{a}'",
-            expected_positive_a: "Expected a positive number and instead saw '{a}'",
-            expected_pseudo_a: "Expected a pseudo, and instead saw :{a}.",
-            expected_selector_a: "Expected a CSS selector, and instead saw {a}.",
-            expected_small_a: "Expected a small positive integer and instead saw '{a}'",
-            expected_space_a_b: "Expected exactly one space between '{a}' and '{b}'.",
-            expected_string_a: "Expected a string and instead saw {a}.",
-            expected_style_attribute: "Excepted a style attribute, and instead saw '{a}'.",
-            expected_style_pattern: "Expected a style pattern, and instead saw '{a}'.",
-            expected_tagname_a: "Expected a tagName, and instead saw {a}.",
-            expected_type_a: "Expected a type, and instead saw {a}.",
-            for_if: "The body of a for in should be wrapped in an if " +
-                "statement to filter unwanted properties from the prototype.",
-            function_block: "Function statements should not be placed in blocks. " +
-                "Use a function expression or move the statement to the top of " +
-                "the outer function.",
-            function_eval: "The Function constructor is eval.",
-            function_loop: "Don't make functions within a loop.",
-            function_statement: "Function statements are not invocable. " +
-                "Wrap the whole function invocation in parens.",
-            function_strict: "Use the function form of 'use strict'.",
-            html_confusion_a: "HTML confusion in regular expression '<{a}'.",
-            html_handlers: "Avoid HTML event handlers.",
-            identifier_function: "Expected an identifier in an assignment " +
-                "and instead saw a function invocation.",
-            implied_evil: "Implied eval is evil. Pass a function instead of a string.",
-            infix_in: "Unexpected 'in'. Compare with undefined, or use the " +
-                "hasOwnProperty method instead.",
-            insecure_a: "Insecure '{a}'.",
-            isNaN: "Use the isNaN function to compare with NaN.",
-            label_a_b: "Label '{a}' on '{b}' statement.",
-            lang: "lang is deprecated.",
-            leading_decimal_a: "A leading decimal point can be confused with a dot: '.{a}'.",
-            missing_a: "Missing '{a}'.",
-            missing_a_after_b: "Missing '{a}' after '{b}'.",
-            missing_option: "Missing option value.",
-            missing_property: "Missing property name.",
-            missing_space_a_b: "Missing space between '{a}' and '{b}'.",
-            missing_url: "Missing url.",
-            missing_use_strict: "Missing 'use strict' statement.",
-            mixed: "Mixed spaces and tabs.",
-            move_invocation: "Move the invocation into the parens that " +
-                "contain the function.",
-            move_var: "Move 'var' declarations to the top of the function.",
-            name_function: "Missing name in function statement.",
-            nested_comment: "Nested comment.",
-            not: "Nested not.",
-            not_a_constructor: "Do not use {a} as a constructor.",
-            not_a_defined: "'{a}' has not been fully defined yet.",
-            not_a_function: "'{a}' is not a function.",
-            not_a_label: "'{a}' is not a label.",
-            not_a_scope: "'{a}' is out of scope.",
-            not_greater: "'{a}' should not be greater than '{b}'.",
-            parameter_a_get_b: "Unexpected parameter '{a}' in get {b} function.",
-            parameter_set_a: "Expected parameter (value) in set {a} function.",
-            radix: "Missing radix parameter.",
-            read_only: "Read only.",
-            redefinition_a: "Redefinition of '{a}'.",
-            reserved_a: "Reserved name '{a}'.",
-            scanned_a_b: "{a} ({b}% scanned).",
-            slash_equal: "A regular expression literal can be confused with '/='.",
-            statement_block: "Expected to see a statement and instead saw a block.",
-            stopping: "Stopping. ",
-            strange_loop: "Strange loop.",
-            strict: "Strict violation.",
-            subscript: "['{a}'] is better written in dot notation.",
-            tag_a_in_b: "A '<{a}>' must be within '<{b}>'.",
-            too_long: "Line too long.",
-            too_many: "Too many errors.",
-            trailing_decimal_a: "A trailing decimal point can be confused " +
-                "with a dot: '.{a}'.",
-            type: "type is unnecessary.",
-            type_confusion_a_b: "Type confusion: {a} and {b}.",
-            unclosed: "Unclosed string.",
-            unclosed_comment: "Unclosed comment.",
-            unclosed_regexp: "Unclosed regular expression.",
-            unescaped_a: "Unescaped '{a}'.",
-            unexpected_a: "Unexpected '{a}'.",
-            unexpected_char_a_b: "Unexpected character '{a}' in {b}.",
-            unexpected_comment: "Unexpected comment.",
-            unexpected_property_a: "Unexpected /*property*/ '{a}'.",
-            unexpected_space_a_b: "Unexpected space between '{a}' and '{b}'.",
-            unnecessary_initialize: "It is not necessary to initialize '{a}' " +
-                "to 'undefined'.",
-            unnecessary_use: "Unnecessary 'use strict'.",
-            unreachable_a_b: "Unreachable '{a}' after '{b}'.",
-            unrecognized_style_attribute_a: "Unrecognized style attribute '{a}'.",
-            unrecognized_tag_a: "Unrecognized tag '<{a}>'.",
-            unsafe: "Unsafe character.",
-            url: "JavaScript URL.",
-            use_array: "Use the array literal notation [].",
-            use_braces: "Spaces are hard to count. Use {{a}}.",
-            use_charAt: "Use the charAt method.",
-            use_object: "Use the object literal notation {}.",
-            use_or: "Use the || operator.",
-            use_param: "Use a named parameter.",
-            used_before_a: "'{a}' was used before it was defined.",
-            var_a_not: "Variable {a} was not declared correctly.",
-            weird_assignment: "Weird assignment.",
-            weird_condition: "Weird condition.",
-            weird_new: "Weird construction. Delete 'new'.",
-            weird_program: "Weird program.",
-            weird_relation: "Weird relation.",
-            weird_ternary: "Weird ternary.",
-            wrap_immediate: "Wrap an immediate function invocation in parentheses " +
-                "to assist the reader in understanding that the expression " +
-                "is the result of a function, and not the function itself.",
-            wrap_regexp: "Wrap the /regexp/ literal in parens to " +
-                "disambiguate the slash operator.",
-            write_is_wrong: "document.write can be a form of eval."
-        },
-        comments_off,
-        css_attribute_data,
-        css_any,
-
-        css_colorData = array_to_object([
-            "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige",
-            "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown",
-            "burlywood", "cadetblue", "chartreuse", "chocolate", "coral",
-            "cornflowerblue", "cornsilk", "crimson", "cyan", "darkblue",
-            "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkkhaki",
-            "darkmagenta", "darkolivegreen", "darkorange", "darkorchid",
-            "darkred", "darksalmon", "darkseagreen", "darkslateblue",
-            "darkslategray", "darkturquoise", "darkviolet", "deeppink",
-            "deepskyblue", "dimgray", "dodgerblue", "firebrick", "floralwhite",
-            "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold",
-            "goldenrod", "gray", "green", "greenyellow", "honeydew", "hotpink",
-            "indianred", "indigo", "ivory", "khaki", "lavender",
-            "lavenderblush", "lawngreen", "lemonchiffon", "lightblue",
-            "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgreen",
-            "lightpink", "lightsalmon", "lightseagreen", "lightskyblue",
-            "lightslategray", "lightsteelblue", "lightyellow", "lime",
-            "limegreen", "linen", "magenta", "maroon", "mediumaquamarine",
-            "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen",
-            "mediumslateblue", "mediumspringgreen", "mediumturquoise",
-            "mediumvioletred", "midnightblue", "mintcream", "mistyrose",
-            "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab",
-            "orange", "orangered", "orchid", "palegoldenrod", "palegreen",
-            "paleturquoise", "palevioletred", "papayawhip", "peachpuff",
-            "peru", "pink", "plum", "powderblue", "purple", "red", "rosybrown",
-            "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen",
-            "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray",
-            "snow", "springgreen", "steelblue", "tan", "teal", "thistle",
-            "tomato", "turquoise", "violet", "wheat", "white", "whitesmoke",
-            "yellow", "yellowgreen",
-
-            "activeborder", "activecaption", "appworkspace", "background",
-            "buttonface", "buttonhighlight", "buttonshadow", "buttontext",
-            "captiontext", "graytext", "highlight", "highlighttext",
-            "inactiveborder", "inactivecaption", "inactivecaptiontext",
-            "infobackground", "infotext", "menu", "menutext", "scrollbar",
-            "threeddarkshadow", "threedface", "threedhighlight",
-            "threedlightshadow", "threedshadow", "window", "windowframe",
-            "windowtext"
-        ], true),
-
-        css_border_style,
-        css_break,
-
-        css_lengthData = {
-            '%': true,
-            'cm': true,
-            'em': true,
-            'ex': true,
-            'in': true,
-            'mm': true,
-            'pc': true,
-            'pt': true,
-            'px': true
-        },
-
-        css_media,
-        css_overflow,
-
-        descapes = {
-            'b': '\b',
-            't': '\t',
-            'n': '\n',
-            'f': '\f',
-            'r': '\r',
-            '"': '"',
-            '/': '/',
-            '\\': '\\'
-        },
-
-        devel = array_to_object([
-            'alert', 'confirm', 'console', 'Debug', 'opera', 'prompt', 'WSH'
-        ], false),
-        directive,
-        escapes = {
-            '\b': '\\b',
-            '\t': '\\t',
-            '\n': '\\n',
-            '\f': '\\f',
-            '\r': '\\r',
-            '\'': '\\\'',
-            '"' : '\\"',
-            '/' : '\\/',
-            '\\': '\\\\'
-        },
-
-        funct,          // The current function, including the labels used in
-                        // the function, as well as (breakage), (complexity),
-                        // (context), (loopage), (name), (params), (token),
-                        // (vars), (verb)
-
-        functionicity = [
-            'closure', 'exception', 'global', 'label', 'outer', 'undef',
-            'unused', 'var'
-        ],
-
-        functions,      // All of the functions
-        global_funct,   // The global body
-        global_scope,   // The global scope
-        html_tag = {
-            a:        {},
-            abbr:     {},
-            acronym:  {},
-            address:  {},
-            applet:   {},
-            area:     {empty: true, parent: ' map '},
-            article:  {},
-            aside:    {},
-            audio:    {},
-            b:        {},
-            base:     {empty: true, parent: ' head '},
-            bdo:      {},
-            big:      {},
-            blockquote: {},
-            body:     {parent: ' html noframes '},
-            br:       {empty: true},
-            button:   {},
-            canvas:   {parent: ' body p div th td '},
-            caption:  {parent: ' table '},
-            center:   {},
-            cite:     {},
-            code:     {},
-            col:      {empty: true, parent: ' table colgroup '},
-            colgroup: {parent: ' table '},
-            command:  {parent: ' menu '},
-            datalist: {},
-            dd:       {parent: ' dl '},
-            del:      {},
-            details:  {},
-            dialog:   {},
-            dfn:      {},
-            dir:      {},
-            div:      {},
-            dl:       {},
-            dt:       {parent: ' dl '},
-            em:       {},
-            embed:    {},
-            fieldset: {},
-            figure:   {},
-            font:     {},
-            footer:   {},
-            form:     {},
-            frame:    {empty: true, parent: ' frameset '},
-            frameset: {parent: ' html frameset '},
-            h1:       {},
-            h2:       {},
-            h3:       {},
-            h4:       {},
-            h5:       {},
-            h6:       {},
-            head:     {parent: ' html '},
-            header:   {},
-            hgroup:   {},
-            hr:       {empty: true},
-            'hta:application':
-                      {empty: true, parent: ' head '},
-            html:     {parent: '*'},
-            i:        {},
-            iframe:   {},
-            img:      {empty: true},
-            input:    {empty: true},
-            ins:      {},
-            kbd:      {},
-            keygen:   {},
-            label:    {},
-            legend:   {parent: ' details fieldset figure '},
-            li:       {parent: ' dir menu ol ul '},
-            link:     {empty: true, parent: ' head '},
-            map:      {},
-            mark:     {},
-            menu:     {},
-            meta:     {empty: true, parent: ' head noframes noscript '},
-            meter:    {},
-            nav:      {},
-            noframes: {parent: ' html body '},
-            noscript: {parent: ' body head noframes '},
-            object:   {},
-            ol:       {},
-            optgroup: {parent: ' select '},
-            option:   {parent: ' optgroup select '},
-            output:   {},
-            p:        {},
-            param:    {empty: true, parent: ' applet object '},
-            pre:      {},
-            progress: {},
-            q:        {},
-            rp:       {},
-            rt:       {},
-            ruby:     {},
-            samp:     {},
-            script:   {empty: true, parent: ' body div frame head iframe p pre span '},
-            section:  {},
-            select:   {},
-            small:    {},
-            span:     {},
-            source:   {},
-            strong:   {},
-            style:    {parent: ' head ', empty: true},
-            sub:      {},
-            sup:      {},
-            table:    {},
-            tbody:    {parent: ' table '},
-            td:       {parent: ' tr '},
-            textarea: {},
-            tfoot:    {parent: ' table '},
-            th:       {parent: ' tr '},
-            thead:    {parent: ' table '},
-            time:     {},
-            title:    {parent: ' head '},
-            tr:       {parent: ' table tbody thead tfoot '},
-            tt:       {},
-            u:        {},
-            ul:       {},
-            'var':    {},
-            video:    {}
-        },
-
-        ids,            // HTML ids
-        in_block,
-        indent,
-//         infer_statement,// Inference rules for statements
-        is_type = array_to_object([
-            '*', 'array', 'boolean', 'function', 'number', 'object',
-            'regexp', 'string'
-        ], true),
-        itself,         // JSLint itself
-        jslint_limit = {
-            indent: 10,
-            maxerr: 1000,
-            maxlen: 256
-        },
-        json_mode,
-        lex,            // the tokenizer
-        lines,
-        lookahead,
-        member,
-        node = array_to_object([
-            'Buffer', 'clearInterval', 'clearTimeout', 'console', 'exports',
-            'global', 'module', 'process', 'querystring', 'require',
-            'setInterval', 'setTimeout', '__dirname', '__filename'
-        ], false),
-        node_js,
-        numbery = array_to_object(['indexOf', 'lastIndexOf', 'search'], true),
-        next_token,
-        option,
-        predefined,     // Global variables defined by option
-        prereg,
-        prev_token,
-        property_type,
-        regexp_flag = array_to_object(['g', 'i', 'm'], true),
-        return_this = function return_this() {
-            return this;
-        },
-        rhino = array_to_object([
-            'defineClass', 'deserialize', 'gc', 'help', 'load', 'loadClass',
-            'print', 'quit', 'readFile', 'readUrl', 'runCommand', 'seal',
-            'serialize', 'spawn', 'sync', 'toint32', 'version'
-        ], false),
-
-        scope,      // An object containing an object for each variable in scope
-        semicolon_coda = array_to_object([';', '"', '\'', ')'], true),
-        src,
-        stack,
-
-// standard contains the global names that are provided by the
-// ECMAScript standard.
-
-        standard = array_to_object([
-            'Array', 'Boolean', 'Date', 'decodeURI', 'decodeURIComponent',
-            'encodeURI', 'encodeURIComponent', 'Error', 'eval', 'EvalError',
-            'Function', 'isFinite', 'isNaN', 'JSON', 'Math', 'Number', 'Object',
-            'parseInt', 'parseFloat', 'RangeError', 'ReferenceError', 'RegExp',
-            'String', 'SyntaxError', 'TypeError', 'URIError'
-        ], false),
-
-        standard_property_type = {
-            E                   : 'number',
-            LN2                 : 'number',
-            LN10                : 'number',
-            LOG2E               : 'number',
-            LOG10E              : 'number',
-            MAX_VALUE           : 'number',
-            MIN_VALUE           : 'number',
-            NEGATIVE_INFINITY   : 'number',
-            PI                  : 'number',
-            POSITIVE_INFINITY   : 'number',
-            SQRT1_2             : 'number',
-            SQRT2               : 'number',
-            apply               : 'function',
-            bind                : 'function function',
-            call                : 'function',
-            ceil                : 'function number',
-            charAt              : 'function string',
-            concat              : 'function',
-            constructor         : 'function object',
-            create              : 'function object',
-            defineProperty      : 'function object',
-            defineProperties    : 'function object',
-            every               : 'function boolean',
-            exec                : 'function array',
-            filter              : 'function array',
-            floor               : 'function number',
-            forEach             : 'function',
-            freeze              : 'function object',
-            getDate             : 'function number',
-            getDay              : 'function number',
-            getFullYear         : 'function number',
-            getHours            : 'function number',
-            getMilliseconds     : 'function number',
-            getMinutes          : 'function number',
-            getMonth            : 'function number',
-            getOwnPropertyDescriptor
-                                : 'function object',
-            getOwnPropertyNames : 'function array',
-            getPrototypeOf      : 'function object',
-            getSeconds          : 'function number',
-            getTime             : 'function number',
-            getTimezoneOffset   : 'function number',
-            getUTCDate          : 'function number',
-            getUTCDay           : 'function number',
-            getUTCFullYear      : 'function number',
-            getUTCHours         : 'function number',
-            getUTCMilliseconds  : 'function number',
-            getUTCMinutes       : 'function number',
-            getUTCMonth         : 'function number',
-            getUTCSeconds       : 'function number',
-            getYear             : 'function number',
-            hasOwnProperty      : 'function boolean',
-            indexOf             : 'function number',
-            isExtensible        : 'function boolean',
-            isFrozen            : 'function boolean',
-            isPrototypeOf       : 'function boolean',
-            isSealed            : 'function boolean',
-            join                : 'function string',
-            keys                : 'function array',
-            lastIndexOf         : 'function number',
-            lastIndex           : 'number',
-            length              : 'number',
-            map                 : 'function array',
-            now                 : 'function number',
-            parse               : 'function',
-            pop                 : 'function',
-            preventExtensions   : 'function object',
-            propertyIsEnumerable: 'function boolean',
-            prototype           : 'object',
-            push                : 'function number',
-            reduce              : 'function',
-            reduceRight         : 'function',
-            reverse             : 'function',
-            seal                : 'function object',
-            setDate             : 'function',
-            setDay              : 'function',
-            setFullYear         : 'function',
-            setHours            : 'function',
-            setMilliseconds     : 'function',
-            setMinutes          : 'function',
-            setMonth            : 'function',
-            setSeconds          : 'function',
-            setTime             : 'function',
-            setTimezoneOffset   : 'function',
-            setUTCDate          : 'function',
-            setUTCDay           : 'function',
-            setUTCFullYear      : 'function',
-            setUTCHours         : 'function',
-            setUTCMilliseconds  : 'function',
-            setUTCMinutes       : 'function',
-            setUTCMonth         : 'function',
-            setUTCSeconds       : 'function',
-            setYear             : 'function',
-            shift               : 'function',
-            slice               : 'function',
-            some                : 'function boolean',
-            sort                : 'function',
-            splice              : 'function',
-            stringify           : 'function string',
-            substr              : 'function string',
-            substring           : 'function string',
-            test                : 'function boolean',
-            toDateString        : 'function string',
-            toExponential       : 'function string',
-            toFixed             : 'function string',
-            toJSON              : 'function',
-            toISOString         : 'function string',
-            toLocaleDateString  : 'function string',
-            toLocaleLowerCase   : 'function string',
-            toLocaleUpperCase   : 'function string',
-            toLocaleString      : 'function string',
-            toLocaleTimeString  : 'function string',
-            toLowerCase         : 'function string',
-            toPrecision         : 'function string',
-            toTimeString        : 'function string',
-            toUpperCase         : 'function string',
-            toUTCString         : 'function string',
-            trim                : 'function string',
-            unshift             : 'function number',
-            valueOf             : 'function'
-        },
-
-        strict_mode,
-        syntax = {},
-        tab,
-        token,
-//         type_state_change,
-        urls,
-        var_mode,
-        warnings,
-
-// widget contains the global names which are provided to a Yahoo
-// (fna Konfabulator) widget.
-
-        widget = array_to_object([
-            'alert', 'animator', 'appleScript', 'beep', 'bytesToUIString',
-            'Canvas', 'chooseColor', 'chooseFile', 'chooseFolder',
-            'closeWidget', 'COM', 'convertPathToHFS', 'convertPathToPlatform',
-            'CustomAnimation', 'escape', 'FadeAnimation', 'filesystem', 'Flash',
-            'focusWidget', 'form', 'FormField', 'Frame', 'HotKey', 'Image',
-            'include', 'isApplicationRunning', 'iTunes', 'konfabulatorVersion',
-            'log', 'md5', 'MenuItem', 'MoveAnimation', 'openURL', 'play',
-            'Point', 'popupMenu', 'preferenceGroups', 'preferences', 'print',
-            'prompt', 'random', 'Rectangle', 'reloadWidget', 'ResizeAnimation',
-            'resolvePath', 'resumeUpdates', 'RotateAnimation', 'runCommand',
-            'runCommandInBg', 'saveAs', 'savePreferences', 'screen',
-            'ScrollBar', 'showWidgetPreferences', 'sleep', 'speak', 'Style',
-            'suppressUpdates', 'system', 'tellWidget', 'Text', 'TextArea',
-            'Timer', 'unescape', 'updateNow', 'URL', 'Web', 'widget', 'Window',
-            'XMLDOM', 'XMLHttpRequest', 'yahooCheckLogin', 'yahooLogin',
-            'yahooLogout'
-        ], true),
-
-        windows = array_to_object([
-            'ActiveXObject', 'CScript', 'Debug', 'Enumerator', 'System',
-            'VBArray', 'WScript', 'WSH'
-        ], false),
-
-//  xmode is used to adapt to the exceptions in html parsing.
-//  It can have these states:
-//      ''      .js script file
-//      'html'
-//      'outer'
-//      'script'
-//      'style'
-//      'scriptstring'
-//      'styleproperty'
-
-        xmode,
-        xquote,
-
-// Regular expressions. Some of these are stupidly long.
-
-// unsafe comment or string
-        ax = /@cc|<\/?|script|\]\s*\]|<\s*!|&lt/i,
-// carriage return, or carriage return linefeed
-        crx = /\r/g,
-        crlfx = /\r\n/g,
-// unsafe characters that are silently deleted by one or more browsers
-        cx = /[\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/,
-// query characters for ids
-        dx = /[\[\]\/\\"'*<>.&:(){}+=#]/,
-// html token
-        hx = /^\s*(['"=>\/&#]|<(?:\/|\!(?:--)?)?|[a-zA-Z][a-zA-Z0-9_\-:]*|[0-9]+|--)/,
-// identifier
-        ix = /^([a-zA-Z_$][a-zA-Z0-9_$]*)$/,
-// javascript url
-        jx = /^(?:javascript|jscript|ecmascript|vbscript|mocha|livescript)\s*:/i,
-// star slash
-        lx = /\*\/|\/\*/,
-// characters in strings that need escapement
-        nx = /[\u0000-\u001f'\\\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
-// outer html token
-        ox = /[>&]|<[\/!]?|--/,
-// attributes characters
-        qx = /[^a-zA-Z0-9+\-_\/ ]/,
-// style
-        sx = /^\s*([{}:#%.=,>+\[\]@()"';]|\*=?|\$=|\|=|\^=|~=|[a-zA-Z_][a-zA-Z0-9_\-]*|[0-9]+|<\/|\/\*)/,
-        ssx = /^\s*([@#!"'};:\-%.=,+\[\]()*_]|[a-zA-Z][a-zA-Z0-9._\-]*|\/\*?|\d+(?:\.\d+)?|<\/)/,
-// token
-        tx = /^\s*([(){}\[.,:;'"~\?\]#@]|==?=?|\/(\*(jslint|properties|property|members?|globals?)?|=|\/)?|\*[\/=]?|\+(?:=|\++)?|-(?:=|-+)?|%=?|&[&=]?|\|[|=]?|>>?>?=?|<([\/=!]|\!(\[|--)?|<=?)?|\^=?|\!=?=?|[a-zA-Z_$][a-zA-Z0-9_$]*|[0-9]+([xX][0-9a-fA-F]+|\.[0-9]*)?([eE][+\-]?[0-9]+)?)/,
-// url badness
-        ux = /&|\+|\u00AD|\.\.|\/\*|%[^;]|base64|url|expression|data|mailto|script/i,
-
-        rx = {
-            outer: hx,
-            html: hx,
-            style: sx,
-            styleproperty: ssx
-        };
-
-
-    function F() {}     // Used by Object.create
-
-// Provide critical ES5 functions to ES3.
-
-    if (typeof Array.prototype.filter !== 'function') {
-        Array.prototype.filter = function (f) {
-            var i, length = this.length, result = [], value;
-            for (i = 0; i < length; i += 1) {
-                try {
-                    value = this[i];
-                    if (f(value)) {
-                        result.push(value);
-                    }
-                } catch (ignore) {
-                }
-            }
-            return result;
-        };
-    }
-
-    if (typeof Array.prototype.forEach !== 'function') {
-        Array.prototype.forEach = function (f) {
-            var i, length = this.length;
-            for (i = 0; i < length; i += 1) {
-                try {
-                    f(this[i]);
-                } catch (ignore) {
-                }
-            }
-        };
-    }
-
-    if (typeof Array.isArray !== 'function') {
-        Array.isArray = function (o) {
-            return Object.prototype.toString.apply(o) === '[object Array]';
-        };
-    }
-
-    if (!Object.prototype.hasOwnProperty.call(Object, 'create')) {
-        Object.create = function (o) {
-            F.prototype = o;
-            return new F();
-        };
-    }
-
-    if (typeof Object.keys !== 'function') {
-        Object.keys = function (o) {
-            var array = [], key;
-            for (key in o) {
-                if (Object.prototype.hasOwnProperty.call(o, key)) {
-                    array.push(key);
-                }
-            }
-            return array;
-        };
-    }
-
-    if (typeof String.prototype.entityify !== 'function') {
-        String.prototype.entityify = function () {
-            return this
-                .replace(/&/g, '&amp;')
-                .replace(/</g, '&lt;')
-                .replace(/>/g, '&gt;');
-        };
-    }
-
-    if (typeof String.prototype.isAlpha !== 'function') {
-        String.prototype.isAlpha = function () {
-            return (this >= 'a' && this <= 'z\uffff') ||
-                (this >= 'A' && this <= 'Z\uffff');
-        };
-    }
-
-    if (typeof String.prototype.isDigit !== 'function') {
-        String.prototype.isDigit = function () {
-            return (this >= '0' && this <= '9');
-        };
-    }
-
-    if (typeof String.prototype.supplant !== 'function') {
-        String.prototype.supplant = function (o) {
-            return this.replace(/\{([^{}]*)\}/g, function (a, b) {
-                var replacement = o[b];
-                return typeof replacement === 'string' ||
-                    typeof replacement === 'number' ? replacement : a;
-            });
-        };
-    }
-
-
-    function sanitize(a) {
-
-//  Escapify a troublesome character.
-
-        return escapes[a] ||
-            '\\u' + ('0000' + a.charCodeAt().toString(16)).slice(-4);
-    }
-
-
-    function add_to_predefined(group) {
-        Object.keys(group).forEach(function (name) {
-            predefined[name] = group[name];
-        });
-    }
-
-
-    function assume() {
-        if (!option.safe) {
-            if (option.rhino) {
-                add_to_predefined(rhino);
-                option.rhino = false;
-            }
-            if (option.devel) {
-                add_to_predefined(devel);
-                option.devel = false;
-            }
-            if (option.browser) {
-                add_to_predefined(browser);
-                option.browser = false;
-            }
-            if (option.windows) {
-                add_to_predefined(windows);
-                option.windows = false;
-            }
-            if (option.node) {
-                add_to_predefined(node);
-                option.node = false;
-                node_js = true;
-            }
-            if (option.widget) {
-                add_to_predefined(widget);
-                option.widget = false;
-            }
-        }
-        if (option.type) {
-            option.confusion = true;
-        }
-    }
-
-
-// Produce an error warning.
-
-    function artifact(tok) {
-        if (!tok) {
-            tok = next_token;
-        }
-        return tok.number || tok.string;
-    }
-
-    function quit(message, line, character) {
-        throw {
-            name: 'JSLintError',
-            line: line,
-            character: character,
-            message: bundle.scanned_a_b.supplant({
-                a: message,
-                b: Math.floor((line / lines.length) * 100)
-            })
-        };
-    }
-
-    function warn(message, offender, a, b, c, d) {
-        var character, line, warning;
-        offender = offender || next_token;  // `~
-        line = offender.line || 0;
-        character = offender.from || 0;
-        warning = {
-            id: '(error)',
-            raw: bundle[message] || message,
-            evidence: lines[line - 1] || '',
-            line: line,
-            character: character,
-            a: a || (offender.id === '(number)'
-                ? String(offender.number)
-                : offender.string),
-            b: b,
-            c: c,
-            d: d
-        };
-        warning.reason = warning.raw.supplant(warning);
-        JSLINT.errors.push(warning);
-        if (option.passfail) {
-            quit(bundle.stopping, line, character);
-        }
-        warnings += 1;
-        if (warnings >= option.maxerr) {
-            quit(bundle.too_many, line, character);
-        }
-        return warning;
-    }
-
-    function warn_at(message, line, character, a, b, c, d) {
-        return warn(message, {
-            line: line,
-            from: character
-        }, a, b, c, d);
-    }
-
-    function stop(message, offender, a, b, c, d) {
-        var warning = warn(message, offender, a, b, c, d);
-        quit(bundle.stopping, warning.line, warning.character);
-    }
-
-    function stop_at(message, line, character, a, b, c, d) {
-        return stop(message, {
-            line: line,
-            from: character
-        }, a, b, c, d);
-    }
-
-    function expected_at(at) {
-        if (!option.white && next_token.from !== at) {
-            warn('expected_a_at_b_c', next_token, '', at,
-                next_token.from);
-        }
-    }
-
-    function aint(it, name, expected) {
-        if (it[name] !== expected) {
-            warn('expected_a_b', it, expected, it[name]);
-            return true;
-        } else {
-            return false;
-        }
-    }
-
-
-// lexical analysis and token construction
-
-    lex = (function lex() {
-        var character, c, from, length, line, pos, source_row;
-
-// Private lex methods
-
-        function next_line() {
-            var at;
-            if (line >= lines.length) {
-                return false;
-            }
-            character = 1;
-            source_row = lines[line];
-            line += 1;
-            at = source_row.search(/ \t/);
-            if (at >= 0) {
-                warn_at('mixed', line, at + 1);
-            }
-            source_row = source_row.replace(/\t/g, tab);
-            at = source_row.search(cx);
-            if (at >= 0) {
-                warn_at('unsafe', line, at);
-            }
-            if (option.maxlen && option.maxlen < source_row.length) {
-                warn_at('too_long', line, source_row.length);
-            }
-            return true;
-        }
-
-// Produce a token object.  The token inherits from a syntax symbol.
-
-        function it(type, value) {
-            var id, the_token;
-            if (type === '(string)' || type === '(range)') {
-                if (jx.test(value)) {
-                    warn_at('url', line, from);
-                }
-            }
-            the_token = Object.create(syntax[(
-                type === '(punctuator)' || (type === '(identifier)' &&
-                        Object.prototype.hasOwnProperty.call(syntax, value))
-                    ? value
-                    : type
-            )] || syntax['(error)']);
-            if (type === '(identifier)') {
-                the_token.identifier = true;
-                if (value === '__iterator__' || value === '__proto__') {
-                    stop_at('reserved_a', line, from, value);
-                } else if (!option.nomen &&
-                        (value.charAt(0) === '_' ||
-                        value.charAt(value.length - 1) === '_')) {
-                    warn_at('dangling_a', line, from, value);
-                }
-            }
-            if (type === '(number)') {
-                the_token.number = +value;
-            } else if (value !== undefined) {
-                the_token.string = String(value);
-            }
-            the_token.line = line;
-            the_token.from = from;
-            the_token.thru = character;
-            id = the_token.id;
-            prereg = id && (
-                ('(,=:[!&|?{};'.indexOf(id.charAt(id.length - 1)) >= 0) ||
-                id === 'return' || id === 'case'
-            );
-            return the_token;
-        }
-
-        function match(x) {
-            var exec = x.exec(source_row), first;
-            if (exec) {
-                length = exec[0].length;
-                first = exec[1];
-                c = first.charAt(0);
-                source_row = source_row.slice(length);
-                from = character + length - first.length;
-                character += length;
-                return first;
-            }
-        }
-
-        function string(x) {
-            var c, pos = 0, r = '', result;
-
-            function hex(n) {
-                var i = parseInt(source_row.substr(pos + 1, n), 16);
-                pos += n;
-                if (i >= 32 && i <= 126 &&
-                        i !== 34 && i !== 92 && i !== 39) {
-                    warn_at('unexpected_a', line, character, '\\');
-                }
-                character += n;
-                c = String.fromCharCode(i);
-            }
-
-            if (json_mode && x !== '"') {
-                warn_at('expected_a', line, character, '"');
-            }
-
-            if (xquote === x || (xmode === 'scriptstring' && !xquote)) {
-                return it('(punctuator)', x);
-            }
-
-            for (;;) {
-                while (pos >= source_row.length) {
-                    pos = 0;
-                    if (xmode !== 'html' || !next_line()) {
-                        stop_at('unclosed', line, from);
-                    }
-                }
-                c = source_row.charAt(pos);
-                if (c === x) {
-                    character += 1;
-                    source_row = source_row.slice(pos + 1);
-                    result = it('(string)', r);
-                    result.quote = x;
-                    return result;
-                }
-                if (c < ' ') {
-                    if (c === '\n' || c === '\r') {
-                        break;
-                    }
-                    warn_at('control_a', line, character + pos,
-                        source_row.slice(0, pos));
-                } else if (c === xquote) {
-                    warn_at('bad_html', line, character + pos);
-                } else if (c === '<') {
-                    if (option.safe && xmode === 'html') {
-                        warn_at('adsafe_a', line, character + pos, c);
-                    } else if (source_row.charAt(pos + 1) === '/' && (xmode || option.safe)) {
-                        warn_at('expected_a_b', line, character,
-                            '<\\/', '</');
-                    } else if (source_row.charAt(pos + 1) === '!' && (xmode || option.safe)) {
-                        warn_at('unexpected_a', line, character, '<!');
-                    }
-                } else if (c === '\\') {
-                    if (xmode === 'html') {
-                        if (option.safe) {
-                            warn_at('adsafe_a', line, character + pos, c);
-                        }
-                    } else if (xmode === 'styleproperty') {
-                        pos += 1;
-                        character += 1;
-                        c = source_row.charAt(pos);
-                        if (c !== x) {
-                            warn_at('unexpected_a', line, character, '\\');
-                        }
-                    } else {
-                        pos += 1;
-                        character += 1;
-                        c = source_row.charAt(pos);
-                        switch (c) {
-                        case '':
-                            if (!option.es5) {
-                                warn_at('es5', line, character);
-                            }
-                            next_line();
-                            pos = -1;
-                            break;
-                        case xquote:
-                            warn_at('bad_html', line, character + pos);
-                            break;
-                        case '\'':
-                            if (json_mode) {
-                                warn_at('unexpected_a', line, character, '\\\'');
-                            }
-                            break;
-                        case 'u':
-                            hex(4);
-                            break;
-                        case 'v':
-                            if (json_mode) {
-                                warn_at('unexpected_a', line, character, '\\v');
-                            }
-                            c = '\v';
-                            break;
-                        case 'x':
-                            if (json_mode) {
-                                warn_at('unexpected_a', line, character, '\\x');
-                            }
-                            hex(2);
-                            break;
-                        default:
-                            c = descapes[c];
-                            if (typeof c !== 'string') {
-                                warn_at('unexpected_a', line, character, '\\');
-                            }
-                        }
-                    }
-                }
-                r += c;
-                character += 1;
-                pos += 1;
-            }
-        }
-
-        function number(snippet) {
-            var digit;
-            if (xmode !== 'style' && xmode !== 'styleproperty' &&
-                    source_row.charAt(0).isAlpha()) {
-                warn_at('expected_space_a_b',
-                    line, character, c, source_row.charAt(0));
-            }
-            if (c === '0') {
-                digit = snippet.charAt(1);
-                if (digit.isDigit()) {
-                    if (token.id !== '.' && xmode !== 'styleproperty') {
-                        warn_at('unexpected_a', line, character, snippet);
-                    }
-                } else if (json_mode && (digit === 'x' || digit === 'X')) {
-                    warn_at('unexpected_a', line, character, '0x');
-                }
-            }
-            if (snippet.slice(snippet.length - 1) === '.') {
-                warn_at('trailing_decimal_a', line, character, snippet);
-            }
-            if (xmode !== 'style') {
-                digit = +snippet;
-                if (!isFinite(digit)) {
-                    warn_at('bad_number', line, character, snippet);
-                }
-                snippet = digit;
-            }
-            return it('(number)', snippet);
-        }
-
-        function comment(snippet) {
-            if (comments_off || src || (xmode && xmode !== 'script' &&
-                    xmode !== 'style' && xmode !== 'styleproperty')) {
-                warn_at('unexpected_comment', line, character);
-            } else if (xmode === 'script' && /<\//i.test(source_row)) {
-                warn_at('unexpected_a', line, character, '<\/');
-            } else if (option.safe && ax.test(snippet)) {
-                warn_at('dangerous_comment', line, character);
-            }
-        }
-
-        function regexp() {
-            var b,
-                bit,
-                captures = 0,
-                depth = 0,
-                flag = '',
-                high,
-                letter,
-                length = 0,
-                low,
-                potential,
-                quote,
-                result;
-            for (;;) {
-                b = true;
-                c = source_row.charAt(length);
-                length += 1;
-                switch (c) {
-                case '':
-                    stop_at('unclosed_regexp', line, from);
-                    return;
-                case '/':
-                    if (depth > 0) {
-                        warn_at('unescaped_a', line, from + length, '/');
-                    }
-                    c = source_row.slice(0, length - 1);
-                    potential = Object.create(regexp_flag);
-                    for (;;) {
-                        letter = source_row.charAt(length);
-                        if (potential[letter] !== true) {
-                            break;
-                        }
-                        potential[letter] = false;
-                        length += 1;
-                        flag += letter;
-                    }
-                    if (source_row.charAt(length).isAlpha()) {
-                        stop_at('unexpected_a', line, from, source_row.charAt(length));
-                    }
-                    character += length;
-                    source_row = source_row.slice(length);
-                    quote = source_row.charAt(0);
-                    if (quote === '/' || quote === '*') {
-                        stop_at('confusing_regexp', line, from);
-                    }
-                    result = it('(regexp)', c);
-                    result.flag = flag;
-                    return result;
-                case '\\':
-                    c = source_row.charAt(length);
-                    if (c < ' ') {
-                        warn_at('control_a', line, from + length, String(c));
-                    } else if (c === '<') {
-                        warn_at(bundle.unexpected_a, line, from + length, '\\');
-                    }
-                    length += 1;
-                    break;
-                case '(':
-                    depth += 1;
-                    b = false;
-                    if (source_row.charAt(length) === '?') {
-                        length += 1;
-                        switch (source_row.charAt(length)) {
-                        case ':':
-                        case '=':
-                        case '!':
-                            length += 1;
-                            break;
-                        default:
-                            warn_at(bundle.expected_a_b, line, from + length,
-                                ':', source_row.charAt(length));
-                        }
-                    } else {
-                        captures += 1;
-                    }
-                    break;
-                case '|':
-                    b = false;
-                    break;
-                case ')':
-                    if (depth === 0) {
-                        warn_at('unescaped_a', line, from + length, ')');
-                    } else {
-                        depth -= 1;
-                    }
-                    break;
-                case ' ':
-                    pos = 1;
-                    while (source_row.charAt(length) === ' ') {
-                        length += 1;
-                        pos += 1;
-                    }
-                    if (pos > 1) {
-                        warn_at('use_braces', line, from + length, pos);
-                    }
-                    break;
-                case '[':
-                    c = source_row.charAt(length);
-                    if (c === '^') {
-                        length += 1;
-                        if (!option.regexp) {
-                            warn_at('insecure_a', line, from + length, c);
-                        } else if (source_row.charAt(length) === ']') {
-                            stop_at('unescaped_a', line, from + length, '^');
-                        }
-                    }
-                    bit = false;
-                    if (c === ']') {
-                        warn_at('empty_class', line, from + length - 1);
-                        bit = true;
-                    }
-klass:              do {
-                        c = source_row.charAt(length);
-                        length += 1;
-                        switch (c) {
-                        case '[':
-                        case '^':
-                            warn_at('unescaped_a', line, from + length, c);
-                            bit = true;
-                            break;
-                        case '-':
-                            if (bit) {
-                                bit = false;
-                            } else {
-                                warn_at('unescaped_a', line, from + length, '-');
-                                bit = true;
-                            }
-                            break;
-                        case ']':
-                            if (!bit) {
-                                warn_at('unescaped_a', line, from + length - 1, '-');
-                            }
-                            break klass;
-                        case '\\':
-                            c = source_row.charAt(length);
-                            if (c < ' ') {
-                                warn_at(bundle.control_a, line, from + length, String(c));
-                            } else if (c === '<') {
-                                warn_at(bundle.unexpected_a, line, from + length, '\\');
-                            }
-                            length += 1;
-                            bit = true;
-                            break;
-                        case '/':
-                            warn_at('unescaped_a', line, from + length - 1, '/');
-                            bit = true;
-                            break;
-                        case '<':
-                            if (xmode === 'script') {
-                                c = source_row.charAt(length);
-                                if (c === '!' || c === '/') {
-                                    warn_at(bundle.html_confusion_a, line,
-                                        from + length, c);
-                                }
-                            }
-                            bit = true;
-                            break;
-                        default:
-                            bit = true;
-                        }
-                    } while (c);
-                    break;
-                case '.':
-                    if (!option.regexp) {
-                        warn_at('insecure_a', line, from + length, c);
-                    }
-                    break;
-                case ']':
-                case '?':
-                case '{':
-                case '}':
-                case '+':
-                case '*':
-                    warn_at('unescaped_a', line, from + length, c);
-                    break;
-                case '<':
-                    if (xmode === 'script') {
-                        c = source_row.charAt(length);
-                        if (c === '!' || c === '/') {
-                            warn_at(bundle.html_confusion_a, line, from + length, c);
-                        }
-                    }
-                    break;
-                }
-                if (b) {
-                    switch (source_row.charAt(length)) {
-                    case '?':
-                    case '+':
-                    case '*':
-                        length += 1;
-                        if (source_row.charAt(length) === '?') {
-                            length += 1;
-                        }
-                        break;
-                    case '{':
-                        length += 1;
-                        c = source_row.charAt(length);
-                        if (c < '0' || c > '9') {
-                            warn_at(bundle.expected_number_a, line,
-                                from + length, c);
-                        }
-                        length += 1;
-                        low = +c;
-                        for (;;) {
-                            c = source_row.charAt(length);
-                            if (c < '0' || c > '9') {
-                                break;
-                            }
-                            length += 1;
-                            low = +c + (low * 10);
-                        }
-                        high = low;
-                        if (c === ',') {
-                            length += 1;
-                            high = Infinity;
-                            c = source_row.charAt(length);
-                            if (c >= '0' && c <= '9') {
-                                length += 1;
-                                high = +c;
-                                for (;;) {
-                                    c = source_row.charAt(length);
-                                    if (c < '0' || c > '9') {
-                                        break;
-                                    }
-                                    length += 1;
-                                    high = +c + (high * 10);
-                                }
-                            }
-                        }
-                        if (source_row.charAt(length) !== '}') {
-                            warn_at(bundle.expected_a_b, line, from + length,
-                                '}', c);
-                        } else {
-                            length += 1;
-                        }
-                        if (source_row.charAt(length) === '?') {
-                            length += 1;
-                        }
-                        if (low > high) {
-                            warn_at(bundle.not_greater, line, from + length,
-                                low, high);
-                        }
-                        break;
-                    }
-                }
-            }
-            c = source_row.slice(0, length - 1);
-            character += length;
-            source_row = source_row.slice(length);
-            return it('(regexp)', c);
-        }
-
-// Public lex methods
-
-        return {
-            init: function (source) {
-                if (typeof source === 'string') {
-                    lines = source
-                        .replace(crlfx, '\n')
-                        .replace(crx, '\n')
-                        .split('\n');
-                } else {
-                    lines = source;
-                }
-                line = 0;
-                next_line();
-                from = 1;
-            },
-
-            range: function (begin, end) {
-                var c, value = '';
-                from = character;
-                if (source_row.charAt(0) !== begin) {
-                    stop_at('expected_a_b', line, character, begin,
-                        source_row.charAt(0));
-                }
-                for (;;) {
-                    source_row = source_row.slice(1);
-                    character += 1;
-                    c = source_row.charAt(0);
-                    switch (c) {
-                    case '':
-                        stop_at('missing_a', line, character, c);
-                        break;
-                    case end:
-                        source_row = source_row.slice(1);
-                        character += 1;
-                        return it('(range)', value);
-                    case xquote:
-                    case '\\':
-                        warn_at('unexpected_a', line, character, c);
-                        break;
-                    }
-                    value += c;
-                }
-            },
-
-// token -- this is called by advance to get the next token.
-
-            token: function () {
-                var c, i, snippet;
-
-                for (;;) {
-                    while (!source_row) {
-                        if (!next_line()) {
-                            return it('(end)');
-                        }
-                    }
-                    while (xmode === 'outer') {
-                        i = source_row.search(ox);
-                        if (i === 0) {
-                            break;
-                        } else if (i > 0) {
-                            character += 1;
-                            source_row = source_row.slice(i);
-                            break;
-                        } else {
-                            if (!next_line()) {
-                                return it('(end)', '');
-                            }
-                        }
-                    }
-                    snippet = match(rx[xmode] || tx);
-                    if (!snippet) {
-                        if (source_row) {
-                            if (source_row.charAt(0) === ' ') {
-                                if (!option.white) {
-                                    warn_at('unexpected_a', line, character,
-                                        '(space)');
-                                }
-                                character += 1;
-                                source_row = '';
-                            } else {
-                                stop_at('unexpected_a', line, character,
-                                    source_row.charAt(0));
-                            }
-                        }
-                    } else {
-
-//      identifier
-
-                        c = snippet.charAt(0);
-                        if (c.isAlpha() || c === '_' || c === '$') {
-                            return it('(identifier)', snippet);
-                        }
-
-//      number
-
-                        if (c.isDigit()) {
-                            return number(snippet);
-                        }
-                        switch (snippet) {
-
-//      string
-
-                        case '"':
-                        case "'":
-                            return string(snippet);
-
-//      // comment
-
-                        case '//':
-                            comment(source_row);
-                            source_row = '';
-                            break;
-
-//      /* comment
-
-                        case '/*':
-                            for (;;) {
-                                i = source_row.search(lx);
-                                if (i >= 0) {
-                                    break;
-                                }
-                                comment(source_row);
-                                if (!next_line()) {
-                                    stop_at('unclosed_comment', line, character);
-                                }
-                            }
-                            comment(source_row.slice(0, i));
-                            character += i + 2;
-                            if (source_row.charAt(i) === '/') {
-                                stop_at('nested_comment', line, character);
-                            }
-                            source_row = source_row.slice(i + 2);
-                            break;
-
-                        case '':
-                            break;
-//      /
-                        case '/':
-                            if (token.id === '/=') {
-                                stop_at(
-                                    bundle.slash_equal,
-                                    line,
-                                    from
-                                );
-                            }
-                            return prereg
-                                ? regexp()
-                                : it('(punctuator)', snippet);
-
-//      punctuator
-
-                        case '<!--':
-                            length = line;
-//                            c = character;
-                            for (;;) {
-                                i = source_row.indexOf('--');
-                                if (i >= 0) {
-                                    break;
-                                }
-                                i = source_row.indexOf('<!');
-                                if (i >= 0) {
-                                    stop_at('nested_comment',
-                                        line, character + i);
-                                }
-                                if (!next_line()) {
-                                    stop_at('unclosed_comment', length, c);
-                                }
-                            }
-                            length = source_row.indexOf('<!');
-                            if (length >= 0 && length < i) {
-                                stop_at('nested_comment',
-                                    line, character + length);
-                            }
-                            character += i;
-                            if (source_row.charAt(i + 2) !== '>') {
-                                stop_at('expected_a', line, character, '-->');
-                            }
-                            character += 3;
-                            source_row = source_row.slice(i + 3);
-                            break;
-                        case '#':
-                            if (xmode === 'html' || xmode === 'styleproperty') {
-                                for (;;) {
-                                    c = source_row.charAt(0);
-                                    if ((c < '0' || c > '9') &&
-                                            (c < 'a' || c > 'f') &&
-                                            (c < 'A' || c > 'F')) {
-                                        break;
-                                    }
-                                    character += 1;
-                                    source_row = source_row.slice(1);
-                                    snippet += c;
-                                }
-                                if (snippet.length !== 4 && snippet.length !== 7) {
-                                    warn_at('bad_color_a', line,
-                                        from + length, snippet);
-                                }
-                                return it('(color)', snippet);
-                            }
-                            return it('(punctuator)', snippet);
-
-                        default:
-                            if (xmode === 'outer' && c === '&') {
-                                character += 1;
-                                source_row = source_row.slice(1);
-                                for (;;) {
-                                    c = source_row.charAt(0);
-                                    character += 1;
-                                    source_row = source_row.slice(1);
-                                    if (c === ';') {
-                                        break;
-                                    }
-                                    if (!((c >= '0' && c <= '9') ||
-                                            (c >= 'a' && c <= 'z') ||
-                                            c === '#')) {
-                                        stop_at('bad_entity', line, from + length,
-                                            character);
-                                    }
-                                }
-                                break;
-                            }
-                            return it('(punctuator)', snippet);
-                        }
-                    }
-                }
-            }
-        };
-    }());
-
-
-    function add_label(token, kind, name) {
-
-// Define the symbol in the current function in the current scope.
-
-        name = name || token.string;
-
-// Global variables cannot be created in the safe subset. If a global variable
-// already exists, do nothing. If it is predefined, define it.
-
-        if (funct === global_funct) {
-            if (option.safe) {
-                warn('adsafe_a', token, name);
-            }
-            if (typeof global_funct[name] !== 'string') {
-                token.writeable = typeof predefined[name] === 'boolean'
-                    ? predefined[name]
-                    : true;
-                token.funct = funct;
-                global_scope[name] = token;
-            }
-            if (kind === 'becoming') {
-                kind = 'var';
-            }
-
-// Ordinary variables.
-
-        } else {
-
-// Warn if the variable already exists.
-
-            if (typeof funct[name] === 'string') {
-                if (funct[name] === 'undef') {
-                    if (!option.undef) {
-                        warn('used_before_a', token, name);
-                    }
-                    kind = 'var';
-                } else {
-                    warn('already_defined', token, name);
-                }
-            } else {
-
-// Add the symbol to the current function.
-
-                token.funct = funct;
-                token.writeable = true;
-                scope[name] = token;
-            }
-        }
-        funct[name] = kind;
-    }
-
-
-    function peek(distance) {
-
-// Peek ahead to a future token. The distance is how far ahead to look. The
-// default is the next token.
-
-        var found, slot = 0;
-
-        distance = distance || 0;
-        while (slot <= distance) {
-            found = lookahead[slot];
-            if (!found) {
-                found = lookahead[slot] = lex.token();
-            }
-            slot += 1;
-        }
-        return found;
-    }
-
-
-    function advance(id, match) {
-
-// Produce the next token, also looking for programming errors.
-
-        if (indent) {
-
-// If indentation checking was requested, then inspect all of the line breakings.
-// The var statement is tricky because the names might be aligned or not. We
-// look at the first line break after the var to determine the programmer's
-// intention.
-
-            if (var_mode && next_token.line !== token.line) {
-                if ((var_mode !== indent || !next_token.edge) &&
-                        next_token.from === indent.at -
-                        (next_token.edge ? option.indent : 0)) {
-                    var dent = indent;
-                    for (;;) {
-                        dent.at -= option.indent;
-                        if (dent === var_mode) {
-                            break;
-                        }
-                        dent = dent.was;
-                    }
-                    dent.open = false;
-                }
-                var_mode = null;
-            }
-            if (next_token.id === '?' && indent.mode === ':' &&
-                    token.line !== next_token.line) {
-                indent.at -= option.indent;
-            }
-            if (indent.open) {
-
-// If the token is an edge.
-
-                if (next_token.edge) {
-                    if (next_token.edge === 'label') {
-                        expected_at(1);
-                    } else if (next_token.edge === 'case') {
-                        expected_at(indent.at - option.indent);
-                    } else if (indent.mode !== 'array' || next_token.line !== token.line) {
-                        expected_at(indent.at);
-                    }
-
-// If the token is not an edge, but is the first token on the line.
-
-                } else if (next_token.line !== token.line) {
-                    if (next_token.from < indent.at + (indent.mode ===
-                            'expression' ? 0 : option.indent)) {
-                        expected_at(indent.at + option.indent);
-                    }
-                    indent.wrap = true;
-                }
-            } else if (next_token.line !== token.line) {
-                if (next_token.edge) {
-                    expected_at(indent.at);
-                } else {
-                    indent.wrap = true;
-                    if (indent.mode === 'statement' || indent.mode === 'var') {
-                        expected_at(indent.at + option.indent);
-                    } else if (next_token.from < indent.at + (indent.mode ===
-                            'expression' ? 0 : option.indent)) {
-                        expected_at(indent.at + option.indent);
-                    }
-                }
-            }
-        }
-
-        switch (token.id) {
-        case '(number)':
-            if (next_token.id === '.') {
-                warn('trailing_decimal_a');
-            }
-            break;
-        case '-':
-            if (next_token.id === '-' || next_token.id === '--') {
-                warn('confusing_a');
-            }
-            break;
-        case '+':
-            if (next_token.id === '+' || next_token.id === '++') {
-                warn('confusing_a');
-            }
-            break;
-        }
-        if (token.id === '(string)' || token.identifier) {
-            anonname = token.string;
-        }
-
-        if (id && next_token.id !== id) {
-            if (match) {
-                warn('expected_a_b_from_c_d', next_token, id,
-                    match.id, match.line, artifact());
-            } else if (!next_token.identifier || next_token.string !== id) {
-                warn('expected_a_b', next_token, id, artifact());
-            }
-        }
-        prev_token = token;
-        token = next_token;
-        next_token = lookahead.shift() || lex.token();
-    }
-
-
-    function advance_identifier(string) {
-        if (next_token.identifier && next_token.string === string) {
-            advance();
-        } else {
-            warn('expected_a_b', next_token, string, artifact());
-        }
-    }
-
-
-    function do_safe() {
-        if (option.adsafe) {
-            option.safe = true;
-        }
-        if (option.safe) {
-            option.browser     =
-                option['continue'] =
-                option.css     =
-                option.debug   =
-                option.devel   =
-                option.evil    =
-                option.forin   =
-                option.newcap  =
-                option.nomen   =
-                option.on      =
-                option.rhino   =
-                option.sloppy  =
-                option.sub     =
-                option.undef   =
-                option.widget  =
-                option.windows = false;
-
-
-            delete predefined.Array;
-            delete predefined.Date;
-            delete predefined.Function;
-            delete predefined.Object;
-            delete predefined['eval'];
-
-            add_to_predefined({
-                ADSAFE: false,
-                lib: false
-            });
-        }
-    }
-
-
-    function do_globals() {
-        var name, writeable;
-        for (;;) {
-            if (next_token.id !== '(string)' && !next_token.identifier) {
-                return;
-            }
-            name = next_token.string;
-            advance();
-            writeable = false;
-            if (next_token.id === ':') {
-                advance(':');
-                switch (next_token.id) {
-                case 'true':
-                    writeable = predefined[name] !== false;
-                    advance('true');
-                    break;
-                case 'false':
-                    advance('false');
-                    break;
-                default:
-                    stop('unexpected_a');
-                }
-            }
-            predefined[name] = writeable;
-            if (next_token.id !== ',') {
-                return;
-            }
-            advance(',');
-        }
-    }
-
-
-    function do_jslint() {
-        var name, value;
-        while (next_token.id === '(string)' || next_token.identifier) {
-            name = next_token.string;
-            advance();
-            if (next_token.id !== ':') {
-                stop('expected_a_b', next_token, ':', artifact());
-            }
-            advance(':');
-            if (typeof jslint_limit[name] === 'number') {
-                value = next_token.number;
-                if (value > jslint_limit[name] || value <= 0 ||
-                        Math.floor(value) !== value) {
-                    stop('expected_small_a');
-                }
-                option[name] = value;
-            } else {
-                if (next_token.id === 'true') {
-                    option[name] = true;
-                } else if (next_token.id === 'false') {
-                    option[name] = false;
-                } else {
-                    stop('unexpected_a');
-                }
-                switch (name) {
-                case 'adsafe':
-                    option.safe = true;
-                    do_safe();
-                    break;
-                case 'safe':
-                    do_safe();
-                    break;
-                }
-            }
-            advance();
-            if (next_token.id === ',') {
-                advance(',');
-            }
-        }
-        assume();
-    }
-
-
-    function do_properties() {
-        var name, type;
-        option.properties = true;
-        if (!funct['(old_property_type)']) {
-            funct['(old_property_type)'] = property_type;
-            property_type = Object.create(property_type);
-        }
-        for (;;) {
-            if (next_token.id !== '(string)' && !next_token.identifier) {
-                return;
-            }
-            name = next_token.string;
-            type = '';
-            advance();
-            if (next_token.id === ':') {
-                advance(':');
-                if (next_token.id === 'function') {
-                    advance('function');
-                    if (is_type[next_token.string] === true) {
-                        type = 'function ' + next_token.string;
-                        advance();
-                    } else {
-                        type = 'function';
-                    }
-                } else {
-                    type = next_token.string;
-                    if (is_type[type] !== true) {
-                        warn('expected_type_a', next_token);
-                        type = '';
-                    }
-                    advance();
-                }
-            }
-            property_type[name] = type;
-            if (next_token.id !== ',') {
-                return;
-            }
-            advance(',');
-        }
-    }
-
-
-    directive = function directive() {
-        var command = this.id,
-            old_comments_off = comments_off,
-            old_indent = indent;
-        comments_off = true;
-        indent = null;
-        if (next_token.line === token.line && next_token.from === token.thru) {
-            warn('missing_space_a_b', next_token, artifact(token), artifact());
-        }
-        if (lookahead.length > 0) {
-            warn('unexpected_a', this);
-        }
-        switch (command) {
-        case '/*properties':
-        case '/*property':
-        case '/*members':
-        case '/*member':
-            do_properties();
-            break;
-        case '/*jslint':
-            if (option.safe) {
-                warn('adsafe_a', this);
-            }
-            do_jslint();
-            break;
-        case '/*globals':
-        case '/*global':
-            if (option.safe) {
-                warn('adsafe_a', this);
-            }
-            do_globals();
-            break;
-        default:
-            stop('unexpected_a', this);
-        }
-        comments_off = old_comments_off;
-        advance('*/');
-        indent = old_indent;
-    };
-
-
-// Indentation intention
-
-    function edge(mode) {
-        next_token.edge = indent ? indent.open && (mode || 'edge') : '';
-    }
-
-
-    function step_in(mode) {
-        var open;
-        if (typeof mode === 'number') {
-            indent = {
-                at: +mode,
-                open: true,
-                was: indent
-            };
-        } else if (!indent) {
-            indent = {
-                at: 1,
-                mode: 'statement',
-                open: true
-            };
-        } else {
-            open = mode === 'var' ||
-                (next_token.line !== token.line && mode !== 'statement');
-            indent = {
-                at: (open || mode === 'control'
-                    ? indent.at + option.indent
-                    : indent.at) + (indent.wrap ? option.indent : 0),
-                mode: mode,
-                open: open,
-                was: indent
-            };
-            if (mode === 'var' && open) {
-                var_mode = indent;
-            }
-        }
-    }
-
-    function step_out(id, symbol) {
-        if (id) {
-            if (indent && indent.open) {
-                indent.at -= option.indent;
-                edge();
-            }
-            advance(id, symbol);
-        }
-        if (indent) {
-            indent = indent.was;
-        }
-    }
-
-// Functions for conformance of whitespace.
-
-    function one_space(left, right) {
-        left = left || token;
-        right = right || next_token;
-        if (right.id !== '(end)' && !option.white &&
-                (token.line !== right.line ||
-                token.thru + 1 !== right.from)) {
-            warn('expected_space_a_b', right, artifact(token), artifact(right));
-        }
-    }
-
-    function one_space_only(left, right) {
-        left = left || token;
-        right = right || next_token;
-        if (right.id !== '(end)' && (left.line !== right.line ||
-                (!option.white && left.thru + 1 !== right.from))) {
-            warn('expected_space_a_b', right, artifact(left), artifact(right));
-        }
-    }
-
-    function no_space(left, right) {
-        left = left || token;
-        right = right || next_token;
-        if ((!option.white || xmode === 'styleproperty' || xmode === 'style') &&
-                left.thru !== right.from && left.line === right.line) {
-            warn('unexpected_space_a_b', right, artifact(left), artifact(right));
-        }
-    }
-
-    function no_space_only(left, right) {
-        left = left || token;
-        right = right || next_token;
-        if (right.id !== '(end)' && (left.line !== right.line ||
-                (!option.white && left.thru !== right.from))) {
-            warn('unexpected_space_a_b', right, artifact(left), artifact(right));
-        }
-    }
-
-    function spaces(left, right) {
-        if (!option.white) {
-            left = left || token;
-            right = right || next_token;
-            if (left.thru === right.from && left.line === right.line) {
-                warn('missing_space_a_b', right, artifact(left), artifact(right));
-            }
-        }
-    }
-
-    function comma() {
-        if (next_token.id !== ',') {
-            warn_at('expected_a_b', token.line, token.thru, ',', artifact());
-        } else {
-            if (!option.white) {
-                no_space_only();
-            }
-            advance(',');
-            spaces();
-        }
-    }
-
-
-    function semicolon() {
-        if (next_token.id !== ';') {
-            warn_at('expected_a_b', token.line, token.thru, ';', artifact());
-        } else {
-            if (!option.white) {
-                no_space_only();
-            }
-            advance(';');
-            if (semicolon_coda[next_token.id] !== true) {
-                spaces();
-            }
-        }
-    }
-
-    function use_strict() {
-        if (next_token.string === 'use strict') {
-            if (strict_mode) {
-                warn('unnecessary_use');
-            }
-            edge();
-            advance();
-            semicolon();
-            strict_mode = true;
-            option.newcap = false;
-            option.undef = false;
-            return true;
-        } else {
-            return false;
-        }
-    }
-
-
-    function are_similar(a, b) {
-        if (a === b) {
-            return true;
-        }
-        if (Array.isArray(a)) {
-            if (Array.isArray(b) && a.length === b.length) {
-                var i;
-                for (i = 0; i < a.length; i += 1) {
-                    if (!are_similar(a[i], b[i])) {
-                        return false;
-                    }
-                }
-                return true;
-            }
-            return false;
-        }
-        if (Array.isArray(b)) {
-            return false;
-        }
-        if (a.id === '(number)' && b.id === '(number)') {
-            return a.number === b.number;
-        }
-        if (a.arity === b.arity && a.string === b.string) {
-            switch (a.arity) {
-            case 'prefix':
-            case 'suffix':
-            case undefined:
-                return a.id === b.id && are_similar(a.first, b.first);
-            case 'infix':
-                return are_similar(a.first, b.first) &&
-                    are_similar(a.second, b.second);
-            case 'ternary':
-                return are_similar(a.first, b.first) &&
-                    are_similar(a.second, b.second) &&
-                    are_similar(a.third, b.third);
-            case 'function':
-            case 'regexp':
-                return false;
-            default:
-                return true;
-            }
-        } else {
-            if (a.id === '.' && b.id === '[' && b.arity === 'infix') {
-                return a.second.string === b.second.string && b.second.id === '(string)';
-            } else if (a.id === '[' && a.arity === 'infix' && b.id === '.') {
-                return a.second.string === b.second.string && a.second.id === '(string)';
-            }
-        }
-        return false;
-    }
-
-
-// This is the heart of JSLINT, the Pratt parser. In addition to parsing, it
-// is looking for ad hoc lint patterns. We add .fud to Pratt's model, which is
-// like .nud except that it is only used on the first token of a statement.
-// Having .fud makes it much easier to define statement-oriented languages like
-// JavaScript. I retained Pratt's nomenclature.
-
-// .nud     Null denotation
-// .fud     First null denotation
-// .led     Left denotation
-//  lbp     Left binding power
-//  rbp     Right binding power
-
-// They are elements of the parsing method called Top Down Operator Precedence.
-
-    function expression(rbp, initial) {
-
-// rbp is the right binding power.
-// initial indicates that this is the first expression of a statement.
-
-        var left;
-        if (next_token.id === '(end)') {
-            stop('unexpected_a', token, next_token.id);
-        }
-        advance();
-        if (option.safe && scope[token.string] &&
-                scope[token.string] === global_scope[token.string] &&
-                (next_token.id !== '(' && next_token.id !== '.')) {
-            warn('adsafe_a', token);
-        }
-        if (initial) {
-            anonname = 'anonymous';
-            funct['(verb)'] = token.string;
-        }
-        if (initial === true && token.fud) {
-            left = token.fud();
-        } else {
-            if (token.nud) {
-                left = token.nud();
-            } else {
-                if (next_token.id === '(number)' && token.id === '.') {
-                    warn('leading_decimal_a', token, artifact());
-                    advance();
-                    return token;
-                } else {
-                    stop('expected_identifier_a', token, token.id);
-                }
-            }
-            while (rbp < next_token.lbp) {
-                advance();
-                if (token.led) {
-                    left = token.led(left);
-                } else {
-                    stop('expected_operator_a', token, token.id);
-                }
-            }
-        }
-        return left;
-    }
-
-
-// Functional constructors for making the symbols that will be inherited by
-// tokens.
-
-    function symbol(s, p) {
-        var x = syntax[s];
-        if (!x || typeof x !== 'object') {
-            syntax[s] = x = {
-                id: s,
-                lbp: p || 0,
-                string: s
-            };
-        }
-        return x;
-    }
-
-    function postscript(x) {
-        x.postscript = true;
-        return x;
-    }
-
-    function ultimate(s) {
-        var x = symbol(s, 0);
-        x.from = 1;
-        x.thru = 1;
-        x.line = 0;
-        x.edge = 'edge';
-        s.string = s;
-        return postscript(x);
-    }
-
-
-    function stmt(s, f) {
-        var x = symbol(s);
-        x.identifier = x.reserved = true;
-        x.fud = f;
-        return x;
-    }
-
-    function labeled_stmt(s, f) {
-        var x = stmt(s, f);
-        x.labeled = true;
-    }
-
-    function disrupt_stmt(s, f) {
-        var x = stmt(s, f);
-        x.disrupt = true;
-    }
-
-
-    function reserve_name(x) {
-        var c = x.id.charAt(0);
-        if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
-            x.identifier = x.reserved = true;
-        }
-        return x;
-    }
-
-
-    function prefix(s, f, type) {
-        var x = symbol(s, 150);
-        reserve_name(x);
-        x.nud = typeof f === 'function'
-            ? f
-            : function () {
-                if (s === 'typeof') {
-                    one_space();
-                } else {
-                    no_space_only();
-                }
-                this.first = expression(150);
-                this.arity = 'prefix';
-                if (this.id === '++' || this.id === '--') {
-                    if (!option.plusplus) {
-                        warn('unexpected_a', this);
-                    } else if ((!this.first.identifier || this.first.reserved) &&
-                            this.first.id !== '.' && this.first.id !== '[') {
-                        warn('bad_operand', this);
-                    }
-                }
-                this.type = type;
-                return this;
-            };
-        return x;
-    }
-
-
-    function type(s, t, nud) {
-        var x = symbol(s);
-        x.arity = x.type = t;
-        if (nud) {
-            x.nud = nud;
-        }
-        return x;
-    }
-
-
-    function reserve(s, f) {
-        var x = symbol(s);
-        x.identifier = x.reserved = true;
-        if (typeof f === 'function') {
-            x.nud = f;
-        }
-        return x;
-    }
-
-
-    function constant(name, type) {
-        var x = reserve(name);
-        x.type = type;
-        x.string = name;
-        x.nud = return_this;
-        return x;
-    }
-
-
-    function reservevar(s, v) {
-        return reserve(s, function () {
-            if (typeof v === 'function') {
-                v(this);
-            }
-            return this;
-        });
-    }
-
-
-    function infix(s, p, f, type, w) {
-        var x = symbol(s, p);
-        reserve_name(x);
-        x.led = function (left) {
-            this.arity = 'infix';
-            if (!w) {
-                spaces(prev_token, token);
-                spaces();
-            }
-            if (!option.bitwise && this.bitwise) {
-                warn('unexpected_a', this);
-            }
-            if (typeof f === 'function') {
-                return f(left, this);
-            } else {
-                this.first = left;
-                this.second = expression(p);
-                return this;
-            }
-        };
-        if (type) {
-            x.type = type;
-        }
-        return x;
-    }
-
-    function expected_relation(node, message) {
-        if (node.assign) {
-            warn(message || bundle.conditional_assignment, node);
-        }
-        return node;
-    }
-
-    function expected_condition(node, message) {
-        switch (node.id) {
-        case '[':
-        case '-':
-            if (node.arity !== 'infix') {
-                warn(message || bundle.weird_condition, node);
-            }
-            break;
-        case 'false':
-        case 'function':
-        case 'Infinity':
-        case 'NaN':
-        case 'null':
-        case 'true':
-        case 'undefined':
-        case 'void':
-        case '(number)':
-        case '(regexp)':
-        case '(string)':
-        case '{':
-            warn(message || bundle.weird_condition, node);
-            break;
-        case '(':
-            if (node.first.id === '.' && numbery[node.first.second.string] === true) {
-                warn(message || bundle.weird_condition, node);
-            }
-            break;
-        }
-        return node;
-    }
-
-    function check_relation(node) {
-        switch (node.arity) {
-        case 'prefix':
-            switch (node.id) {
-            case '{':
-            case '[':
-                warn('unexpected_a', node);
-                break;
-            case '!':
-                warn('confusing_a', node);
-                break;
-            }
-            break;
-        case 'function':
-        case 'regexp':
-            warn('unexpected_a', node);
-            break;
-        default:
-            if (node.id  === 'NaN') {
-                warn('isnan', node);
-            }
-        }
-        return node;
-    }
-
-
-    function relation(s, eqeq) {
-        return infix(s, 100, function (left, that) {
-            check_relation(left);
-            if (eqeq && !option.eqeq) {
-                warn('expected_a_b', that, eqeq, that.id);
-            }
-            var right = expression(100);
-            if (are_similar(left, right) ||
-                    ((left.id === '(string)' || left.id === '(number)') &&
-                    (right.id === '(string)' || right.id === '(number)'))) {
-                warn('weird_relation', that);
-            }
-            that.first = left;
-            that.second = check_relation(right);
-            return that;
-        }, 'boolean');
-    }
-
-
-    function assignop(s, op) {
-        var x = infix(s, 20, function (left, that) {
-            var l;
-            that.first = left;
-            if (left.identifier) {
-                if (scope[left.string]) {
-                    if (scope[left.string].writeable === false) {
-                        warn('read_only', left);
-                    }
-                } else {
-                    stop('read_only');
-                }
-            } else if (option.safe) {
-                l = left;
-                do {
-                    if (typeof predefined[l.string] === 'boolean') {
-                        warn('adsafe_a', l);
-                    }
-                    l = l.first;
-                } while (l);
-            }
-            if (left === syntax['function']) {
-                warn('identifier_function', token);
-            }
-            if (left.id === '.' || left.id === '[') {
-                if (!left.first || left.first.string === 'arguments') {
-                    warn('bad_assignment', that);
-                }
-            } else if (left.identifier && !left.reserved) {
-                if (funct[left.string] === 'exception') {
-                    warn('assign_exception', left);
-                }
-            }
-            that.second = expression(19);
-            if (that.id === '=' && are_similar(that.first, that.second)) {
-                warn('weird_assignment', that);
-            }
-            return that;
-        });
-        x.assign = true;
-        if (op) {
-            if (syntax[op].type) {
-                x.type = syntax[op].type;
-            }
-            if (syntax[op].bitwise) {
-                x.bitwise = true;
-            }
-        }
-        return x;
-    }
-
-
-    function bitwise(s, p) {
-        var x = infix(s, p, 'number');
-        x.bitwise = true;
-        return x;
-    }
-
-
-    function suffix(s) {
-        var x = symbol(s, 150);
-        x.led = function (left) {
-            no_space_only(prev_token, token);
-            if (!option.plusplus) {
-                warn('unexpected_a', this);
-            } else if ((!left.identifier || left.reserved) &&
-                    left.id !== '.' && left.id !== '[') {
-                warn('bad_operand', this);
-            }
-            this.first = left;
-            this.arity = 'suffix';
-            return this;
-        };
-        return x;
-    }
-
-
-    function optional_identifier() {
-        if (next_token.identifier) {
-            advance();
-            if (option.safe && banned[token.string]) {
-                warn('adsafe_a', token);
-            } else if (token.reserved && !option.es5) {
-                warn('expected_identifier_a_reserved', token);
-            }
-            return token.string;
-        }
-    }
-
-
-    function identifier() {
-        var i = optional_identifier();
-        if (!i) {
-            stop(token.id === 'function' && next_token.id === '('
-                ? 'name_function'
-                : 'expected_identifier_a');
-        }
-        return i;
-    }
-
-
-    function statement() {
-
-        var label, old_scope = scope, the_statement;
-
-// We don't like the empty statement.
-
-        if (next_token.id === ';') {
-            warn('unexpected_a');
-            semicolon();
-            return;
-        }
-
-// Is this a labeled statement?
-
-        if (next_token.identifier && !next_token.reserved && peek().id === ':') {
-            edge('label');
-            label = next_token;
-            advance();
-            advance(':');
-            scope = Object.create(old_scope);
-            add_label(label, 'label');
-            if (next_token.labeled !== true) {
-                warn('label_a_b', next_token, label.string, artifact());
-            } else if (jx.test(label.string + ':')) {
-                warn('url', label);
-            } else if (funct === global_funct) {
-                stop('unexpected_a', token);
-            }
-            next_token.label = label;
-        }
-
-// Parse the statement.
-
-        edge();
-        step_in('statement');
-        the_statement = expression(0, true);
-        if (the_statement) {
-
-// Look for the final semicolon.
-
-            if (the_statement.arity === 'statement') {
-                if (the_statement.id === 'switch' ||
-                        (the_statement.block && the_statement.id !== 'do')) {
-                    spaces();
-                } else {
-                    semicolon();
-                }
-            } else {
-
-// If this is an expression statement, determine if it is acceptable.
-// We do not like
-//      new Blah();
-// statments. If it is to be used at all, new should only be used to make
-// objects, not side effects. The expression statements we do like do
-// assignment or invocation or delete.
-
-                if (the_statement.id === '(') {
-                    if (the_statement.first.id === 'new') {
-                        warn('bad_new');
-                    }
-                } else if (!the_statement.assign &&
-                        the_statement.id !== 'delete' &&
-                        the_statement.id !== '++' &&
-                        the_statement.id !== '--') {
-                    warn('assignment_function_expression', token);
-                }
-                semicolon();
-            }
-        }
-        step_out();
-        scope = old_scope;
-        return the_statement;
-    }
-
-
-    function statements() {
-        var array = [], disruptor, the_statement;
-
-// A disrupt statement may not be followed by any other statement.
-// If the last statement is disrupt, then the sequence is disrupt.
-
-        while (next_token.postscript !== true) {
-            if (next_token.id === ';') {
-                warn('unexpected_a', next_token);
-                semicolon();
-            } else {
-                if (next_token.string === 'use strict') {
-                    if ((!node_js && xmode !== 'script') || funct !== global_funct || array.length > 0) {
-                        warn('function_strict');
-                    }
-                    use_strict();
-                }
-                if (disruptor) {
-                    warn('unreachable_a_b', next_token, next_token.string,
-                        disruptor.string);
-                    disruptor = null;
-                }
-                the_statement = statement();
-                if (the_statement) {
-                    array.push(the_statement);
-                    if (the_statement.disrupt) {
-                        disruptor = the_statement;
-                        array.disrupt = true;
-                    }
-                }
-            }
-        }
-        return array;
-    }
-
-
-    function block(ordinary) {
-
-// array block is array sequence of statements wrapped in braces.
-// ordinary is false for function bodies and try blocks.
-// ordinary is true for if statements, while, etc.
-
-        var array,
-            curly = next_token,
-            old_in_block = in_block,
-            old_scope = scope,
-            old_strict_mode = strict_mode;
-
-        in_block = ordinary;
-        scope = Object.create(scope);
-        spaces();
-        if (next_token.id === '{') {
-            advance('{');
-            step_in();
-            if (!ordinary && !use_strict() && !old_strict_mode &&
-                    !option.sloppy && funct['(context)'] === global_funct) {
-                warn('missing_use_strict');
-            }
-            array = statements();
-            strict_mode = old_strict_mode;
-            step_out('}', curly);
-        } else if (!ordinary) {
-            stop('expected_a_b', next_token, '{', artifact());
-        } else {
-            warn('expected_a_b', next_token, '{', artifact());
-            array = [statement()];
-            array.disrupt = array[0].disrupt;
-        }
-        funct['(verb)'] = null;
-        scope = old_scope;
-        in_block = old_in_block;
-        if (ordinary && array.length === 0) {
-            warn('empty_block');
-        }
-        return array;
-    }
-
-
-    function tally_property(name) {
-        if (option.properties && typeof property_type[name] !== 'string') {
-            warn('unexpected_property_a', token, name);
-        }
-        if (typeof member[name] === 'number') {
-            member[name] += 1;
-        } else {
-            member[name] = 1;
-        }
-    }
-
-
-// ECMAScript parser
-
-    syntax['(identifier)'] = {
-        id: '(identifier)',
-        lbp: 0,
-        identifier: true,
-        nud: function () {
-            var name = this.string,
-                variable = scope[name],
-                site,
-                writeable;
-
-// If the variable is not in scope, then we may have an undeclared variable.
-// Check the predefined list. If it was predefined, create the global
-// variable.
-
-            if (typeof variable !== 'object') {
-                writeable = predefined[name];
-                if (typeof writeable === 'boolean') {
-                    global_scope[name] = variable = {
-                        string:    name,
-                        writeable: writeable,
-                        funct:     global_funct
-                    };
-                    global_funct[name] = 'var';
-
-// But if the variable is not in scope, and is not predefined, and if we are not
-// in the global scope, then we have an undefined variable error.
-
-                } else {
-                    if (!option.undef) {
-                        warn('used_before_a', token);
-                    }
-                    scope[name] = variable = {
-                        string: name,
-                        writeable: true,
-                        funct: funct
-                    };
-                    funct[name] = 'undef';
-                }
-
-            }
-            site = variable.funct;
-
-// The name is in scope and defined in the current function.
-
-            if (funct === site) {
-
-//      Change 'unused' to 'var', and reject labels.
-
-                switch (funct[name]) {
-                case 'becoming':
-                    warn('unexpected_a', token);
-                    funct[name] = 'var';
-                    break;
-                case 'unused':
-                    funct[name] = 'var';
-                    break;
-                case 'unparam':
-                    funct[name] = 'parameter';
-                    break;
-                case 'unction':
-                    funct[name] = 'function';
-                    break;
-                case 'label':
-                    warn('a_label', token, name);
-                    break;
-                }
-
-// If the name is already defined in the current
-// function, but not as outer, then there is a scope error.
-
-            } else {
-                switch (funct[name]) {
-                case 'closure':
-                case 'function':
-                case 'var':
-                case 'unused':
-                    warn('a_scope', token, name);
-                    break;
-                case 'label':
-                    warn('a_label', token, name);
-                    break;
-                case 'outer':
-                case 'global':
-                    break;
-                default:
-
-// If the name is defined in an outer function, make an outer entry, and if
-// it was unused, make it var.
-
-                    switch (site[name]) {
-                    case 'becoming':
-                    case 'closure':
-                    case 'function':
-                    case 'parameter':
-                    case 'unction':
-                    case 'unused':
-                    case 'var':
-                        site[name] = 'closure';
-                        funct[name] = site === global_funct
-                            ? 'global'
-                            : 'outer';
-                        break;
-                    case 'unparam':
-                        site[name] = 'parameter';
-                        funct[name] = 'outer';
-                        break;
-                    case 'undef':
-                        funct[name] = 'undef';
-                        break;
-                    case 'label':
-                        warn('a_label', token, name);
-                        break;
-                    }
-                }
-            }
-            return this;
-        },
-        led: function () {
-            stop('expected_operator_a');
-        }
-    };
-
-// Build the syntax table by declaring the syntactic elements.
-
-    type('(array)', 'array');
-    type('(color)', 'color');
-    type('(function)', 'function');
-    type('(number)', 'number', return_this);
-    type('(object)', 'object');
-    type('(string)', 'string', return_this);
-    type('(boolean)', 'boolean', return_this);
-    type('(range)', 'range');
-    type('(regexp)', 'regexp', return_this);
-
-    ultimate('(begin)');
-    ultimate('(end)');
-    ultimate('(error)');
-    postscript(symbol('</'));
-    symbol('<!');
-    symbol('<!--');
-    symbol('-->');
-    postscript(symbol('}'));
-    symbol(')');
-    symbol(']');
-    postscript(symbol('"'));
-    postscript(symbol('\''));
-    symbol(';');
-    symbol(':');
-    symbol(',');
-    symbol('#');
-    symbol('@');
-    symbol('*/');
-    postscript(reserve('case'));
-    reserve('catch');
-    postscript(reserve('default'));
-    reserve('else');
-    reserve('finally');
-
-    reservevar('arguments', function (x) {
-        if (strict_mode && funct === global_funct) {
-            warn('strict', x);
-        } else if (option.safe) {
-            warn('adsafe_a', x);
-        }
-    });
-    reservevar('eval', function (x) {
-        if (option.safe) {
-            warn('adsafe_a', x);
-        }
-    });
-    constant('false', 'boolean');
-    constant('Infinity', 'number');
-    constant('NaN', 'number');
-    constant('null', '');
-    reservevar('this', function (x) {
-        if (option.safe) {
-            warn('adsafe_a', x);
-        } else if (strict_mode && funct['(token)'].arity === 'statement' &&
-                funct['(name)'].charAt(0) > 'Z') {
-            warn('strict', x);
-        }
-    });
-    constant('true', 'boolean');
-    constant('undefined', '');
-
-    infix('?', 30, function (left, that) {
-        step_in('?');
-        that.first = expected_condition(expected_relation(left));
-        that.second = expression(0);
-        spaces();
-        step_out();
-        var colon = next_token;
-        advance(':');
-        step_in(':');
-        spaces();
-        that.third = expression(10);
-        that.arity = 'ternary';
-        if (are_similar(that.second, that.third)) {
-            warn('weird_ternary', colon);
-        } else if (are_similar(that.first, that.second)) {
-            warn('use_or', that);
-        }
-        step_out();
-        return that;
-    });
-
-    infix('||', 40, function (left, that) {
-        function paren_check(that) {
-            if (that.id === '&&' && !that.paren) {
-                warn('and', that);
-            }
-            return that;
-        }
-
-        that.first = paren_check(expected_condition(expected_relation(left)));
-        that.second = paren_check(expected_relation(expression(40)));
-        if (are_similar(that.first, that.second)) {
-            warn('weird_condition', that);
-        }
-        return that;
-    });
-
-    infix('&&', 50, function (left, that) {
-        that.first = expected_condition(expected_relation(left));
-        that.second = expected_relation(expression(50));
-        if (are_similar(that.first, that.second)) {
-            warn('weird_condition', that);
-        }
-        return that;
-    });
-
-    prefix('void', function () {
-        this.first = expression(0);
-        this.arity = 'prefix';
-        if (option.es5) {
-            warn('expected_a_b', this, 'undefined', 'void');
-        } else if (this.first.number !== 0) {
-            warn('expected_a_b', this.first, '0', artifact(this.first));
-        }
-        this.type = 'undefined';
-        return this;
-    });
-
-    bitwise('|', 70);
-    bitwise('^', 80);
-    bitwise('&', 90);
-
-    relation('==', '===');
-    relation('===');
-    relation('!=', '!==');
-    relation('!==');
-    relation('<');
-    relation('>');
-    relation('<=');
-    relation('>=');
-
-    bitwise('<<', 120);
-    bitwise('>>', 120);
-    bitwise('>>>', 120);
-
-    infix('in', 120, function (left, that) {
-        warn('infix_in', that);
-        that.left = left;
-        that.right = expression(130);
-        return that;
-    }, 'boolean');
-    infix('instanceof', 120, null, 'boolean');
-    infix('+', 130, function (left, that) {
-        if (left.id === '(number)') {
-            if (left.number === 0) {
-                warn('unexpected_a', left, '0');
-            }
-        } else if (left.id === '(string)') {
-            if (left.string === '') {
-                warn('expected_a_b', left, 'String', '\'\'');
-            }
-        }
-        var right = expression(130);
-        if (right.id === '(number)') {
-            if (right.number === 0) {
-                warn('unexpected_a', right, '0');
-            }
-        } else if (right.id === '(string)') {
-            if (right.string === '') {
-                warn('expected_a_b', right, 'String', '\'\'');
-            }
-        }
-        if (left.id === right.id) {
-            if (left.id === '(string)' || left.id === '(number)') {
-                if (left.id === '(string)') {
-                    left.string += right.string;
-                    if (jx.test(left.string)) {
-                        warn('url', left);
-                    }
-                } else {
-                    left.number += right.number;
-                }
-                left.thru = right.thru;
-                return left;
-            }
-        }
-        that.first = left;
-        that.second = right;
-        return that;
-    });
-    prefix('+', 'num');
-    prefix('+++', function () {
-        warn('confusing_a', token);
-        this.first = expression(150);
-        this.arity = 'prefix';
-        return this;
-    });
-    infix('+++', 130, function (left) {
-        warn('confusing_a', token);
-        this.first = left;
-        this.second = expression(130);
-        return this;
-    });
-    infix('-', 130, function (left, that) {
-        if ((left.id === '(number)' && left.number === 0) || left.id === '(string)') {
-            warn('unexpected_a', left);
-        }
-        var right = expression(130);
-        if ((right.id === '(number)' && right.number === 0) || right.id === '(string)') {
-            warn('unexpected_a', left);
-        }
-        if (left.id === right.id && left.id === '(number)') {
-            left.number -= right.number;
-            left.thru = right.thru;
-            return left;
-        }
-        that.first = left;
-        that.second = right;
-        return that;
-    }, 'number');
-    prefix('-');
-    prefix('---', function () {
-        warn('confusing_a', token);
-        this.first = expression(150);
-        this.arity = 'prefix';
-        return this;
-    });
-    infix('---', 130, function (left) {
-        warn('confusing_a', token);
-        this.first = left;
-        this.second = expression(130);
-        return this;
-    });
-    infix('*', 140, function (left, that) {
-        if ((left.id === '(number)' && (left.number === 0 || left.number === 1)) || left.id === '(string)') {
-            warn('unexpected_a', left);
-        }
-        var right = expression(140);
-        if ((right.id === '(number)' && (right.number === 0 || right.number === 1)) || right.id === '(string)') {
-            warn('unexpected_a', right);
-        }
-        if (left.id === right.id && left.id === '(number)') {
-            left.number *= right.number;
-            left.thru = right.thru;
-            return left;
-        }
-        that.first = left;
-        that.second = right;
-        return that;
-    }, 'number');
-    infix('/', 140, function (left, that) {
-        if ((left.id === '(number)' && left.number === 0) || left.id === '(string)') {
-            warn('unexpected_a', left);
-        }
-        var right = expression(140);
-        if ((right.id === '(number)' && (right.number === 0 || right.number === 1)) || right.id === '(string)') {
-            warn('unexpected_a', right);
-        }
-        if (left.id === right.id && left.id === '(number)') {
-            left.number /= right.number;
-            left.thru = right.thru;
-            return left;
-        }
-        that.first = left;
-        that.second = right;
-        return that;
-    }, 'number');
-    infix('%', 140, function (left, that) {
-        if ((left.id === '(number)' && (left.number === 0 || left.number === 1)) || left.id === '(string)') {
-            warn('unexpected_a', left);
-        }
-        var right = expression(140);
-        if ((right.id === '(number)' && right.number === 0) || right.id === '(string)') {
-            warn('unexpected_a', right);
-        }
-        if (left.id === right.id && left.id === '(number)') {
-            left.number %= right.number;
-            left.thru = right.thru;
-            return left;
-        }
-        that.first = left;
-        that.second = right;
-        return that;
-    }, 'number');
-
-    suffix('++');
-    prefix('++');
-
-    suffix('--');
-    prefix('--');
-    prefix('delete', function () {
-        one_space();
-        var p = expression(0);
-        if (!p || (p.id !== '.' && p.id !== '[')) {
-            warn('deleted');
-        }
-        this.first = p;
-        return this;
-    });
-
-
-    prefix('~', function () {
-        no_space_only();
-        if (!option.bitwise) {
-            warn('unexpected_a', this);
-        }
-        expression(150);
-        return this;
-    }, 'number');
-    prefix('!', function () {
-        no_space_only();
-        this.first = expected_condition(expression(150));
-        this.arity = 'prefix';
-        if (bang[this.first.id] === true || this.first.assign) {
-            warn('confusing_a', this);
-        }
-        return this;
-    }, 'boolean');
-    prefix('typeof', null, 'string');
-    prefix('new', function () {
-        one_space();
-        var c = expression(160), n, p, v;
-        this.first = c;
-        if (c.id !== 'function') {
-            if (c.identifier) {
-                switch (c.string) {
-                case 'Object':
-                    warn('use_object', token);
-                    break;
-                case 'Array':
-                    if (next_token.id === '(') {
-                        p = next_token;
-                        p.first = this;
-                        advance('(');
-                        if (next_token.id !== ')') {
-                            n = expression(0);
-                            p.second = [n];
-                            if (n.type !== 'number' || next_token.id === ',') {
-                                warn('use_array', p);
-                            }
-                            while (next_token.id === ',') {
-                                advance(',');
-                                p.second.push(expression(0));
-                            }
-                        } else {
-                            warn('use_array', token);
-                        }
-                        advance(')', p);
-                        return p;
-                    }
-                    warn('use_array', token);
-                    break;
-                case 'Number':
-                case 'String':
-                case 'Boolean':
-                case 'Math':
-                case 'JSON':
-                    warn('not_a_constructor', c);
-                    break;
-                case 'Function':
-                    if (!option.evil) {
-                        warn('function_eval');
-                    }
-                    break;
-                case 'Date':
-                case 'RegExp':
-                    break;
-                default:
-                    if (c.id !== 'function') {
-                        v = c.string.charAt(0);
-                        if (!option.newcap && (v < 'A' || v > 'Z')) {
-                            warn('constructor_name_a', token);
-                        }
-                    }
-                }
-            } else {
-                if (c.id !== '.' && c.id !== '[' && c.id !== '(') {
-                    warn('bad_constructor', token);
-                }
-            }
-        } else {
-            warn('weird_new', this);
-        }
-        if (next_token.id !== '(') {
-            warn('missing_a', next_token, '()');
-        }
-        return this;
-    });
-
-    infix('(', 160, function (left, that) {
-        var p;
-        if (indent && indent.mode === 'expression') {
-            no_space(prev_token, token);
-        } else {
-            no_space_only(prev_token, token);
-        }
-        if (!left.immed && left.id === 'function') {
-            warn('wrap_immediate');
-        }
-        p = [];
-        if (left.identifier) {
-            if (left.string.match(/^[A-Z]([A-Z0-9_$]*[a-z][A-Za-z0-9_$]*)?$/)) {
-                if (left.string !== 'Number' && left.string !== 'String' &&
-                        left.string !== 'Boolean' && left.string !== 'Date') {
-                    if (left.string === 'Math' || left.string === 'JSON') {
-                        warn('not_a_function', left);
-                    } else if (left.string === 'Object') {
-                        warn('use_object', token);
-                    } else if (left.string === 'Array' || !option.newcap) {
-                        warn('missing_a', left, 'new');
-                    }
-                }
-            }
-        } else if (left.id === '.') {
-            if (option.safe && left.first.string === 'Math' &&
-                    left.second === 'random') {
-                warn('adsafe_a', left);
-            } else if (left.second.string === 'split' &&
-                    left.first.id === '(string)') {
-                warn('use_array', left.second);
-            }
-        }
-        step_in();
-        if (next_token.id !== ')') {
-            no_space();
-            for (;;) {
-                edge();
-                p.push(expression(10));
-                if (next_token.id !== ',') {
-                    break;
-                }
-                comma();
-            }
-        }
-        no_space();
-        step_out(')', that);
-        if (typeof left === 'object') {
-            if (left.string === 'parseInt' && p.length === 1) {
-                warn('radix', left);
-            }
-            if (!option.evil) {
-                if (left.string === 'eval' || left.string === 'Function' ||
-                        left.string === 'execScript') {
-                    warn('evil', left);
-                } else if (p[0] && p[0].id === '(string)' &&
-                        (left.string === 'setTimeout' ||
-                        left.string === 'setInterval')) {
-                    warn('implied_evil', left);
-                }
-            }
-            if (!left.identifier && left.id !== '.' && left.id !== '[' &&
-                    left.id !== '(' && left.id !== '&&' && left.id !== '||' &&
-                    left.id !== '?') {
-                warn('bad_invocation', left);
-            }
-        }
-        that.first = left;
-        that.second = p;
-        return that;
-    }, '', true);
-
-    prefix('(', function () {
-        step_in('expression');
-        no_space();
-        edge();
-        if (next_token.id === 'function') {
-            next_token.immed = true;
-        }
-        var value = expression(0);
-        value.paren = true;
-        no_space();
-        step_out(')', this);
-        if (value.id === 'function') {
-            if (next_token.id === '(') {
-                warn('move_invocation');
-            } else {
-                warn('bad_wrap', this);
-            }
-        }
-        return value;
-    });
-
-    infix('.', 170, function (left, that) {
-        no_space(prev_token, token);
-        no_space();
-        var name = identifier(), type;
-        if (typeof name === 'string') {
-            tally_property(name);
-        }
-        that.first = left;
-        that.second = token;
-        if (left && left.string === 'arguments' &&
-                (name === 'callee' || name === 'caller')) {
-            warn('avoid_a', left, 'arguments.' + name);
-        } else if (!option.evil && left && left.string === 'document' &&
-                (name === 'write' || name === 'writeln')) {
-            warn('write_is_wrong', left);
-        } else if (option.adsafe) {
-            if (!adsafe_top && left.string === 'ADSAFE') {
-                if (name === 'id' || name === 'lib') {
-                    warn('adsafe_a', that);
-                } else if (name === 'go') {
-                    if (xmode !== 'script') {
-                        warn('adsafe_a', that);
-                    } else if (adsafe_went || next_token.id !== '(' ||
-                            peek(0).id !== '(string)' ||
-                            peek(0).string !== adsafe_id ||
-                            peek(1).id !== ',') {
-                        stop('adsafe_a', that, 'go');
-                    }
-                    adsafe_went = true;
-                    adsafe_may = false;
-                }
-            }
-            adsafe_top = false;
-        }
-        if (!option.evil && (name === 'eval' || name === 'execScript')) {
-            warn('evil');
-        } else if (option.safe) {
-            for (;;) {
-                if (banned[name] === true) {
-                    warn('adsafe_a', token, name);
-                }
-                if (typeof predefined[left.string] !== 'boolean' ||    //// check for writeable
-                        next_token.id === '(') {
-                    break;
-                }
-                if (next_token.id !== '.') {
-                    warn('adsafe_a', that);
-                    break;
-                }
-                advance('.');
-                token.first = that;
-                token.second = name;
-                that = token;
-                name = identifier();
-                if (typeof name === 'string') {
-                    tally_property(name);
-                }
-            }
-        }
-        type = property_type[name];
-        if (type && typeof type === 'string' && type !== '*') {
-            that.type = type;
-        }
-        return that;
-    }, '', true);
-
-    infix('[', 170, function (left, that) {
-        var e, s;
-        no_space_only(prev_token, token);
-        no_space();
-        step_in();
-        edge();
-        e = expression(0);
-        switch (e.type) {
-        case 'number':
-            if (e.id === '(number)' && left.id === 'arguments') {
-                warn('use_param', left);
-            }
-            break;
-        case 'string':
-            if (e.id === '(string)') {
-                if (option.safe && (banned[e.string] ||
-                        e.string.charAt(0) === '_' || e.string.slice(-1) === '_')) {
-                    warn('adsafe_subscript_a', e);
-                } else if (!option.evil &&
-                        (e.string === 'eval' || e.string === 'execScript')) {
-                    warn('evil', e);
-                } else if (!option.sub && ix.test(e.string)) {
-                    s = syntax[e.string];
-                    if (!s || !s.reserved) {
-                        warn('subscript', e);
-                    }
-                }
-                tally_property(e.string);
-            } else if (option.safe && e.id !== 'typeof') {
-                warn('adsafe_subscript_a', e);
-            }
-            break;
-        case undefined:
-            if (option.safe) {
-                warn('adsafe_subscript_a', e);
-            }
-            break;
-        default:
-            if (option.safe) {
-                warn('adsafe_subscript_a', e);
-            }
-        }
-        step_out(']', that);
-        no_space(prev_token, token);
-        that.first = left;
-        that.second = e;
-        return that;
-    }, '', true);
-
-    prefix('[', function () {
-        this.arity = 'prefix';
-        this.first = [];
-        step_in('array');
-        while (next_token.id !== '(end)') {
-            while (next_token.id === ',') {
-                warn('unexpected_a', next_token);
-                advance(',');
-            }
-            if (next_token.id === ']') {
-                break;
-            }
-            indent.wrap = false;
-            edge();
-            this.first.push(expression(10));
-            if (next_token.id === ',') {
-                comma();
-                if (next_token.id === ']' && !option.es5) {
-                    warn('unexpected_a', token);
-                    break;
-                }
-            } else {
-                break;
-            }
-        }
-        step_out(']', this);
-        return this;
-    }, 170);
-
-
-    function property_name() {
-        var id = optional_identifier(true);
-        if (!id) {
-            if (next_token.id === '(string)') {
-                id = next_token.string;
-                if (option.safe) {
-                    if (banned[id]) {
-                        warn('adsafe_a');
-                    } else if (id.charAt(0) === '_' ||
-                            id.charAt(id.length - 1) === '_') {
-                        warn('dangling_a');
-                    }
-                }
-                advance();
-            } else if (next_token.id === '(number)') {
-                id = next_token.number.toString();
-                advance();
-            }
-        }
-        return id;
-    }
-
-
-    function function_params() {
-        var id, paren = next_token, params = [];
-        advance('(');
-        step_in();
-        no_space();
-        if (next_token.id === ')') {
-            no_space();
-            step_out(')', paren);
-            return;
-        }
-        for (;;) {
-            edge();
-            id = identifier();
-            params.push(token);
-            add_label(token, option.unparam ? 'parameter' : 'unparam');
-            if (next_token.id === ',') {
-                comma();
-            } else {
-                no_space();
-                step_out(')', paren);
-                return params;
-            }
-        }
-    }
-
-
-    function complexity(exp) {
-        var score = 0;
-        if (exp) {
-            if (Array.isArray(exp)) {
-                exp.forEach(function (tok) {
-                    score += complexity(tok);
-                });
-            } else {
-                switch (exp.arity) {
-                case 'statement':
-                    switch (exp.id) {
-                    case 'if':
-                        score += complexity(exp.first) + complexity(exp.block) +
-                            complexity(exp['else']) + 1;
-                        break;
-                    case 'while':
-                    case 'do':
-                        if (exp.first.id !== 'true' && exp.first.number !== 1) {
-                            score += 1;
-                        }
-                        score += complexity(exp.first) + complexity(exp.block);
-                        break;
-                    case 'for':
-                        if (exp.second !== undefined &&
-                                exp.second.id !== 'true' &&
-                                exp.second.number !== 1) {
-                            score += 1;
-                        }
-                        score += complexity(exp.first) + complexity(exp.second) +
-                            complexity(exp.third) + complexity(exp.block);
-                        break;
-                    case 'switch':
-                        score += complexity(exp.first) +
-                            complexity(exp.second) + exp.second.length;
-                        if (exp.second[exp.second.length - 1].id === 'default') {
-                            score -= 1;
-                        }
-                        break;
-                    case 'try':
-                        if (exp.second) {
-                            score += 1;
-                        }
-                        if (exp.third) {
-                            score += 1;
-                        }
-                        score += complexity(exp.first) + complexity(exp.second) +
-                            complexity(exp.third) + complexity(exp.block);
-                        break;
-                    }
-                    break;
-                case 'prefix':
-                    score += complexity(exp.first);
-                    break;
-                case 'case':
-                case 'infix':
-                    score += complexity(exp.first) + complexity(exp.second);
-                    if (exp.id === '&&' || exp.id === '||') {
-                        score += 1;
-                    }
-                    break;
-                case 'ternary':
-                    score += complexity(exp.first) + complexity(exp.second) + complexity(exp.third);
-                    break;
-                }
-            }
-        }
-        return score;
-    }
-
-
-    function do_function(func, name) {
-        var old_funct      = funct,
-            old_option     = option,
-            old_scope      = scope;
-        funct = {
-            '(name)'     : name || '\'' + (anonname || '').replace(nx, sanitize) + '\'',
-            '(line)'     : next_token.line,
-            '(context)'  : old_funct,
-            '(breakage)' : 0,
-            '(loopage)'  : 0,
-            '(scope)'    : scope,
-            '(token)'    : func
-        };
-        option = Object.create(old_option);
-        scope = Object.create(old_scope);
-        functions.push(funct);
-        func.name = name;
-        if (name) {
-            add_label(func, 'function', name);
-        }
-        func.writeable = false;
-        func.first = funct['(params)'] = function_params();
-        one_space();
-        func.block = block(false);
-        if (funct['(old_property_type)']) {
-            property_type = funct['(old_property_type)'];
-            delete funct['(old_property_type)'];
-        }
-        funct['(complexity)'] = complexity(func.block) + 1;
-        if (option.confusion) {
-            funct['(confusion)'] = true;
-        }
-        funct      = old_funct;
-        option     = old_option;
-        scope      = old_scope;
-    }
-
-
-    assignop('=');
-    assignop('+=', '+');
-    assignop('-=', '-');
-    assignop('*=', '*');
-    assignop('/=', '/').nud = function () {
-        stop('slash_equal');
-    };
-    assignop('%=', '%');
-    assignop('&=', '&');
-    assignop('|=', '|');
-    assignop('^=', '^');
-    assignop('<<=', '<<');
-    assignop('>>=', '>>');
-    assignop('>>>=', '>>>');
-
-
-    prefix('{', function () {
-        var get, i, j, name, p, set, seen = {};
-        this.arity = 'prefix';
-        this.first = [];
-        step_in();
-        while (next_token.id !== '}') {
-            indent.wrap = false;
-
-// JSLint recognizes the ES5 extension for get/set in object literals,
-// but requires that they be used in pairs.
-
-            edge();
-            if (next_token.string === 'get' && peek().id !== ':') {
-                if (!option.es5) {
-                    warn('es5');
-                }
-                get = next_token;
-                advance('get');
-                one_space_only();
-                name = next_token;
-                i = property_name();
-                if (!i) {
-                    stop('missing_property');
-                }
-                get.string = '';
-                do_function(get);
-                if (funct['(loopage)']) {
-                    warn('function_loop', get);
-                }
-                p = get.first;
-                if (p) {
-                    warn('parameter_a_get_b', p[0], p[0].string, i);
-                }
-                comma();
-                set = next_token;
-                spaces();
-                edge();
-                advance('set');
-                set.string = '';
-                one_space_only();
-                j = property_name();
-                if (i !== j) {
-                    stop('expected_a_b', token, i, j || next_token.string);
-                }
-                do_function(set);
-                p = set.first;
-                if (!p || p.length !== 1) {
-                    stop('parameter_set_a', set, 'value');
-                } else if (p[0].string !== 'value') {
-                    stop('expected_a_b', p[0], 'value', p[0].string);
-                }
-                name.first = [get, set];
-            } else {
-                name = next_token;
-                i = property_name();
-                if (typeof i !== 'string') {
-                    stop('missing_property');
-                }
-                advance(':');
-                spaces();
-                name.first = expression(10);
-            }
-            this.first.push(name);
-            if (seen[i] === true) {
-                warn('duplicate_a', next_token, i);
-            }
-            seen[i] = true;
-            tally_property(i);
-            if (next_token.id !== ',') {
-                break;
-            }
-            for (;;) {
-                comma();
-                if (next_token.id !== ',') {
-                    break;
-                }
-                warn('unexpected_a', next_token);
-            }
-            if (next_token.id === '}' && !option.es5) {
-                warn('unexpected_a', token);
-            }
-        }
-        step_out('}', this);
-        return this;
-    });
-
-    stmt('{', function () {
-        warn('statement_block');
-        this.arity = 'statement';
-        this.block = statements();
-        this.disrupt = this.block.disrupt;
-        advance('}', this);
-        return this;
-    });
-
-    stmt('/*global', directive);
-    stmt('/*globals', directive);
-    stmt('/*jslint', directive);
-    stmt('/*member', directive);
-    stmt('/*members', directive);
-    stmt('/*property', directive);
-    stmt('/*properties', directive);
-
-    stmt('var', function () {
-
-// JavaScript does not have block scope. It only has function scope. So,
-// declaring a variable in a block can have unexpected consequences.
-
-// var.first will contain an array, the array containing name tokens
-// and assignment tokens.
-
-        var assign, id, name;
-
-        if (funct['(vars)'] && !option.vars) {
-            warn('combine_var');
-        } else if (funct !== global_funct) {
-            funct['(vars)'] = true;
-        }
-        this.arity = 'statement';
-        this.first = [];
-        step_in('var');
-        for (;;) {
-            name = next_token;
-            id = identifier();
-            add_label(name, 'becoming');
-
-            if (next_token.id === '=') {
-                assign = next_token;
-                assign.first = name;
-                spaces();
-                advance('=');
-                spaces();
-                if (next_token.id === 'undefined') {
-                    warn('unnecessary_initialize', token, id);
-                }
-                if (peek(0).id === '=' && next_token.identifier) {
-                    stop('var_a_not');
-                }
-                assign.second = expression(0);
-                assign.arity = 'infix';
-                this.first.push(assign);
-            } else {
-                this.first.push(name);
-            }
-            if (funct[id] === 'becoming') {
-                funct[id] = 'unused';
-            }
-            if (next_token.id !== ',') {
-                break;
-            }
-            comma();
-            indent.wrap = false;
-            if (var_mode && next_token.line === token.line &&
-                    this.first.length === 1) {
-                var_mode = null;
-                indent.open = false;
-                indent.at -= option.indent;
-            }
-            spaces();
-            edge();
-        }
-        var_mode = null;
-        step_out();
-        return this;
-    });
-
-    stmt('function', function () {
-        one_space();
-        if (in_block) {
-            warn('function_block', token);
-        }
-        var name = next_token, id = identifier();
-        add_label(name, 'unction');
-        no_space();
-        this.arity = 'statement';
-        do_function(this, id);
-        if (next_token.id === '(' && next_token.line === token.line) {
-            stop('function_statement');
-        }
-        return this;
-    });
-
-    prefix('function', function () {
-        one_space();
-        var id = optional_identifier();
-        if (id) {
-            no_space();
-        } else {
-            id = '';
-        }
-        do_function(this, id);
-        if (funct['(loopage)']) {
-            warn('function_loop');
-        }
-        this.arity = 'function';
-        return this;
-    });
-
-    stmt('if', function () {
-        var paren = next_token;
-        one_space();
-        advance('(');
-        step_in('control');
-        no_space();
-        edge();
-        this.arity = 'statement';
-        this.first = expected_condition(expected_relation(expression(0)));
-        no_space();
-        step_out(')', paren);
-        one_space();
-        this.block = block(true);
-        if (next_token.id === 'else') {
-            one_space();
-            advance('else');
-            one_space();
-            this['else'] = next_token.id === 'if' || next_token.id === 'switch'
-                ? statement(true)
-                : block(true);
-            if (this['else'].disrupt && this.block.disrupt) {
-                this.disrupt = true;
-            }
-        }
-        return this;
-    });
-
-    stmt('try', function () {
-
-// try.first    The catch variable
-// try.second   The catch clause
-// try.third    The finally clause
-// try.block    The try block
-
-        var exception_variable, old_scope, paren;
-        if (option.adsafe) {
-            warn('adsafe_a', this);
-        }
-        one_space();
-        this.arity = 'statement';
-        this.block = block(false);
-        if (next_token.id === 'catch') {
-            one_space();
-            advance('catch');
-            one_space();
-            paren = next_token;
-            advance('(');
-            step_in('control');
-            no_space();
-            edge();
-            old_scope = scope;
-            scope = Object.create(old_scope);
-            exception_variable = next_token.string;
-            this.first = exception_variable;
-            if (!next_token.identifier) {
-                warn('expected_identifier_a', next_token);
-            } else {
-                add_label(next_token, 'exception');
-            }
-            advance();
-            no_space();
-            step_out(')', paren);
-            one_space();
-            this.second = block(false);
-            scope = old_scope;
-        }
-        if (next_token.id === 'finally') {
-            one_space();
-            advance('finally');
-            one_space();
-            this.third = block(false);
-        } else if (!this.second) {
-            stop('expected_a_b', next_token, 'catch', artifact());
-        }
-        return this;
-    });
-
-    labeled_stmt('while', function () {
-        one_space();
-        var paren = next_token;
-        funct['(breakage)'] += 1;
-        funct['(loopage)'] += 1;
-        advance('(');
-        step_in('control');
-        no_space();
-        edge();
-        this.arity = 'statement';
-        this.first = expected_relation(expression(0));
-        if (this.first.id !== 'true') {
-            expected_condition(this.first, bundle.unexpected_a);
-        }
-        no_space();
-        step_out(')', paren);
-        one_space();
-        this.block = block(true);
-        if (this.block.disrupt) {
-            warn('strange_loop', prev_token);
-        }
-        funct['(breakage)'] -= 1;
-        funct['(loopage)'] -= 1;
-        return this;
-    });
-
-    reserve('with');
-
-    labeled_stmt('switch', function () {
-
-// switch.first         the switch expression
-// switch.second        the array of cases. A case is 'case' or 'default' token:
-//    case.first        the array of case expressions
-//    case.second       the array of statements
-// If all of the arrays of statements are disrupt, then the switch is disrupt.
-
-        var cases = [],
-            old_in_block = in_block,
-            particular,
-            the_case = next_token,
-            unbroken = true;
-
-        function find_duplicate_case(value) {
-            if (are_similar(particular, value)) {
-                warn('duplicate_a', value);
-            }
-        }
-
-        funct['(breakage)'] += 1;
-        one_space();
-        advance('(');
-        no_space();
-        step_in();
-        this.arity = 'statement';
-        this.first = expected_condition(expected_relation(expression(0)));
-        no_space();
-        step_out(')', the_case);
-        one_space();
-        advance('{');
-        step_in();
-        in_block = true;
-        this.second = [];
-        while (next_token.id === 'case') {
-            the_case = next_token;
-            cases.forEach(find_duplicate_case);
-            the_case.first = [];
-            the_case.arity = 'case';
-            spaces();
-            edge('case');
-            advance('case');
-            for (;;) {
-                one_space();
-                particular = expression(0);
-                cases.forEach(find_duplicate_case);
-                cases.push(particular);
-                the_case.first.push(particular);
-                if (particular.id === 'NaN') {
-                    warn('unexpected_a', particular);
-                }
-                no_space_only();
-                advance(':');
-                if (next_token.id !== 'case') {
-                    break;
-                }
-                spaces();
-                edge('case');
-                advance('case');
-            }
-            spaces();
-            the_case.second = statements();
-            if (the_case.second && the_case.second.length > 0) {
-                particular = the_case.second[the_case.second.length - 1];
-                if (particular.disrupt) {
-                    if (particular.id === 'break') {
-                        unbroken = false;
-                    }
-                } else {
-                    warn('missing_a_after_b', next_token, 'break', 'case');
-                }
-            } else {
-                warn('empty_case');
-            }
-            this.second.push(the_case);
-        }
-        if (this.second.length === 0) {
-            warn('missing_a', next_token, 'case');
-        }
-        if (next_token.id === 'default') {
-            spaces();
-            the_case = next_token;
-            the_case.arity = 'case';
-            edge('case');
-            advance('default');
-            no_space_only();
-            advance(':');
-            spaces();
-            the_case.second = statements();
-            if (the_case.second && the_case.second.length > 0) {
-                particular = the_case.second[the_case.second.length - 1];
-                if (unbroken && particular.disrupt && particular.id !== 'break') {
-                    this.disrupt = true;
-                }
-            }
-            this.second.push(the_case);
-        }
-        funct['(breakage)'] -= 1;
-        spaces();
-        step_out('}', this);
-        in_block = old_in_block;
-        return this;
-    });
-
-    stmt('debugger', function () {
-        if (!option.debug) {
-            warn('unexpected_a', this);
-        }
-        this.arity = 'statement';
-        return this;
-    });
-
-    labeled_stmt('do', function () {
-        funct['(breakage)'] += 1;
-        funct['(loopage)'] += 1;
-        one_space();
-        this.arity = 'statement';
-        this.block = block(true);
-        if (this.block.disrupt) {
-            warn('strange_loop', prev_token);
-        }
-        one_space();
-        advance('while');
-        var paren = next_token;
-        one_space();
-        advance('(');
-        step_in();
-        no_space();
-        edge();
-        this.first = expected_condition(expected_relation(expression(0)), bundle.unexpected_a);
-        no_space();
-        step_out(')', paren);
-        funct['(breakage)'] -= 1;
-        funct['(loopage)'] -= 1;
-        return this;
-    });
-
-    labeled_stmt('for', function () {
-
-        var blok, filter, ok = false, paren = next_token, value;
-        this.arity = 'statement';
-        funct['(breakage)'] += 1;
-        funct['(loopage)'] += 1;
-        advance('(');
-        if (next_token.id === ';') {
-            no_space();
-            advance(';');
-            no_space();
-            advance(';');
-            no_space();
-            advance(')');
-            blok = block(true);
-        } else {
-            step_in('control');
-            spaces(this, paren);
-            no_space();
-            if (next_token.id === 'var') {
-                stop('move_var');
-            }
-            edge();
-            if (peek(0).id === 'in') {
-                this.forin = true;
-                value = next_token;
-                switch (funct[value.string]) {
-                case 'unused':
-                    funct[value.string] = 'var';
-                    break;
-                case 'closure':
-                case 'var':
-                    break;
-                default:
-                    warn('bad_in_a', value);
-                }
-                advance();
-                advance('in');
-                this.first = value;
-                this.second = expression(20);
-                step_out(')', paren);
-                blok = block(true);
-                if (!option.forin) {
-                    if (blok.length === 1 && typeof blok[0] === 'object' &&
-                            blok[0].string === 'if' && !blok[0]['else']) {
-                        filter = blok[0].first;
-                        while (filter.id === '&&') {
-                            filter = filter.first;
-                        }
-                        switch (filter.id) {
-                        case '===':
-                        case '!==':
-                            ok = filter.first.id === '['
-                                ? filter.first.first.string === this.second.string &&
-                                    filter.first.second.string === this.first.string
-                                : filter.first.id === 'typeof' &&
-                                    filter.first.first.id === '[' &&
-                                    filter.first.first.first.string === this.second.string &&
-                                    filter.first.first.second.string === this.first.string;
-                            break;
-                        case '(':
-                            ok = filter.first.id === '.' && ((
-                                filter.first.first.string === this.second.string &&
-                                filter.first.second.string === 'hasOwnProperty' &&
-                                filter.second[0].string === this.first.string
-                            ) || (
-                                filter.first.first.string === 'ADSAFE' &&
-                                filter.first.second.string === 'has' &&
-                                filter.second[0].string === this.second.string &&
-                                filter.second[1].string === this.first.string
-                            ) || (
-                                filter.first.first.id === '.' &&
-                                filter.first.first.first.id === '.' &&
-                                filter.first.first.first.first.string === 'Object' &&
-                                filter.first.first.first.second.string === 'prototype' &&
-                                filter.first.first.second.string === 'hasOwnProperty' &&
-                                filter.first.second.string === 'call' &&
-                                filter.second[0].string === this.second.string &&
-                                filter.second[1].string === this.first.string
-                            ));
-                            break;
-                        }
-                    }
-                    if (!ok) {
-                        warn('for_if', this);
-                    }
-                }
-            } else {
-                edge();
-                this.first = [];
-                for (;;) {
-                    this.first.push(expression(0, 'for'));
-                    if (next_token.id !== ',') {
-                        break;
-                    }
-                    comma();
-                }
-                semicolon();
-                edge();
-                this.second = expected_relation(expression(0));
-                if (this.second.id !== 'true') {
-                    expected_condition(this.second, bundle.unexpected_a);
-                }
-                semicolon(token);
-                if (next_token.id === ';') {
-                    stop('expected_a_b', next_token, ')', ';');
-                }
-                this.third = [];
-                edge();
-                for (;;) {
-                    this.third.push(expression(0, 'for'));
-                    if (next_token.id !== ',') {
-                        break;
-                    }
-                    comma();
-                }
-                no_space();
-                step_out(')', paren);
-                one_space();
-                blok = block(true);
-            }
-        }
-        if (blok.disrupt) {
-            warn('strange_loop', prev_token);
-        }
-        this.block = blok;
-        funct['(breakage)'] -= 1;
-        funct['(loopage)'] -= 1;
-        return this;
-    });
-
-    disrupt_stmt('break', function () {
-        var label = next_token.string;
-        this.arity = 'statement';
-        if (funct['(breakage)'] === 0) {
-            warn('unexpected_a', this);
-        }
-        if (next_token.identifier && token.line === next_token.line) {
-            one_space_only();
-            if (funct[label] !== 'label') {
-                warn('not_a_label', next_token);
-            } else if (scope[label].funct !== funct) {
-                warn('not_a_scope', next_token);
-            }
-            this.first = next_token;
-            advance();
-        }
-        return this;
-    });
-
-    disrupt_stmt('continue', function () {
-        if (!option['continue']) {
-            warn('unexpected_a', this);
-        }
-        var label = next_token.string;
-        this.arity = 'statement';
-        if (funct['(breakage)'] === 0) {
-            warn('unexpected_a', this);
-        }
-        if (next_token.identifier && token.line === next_token.line) {
-            one_space_only();
-            if (funct[label] !== 'label') {
-                warn('not_a_label', next_token);
-            } else if (scope[label].funct !== funct) {
-                warn('not_a_scope', next_token);
-            }
-            this.first = next_token;
-            advance();
-        }
-        return this;
-    });
-
-    disrupt_stmt('return', function () {
-        if (funct === global_funct) {
-            warn('unexpected_a', this);
-        }
-        this.arity = 'statement';
-        if (next_token.id !== ';' && next_token.line === token.line) {
-            one_space_only();
-            if (next_token.id === '/' || next_token.id === '(regexp)') {
-                warn('wrap_regexp');
-            }
-            this.first = expression(20);
-        }
-        return this;
-    });
-
-    disrupt_stmt('throw', function () {
-        this.arity = 'statement';
-        one_space_only();
-        this.first = expression(20);
-        return this;
-    });
-
-
-//  Superfluous reserved words
-
-    reserve('class');
-    reserve('const');
-    reserve('enum');
-    reserve('export');
-    reserve('extends');
-    reserve('import');
-    reserve('super');
-
-// Harmony reserved words
-
-    reserve('implements');
-    reserve('interface');
-    reserve('let');
-    reserve('package');
-    reserve('private');
-    reserve('protected');
-    reserve('public');
-    reserve('static');
-    reserve('yield');
-
-
-// Type inference
-
-//     function get_type(one) {
-//         var type;
-//         if (typeof one === 'string') {
-//             return one;
-//         } else if (one.type) {
-//             return one.type;
-//         } else if (one.id === '.') {
-//             type = property_type[one.second.string];
-//             return typeof type === 'string' ? type : '';
-//         } else {
-//             return ((one.identifier && scope[one.string]) || one).type;
-//         }
-//     }
-
-
-//     function match_type(one_type, two_type, one, two) {
-//         if (one_type === two_type) {
-//             return true;
-//         } else {
-//             if (!funct.confusion && !two.warn) {
-//                 if (typeof one !== 'string') {
-//                     if (one.id === '.') {
-//                         one_type = '.' + one.second.string + ': ' + one_type;
-//                     } else {
-//                         one_type = one.string + ': ' + one_type;
-//                     }
-//                 }
-//                 if (two.id === '.') {
-//                     two_type = '.' + two.second.string + ': ' + one_type;
-//                 } else {
-//                     two_type = two.string + ': ' + one_type;
-//                 }
-//                 warn('type_confusion_a_b', two, one_type, two_type);
-//                 two.warn = true;
-//             }
-//             return false;
-//         }
-//     }
-
-
-//     function conform(one, two) {
-//
-// // The conform function takes a type string and a token, or two tokens.
-//
-//         var one_type = typeof one === 'string' ? one : one.type,
-//             two_type = two.type,
-//             two_thing;
-//
-// // If both tokens already have a type, and if they match, then we are done.
-// // Once a token has a type, it is locked. Neither token will change, but if
-// // they do not match, there will be a warning.
-//
-//         if (one_type) {
-//             if (two_type) {
-//                 match_type(one_type, two_type, one, two);
-//             } else {
-//
-// // two does not have a type, so look deeper. If two is a variable or property,
-// // then use its type if it has one, and make the deep type one's type if it
-// // doesn't. If the type was *, or if there was a mismatch, don't change the
-// // deep type.
-//
-//                 two_thing = two.id === '(identifier)'
-//                     ? scope[two.string]
-//                     : two.id === '.'
-//                     ? property_type[two.second.string]
-//                     : null;
-//                 if (two_thing) {
-//                     two_type = two_thing.type;
-//                     if (two_type) {
-//                         if (two_type !== '*') {
-//                             if (!match_type(one_type, two_type, one, two)) {
-//                                 return '';
-//                             }
-//                         }
-//                     } else {
-//                         two_thing.type = one_type;
-//                     }
-//                 }
-//
-// // In any case, we give two a type.
-//
-//                 two.type = one_type;
-//                 type_state_change = true;
-//                 return one_type;
-//             }
-//
-// // one does not have a type, but two does, so do the old switcheroo.
-//
-//         } else {
-//             if (two_type) {
-//                 return conform(two, one);
-//
-// // Neither token has a type yet. So we have to look deeper to see if either
-// // is a variable or property.
-//
-//             } else {
-//                 if (one.id === '(identifier)') {
-//                     one_type = scope[one.string].type;
-//                     if (one_type && one_type !== '*') {
-//                         one.type = one_type;
-//                         return conform(one, two);
-//                     }
-//                 } else if (one.id === '.') {
-//                     one_type = property_type[one.second.string];
-//                     if (one_type && one_type !== '*') {
-//                         one.type = scope[one.string].type;
-//                         return conform(one, two);
-//                     }
-//                 }
-//                 if (two.id === '(identifier)') {
-//                     two_type = scope[two.string].type;
-//                     if (two_type && two_type !== '*') {
-//                         two.type = two_type;
-//                         return conform(two, one);
-//                     }
-//                 } else if (two.id === '.') {
-//                     two_type = property_type[two.second.string];
-//                     if (two_type && two_type !== '*') {
-//                         two.type = scope[two.string].type;
-//                         return conform(two, one);
-//                     }
-//                 }
-//             }
-//         }
-//
-// // Return a falsy string if we were unable to determine the type of either token.
-//
-//         return '';
-//     }
-
-//     function conform_array(type, array) {
-//         array.forEach(function (item) {
-//             return conform(type, item);
-//         }, type);
-//     }
-
-
-//     function infer(node) {
-//         if (Array.isArray(node)) {
-//             node.forEach(infer);
-//         } else {
-//             switch (node.arity) {
-//             case 'statement':
-//                 infer_statement[node.id](node);
-//                 break;
-//             case 'infix':
-//                 infer(node.first);
-//                 infer(node.second);
-//                 switch (node.id) {
-//                 case '(':
-//                     conform('function', node.first);
-//                     break;
-//                 default:
-//                     stop('unfinished');
-//                 }
-//                 break;
-//             case 'number':
-//             case 'string':
-//             case 'boolean':
-//                 break;
-//             default:
-//                 stop('unfinished');
-//             }
-//         }
-//     }
-
-
-//     infer_statement = {
-//         'var': function (node) {
-//             var i, item, list = node.first;
-//             for (i = 0; i < list.length; i += 1) {
-//                 item = list[i];
-//                 if (item.id === '=') {
-//                     infer(item.second);
-//                     conform(item.first, item.second);
-//                     conform(item.first, item);
-//                 }
-//             }
-//         },
-//         'for': function (node) {
-//             infer(node.first);
-//             infer(node.second);
-//             if (node.forin) {
-//                 conform('string', node.first);
-//                 conform('object', node.second);
-//             } else {
-//                 infer(node.third);
-//                 conform_array('number', node.first);
-//                 conform('boolean', node.second);
-//                 conform_array('number', node.third);
-//             }
-//             infer(node.block);
-//         }
-//     };
-
-
-//     function infer_types(node) {
-//         do {
-//             funct = global_funct;
-//             scope = global_scope;
-//             type_state_change = false;
-//             infer(node);
-//         } while (type_state_change);
-//     }
-
-
-// Parse JSON
-
-    function json_value() {
-
-        function json_object() {
-            var brace = next_token, object = {};
-            advance('{');
-            if (next_token.id !== '}') {
-                while (next_token.id !== '(end)') {
-                    while (next_token.id === ',') {
-                        warn('unexpected_a', next_token);
-                        advance(',');
-                    }
-                    if (next_token.id !== '(string)') {
-                        warn('expected_string_a');
-                    }
-                    if (object[next_token.string] === true) {
-                        warn('duplicate_a');
-                    } else if (next_token.string === '__proto__') {
-                        warn('dangling_a');
-                    } else {
-                        object[next_token.string] = true;
-                    }
-                    advance();
-                    advance(':');
-                    json_value();
-                    if (next_token.id !== ',') {
-                        break;
-                    }
-                    advance(',');
-                    if (next_token.id === '}') {
-                        warn('unexpected_a', token);
-                        break;
-                    }
-                }
-            }
-            advance('}', brace);
-        }
-
-        function json_array() {
-            var bracket = next_token;
-            advance('[');
-            if (next_token.id !== ']') {
-                while (next_token.id !== '(end)') {
-                    while (next_token.id === ',') {
-                        warn('unexpected_a', next_token);
-                        advance(',');
-                    }
-                    json_value();
-                    if (next_token.id !== ',') {
-                        break;
-                    }
-                    advance(',');
-                    if (next_token.id === ']') {
-                        warn('unexpected_a', token);
-                        break;
-                    }
-                }
-            }
-            advance(']', bracket);
-        }
-
-        switch (next_token.id) {
-        case '{':
-            json_object();
-            break;
-        case '[':
-            json_array();
-            break;
-        case 'true':
-        case 'false':
-        case 'null':
-        case '(number)':
-        case '(string)':
-            advance();
-            break;
-        case '-':
-            advance('-');
-            no_space_only();
-            advance('(number)');
-            break;
-        default:
-            stop('unexpected_a');
-        }
-    }
-
-
-// CSS parsing.
-
-    function css_name() {
-        if (next_token.identifier) {
-            advance();
-            return true;
-        }
-    }
-
-
-    function css_number() {
-        if (next_token.id === '-') {
-            advance('-');
-            no_space_only();
-        }
-        if (next_token.id === '(number)') {
-            advance('(number)');
-            return true;
-        }
-    }
-
-
-    function css_string() {
-        if (next_token.id === '(string)') {
-            advance();
-            return true;
-        }
-    }
-
-    function css_color() {
-        var i, number, paren, value;
-        if (next_token.identifier) {
-            value = next_token.string;
-            if (value === 'rgb' || value === 'rgba') {
-                advance();
-                paren = next_token;
-                advance('(');
-                for (i = 0; i < 3; i += 1) {
-                    if (i) {
-                        comma();
-                    }
-                    number = next_token.number;
-                    if (next_token.id !== '(number)' || number < 0) {
-                        warn('expected_positive_a', next_token);
-                        advance();
-                    } else {
-                        advance();
-                        if (next_token.id === '%') {
-                            advance('%');
-                            if (number > 100) {
-                                warn('expected_percent_a', token, number);
-                            }
-                        } else {
-                            if (number > 255) {
-                                warn('expected_small_a', token, number);
-                            }
-                        }
-                    }
-                }
-                if (value === 'rgba') {
-                    comma();
-                    number = next_token.number;
-                    if (next_token.id !== '(number)' || number < 0 || number > 1) {
-                        warn('expected_fraction_a', next_token);
-                    }
-                    advance();
-                    if (next_token.id === '%') {
-                        warn('unexpected_a');
-                        advance('%');
-                    }
-                }
-                advance(')', paren);
-                return true;
-            } else if (css_colorData[next_token.string] === true) {
-                advance();
-                return true;
-            }
-        } else if (next_token.id === '(color)') {
-            advance();
-            return true;
-        }
-        return false;
-    }
-
-
-    function css_length() {
-        if (next_token.id === '-') {
-            advance('-');
-            no_space_only();
-        }
-        if (next_token.id === '(number)') {
-            advance();
-            if (next_token.id !== '(string)' &&
-                    css_lengthData[next_token.string] === true) {
-                no_space_only();
-                advance();
-            } else if (+token.number !== 0) {
-                warn('expected_linear_a');
-            }
-            return true;
-        }
-        return false;
-    }
-
-
-    function css_line_height() {
-        if (next_token.id === '-') {
-            advance('-');
-            no_space_only();
-        }
-        if (next_token.id === '(number)') {
-            advance();
-            if (next_token.id !== '(string)' &&
-                    css_lengthData[next_token.string] === true) {
-                no_space_only();
-                advance();
-            }
-            return true;
-        }
-        return false;
-    }
-
-
-    function css_width() {
-        if (next_token.identifier) {
-            switch (next_token.string) {
-            case 'thin':
-            case 'medium':
-            case 'thick':
-                advance();
-                return true;
-            }
-        } else {
-            return css_length();
-        }
-    }
-
-
-    function css_margin() {
-        if (next_token.identifier) {
-            if (next_token.string === 'auto') {
-                advance();
-                return true;
-            }
-        } else {
-            return css_length();
-        }
-    }
-
-    function css_attr() {
-        if (next_token.identifier && next_token.string === 'attr') {
-            advance();
-            advance('(');
-            if (!next_token.identifier) {
-                warn('expected_name_a');
-            }
-            advance();
-            advance(')');
-            return true;
-        }
-        return false;
-    }
-
-
-    function css_comma_list() {
-        while (next_token.id !== ';') {
-            if (!css_name() && !css_string()) {
-                warn('expected_name_a');
-            }
-            if (next_token.id !== ',') {
-                return true;
-            }
-            comma();
-        }
-    }
-
-
-    function css_counter() {
-        if (next_token.identifier && next_token.string === 'counter') {
-            advance();
-            advance('(');
-            advance();
-            if (next_token.id === ',') {
-                comma();
-                if (next_token.id !== '(string)') {
-                    warn('expected_string_a');
-                }
-                advance();
-            }
-            advance(')');
-            return true;
-        }
-        if (next_token.identifier && next_token.string === 'counters') {
-            advance();
-            advance('(');
-            if (!next_token.identifier) {
-                warn('expected_name_a');
-            }
-            advance();
-            if (next_token.id === ',') {
-                comma();
-                if (next_token.id !== '(string)') {
-                    warn('expected_string_a');
-                }
-                advance();
-            }
-            if (next_token.id === ',') {
-                comma();
-                if (next_token.id !== '(string)') {
-                    warn('expected_string_a');
-                }
-                advance();
-            }
-            advance(')');
-            return true;
-        }
-        return false;
-    }
-
-
-    function css_radius() {
-        return css_length() && (next_token.id !== '(number)' || css_length());
-    }
-
-
-    function css_shape() {
-        var i;
-        if (next_token.identifier && next_token.string === 'rect') {
-            advance();
-            advance('(');
-            for (i = 0; i < 4; i += 1) {
-                if (!css_length()) {
-                    warn('expected_number_a');
-                    break;
-                }
-            }
-            advance(')');
-            return true;
-        }
-        return false;
-    }
-
-
-    function css_url() {
-        var c, url;
-        if (next_token.identifier && next_token.string === 'url') {
-            next_token = lex.range('(', ')');
-            url = next_token.string;
-            c = url.charAt(0);
-            if (c === '"' || c === '\'') {
-                if (url.slice(-1) !== c) {
-                    warn('bad_url_a');
-                } else {
-                    url = url.slice(1, -1);
-                    if (url.indexOf(c) >= 0) {
-                        warn('bad_url_a');
-                    }
-                }
-            }
-            if (!url) {
-                warn('missing_url');
-            }
-            if (ux.test(url)) {
-                stop('bad_url_a');
-            }
-            urls.push(url);
-            advance();
-            return true;
-        }
-        return false;
-    }
-
-
-    css_any = [css_url, function () {
-        for (;;) {
-            if (next_token.identifier) {
-                switch (next_token.string.toLowerCase()) {
-                case 'url':
-                    css_url();
-                    break;
-                case 'expression':
-                    warn('unexpected_a');
-                    advance();
-                    break;
-                default:
-                    advance();
-                }
-            } else {
-                if (next_token.id === ';' || next_token.id === '!'  ||
-                        next_token.id === '(end)' || next_token.id === '}') {
-                    return true;
-                }
-                advance();
-            }
-        }
-    }];
-
-
-    function font_face() {
-        advance_identifier('font-family');
-        advance(':');
-        if (!css_name() && !css_string()) {
-            stop('expected_name_a');
-        }
-        semicolon();
-        advance_identifier('src');
-        advance(':');
-        while (true) {
-            if (next_token.string === 'local') {
-                advance_identifier('local');
-                advance('(');
-                if (ux.test(next_token.string)) {
-                    stop('bad_url_a');
-                }
-
-                if (!css_name() && !css_string()) {
-                    stop('expected_name_a');
-                }
-                advance(')');
-            } else if (!css_url()) {
-                stop('expected_a_b', next_token, 'url', artifact());
-            }
-            if (next_token.id !== ',') {
-                break;
-            }
-            comma();
-        }
-        semicolon();
-    }
-
-
-    css_border_style = [
-        'none', 'dashed', 'dotted', 'double', 'groove',
-        'hidden', 'inset', 'outset', 'ridge', 'solid'
-    ];
-
-    css_break = [
-        'auto', 'always', 'avoid', 'left', 'right'
-    ];
-
-    css_media = {
-        'all': true,
-        'braille': true,
-        'embossed': true,
-        'handheld': true,
-        'print': true,
-        'projection': true,
-        'screen': true,
-        'speech': true,
-        'tty': true,
-        'tv': true
-    };
-
-    css_overflow = [
-        'auto', 'hidden', 'scroll', 'visible'
-    ];
-
-    css_attribute_data = {
-        background: [
-            true, 'background-attachment', 'background-color',
-            'background-image', 'background-position', 'background-repeat'
-        ],
-        'background-attachment': ['scroll', 'fixed'],
-        'background-color': ['transparent', css_color],
-        'background-image': ['none', css_url],
-        'background-position': [
-            2, [css_length, 'top', 'bottom', 'left', 'right', 'center']
-        ],
-        'background-repeat': [
-            'repeat', 'repeat-x', 'repeat-y', 'no-repeat'
-        ],
-        'border': [true, 'border-color', 'border-style', 'border-width'],
-        'border-bottom': [
-            true, 'border-bottom-color', 'border-bottom-style',
-            'border-bottom-width'
-        ],
-        'border-bottom-color': css_color,
-        'border-bottom-left-radius': css_radius,
-        'border-bottom-right-radius': css_radius,
-        'border-bottom-style': css_border_style,
-        'border-bottom-width': css_width,
-        'border-collapse': ['collapse', 'separate'],
-        'border-color': ['transparent', 4, css_color],
-        'border-left': [
-            true, 'border-left-color', 'border-left-style', 'border-left-width'
-        ],
-        'border-left-color': css_color,
-        'border-left-style': css_border_style,
-        'border-left-width': css_width,
-        'border-radius': function () {
-            function count(separator) {
-                var n = 1;
-                if (separator) {
-                    advance(separator);
-                }
-                if (!css_length()) {
-                    return false;
-                }
-                while (next_token.id === '(number)') {
-                    if (!css_length()) {
-                        return false;
-                    }
-                    n += 1;
-                }
-                if (n > 4) {
-                    warn('bad_style');
-                }
-                return true;
-            }
-
-            return count() && (next_token.id !== '/' || count('/'));
-        },
-        'border-right': [
-            true, 'border-right-color', 'border-right-style',
-            'border-right-width'
-        ],
-        'border-right-color': css_color,
-        'border-right-style': css_border_style,
-        'border-right-width': css_width,
-        'border-spacing': [2, css_length],
-        'border-style': [4, css_border_style],
-        'border-top': [
-            true, 'border-top-color', 'border-top-style', 'border-top-width'
-        ],
-        'border-top-color': css_color,
-        'border-top-left-radius': css_radius,
-        'border-top-right-radius': css_radius,
-        'border-top-style': css_border_style,
-        'border-top-width': css_width,
-        'border-width': [4, css_width],
-        bottom: [css_length, 'auto'],
-        'caption-side' : ['bottom', 'left', 'right', 'top'],
-        clear: ['both', 'left', 'none', 'right'],
-        clip: [css_shape, 'auto'],
-        color: css_color,
-        content: [
-            'open-quote', 'close-quote', 'no-open-quote', 'no-close-quote',
-            css_string, css_url, css_counter, css_attr
-        ],
-        'counter-increment': [
-            css_name, 'none'
-        ],
-        'counter-reset': [
-            css_name, 'none'
-        ],
-        cursor: [
-            css_url, 'auto', 'crosshair', 'default', 'e-resize', 'help', 'move',
-            'n-resize', 'ne-resize', 'nw-resize', 'pointer', 's-resize',
-            'se-resize', 'sw-resize', 'w-resize', 'text', 'wait'
-        ],
-        direction: ['ltr', 'rtl'],
-        display: [
-            'block', 'compact', 'inline', 'inline-block', 'inline-table',
-            'list-item', 'marker', 'none', 'run-in', 'table', 'table-caption',
-            'table-cell', 'table-column', 'table-column-group',
-            'table-footer-group', 'table-header-group', 'table-row',
-            'table-row-group'
-        ],
-        'empty-cells': ['show', 'hide'],
-        'float': ['left', 'none', 'right'],
-        font: [
-            'caption', 'icon', 'menu', 'message-box', 'small-caption',
-            'status-bar', true, 'font-size', 'font-style', 'font-weight',
-            'font-family'
-        ],
-        'font-family': css_comma_list,
-        'font-size': [
-            'xx-small', 'x-small', 'small', 'medium', 'large', 'x-large',
-            'xx-large', 'larger', 'smaller', css_length
-        ],
-        'font-size-adjust': ['none', css_number],
-        'font-stretch': [
-            'normal', 'wider', 'narrower', 'ultra-condensed',
-            'extra-condensed', 'condensed', 'semi-condensed',
-            'semi-expanded', 'expanded', 'extra-expanded'
-        ],
-        'font-style': [
-            'normal', 'italic', 'oblique'
-        ],
-        'font-variant': [
-            'normal', 'small-caps'
-        ],
-        'font-weight': [
-            'normal', 'bold', 'bolder', 'lighter', css_number
-        ],
-        height: [css_length, 'auto'],
-        left: [css_length, 'auto'],
-        'letter-spacing': ['normal', css_length],
-        'line-height': ['normal', css_line_height],
-        'list-style': [
-            true, 'list-style-image', 'list-style-position', 'list-style-type'
-        ],
-        'list-style-image': ['none', css_url],
-        'list-style-position': ['inside', 'outside'],
-        'list-style-type': [
-            'circle', 'disc', 'square', 'decimal', 'decimal-leading-zero',
-            'lower-roman', 'upper-roman', 'lower-greek', 'lower-alpha',
-            'lower-latin', 'upper-alpha', 'upper-latin', 'hebrew', 'katakana',
-            'hiragana-iroha', 'katakana-oroha', 'none'
-        ],
-        margin: [4, css_margin],
-        'margin-bottom': css_margin,
-        'margin-left': css_margin,
-        'margin-right': css_margin,
-        'margin-top': css_margin,
-        'marker-offset': [css_length, 'auto'],
-        'max-height': [css_length, 'none'],
-        'max-width': [css_length, 'none'],
-        'min-height': css_length,
-        'min-width': css_length,
-        opacity: css_number,
-        outline: [true, 'outline-color', 'outline-style', 'outline-width'],
-        'outline-color': ['invert', css_color],
-        'outline-style': [
-            'dashed', 'dotted', 'double', 'groove', 'inset', 'none',
-            'outset', 'ridge', 'solid'
-        ],
-        'outline-width': css_width,
-        overflow: css_overflow,
-        'overflow-x': css_overflow,
-        'overflow-y': css_overflow,
-        padding: [4, css_length],
-        'padding-bottom': css_length,
-        'padding-left': css_length,
-        'padding-right': css_length,
-        'padding-top': css_length,
-        'page-break-after': css_break,
-        'page-break-before': css_break,
-        position: ['absolute', 'fixed', 'relative', 'static'],
-        quotes: [8, css_string],
-        right: [css_length, 'auto'],
-        'table-layout': ['auto', 'fixed'],
-        'text-align': ['center', 'justify', 'left', 'right'],
-        'text-decoration': [
-            'none', 'underline', 'overline', 'line-through', 'blink'
-        ],
-        'text-indent': css_length,
-        'text-shadow': ['none', 4, [css_color, css_length]],
-        'text-transform': ['capitalize', 'uppercase', 'lowercase', 'none'],
-        top: [css_length, 'auto'],
-        'unicode-bidi': ['normal', 'embed', 'bidi-override'],
-        'vertical-align': [
-            'baseline', 'bottom', 'sub', 'super', 'top', 'text-top', 'middle',
-            'text-bottom', css_length
-        ],
-        visibility: ['visible', 'hidden', 'collapse'],
-        'white-space': [
-            'normal', 'nowrap', 'pre', 'pre-line', 'pre-wrap', 'inherit'
-        ],
-        width: [css_length, 'auto'],
-        'word-spacing': ['normal', css_length],
-        'word-wrap': ['break-word', 'normal'],
-        'z-index': ['auto', css_number]
-    };
-
-    function style_attribute() {
-        var v;
-        while (next_token.id === '*' || next_token.id === '#' ||
-                next_token.string === '_') {
-            if (!option.css) {
-                warn('unexpected_a');
-            }
-            advance();
-        }
-        if (next_token.id === '-') {
-            if (!option.css) {
-                warn('unexpected_a');
-            }
-            advance('-');
-            if (!next_token.identifier) {
-                warn('expected_nonstandard_style_attribute');
-            }
-            advance();
-            return css_any;
-        } else {
-            if (!next_token.identifier) {
-                warn('expected_style_attribute');
-            } else {
-                if (Object.prototype.hasOwnProperty.call(css_attribute_data,
-                        next_token.string)) {
-                    v = css_attribute_data[next_token.string];
-                } else {
-                    v = css_any;
-                    if (!option.css) {
-                        warn('unrecognized_style_attribute_a');
-                    }
-                }
-            }
-            advance();
-            return v;
-        }
-    }
-
-
-    function style_value(v) {
-
-        /*jslint confusion: true */
-
-        var i = 0,
-            n,
-            once,
-            match,
-            round,
-            start = 0,
-            vi;
-        switch (typeof v) {
-        case 'function':
-            return v();
-        case 'string':
-            if (next_token.identifier && next_token.string === v) {
-                advance();
-                return true;
-            }
-            return false;
-        }
-        for (;;) {
-            if (i >= v.length) {
-                return false;
-            }
-            vi = v[i];
-            i += 1;
-            if (typeof vi === 'boolean') {
-                break;
-            } else if (typeof vi === 'number') {
-                n = vi;
-                vi = v[i];
-                i += 1;
-            } else {
-                n = 1;
-            }
-            match = false;
-            while (n > 0) {
-                if (style_value(vi)) {
-                    match = true;
-                    n -= 1;
-                } else {
-                    break;
-                }
-            }
-            if (match) {
-                return true;
-            }
-        }
-        start = i;
-        once = [];
-        for (;;) {
-            round = false;
-            for (i = start; i < v.length; i += 1) {
-                if (!once[i]) {
-                    if (style_value(css_attribute_data[v[i]])) {
-                        match = true;
-                        round = true;
-                        once[i] = true;
-                        break;
-                    }
-                }
-            }
-            if (!round) {
-                return match;
-            }
-        }
-    }
-
-    function style_child() {
-        if (next_token.id === '(number)') {
-            advance();
-            if (next_token.string === 'n' && next_token.identifier) {
-                no_space_only();
-                advance();
-                if (next_token.id === '+') {
-                    no_space_only();
-                    advance('+');
-                    no_space_only();
-                    advance('(number)');
-                }
-            }
-            return;
-        } else {
-            if (next_token.identifier &&
-                    (next_token.string === 'odd' || next_token.string === 'even')) {
-                advance();
-                return;
-            }
-        }
-        warn('unexpected_a');
-    }
-
-    function substyle() {
-        var v;
-        for (;;) {
-            if (next_token.id === '}' || next_token.id === '(end)' ||
-                    (xquote && next_token.id === xquote)) {
-                return;
-            }
-            v = style_attribute();
-            advance(':');
-            if (next_token.identifier && next_token.string === 'inherit') {
-                advance();
-            } else {
-                if (!style_value(v)) {
-                    warn('unexpected_a');
-                    advance();
-                }
-            }
-            if (next_token.id === '!') {
-                advance('!');
-                no_space_only();
-                if (next_token.identifier && next_token.string === 'important') {
-                    advance();
-                } else {
-                    warn('expected_a_b',
-                        next_token, 'important', artifact());
-                }
-            }
-            if (next_token.id === '}' || next_token.id === xquote) {
-                warn('expected_a_b', next_token, ';', artifact());
-            } else {
-                semicolon();
-            }
-        }
-    }
-
-    function style_selector() {
-        if (next_token.identifier) {
-            if (!Object.prototype.hasOwnProperty.call(html_tag, option.cap
-                    ? next_token.string.toLowerCase()
-                    : next_token.string)) {
-                warn('expected_tagname_a');
-            }
-            advance();
-        } else {
-            switch (next_token.id) {
-            case '>':
-            case '+':
-                advance();
-                style_selector();
-                break;
-            case ':':
-                advance(':');
-                switch (next_token.string) {
-                case 'active':
-                case 'after':
-                case 'before':
-                case 'checked':
-                case 'disabled':
-                case 'empty':
-                case 'enabled':
-                case 'first-child':
-                case 'first-letter':
-                case 'first-line':
-                case 'first-of-type':
-                case 'focus':
-                case 'hover':
-                case 'last-child':
-                case 'last-of-type':
-                case 'link':
-                case 'only-of-type':
-                case 'root':
-                case 'target':
-                case 'visited':
-                    advance_identifier(next_token.string);
-                    break;
-                case 'lang':
-                    advance_identifier('lang');
-                    advance('(');
-                    if (!next_token.identifier) {
-                        warn('expected_lang_a');
-                    }
-                    advance(')');
-                    break;
-                case 'nth-child':
-                case 'nth-last-child':
-                case 'nth-last-of-type':
-                case 'nth-of-type':
-                    advance_identifier(next_token.string);
-                    advance('(');
-                    style_child();
-                    advance(')');
-                    break;
-                case 'not':
-                    advance_identifier('not');
-                    advance('(');
-                    if (next_token.id === ':' && peek(0).string === 'not') {
-                        warn('not');
-                    }
-                    style_selector();
-                    advance(')');
-                    break;
-                default:
-                    warn('expected_pseudo_a');
-                }
-                break;
-            case '#':
-                advance('#');
-                if (!next_token.identifier) {
-                    warn('expected_id_a');
-                }
-                advance();
-                break;
-            case '*':
-                advance('*');
-                break;
-            case '.':
-                advance('.');
-                if (!next_token.identifier) {
-                    warn('expected_class_a');
-                }
-                advance();
-                break;
-            case '[':
-                advance('[');
-                if (!next_token.identifier) {
-                    warn('expected_attribute_a');
-                }
-                advance();
-                if (next_token.id === '=' || next_token.string === '~=' ||
-                        next_token.string === '$=' ||
-                        next_token.string === '|=' ||
-                        next_token.id === '*=' ||
-                        next_token.id === '^=') {
-                    advance();
-                    if (next_token.id !== '(string)') {
-                        warn('expected_string_a');
-                    }
-                    advance();
-                }
-                advance(']');
-                break;
-            default:
-                stop('expected_selector_a');
-            }
-        }
-    }
-
-    function style_pattern() {
-        if (next_token.id === '{') {
-            warn('expected_style_pattern');
-        }
-        for (;;) {
-            style_selector();
-            if (next_token.id === '</' || next_token.id === '{' ||
-                    next_token.id === '}' || next_token.id === '(end)') {
-                return '';
-            }
-            if (next_token.id === ',') {
-                comma();
-            }
-        }
-    }
-
-    function style_list() {
-        while (next_token.id !== '}' && next_token.id !== '</' &&
-                next_token.id !== '(end)') {
-            style_pattern();
-            xmode = 'styleproperty';
-            if (next_token.id === ';') {
-                semicolon();
-            } else {
-                advance('{');
-                substyle();
-                xmode = 'style';
-                advance('}');
-            }
-        }
-    }
-
-    function styles() {
-        var i;
-        while (next_token.id === '@') {
-            i = peek();
-            advance('@');
-            switch (next_token.string) {
-            case 'import':
-                advance_identifier('import');
-                if (!css_url()) {
-                    warn('expected_a_b',
-                        next_token, 'url', artifact());
-                    advance();
-                }
-                semicolon();
-                break;
-            case 'media':
-                advance_identifier('media');
-                for (;;) {
-                    if (!next_token.identifier || css_media[next_token.string] !== true) {
-                        stop('expected_media_a');
-                    }
-                    advance();
-                    if (next_token.id !== ',') {
-                        break;
-                    }
-                    comma();
-                }
-                advance('{');
-                style_list();
-                advance('}');
-                break;
-            case 'font-face':
-                advance_identifier('font-face');
-                advance('{');
-                font_face();
-                advance('}');
-                break;
-            default:
-                stop('expected_at_a');
-            }
-        }
-        style_list();
-    }
-
-
-// Parse HTML
-
-    function do_begin(n) {
-        if (n !== 'html' && !option.fragment) {
-            if (n === 'div' && option.adsafe) {
-                stop('adsafe_fragment');
-            } else {
-                stop('expected_a_b', token, 'html', n);
-            }
-        }
-        if (option.adsafe) {
-            if (n === 'html') {
-                stop('adsafe_html', token);
-            }
-            if (option.fragment) {
-                if (n !== 'div') {
-                    stop('adsafe_div', token);
-                }
-            } else {
-                stop('adsafe_fragment', token);
-            }
-        }
-        option.browser = true;
-    }
-
-    function do_attribute(a, v) {
-        var u, x;
-        if (a === 'id') {
-            u = typeof v === 'string' ? v.toUpperCase() : '';
-            if (ids[u] === true) {
-                warn('duplicate_a', next_token, v);
-            }
-            if (!/^[A-Za-z][A-Za-z0-9._:\-]*$/.test(v)) {
-                warn('bad_id_a', next_token, v);
-            } else if (option.adsafe) {
-                if (adsafe_id) {
-                    if (v.slice(0, adsafe_id.length) !== adsafe_id) {
-                        warn('adsafe_prefix_a', next_token, adsafe_id);
-                    } else if (!/^[A-Z]+_[A-Z]+$/.test(v)) {
-                        warn('adsafe_bad_id');
-                    }
-                } else {
-                    adsafe_id = v;
-                    if (!/^[A-Z]+_$/.test(v)) {
-                        warn('adsafe_bad_id');
-                    }
-                }
-            }
-            x = v.search(dx);
-            if (x >= 0) {
-                warn('unexpected_char_a_b', token, v.charAt(x), a);
-            }
-            ids[u] = true;
-        } else if (a === 'class' || a === 'type' || a === 'name') {
-            x = v.search(qx);
-            if (x >= 0) {
-                warn('unexpected_char_a_b', token, v.charAt(x), a);
-            }
-            ids[u] = true;
-        } else if (a === 'href' || a === 'background' ||
-                a === 'content' || a === 'data' ||
-                a.indexOf('src') >= 0 || a.indexOf('url') >= 0) {
-            if (option.safe && ux.test(v)) {
-                stop('bad_url_a', next_token, v);
-            }
-            urls.push(v);
-        } else if (a === 'for') {
-            if (option.adsafe) {
-                if (adsafe_id) {
-                    if (v.slice(0, adsafe_id.length) !== adsafe_id) {
-                        warn('adsafe_prefix_a', next_token, adsafe_id);
-                    } else if (!/^[A-Z]+_[A-Z]+$/.test(v)) {
-                        warn('adsafe_bad_id');
-                    }
-                } else {
-                    warn('adsafe_bad_id');
-                }
-            }
-        } else if (a === 'name') {
-            if (option.adsafe && v.indexOf('_') >= 0) {
-                warn('adsafe_name_a', next_token, v);
-            }
-        }
-    }
-
-    function do_tag(name, attribute) {
-        var i, tag = html_tag[name], script, x;
-        src = false;
-        if (!tag) {
-            stop(
-                bundle.unrecognized_tag_a,
-                next_token,
-                name === name.toLowerCase()
-                    ? name
-                    : name + ' (capitalization error)'
-            );
-        }
-        if (stack.length > 0) {
-            if (name === 'html') {
-                stop('unexpected_a', token, name);
-            }
-            x = tag.parent;
-            if (x) {
-                if (x.indexOf(' ' + stack[stack.length - 1].name + ' ') < 0) {
-                    stop('tag_a_in_b', token, name, x);
-                }
-            } else if (!option.adsafe && !option.fragment) {
-                i = stack.length;
-                do {
-                    if (i <= 0) {
-                        stop('tag_a_in_b', token, name, 'body');
-                    }
-                    i -= 1;
-                } while (stack[i].name !== 'body');
-            }
-        }
-        switch (name) {
-        case 'div':
-            if (option.adsafe && stack.length === 1 && !adsafe_id) {
-                warn('adsafe_missing_id');
-            }
-            break;
-        case 'script':
-            xmode = 'script';
-            advance('>');
-            if (attribute.lang) {
-                warn('lang', token);
-            }
-            if (option.adsafe && stack.length !== 1) {
-                warn('adsafe_placement', token);
-            }
-            if (attribute.src) {
-                if (option.adsafe && (!adsafe_may || !approved[attribute.src])) {
-                    warn('adsafe_source', token);
-                }
-                if (attribute.type) {
-                    warn('type', token);
-                }
-            } else {
-                step_in(next_token.from);
-                edge();
-                use_strict();
-                adsafe_top = true;
-                script = statements();
-
-// JSLint is also the static analyzer for ADsafe. See www.ADsafe.org.
-
-                if (option.adsafe) {
-                    if (adsafe_went) {
-                        stop('adsafe_script', token);
-                    }
-                    if (script.length !== 1 ||
-                            aint(script[0],             'id',     '(') ||
-                            aint(script[0].first,       'id',     '.') ||
-                            aint(script[0].first.first, 'string', 'ADSAFE') ||
-                            aint(script[0].second[0],   'string', adsafe_id)) {
-                        stop('adsafe_id_go');
-                    }
-                    switch (script[0].first.second.string) {
-                    case 'id':
-                        if (adsafe_may || adsafe_went ||
-                                script[0].second.length !== 1) {
-                            stop('adsafe_id', next_token);
-                        }
-                        adsafe_may = true;
-                        break;
-                    case 'go':
-                        if (adsafe_went) {
-                            stop('adsafe_go');
-                        }
-                        if (script[0].second.length !== 2 ||
-                                aint(script[0].second[1], 'id', 'function') ||
-                                !script[0].second[1].first ||
-                                script[0].second[1].first.length !== 2 ||
-                                aint(script[0].second[1].first[0], 'string', 'dom') ||
-                                aint(script[0].second[1].first[1], 'string', 'lib')) {
-                            stop('adsafe_go', next_token);
-                        }
-                        adsafe_went = true;
-                        break;
-                    default:
-                        stop('adsafe_id_go');
-                    }
-                }
-                indent = null;
-            }
-            xmode = 'html';
-            advance('</');
-            advance_identifier('script');
-            xmode = 'outer';
-            break;
-        case 'style':
-            xmode = 'style';
-            advance('>');
-            styles();
-            xmode = 'html';
-            advance('</');
-            advance_identifier('style');
-            break;
-        case 'input':
-            switch (attribute.type) {
-            case 'button':
-            case 'checkbox':
-            case 'radio':
-            case 'reset':
-            case 'submit':
-                break;
-            case 'file':
-            case 'hidden':
-            case 'image':
-            case 'password':
-            case 'text':
-                if (option.adsafe && attribute.autocomplete !== 'off') {
-                    warn('adsafe_autocomplete');
-                }
-                break;
-            default:
-                warn('bad_type');
-            }
-            break;
-        case 'applet':
-        case 'body':
-        case 'embed':
-        case 'frame':
-        case 'frameset':
-        case 'head':
-        case 'iframe':
-        case 'noembed':
-        case 'noframes':
-        case 'object':
-        case 'param':
-            if (option.adsafe) {
-                warn('adsafe_tag', next_token, name);
-            }
-            break;
-        }
-    }
-
-
-    function closetag(name) {
-        return '</' + name + '>';
-    }
-
-    function html() {
-
-        /*jslint confusion: true */
-
-        var attribute, attributes, is_empty, name, old_white = option.white,
-            quote, tag_name, tag, wmode;
-        xmode = 'html';
-        xquote = '';
-        stack = null;
-        for (;;) {
-            switch (next_token.string) {
-            case '<':
-                xmode = 'html';
-                advance('<');
-                attributes = {};
-                tag_name = next_token;
-                name = tag_name.string;
-                advance_identifier(name);
-                if (option.cap) {
-                    name = name.toLowerCase();
-                }
-                tag_name.name = name;
-                if (!stack) {
-                    stack = [];
-                    do_begin(name);
-                }
-                tag = html_tag[name];
-                if (typeof tag !== 'object') {
-                    stop('unrecognized_tag_a', tag_name, name);
-                }
-                is_empty = tag.empty;
-                tag_name.type = name;
-                for (;;) {
-                    if (next_token.id === '/') {
-                        advance('/');
-                        if (next_token.id !== '>') {
-                            warn('expected_a_b', next_token, '>', artifact());
-                        }
-                        break;
-                    }
-                    if (next_token.id && next_token.id.charAt(0) === '>') {
-                        break;
-                    }
-                    if (!next_token.identifier) {
-                        if (next_token.id === '(end)' || next_token.id === '(error)') {
-                            warn('expected_a_b', next_token, '>', artifact());
-                        }
-                        warn('bad_name_a');
-                    }
-                    option.white = false;
-                    spaces();
-                    attribute = next_token.string;
-                    option.white = old_white;
-                    advance();
-                    if (!option.cap && attribute !== attribute.toLowerCase()) {
-                        warn('attribute_case_a', token);
-                    }
-                    attribute = attribute.toLowerCase();
-                    xquote = '';
-                    if (Object.prototype.hasOwnProperty.call(attributes, attribute)) {
-                        warn('duplicate_a', token, attribute);
-                    }
-                    if (attribute.slice(0, 2) === 'on') {
-                        if (!option.on) {
-                            warn('html_handlers');
-                        }
-                        xmode = 'scriptstring';
-                        advance('=');
-                        quote = next_token.id;
-                        if (quote !== '"' && quote !== '\'') {
-                            stop('expected_a_b', next_token, '"', artifact());
-                        }
-                        xquote = quote;
-                        wmode = option.white;
-                        option.white = true;
-                        advance(quote);
-                        use_strict();
-                        statements();
-                        option.white = wmode;
-                        if (next_token.id !== quote) {
-                            stop('expected_a_b', next_token, quote, artifact());
-                        }
-                        xmode = 'html';
-                        xquote = '';
-                        advance(quote);
-                        tag = false;
-                    } else if (attribute === 'style') {
-                        xmode = 'scriptstring';
-                        advance('=');
-                        quote = next_token.id;
-                        if (quote !== '"' && quote !== '\'') {
-                            stop('expected_a_b', next_token, '"', artifact());
-                        }
-                        xmode = 'styleproperty';
-                        xquote = quote;
-                        advance(quote);
-                        substyle();
-                        xmode = 'html';
-                        xquote = '';
-                        advance(quote);
-                        tag = false;
-                    } else {
-                        if (next_token.id === '=') {
-                            advance('=');
-                            tag = next_token.string;
-                            if (!next_token.identifier &&
-                                    next_token.id !== '"' &&
-                                    next_token.id !== '\'' &&
-                                    next_token.id !== '(string)' &&
-                                    next_token.id !== '(string)' &&
-                                    next_token.id !== '(color)') {
-                                warn('expected_attribute_value_a', token, attribute);
-                            }
-                            advance();
-                        } else {
-                            tag = true;
-                        }
-                    }
-                    attributes[attribute] = tag;
-                    do_attribute(attribute, tag);
-                }
-                do_tag(name, attributes);
-                if (!is_empty) {
-                    stack.push(tag_name);
-                }
-                xmode = 'outer';
-                advance('>');
-                break;
-            case '</':
-                xmode = 'html';
-                advance('</');
-                if (!next_token.identifier) {
-                    warn('bad_name_a');
-                }
-                name = next_token.string;
-                if (option.cap) {
-                    name = name.toLowerCase();
-                }
-                advance();
-                if (!stack) {
-                    stop('unexpected_a', next_token, closetag(name));
-                }
-                tag_name = stack.pop();
-                if (!tag_name) {
-                    stop('unexpected_a', next_token, closetag(name));
-                }
-                if (tag_name.name !== name) {
-                    stop('expected_a_b',
-                        next_token, closetag(tag_name.name), closetag(name));
-                }
-                if (next_token.id !== '>') {
-                    stop('expected_a_b', next_token, '>', artifact());
-                }
-                xmode = 'outer';
-                advance('>');
-                break;
-            case '<!':
-                if (option.safe) {
-                    warn('adsafe_a');
-                }
-                xmode = 'html';
-                for (;;) {
-                    advance();
-                    if (next_token.id === '>' || next_token.id === '(end)') {
-                        break;
-                    }
-                    if (next_token.string.indexOf('--') >= 0) {
-                        stop('unexpected_a', next_token, '--');
-                    }
-                    if (next_token.string.indexOf('<') >= 0) {
-                        stop('unexpected_a', next_token, '<');
-                    }
-                    if (next_token.string.indexOf('>') >= 0) {
-                        stop('unexpected_a', next_token, '>');
-                    }
-                }
-                xmode = 'outer';
-                advance('>');
-                break;
-            case '(end)':
-                return;
-            default:
-                if (next_token.id === '(end)') {
-                    stop('missing_a', next_token,
-                        '</' + stack[stack.length - 1].string + '>');
-                } else {
-                    advance();
-                }
-            }
-            if (stack && stack.length === 0 && (option.adsafe ||
-                    !option.fragment || next_token.id === '(end)')) {
-                break;
-            }
-        }
-        if (next_token.id !== '(end)') {
-            stop('unexpected_a');
-        }
-    }
-
-
-// The actual JSLINT function itself.
-
-    itself = function JSLint(the_source, the_option) {
-
-        var i, predef, tree;
-        JSLINT.errors = [];
-        JSLINT.tree = '';
-        begin = prev_token = token = next_token =
-            Object.create(syntax['(begin)']);
-        predefined = {};
-        add_to_predefined(standard);
-        property_type = Object.create(standard_property_type);
-        if (the_option) {
-            option = Object.create(the_option);
-            predef = option.predef;
-            if (predef) {
-                if (Array.isArray(predef)) {
-                    for (i = 0; i < predef.length; i += 1) {
-                        predefined[predef[i]] = true;
-                    }
-                } else if (typeof predef === 'object') {
-                    add_to_predefined(predef);
-                }
-            }
-            do_safe();
-        } else {
-            option = {};
-        }
-        option.indent = +option.indent || 4;
-        option.maxerr = +option.maxerr || 50;
-        adsafe_id = '';
-        adsafe_may = adsafe_top = adsafe_went = false;
-        approved = {};
-        if (option.approved) {
-            for (i = 0; i < option.approved.length; i += 1) {
-                approved[option.approved[i]] = option.approved[i];
-            }
-        } else {
-            approved.test = 'test';
-        }
-        tab = '';
-        for (i = 0; i < option.indent; i += 1) {
-            tab += ' ';
-        }
-        global_scope = scope = {};
-        global_funct = funct = {
-            '(scope)': scope,
-            '(breakage)': 0,
-            '(loopage)': 0
-        };
-        functions = [funct];
-
-        comments_off = false;
-        ids = {};
-        in_block = false;
-        indent = null;
-        json_mode = false;
-        lookahead = [];
-        member = {};
-        node_js = false;
-        prereg = true;
-        src = false;
-        stack = null;
-        strict_mode = false;
-        urls = [];
-        var_mode = null;
-        warnings = 0;
-        xmode = '';
-        lex.init(the_source);
-
-        assume();
-
-        try {
-            advance();
-            if (next_token.id === '(number)') {
-                stop('unexpected_a');
-            } else if (next_token.string.charAt(0) === '<') {
-                html();
-                if (option.adsafe && !adsafe_went) {
-                    warn('adsafe_go', this);
-                }
-            } else {
-                switch (next_token.id) {
-                case '{':
-                case '[':
-                    json_mode = true;
-                    json_value();
-                    break;
-                case '@':
-                case '*':
-                case '#':
-                case '.':
-                case ':':
-                    xmode = 'style';
-                    advance();
-                    if (token.id !== '@' || !next_token.identifier ||
-                            next_token.string !== 'charset' || token.line !== 1 ||
-                            token.from !== 1) {
-                        stop('css');
-                    }
-                    advance();
-                    if (next_token.id !== '(string)' &&
-                            next_token.string !== 'UTF-8') {
-                        stop('css');
-                    }
-                    advance();
-                    semicolon();
-                    styles();
-                    break;
-
-                default:
-                    if (option.adsafe && option.fragment) {
-                        stop('expected_a_b',
-                            next_token, '<div>', artifact());
-                    }
-
-// If the first token is a semicolon, ignore it. This is sometimes used when
-// files are intended to be appended to files that may be sloppy. A sloppy
-// file may be depending on semicolon insertion on its last line.
-
-                    step_in(1);
-                    if (next_token.id === ';' && !node_js) {
-                        semicolon();
-                    }
-                    adsafe_top = true;
-                    tree = statements();
-                    begin.first = tree;
-                    JSLINT.tree = begin;
-                    // infer_types(tree);
-                    if (option.adsafe && (tree.length !== 1 ||
-                            aint(tree[0], 'id', '(') ||
-                            aint(tree[0].first, 'id', '.') ||
-                            aint(tree[0].first.first, 'string', 'ADSAFE') ||
-                            aint(tree[0].first.second, 'string', 'lib') ||
-                            tree[0].second.length !== 2 ||
-                            tree[0].second[0].id !== '(string)' ||
-                            aint(tree[0].second[1], 'id', 'function'))) {
-                        stop('adsafe_lib');
-                    }
-                    if (tree.disrupt) {
-                        warn('weird_program', prev_token);
-                    }
-                }
-            }
-            indent = null;
-            advance('(end)');
-        } catch (e) {
-            if (e) {        // `~
-                JSLINT.errors.push({
-                    reason    : e.message,
-                    line      : e.line || next_token.line,
-                    character : e.character || next_token.from
-                }, null);
-            }
-        }
-        return JSLINT.errors.length === 0;
-    };
-
-
-// Data summary.
-
-    itself.data = function () {
-        var data = {functions: []},
-            function_data,
-            globals,
-            i,
-            j,
-            kind,
-            members = [],
-            name,
-            the_function,
-            undef = [],
-            unused = [];
-        if (itself.errors.length) {
-            data.errors = itself.errors;
-        }
-
-        if (json_mode) {
-            data.json = true;
-        }
-
-        if (urls.length > 0) {
-            data.urls = urls;
-        }
-
-        globals = Object.keys(global_scope).filter(function (value) {
-            return value.charAt(0) !== '(' && typeof standard[value] !== 'boolean';
-        });
-        if (globals.length > 0) {
-            data.globals = globals;
-        }
-
-        for (i = 1; i < functions.length; i += 1) {
-            the_function = functions[i];
-            function_data = {};
-            for (j = 0; j < functionicity.length; j += 1) {
-                function_data[functionicity[j]] = [];
-            }
-            for (name in the_function) {
-                if (Object.prototype.hasOwnProperty.call(the_function, name)) {
-                    if (name.charAt(0) !== '(') {
-                        kind = the_function[name];
-                        if (kind === 'unction' || kind === 'unparam') {
-                            kind = 'unused';
-                        }
-                        if (Array.isArray(function_data[kind])) {
-                            function_data[kind].push(name);
-                            if (kind === 'unused') {
-                                unused.push({
-                                    name: name,
-                                    line: the_function['(line)'],
-                                    'function': the_function['(name)']
-                                });
-                            } else if (kind === 'undef') {
-                                undef.push({
-                                    name: name,
-                                    line: the_function['(line)'],
-                                    'function': the_function['(name)']
-                                });
-                            }
-                        }
-                    }
-                }
-            }
-            for (j = 0; j < functionicity.length; j += 1) {
-                if (function_data[functionicity[j]].length === 0) {
-                    delete function_data[functionicity[j]];
-                }
-            }
-            function_data.name = the_function['(name)'];
-            function_data.params = the_function['(params)'];
-            function_data.line = the_function['(line)'];
-            function_data['(complexity)'] = the_function['(complexity)'];
-            data.functions.push(function_data);
-        }
-
-        if (unused.length > 0) {
-            data.unused = unused;
-        }
-        if (undef.length > 0) {
-            data['undefined'] = undef;
-        }
-
-        members = [];
-        for (name in member) {
-            if (typeof member[name] === 'number') {
-                data.member = member;
-                break;
-            }
-        }
-
-        return data;
-    };
-
-
-    itself.report = function (errors_only) {
-        var data = itself.data(), err, evidence, i, italics, j, key, keys, length,
-            mem = '', name, names, output = [], snippets, the_function, type,
-            warning;
-
-        function detail(h, value) {
-            var comma_needed, singularity;
-            if (Array.isArray(value)) {
-                output.push('<div><i>' + h + '</i> ');
-                value.sort().forEach(function (item) {
-                    if (item !== singularity) {
-                        singularity = item;
-                        output.push((comma_needed ? ', ' : '') + singularity);
-                        comma_needed = true;
-                    }
-                });
-                output.push('</div>');
-            } else if (value) {
-                output.push('<div><i>' + h + '</i> ' + value + '</div>');
-            }
-        }
-
-        if (data.errors || data.unused || data['undefined']) {
-            err = true;
-            output.push('<div id=errors><i>Error:</i>');
-            if (data.errors) {
-                for (i = 0; i < data.errors.length; i += 1) {
-                    warning = data.errors[i];
-                    if (warning) {
-                        evidence = warning.evidence || '';
-                        output.push('<p>Problem' + (isFinite(warning.line)
-                            ? ' at line ' + String(warning.line) +
-                                ' character ' + String(warning.character)
-                            : '') +
-                            ': ' + warning.reason.entityify() +
-                            '</p><p class=evidence>' +
-                            (evidence && (evidence.length > 80
-                                ? evidence.slice(0, 77) + '...'
-                                : evidence).entityify()) + '</p>');
-                    }
-                }
-            }
-
-            if (data['undefined']) {
-                snippets = [];
-                for (i = 0; i < data['undefined'].length; i += 1) {
-                    snippets[i] = '<code><u>' + data['undefined'][i].name + '</u></code>&nbsp;<i>' +
-                        String(data['undefined'][i].line) + ' </i> <small>' +
-                        data['undefined'][i]['function'] + '</small>';
-                }
-                output.push('<p><i>Undefined variable:</i> ' + snippets.join(', ') + '</p>');
-            }
-            if (data.unused) {
-                snippets = [];
-                for (i = 0; i < data.unused.length; i += 1) {
-                    snippets[i] = '<code><u>' + data.unused[i].name + '</u></code>&nbsp;<i>' +
-                        String(data.unused[i].line) + ' </i> <small>' +
-                        data.unused[i]['function'] + '</small>';
-                }
-                output.push('<p><i>Unused variable:</i> ' + snippets.join(', ') + '</p>');
-            }
-            if (data.json) {
-                output.push('<p>JSON: bad.</p>');
-            }
-            output.push('</div>');
-        }
-
-        if (!errors_only) {
-
-            output.push('<br><div id=functions>');
-
-            if (data.urls) {
-                detail("URLs<br>", data.urls, '<br>');
-            }
-
-            if (xmode === 'style') {
-                output.push('<p>CSS.</p>');
-            } else if (data.json && !err) {
-                output.push('<p>JSON: good.</p>');
-            } else if (data.globals) {
-                output.push('<div><i>Global</i> ' +
-                    data.globals.sort().join(', ') + '</div>');
-            } else {
-                output.push('<div><i>No new global variables introduced.</i></div>');
-            }
-
-            for (i = 0; i < data.functions.length; i += 1) {
-                the_function = data.functions[i];
-                names = [];
-                if (the_function.params) {
-                    for (j = 0; j < the_function.params.length; j += 1) {
-                        names[j] = the_function.params[j].string;
-                    }
-                }
-                output.push('<br><div class=function><i>' +
-                    String(the_function.line) + '</i> ' +
-                    the_function.name.entityify() +
-                    '(' + names.join(', ') + ')</div>');
-                detail('<big><b>Undefined</b></big>', the_function['undefined']);
-                detail('<big><b>Unused</b></big>', the_function.unused);
-                detail('Closure', the_function.closure);
-                detail('Variable', the_function['var']);
-                detail('Exception', the_function.exception);
-                detail('Outer', the_function.outer);
-                detail('Global', the_function.global);
-                detail('Label', the_function.label);
-                detail('Complexity', the_function['(complexity)']);
-            }
-
-            if (data.member) {
-                keys = Object.keys(data.member);
-                if (keys.length) {
-                    keys = keys.sort();
-                    output.push('<br><pre id=properties>/*properties<br>');
-                    mem = '    ';
-                    italics = 0;
-                    j = 0;
-                    if (option.confusion) {
-                        for (i = 0; i < keys.length; i += 1) {
-                            key = keys[i];
-                            if (typeof standard_property_type[key] !== 'string') {
-                                name = ix.test(key)
-                                    ? key
-                                    : '\'' + key.entityify().replace(nx, sanitize) + '\'';
-                                if (data.member[key] === 1) {
-                                    name = '<i>' + name + '</i>';
-                                    italics += 1;
-                                    j = 1;
-                                }
-                                if (i < keys.length - 1) {
-                                    name += ', ';
-                                }
-                                if (mem.length + name.length - (italics * 7) > 80) {
-                                    output.push(mem + '<br>');
-                                    mem = '    ';
-                                    italics = j;
-                                }
-                                mem += name;
-                                j = 0;
-                            }
-                        }
-                    } else {
-                        for (i = 0; i < keys.length; i += 1) {
-                            key = keys[i];
-                            type = property_type[key];
-                            if (typeof type !== 'string') {
-                                type = '';
-                            }
-                            if (standard_property_type[key] !== type) {
-                                name = ix.test(key)
-                                    ? key
-                                    : '\'' + key.entityify().replace(nx, sanitize) + '\'';
-                                length += name.length + 2;
-                                if (data.member[key] === 1) {
-                                    name = '<i>' + name + '</i>';
-                                    italics += 1;
-                                    j = 1;
-                                }
-                                if (type) {
-                                    name += ': ' + type;
-                                }
-                                if (i < keys.length - 1) {
-                                    name += ', ';
-                                }
-                                if (mem.length + name.length - (italics * 7) > 80) {
-                                    output.push(mem + '<br>');
-                                    mem = '    ';
-                                    italics = j;
-                                }
-                                mem += name;
-                                j = 0;
-                            }
-                        }
-                    }
-                    output.push(mem + '<br>*/</pre>');
-                }
-                output.push('</div>');
-            }
-        }
-        return output.join('');
-    };
-    itself.jslint = itself;
-
-    itself.edition = '2011-10-17';
-
-    return itself;
-
-}());
\ No newline at end of file
Binary file sbin/res/rhino.jar has changed
--- a/src/js/header.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,26 +0,0 @@
-
-/* 
- *
-  __  __      _            _       _              _                       
- |  \/  | ___| |_ __ _  __| | __ _| |_ __ _ _ __ | | __ _ _   _  ___ _ __ 
- | |\/| |/ _ \ __/ _` |/ _` |/ _` | __/ _` | '_ \| |/ _` | | | |/ _ \ '__|
- | |  | |  __/ || (_| | (_| | (_| | || (_| | |_) | | (_| | |_| |  __/ |   
- |_|  |_|\___|\__\__,_|\__,_|\__,_|\__\__,_| .__/|_|\__,_|\__, |\___|_|   
-                                           |_|            |___/         
-
- *  Copyright 2010-2012 Institut de recherche et d'innovation 
- *	contributor(s) : Karim Hamidou, Samuel Huron, Raphael Velt, Thibaut Cavalie, Yves-Marie Haussonne, Nicolas Durand, Olivier Aubert
- *	 
- *	contact@iri.centrepompidou.fr
- *	http://www.iri.centrepompidou.fr 
- *	 
- *	This software is a computer program whose purpose is to show and add annotations on a video .
- *	This software is governed by the CeCILL-C license under French law and
- *	abiding by the rules of distribution of free software. You can  use, 
- *	modify and/ or redistribute the software under the terms of the CeCILL-C
- *	license as circulated by CEA, CNRS and INRIA at the following URL
- *	"http://www.cecill.info". 
- *	
- *	The fact that you are presently reading this means that you have had
- *	knowledge of the CeCILL-C license and that you accept its terms.
-*/
--- a/src/js/html-player.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/js/html-player.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,6 +1,6 @@
 /* HTML player, to be reused in a widget, or elsewhere */
-
-IriSP.htmlPlayer = function(media, jqselector, options) {
+import jQuery from "jquery";
+const htmlPlayer = function(media, jqselector, options) {
     
     var opts = options || {},
         videoURL = opts.video || media.video;
@@ -9,7 +9,7 @@
         videoURL = opts.url_transform(videoURL);
     }
         
-    var videoEl = IriSP.jQuery('<video>');
+    var videoEl = jQuery('<video>');
     
     videoEl.attr({
         width : opts.width || undefined,
@@ -22,7 +22,7 @@
         videoEl.attr("src",videoURL);
     } else {
         for (var i = 0; i < videoURL.length; i++) {
-            var _srcNode = IriSP.jQuery('<source>');
+            var _srcNode = jQuery('<source>');
             _srcNode.attr({
                 src: videoURL[i].src,
                 type: videoURL[i].type
@@ -31,7 +31,7 @@
         }
     }
     if (opts.subtitle) {
-        var _trackNode = IriSP.jQuery('<track>');
+        var _trackNode = jQuery('<track>');
         _trackNode.attr({
             label: "Subtitles",
             kind: "subtitles",
@@ -147,3 +147,5 @@
         };
     });
 };
+
+export default htmlPlayer;
--- a/src/js/iframe_embed/embedder.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/js/iframe_embed/embedder.js	Wed Sep 04 17:32:50 2024 +0200
@@ -3,11 +3,7 @@
    to the iframe url in the page url.   
 */
 
-if (typeof IriSP === "undefined") {
-    IriSP = {};
-}
-
-IriSP.iFrameUpdater = function(_frameId) {
+const iFrameUpdater = function(_frameId) {
     
     var _frame = document.getElementById(_frameId),
         _blocked = false,
@@ -34,3 +30,5 @@
     window.setTimeout(_updater, 2000);
     
 };
+
+export default iFrameUpdater;
--- a/src/js/init.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/js/init.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,19 +1,27 @@
 /* Initialization of the namespace */
+import {$,jQuery} from 'jquery';
+window.$ = $;
+window.jQuery = jQuery;
+global.$ = $;
+global.jQuery = jQuery;
 
-if (typeof window.IriSP === "undefined") {
-    window.IriSP = {
-        VERSION: "0.3.2"
-    };
-}
+import 'jquery-ui/dist/jquery-ui';
+
+import 'jquery-ui/dist/themes/base/jquery-ui.css';
+
+import _ from "lodash";
 
-if (typeof IriSP.jQuery === "undefined" && typeof window.jQuery !== "undefined") {
-    var jvp = window.jQuery().jquery.split("."),
-        jv = 100 * parseInt(jvp[0]) + parseInt(jvp[1]);
-    if (jv > 170) {
-        IriSP.jQuery = window.jQuery;
-    }
-}
+const __APP_VERSION__ = "";
+
+const APP_VERSION = __APP_VERSION__;
 
-if (typeof IriSP._ === "undefined" && typeof window._ !== "undefined" && parseFloat(window._.VERSION) >= 1.4) {
-    IriSP._ = window._;
-}
+const IriSP = {
+  VERSION: APP_VERSION,
+  jQuery: jQuery,
+  libFiles: { locations: {} },
+
+};
+
+window.IriSP = IriSP;
+
+export default IriSP;
--- a/src/js/model.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/js/model.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,837 +1,943 @@
-
 /* js is where data is stored in a standard form, whatever the serializer */
 
 //TODO: Separate Project-specific data from Source
+import _ from "lodash";
+import jQuery from "jquery";
 
-IriSP.Model = (function (ns) {
-    
-    function pad(n, x, b) {
-        b = b || 10;
-        var s = (x).toString(b);
-        while (s.length < n) {
-            s = "0" + s;
-        }
-        return s;
-    }
-    
-    function rand16(n) {
-        return pad(n, Math.floor(Math.random()*Math.pow(16,n)), 16);
+const Model = function (ns) {
+  function pad(n, x, b) {
+    b = b || 10;
+    var s = x.toString(b);
+    while (s.length < n) {
+      s = "0" + s;
     }
-    
-    var uidbase = rand16(8) + "-" + rand16(4) + "-", uidincrement = Math.floor(Math.random()*0x10000);
-    
-    var charsub = [
-        '[aáàâä]',
-        '[cç]',
-        '[eéèêë]',
-        '[iíìîï]',
-        '[oóòôö]',
-        '[uùûü]'
-    ];
-    
-    var removeChars = [
-        String.fromCharCode(768), String.fromCharCode(769), String.fromCharCode(770), String.fromCharCode(771), String.fromCharCode(807),
-        "{", "}", "(", ")", "[", "]", "【", "】", "、", "・", "‥", "。", "「", "」", "『", "』", "〜", ":", "!", "?", " ",
-        ",", " ", ";", "(", ")", ".", "*", "+", "\\", "?", "|", "{", "}", "[", "]", "^", "#", "/"
-    ];
-    
-var Model = {},
-    _SOURCE_STATUS_EMPTY = Model._SOURCE_STATUS_EMPTY = 0,
-    _SOURCE_STATUS_WAITING = Model._SOURCE_STATUS_WAITING = 1,
-    _SOURCE_STATUS_READY = Model._SOURCE_STATUS_READY = 2,
-    extendPrototype = Model.extendPrototype = function(toClass, fromClass) {
-        var fromP = fromClass.prototype,
-            toP = toClass.prototype;
-        for (var k in fromP) {
-            if (fromP.hasOwnProperty(k)) {
-                toP[k] = fromP[k];
-            }
+    return s;
+  }
+
+  function rand16(n) {
+    return pad(n, Math.floor(Math.random() * Math.pow(16, n)), 16);
+  }
+
+  var uidbase = rand16(8) + "-" + rand16(4) + "-",
+    uidincrement = Math.floor(Math.random() * 0x10000);
+
+  var charsub = ["[aáàâä]", "[cç]", "[eéèêë]", "[iíìîï]", "[oóòôö]", "[uùûü]"];
+
+  var removeChars = [
+    String.fromCharCode(768),
+    String.fromCharCode(769),
+    String.fromCharCode(770),
+    String.fromCharCode(771),
+    String.fromCharCode(807),
+    "{",
+    "}",
+    "(",
+    ")",
+    "[",
+    "]",
+    "【",
+    "】",
+    "、",
+    "・",
+    "‥",
+    "。",
+    "「",
+    "」",
+    "『",
+    "』",
+    "〜",
+    ":",
+    "!",
+    "?",
+    " ",
+    ",",
+    " ",
+    ";",
+    "(",
+    ")",
+    ".",
+    "*",
+    "+",
+    "\\",
+    "?",
+    "|",
+    "{",
+    "}",
+    "[",
+    "]",
+    "^",
+    "#",
+    "/",
+  ];
+
+  var Model = {},
+    _SOURCE_STATUS_EMPTY = (Model._SOURCE_STATUS_EMPTY = 0),
+    _SOURCE_STATUS_WAITING = (Model._SOURCE_STATUS_WAITING = 1),
+    _SOURCE_STATUS_READY = (Model._SOURCE_STATUS_READY = 2),
+    extendPrototype = (Model.extendPrototype = function (toClass, fromClass) {
+      var fromP = fromClass.prototype,
+        toP = toClass.prototype;
+      for (var k in fromP) {
+        if (fromP.hasOwnProperty(k)) {
+          toP[k] = fromP[k];
         }
-    },
-    getUID = Model.getUID = function() {
-        return uidbase + pad(4, (++uidincrement % 0x10000), 16) + "-" + rand16(4) + "-" + rand16(6) + rand16(6);
-    },
-    isLocalURL = Model.isLocalURL = function(url) {
-        var matches = url.match(/^(\w+:)\/\/([^/]+)/);
-        if (matches) {
-            return(matches[1] === document.location.protocol && matches[2] === document.location.host);
-        }
-        return true;
-    },
-    regexpFromTextOrArray = Model.regexpFromTextOrArray = function(_textOrArray, _testOnly, _iexact) {
-        var _testOnly = _testOnly || false,
-            _iexact = _iexact || false;
-        function escapeText(_text) {
-            return _text.replace(/([\\\*\+\?\|\{\[\}\]\(\)\^\$\.\#\/])/gm, '\\$1');
-        }
-        var _source = 
-            typeof _textOrArray === "string"
+      }
+    }),
+    getUID = (Model.getUID = function () {
+      return (
+        uidbase +
+        pad(4, ++uidincrement % 0x10000, 16) +
+        "-" +
+        rand16(4) +
+        "-" +
+        rand16(6) +
+        rand16(6)
+      );
+    }),
+    isLocalURL = (Model.isLocalURL = function (url) {
+      var matches = url.match(/^(\w+:)\/\/([^/]+)/);
+      if (matches) {
+        return (
+          matches[1] === document.location.protocol &&
+          matches[2] === document.location.host
+        );
+      }
+      return true;
+    }),
+    regexpFromTextOrArray = (Model.regexpFromTextOrArray = function (
+      _textOrArray,
+      _testOnly,
+      _iexact
+    ) {
+      var _testOnly = _testOnly || false,
+        _iexact = _iexact || false;
+      function escapeText(_text) {
+        return _text.replace(/([\\\*\+\?\|\{\[\}\]\(\)\^\$\.\#\/])/gm, "\\$1");
+      }
+      var _source =
+          typeof _textOrArray === "string"
             ? escapeText(_textOrArray)
-            : ns._(_textOrArray).map(escapeText).join("|"),
-            _flags = 'im';
-        if (!_testOnly) {
-            _source = '(' + _source + ')';
-            _flags += 'g';
-        }
-        if (_iexact) {
-            _source = '^' + _source + '$';
-        }
-        return new RegExp( _source, _flags);
-    },
-    fullTextRegexps = Model.fullTextRegexps = function(_text) {
-        var remsrc = "[\\" + removeChars.join("\\") + "]",
-            remrx = new RegExp(remsrc,"gm"),
-            txt = _text.toLowerCase().replace(remrx,""),
-            res = [],
-            charsrx = ns._(charsub).map(function(c) {
-                return new RegExp(c);
-            }),
-            src = "";
-        for (var j = 0; j < txt.length; j++) {
-            if (j) {
-                src += remsrc + "*";
-            }
-            var l = txt[j];
-            ns._(charsub).each(function(v, k) {
-                l = l.replace(charsrx[k], v);
-            });
-            src += l;
+            : _(_textOrArray).map(escapeText).join("|"),
+        _flags = "im";
+      if (!_testOnly) {
+        _source = "(" + _source + ")";
+        _flags += "g";
+      }
+      if (_iexact) {
+        _source = "^" + _source + "$";
+      }
+      return new RegExp(_source, _flags);
+    }),
+    fullTextRegexps = (Model.fullTextRegexps = function (_text) {
+      var remsrc = "[\\" + removeChars.join("\\") + "]",
+        remrx = new RegExp(remsrc, "gm"),
+        txt = _text.toLowerCase().replace(remrx, ""),
+        res = [],
+        charsrx = _(charsub).map(function (c) {
+          return new RegExp(c);
+        }),
+        src = "";
+      for (var j = 0; j < txt.length; j++) {
+        if (j) {
+          src += remsrc + "*";
         }
-        return "(" + src + ")";
-    },
-    isoToDate = Model.isoToDate = function(_str) {
-        // http://delete.me.uk/2005/03/iso8601.html
-        var regexp = "([0-9]{4})(-([0-9]{2})(-([0-9]{2})(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?";
-        var d = _str.match(new RegExp(regexp));
-    
-        var offset = 0;
-        var date = new Date(d[1], 0, 1);
-    
-        if (d[3]) { date.setMonth(d[3] - 1); }
-        if (d[5]) { date.setDate(d[5]); }
-        if (d[7]) { date.setHours(d[7]); }
-        if (d[8]) { date.setMinutes(d[8]); }
-        if (d[10]) { date.setSeconds(d[10]); }
-        if (d[12]) { date.setMilliseconds(Number("0." + d[12]) * 1000); }
-        if (d[14]) {
-            offset = (Number(d[16]) * 60) + Number(d[17]);
-            offset *= ((d[15] == '-') ? 1 : -1);
-        }
-    
-        offset -= date.getTimezoneOffset();
-        time = (Number(date) + (offset * 60 * 1000));
-        var _res = new Date();
-        _res.setTime(Number(time));
-        return _res;
-    },
-    dateToIso = Model.dateToIso = function(_d) {
-        var d = _d ? new Date(_d) : new Date();
-        return d.getUTCFullYear()+'-'  
-            + pad(2, d.getUTCMonth()+1)+'-'  
-            + pad(2, d.getUTCDate())+'T'  
-            + pad(2, d.getUTCHours())+':'  
-            + pad(2, d.getUTCMinutes())+':'  
-            + pad(2, d.getUTCSeconds())+'Z'  ;
-    };
+        var l = txt[j];
+        _(charsub).each(function (v, k) {
+          l = l.replace(charsrx[k], v);
+        });
+        src += l;
+      }
+      return "(" + src + ")";
+    }),
+    isoToDate = (Model.isoToDate = function (_str) {
+      // http://delete.me.uk/2005/03/iso8601.html
+      var regexp =
+        "([0-9]{4})(-([0-9]{2})(-([0-9]{2})(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(.([0-9]+))?)?(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?";
+      var d = _str.match(new RegExp(regexp));
+
+      var offset = 0;
+      var date = new Date(d[1], 0, 1);
 
-/*
- * List is a class for a list of elements (e.g. annotations, medias, etc. that each have a distinct ID)
- */
-var List = Model.List = function(_directory) {
+      if (d[3]) {
+        date.setMonth(d[3] - 1);
+      }
+      if (d[5]) {
+        date.setDate(d[5]);
+      }
+      if (d[7]) {
+        date.setHours(d[7]);
+      }
+      if (d[8]) {
+        date.setMinutes(d[8]);
+      }
+      if (d[10]) {
+        date.setSeconds(d[10]);
+      }
+      if (d[12]) {
+        date.setMilliseconds(Number("0." + d[12]) * 1000);
+      }
+      if (d[14]) {
+        offset = Number(d[16]) * 60 + Number(d[17]);
+        offset *= d[15] == "-" ? 1 : -1;
+      }
+
+      offset -= date.getTimezoneOffset();
+      const time = Number(date) + offset * 60 * 1000;
+      var _res = new Date();
+      _res.setTime(Number(time));
+      return _res;
+    }),
+    dateToIso = (Model.dateToIso = function (_d) {
+      var d = _d ? new Date(_d) : new Date();
+      return (
+        d.getUTCFullYear() +
+        "-" +
+        pad(2, d.getUTCMonth() + 1) +
+        "-" +
+        pad(2, d.getUTCDate()) +
+        "T" +
+        pad(2, d.getUTCHours()) +
+        ":" +
+        pad(2, d.getUTCMinutes()) +
+        ":" +
+        pad(2, d.getUTCSeconds()) +
+        "Z"
+      );
+    });
+
+  /*
+   * List is a class for a list of elements (e.g. annotations, medias, etc. that each have a distinct ID)
+   */
+  var List = (Model.List = function (_directory) {
     Array.call(this);
     this.directory = _directory;
     this.idIndex = [];
     this.__events = {};
     if (typeof _directory == "undefined") {
-        console.trace();
-        throw "Error : new List(directory): directory is undefined";
+      console.trace();
+      throw "Error : new List(directory): directory is undefined";
     }
-    var _this =  this;
-    this.on("clear-search", function() {
-        _this.searching = false;
-        _this.regexp = undefined;
-        _this.forEach(function(_element) {
-            _element.found = undefined;
-        });
-        _this.trigger("search-cleared");
+    var _this = this;
+    this.on("clear-search", function () {
+      _this.searching = false;
+      _this.regexp = undefined;
+      _this.forEach(function (_element) {
+        _element.found = undefined;
+      });
+      _this.trigger("search-cleared");
     });
-};
+  });
 
-List.prototype = new Array();
+  List.prototype = new Array();
 
-List.prototype.hasId = function(_id) {
-    return ns._(this.idIndex).include(_id);
-};
+  List.prototype.hasId = function (_id) {
+    return _(this.idIndex).includes(_id);
+  };
 
-/* On recent browsers, forEach and map are defined and do what we want.
- * Otherwise, we'll use the Underscore.js functions
- */
-if (typeof Array.prototype.forEach === "undefined") {
-    List.prototype.forEach = function(_callback) {
-        var _this = this;
-        ns._(this).forEach(function(_value, _key) {
-            _callback(_value, _key, _this);
-        });
+  /* On recent browsers, forEach and map are defined and do what we want.
+   * Otherwise, we'll use the Underscore.js functions
+   */
+  if (typeof Array.prototype.forEach === "undefined") {
+    List.prototype.forEach = function (_callback) {
+      var _this = this;
+      _(this).forEach(function (_value, _key) {
+        _callback(_value, _key, _this);
+      });
     };
-};
+  }
 
-if (typeof Array.prototype.map === "undefined") {
-    List.prototype.map = function(_callback) {
-        var _this = this;
-        return ns._(this).map(function(_value, _key) {
-            return _callback(_value, _key, _this);
-        });
+  if (typeof Array.prototype.map === "undefined") {
+    List.prototype.map = function (_callback) {
+      var _this = this;
+      return _(this).map(function (_value, _key) {
+        return _callback(_value, _key, _this);
+      });
     };
-};
+  }
 
-List.prototype.pluck = function(_key) {
-    return this.map(function(_value) {
-        return _value[_key];
+  List.prototype.pluck = function (_key) {
+    return this.map(function (_value) {
+      return _value[_key];
     });
-};
+  };
 
-/* We override Array's filter function because it doesn't return an List
- */
-List.prototype.filter = function(_callback) {
+  /* We override Array's filter function because it doesn't return an List
+   */
+  List.prototype.filter = function (_callback) {
     var _this = this,
-        _res = new List(this.directory);
-    _res.addElements(ns._(this).filter(function(_value, _key) {
+      _res = new List(this.directory);
+    _res.addElements(
+      _(this).filter(function (_value, _key) {
         return _callback(_value, _key, _this);
-    }));
+      })
+    );
     return _res;
-};
+  };
 
-List.prototype.slice = function(_start, _end) {
+  List.prototype.slice = function (_start, _end) {
     var _res = new List(this.directory);
     _res.addElements(Array.prototype.slice.call(this, _start, _end));
     return _res;
-};
+  };
 
-List.prototype.splice = function(_start, _end) {
+  List.prototype.splice = function (_start, _end) {
     var _res = new List(this.directory);
     _res.addElements(Array.prototype.splice.call(this, _start, _end));
     this.idIndex.splice(_start, _end);
     return _res;
-};
+  };
 
-/* Array has a sort function, but it's not as interesting as Underscore.js's sortBy
- * and won't return a new List
- */
-List.prototype.sortBy = function(_callback) {
+  /* Array has a sort function, but it's not as interesting as Underscore.js's sortBy
+   * and won't return a new List
+   */
+  List.prototype.sortBy = function (_callback) {
     var _this = this,
-        _res = new List(this.directory);
-    _res.addElements(ns._(this).sortBy(function(_value, _key) {
+      _res = new List(this.directory);
+    _res.addElements(
+      _(this).sortBy(function (_value, _key) {
         return _callback(_value, _key, _this);
-    }));
+      })
+    );
     return _res;
-};
+  };
 
-/* Title and Description are basic information for (almost) all element types,
- * here we can search by these criteria
- */
-List.prototype.searchByTitle = function(_text, _iexact) {
+  /* Title and Description are basic information for (almost) all element types,
+   * here we can search by these criteria
+   */
+  List.prototype.searchByTitle = function (_text, _iexact) {
     var _iexact = _iexact || false,
-        _rgxp = regexpFromTextOrArray(_text, true, _iexact);
-    return this.filter(function(_element) {
-        return _rgxp.test(_element.title);
+      _rgxp = regexpFromTextOrArray(_text, true, _iexact);
+    return this.filter(function (_element) {
+      return _rgxp.test(_element.title);
     });
-};
+  };
 
-List.prototype.searchByDescription = function(_text, _iexact) {
+  List.prototype.searchByDescription = function (_text, _iexact) {
     var _iexact = _iexact || false,
-        _rgxp = regexpFromTextOrArray(_text, true, _iexact);
-    return this.filter(function(_element) {
-        return _rgxp.test(_element.description);
+      _rgxp = regexpFromTextOrArray(_text, true, _iexact);
+    return this.filter(function (_element) {
+      return _rgxp.test(_element.description);
     });
-};
+  };
 
-List.prototype.searchByTextFields = function(_text, _iexact) {
+  List.prototype.searchByTextFields = function (_text, _iexact) {
     var _iexact = _iexact || false,
-        _rgxp =  regexpFromTextOrArray(_text, true, _iexact);
-    return this.filter(function(_element) {
-        var keywords = (_element.keywords || _element.getTagTexts() || []).join(", ");
-        return _rgxp.test(_element.description) || _rgxp.test(_element.title) || _rgxp.test(keywords);
+      _rgxp = regexpFromTextOrArray(_text, true, _iexact);
+    return this.filter(function (_element) {
+      var keywords = (_element.keywords || _element.getTagTexts() || []).join(
+        ", "
+      );
+      return (
+        _rgxp.test(_element.description) ||
+        _rgxp.test(_element.title) ||
+        _rgxp.test(keywords)
+      );
     });
-};
+  };
 
-List.prototype.search = function(_text) {
+  List.prototype.search = function (_text) {
     if (!_text) {
-        this.trigger("clear-search");
-        return this;
+      this.trigger("clear-search");
+      return this;
     }
     this.searching = true;
     this.trigger("search", _text);
     var rxsource = fullTextRegexps(_text),
-        rgxp = new RegExp(rxsource,"im");
-    this.regexp = new RegExp(rxsource,"gim");
-    var res = this.filter(function(_element, _k) {
-        var titlematch = rgxp.test(_element.title),
-            descmatch = rgxp.test(_element.description),
-            _isfound = !!(titlematch || descmatch);
-        _element.found = _isfound;
-        _element.trigger(_isfound ? "found" : "not-found");
-        return _isfound;
+      rgxp = new RegExp(rxsource, "im");
+    this.regexp = new RegExp(rxsource, "gim");
+    var res = this.filter(function (_element, _k) {
+      var titlematch = rgxp.test(_element.title),
+        descmatch = rgxp.test(_element.description),
+        _isfound = !!(titlematch || descmatch);
+      _element.found = _isfound;
+      _element.trigger(_isfound ? "found" : "not-found");
+      return _isfound;
     });
-    this.trigger(res.length ? "found" : "not-found",res);
+    this.trigger(res.length ? "found" : "not-found", res);
     return res;
-};
+  };
 
-List.prototype.searchByTags = function(_text) {
+  List.prototype.searchByTags = function (_text) {
     if (!_text) {
-        this.trigger("clear-search");
-        return this;
+      this.trigger("clear-search");
+      return this;
     }
     this.searching = true;
     this.trigger("search", _text);
     var rxsource = fullTextRegexps(_text),
-        rgxp = new RegExp(rxsource,"im");
-    this.regexp = new RegExp(rxsource,"gim");
-    var res = this.filter(function(_element, _k) {
-        var _isfound = rgxp.test(_element.getTagTexts());
-        _element.found = _isfound;
-        _element.trigger(_isfound ? "found" : "not-found");
-        return _isfound;
+      rgxp = new RegExp(rxsource, "im");
+    this.regexp = new RegExp(rxsource, "gim");
+    var res = this.filter(function (_element, _k) {
+      var _isfound = rgxp.test(_element.getTagTexts());
+      _element.found = _isfound;
+      _element.trigger(_isfound ? "found" : "not-found");
+      return _isfound;
     });
-    this.trigger(res.length ? "found" : "not-found",res);
+    this.trigger(res.length ? "found" : "not-found", res);
     return res;
-};
+  };
 
-List.prototype.getTitles = function() {
-    return this.map(function(_el) {
-        return _el.title;
+  List.prototype.getTitles = function () {
+    return this.map(function (_el) {
+      return _el.title;
     });
-};
+  };
 
-List.prototype.addId = function(_id) {
+  List.prototype.addId = function (_id) {
     var _el = this.directory.getElement(_id);
     if (!this.hasId(_id) && typeof _el !== "undefined") {
-        this.idIndex.push(_id);
-        Array.prototype.push.call(this, _el);
+      this.idIndex.push(_id);
+      Array.prototype.push.call(this, _el);
     }
-};
+  };
 
-List.prototype.push = function(_el) {
+  List.prototype.push = function (_el) {
     if (typeof _el === "undefined") {
-        return;
+      return;
     }
-    var _index = (ns._(this.idIndex).indexOf(_el.id));
+    var _index = _(this.idIndex).indexOf(_el.id);
     if (_index === -1) {
-        this.idIndex.push(_el.id);
-        Array.prototype.push.call(this, _el);
+      this.idIndex.push(_el.id);
+      Array.prototype.push.call(this, _el);
     } else {
-        this[_index] = _el;
+      this[_index] = _el;
     }
-};
+  };
 
-List.prototype.addIds = function(_array) {
+  List.prototype.addIds = function (_array) {
     var _l = _array.length,
-        _this = this;
-    ns._(_array).forEach(function(_id) {
-        _this.addId(_id);
+      _this = this;
+    _(_array).forEach(function (_id) {
+      _this.addId(_id);
     });
-};
+  };
 
-List.prototype.addElements = function(_array) {
+  List.prototype.addElements = function (_array) {
     var _this = this;
-    ns._(_array).forEach(function(_el) {
-        _this.push(_el);
+    _(_array).forEach(function (_el) {
+      _this.push(_el);
     });
-};
+  };
 
-List.prototype.removeId = function(_id, _deleteFromDirectory) {
+  List.prototype.removeId = function (_id, _deleteFromDirectory) {
     var _deleteFromDirectory = _deleteFromDirectory || false,
-        _index = (ns._(this.idIndex).indexOf(_id));
+      _index = _(this.idIndex).indexOf(_id);
     if (_index !== -1) {
-        this.splice(_index,1);
+      this.splice(_index, 1);
     }
     if (_deleteFromDirectory) {
-        delete this.directory.elements[_id];
+      delete this.directory.elements[_id];
     }
-};
+  };
 
-List.prototype.removeElement = function(_el, _deleteFromDirectory) {
+  List.prototype.removeElement = function (_el, _deleteFromDirectory) {
     var _deleteFromDirectory = _deleteFromDirectory || false;
     this.removeId(_el.id);
-};
+  };
 
-List.prototype.removeIds = function(_list, _deleteFromDirectory) {
+  List.prototype.removeIds = function (_list, _deleteFromDirectory) {
     var _deleteFromDirectory = _deleteFromDirectory || false,
-        _this = this;
-    ns._(_list).forEach(function(_id) {
-        _this.removeId(_id);
+      _this = this;
+    _(_list).forEach(function (_id) {
+      _this.removeId(_id);
     });
-};
+  };
 
-List.prototype.removeElements = function(_list, _deleteFromDirectory) {
+  List.prototype.removeElements = function (_list, _deleteFromDirectory) {
     var _deleteFromDirectory = _deleteFromDirectory || false,
-        _this = this;
-    ns._(_list).forEach(function(_el) {
-        _this.removeElement(_el);
+      _this = this;
+    _(_list).forEach(function (_el) {
+      _this.removeElement(_el);
     });
-};
+  };
 
-List.prototype.on = function(_event, _callback) {
+  List.prototype.on = function (_event, _callback) {
     if (typeof this.__events[_event] === "undefined") {
-        this.__events[_event] = [];
+      this.__events[_event] = [];
     }
     this.__events[_event].push(_callback);
-};
+  };
 
-List.prototype.off = function(_event, _callback) {
+  List.prototype.off = function (_event, _callback) {
     if (typeof this.__events[_event] !== "undefined") {
-        this.__events[_event] = ns._(this.__events[_event]).reject(function(_fn) {
-            return _fn === _callback;
+      this.__events[_event] = ns
+        ._(this.__events[_event])
+        .reject(function (_fn) {
+          return _fn === _callback;
         });
     }
-};
+  };
 
-List.prototype.trigger = function(_event, _data) {
+  List.prototype.trigger = function (_event, _data) {
     var _list = this;
-    ns._(this.__events[_event]).each(function(_callback) {
-        _callback.call(_list, _data);
+    _(this.__events[_event]).each(function (_callback) {
+      _callback.call(_list, _data);
     });
-};
+  };
 
-/* A simple time management object, that helps converting millisecs to seconds and strings,
- * without the clumsiness of the original Date object.
- */
+  /* A simple time management object, that helps converting millisecs to seconds and strings,
+   * without the clumsiness of the original Date object.
+   */
 
-var Time = Model.Time = function(_milliseconds) {
+  var Time = (Model.Time = function (_milliseconds) {
     this.milliseconds = 0;
     this.setMilliseconds(_milliseconds);
-};
+  });
 
-Time.prototype.setMilliseconds = function(_milliseconds) {
+  Time.prototype.setMilliseconds = function (_milliseconds) {
     var _ante = this.milliseconds;
-    switch(typeof _milliseconds) {
-        case "string":
-            this.milliseconds = parseInt(_milliseconds);
-            break;
-        case "number":
-            this.milliseconds = Math.floor(_milliseconds);
-            break;
-        case "object":
-            this.milliseconds = parseInt(_milliseconds.valueOf());
-            break;
-        default:
-            this.milliseconds = 0;
+    switch (typeof _milliseconds) {
+      case "string":
+        this.milliseconds = parseInt(_milliseconds);
+        break;
+      case "number":
+        this.milliseconds = Math.floor(_milliseconds);
+        break;
+      case "object":
+        this.milliseconds = parseInt(_milliseconds.valueOf());
+        break;
+      default:
+        this.milliseconds = 0;
     }
     if (this.milliseconds === NaN) {
-        this.milliseconds = _ante;
+      this.milliseconds = _ante;
     }
-};
+  };
 
-Time.prototype.setSeconds = function(_seconds) {
+  Time.prototype.setSeconds = function (_seconds) {
     this.milliseconds = 1000 * _seconds;
-};
+  };
 
-Time.prototype.getSeconds = function() {
+  Time.prototype.getSeconds = function () {
     return this.milliseconds / 1000;
-};
+  };
 
-Time.prototype.getHMS = function() {
+  Time.prototype.getHMS = function () {
     var _totalSeconds = Math.abs(Math.floor(this.getSeconds()));
     return {
-        hours : Math.floor(_totalSeconds / 3600),
-        minutes : (Math.floor(_totalSeconds / 60) % 60),
-        seconds : _totalSeconds % 60,
-        milliseconds: this.milliseconds % 1000
+      hours: Math.floor(_totalSeconds / 3600),
+      minutes: Math.floor(_totalSeconds / 60) % 60,
+      seconds: _totalSeconds % 60,
+      milliseconds: this.milliseconds % 1000,
     };
-};
+  };
 
-Time.prototype.add = function(_milliseconds) {
+  Time.prototype.add = function (_milliseconds) {
     this.milliseconds += new Time(_milliseconds).milliseconds;
-};
+  };
 
-Time.prototype.valueOf = function() {
+  Time.prototype.valueOf = function () {
     return this.milliseconds;
-};
+  };
 
-Time.prototype.toString = function(showCs) {
+  Time.prototype.toString = function (showCs) {
     var _hms = this.getHMS(),
-        _res = '';
+      _res = "";
     if (_hms.hours) {
-        _res += _hms.hours + ':';
+      _res += _hms.hours + ":";
     }
-    _res += pad(2, _hms.minutes) + ':' + pad(2, _hms.seconds);
+    _res += pad(2, _hms.minutes) + ":" + pad(2, _hms.seconds);
     if (showCs) {
-        _res += "." + Math.floor(_hms.milliseconds / 100);
+      _res += "." + Math.floor(_hms.milliseconds / 100);
     }
     return _res;
-};
+  };
 
-/* Reference handles references between elements
- */
+  /* Reference handles references between elements
+   */
 
-var Reference = Model.Reference = function(_source, _idRef) {
+  var Reference = (Model.Reference = function (_source, _idRef) {
     this.source = _source;
     this.id = _idRef;
     if (typeof _idRef === "object") {
-        this.isList = true;
+      this.isList = true;
     } else {
-        this.isList = false;
+      this.isList = false;
     }
     this.refresh();
-};
+  });
 
-Reference.prototype.refresh = function() {
+  Reference.prototype.refresh = function () {
     if (this.isList) {
-        this.contents = new List(this.source.directory);
-        this.contents.addIds(this.id);
+      this.contents = new List(this.source.directory);
+      this.contents.addIds(this.id);
     } else {
-        this.contents = this.source.getElement(this.id);
+      this.contents = this.source.getElement(this.id);
     }
-    
-};
+  };
 
-Reference.prototype.getContents = function() {
-    if (typeof this.contents === "undefined" || (this.isList && this.contents.length != this.id.length)) {
-        this.refresh();
+  Reference.prototype.getContents = function () {
+    if (
+      typeof this.contents === "undefined" ||
+      (this.isList && this.contents.length != this.id.length)
+    ) {
+      this.refresh();
     }
     return this.contents;
-};
+  };
 
-Reference.prototype.isOrHasId = function(_idRef) {
+  Reference.prototype.isOrHasId = function (_idRef) {
     if (this.isList) {
-        return (ns._(this.id).indexOf(_idRef) !== -1);
+      return _(this.id).indexOf(_idRef) !== -1;
     } else {
-        return (this.id == _idRef);
+      return this.id == _idRef;
     }
-};
+  };
 
-/* */
+  /* */
 
-var BaseElement = Model.Element = function(_id, _source) {
-    this.elementType = 'element';
+  var BaseElement = (Model.Element = function (_id, _source) {
+    this.elementType = "element";
     this.title = "";
     this.description = "";
     this.__events = {};
     if (typeof _source === "undefined") {
-        return;
+      return;
     }
     if (typeof _id === "undefined" || !_id) {
-        _id = getUID();
+      _id = getUID();
     }
     this.id = _id;
     this.source = _source;
     if (_source !== this) {
-        this.source.directory.addElement(this);
+      this.source.directory.addElement(this);
     }
-};
+  });
 
-BaseElement.prototype.toString = function() {
-    return this.elementType + (this.elementType !== 'element' ? ', id=' + this.id + ', title="' + this.title + '"' : '');
-};
+  BaseElement.prototype.toString = function () {
+    return (
+      this.elementType +
+      (this.elementType !== "element"
+        ? ", id=" + this.id + ', title="' + this.title + '"'
+        : "")
+    );
+  };
 
-BaseElement.prototype.setReference = function(_elementType, _idRef) {
+  BaseElement.prototype.setReference = function (_elementType, _idRef) {
     this[_elementType] = new Reference(this.source, _idRef);
-};
+  };
 
-BaseElement.prototype.getReference = function(_elementType) {
+  BaseElement.prototype.getReference = function (_elementType) {
     if (typeof this[_elementType] !== "undefined") {
-        return this[_elementType].getContents();
+      return this[_elementType].getContents();
     }
-};
+  };
 
-BaseElement.prototype.getRelated = function(_elementType, _global) {
-    _global = (typeof _global !== "undefined" && _global);
+  BaseElement.prototype.getRelated = function (_elementType, _global) {
+    _global = typeof _global !== "undefined" && _global;
     var _this = this;
-    return this.source.getList(_elementType, _global).filter(function(_el) {
-        var _ref = _el[_this.elementType];
-        return _ref && _ref.isOrHasId(_this.id);
+    return this.source.getList(_elementType, _global).filter(function (_el) {
+      var _ref = _el[_this.elementType];
+      return _ref && _ref.isOrHasId(_this.id);
     });
-};
+  };
 
-BaseElement.prototype.on = function(_event, _callback) {
+  BaseElement.prototype.on = function (_event, _callback) {
     if (typeof this.__events[_event] === "undefined") {
-        this.__events[_event] = [];
+      this.__events[_event] = [];
     }
     this.__events[_event].push(_callback);
-};
+  };
 
-BaseElement.prototype.off = function(_event, _callback) {
+  BaseElement.prototype.off = function (_event, _callback) {
     if (typeof this.__events[_event] !== "undefined") {
-        this.__events[_event] = ns._(this.__events[_event]).reject(function(_fn) {
-            return _fn === _callback;
-        });
+      this.__events[_event] = _(this.__events[_event]).reject(function (_fn) {
+        return _fn === _callback;
+      });
     }
-};
+  };
 
-BaseElement.prototype.trigger = function(_event, _data) {
+  BaseElement.prototype.trigger = function (_event, _data) {
     var _element = this;
-    ns._(this.__events[_event]).each(function(_callback) {
-        _callback.call(_element, _data);
+    _(this.__events[_event]).each(function (_callback) {
+      _callback.call(_element, _data);
     });
-};
+  };
 
-/* */
+  /* */
 
-var Playable = Model.Playable = function(_id, _source) {
+  var Playable = (Model.Playable = function (_id, _source) {
     BaseElement.call(this, _id, _source);
     if (typeof _source === "undefined") {
-        return;
+      return;
     }
-    this.elementType = 'playable';
+    this.elementType = "playable";
     this.currentTime = new Time();
-    this.volume = .5;
+    this.volume = 0.5;
     this.paused = true;
     this.muted = false;
     this.timeRange = false;
     this.loadedMetadata = false;
     var _this = this;
-    this.on("play", function() {
-        _this.paused = false;
+    this.on("play", function () {
+      _this.paused = false;
     });
-    this.on("pause", function() {
-        _this.paused = true;
+    this.on("pause", function () {
+      _this.paused = true;
     });
-    this.on("timeupdate", function(_time) {
-        _this.currentTime = _time;
-        _this.getAnnotations().filter(function(_a) {
-            return (_a.end <= _time || _a.begin > _time) && _a.playing;
-        }).forEach(function(_a) {
-            _a.playing = false;
-            _a.trigger("leave");
-            _this.trigger("leave-annotation",_a);
+    this.on("timeupdate", function (_time) {
+      _this.currentTime = _time;
+      _this
+        .getAnnotations()
+        .filter(function (_a) {
+          return (_a.end <= _time || _a.begin > _time) && _a.playing;
+        })
+        .forEach(function (_a) {
+          _a.playing = false;
+          _a.trigger("leave");
+          _this.trigger("leave-annotation", _a);
         });
-        _this.getAnnotations().filter(function(_a) {
-            return _a.begin <= _time && _a.end > _time && !_a.playing;
-        }).forEach(function(_a) {
-            _a.playing = true;
-            _a.trigger("enter");
-            _this.trigger("enter-annotation",_a);
+      _this
+        .getAnnotations()
+        .filter(function (_a) {
+          return _a.begin <= _time && _a.end > _time && !_a.playing;
+        })
+        .forEach(function (_a) {
+          _a.playing = true;
+          _a.trigger("enter");
+          _this.trigger("enter-annotation", _a);
         });
-        
-        if (_this.getTimeRange()){
-            if (_this.getTimeRange()[0] > _time) {
-                _this.pause();
-                _this.setCurrentTime(_this.getTimeRange()[0]);
-            }
-            if (_this.getTimeRange()[1] < _time){
-                _this.pause();
-                _this.setCurrentTime(_this.getTimeRange()[1]);
-            }
+
+      if (_this.getTimeRange()) {
+        if (_this.getTimeRange()[0] > _time) {
+          _this.pause();
+          _this.setCurrentTime(_this.getTimeRange()[0]);
         }
-        
+        if (_this.getTimeRange()[1] < _time) {
+          _this.pause();
+          _this.setCurrentTime(_this.getTimeRange()[1]);
+        }
+      }
     });
-    this.on("loadedmetadata", function() {
-        _this.loadedMetadata = true;
+    this.on("loadedmetadata", function () {
+      _this.loadedMetadata = true;
     });
-};
-
-extendPrototype(Playable, BaseElement);
+  });
 
-Playable.prototype.getCurrentTime = function() { 
+  extendPrototype(Playable, BaseElement);
+
+  Playable.prototype.getCurrentTime = function () {
     return this.currentTime;
-};
+  };
 
-Playable.prototype.getVolume = function() {
+  Playable.prototype.getVolume = function () {
     return this.volume;
-};
+  };
 
-Playable.prototype.getPaused = function() {
+  Playable.prototype.getPaused = function () {
     return this.paused;
-};
+  };
 
-Playable.prototype.getMuted = function() {
+  Playable.prototype.getMuted = function () {
     return this.muted;
-};
+  };
 
-Playable.prototype.getTimeRange = function() {
+  Playable.prototype.getTimeRange = function () {
     return this.timeRange;
-}
+  };
 
-Playable.prototype.setCurrentTime = function(_time) {
-    this.trigger("setcurrenttime",_time);
-};
+  Playable.prototype.setCurrentTime = function (_time) {
+    this.trigger("setcurrenttime", _time);
+  };
 
-Playable.prototype.setVolume = function(_vol) {
-    this.trigger("setvolume",_vol);
-};
+  Playable.prototype.setVolume = function (_vol) {
+    this.trigger("setvolume", _vol);
+  };
 
-Playable.prototype.setMuted = function(_muted) {
-    this.trigger("setmuted",_muted);
-};
+  Playable.prototype.setMuted = function (_muted) {
+    this.trigger("setmuted", _muted);
+  };
 
-Playable.prototype.setTimeRange = function(_timeBegin, _timeEnd) {
-    if ((_timeBegin < _timeEnd)&&(_timeBegin >= 0)&&(_timeEnd>0)){
-        return this.trigger("settimerange", [_timeBegin, _timeEnd]);
+  Playable.prototype.setTimeRange = function (_timeBegin, _timeEnd) {
+    if (_timeBegin < _timeEnd && _timeBegin >= 0 && _timeEnd > 0) {
+      return this.trigger("settimerange", [_timeBegin, _timeEnd]);
     }
-}
+  };
 
-Playable.prototype.resetTimeRange = function() {
+  Playable.prototype.resetTimeRange = function () {
     return this.trigger("resettimerange");
-}
+  };
 
-Playable.prototype.play = function() {
+  Playable.prototype.play = function () {
     this.trigger("setplay");
-};
+  };
 
-Playable.prototype.pause = function() {
+  Playable.prototype.pause = function () {
     this.trigger("setpause");
-};
+  };
 
-Playable.prototype.show = function() {};
+  Playable.prototype.show = function () {};
 
-Playable.prototype.hide = function() {};
+  Playable.prototype.hide = function () {};
 
-/* */
+  /* */
 
-var Media = Model.Media = function(_id, _source) {
+  var Media = (Model.Media = function (_id, _source) {
     Playable.call(this, _id, _source);
-    this.elementType = 'media';
+    this.elementType = "media";
     this.duration = new Time();
-    this.video = '';
+    this.video = "";
     var _this = this;
-};
+  });
 
-extendPrototype(Media, Playable);
-/* */
+  extendPrototype(Media, Playable);
+  /* */
 
-var Media = Model.Media = function(_id, _source) {
+  var Media = (Model.Media = function (_id, _source) {
     Playable.call(this, _id, _source);
-    this.elementType = 'media';
+    this.elementType = "media";
     this.duration = new Time();
-    this.video = '';
+    this.video = "";
     var _this = this;
-};
+  });
 
-extendPrototype(Media, Playable);
+  extendPrototype(Media, Playable);
 
-/* Default functions to be overriden by players */
-    
-Media.prototype.setDuration = function(_durationMs) {
+  /* Default functions to be overriden by players */
+
+  Media.prototype.setDuration = function (_durationMs) {
     this.duration.setMilliseconds(_durationMs);
-};
+  };
 
-Media.prototype.getAnnotations = function() {
+  Media.prototype.getAnnotations = function () {
     return this.getRelated("annotation");
-};
+  };
 
-Media.prototype.getAnnotationsByTypeTitle = function(_title) {
-    var _annTypes = this.source.getAnnotationTypes().searchByTitle(_title).pluck("id");
+  Media.prototype.getAnnotationsByTypeTitle = function (_title) {
+    var _annTypes = this.source
+      .getAnnotationTypes()
+      .searchByTitle(_title)
+      .pluck("id");
     if (_annTypes.length) {
-        return this.getAnnotations().filter(function(_annotation) {
-            return ns._(_annTypes).indexOf(_annotation.getAnnotationType().id) !== -1;
-        });
+      return this.getAnnotations().filter(function (_annotation) {
+        return _(_annTypes).indexOf(_annotation.getAnnotationType().id) !== -1;
+      });
     } else {
-        return new List(this.source.directory);
+      return new List(this.source.directory);
     }
-};
+  };
 
-/* */
+  /* */
 
-var Tag = Model.Tag = function(_id, _source) {
+  var Tag = (Model.Tag = function (_id, _source) {
     BaseElement.call(this, _id, _source);
-    this.elementType = 'tag';
-};
+    this.elementType = "tag";
+  });
 
-extendPrototype(Tag, BaseElement);
+  extendPrototype(Tag, BaseElement);
 
-Tag.prototype.getAnnotations = function() {
+  Tag.prototype.getAnnotations = function () {
     return this.getRelated("annotation");
-};
+  };
 
-/* */
-var AnnotationType = Model.AnnotationType = function(_id, _source) {
+  /* */
+  var AnnotationType = (Model.AnnotationType = function (_id, _source) {
     BaseElement.call(this, _id, _source);
-    this.elementType = 'annotationType';
-};
+    this.elementType = "annotationType";
+  });
 
-extendPrototype(AnnotationType, BaseElement);
+  extendPrototype(AnnotationType, BaseElement);
 
-AnnotationType.prototype.getAnnotations = function() {
+  AnnotationType.prototype.getAnnotations = function () {
     return this.getRelated("annotation");
-};
+  };
 
-/* Annotation
- * */
+  /* Annotation
+   * */
 
-var Annotation = Model.Annotation = function(_id, _source) {
+  var Annotation = (Model.Annotation = function (_id, _source) {
     BaseElement.call(this, _id, _source);
-    this.elementType = 'annotation';
+    this.elementType = "annotation";
     this.begin = new Time();
     this.end = new Time();
     this.tag = new Reference(_source, []);
     this.playing = false;
     var _this = this;
-    this.on("click", function() {
-        _this.getMedia().setCurrentTime(_this.begin);
+    this.on("click", function () {
+      _this.getMedia().setCurrentTime(_this.begin);
     });
-};
+  });
 
-extendPrototype(Annotation, BaseElement);
+  extendPrototype(Annotation, BaseElement);
 
-/* Set begin and end in one go, to avoid undesired side-effects in
- * setBegin/setEnd interaction */
-Annotation.prototype.setBeginEnd = function(_beginMs, _endMs) {
-    _beginMs = Math.max(0,_beginMs);
-    _endMs = Math.max(0,_endMs);
-    if (_endMs < _beginMs)
-        _endMs = _beginMs;
+  /* Set begin and end in one go, to avoid undesired side-effects in
+   * setBegin/setEnd interaction */
+  Annotation.prototype.setBeginEnd = function (_beginMs, _endMs) {
+    _beginMs = Math.max(0, _beginMs);
+    _endMs = Math.max(0, _endMs);
+    if (_endMs < _beginMs) _endMs = _beginMs;
     this.begin.setMilliseconds(_beginMs);
     this.end.setMilliseconds(_endMs);
     this.trigger("change-begin");
     this.trigger("change-end");
-};
+  };
 
-Annotation.prototype.setBegin = function(_beginMs) {
-    this.begin.setMilliseconds(Math.max(0,_beginMs));
+  Annotation.prototype.setBegin = function (_beginMs) {
+    this.begin.setMilliseconds(Math.max(0, _beginMs));
     this.trigger("change-begin");
     if (this.end < this.begin) {
-        this.setEnd(this.begin);
+      this.setEnd(this.begin);
     }
-};
+  };
 
-Annotation.prototype.setEnd = function(_endMs) {
-    this.end.setMilliseconds(Math.min(_endMs, this.getMedia().duration.milliseconds));
+  Annotation.prototype.setEnd = function (_endMs) {
+    this.end.setMilliseconds(
+      Math.min(_endMs, this.getMedia().duration.milliseconds)
+    );
     this.trigger("change-end");
     if (this.end < this.begin) {
-        this.setBegin(this.end);
+      this.setBegin(this.end);
     }
-};
+  };
 
-Annotation.prototype.setDuration = function(_durMs) {
+  Annotation.prototype.setDuration = function (_durMs) {
     this.setEnd(_durMs + this.begin.milliseconds);
-};
+  };
 
-Annotation.prototype.setMedia = function(_idRef) {
+  Annotation.prototype.setMedia = function (_idRef) {
     this.setReference("media", _idRef);
-};
+  };
 
-Annotation.prototype.getMedia = function() {
+  Annotation.prototype.getMedia = function () {
     return this.getReference("media");
-};
+  };
 
-Annotation.prototype.setAnnotationType = function(_idRef) {
+  Annotation.prototype.setAnnotationType = function (_idRef) {
     this.setReference("annotationType", _idRef);
-};
+  };
 
-Annotation.prototype.getAnnotationType = function() {
+  Annotation.prototype.getAnnotationType = function () {
     return this.getReference("annotationType");
-};
+  };
 
-Annotation.prototype.setTags = function(_idRefs) {
+  Annotation.prototype.setTags = function (_idRefs) {
     this.setReference("tag", _idRefs);
-};
+  };
 
-Annotation.prototype.getTags = function() {
+  Annotation.prototype.getTags = function () {
     return this.getReference("tag");
-};
+  };
 
-Annotation.prototype.getTagTexts = function() {
+  Annotation.prototype.getTagTexts = function () {
     return this.getTags().getTitles();
-};
+  };
 
-Annotation.prototype.getDuration = function() {
+  Annotation.prototype.getDuration = function () {
     return new Time(this.end.milliseconds - this.begin.milliseconds);
-};
+  };
+
+  /* */
 
-/* */
-
-var MashedAnnotation = Model.MashedAnnotation = function(_mashup, _annotation) {
-    BaseElement.call(this, _mashup.id + "_" + _annotation.id, _annotation.source);
-    this.elementType = 'mashedAnnotation';
+  var MashedAnnotation = (Model.MashedAnnotation = function (
+    _mashup,
+    _annotation
+  ) {
+    BaseElement.call(
+      this,
+      _mashup.id + "_" + _annotation.id,
+      _annotation.source
+    );
+    this.elementType = "mashedAnnotation";
     this.annotation = _annotation;
     this.begin = new Time();
     this.end = new Time();
@@ -840,433 +946,439 @@
     this.description = this.annotation.description;
     this.color = this.annotation.color;
     var _this = this;
-    this.on("click", function() {
-        _mashup.setCurrentTime(_this.begin);
+    this.on("click", function () {
+      _mashup.setCurrentTime(_this.begin);
     });
-    this.on("enter", function() {
-        _this.annotation.trigger("enter");
+    this.on("enter", function () {
+      _this.annotation.trigger("enter");
     });
-    this.on("leave", function() {
-        _this.annotation.trigger("leave");
+    this.on("leave", function () {
+      _this.annotation.trigger("leave");
     });
-};
+  });
 
-extendPrototype(MashedAnnotation, BaseElement);
+  extendPrototype(MashedAnnotation, BaseElement);
 
-MashedAnnotation.prototype.getMedia = function() {
+  MashedAnnotation.prototype.getMedia = function () {
     return this.annotation.getReference("media");
-};
+  };
 
-MashedAnnotation.prototype.getAnnotationType = function() {
+  MashedAnnotation.prototype.getAnnotationType = function () {
     return this.annotation.getReference("annotationType");
-};
+  };
 
-MashedAnnotation.prototype.getTags = function() {
+  MashedAnnotation.prototype.getTags = function () {
     return this.annotation.getReference("tag");
-};
+  };
 
-MashedAnnotation.prototype.getTagTexts = function() {
+  MashedAnnotation.prototype.getTagTexts = function () {
     return this.annotation.getTags().getTitles();
-};
+  };
 
-MashedAnnotation.prototype.getDuration = function() {
+  MashedAnnotation.prototype.getDuration = function () {
     return this.annotation.getDuration();
-};
+  };
 
-MashedAnnotation.prototype.setBegin = function(_begin) {
+  MashedAnnotation.prototype.setBegin = function (_begin) {
     this.begin.setMilliseconds(_begin);
     this.duration.setMilliseconds(this.annotation.getDuration());
     this.end.setMilliseconds(_begin + this.duration);
-};
+  };
 
-/* */
+  /* */
 
-var Mashup = Model.Mashup = function(_id, _source) {
+  var Mashup = (Model.Mashup = function (_id, _source) {
     Playable.call(this, _id, _source);
-    this.elementType = 'mashup';
+    this.elementType = "mashup";
     this.duration = new Time();
     this.segments = new List(_source.directory);
     this.loaded = false;
     var _this = this;
-    this._updateTimes = function() {
-        _this.updateTimes();
-        _this.trigger("change");
+    this._updateTimes = function () {
+      _this.updateTimes();
+      _this.trigger("change");
     };
     this.on("add", this._updateTimes);
     this.on("remove", this._updateTimes);
-};
+  });
 
-extendPrototype(Mashup, Playable);
+  extendPrototype(Mashup, Playable);
 
-Mashup.prototype.updateTimes = function() {
+  Mashup.prototype.updateTimes = function () {
     var _time = 0;
-    this.segments.forEach(function(_segment) {
-        _segment.setBegin(_time);
-        _time = _segment.end;
+    this.segments.forEach(function (_segment) {
+      _segment.setBegin(_time);
+      _time = _segment.end;
     });
     this.duration.setMilliseconds(_time);
-};
+  };
 
-Mashup.prototype.addAnnotation = function(_annotation, _defer) {
+  Mashup.prototype.addAnnotation = function (_annotation, _defer) {
     var _mashedAnnotation = new MashedAnnotation(this, _annotation),
-        _defer = _defer || false;
+      _defer = _defer || false;
     this.segments.push(_mashedAnnotation);
     _annotation.on("change-begin", this._updateTimes);
     _annotation.on("change-end", this._updateTimes);
     if (!_defer) {
-        this.trigger("add");
+      this.trigger("add");
     }
-};
+  };
 
-Mashup.prototype.addAnnotationById = function(_elId, _defer) {
+  Mashup.prototype.addAnnotationById = function (_elId, _defer) {
     var _annotation = this.source.getElement(_elId),
-        _defer = _defer || false;
+      _defer = _defer || false;
     if (typeof _annotation !== "undefined") {
-        this.addAnnotation(_annotation, _defer);
+      this.addAnnotation(_annotation, _defer);
     }
-};
+  };
 
-Mashup.prototype.addAnnotations = function(_segments) {
+  Mashup.prototype.addAnnotations = function (_segments) {
     var _this = this;
-    ns._(_segments).forEach(function(_segment) {
-        _this.addAnnotation(_segment, true);
+    _(_segments).forEach(function (_segment) {
+      _this.addAnnotation(_segment, true);
     });
     this.trigger("add");
-};
+  };
 
-Mashup.prototype.addAnnotationsById = function(_segments) {
+  Mashup.prototype.addAnnotationsById = function (_segments) {
     var _this = this;
-    ns._(_segments).forEach(function(_segment) {
-        _this.addAnnotationById(_segment, true);
+    _(_segments).forEach(function (_segment) {
+      _this.addAnnotationById(_segment, true);
     });
     this.trigger("add");
-};
+  };
 
-Mashup.prototype.removeAnnotation = function(_annotation, _defer) {
+  Mashup.prototype.removeAnnotation = function (_annotation, _defer) {
     var _defer = _defer || false;
     _annotation.off("change-begin", this._updateTimes);
     _annotation.off("change-end", this._updateTimes);
     this.segments.removeId(this.id + "_" + _annotation.id);
     if (!_defer) {
-        this.trigger("remove");
+      this.trigger("remove");
     }
-};
+  };
 
-Mashup.prototype.removeAnnotationById = function(_annId, _defer) {
+  Mashup.prototype.removeAnnotationById = function (_annId, _defer) {
     var _defer = _defer || false;
     var _annotation = this.source.getElement(_annId);
 
     if (_annotation) {
-        this.removeAnnotation(_annotation, _defer);
+      this.removeAnnotation(_annotation, _defer);
     }
     if (!_defer) {
-        this.trigger("remove");
+      this.trigger("remove");
     }
-};
+  };
 
-Mashup.prototype.setAnnotations = function(_segments) {
+  Mashup.prototype.setAnnotations = function (_segments) {
     while (this.segments.length) {
-        this.removeAnnotation(this.segments[0].annotation, true);
+      this.removeAnnotation(this.segments[0].annotation, true);
     }
     this.addAnnotations(_segments);
-};
+  };
 
-Mashup.prototype.setAnnotationsById = function(_segments) {
+  Mashup.prototype.setAnnotationsById = function (_segments) {
     while (this.segments.length) {
-        this.removeAnnotation(this.segments[0].annotation, true);
+      this.removeAnnotation(this.segments[0].annotation, true);
     }
     this.addAnnotationsById(_segments);
-};
+  };
 
-Mashup.prototype.hasAnnotation = function(_annotation) {
-    return !!ns._(this.segments).find(function(_s) {
-        return _s.annotation === _annotation;
+  Mashup.prototype.hasAnnotation = function (_annotation) {
+    return !!_(this.segments).find(function (_s) {
+      return _s.annotation === _annotation;
     });
-};
+  };
 
-Mashup.prototype.getAnnotation = function(_annotation) {
-    return ns._(this.segments).find(function(_s) {
-        return _s.annotation === _annotation;
+  Mashup.prototype.getAnnotation = function (_annotation) {
+    return _(this.segments).find(function (_s) {
+      return _s.annotation === _annotation;
     });
-};
+  };
 
-Mashup.prototype.getAnnotationById = function(_id) {
-    return ns._(this.segments).find(function(_s) {
-        return _s.annotation.id === _id;
+  Mashup.prototype.getAnnotationById = function (_id) {
+    return _(this.segments).find(function (_s) {
+      return _s.annotation.id === _id;
     });
-};
+  };
 
-Mashup.prototype.getAnnotations = function() {
+  Mashup.prototype.getAnnotations = function () {
     return this.segments;
-};
+  };
 
-Mashup.prototype.getOriginalAnnotations = function() {
+  Mashup.prototype.getOriginalAnnotations = function () {
     var annotations = new List(this.source.directory);
-    this.segments.forEach(function(_s) {
-        annotations.push(_s.annotation);
+    this.segments.forEach(function (_s) {
+      annotations.push(_s.annotation);
     });
     return annotations;
-};
+  };
 
-Mashup.prototype.getMedias = function() {
+  Mashup.prototype.getMedias = function () {
     var medias = new List(this.source.directory);
-    this.segments.forEach(function(_annotation) {
-        medias.push(_annotation.getMedia());
+    this.segments.forEach(function (_annotation) {
+      medias.push(_annotation.getMedia());
     });
     return medias;
-};
+  };
 
-Mashup.prototype.getAnnotationsByTypeTitle = function(_title) {
-    var _annTypes = this.source.getAnnotationTypes().searchByTitle(_title).pluck("id");
+  Mashup.prototype.getAnnotationsByTypeTitle = function (_title) {
+    var _annTypes = this.source
+      .getAnnotationTypes()
+      .searchByTitle(_title)
+      .pluck("id");
     if (_annTypes.length) {
-        return this.getAnnotations().filter(function(_annotation) {
-            return ns._(_annTypes).indexOf(_annotation.getAnnotationType().id) !== -1;
-        });
+      return this.getAnnotations().filter(function (_annotation) {
+        return _(_annTypes).indexOf(_annotation.getAnnotationType().id) !== -1;
+      });
     } else {
-        return new List(this.source.directory);
+      return new List(this.source.directory);
     }
-};
+  };
 
-Mashup.prototype.getAnnotationAtTime = function(_time) {
-    var _list = this.segments.filter(function(_annotation) {
-        return _annotation.begin <= _time && _annotation.end > _time;
+  Mashup.prototype.getAnnotationAtTime = function (_time) {
+    var _list = this.segments.filter(function (_annotation) {
+      return _annotation.begin <= _time && _annotation.end > _time;
     });
     if (_list.length) {
-        return _list[0];
+      return _list[0];
     } else {
-        return undefined;
+      return undefined;
     }
-};
+  };
 
-Mashup.prototype.getMediaAtTime = function(_time) {
+  Mashup.prototype.getMediaAtTime = function (_time) {
     var _annotation = this.getAnnotationAtTime(_time);
     if (typeof _annotation !== "undefined") {
-        return _annotation.getMedia();
+      return _annotation.getMedia();
     } else {
-        return undefined;
+      return undefined;
     }
-};
+  };
 
-/* */
+  /* */
 
-var Source = Model.Source = function(_config) {
+  var Source = (Model.Source = function (_config) {
     BaseElement.call(this, false, this);
     this.status = _SOURCE_STATUS_EMPTY;
     this.elementType = "source";
     if (typeof _config !== "undefined") {
-        var _this = this;
-        ns._(_config).forEach(function(_v, _k) {
-            _this[_k] = _v;
-        });
-        this.callbackQueue = [];
-        this.contents = {};
-        this.get();
+      var _this = this;
+      _(_config).forEach(function (_v, _k) {
+        _this[_k] = _v;
+      });
+      this.callbackQueue = [];
+      this.contents = {};
+      this.get();
     }
-};
+  });
 
-extendPrototype(Source, BaseElement);
+  extendPrototype(Source, BaseElement);
 
-Source.prototype.addList = function(_listId, _contents) {
+  Source.prototype.addList = function (_listId, _contents) {
     if (typeof this.contents[_listId] === "undefined") {
-        this.contents[_listId] = new List(this.directory);
+      this.contents[_listId] = new List(this.directory);
     }
     this.contents[_listId].addElements(_contents);
-};
+  };
 
-Source.prototype.getList = function(_listId, _global) {
-    _global = (typeof _global !== "undefined" && _global);
+  Source.prototype.getList = function (_listId, _global) {
+    _global = typeof _global !== "undefined" && _global;
     if (_global) {
-        return this.directory.getGlobalList().filter(function(_e) {
-            return (_e.elementType === _listId);
-        });
+      return this.directory.getGlobalList().filter(function (_e) {
+        return _e.elementType === _listId;
+      });
     } else {
-        if (typeof this.contents[_listId] === "undefined") {
-            this.contents[_listId] = new List(this.directory);
-        }
-        return this.contents[_listId];
+      if (typeof this.contents[_listId] === "undefined") {
+        this.contents[_listId] = new List(this.directory);
+      }
+      return this.contents[_listId];
     }
-};
+  };
 
-Source.prototype.forEach = function(_callback) {
+  Source.prototype.forEach = function (_callback) {
     var _this = this;
-    ns._(this.contents).forEach(function(_value, _key) {
-        _callback.call(_this, _value, _key);
+    _(this.contents).forEach(function (_value, _key) {
+      _callback.call(_this, _value, _key);
     });
-};
+  };
 
-Source.prototype.getElement = function(_elId) {
+  Source.prototype.getElement = function (_elId) {
     return this.directory.getElement(_elId);
-};
+  };
 
-Source.prototype.get = function() {
+  Source.prototype.get = function () {
     this.status = _SOURCE_STATUS_WAITING;
     this.handleCallbacks();
-};
+  };
 
-/* We defer the callbacks calls so they execute after the queue is cleared */
-Source.prototype.deferCallback = function(_callback) {
+  /* We defer the callbacks calls so they execute after the queue is cleared */
+  Source.prototype.deferCallback = function (_callback) {
     var _this = this;
-    ns._.defer(function() {
-        _callback.call(_this);
+    _.defer(function () {
+      _callback.call(_this);
     });
-};
+  };
 
-Source.prototype.handleCallbacks = function() {
+  Source.prototype.handleCallbacks = function () {
     this.status = _SOURCE_STATUS_READY;
     while (this.callbackQueue.length) {
-        this.deferCallback(this.callbackQueue.splice(0,1)[0]);
+      this.deferCallback(this.callbackQueue.splice(0, 1)[0]);
     }
-};
-Source.prototype.onLoad = function(_callback) {
+  };
+  Source.prototype.onLoad = function (_callback) {
     if (this.status === _SOURCE_STATUS_READY) {
-        this.deferCallback(_callback);
+      this.deferCallback(_callback);
     } else {
-        this.callbackQueue.push(_callback);
+      this.callbackQueue.push(_callback);
     }
-};
+  };
 
-Source.prototype.serialize = function() {
+  Source.prototype.serialize = function () {
     return this.serializer.serialize(this);
-};
+  };
+
+  Source.prototype.deSerialize = function (_data) {
+    this.serializer.deSerialize(_data, this);
+  };
+
+  Source.prototype.getAnnotations = function (_global) {
+    _global = typeof _global !== "undefined" && _global;
+    return this.getList("annotation", _global);
+  };
+
+  Source.prototype.getMedias = function (_global) {
+    _global = typeof _global !== "undefined" && _global;
+    return this.getList("media", _global);
+  };
+
+  Source.prototype.getTags = function (_global) {
+    _global = typeof _global !== "undefined" && _global;
+    return this.getList("tag", _global);
+  };
 
-Source.prototype.deSerialize = function(_data) {
-    this.serializer.deSerialize(_data, this);
-};
+  Source.prototype.getMashups = function (_global) {
+    _global = typeof _global !== "undefined" && _global;
+    return this.getList("mashup", _global);
+  };
+
+  Source.prototype.getAnnotationTypes = function (_global) {
+    _global = typeof _global !== "undefined" && _global;
+    return this.getList("annotationType", _global);
+  };
+
+  Source.prototype.getAnnotationsByTypeTitle = function (_title, _global) {
+    _global = typeof _global !== "undefined" && _global;
+    var _res = new List(this.directory),
+      _annTypes = this.getAnnotationTypes(_global).searchByTitle(_title);
+    _annTypes.forEach(function (_annType) {
+      _res.addElements(_annType.getAnnotations(_global));
+    });
+    return _res;
+  };
+
+  Source.prototype.getDuration = function () {
+    var _m = this.currentMedia;
+    if (typeof _m !== "undefined") {
+      return this.currentMedia.duration;
+    }
+  };
 
-Source.prototype.getAnnotations = function(_global) {
-    _global = (typeof _global !== "undefined" && _global);
-    return this.getList("annotation", _global);
-};
+  Source.prototype.getCurrentMedia = function (_opts) {
+    if (typeof this.currentMedia === "undefined") {
+      if (_opts.is_mashup) {
+        var _mashups = this.getMashups();
+        if (_mashups.length) {
+          this.currentMedia = _mashups[0];
+        }
+      } else {
+        var _medias = this.getMedias();
+        if (_medias.length) {
+          this.currentMedia = _medias[0];
+        }
+      }
+    }
+    return this.currentMedia;
+  };
 
-Source.prototype.getMedias = function(_global) {
-    _global = (typeof _global !== "undefined" && _global);
-    return this.getList("media", _global);
-};
+  Source.prototype.merge = function (_source) {
+    var _this = this;
+    _source.forEach(function (_value, _key) {
+      _this.getList(_key).addElements(_value);
+    });
+  };
+
+  /* */
+
+  var RemoteSource = (Model.RemoteSource = function (_config) {
+    Source.call(this, _config);
+  });
+
+  extendPrototype(RemoteSource, Source);
 
-Source.prototype.getTags = function(_global) {
-    _global = (typeof _global !== "undefined" && _global);
-    return this.getList("tag", _global);
-};
+  RemoteSource.prototype.get = function () {
+    this.status = _SOURCE_STATUS_WAITING;
+    var _this = this,
+      urlparams = this.url_params || {},
+      dataType = this.dataType || "json";
+    urlparams.format = dataType;
+    jQuery.ajax({
+      url: this.url,
+      dataType: dataType,
+      data: urlparams,
+      traditional: true,
+      success: function (_result) {
+        _this.deSerialize(_result);
+        _this.handleCallbacks();
+      },
+    });
+  };
+
+  /* */
+
+  var Directory = (Model.Directory = function () {
+    this.remoteSources = {};
+    this.elements = {};
+  });
 
-Source.prototype.getMashups = function(_global) {
-    _global = (typeof _global !== "undefined" && _global);
-    return this.getList("mashup", _global);
-};
+  Directory.prototype.remoteSource = function (_properties) {
+    if (
+      typeof _properties !== "object" ||
+      typeof _properties.url === "undefined"
+    ) {
+      throw "Error : Directory.remoteSource(configuration): configuration.url is undefined";
+    }
+    var _config = _({ directory: this }).extend(_properties);
+    _config.url_params = _config.url_params || {};
+    var _hash = _config.url + "?" + jQuery.param(_config.url_params);
+    if (typeof this.remoteSources[_hash] === "undefined") {
+      this.remoteSources[_hash] = new RemoteSource(_config);
+    }
+    return this.remoteSources[_hash];
+  };
 
-Source.prototype.getAnnotationTypes = function(_global) {
-    _global = (typeof _global !== "undefined" && _global);
-    return this.getList("annotationType", _global);
+  Directory.prototype.newLocalSource = function (_properties) {
+    var _config = _({ directory: this }).extend(_properties),
+      _res = new Source(_config);
+    return _res;
+  };
+
+  Directory.prototype.getElement = function (_id) {
+    return this.elements[_id];
+  };
+
+  Directory.prototype.addElement = function (_element) {
+    this.elements[_element.id] = _element;
+  };
+
+  Directory.prototype.getGlobalList = function () {
+    var _res = new List(this);
+    _res.addIds(_(this.elements).keys());
+    return _res;
+  };
+  return Model;
 };
 
-Source.prototype.getAnnotationsByTypeTitle = function(_title, _global) {
-    _global = (typeof _global !== "undefined" && _global);
-    var _res = new List(this.directory),
-        _annTypes = this.getAnnotationTypes(_global).searchByTitle(_title);
-    _annTypes.forEach(function(_annType) {
-        _res.addElements(_annType.getAnnotations(_global));
-    });
-    return _res;
-};
-
-Source.prototype.getDuration = function() {
-    var _m = this.currentMedia;
-    if (typeof _m !== "undefined") {
-        return this.currentMedia.duration;
-    }
-};
-
-Source.prototype.getCurrentMedia = function(_opts) {
-    if (typeof this.currentMedia === "undefined") {
-        if (_opts.is_mashup) {
-            var _mashups = this.getMashups();
-            if (_mashups.length) {
-                this.currentMedia = _mashups[0];
-            }
-        } else {
-            var _medias = this.getMedias();
-            if (_medias.length) {
-                this.currentMedia = _medias[0];
-            }
-        }
-    }
-    return this.currentMedia;
-};
-
-Source.prototype.merge = function(_source) {
-    var _this = this;
-    _source.forEach(function(_value, _key) {
-        _this.getList(_key).addElements(_value);
-    });
-};
-
-/* */
-
-var RemoteSource = Model.RemoteSource = function(_config) {
-    Source.call(this, _config);
-};
-
-extendPrototype(RemoteSource, Source);
-
-RemoteSource.prototype.get = function() {
-    this.status = _SOURCE_STATUS_WAITING;
-    var _this = this,
-        urlparams = this.url_params || {},
-        dataType = (isLocalURL(this.url) ? "json" : "jsonp");
-    urlparams.format = dataType;
-    ns.jQuery.ajax({
-        url: this.url,
-        dataType: dataType,
-        data: urlparams,
-        traditional: true,
-        success: function(_result) {
-            _this.deSerialize(_result);
-            _this.handleCallbacks();
-        }
-    });
-};
-
-/* */
-
-var Directory = Model.Directory = function() {
-    this.remoteSources = {};
-    this.elements = {};
-};
-
-Directory.prototype.remoteSource = function(_properties) {
-    if (typeof _properties !== "object" || typeof _properties.url === "undefined") {
-        throw "Error : Directory.remoteSource(configuration): configuration.url is undefined";
-    }
-    var _config = ns._({ directory: this }).extend(_properties);
-    _config.url_params = _config.url_params || {};
-    var _hash = _config.url + "?" + ns.jQuery.param(_config.url_params);
-    if (typeof this.remoteSources[_hash] === "undefined") {
-        this.remoteSources[_hash] = new RemoteSource(_config);
-    }
-    return this.remoteSources[_hash];
-};
-
-Directory.prototype.newLocalSource = function(_properties) {
-    var _config = ns._({ directory: this }).extend(_properties),
-        _res = new Source(_config);
-    return _res;
-};
-
-Directory.prototype.getElement = function(_id) {
-    return this.elements[_id];
-};
-
-Directory.prototype.addElement = function(_element) {
-    this.elements[_element.id] = _element;
-};
-
-Directory.prototype.getGlobalList = function() {
-    var _res = new List(this);
-    _res.addIds(ns._(this.elements).keys());
-    return _res;
-};
-return Model;
-
-})(IriSP);
+export default Model;
 
 /* END js */
-
--- a/src/js/serializers/contentapi-serializer.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/js/serializers/contentapi-serializer.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,10 +1,7 @@
 /* START contentapi-serializer.js */
+import _ from "lodash";
 
-if (typeof IriSP.serializers === "undefined") {
-    IriSP.serializers = {};
-}
-
-IriSP.serializers.content = {
+const content = function(IriSP) { return {
     deSerialize : function(_data, _source) {
         var _medialist = new IriSP.Model.List(_source.directory);
         
@@ -21,13 +18,15 @@
         }
         
         if (typeof _data.objects !== "undefined") {
-            IriSP._(_data.objects).each(deserializeObject);
+            _(_data.objects).each(deserializeObject);
         } else {
             deserializeObject(_data, 0);
         }
         
         _source.addList("media", _medialist);
     }
-};
+}};
+
+export default content;
 
 /* END contentapi-serializer.js */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/js/serializers/index.js	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,19 @@
+import contentapiSerializer from "./contentapi-serializer";
+
+import ldt_annotate from "./ldt_annotate";
+
+import ldt_localstorage from "./ldt_localstorage";
+
+import ldtSerializer from "./ldt-serializer";
+
+import segmentapiSerializer from "./segmentapi-serializer";
+
+const serializers = function (IriSP) { return {
+  content: contentapiSerializer(IriSP),
+  ldt_annotate: ldt_annotate(IriSP),
+  ldt_localstorage: ldt_localstorage(IriSP),
+  ldt: ldtSerializer(IriSP),
+  segmentapi: segmentapiSerializer(IriSP),
+}};
+
+export default serializers;
--- a/src/js/serializers/ldt-serializer.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/js/serializers/ldt-serializer.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,10 +1,7 @@
 /* Start ldt-serializer.js */
+import _ from "lodash";
 
-if (typeof IriSP.serializers === "undefined") {
-    IriSP.serializers = {};
-}
-
-IriSP.serializers.ldt = {
+const ldt = function(IriSP) { return {
     types :  {
         media : {
             serialized_name : "medias",
@@ -151,7 +148,7 @@
                 _res.content = _data.content;
                 _res.setMedia(_data.media);
                 _res.setAnnotationType(_data.meta["id-ref"]);
-                _res.setTags(IriSP._(_data.tags).pluck("id-ref"));
+                _res.setTags(_(_data.tags).map("id-ref"));
                 _res.keywords = _res.getTagTexts();
                 _res.setBegin(_data.begin);
                 _res.setEnd(_data.end);
@@ -171,7 +168,7 @@
                     id : _data.id,
                     begin : _data.begin.milliseconds,
                     end : _data.end.milliseconds,
-                    content : IriSP._.defaults(
+                    content : _.defaults(
                         {},
                         {
                             title : _data.title,
@@ -199,13 +196,13 @@
                     }
                 };
                 if (_source.regenerateTags) {
-                    _res.tags = IriSP._(_data.keywords).map(function(_kw) {
+                    _res.tags = _(_data.keywords).map(function(_kw) {
                         return {
                             "id-ref": _source.__keywords[_kw.toLowerCase()].id
                         };
                     });
                 } else {
-                    _res.tags = IriSP._(_data.tag.id).map(function(_id) {
+                    _res.tags = _(_data.tag.id).map(function(_id) {
                        return {
                            "id-ref" : _id
                        };
@@ -276,7 +273,7 @@
         if (_source.regenerateTags) {
             _source.__keywords = {};
             _source.getAnnotations().forEach(function(a) {
-                IriSP._(a.keywords).each(function(kw) {
+                _(a.keywords).each(function(kw) {
                     var lkw = kw.toLowerCase();
                     if (typeof _source.__keywords[lkw] === "undefined") {
                         _source.__keywords[lkw] = {
@@ -287,7 +284,7 @@
                     }
                 });
             });
-            IriSP._(_source.__keywords).each(function(kw) {
+            _(_source.__keywords).each(function(kw) {
                 _this.types.tag.serializer(kw, _source, _res);
             });
         }
@@ -304,7 +301,7 @@
         if (typeof _data !== "object" || _data === null) {
             return;
         }
-        IriSP._(this.types).forEach(function(_type, _typename) {
+        _(this.types).forEach(function(_type, _typename) {
             var _listdata = _data[_type.serialized_name],
                 _list = new IriSP.Model.List(_source.directory);
             if (typeof _listdata !== "undefined" && _listdata !== null) {
@@ -339,6 +336,8 @@
             _source.currentMedia = _source.getElement(_data.meta.main_media["id-ref"]);
         }
     }
-};
+}};
+
+export default ldt;
 
 /* End of LDT Platform Serializer */
--- a/src/js/serializers/ldt_annotate.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/js/serializers/ldt_annotate.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,10 +1,7 @@
 /* ldt_annotate serializer: Used when Putting annotations on the platform */
+import _ from "lodash";
 
-if (typeof IriSP.serializers === "undefined") {
-    IriSP.serializers = {};
-}
-
-IriSP.serializers.ldt_annotate = {
+const ldt_annotate = function(IriSP) { return {
     serializeAnnotation : function(_data, _source) {
         var _annType = _data.getAnnotationType();
         return {
@@ -45,7 +42,7 @@
             _source.getAnnotationTypes().push(_anntype);
         }
         _ann.setAnnotationType(_anntype.id);
-        var _tagIds = IriSP._(_anndata.tags).map(function(_title) {
+        var _tagIds = _(_anndata.tags).map(function(_title) {
             var _tags = _source.getTags(true).searchByTitle(_title, true);
             if (_tags.length) {
                 var _tag = _tags[0];
@@ -80,6 +77,8 @@
         _source.addList('annotation', new IriSP.Model.List(_source.directory));
         this.deserializeAnnotation(_data, _source);
     }
-};
+}};
+
+export default ldt_annotate;
 
 /* End ldt_annotate serializer */
--- a/src/js/serializers/ldt_localstorage.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/js/serializers/ldt_localstorage.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,10 +1,7 @@
 /* ldt_localstorage serializer: Used to store personal annotations in local storage */
+import _ from "lodash";
 
-if (typeof IriSP.serializers === "undefined") {
-    IriSP.serializers = {};
-}
-
-IriSP.serializers.ldt_localstorage = {
+const ldt_localstorage = function(IriSP) { return {
     serializeAnnotation : function(_data, _source) {
         var _annType = _data.getAnnotationType();
         return {
@@ -45,7 +42,7 @@
             _source.getAnnotationTypes().push(_anntype);
         }
         _ann.setAnnotationType(_anntype.id);
-        var _tagIds = IriSP._(_anndata.tags).map(function(_title) {
+        var _tagIds = _(_anndata.tags).map(function(_title) {
             var _tags = _source.getTags(true).searchByTitle(_title, true);
             if (_tags.length) {
                 var _tag = _tags[0];
@@ -82,6 +79,8 @@
         _source.addList('annotation', new IriSP.Model.List(_source.directory));
         _data.map( function (a) { _this.deserializeAnnotation(a, _source); });
     }
-};
+}};
+
+export default ldt_localstorage;
 
 /* End ldt_localstorage serializer */
--- a/src/js/serializers/segmentapi-serializer.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/js/serializers/segmentapi-serializer.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,10 +1,7 @@
 /* START segmentapi-serializer.js */
+import _ from "lodash";
 
-if (typeof IriSP.serializers === "undefined") {
-    IriSP.serializers = {};
-}
-
-IriSP.serializers.segmentapi = {
+const segmentapi = function(IriSP) { return {
     deSerialize : function(_data, _source) {
         var _annotationlist = new IriSP.Model.List(_source.directory),
             _medialist = new IriSP.Model.List(_source.directory);
@@ -28,12 +25,14 @@
         }
         
         if (typeof _data.objects !== "undefined") {
-            IriSP._(_data.objects).each(deserializeObject);
+            _(_data.objects).each(deserializeObject);
         } else {
             deserializeObject(_data);
         }
         _source.addList("annotation", _annotationlist);
     }
-};
+}};
+
+export default segmentapi;
 
 /* END segmentapi-serializer.js */
--- a/src/js/utils.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/js/utils.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,35 +1,12 @@
 /* utils.js - various utils that don't belong anywhere else */
-
-IriSP.jqEscape = function(_text) {
-    return _text.replace(/(:|\.)/g,'\\$1');
-};
+import _ from "lodash";
 
-IriSP.getLib = function(lib) {
-    if (IriSP.libFiles.useCdn && typeof IriSP.libFiles.cdn[lib] == "string") {
-        return IriSP.libFiles.cdn[lib];
-    }
-    if (typeof IriSP.libFiles.locations[lib] == "string") {
-        return IriSP.libFiles.locations[lib];
-    }
-    if (typeof IriSP.libFiles.inDefaultDir[lib] == "string") {
-        return IriSP.libFiles.defaultDir + '/' + IriSP.libFiles.inDefaultDir[lib];
-    }
-};
+export default function(IriSP) { return {
+  jqEscape: function(_text) {
+    return _text.replace(/(:|\.)/g,'\\$1');
+   },
 
-IriSP._cssCache = [];
-
-IriSP.loadCss = function(_cssFile) {
-    if (IriSP._(IriSP._cssCache).indexOf(_cssFile) === -1) {
-        IriSP.jQuery("<link>", {
-            rel : "stylesheet",
-            type : "text/css",
-            href : _cssFile
-        }).appendTo('head');
-        IriSP._cssCache.push(_cssFile);
-    }
-};
-
-IriSP.textFieldHtml = function(_text, _regexp, _extend) {
+  textFieldHtml: function(_text, _regexp, _extend) {
     var list = [],
         positions = [],
         text = _text.replace(/(^\s+|\s+$)/g,'');
@@ -66,11 +43,11 @@
     addToList(/\*[^*]+\*/gm, '<b>', '</b>');
     addToList(/[\n\r]+/gm, '', '<br />');
 
-    IriSP._(_extend).each(function(x) {
+    _(_extend).each(function(x) {
         addToList.apply(null, x);
     });
 
-    positions = IriSP._(positions)
+    positions = _(positions)
         .chain()
         .uniq()
         .sortBy(function(p) { return parseInt(p); })
@@ -100,22 +77,22 @@
 
     return res;
 
-};
+   },
 
-IriSP.log = function() {
+  log: function() {
     if (typeof console !== "undefined" && typeof IriSP.logging !== "undefined" && IriSP.logging) {
         console.log.apply(console, arguments);
     }
-};
+   },
 
-IriSP.attachDndData = function(jqSel, data) {
+  attachDndData: function(jqSel, data) {
 	jqSel.attr("draggable", "true").on("dragstart", function(_event) {
 		var d = (typeof data === "function" ? data.call(this) : data);
 		try {
             if (d.html === undefined && d.uri && d.text) {
                 d.html = '<a href="' + d.uri + '">' + d.text + '</a>';
             }
-			IriSP._(d).each(function(v, k) {
+			_(d).each(function(v, k) {
                 if (v && k != 'text' && k != 'html') {
 					_event.originalEvent.dataTransfer.setData("text/x-iri-" + k, v);
 				}
@@ -137,17 +114,17 @@
 			_event.originalEvent.dataTransfer.setData("Text", JSON.stringify(d));
 		}
 	});
-};
+   },
 
-IriSP.FakeClass = function(properties) {
+  FakeClass: function(properties) {
     var _this = this,
         noop = (function() {});
-    IriSP._(properties).each(function(p) {
+    _(properties).each(function(p) {
         _this[p] = noop;
     });
-};
+   },
 
-IriSP.timestamp2ms = function(t) {
+  timestamp2ms: function(t) {
     // Convert timestamp to numeric value
     // It accepts the following forms:
     // [h:mm:ss] [mm:ss] [ss]
@@ -156,9 +133,9 @@
         s.push("0");
     }
     return 1000 * (3600 * parseInt(s[2], 10) + 60 * parseInt(s[1], 10) + parseInt(s[0], 10));
-};
+   },
 
-IriSP.setFullScreen= function(elem, value) {
+  setFullScreen: function(elem, value) {
     // Set fullscreen on or off
     if (value) {
 		if (elem.requestFullscreen) {
@@ -181,24 +158,25 @@
             document.webkitExitFullscreen();
         }
     }
-};
+   },
 
-IriSP.isFullscreen = function() {
+  isFullscreen: function() {
 	return (document.fullscreenElement ||  document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement);
-};
+   },
 
-IriSP.getFullscreenElement = function () {
+  getFullscreenElement: function () {
     return (document.fullscreenElement
             || document.webkitFullscreenElement
             || document.mozFullScreenElement
             || document.msFullscreenElement
             || undefined);
-};
+   },
 
-IriSP.getFullscreenEventname = function () {
+  getFullscreenEventname: function () {
     return ((document.exitFullscreen && "fullscreenchange")
             || (document.webkitExitFullscreen && "webkitfullscreenchange")
             || (document.mozExitFullScreen && "mozfullscreenchange")
             || (document.msExitFullscreen && "msfullscreenchange")
             || "");
-};
+   },
+}};
\ No newline at end of file
--- a/src/js/version.js	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-// Metadataplayer - version 0.3
--- a/src/js/widgets-container/defaults.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/js/widgets-container/defaults.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,123 +1,141 @@
 /* Start of defaults.js */
+export default function (IriSP) {
 
-IriSP.language = 'en';
+  const defaults = {};
+
+  defaults.language = "en";
 
-IriSP.libFiles = {
-    defaultDir : "js/libs/",
-    inDefaultDir : {
-        underscore : "underscore-min.js",
-        Mustache : "mustache.js",
-        jQuery : "jquery.min.js",
-        jQueryUI : "jquery-ui.min.js",
-        swfObject : "swfobject.js",
-        cssjQueryUI : "jquery-ui.css",
-        popcorn : "popcorn-complete.min.js",
-        jwplayer : "jwplayer.js",
-        raphael : "raphael-min.js",
-        tracemanager : "tracemanager.js",
-        jwPlayerSWF : "player.swf",
-        json : "json2.js",
-        zeroClipboardJs: "ZeroClipboard.js",
-        zeroClipboardSwf: "ZeroClipboard.swf",
-        backbone: "backbone.js",
-        backboneRelational: "backbone-relational.js",
-        paper: "paper.js",
-        jqueryMousewheel: "jquery.mousewheel.min.js",
-        splitter: "jquery.touchsplitter.js",
-        cssSplitter: "jquery.touchsplitter.css",
-        renkanPublish: "renkan.js",
-        processing: "processing-1.3.6.min.js",
-        recordMicSwf: "record_mic.swf",
-        mousetrap: "mousetrap.min.js",
-        mousetrapGlobal: "mousetrap-global-bind.js"
-    },
-    locations : {
-        // use to define locations outside default_dir
-    },
-    cdn : {
-        jQuery : "http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.2.min.js",
-        jQueryUI : "http://ajax.aspnetcdn.com/ajax/jquery.ui/1.8.22/jquery-ui.min.js",
-        swfObject : "http://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js",
-        cssjQueryUI : "http://ajax.aspnetcdn.com/ajax/jquery.ui/1.8.22/themes/ui-lightness/jquery-ui.css",
-        underscore : "http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.3.3/underscore-min.js",
-        Mustache : "http://cdnjs.cloudflare.com/ajax/libs/mustache.js/0.5.0-dev/mustache.min.js",
-        raphael : "http://cdnjs.cloudflare.com/ajax/libs/raphael/2.1.0/raphael-min.js",
-        json : "http://cdnjs.cloudflare.com/ajax/libs/json2/20110223/json2.js",
-        popcorn: "http://cdn.popcornjs.org/code/dist/popcorn-complete.min.js"
-    },
-    useCdn : false
-};
+  // defaults.libFiles = {
+  //   defaultDir: "js/libs/",
+  //   inDefaultDir: {
+  //     underscore: "underscore-min.js",
+  //     Mustache: "mustache.js",
+  //     jQuery: "jquery.min.js",
+  //     jQueryUI: "jquery-ui.min.js",
+  //     swfObject: "swfobject.js",
+  //     cssjQueryUI: "jquery-ui.css",
+  //     popcorn: "popcorn-complete.min.js",
+  //     jwplayer: "jwplayer.js",
+  //     raphael: "raphael-min.js",
+  //     tracemanager: "tracemanager.js",
+  //     jwPlayerSWF: "player.swf",
+  //     json: "json2.js",
+  //     zeroClipboardJs: "ZeroClipboard.js",
+  //     zeroClipboardSwf: "ZeroClipboard.swf",
+  //     backbone: "backbone.js",
+  //     backboneRelational: "backbone-relational.js",
+  //     paper: "paper.js",
+  //     jqueryMousewheel: "jquery.mousewheel.min.js",
+  //     splitter: "jquery.touchsplitter.js",
+  //     cssSplitter: "jquery.touchsplitter.css",
+  //     renkanPublish: "renkan.js",
+  //     processing: "processing-1.3.6.min.js",
+  //     recordMicSwf: "record_mic.swf",
+  //     mousetrap: "mousetrap.min.js",
+  //     mousetrapGlobal: "mousetrap-global-bind.js",
+  //   },
+  //   locations: {
+  //     // use to define locations outside default_dir
+  //   },
+  //   cdn: {
+  //     jQuery: "http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.2.min.js",
+  //     jQueryUI:
+  //       "http://ajax.aspnetcdn.com/ajax/jquery.ui/1.8.22/jquery-ui.min.js",
+  //     swfObject:
+  //       "http://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js",
+  //     cssjQueryUI:
+  //       "http://ajax.aspnetcdn.com/ajax/jquery.ui/1.8.22/themes/ui-lightness/jquery-ui.css",
+  //     underscore:
+  //       "http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.3.3/underscore-min.js",
+  //     Mustache:
+  //       "http://cdnjs.cloudflare.com/ajax/libs/mustache.js/0.5.0-dev/mustache.min.js",
+  //     raphael:
+  //       "http://cdnjs.cloudflare.com/ajax/libs/raphael/2.1.0/raphael-min.js",
+  //     json: "http://cdnjs.cloudflare.com/ajax/libs/json2/20110223/json2.js",
+  //     popcorn: "http://cdn.popcornjs.org/code/dist/popcorn-complete.min.js",
+  //   },
+  //   useCdn: false,
+  // };
 
-IriSP.widgetsDir = 'widgets';
+  defaults.widgetsDir = "widgets";
 
-IriSP.widgetsRequirements = {
+  defaults.widgetsRequirements = {
     PopcornPlayer: {
-        noCss: true,
-        requires: [ "popcorn" ]
+      noCss: true,
+      requires: ["popcorn"],
     },
     HtmlPlayer: {
-        noCss: true
+      noCss: true,
     },
     JwpPlayer: {
-        noCss: true,
-        requires: [ "jwplayer" ]
+      noCss: true,
+      requires: ["jwplayer"],
     },
     DailymotionPlayer: {
-        noCss: true,
-        requires: [ "swfObject" ]
+      noCss: true,
+      requires: ["swfObject"],
     },
     AdaptivePlayer: {
-        noCss: true
+      noCss: true,
     },
     AutoPlayer: {
-        noCss: true
+      noCss: true,
     },
     AnnotationsList: {
-        requires: [ "jwplayer" ]
+      requires: ["jwplayer"],
     },
     Sparkline: {
-        noCss: true,
-        requires: [ "raphael" ]
+      noCss: true,
+      requires: ["raphael"],
     },
     Arrow: {
-        noCss: true,
-        requires: [ "raphael" ]
+      noCss: true,
+      requires: ["raphael"],
     },
     Mediafragment: {
-        noCss: true
+      noCss: true,
     },
-    Trace : {
-        noCss: true,
-        requires: [ "tracemanager" ]
+    Trace: {
+      noCss: true,
+      requires: ["tracemanager"],
     },
     Slideshare: {
-        requires: [ "swfObject" ]
+      requires: ["swfObject"],
     },
     Social: {
-        requires: [ "zeroClipboardJs" ]
+      requires: ["zeroClipboardJs"],
     },
     Renkan: {
-        requires: [ "backbone", "backboneRelational", "paper", "jqueryMousewheel", "renkanPublish" ]
+      requires: [
+        "backbone",
+        "backboneRelational",
+        "paper",
+        "jqueryMousewheel",
+        "renkanPublish",
+      ],
     },
     KnowledgeConcierge: {
-        requires: [ "processing" ]
+      requires: ["processing"],
     },
     MultiSegments: {
-        noCss: true
+      noCss: true,
     },
     SlideVideoPlayer: {
-        requires: [ "jQuery", "jQueryUI", "splitter" ]
+      requires: ["jQuery", "jQueryUI", "splitter"],
     },
     Shortcuts: {
-        requires: [ "mousetrap", "mousetrapGlobal" ]
-    }
-};
+      requires: ["mousetrap", "mousetrapGlobal"],
+    },
+  };
 
-IriSP.guiDefaults = {
-    width : 640,
-    container : 'LdtPlayer',
-    spacer_div_height : 0,
-    widgets: []
+  defaults.guiDefaults = {
+    width: 640,
+    container: "LdtPlayer",
+    spacer_div_height: 0,
+    widgets: [],
+  };
+
+  return defaults;
 };
 
 /* End of defaults.js */
--- a/src/js/widgets-container/metadataplayer.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/js/widgets-container/metadataplayer.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,252 +1,225 @@
 /* widgets-container/metadataplayer.js - initialization and configuration of the widgets
-*/
+ */
 
 /* The Metadataplayer Object, single point of entry, replaces IriSP.init_player */
-
-(function(ns) {
+import _ from "lodash";
+import jQuery from "jquery";
 
-var formerJQuery, formerUnderscore, former$;
+export default function (ns) {
+  var formerJQuery, formerUnderscore, former$;
 
-var Metadataplayer = ns.Metadataplayer = function(config) {
+  var Metadataplayer = (ns.Metadataplayer = function (config) {
     ns.log("IriSP.Metadataplayer constructor");
     for (var key in ns.guiDefaults) {
-        if (ns.guiDefaults.hasOwnProperty(key) && !config.hasOwnProperty(key)) {
-            config[key] = ns.guiDefaults[key]
-        }
+      if (ns.guiDefaults.hasOwnProperty(key) && !config.hasOwnProperty(key)) {
+        config[key] = ns.guiDefaults[key];
+      }
     }
     var _container = document.getElementById(config.container);
-    _container.innerHTML = '<h3 class="Ldt-Loader">Loading... Chargement...</h3>';
+    _container.innerHTML =
+      '<h3 class="Ldt-Loader">Loading... Chargement...</h3>';
     this.sourceManager = new ns.Model.Directory();
     this.config = config;
     this.__events = {};
-    this.loadLibs();
-};
+    //this.loadLibs();
+    this.onLibsLoaded();
+  });
 
-Metadataplayer.prototype.toString = function() {
-    return 'Metadataplayer in #' + this.config.container;
-};
+  Metadataplayer.prototype.toString = function () {
+    return "Metadataplayer in #" + this.config.container;
+  };
 
-Metadataplayer.prototype.on = function(_event, _callback) {
+  Metadataplayer.prototype.on = function (_event, _callback) {
     if (typeof this.__events[_event] === "undefined") {
-        this.__events[_event] = [];
+      this.__events[_event] = [];
     }
     this.__events[_event].push(_callback);
-};
-
-Metadataplayer.prototype.trigger = function(_event, _data) {
-    var _element = this;
-    ns._(this.__events[_event]).each(function(_callback) {
-        _callback.call(_element, _data);
-    });
-};
-
-Metadataplayer.prototype.loadLibs = function() {
-    ns.log("IriSP.Metadataplayer.prototype.loadLibs");
-    var $L = $LAB
-        .queueScript(ns.getLib("Mustache"));
-    formerJQuery = !!window.jQuery;
-    former$ = !!window.$;
-    formerUnderscore = !!window._;
-
-    if (typeof ns.jQuery === "undefined") {
-        $L.queueScript(ns.getLib("jQuery"));
-    }
-
-    if (typeof ns._ === "undefined") {
-        $L.queueScript(ns.getLib("underscore"));
-    }
+  };
 
-    if (typeof window.JSON == "undefined") {
-        $L.queueScript(ns.getLib("json"));
-    }
-    $L.queueWait().queueScript(ns.getLib("jQueryUI")).queueWait();
+  Metadataplayer.prototype.trigger = function (_event, _data) {
+    var _element = this;
+    _(this.__events[_event]).each(function (_callback) {
+      _callback.call(_element, _data);
+    });
+  };
 
-    /* widget specific requirements */
-    for(var _i = 0; _i < this.config.widgets.length; _i++) {
-        var _t = this.config.widgets[_i].type;
-        if (typeof ns.widgetsRequirements[_t] !== "undefined" && typeof ns.widgetsRequirements[_t].requires !== "undefined" ) {
-            for (var _j = 0; _j < ns.widgetsRequirements[_t].requires.length; _j++) {
-                $L.queueScript(ns.getLib(ns.widgetsRequirements[_t].requires[_j]));
-            }
-        }
-    }
-
-    var _this = this;
-    $L.queueWait(function() {
-        _this.onLibsLoaded();
-    });
-    
-    $L.runQueue();
-};
-
-Metadataplayer.prototype.onLibsLoaded = function() {
+  Metadataplayer.prototype.onLibsLoaded = function () {
     ns.log("IriSP.Metadataplayer.prototype.onLibsLoaded");
 
-    if (typeof ns.jQuery === "undefined" && typeof window.jQuery !== "undefined") {
-        ns.jQuery = window.jQuery;
-        if (former$ || formerJQuery) {
-            window.jQuery.noConflict(formerJQuery);
-        }
-    }
-    if (typeof ns._ === "undefined" && typeof window._ !== "undefined") {
-        ns._ = window._;
-        if (formerUnderscore) {
-            _.noConflict();
-        }
-    }
-    
-    ns.loadCss(ns.getLib("cssjQueryUI"));
-    ns.loadCss(this.config.css);
+    // if (
+    //   typeof jQuery === "undefined" &&
+    //   typeof window.jQuery !== "undefined"
+    // ) {
+    //   jQuery = window.jQuery;
+    //   if (former$ || formerJQuery) {
+    //     window.jQuery.noConflict(formerJQuery);
+    //   }
+    // }
+    // if (typeof _ === "undefined" && typeof window._ !== "undefined") {
+    //   _ = window._;
+    //   if (formerUnderscore) {
+    //     _.noConflict();
+    //   }
+    // }
 
-    this.$ = ns.jQuery('#' + this.config.container);
+    this.$ = jQuery("#" + this.config.container);
     this.$.css({
-        "width": this.config.width,
-        "clear": "both"
+      width: this.config.width,
+      clear: "both",
     });
     if (typeof this.config.height !== "undefined") {
-        this.$.css("height", this.config.height);
+      this.$.css("height", this.config.height);
     }
 
     this.widgets = [];
     var _this = this;
-    ns._(this.config.widgets).each(function(widgetconf, key) {
-        _this.widgets.push(null);
-        _this.loadWidget(widgetconf, function(widget) {
-            _this.widgets[key] = widget;
-            if (widget.isLoaded()) {
-                _this.trigger("widget-loaded");
-            }
-        });
+    _(this.config.widgets).each(function (widgetconf, key) {
+      _this.widgets.push(null);
+      _this.loadWidget(widgetconf, function (widget) {
+        _this.widgets[key] = widget;
+        if (widget.isLoaded()) {
+          _this.trigger("widget-loaded");
+        }
+      });
     });
-    this.$.find('.Ldt-Loader').detach();
+    this.$.find(".Ldt-Loader").detach();
 
     this.widgetsLoaded = false;
 
-    this.on("widget-loaded", function() {
-        if (_this.widgetsLoaded) {
-            return;
-        }
-        var isloaded = !ns._(_this.widgets).any(function(w) {
-            return !(w && w.isLoaded());
-        });
-        if (isloaded) {
-            _this.widgetsLoaded = true;
-            _this.trigger("widgets-loaded");
-        }
+    this.on("widget-loaded", function () {
+      if (_this.widgetsLoaded) {
+        return;
+      }
+      var isloaded = !_(_this.widgets).some(function (w) {
+        return !(w && w.isLoaded());
+      });
+      if (isloaded) {
+        _this.widgetsLoaded = true;
+        _this.trigger("widgets-loaded");
+      }
     });
-};
+  };
 
-Metadataplayer.prototype.loadLocalAnnotations = function(localsourceidentifier) {
+  Metadataplayer.prototype.loadLocalAnnotations = function (
+    localsourceidentifier
+  ) {
     if (this.localSource === undefined)
-        this.localSource = this.sourceManager.newLocalSource({serializer: IriSP.serializers['ldt_localstorage']});
+      this.localSource = this.sourceManager.newLocalSource({
+        serializer: IriSP.serializers["ldt_localstorage"],
+      });
     // Load current local annotations
     if (localsourceidentifier) {
-        // Allow to override localsourceidentifier when necessary (usually at init time)
-        this.localSource.identifier = localsourceidentifier;
+      // Allow to override localsourceidentifier when necessary (usually at init time)
+      this.localSource.identifier = localsourceidentifier;
     }
-    this.localSource.deSerialize(window.localStorage[this.localSource.identifier] || "[]");
+    this.localSource.deSerialize(
+      window.localStorage[this.localSource.identifier] || "[]"
+    );
     return this.localSource;
-};
+  };
 
-Metadataplayer.prototype.saveLocalAnnotations = function() {
+  Metadataplayer.prototype.saveLocalAnnotations = function () {
     // Save annotations back to localstorage
-    window.localStorage[this.localSource.identifier] = this.localSource.serialize();
+    window.localStorage[this.localSource.identifier] =
+      this.localSource.serialize();
     // Merge modifications into widget source
     // this.source.merge(this.localSource);
-};
+  };
 
-Metadataplayer.prototype.addLocalAnnotation = function(a) {
+  Metadataplayer.prototype.addLocalAnnotation = function (a) {
     this.loadLocalAnnotations();
     this.localSource.getAnnotations().push(a);
     this.saveLocalAnnotations();
-};
+  };
 
-Metadataplayer.prototype.deleteLocalAnnotation = function(ident) {
+  Metadataplayer.prototype.deleteLocalAnnotation = function (ident) {
     this.localSource.getAnnotations().removeId(ident, true);
     this.saveLocalAnnotations();
-};
+  };
 
-Metadataplayer.prototype.getLocalAnnotation = function (ident) {
+  Metadataplayer.prototype.getLocalAnnotation = function (ident) {
     this.loadLocalAnnotations();
     // We cannot use .getElement since it fetches
     // elements from the global Directory
-    return IriSP._.first(IriSP._.filter(this.localSource.getAnnotations(), function (a) { return a.id == ident; }));
-};
+    return _.first(
+      _.filter(this.localSource.getAnnotations(), function (a) {
+        return a.id == ident;
+      })
+    );
+  };
 
-Metadataplayer.prototype.loadMetadata = function(_metadataInfo) {
+  Metadataplayer.prototype.loadMetadata = function (_metadataInfo) {
     if (_metadataInfo.elementType === "source") {
-        return _metadataInfo;
+      return _metadataInfo;
     }
-    if (typeof _metadataInfo.serializer === "undefined" && typeof _metadataInfo.format !== "undefined") {
-        _metadataInfo.serializer = ns.serializers[_metadataInfo.format];
+    if (
+      typeof _metadataInfo.serializer === "undefined" &&
+      typeof _metadataInfo.format !== "undefined"
+    ) {
+      _metadataInfo.serializer = ns.serializers[_metadataInfo.format];
     }
-    if (typeof _metadataInfo.url !== "undefined" && typeof _metadataInfo.serializer !== "undefined") {
-        return this.sourceManager.remoteSource(_metadataInfo);
+    if (
+      typeof _metadataInfo.url !== "undefined" &&
+      typeof _metadataInfo.serializer !== "undefined"
+    ) {
+      return this.sourceManager.remoteSource(_metadataInfo);
     } else {
-        return this.sourceManager.newLocalSource(_metadataInfo);
+      return this.sourceManager.newLocalSource(_metadataInfo);
     }
-};
+  };
 
-Metadataplayer.prototype.loadWidget = function(_widgetConfig, _callback) {
+  Metadataplayer.prototype.loadWidget = function (_widgetConfig, _callback) {
     /* Creating containers if needed */
     if (typeof _widgetConfig.container === "undefined") {
-        var _divs = this.layoutDivs(_widgetConfig.type);
-        _widgetConfig.container = _divs[0];
+      var _divs = this.layoutDivs(_widgetConfig.type);
+      _widgetConfig.container = _divs[0];
     }
 
     var _this = this;
 
     if (typeof ns.Widgets[_widgetConfig.type] !== "undefined") {
-        ns._.defer(function() {
-            _callback(new ns.Widgets[_widgetConfig.type](_this, _widgetConfig));
-        });
+      _.defer(function () {
+        _callback(new ns.Widgets[_widgetConfig.type](_this, _widgetConfig));
+      });
     } else {
-        /* Loading Widget CSS */
-        if (typeof ns.widgetsRequirements[_widgetConfig.type] === "undefined" || typeof ns.widgetsRequirements[_widgetConfig.type].noCss === "undefined" || !ns.widgetsRequirements[_widgetConfig.type].noCss) {
-            ns.loadCss(ns.widgetsDir + '/' + _widgetConfig.type + '.css');
-        }
-        /* Loading Widget JS    */
-        $LAB.script(ns.widgetsDir + '/' + _widgetConfig.type + '.js').wait(function() {
-            _callback(new ns.Widgets[_widgetConfig.type](_this, _widgetConfig));
-        });
+      ns.log("Widget type " + _widgetConfig.type + " Unkown !");
     }
-};
+  };
 
-/** create a subdiv with an unique id, and a spacer div as well.
+  /** create a subdiv with an unique id, and a spacer div as well.
     @param widgetName the name of the widget.
     @return an array of the form [createdivId, spacerdivId].
 */
-Metadataplayer.prototype.layoutDivs = function(_name, _height) {
-    if (typeof(_name) === "undefined") {
-       _name = "";
+  Metadataplayer.prototype.layoutDivs = function (_name, _height) {
+    if (typeof _name === "undefined") {
+      _name = "";
     }
-    var newDiv = ns._.uniqueId(this.config.container + "_widget_" + _name + "_"),
-        spacerDiv = ns._.uniqueId("LdtPlayer_spacer_"),
-        divHtml = ns.jQuery('<div>')
-            .attr("id",newDiv)
-            .css({
-                width: this.config.width + "px",
-                position: "relative",
-                clear: "both"
-            }),
-        spacerHtml = ns.jQuery('<div>')
-            .attr("id",spacerDiv)
-            .css({
-                width: this.config.width + "px",
-                height: this.config.spacer_div_height + "px",
-                position: "relative",
-                clear: "both"
-            });
+    var newDiv = _.uniqueId(this.config.container + "_widget_" + _name + "_"),
+      spacerDiv = _.uniqueId("LdtPlayer_spacer_"),
+      divHtml = jQuery("<div>")
+        .attr("id", newDiv)
+        .css({
+          width: this.config.width + "px",
+          position: "relative",
+          clear: "both",
+        }),
+      spacerHtml = jQuery("<div>")
+        .attr("id", spacerDiv)
+        .css({
+          width: this.config.width + "px",
+          height: this.config.spacer_div_height + "px",
+          position: "relative",
+          clear: "both",
+        });
     if (typeof _height !== "undefined") {
-        divHtml.css("height", _height);
+      divHtml.css("height", _height);
     }
 
     this.$.append(divHtml);
     this.$.append(spacerHtml);
 
     return [newDiv, spacerDiv];
-};
-
-})(IriSP);
+  };
+}
 
 /* End of widgets-container/metadataplayer.js */
--- a/src/js/widgets-container/widget.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/js/widgets-container/widget.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,8 +1,6 @@
 /* widgetsDefinition of an ancestor for the Widget classes */
-
-if (typeof IriSP.Widgets === "undefined") {
-    IriSP.Widgets = {};
-}
+import Mustache from "mustache";
+import jQuery from "jquery";
 
 /**
  * @class IriSP.Widget is an "abstract" class. It's mostly used to define some properties common to every widget.
@@ -13,273 +11,333 @@
  * @constructor
  * @param player - a reference to the player widget
  * @param config - configuration options for the widget
+ *
  */
 
+import _ from "lodash";
 
-IriSP.Widgets.Widget = function(player, config) {
+export default function (IriSP) {
+  const Widgets = {};
+
+  Widgets.Widget = class {
+
+    static defaults = {};
 
-    if( typeof player === "undefined") {
+    static template = "";
+
+    static messages = { en: {} };
+
+    constructor(player, config) {
+      if (typeof player === "undefined") {
         /* Probably an abstract call of the class when
          * individual widgets set their prototype */
         return;
-    }
+      }
 
-    this.__subwidgets = [];
+      this.__subwidgets = [];
 
-    /* Setting all the configuration options */
-    var _type = config.type || "(unknown)",
-        _config = IriSP._.defaults({}, config, (player && player.config ? player.config.default_options : {}), this.defaults),
+      /* Setting all the configuration options */
+      var _type = config.type || "(unknown)",
+        _config = _.defaults(
+          {},
+          config,
+          player && player.config ? player.config.default_options : {},
+          this.constructor.defaults
+        ),
         _this = this;
 
-    IriSP._(_config).forEach(function(_value, _key) {
-       _this[_key] = _value;
-    });
+      _(_config).forEach(function (_value, _key) {
+        _this[_key] = _value;
+      });
 
-    this.$ = IriSP.jQuery('#' + this.container);
+      this.$ = jQuery("#" + this.container);
 
-    if (typeof this.width === "undefined") {
+      if (typeof this.width === "undefined") {
         this.width = this.$.width();
-    } else {
+      } else {
         this.$.css("width", this.width);
-    }
+      }
 
-    if (typeof this.height !== "undefined") {
+      if (typeof this.height !== "undefined") {
         this.$.css("height", this.height);
-    }
+      }
 
-    /* Setting this.player at the end in case it's been overriden
-     * by a configuration option of the same name :-(
-     */
-    this.player = player || new IriSP.FakeClass(["on","trigger","off","loadWidget","loadMetadata"]);
+      /* Setting this.player at the end in case it's been overriden
+       * by a configuration option of the same name :-(
+       */
+      this.player =
+        player ||
+        new IriSP.FakeClass([
+          "on",
+          "trigger",
+          "off",
+          "loadWidget",
+          "loadMetadata",
+        ]);
 
-    /* Adding classes and html attributes */
-    this.$.addClass("Ldt-TraceMe Ldt-Widget").attr("widget-type", _type);
+      /* Adding classes and html attributes */
+      this.$.addClass("Ldt-TraceMe Ldt-Widget").attr("widget-type", _type);
 
-    this.l10n = (
-        typeof this.messages[IriSP.language] !== "undefined"
-        ? this.messages[IriSP.language]
-        : (
-            IriSP.language.length > 2 && typeof this.messages[IriSP.language.substr(0,2)] !== "undefined"
-            ? this.messages[IriSP.language.substr(0,2)]
-            : this.messages["en"]
-        )
-    );
+      this.l10n =
+        typeof this.constructor.messages[IriSP.language] !== "undefined"
+          ? this.constructor.messages[IriSP.language]
+          : IriSP.language.length > 2 &&
+            typeof this.constructor.messages[IriSP.language.substr(0, 2)] !== "undefined"
+          ? this.constructor.messages[IriSP.language.substr(0, 2)]
+          : this.constructor.messages["en"];
 
-    /* Loading Metadata if required */
+      /* Loading Metadata if required */
 
-    function onsourceloaded() {
+      function onsourceloaded() {
         if (_this.localannotations) {
-            _this.localsource = player.loadLocalAnnotations(_this.localannotations);
-            _this.source.merge(_this.localsource);
+          _this.localsource = player.loadLocalAnnotations(
+            _this.localannotations
+          );
+          _this.source.merge(_this.localsource);
         }
         if (_this.media_id) {
-                _this.media = this.getElement(_this.media_id);
-            } else {
-                var _mediaopts = {
-                    is_mashup: _this.is_mashup || false
-                };
-                _this.media = _this.source.getCurrentMedia(_mediaopts);
-            }
-        if (_this.pre_draw_callback){
-            IriSP.jQuery.when(_this.pre_draw_callback()).done(_this.draw());
+          _this.media = this.getElement(_this.media_id);
+        } else {
+          var _mediaopts = {
+            is_mashup: _this.is_mashup || false,
+          };
+          _this.media = _this.source.getCurrentMedia(_mediaopts);
         }
-        else {
-            _this.draw();
+        if (_this.pre_draw_callback) {
+          jQuery.when(_this.pre_draw_callback()).done(_this.draw());
+        } else {
+          _this.draw();
         }
         _this.player.trigger("widget-loaded");
-    }
+      }
 
-    if (this.metadata) {
+      if (this.metadata) {
         /* Getting metadata */
         this.source = player.loadMetadata(this.metadata);
         /* Call draw when loaded */
         this.source.onLoad(onsourceloaded);
-    } else {
+      } else {
         if (this.source) {
-            onsourceloaded();
+          onsourceloaded();
         }
+      }
+    }
+
+    toString() {
+      return "Widget " + this.type;
+    }
+
+    templateToHtml(_template) {
+      return Mustache.render(_template, this);
+    }
+
+    renderTemplate() {
+      this.$.append(this.templateToHtml(this.constructor.template));
+    }
+
+    functionWrapper(_name) {
+      var _this = this,
+        _function = this[_name];
+      if (typeof _function !== "undefined") {
+        return function () {
+          return _function.apply(
+            _this,
+            Array.prototype.slice.call(arguments, 0)
+          );
+        };
+      } else {
+        console.log(
+          "Error, Unknown function IriSP.Widgets." + this.type + "." + _name
+        );
+      }
+    }
+
+    getFunctionOrName(_functionOrName) {
+      switch (typeof _functionOrName) {
+        case "function":
+          return _functionOrName;
+        case "string":
+          return this.functionWrapper(_functionOrName);
+        default:
+          return undefined;
+      }
+    }
+
+    onMdpEvent(_eventName, _functionOrName) {
+      this.player.on(_eventName, this.getFunctionOrName(_functionOrName));
+    }
+
+    onMediaEvent(_eventName, _functionOrName) {
+      this.media.on(_eventName, this.getFunctionOrName(_functionOrName));
+    }
+
+    getWidgetAnnotations() {
+      var result = null;
+      if (typeof this.annotation_type === "undefined") {
+        result = this.media.getAnnotations();
+      } else if (this.annotation_type.elementType === "annotationType") {
+        result = this.annotation_type.getAnnotations();
+      } else {
+        result = this.media.getAnnotationsByTypeTitle(this.annotation_type);
+      }
+      if (typeof this.annotation_filter !== "undefined") {
+        return this.annotation_filter(result);
+      } else {
+        return result;
+      }
+    }
+
+    getWidgetAnnotationsAtTime() {
+      var _time = this.media.getCurrentTime();
+      return this.getWidgetAnnotations().filter(function (_annotation) {
+        return _annotation.begin <= _time && _annotation.end > _time;
+      });
+    }
+
+    isLoaded() {
+      var isloaded = !_(this.__subwidgets).some(function (w) {
+        return !(w && w.isLoaded());
+      });
+      return isloaded;
+    }
+
+    insertSubwidget(_selector, _widgetoptions, _propname) {
+      var _id = _selector.attr("id"),
+        _this = this,
+        key = this.__subwidgets.length;
+      this.__subwidgets.push(null);
+      if (typeof _id == "undefined") {
+        _id = _.uniqueId(this.container + "_sub_widget_" + _widgetoptions.type);
+        _selector.attr("id", _id);
+      }
+      _widgetoptions.container = _id;
+      _this.player.loadWidget(_widgetoptions, function (_widget) {
+        if (_propname) {
+          _this[_propname] = _widget;
+        }
+        _this.__subwidgets[key] = _widget;
+      });
     }
 
-
-};
-
-IriSP.Widgets.Widget.prototype.defaults = {};
-
-IriSP.Widgets.Widget.prototype.template = '';
-
-IriSP.Widgets.Widget.prototype.messages = {"en":{}};
-
-IriSP.Widgets.Widget.prototype.toString = function() {
-    return "Widget " + this.type;
-};
-
-IriSP.Widgets.Widget.prototype.templateToHtml = function(_template) {
-    return Mustache.to_html(_template, this);
-};
-
-IriSP.Widgets.Widget.prototype.renderTemplate = function() {
-    this.$.append(this.templateToHtml(this.template));
-};
-
-IriSP.Widgets.Widget.prototype.functionWrapper = function(_name) {
-    var _this = this,
-        _function = this[_name];
-    if (typeof _function !== "undefined") {
-        return function() {
-            return _function.apply(_this, Array.prototype.slice.call(arguments, 0));
-        };
-    } else {
-        console.log("Error, Unknown function IriSP.Widgets." + this.type + "." + _name);
+    /*
+     * Position the player to the next/previous annotations based on current player position
+     *
+     * Parameter: offset: -1 for previous annotation, +1 for next annotation
+     */
+    navigate(offset) {
+      // offset is normally either -1 (previous slide) or +1 (next slide)
+      var _this = this;
+      var currentTime = _this.media.getCurrentTime();
+      var annotations = _this
+        .getWidgetAnnotations()
+        .sortBy(function (_annotation) {
+          return _annotation.begin;
+        });
+      for (var i = 0; i < annotations.length; i++) {
+        if (
+          annotations[i].begin <= currentTime &&
+          currentTime < annotations[i].end
+        ) {
+          // Found a current annotation - clamp i+offset value to [0, length - 1]
+          i = Math.min(annotations.length - 1, Math.max(0, i + offset));
+          _this.media.setCurrentTime(annotations[i].begin);
+          break;
+        }
+      }
     }
-};
 
-IriSP.Widgets.Widget.prototype.getFunctionOrName = function(_functionOrName) {
-    switch (typeof _functionOrName) {
-        case "function":
-            return _functionOrName;
-        case "string":
-            return this.functionWrapper(_functionOrName);
-        default:
-            return undefined;
-    }
-};
-
-IriSP.Widgets.Widget.prototype.onMdpEvent = function(_eventName, _functionOrName) {
-    this.player.on(_eventName, this.getFunctionOrName(_functionOrName));
-};
-
-IriSP.Widgets.Widget.prototype.onMediaEvent = function(_eventName, _functionOrName) {
-    this.media.on(_eventName, this.getFunctionOrName(_functionOrName));
-};
+    /*
+     * Propose an export of the widget's annotations
+     *
+     * Parameter: a list of annotations. If not specified, the widget's annotations will be exported.
+     */
+    exportAnnotations(annotations) {
+      var widget = this;
+      if (annotations === undefined) annotations = this.getWidgetAnnotations();
+      var $ = jQuery;
 
-IriSP.Widgets.Widget.prototype.getWidgetAnnotations = function() {
-    var result = null;
-    if (typeof this.annotation_type === "undefined") {
-        result = this.media.getAnnotations();
-    } else if (this.annotation_type.elementType === "annotationType") {
-        result = this.annotation_type.getAnnotations();
-    } else {
-        result = this.media.getAnnotationsByTypeTitle(this.annotation_type);
-    }
-    if (typeof this.annotation_filter !== "undefined") {
-        return this.annotation_filter(result);
-    } else {
-        return result;
-    }
-};
-
-IriSP.Widgets.Widget.prototype.getWidgetAnnotationsAtTime = function() {
-    var _time = this.media.getCurrentTime();
-    return this.getWidgetAnnotations().filter(function(_annotation) {
-        return _annotation.begin <= _time && _annotation.end > _time;
-    });
-};
-
-IriSP.Widgets.Widget.prototype.isLoaded = function() {
-    var isloaded = !IriSP._(this.__subwidgets).any(function(w) {
-        return !(w && w.isLoaded());
-    });
-    return isloaded;
-};
+      // FIXME: this should belong to a proper serialize/deserialize component?
+      var content =
+        Mustache.render("[video:{{url}}]\n", { url: widget.media.url }) +
+        annotations
+          .map(function (a) {
+            return Mustache.render(
+              "[{{ a.begin }}]{{ a.title }} {{ a.description }}[{{ a.end }}]",
+              { a: a }
+            );
+          })
+          .join("\n");
 
-IriSP.Widgets.Widget.prototype.insertSubwidget = function(_selector, _widgetoptions, _propname) {
-    var _id = _selector.attr("id"),
-        _this = this,
-        _type = _widgetoptions.type,
-        $L = $LAB,
-        key = this.__subwidgets.length;
-    this.__subwidgets.push(null);
-    if (typeof _id == "undefined") {
-        _id = IriSP._.uniqueId(this.container + '_sub_widget_' + _widgetoptions.type);
-        _selector.attr("id", _id);
-    }
-    _widgetoptions.container = _id;
-    if (typeof IriSP.widgetsRequirements[_type] !== "undefined" && typeof IriSP.widgetsRequirements[_type].requires !== "undefined" ) {
-        for (var _j = 0; _j < IriSP.widgetsRequirements[_type].requires.length; _j++) {
-            $L.script(IriSP.getLib(IriSP.widgetsRequirements[_type].requires[_j]));
-        }
-    }
-    $L.wait(function() {
-        _this.player.loadWidget(_widgetoptions, function(_widget) {
-            if (_propname) {
-                _this[_propname] = _widget;
+      var el = $("<pre>")
+        .addClass("exportContainer")
+        .text(content)
+        .dialog({
+          title: "Annotation export",
+          open: function (event, ui) {
+            // Select text
+            var range;
+            if (document.selection) {
+              range = document.body.createTextRange();
+              range.moveToElementText(this[0]);
+              range.select();
+            } else if (window.getSelection) {
+              range = document.createRange();
+              range.selectNode(this[0]);
+              window.getSelection().addRange(range);
             }
-            _this.__subwidgets[key] = _widget;
+          },
+          autoOpen: true,
+          width: "80%",
+          minHeight: "400",
+          height: 400,
+          buttons: [
+            {
+              text: "Close",
+              click: function () {
+                $(this).dialog("close");
+              },
+            },
+            {
+              text: "Download",
+              click: function () {
+                a = document.createElement("a");
+                a.setAttribute(
+                  "href",
+                  "data:text/plain;base64," + btoa(content)
+                );
+                a.setAttribute(
+                  "download",
+                  "Annotations - " +
+                    widget.media.title.replace(/[^ \w]/g, "") +
+                    ".txt"
+                );
+                a.click();
+              },
+            },
+          ],
         });
-    });
-};
-
-/*
- * Position the player to the next/previous annotations based on current player position
- *
- * Parameter: offset: -1 for previous annotation, +1 for next annotation
- */
-IriSP.Widgets.Widget.prototype.navigate = function(offset) {
-    // offset is normally either -1 (previous slide) or +1 (next slide)
-    var _this = this;
-    var currentTime = _this.media.getCurrentTime();
-    var annotations = _this.getWidgetAnnotations().sortBy(function(_annotation) {
-        return _annotation.begin;
-    });
-    for (var i = 0; i < annotations.length; i++) {
-        if (annotations[i].begin <= currentTime && currentTime < annotations[i].end) {
-            // Found a current annotation - clamp i+offset value to [0, length - 1]
-            i = Math.min(annotations.length - 1, Math.max(0, i + offset));
-            _this.media.setCurrentTime(annotations[i].begin);
-            break;
-        }
-    };
-};
+    }
 
-/*
- * Propose an export of the widget's annotations
- *
- * Parameter: a list of annotations. If not specified, the widget's annotations will be exported.
- */
-IriSP.Widgets.Widget.prototype.exportAnnotations = function(annotations) {
-    var widget = this;
-    if (annotations === undefined)
-        annotations = this.getWidgetAnnotations();
-    var $ = IriSP.jQuery;
-
-    // FIXME: this should belong to a proper serialize/deserialize component?
-    var content = Mustache.to_html("[video:{{url}}]\n", {url: widget.media.url}) + annotations.map( function(a) { return Mustache.to_html("[{{ a.begin }}]{{ a.title }} {{ a.description }}[{{ a.end }}]", { a: a }); }).join("\n");
+    /**
+     * This method responsible of drawing a widget on screen.
+     */
+    draw() {
+      /* implemented by "sub-classes" */
+    }
 
-    var el = $("<pre>")
-            .addClass("exportContainer")
-            .text(content)
-            .dialog({
-                title: "Annotation export",
-                open: function( event, ui ) {
-                    // Select text
-                    var range;
-                    if (document.selection) {
-		                range = document.body.createTextRange();
-                        range.moveToElementText(this[0]);
-		                range.select();
-		            } else if (window.getSelection) {
-		                range = document.createRange();
-		                range.selectNode(this[0]);
-		                window.getSelection().addRange(range);
-		            }
-                },
-                autoOpen: true,
-                width: '80%',
-                minHeight: '400',
-                height: 400,
-                buttons: [ { text: "Close", click: function() { $( this ).dialog( "close" ); } },
-                           { text: "Download", click: function () {
-                               a = document.createElement('a');
-                               a.setAttribute('href', 'data:text/plain;base64,' + btoa(content));
-                               a.setAttribute('download', 'Annotations - ' + widget.media.title.replace(/[^ \w]/g, '') + '.txt');
-                               a.click();
-                           } } ]
-            });
-};
+    //Generates uid
+    //source : http://stackoverflow.com/questions/105034/create-guid-uuid-in-javascript
+    generateUid() {
+      return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(
+        /[xy]/g,
+        function (c) {
+          var r = (Math.random() * 16) | 0,
+            v = c === "x" ? r : (r & 0x3) | 0x8;
+          return v.toString(16);
+        }
+      );
+    }
+  };
 
-/**
- * This method responsible of drawing a widget on screen.
- */
-IriSP.Widgets.Widget.prototype.draw = function() {
-    /* implemented by "sub-classes" */
-};
+  return Widgets;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main.js	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,45 @@
+import style from "./main.module.css";
+
+import IriSP from "./js/init";
+
+if (typeof window.IriSP === "undefined") {
+  window.IriSP = IriSP;
+}
+
+import Model from "./js/model";
+
+IriSP.Model = Model(IriSP);
+
+import htmlPlayer from "./js/html-player";
+
+IriSP.htmlPlayer = htmlPlayer;
+
+import utils from "./js/utils";
+
+Object.assign(IriSP, utils(IriSP));
+
+import iFrameUpdater from "./js/iframe_embed/embedder";
+
+IriSP.iFrameUpdater = iFrameUpdater;
+
+import serializers from "./js/serializers";
+
+IriSP.serializers = serializers(IriSP);
+
+import defaults from "./js/widgets-container/defaults";
+
+Object.assign(IriSP, defaults(IriSP));
+
+import metadataplayer from "./js/widgets-container/metadataplayer";
+
+metadataplayer(IriSP);
+
+import widgetsBase from "./js/widgets-container/widget";
+
+IriSP.Widgets = widgetsBase(IriSP);
+
+import widgets from "./widgets";
+
+Object.assign(IriSP.Widgets, widgets(IriSP));
+
+export default { IriSP, style };
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main.module.css	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,1 @@
+@import "css/LdtPlayer-core.css"
\ No newline at end of file
--- a/src/widgets/AdaptivePlayer.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/widgets/AdaptivePlayer.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,33 +1,38 @@
-IriSP.Widgets.AdaptivePlayer = function(player, config) {
-    IriSP.Widgets.Widget.call(this, player, config);
-};
-
-IriSP.Widgets.AdaptivePlayer.prototype = new IriSP.Widgets.Widget();
-
-IriSP.Widgets.AdaptivePlayer.prototype.defaults = {
-    mime_type: 'video/mp4; codecs="avc1.42E01E"',
-    normal_player: "HtmlPlayer",
-    fallback_player: "JwpPlayer"
-};
-
-IriSP.Widgets.AdaptivePlayer.prototype.draw = function() {
-    
-    if (typeof this.video === "undefined") {
-        this.video = this.media.video;
-    }
-    
-    var _props = [ "autostart", "video", "height", "width", "url_transform" ],
-        _opts = {},
-        _canPlayType = document.createElement('video').canPlayType(this.mime_type);
-    
-    _opts.type = (_canPlayType !== "no") ? this.normal_player : this.fallback_player;
-    
-    for (var i = 0; i < _props.length; i++) {
-        if (typeof this[_props[i]] !== "undefined") {
-            _opts[_props[i]] = this[_props[i]];
-        }
+// Class AdaptivePlayer
+const AdaptivePlayer = function (ns) {
+  return class extends ns.Widgets.Widget {
+    constructor(player, config) {
+      super(player, config);
     }
 
-    this.insertSubwidget(this.$, _opts);
-    
-};
\ No newline at end of file
+    static defaults = {
+      mime_type: 'video/mp4; codecs="avc1.42E01E"',
+      normal_player: "HtmlPlayer",
+      fallback_player: "HtmlPlayer",
+    };
+
+    draw() {
+      if (typeof this.video === "undefined") {
+        this.video = this.media.video;
+      }
+
+      var _props = ["autostart", "video", "height", "width", "url_transform"],
+        _opts = {},
+        _canPlayType = document
+          .createElement("video")
+          .canPlayType(this.mime_type);
+
+      _opts.type =
+        _canPlayType !== "no" ? this.normal_player : this.fallback_player;
+
+      for (var i = 0; i < _props.length; i++) {
+        if (typeof this[_props[i]] !== "undefined") {
+          _opts[_props[i]] = this[_props[i]];
+        }
+      }
+
+      this.insertSubwidget(this.$, _opts);
+    }
+  };
+};
+export { AdaptivePlayer };
--- a/src/widgets/Annotation.css	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,132 +0,0 @@
-.Ldt-Annotation-Widget {
-    border-style: none solid solid;
-    border-width: 1px;
-    border-color: #b7b7b7;
-    padding: 0 1px 1px;
-    margin: 0;
-}
-
-.Ldt-Annotation-Widget.Ldt-Annotation-ShowTop {
-    border-top-style: solid;
-    padding-top: 1px;
-}
-
-.Ldt-Annotation-Inner {
-    background: url(img/pinstripe.png);
-    padding: 5px;
-    margin: 0;
-}
-
-.Ldt-Annotation-Inner h3 {
-    margin: 5px 0;
-    font-size: 14px;
-    font-weight: bold;
-}
-
-.Ldt-Annotation-Description {
-    max-height: 150px;
-    overflow: auto;
-}
-
-.Ldt-Annotation-Cleared {
-    clear: both;
-}
-
-.Ldt-Annotation-MaxMinButton {
-    float: right; margin: 5px 5px 0; width: 17px; height: 17px;
-    background: url(img/widget-control.png); background-position: 0 -51px; cursor: pointer;
-}
-
-.Ldt-Annotation-Social {
-    float: right;
-}
-
-.Ldt-Annotation-MaxMinButton:hover {
-    background-position: -17px -51px;
-}
-
-.Ldt-Annotation-Minimized div.Ldt-Annotation-MaxMinButton {
-    background-position: 0 -34px;
-}
-
-.Ldt-Annotation-Minimized div.Ldt-Annotation-MaxMinButton:hover {
-    background-position: -17px -34px;
-}
-
-.Ldt-Annotation-Inner h3.Ldt-Annotation-MashupOrigin {
-    font-size: 12px;
-}
-
-.Ldt-Annotation-Title, .Ldt-Annotation-MashupMedia {
-    color: #0068c4;
-    text-decoration: none;
-}
-
-.Ldt-Annotation-Type {
-    color: #8080A0;
-}
-
-.Ldt-Annotation-Time {
-    color: #ff3b77
-}
-
-.Ldt-Annotation-Inner p {
-    font-size: 12px;
-    line-height: 16px;
-}
-
-.Ldt-Annotation-Label {
-    font-size: 12px; font-weight: bold; max-width: 90px; float: left; clear: left;
-}
-
-.Ldt-Annotation-Labelled {
-    margin: 5px 0 0 90px; clear: right;
-}
-
-.Ldt-Annotation-Tags-Block {
-    font-size: 12px;
-}
-
-ul.Ldt-Annotation-Tags {
-    list-style: none; padding: 0;
-}
-
-li.Ldt-Annotation-TagLabel {
-    display: inline-block; border: none; margin: 0 10px 5px 0; height: 23px; padding: 0 0 0 20px;
-    background: url(img/tag.png) left top no-repeat;
-    cursor: pointer;
-}
-
-.Ldt-Annotation-TagLabel span {
-    display: inline-block; font-size: 12px; height: 19px; padding: 4px 5px 0 0; border: none; margin: 0;
-    background: url(img/tag.png) right top no-repeat;
-}
-
-li.Ldt-Annotation-TagLabel:hover {
-    background-position: left -23px;
-}
-
-.Ldt-Annotation-TagLabel:hover span {
-    background-position: right -23px;
-}
-
-.Ldt-Annotation-MashupOrigin {
-    display: none;
-}
-
-.Ldt-Annotation-isMashup .Ldt-Annotation-MashupOrigin {
-    display: block;
-}
-
-.Ldt-Annotation-Empty .Ldt-Annotation-HiddenWhenEmpty {
-    display: none;
-}
-
-.Ldt-Annotation-Minimized .Ldt-Annotation-HiddenWhenMinimized {
-    display: none;
-}
-
-.Ldt-Annotation-EmptyBlock {
-    display: none;
-}
-
--- a/src/widgets/Annotation.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/widgets/Annotation.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,239 +1,316 @@
 // TODO: Migrate Timeupdate functions to Extract
+import annotationStyles from "./Annotation.module.css";
 
-IriSP.Widgets.Annotation = function(player, config) {
-    IriSP.Widgets.Widget.call(this, player, config);
-    this.lastAnnotation = false;
-    this.minimized = this.start_minimized || false;
-    this.bounds = [ 0, 0 ];
-};
+// Annotation class
+const Annotation = function (ns) {
+  return class extends ns.Widgets.Widget {
+    constructor(player, config) {
+      super(player, config);
+      this.lastAnnotation = false;
+      this.minimized = this.start_minimized || false;
+      this.bounds = [0, 0];
+    }
 
-IriSP.Widgets.Annotation.prototype = new IriSP.Widgets.Widget();
-
-IriSP.Widgets.Annotation.prototype.messages = {
-    fr: {
+    static messages =  {
+      fr: {
         watching: "Je regarde ",
         on_site: " sur ",
         tags_: "Mots-clés\u00a0:",
         description_: "Description\u00a0:",
         creator_: "Créé par\u00a0:",
         excerpt_from: "Extrait de\u00a0:",
-        untitled: "Segment sans titre"
-    },
-    en: {
+        untitled: "Segment sans titre",
+      },
+      en: {
         watching: "I'm watching ",
         on_site: " on ",
         tags_: "Keywords:",
         description_: "Description:",
         creator_: "Created by\u00a0:",
         excerpt_from: "Excerpt from:",
-        untitled: "Untitled segment"
-    }
-};
+        untitled: "Untitled segment",
+      },
+    };
 
-IriSP.Widgets.Annotation.prototype.template =
-    '{{#show_arrow}}<div class="Ldt-Annotation-Arrow"></div>{{/show_arrow}}'
-    + '<div class="Ldt-Annotation-Widget {{^show_arrow}}Ldt-Annotation-ShowTop{{/show_arrow}}">'
-    + '<div class="Ldt-Annotation-Inner Ldt-Annotation-Empty{{#start_minimized}} Ldt-Annotation-Minimized{{/start_minimized}}">'
-    + '<div class="Ldt-Annotation-HiddenWhenEmpty Ldt-Annotation-MaxMinButton"></div>'
-    + '{{#show_social}}<div class="Ldt-Annotation-Social Ldt-Annotation-HiddenWhenMinimized Ldt-Annotation-HiddenWhenEmpty"></div>{{/show_social}}'
-    + '<h3 class="Ldt-Annotation-HiddenWhenEmpty">{{#show_annotation_type}}<span class="Ldt-Annotation-Type"></span> » {{/show_annotation_type}}<a class="Ldt-Annotation-Title" href="#"></a> <span class="Ldt-Annotation-Time Ldt-Annotation-HiddenWhenMinimized">'
-    + '(<span class="Ldt-Annotation-Begin"></span> - <span class="Ldt-Annotation-End"></span>)</span></h3>'
-    + '<h3 class="Ldt-Annotation-MashupOrigin Ldt-Annotation-HiddenWhenEmpty">{{l10n.excerpt_from}} <span class="Ldt-Annotation-MashupMedia"></span> <span class="Ldt-Annotation-Time Ldt-Annotation-HiddenWhenMinimized">'
-    + '(<span class="Ldt-Annotation-MashupBegin"></span> - <span class="Ldt-Annotation-MashupEnd"></span>)</span></h3>'
-    + '<div class="Ldt-Annotation-Cleared Ldt-Annotation-HiddenWhenMinimized Ldt-Annotation-HiddenWhenEmpty Ldt-Annotation-Creator-Block"><div class="Ldt-Annotation-Label">{{l10n.creator_}}</div>'
-    + '{{#show_creator}}<p class="Ldt-Annotation-Labelled Ldt-Annotation-Creator"></p></div>{{/show_creator}}'
-    + '{{#show_description}}<div class="Ldt-Annotation-Cleared Ldt-Annotation-HiddenWhenMinimized Ldt-Annotation-HiddenWhenEmpty Ldt-Annotation-Description-Block"><div class="Ldt-Annotation-Label">{{l10n.description_}}</div>'
-    + '<p class="Ldt-Annotation-Labelled Ldt-Annotation-Description"></p></div>{{/show_description}}'
-    + '<div class="Ldt-Annotation-Tags-Block Ldt-Annotation-HiddenWhenMinimized Ldt-Annotation-HiddenWhenEmpty Ldt-Annotation-Cleared">'
-    + '<div class="Ldt-Annotation-Label">{{l10n.tags_}}</div><ul class="Ldt-Annotation-Labelled Ldt-Annotation-Tags"></ul>'
-    + '</div></div></div></div>';
+    static template =
+      '{{#show_arrow}}<div class="Ldt-Annotation-Arrow"></div>{{/show_arrow}}' +
+      '<div class="Ldt-Annotation-Widget {{^show_arrow}}Ldt-Annotation-ShowTop{{/show_arrow}}">' +
+      '<div class="Ldt-Annotation-Inner Ldt-Annotation-Empty{{#start_minimized}} Ldt-Annotation-Minimized{{/start_minimized}}">' +
+      '<div class="Ldt-Annotation-HiddenWhenEmpty Ldt-Annotation-MaxMinButton"></div>' +
+      '{{#show_social}}<div class="Ldt-Annotation-Social Ldt-Annotation-HiddenWhenMinimized Ldt-Annotation-HiddenWhenEmpty"></div>{{/show_social}}' +
+      '<h3 class="Ldt-Annotation-HiddenWhenEmpty">{{#show_annotation_type}}<span class="Ldt-Annotation-Type"></span> » {{/show_annotation_type}}<a class="Ldt-Annotation-Title" href="#"></a> <span class="Ldt-Annotation-Time Ldt-Annotation-HiddenWhenMinimized">' +
+      '(<span class="Ldt-Annotation-Begin"></span> - <span class="Ldt-Annotation-End"></span>)</span></h3>' +
+      '<h3 class="Ldt-Annotation-MashupOrigin Ldt-Annotation-HiddenWhenEmpty">{{l10n.excerpt_from}} <span class="Ldt-Annotation-MashupMedia"></span> <span class="Ldt-Annotation-Time Ldt-Annotation-HiddenWhenMinimized">' +
+      '(<span class="Ldt-Annotation-MashupBegin"></span> - <span class="Ldt-Annotation-MashupEnd"></span>)</span></h3>' +
+      '<div class="Ldt-Annotation-Cleared Ldt-Annotation-HiddenWhenMinimized Ldt-Annotation-HiddenWhenEmpty Ldt-Annotation-Creator-Block"><div class="Ldt-Annotation-Label">{{l10n.creator_}}</div>' +
+      '{{#show_creator}}<p class="Ldt-Annotation-Labelled Ldt-Annotation-Creator"></p></div>{{/show_creator}}' +
+      '{{#show_description}}<div class="Ldt-Annotation-Cleared Ldt-Annotation-HiddenWhenMinimized Ldt-Annotation-HiddenWhenEmpty Ldt-Annotation-Description-Block"><div class="Ldt-Annotation-Label">{{l10n.description_}}</div>' +
+      '<p class="Ldt-Annotation-Labelled Ldt-Annotation-Description"></p></div>{{/show_description}}' +
+      '<div class="Ldt-Annotation-Tags-Block Ldt-Annotation-HiddenWhenMinimized Ldt-Annotation-HiddenWhenEmpty Ldt-Annotation-Cleared">' +
+      '<div class="Ldt-Annotation-Label">{{l10n.tags_}}</div><ul class="Ldt-Annotation-Labelled Ldt-Annotation-Tags"></ul>' +
+      "</div></div></div></div>";
 
-IriSP.Widgets.Annotation.prototype.defaults = {
-    annotation_type : "chap",
-    start_minimized: false,
-    show_arrow : true,
-    show_creator: true,
-    show_description: true,
-    arrow_position: .5,
-    site_name : "Lignes de Temps",
-    search_on_tag_click: true,
-    show_social: true,
-    show_annotation_type: false
-};
+    static defaults = {
+      annotation_type: "chap",
+      start_minimized: false,
+      show_arrow: true,
+      show_creator: true,
+      show_description: true,
+      arrow_position: 0.5,
+      site_name: "Lignes de Temps",
+      search_on_tag_click: true,
+      show_social: true,
+      show_annotation_type: false,
+    };
 
-IriSP.Widgets.Annotation.prototype.draw = function() {
-    
-    var _this = this,
+    draw() {
+      var _this = this,
         currentAnnotation;
-    
-    function timeupdate(_time) {
+
+      function timeupdate(_time) {
         var _list = _this.getWidgetAnnotationsAtTime();
         if (!_list.length) {
-            _this.$.find(".Ldt-Annotation-Inner").addClass("Ldt-Annotation-Empty");
-            if (_this.arrow) {
-                _this.arrow.moveToTime(_time);
-            }
-            _this.bounds = [ _time, _time ];
-            _this.sendBounds();
+          _this.$.find(".Ldt-Annotation-Inner").addClass(
+            "Ldt-Annotation-Empty"
+          );
+          if (_this.arrow) {
+            _this.arrow.moveToTime(_time);
+          }
+          _this.bounds = [_time, _time];
+          _this.sendBounds();
         }
-    }
-    
-    function highlightTitleAndDescription() {
+      }
+
+      function highlightTitleAndDescription() {
         if (!currentAnnotation) {
-            return;
+          return;
         }
         var title = currentAnnotation.title,
-            description = currentAnnotation.description.replace(/(^\s+|\s+$)/g,''),
-            rx = (currentAnnotation.found ? (_this.source.getAnnotations().regexp || false) : false);
-        _this.$.find(".Ldt-Annotation-Title").html(IriSP.textFieldHtml(title,rx)  || "(" + _this.l10n.untitled + ")");
+          description = currentAnnotation.description.replace(
+            /(^\s+|\s+$)/g,
+            ""
+          ),
+          rx = currentAnnotation.found
+            ? _this.source.getAnnotations().regexp || false
+            : false;
+        _this.$.find(".Ldt-Annotation-Title").html(
+          IriSP.textFieldHtml(title, rx) || "(" + _this.l10n.untitled + ")"
+        );
         if (description) {
-            _this.$.find(".Ldt-Annotation-Description-Block").removeClass("Ldt-Annotation-EmptyBlock");
-            _this.$.find(".Ldt-Annotation-Description").html(IriSP.textFieldHtml(description,rx));
+          _this.$.find(".Ldt-Annotation-Description-Block").removeClass(
+            "Ldt-Annotation-EmptyBlock"
+          );
+          _this.$.find(".Ldt-Annotation-Description").html(
+            IriSP.textFieldHtml(description, rx)
+          );
         } else {
-            _this.$.find(".Ldt-Annotation-Description-Block").addClass("Ldt-Annotation-EmptyBlock");
+          _this.$.find(".Ldt-Annotation-Description-Block").addClass(
+            "Ldt-Annotation-EmptyBlock"
+          );
         }
-    }
-    
-    function drawAnnotation(_annotation) {
+      }
+
+      function drawAnnotation(_annotation) {
         currentAnnotation = _annotation;
-        var _url = (typeof _annotation.url !== "undefined" 
-                ? _annotation.url
-                : (document.location.href.replace(/#.*$/,'') + '#id='  + _annotation.id)),
-            _text = _this.l10n.watching + _annotation.title + (_this.site_name ? _this.l10n.on_site + _this.site_name : ''),
-            _tags = _annotation.getTags(),
-            _tagblock = _this.$.find(".Ldt-Annotation-Tags");
+        var _url =
+            typeof _annotation.url !== "undefined"
+              ? _annotation.url
+              : document.location.href.replace(/#.*$/, "") +
+                "#id=" +
+                _annotation.id,
+          _text =
+            _this.l10n.watching +
+            _annotation.title +
+            (_this.site_name ? _this.l10n.on_site + _this.site_name : ""),
+          _tags = _annotation.getTags(),
+          _tagblock = _this.$.find(".Ldt-Annotation-Tags");
         _tagblock.empty();
         if (_tags.length) {
-            _this.$.find(".Ldt-Annotation-Tags-Block").removeClass("Ldt-Annotation-EmptyBlock");
-            _tags.forEach(function(_tag) {
-                var _trimmedTitle =  _tag.title.replace(/(^\s+|\s+$)/g,'');
-                if (_trimmedTitle) {
-                    var _el = IriSP.jQuery('<li class="Ldt-Annotation-TagLabel"></li>').append(IriSP.jQuery('<span>').text(_trimmedTitle));
-                    _el.click(function() {
-                        if (_this.search_on_tag_click) {
-                            _this.source.getAnnotations().search(_trimmedTitle);
-                        }
-                        _tag.trigger("click");
-                    });
-                    _tagblock.append(_el);
+          _this.$.find(".Ldt-Annotation-Tags-Block").removeClass(
+            "Ldt-Annotation-EmptyBlock"
+          );
+          _tags.forEach(function (_tag) {
+            var _trimmedTitle = _tag.title.replace(/(^\s+|\s+$)/g, "");
+            if (_trimmedTitle) {
+              var _el = IriSP.jQuery(
+                '<li class="Ldt-Annotation-TagLabel"></li>'
+              ).append(IriSP.jQuery("<span>").text(_trimmedTitle));
+              _el.click(function () {
+                if (_this.search_on_tag_click) {
+                  _this.source.getAnnotations().search(_trimmedTitle);
                 }
-            });
+                _tag.trigger("click");
+              });
+              _tagblock.append(_el);
+            }
+          });
         } else {
-            _this.$.find(".Ldt-Annotation-Tags-Block").addClass("Ldt-Annotation-EmptyBlock");
+          _this.$.find(".Ldt-Annotation-Tags-Block").addClass(
+            "Ldt-Annotation-EmptyBlock"
+          );
         }
         highlightTitleAndDescription();
         if (_this.show_creator) {
-             _this.$.find(".Ldt-Annotation-Creator").text(_annotation.creator);
+          _this.$.find(".Ldt-Annotation-Creator").text(_annotation.creator);
         }
         if (_this.show_annotation_type) {
-            _this.$.find(".Ldt-Annotation-Type").text(_annotation.getAnnotationType().title);
-            _this.$.find(".Ldt-Annotation-Type").attr("title", _annotation.getAnnotationType().description);
+          _this.$.find(".Ldt-Annotation-Type").text(
+            _annotation.getAnnotationType().title
+          );
+          _this.$.find(".Ldt-Annotation-Type").attr(
+            "title",
+            _annotation.getAnnotationType().description
+          );
         }
-        _this.$.find(".Ldt-Annotation-Begin").text(_annotation.begin.toString());
+        _this.$.find(".Ldt-Annotation-Begin").text(
+          _annotation.begin.toString()
+        );
         _this.$.find(".Ldt-Annotation-End").text(_annotation.end.toString());
         if (_annotation.elementType === "mashedAnnotation") {
-            _this.$.find('.Ldt-Annotation-Inner').addClass("Ldt-Annotation-isMashup");
-            _this.$.find(".Ldt-Annotation-MashupMedia").text(_annotation.getMedia().title);
-            _this.$.find(".Ldt-Annotation-MashupBegin").text(_annotation.annotation.begin.toString());
-            _this.$.find(".Ldt-Annotation-MashupEnd").text(_annotation.annotation.end.toString());
+          _this.$.find(".Ldt-Annotation-Inner").addClass(
+            "Ldt-Annotation-isMashup"
+          );
+          _this.$.find(".Ldt-Annotation-MashupMedia").text(
+            _annotation.getMedia().title
+          );
+          _this.$.find(".Ldt-Annotation-MashupBegin").text(
+            _annotation.annotation.begin.toString()
+          );
+          _this.$.find(".Ldt-Annotation-MashupEnd").text(
+            _annotation.annotation.end.toString()
+          );
         } else {
-            _this.$.find('.Ldt-Annotation-Inner').removeClass("Ldt-Annotation-isMashup");
+          _this.$.find(".Ldt-Annotation-Inner").removeClass(
+            "Ldt-Annotation-isMashup"
+          );
         }
         if (typeof _this.socialWidget !== "undefined") {
-            _this.socialWidget.updateUrls(_url, _text);
+          _this.socialWidget.updateUrls(_url, _text);
         } else {
-            setTimeout(function() {
-                if (typeof _this.socialWidget !== "undefined") {
-                    _this.socialWidget.updateUrls(_url, _text);
-                }
-            },800);
+          setTimeout(function () {
+            if (typeof _this.socialWidget !== "undefined") {
+              _this.socialWidget.updateUrls(_url, _text);
+            }
+          }, 800);
         }
-        _this.$.find(".Ldt-Annotation-Inner").removeClass("Ldt-Annotation-Empty");
-        _this.bounds = [ _annotation.begin, _annotation.end ];
+        _this.$.find(".Ldt-Annotation-Inner").removeClass(
+          "Ldt-Annotation-Empty"
+        );
+        _this.bounds = [_annotation.begin, _annotation.end];
         if (_this.arrow) {
-            _this.arrow.moveToTime((1 - _this.arrow_position) * _annotation.begin + _this.arrow_position * _annotation.end);
+          _this.arrow.moveToTime(
+            (1 - _this.arrow_position) * _annotation.begin +
+              _this.arrow_position * _annotation.end
+          );
         }
         _this.sendBounds();
-    }
-    
-    this.renderTemplate();
-    
-    this.$.find(".Ldt-Annotation-Title").click(function() {
+      }
+
+      this.renderTemplate();
+
+      this.$.find(".Ldt-Annotation-Title").click(function () {
         if (currentAnnotation) {
-            _this.media.setCurrentTime(currentAnnotation.begin);
+          _this.media.setCurrentTime(currentAnnotation.begin);
         }
         return false;
-    });
-    
-    if (this.show_social) {
-        this.insertSubwidget(this.$.find(".Ldt-Annotation-Social"), { type: "Social" }, "socialWidget");
-    }
-    
-    if (this.show_arrow) {
-        this.insertSubwidget(this.$.find(".Ldt-Annotation-Arrow"), { type: "Arrow", width: this.width }, "arrow");
-    }
-    this.onMediaEvent("timeupdate",timeupdate);
-    this.onMdpEvent("Annotation.hide","hide");
-    this.onMdpEvent("Annotation.show","show");
-    this.onMdpEvent("Annotation.minimize","minimize");
-    this.onMdpEvent("Annotation.maximize","maximize");
-    this.onMdpEvent("Annotation.getBounds","sendBounds");
-    this.$.find(".Ldt-Annotation-MaxMinButton").click(this.functionWrapper("toggleSize"));
-    this.$.on("resize", function () { _this.width = _this.$.parent().width();
-                                      _this.$.css({ width: _this.width });
-                                    });
-    this.getWidgetAnnotations().forEach(function(_a) {
-        _a.on("enter", function() {
-            drawAnnotation(_a);
+      });
+
+      if (this.show_social) {
+        this.insertSubwidget(
+          this.$.find(".Ldt-Annotation-Social"),
+          { type: "Social" },
+          "socialWidget"
+        );
+      }
+
+      if (this.show_arrow) {
+        this.insertSubwidget(
+          this.$.find(".Ldt-Annotation-Arrow"),
+          { type: "Arrow", width: this.width },
+          "arrow"
+        );
+      }
+      this.onMediaEvent("timeupdate", timeupdate);
+      this.onMdpEvent("Annotation.hide", "hide");
+      this.onMdpEvent("Annotation.show", "show");
+      this.onMdpEvent("Annotation.minimize", "minimize");
+      this.onMdpEvent("Annotation.maximize", "maximize");
+      this.onMdpEvent("Annotation.getBounds", "sendBounds");
+      this.$.find(".Ldt-Annotation-MaxMinButton").click(
+        this.functionWrapper("toggleSize")
+      );
+      this.$.on("resize", function () {
+        _this.width = _this.$.parent().width();
+        _this.$.css({ width: _this.width });
+      });
+      this.getWidgetAnnotations().forEach(function (_a) {
+        _a.on("enter", function () {
+          drawAnnotation(_a);
         });
-    });
-    this.source.getAnnotations().on("found", highlightTitleAndDescription);
-    this.source.getAnnotations().on("not-found", highlightTitleAndDescription);
-    this.source.getAnnotations().on("search-cleared", highlightTitleAndDescription);
-    IriSP.attachDndData(this.$.find("h3"), function() {
-    	return {
-	    	title: currentAnnotation.title,
-	    	description: currentAnnotation.description,
-	    	image: currentAnnotation.thumbnail,
-	    	uri: (typeof currentAnnotation.url !== "undefined" 
-	            ? currentAnnotation.url
-	            : (document.location.href.replace(/#.*$/,'') + '#id='  + currentAnnotation.id)),
-            text: '[' + currentAnnotation.begin.toString() + '] ' + currentAnnotation.title
-	    };
-    });
-};
+      });
+      this.source.getAnnotations().on("found", highlightTitleAndDescription);
+      this.source
+        .getAnnotations()
+        .on("not-found", highlightTitleAndDescription);
+      this.source
+        .getAnnotations()
+        .on("search-cleared", highlightTitleAndDescription);
+      IriSP.attachDndData(this.$.find("h3"), function () {
+        return {
+          title: currentAnnotation.title,
+          description: currentAnnotation.description,
+          image: currentAnnotation.thumbnail,
+          uri:
+            typeof currentAnnotation.url !== "undefined"
+              ? currentAnnotation.url
+              : document.location.href.replace(/#.*$/, "") +
+                "#id=" +
+                currentAnnotation.id,
+          text:
+            "[" +
+            currentAnnotation.begin.toString() +
+            "] " +
+            currentAnnotation.title,
+        };
+      });
+    }
 
-IriSP.Widgets.Annotation.prototype.sendBounds = function() {
-    this.player.trigger("Annotation.boundsChanged",this.bounds);
-};
-
-IriSP.Widgets.Annotation.prototype.drawAnnotation = function(_annotation) {
-    this.lastAnnotation = _annotation.id;
-
-};
+    sendBounds() {
+      this.player.trigger("Annotation.boundsChanged", this.bounds);
+    }
 
-IriSP.Widgets.Annotation.prototype.hide = function() {
-    this.$.slideUp();
-};
+    drawAnnotation(_annotation) {
+      this.lastAnnotation = _annotation.id;
+    }
+
+    hide() {
+      this.$.slideUp();
+    }
 
-IriSP.Widgets.Annotation.prototype.show = function() {
-    this.$.slideDown();
-};
+    show() {
+      this.$.slideDown();
+    }
 
-IriSP.Widgets.Annotation.prototype.toggleSize = function() {
-    if (this.minimized) {
+    toggleSize() {
+      if (this.minimized) {
         this.maximize();
-    } else {
+      } else {
         this.minimize();
+      }
     }
-};
+
+    minimize() {
+      this.minimized = true;
+      this.$.find(".Ldt-Annotation-Inner").addClass("Ldt-Annotation-Minimized");
+    }
 
-IriSP.Widgets.Annotation.prototype.minimize = function() {
-    this.minimized = true;
-    this.$.find('.Ldt-Annotation-Inner').addClass("Ldt-Annotation-Minimized");
-};
+    maximize() {
+      this.minimized = false;
+      this.$.find(".Ldt-Annotation-Inner").removeClass(
+        "Ldt-Annotation-Minimized"
+      );
+    }
+  };
+}
 
-IriSP.Widgets.Annotation.prototype.maximize = function() {
-    this.minimized = false;
-    this.$.find('.Ldt-Annotation-Inner').removeClass("Ldt-Annotation-Minimized");
-};
+export { Annotation , annotationStyles };
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/widgets/Annotation.module.css	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,132 @@
+.Ldt-Annotation-Widget {
+    border-style: none solid solid;
+    border-width: 1px;
+    border-color: #b7b7b7;
+    padding: 0 1px 1px;
+    margin: 0;
+}
+
+.Ldt-Annotation-Widget.Ldt-Annotation-ShowTop {
+    border-top-style: solid;
+    padding-top: 1px;
+}
+
+.Ldt-Annotation-Inner {
+    background: url(img/pinstripe.png);
+    padding: 5px;
+    margin: 0;
+}
+
+.Ldt-Annotation-Inner h3 {
+    margin: 5px 0;
+    font-size: 14px;
+    font-weight: bold;
+}
+
+.Ldt-Annotation-Description {
+    max-height: 150px;
+    overflow: auto;
+}
+
+.Ldt-Annotation-Cleared {
+    clear: both;
+}
+
+.Ldt-Annotation-MaxMinButton {
+    float: right; margin: 5px 5px 0; width: 17px; height: 17px;
+    background: url(./img/widget-control.png); background-position: 0 -51px; cursor: pointer;
+}
+
+.Ldt-Annotation-Social {
+    float: right;
+}
+
+.Ldt-Annotation-MaxMinButton:hover {
+    background-position: -17px -51px;
+}
+
+.Ldt-Annotation-Minimized div.Ldt-Annotation-MaxMinButton {
+    background-position: 0 -34px;
+}
+
+.Ldt-Annotation-Minimized div.Ldt-Annotation-MaxMinButton:hover {
+    background-position: -17px -34px;
+}
+
+.Ldt-Annotation-Inner h3.Ldt-Annotation-MashupOrigin {
+    font-size: 12px;
+}
+
+.Ldt-Annotation-Title, .Ldt-Annotation-MashupMedia {
+    color: #0068c4;
+    text-decoration: none;
+}
+
+.Ldt-Annotation-Type {
+    color: #8080A0;
+}
+
+.Ldt-Annotation-Time {
+    color: #ff3b77
+}
+
+.Ldt-Annotation-Inner p {
+    font-size: 12px;
+    line-height: 16px;
+}
+
+.Ldt-Annotation-Label {
+    font-size: 12px; font-weight: bold; max-width: 90px; float: left; clear: left;
+}
+
+.Ldt-Annotation-Labelled {
+    margin: 5px 0 0 90px; clear: right;
+}
+
+.Ldt-Annotation-Tags-Block {
+    font-size: 12px;
+}
+
+ul.Ldt-Annotation-Tags {
+    list-style: none; padding: 0;
+}
+
+li.Ldt-Annotation-TagLabel {
+    display: inline-block; border: none; margin: 0 10px 5px 0; height: 23px; padding: 0 0 0 20px;
+    background: url(img/tag.png) left top no-repeat;
+    cursor: pointer;
+}
+
+.Ldt-Annotation-TagLabel span {
+    display: inline-block; font-size: 12px; height: 19px; padding: 4px 5px 0 0; border: none; margin: 0;
+    background: url(img/tag.png) right top no-repeat;
+}
+
+li.Ldt-Annotation-TagLabel:hover {
+    background-position: left -23px;
+}
+
+.Ldt-Annotation-TagLabel:hover span {
+    background-position: right -23px;
+}
+
+.Ldt-Annotation-MashupOrigin {
+    display: none;
+}
+
+.Ldt-Annotation-isMashup .Ldt-Annotation-MashupOrigin {
+    display: block;
+}
+
+.Ldt-Annotation-Empty .Ldt-Annotation-HiddenWhenEmpty {
+    display: none;
+}
+
+.Ldt-Annotation-Minimized .Ldt-Annotation-HiddenWhenMinimized {
+    display: none;
+}
+
+.Ldt-Annotation-EmptyBlock {
+    display: none;
+}
+
--- a/src/widgets/AnnotationsController.css	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,43 +0,0 @@
-
-.Ldt-AnnotationsController{
-	background: url(img/pinstripe.png);
-	width: 535px;
-    max-height: 280px;
-	margin: 0px;
-	margin-top: 4px;
-	border-style: solid;
-    border-width: 1px;
-    border-color: #b7b7b7;
-}
-
-.Ldt-AnnotationsController-ButtonsContainer{
-	width: 100%;
-	min-height: 30px;
-	text-align: center;
-}
-
-.Ldt-AnnotationsController-Button{
-	display: inline-block;
-    background-color: #d93c71;
-    color: #ffffff;
-    cursor: pointer;
-    height: 25px;
-    width: 150px;
-    font-size: 14px;
-    border: 1px solid;
-    border-color: #eca3bc #631e34 #36101c #e16e93;
-    cursor: pointer;
-    margin-right: 10px;
-    margin-left: 10px;
-    margin-bottom: 5px;
-    margin-top: 5px;
-    padding: 4px;
-    text-align: center;
-	vertical-align: middle;
-	line-height: 30px;
-}
-
-.Ldt-AnnotationsController-Button:hover{
-	background-color: #e15581;
-	border-color: #222222 #e87d9f #f0adc3 #68273c;
-}
\ No newline at end of file
--- a/src/widgets/AnnotationsController.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/widgets/AnnotationsController.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,219 +1,220 @@
-/* 
+/*
  * Widget that ties AnnotationList and CreateAnnotation together
  * using buttons to hide/show AnnotationList and CreateAnnotation widgets.
- * 
+ *
  */
+import annotationsControllerStyles from "./AnnotationsController.module.css";
+
+const AnnotationsController = function (ns) {
+  return class extends ns.Widgets.Widget {
+    constructor(player, config) {
+      super(player, config);
+    }
 
-IriSP.Widgets.AnnotationsController = function(player, config){
-    IriSP.Widgets.Widget.call(this, player, config);
-};
-
-IriSP.Widgets.AnnotationsController.prototype = new IriSP.Widgets.Widget();
+    static defaults = {
+      // If true, displaying AnnotationList will hide CreateAnnotation and vice versa.
+      display_or_write: false,
+      toggle_widgets: false,
+      starts_hidden: false,
+      hide_without_segment: false,
+      hide_when_writing: true,
+      starting_widget: false,
+      always_show_widget: false,
+      segments_annotation_type: "chap",
+      custom_write_text: false,
+      custom_display_text: false,
+    };
 
-IriSP.Widgets.AnnotationsController.prototype.defaults = {
-    // If true, displaying AnnotationList will hide CreateAnnotation and vice versa.
-    display_or_write: false,
-    toggle_widgets: false,
-    starts_hidden: false,
-    hide_without_segment: false,
-    hide_when_writing: true,
-    starting_widget: false,
-    always_show_widget: false,
-    segments_annotation_type: "chap",
-    custom_write_text: false,
-    custom_display_text: false,
-};
+    static template =
+      "<div class='Ldt-AnnotationsController'>" +
+      "<div class='Ldt-AnnotationsController-ButtonsContainer'>" +
+      "    <div class='Ldt-AnnotationsController-Button Ldt-AnnotationsController-ShowCreateAnnotationButton'>{{#custom_write_text}}{{/custom_write_text}}{{custom_write_text}}{{^custom_write_text}}{{l10n.write}}{{/custom_write_text}}</div>" +
+      "    <div class='Ldt-AnnotationsController-Button Ldt-AnnotationsController-ShowAnnotationsListButton'>{{#custom_display_text}}{{/custom_display_text}}{{custom_display_text}}{{^custom_display_text}}{{l10n.display}}{{/custom_display_text}}</div>" +
+      "</div>" +
+      "</div>";
 
-IriSP.Widgets.AnnotationsController.prototype.template = 
-    "<div class='Ldt-AnnotationsController'>"
-    + "<div class='Ldt-AnnotationsController-ButtonsContainer'>"
-    + "    <div class='Ldt-AnnotationsController-Button Ldt-AnnotationsController-ShowCreateAnnotationButton'>{{#custom_write_text}}{{/custom_write_text}}{{custom_write_text}}{{^custom_write_text}}{{l10n.write}}{{/custom_write_text}}</div>"
-    + "    <div class='Ldt-AnnotationsController-Button Ldt-AnnotationsController-ShowAnnotationsListButton'>{{#custom_display_text}}{{/custom_display_text}}{{custom_display_text}}{{^custom_display_text}}{{l10n.display}}{{/custom_display_text}}</div>"
-    + "</div>"
-    + "</div>"
+    static messages =  {
+      en: {
+        write: "Write",
+        display: "Display",
+      },
+      fr: {
+        write: "Ecrire",
+        display: "Voir",
+      },
+    };
 
-IriSP.Widgets.AnnotationsController.prototype.messages = {
-    en : {
-        write : "Write",
-        display : "Display",
-    },
-    fr : {
-        write : "Ecrire",
-        display : "Voir"
-    }
-};
+    draw() {
+      this.renderTemplate();
+      var _this = this;
+      this.element_$ = this.$.find(".Ldt-AnnotationsController");
 
-IriSP.Widgets.AnnotationsController.prototype.draw = function() { 
-    this.renderTemplate();
-    var _this = this;
-    this.element_$ = this.$.find(".Ldt-AnnotationsController")
-    
-    this.displayButton_$ = this.$.find(".Ldt-AnnotationsController-ShowAnnotationsListButton");
-    this.writeButton_$ = this.$.find(".Ldt-AnnotationsController-ShowCreateAnnotationButton");
-    
-    this.writeButton_$.click(function(){
-        if (!_this.writeButton_$.hasClass("selected")){
-            _this.player.trigger("CreateAnnotation.show")
-            if (_this.display_or_write){
-                _this.player.trigger("AnnotationsList.hide");
-            }
-        }
-        else {
-            _this.player.trigger("CreateAnnotation.hide")
-            if (_this.toggle_widgets){
-                _this.player.trigger("AnnotationsList.show")
-            }
-            else if (_this.display_or_write){
-                _this.player.trigger("AnnotationsList.hide");
-            }
+      this.displayButton_$ = this.$.find(
+        ".Ldt-AnnotationsController-ShowAnnotationsListButton"
+      );
+      this.writeButton_$ = this.$.find(
+        ".Ldt-AnnotationsController-ShowCreateAnnotationButton"
+      );
+
+      this.writeButton_$.click(function () {
+        if (!_this.writeButton_$.hasClass("selected")) {
+          _this.player.trigger("CreateAnnotation.show");
+          if (_this.display_or_write) {
+            _this.player.trigger("AnnotationsList.hide");
+          }
+        } else {
+          _this.player.trigger("CreateAnnotation.hide");
+          if (_this.toggle_widgets) {
+            _this.player.trigger("AnnotationsList.show");
+          } else if (_this.display_or_write) {
+            _this.player.trigger("AnnotationsList.hide");
+          }
         }
-    });
-    this.displayButton_$.click(function(){
-        if (!_this.displayButton_$.hasClass("selected")){
-            _this.player.trigger("AnnotationsList.show")
-            if (_this.display_or_write){
-                _this.player.trigger("CreateAnnotation.hide");
-            }
-        }
-        else {
-            _this.player.trigger("AnnotationsList.hide")
-            if (_this.toggle_widgets){
-                _this.player.trigger("CreateAnnotation.show")
-            }
-            else if (_this.display_or_write){
-                _this.player.trigger("CreateAnnotation.hide");
-            }
+      });
+      this.displayButton_$.click(function () {
+        if (!_this.displayButton_$.hasClass("selected")) {
+          _this.player.trigger("AnnotationsList.show");
+          if (_this.display_or_write) {
+            _this.player.trigger("CreateAnnotation.hide");
+          }
+        } else {
+          _this.player.trigger("AnnotationsList.hide");
+          if (_this.toggle_widgets) {
+            _this.player.trigger("CreateAnnotation.show");
+          } else if (_this.display_or_write) {
+            _this.player.trigger("CreateAnnotation.hide");
+          }
         }
-        
-    })
-    
-    if(this.hide_without_segment){
-        this.onMediaEvent("timeupdate", function(){
-            _this.refresh();
-        })
-        this.onMediaEvent("settimerange", function(_timeRange){
-            _this.refresh(_timeRange);
-        })
-        this.segments = this.source.getAnnotationsByTypeTitle(this.segments_annotation_type)
-        this.currentSegment = false
-    }
-    
+      });
 
-    this.createAnnotationEnabled = false;
-    this.onMdpEvent("CreateAnnotation.hide", function(){
-        if (_this.hide_when_writing){
-            _this.show()
+      if (this.hide_without_segment) {
+        this.onMediaEvent("timeupdate", function () {
+          _this.refresh();
+        });
+        this.onMediaEvent("settimerange", function (_timeRange) {
+          _this.refresh(_timeRange);
+        });
+        this.segments = this.source.getAnnotationsByTypeTitle(
+          this.segments_annotation_type
+        );
+        this.currentSegment = false;
+      }
+
+      this.createAnnotationEnabled = false;
+      this.onMdpEvent("CreateAnnotation.hide", function () {
+        if (_this.hide_when_writing) {
+          _this.show();
         }
         _this.createAnnotationEnabled = false;
         _this.writeButton_$.toggleClass("selected", false);
-    })
-    this.onMdpEvent("CreateAnnotation.show", function(){
-        if (_this.hide_when_writing){
-            _this.hide()
+      });
+      this.onMdpEvent("CreateAnnotation.show", function () {
+        if (_this.hide_when_writing) {
+          _this.hide();
         }
         _this.createAnnotationEnabled = true;
         _this.writeButton_$.toggleClass("selected", true);
-    })
-    this.onMdpEvent("AnnotationsList.hide", function(){
+      });
+      this.onMdpEvent("AnnotationsList.hide", function () {
         _this.displayButton_$.toggleClass("selected", false);
-    })
-    this.onMdpEvent("AnnotationsList.show", function(){
+      });
+      this.onMdpEvent("AnnotationsList.show", function () {
         _this.displayButton_$.toggleClass("selected", true);
-    })
-    
-    if (this.starts_hidden) {
-        this.visible = true
+      });
+
+      if (this.starts_hidden) {
+        this.visible = true;
         this.hide();
+      } else {
+        this.visible = false;
+        this.show();
+      }
+
+      if (this.starting_widget && this.visible) {
+        if (this.starting_widget == "AnnotationsList") {
+          this.player.trigger("AnnotationsList.show");
+        } else if (this.starting_widget == "CreateAnnotation") {
+          this.player.trigger("CreateAnnotation.show");
+        }
+      }
     }
-    else{
-        this.visible = false
-        this.show();
+
+    refresh(_timeRange) {
+      _timeRange = typeof _timeRange !== "undefined" ? _timeRange : false;
+
+      if (!_timeRange) {
+        if (this.media.getTimeRange()) {
+          _timeRange = this.media.getTimeRange();
+        }
+      }
+
+      if (this.hide_without_segment) {
+        if (!_timeRange && !this.media.getTimeRange()) {
+          _currentTime = this.media.getCurrentTime();
+          _currentSegments = this.segments.filter(function (_segment) {
+            return (
+              _currentTime >= _segment.begin && _currentTime <= _segment.end
+            );
+          });
+          if (_currentSegments.length > 0) {
+            currentSegment = true;
+          } else {
+            currentSegment = false;
+          }
+        } else {
+          var _timeRangeBegin = _timeRange[0],
+            _timeRangeEnd = _timeRange[1];
+          _currentSegments = this.segments.filter(function (_segment) {
+            return (
+              _timeRangeBegin == _segment.begin && _timeRangeEnd == _segment.end
+            );
+          });
+          if (_currentSegments.length > 0) {
+            currentSegment = true;
+          } else {
+            currentSegment = false;
+          }
+        }
+        if (!currentSegment && _currentSegments.length == 0) {
+          if (this.visible || this.hide_when_writing) {
+            this.writeButton_$.toggleClass("selected", false);
+            this.displayButton_$.toggleClass("selected", false);
+            this.player.trigger("CreateAnnotation.hide");
+            this.player.trigger("AnnotationsList.hide");
+            this.hide();
+          }
+        } else {
+          if (!this.visible) {
+            if (!this.createAnnotationEnabled) {
+              this.show();
+            }
+            this.writeButton_$.toggleClass("selected", false);
+            this.displayButton_$.toggleClass("selected", false);
+            if (this.starting_widget == "AnnotationsList") {
+              this.player.trigger("AnnotationsList.show");
+            }
+            if (this.starting_widget == "CreateAnnotation") {
+              this.player.trigger("CreateAnnotation.show");
+            }
+          }
+        }
+      }
     }
-    
-    if (this.starting_widget && this.visible){
-        if (this.starting_widget == "AnnotationsList"){
-            this.player.trigger("AnnotationsList.show")
-        }
-        else if (this.starting_widget == "CreateAnnotation"){
-            this.player.trigger("CreateAnnotation.show")
-        }
+
+    hide() {
+      if (this.visible) {
+        this.visible = false;
+        this.element_$.hide();
+      }
     }
-    
+
+    show() {
+      if (!this.visible) {
+        this.visible = true;
+        this.element_$.show();
+      }
+    }
+  };
 };
 
-IriSP.Widgets.AnnotationsController.prototype.refresh = function(_timeRange){
-    _timeRange = typeof _timeRange !== 'undefined' ? _timeRange : false ;
-    
-    if(!_timeRange){
-        if (this.media.getTimeRange()){
-            _timeRange = this.media.getTimeRange();
-        }
-    }
-    
-    if (this.hide_without_segment){
-        if (!_timeRange && !this.media.getTimeRange()){
-            _currentTime = this.media.getCurrentTime() 
-            _currentSegments = this.segments.filter(function(_segment){
-                return (_currentTime >= _segment.begin && _currentTime <= _segment.end)
-            });
-            if(_currentSegments.length > 0){
-                currentSegment = true;
-            }
-            else {
-                currentSegment = false;
-            }
-        }
-        else {
-            var _timeRangeBegin = _timeRange[0],
-                _timeRangeEnd = _timeRange[1];
-            _currentSegments = this.segments.filter(function(_segment){
-                return (_timeRangeBegin == _segment.begin && _timeRangeEnd == _segment.end)
-            });
-            if(_currentSegments.length > 0){
-                currentSegment = true;
-            }
-            else {
-                currentSegment = false;
-            }
-        }
-        if (!currentSegment && _currentSegments.length == 0){
-            if (this.visible || this.hide_when_writing){
-                this.writeButton_$.toggleClass("selected", false);
-                this.displayButton_$.toggleClass("selected", false);
-                this.player.trigger("CreateAnnotation.hide");
-                this.player.trigger("AnnotationsList.hide");
-                this.hide();
-            }
-        }
-        else {
-            if (!this.visible){
-                if (!this.createAnnotationEnabled){
-                    this.show();
-                }
-                this.writeButton_$.toggleClass("selected", false);
-                this.displayButton_$.toggleClass("selected", false);
-                if (this.starting_widget == "AnnotationsList"){
-                    this.player.trigger("AnnotationsList.show")
-                }
-                if (this.starting_widget == "CreateAnnotation"){
-                    this.player.trigger("CreateAnnotation.show")
-                }
-            }
-            
-        }
-    }
-}
-
-IriSP.Widgets.AnnotationsController.prototype.hide = function() {
-    if (this.visible){
-        this.visible = false;
-        this.element_$.hide();
-    }
-}
-
-IriSP.Widgets.AnnotationsController.prototype.show = function() {
-    if(!this.visible){
-        this.visible = true;
-        this.element_$.show();
-    }
-}
+export { AnnotationsController, annotationsControllerStyles };
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/widgets/AnnotationsController.module.css	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,43 @@
+
+.Ldt-AnnotationsController{
+	background: url(img/pinstripe.png);
+	width: 535px;
+    max-height: 280px;
+	margin: 0px;
+	margin-top: 4px;
+	border-style: solid;
+    border-width: 1px;
+    border-color: #b7b7b7;
+}
+
+.Ldt-AnnotationsController-ButtonsContainer{
+	width: 100%;
+	min-height: 30px;
+	text-align: center;
+}
+
+.Ldt-AnnotationsController-Button{
+	display: inline-block;
+    background-color: #d93c71;
+    color: #ffffff;
+    cursor: pointer;
+    height: 25px;
+    width: 150px;
+    font-size: 14px;
+    border: 1px solid;
+    border-color: #eca3bc #631e34 #36101c #e16e93;
+    cursor: pointer;
+    margin-right: 10px;
+    margin-left: 10px;
+    margin-bottom: 5px;
+    margin-top: 5px;
+    padding: 4px;
+    text-align: center;
+	vertical-align: middle;
+	line-height: 30px;
+}
+
+.Ldt-AnnotationsController-Button:hover{
+	background-color: #e15581;
+	border-color: #222222 #e87d9f #f0adc3 #68273c;
+}
\ No newline at end of file
--- a/src/widgets/AnnotationsList.css	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,254 +0,0 @@
-/* AnnotationsListWidget */
-
-#ui-datepicker-div
-{
-    display: none;
-}
-
-.Ldt-AnnotationsListWidget {
-    border: none; 
-    margin: 0; 
-    padding: 0;
-    overflow: auto;
-}
-.Ldt-AnnotationsListWidget a {
-    text-decoration: none;
-}
-
-.Ldt-AnnotationsList-Audio {
-    width: 1px; height: 1px;
-}
-
-.Ldt-AnnotationsList-Filters {
-	display: table-cell;
-	width: 100%;
-	height: 30px;
-	vertical-align: middle;
-    text-align: center;
-	
-}
-
-.Ldt-AnnotationsList-filter-text {
-    text-align: left;
-	display: inline;
-	margin: 4px 2px;
-}
-
-.Ldt-AnnotationsList-filter-dropdown {
-    text-align: center;
-	display: inline;
-	margin: 4px 2px;
-}
-
-.Ldt-AnnotationsList-filter-checkbox {
-    text-align: center;
-	display: inline;
-	margin: 4px 2px;
-}
-
-ul.Ldt-AnnotationsList-ul, ul.Ldt-AnnotationsList-ul-toDelete  {
-    list-style: none;
-    padding: 0px;
-    margin: 0px;
-}
-
-li.Ldt-AnnotationsList-li {
-    width: 100%;
-    clear: both;
-    margin: 2px 0;
-    padding: 2px 0;
-    min-height: 3em;
-    position: relative;
-}
-.Ldt-AnnotationsList-li.selected {
-    background-image: url(img/pinstripe-grey.png);
-    z-index: 1;
-}
-.Ldt-AnnotationsList-ThumbContainer {
-    float: left;
-    width: 80px;
-    height: 50px;
-    text-align: center;
-    margin: 0px 2px 10px 2px;
-    box-shadow: #808080 0px 0px 2px;
-}
-.Ldt-AnnotationsList-Thumbnail {
-    border: none;
-    max-width: 100%;
-    max-height: 100%;
-    margin: 0 auto;
-}
-
-.Ldt-AnnotationsList-External-Icon {
-	background-image: url(img/external.png);
-	z-index: 100;
-	height: 15px;
-	width: 15px;
-	position: relative;
-	bottom: 20px;
-	left: 64px;
-}
-
-.Ldt-AnnotationsList-DeleteButton {
-	margin: 0px;
-	float: right;
-	font-size: 20px;
-	position: relative;
-	top: -50px;
-	left: -5px;
-	color: #787878
-}
-.Ldt-AnnotationsList-DeleteButton:hover {
-	color: #f7268e;
-	cursor: pointer;
-}
-
-.Ldt-AnnotationsList-Duration {
-    color: #f7268e;
-    float: right;
-    text-align: right;
-    font-size: 12px;
-    margin: 2px;
-}
-.Ldt-AnnotationsList-CreationDate {
-    color: #f7268e;
-    text-align: left;
-    font-size: 12px;
-    margin: 2px 2px 2px 89px;
-}
-h3.Ldt-AnnotationsList-Title span.Ldt-AnnotationsList-TitleContent{
-    color: #0068c4;
-    font-size: 13px;
-    margin-left: 5px;
-    font-weight: bold;
-}
-
-h3.Ldt-AnnotationsList-Title.Ldt-Annotation-Timecode{	
-    font-size: 13px;
-}
-
-.Ldt-AnnotationsList-Title a {
-    color: #0068c4;
-}
-
-.Ldt-AnnotationsList-Creator {
-    color: #4d90f4;
-    margin-left: 5px;
-    font-size: 13px;
-}
-
-p.Ldt-AnnotationsList-Description {
-    margin: 2px 0 2px 89px;
-    font-size: 12px;
-    color: #333333;
-}
-
-.Ldt-AnnotationsList-Description a {
-    color: #0068c4;
-}
-
-.Ldt-AnnotationsList-Description a:hover {
-    text-decoration: underline; color: #800000;
-}
-
-ul.Ldt-AnnotationsList-Tags {
-    list-style: none;
-    padding: 0;
-    margin: 2px 0 0 82px;
-}
-
-li.Ldt-AnnotationsList-Tag-Li {
-    display: inline-block; border: none; margin: 0 10px 5px 0; height: 23px; padding: 0 0 0 20px;
-    background: url(img/tag.png) left top no-repeat;
-    cursor: pointer;
-}
-
-.Ldt-AnnotationsList-Tag-Li span {
-    display: inline-block; font-size: 12px; height: 19px; padding: 4px 5px 0 0; border: none; margin: 0;
-    background: url(img/tag.png) right top no-repeat;
-}
-
-li.Ldt-AnnotationsList-Tag-Li:hover {
-    background-position: left -23px;
-}
-
-.Ldt-AnnotationsList-Tag-Li:hover span {
-    background-position: right -23px;
-}
-
-.Ldt-AnnotationsList-Play {
-    width: 125px; height: 20px; margin: 2px 0 2px 82px; text-align: center;
-    padding: 3px 5px 0 20px; font-size: 12px; cursor: pointer;
-    background: url(img/voiceannotation.png); color: #333333;
-}
-
-.Ldt-AnnotationsList-Play:hover {
-    background-position: 0 bottom;
-}
-
-.Ldt-AnnotationsList-EditControls {
-    opacity: 0;
-    position: absolute;
-    bottom: 2px;
-    right: 8px;
-}
-
-.Ldt-AnnotationsList-li:hover .Ldt-AnnotationsList-EditControls {
-    display: inline-block;
-    opacity: .8;
-    transition: opacity 1000ms ease-in-out;
-}
-
-.Ldt-AnnotationsList-EditControls > div {
-    display: inline-block;
-    width: 16px;
-    height: 16px;
-    cursor: pointer;
-    margin-left: 8px;
-}
-
-.Ldt-AnnotationsList-Delete {
-    background: url(img/delete.png);
-}
-
-.Ldt-AnnotationsList-Edit {
-    background: url(img/edit.png);
-}
-
-.Ldt-AnnotationsList-PublishAnnotation {
-    background: url(img/publish_annotation.png);
-}
-
-.published .Ldt-AnnotationsList-PublishAnnotation {
-    background: url(img/published_annotation.png);
-}
-
-.Ldt-AnnotationsList .editing {
-    display: none;
-}
-
-.Ldt-AnnotationsList .editableInput {
-    width: 80%;
-}
-
-.Ldt-AnnotationsList-ScreenMain{
-	margin: 0px;
-	padding: 0px;
-}
-
-.Ldt-AnnotationsList-ScreenDelete, .Ldt-AnnotationsList-ScreenSending, 
-.Ldt-AnnotationsList-ScreenError, .Ldt-AnnotationsList-ScreenSuccess{
-	margin-top: 15px;
-	width: 100%
-	text-align: center;
-	vertical-align: middle;
-	font-size: 14px;
-	font-weight: bold;
-	color: #68273C;
-}
-
-a.Ldt-AnnotationsList-Close {
-    position: absolute; right: 2px;
-    display: inline-block; width: 17px; height: 17px; margin: 4px;
-    background: url(img/widget-control.png);
-}
\ No newline at end of file
--- a/src/widgets/AnnotationsList.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/widgets/AnnotationsList.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,156 +1,173 @@
-IriSP.Widgets.AnnotationsList = function(player, config) {
-    IriSP.Widgets.Widget.call(this, player, config);
-    this.lastIds = [];
-    var _this = this;
-    this.throttledRefresh = IriSP._.throttle(function(full) {
+import annotationsListStyles from "./AnnotationsList.module.css";
+
+import Mustache from "mustache";
+import _ from "lodash";
+import jQuery from "jquery";
+
+const AnnotationsList = function (ns) {
+  return class extends ns.Widgets.Widget {
+    constructor(player, config) {
+      super(player, config);
+      this.lastIds = [];
+      var _this = this;
+      this.throttledRefresh = _.throttle(function (full) {
         _this.refresh(full);
-    }, 800);
-    this.searchString = false;
-    this.lastSearch = false;
-    this.localSource = undefined;
-};
+      }, 800);
+      this.searchString = false;
+      this.lastSearch = false;
+      this.localSource = undefined;
+    }
 
-IriSP.Widgets.AnnotationsList.prototype = new IriSP.Widgets.Widget();
-
-IriSP.Widgets.AnnotationsList.prototype.defaults = {
-    pre_draw_callback: function(){
+    static defaults = {
+      pre_draw_callback: function () {
         return this.importUsers();
-    },
-    /*
-     * URL when the annotations are to be reloaded from an LDT-like segment API
-     * e.g.
-     * http://ldt.iri.centrepompidou.fr/ldtplatform/api/ldt/segments/{{media}}/{{begin}}/{{end}}?callback=?
-     */
-    ajax_url : false,
-    /*
-     * number of milliseconds before/after the current timecode when calling the
-     * segment API
-     */
-    ajax_granularity : 600000,
-    default_thumbnail : "",
-    custom_external_icon : "",
-    /*
-     * URL when the annotation is not in the current project, e.g.
-     * http://ldt.iri.centrepompidou.fr/ldtplatform/ldt/front/player/{{media}}/{{project}}/{{annotationType}}#id={{annotation}}
-     */
-    foreign_url : "",
-    annotation_type : false,
-    refresh_interval : 0,
-    limit_count : 20,
-    newest_first : false,
-    show_title: true,
-    show_audio: true,
-    show_creator: true,
-    show_controls: false,
-    show_end_time: true,
-    show_publish: false,
-    show_twitter: false,
-    twitter_hashtag: '',
-    // Callback for Edit action. Leave undefined for default action.
-    on_edit: undefined,
-    publish_type: "PublicContribution",
-    // Used to publish annotations
-    api_endpoint_template: "",
-    api_serializer: "ldt_annotate",
-    api_method: "POST",
-    editable: false,
-    // Id that will be used as localStorage key
-    editable_storage: "",
-    widget_max_height: 680,
-    always_visible : false,
-    start_visible: true,
-    show_audio : true,
-    show_filters : false,
-    keyword_filter: true,
-    date_filter: true,
-    user_filter: true,
-    segment_filter: true,
-    latest_contributions_filter: false,
-    current_day_filter: true,
-    show_header : false,
-    custom_header : false,
-    annotations_count_header : true,
-    annotations_count_header_string: "annotations",
-    show_creation_date : false,
-    show_timecode : true,
-    show_end_time : true,
-    project_id: "",
-    /*
-     * Only annotation in the current segment will be displayed. Designed to work with the Segments Widget.
-     */
-    allow_annotations_deletion: false,
-    /*
-     * URL to call when deleting annotation. Expects a mustache template with {{annotation_id}}, ex /api/anotations/{{annotation_id}}/
-     */
-    api_delete_endpoint : "",
-    api_delete_method: "DELETE",
-    api_users_endpoint: "",
-    api_users_method: "GET",
-    make_name_string_function: function(params){
+      },
+      /*
+       * URL when the annotations are to be reloaded from an LDT-like segment API
+       * e.g.
+       * http://ldt.iri.centrepompidou.fr/ldtplatform/api/ldt/segments/{{media}}/{{begin}}/{{end}}?callback=?
+       */
+      ajax_url: false,
+      /*
+       * number of milliseconds before/after the current timecode when calling the
+       * segment API
+       */
+      ajax_granularity: 600000,
+      default_thumbnail: "",
+      custom_external_icon: "",
+      /*
+       * URL when the annotation is not in the current project, e.g.
+       * http://ldt.iri.centrepompidou.fr/ldtplatform/ldt/front/player/{{media}}/{{project}}/{{annotationType}}#id={{annotation}}
+       */
+      foreign_url: "",
+      annotation_type: false,
+      refresh_interval: 0,
+      limit_count: 20,
+      newest_first: false,
+      show_title: true,
+      show_audio: true,
+      show_creator: true,
+      show_controls: false,
+      show_end_time: true,
+      show_publish: false,
+      show_twitter: false,
+      twitter_hashtag: "",
+      // Callback for Edit action. Leave undefined for default action.
+      on_edit: undefined,
+      publish_type: "PublicContribution",
+      // Used to publish annotations
+      api_endpoint_template: "",
+      api_serializer: "ldt_annotate",
+      api_method: "POST",
+      editable: false,
+      // Id that will be used as localStorage key
+      editable_storage: "",
+      widget_max_height: 680,
+      always_visible: false,
+      start_visible: true,
+      show_audio: true,
+      show_filters: false,
+      keyword_filter: true,
+      date_filter: true,
+      user_filter: true,
+      segment_filter: true,
+      latest_contributions_filter: false,
+      current_day_filter: true,
+      show_header: false,
+      custom_header: false,
+      annotations_count_header: true,
+      annotations_count_header_string: "annotations",
+      show_creation_date: false,
+      show_timecode: true,
+      show_end_time: true,
+      project_id: "",
+      /*
+       * Only annotation in the current segment will be displayed. Designed to work with the Segments Widget.
+       */
+      allow_annotations_deletion: false,
+      /*
+       * URL to call when deleting annotation. Expects a mustache template with {{annotation_id}}, ex /api/anotations/{{annotation_id}}/
+       */
+      api_delete_endpoint: "",
+      api_delete_method: "DELETE",
+      api_users_endpoint: "",
+      api_users_method: "GET",
+      make_name_string_function: function (params) {
         return params.username ? params.username : "Anonymous";
-    },
-    filter_by_segments: false,
-    segment_filter: true,
-    segments_annotation_type: "chap",
-    /*
-     * Set to a username if you only want to display annotations from a given user
-     */
-    show_only_annotation_from_user: false,
-    /*
-     * Show a text field that filter annotations by username
-     */
-    tags : true,
+      },
+      filter_by_segments: false,
+      segment_filter: true,
+      segments_annotation_type: "chap",
+      /*
+       * Set to a username if you only want to display annotations from a given user
+       */
+      show_only_annotation_from_user: false,
+      /*
+       * Show a text field that filter annotations by username
+       */
+      tags: true,
 
-    polemics : [{
-        keyword: "++",
-        background_color: "#c9ecc6"
-    },{
-        keyword: "--",
-        background_color: "#f9c5c6"
-    },{
-        keyword: "??",
-        background_color: "#cec5f9"
-    },{
-        keyword: "==",
-        background_color: "#f9f4c6"
-    }]
-};
+      polemics: [
+        {
+          keyword: "++",
+          background_color: "#c9ecc6",
+        },
+        {
+          keyword: "--",
+          background_color: "#f9c5c6",
+        },
+        {
+          keyword: "??",
+          background_color: "#cec5f9",
+        },
+        {
+          keyword: "==",
+          background_color: "#f9f4c6",
+        },
+      ],
+    };
 
-IriSP.Widgets.AnnotationsList.prototype.importUsers = function(){
-    if (!this.source.users_data && this.api_users_endpoint){
+    importUsers() {
+      if (!this.source.users_data && this.api_users_endpoint) {
         this.usernames = Array();
         var _this = this,
-            _list = this.getWidgetAnnotations(),
-            usernames_list_string = "";
+          _list = this.getWidgetAnnotations(),
+          usernames_list_string = "";
 
-        _list.forEach(function(_annotation){
-            if(_this.usernames.indexOf(_annotation.creator) == -1){
-                _this.usernames.push(_annotation.creator);
-            }
+        _list.forEach(function (_annotation) {
+          if (_this.usernames.indexOf(_annotation.creator) == -1) {
+            _this.usernames.push(_annotation.creator);
+          }
+        });
+        this.usernames.forEach(function (_username) {
+          usernames_list_string += _username + ",";
+        });
+        usernames_list_string = usernames_list_string.substring(
+          0,
+          usernames_list_string.length - 1
+        );
+        _url = Mustache.render(this.api_users_endpoint, {
+          usernames_list_string: encodeURIComponent(usernames_list_string),
+          usernames_list_length: this.usernames.length,
         });
-        this.usernames.forEach(function(_username){
-            usernames_list_string+=_username+","
-        })
-        usernames_list_string = usernames_list_string.substring(0, usernames_list_string.length - 1);
-        _url = Mustache.to_html(this.api_users_endpoint, {usernames_list_string: encodeURIComponent(usernames_list_string), usernames_list_length: this.usernames.length});
-        return IriSP.jQuery.ajax({
-            async: false,
-            url: _url,
-            type: "GET",
-            success: function(_data) {
-                _this.source.users_data = _data.objects
-            },
-            error: function(_xhr, _error, _thrown) {
-                console.log(_xhr)
-                console.log(_error)
-                console.log(_thrown)
-            }
-        })
+        return jQuery.ajax({
+          async: false,
+          url: _url,
+          type: "GET",
+          success: function (_data) {
+            _this.source.users_data = _data.objects;
+          },
+          error: function (_xhr, _error, _thrown) {
+            console.log(_xhr);
+            console.log(_error);
+            console.log(_thrown);
+          },
+        });
+      }
     }
-}
 
-IriSP.Widgets.AnnotationsList.prototype.messages = {
-    en: {
+    static messages =  {
+      en: {
         voice_annotation: "Voice Annotation",
         now_playing: "Now playing...",
         previous: "Previous",
@@ -159,9 +176,12 @@
         edit_annotation: "Edit note",
         delete_annotation: "Delete note",
         publish_annotation: "Make note public",
-        import_annotations: "Paste or load notes in this field and press Import.",
-        confirm_delete_message: "You are about to delete {{ annotation.title }}. Are you sure you want to delete it?",
-        confirm_publish_message: "You are about to publish {{ annotation.title }}. Are you sure you want to make it public?",
+        import_annotations:
+          "Paste or load notes in this field and press Import.",
+        confirm_delete_message:
+          "You are about to delete {{ annotation.title }}. Are you sure you want to delete it?",
+        confirm_publish_message:
+          "You are about to publish {{ annotation.title }}. Are you sure you want to make it public?",
         tweet_annotation: "Tweet annotation",
         external_annotation: "This annotation was submitted to another project",
         everyone: "Everyone",
@@ -174,9 +194,10 @@
         annotation_deletion_delete: "You will delete this annotation",
         annotation_deletion_sending: "Your deletion request is being sent ... ",
         annotation_deletion_success: "The annotation has been deleted.",
-        annotation_deletion_error: "There was an error contacting the server. The annotation has not been deleted."
-    },
-    fr: {
+        annotation_deletion_error:
+          "There was an error contacting the server. The annotation has not been deleted.",
+      },
+      fr: {
         voice_annotation: "Annotation Vocale",
         now_playing: "Lecture en cours...",
         previous: "Précédent",
@@ -185,11 +206,15 @@
         edit_annotation: "Éditer la note",
         delete_annotation: "Supprimer la note",
         publish_annotation: "Rendre la note publique",
-        import_annotations: "Copiez ou chargez des notes dans ce champ et appuyez sur Import",
-        confirm_delete_message: "Vous allez supprimer {{ annotation.title }}. Êtes-vous certain(e) ?",
-        confirm_publish_message: "Vous allez publier {{ annotation.title }}. Êtes-vous certain(e) ?",
+        import_annotations:
+          "Copiez ou chargez des notes dans ce champ et appuyez sur Import",
+        confirm_delete_message:
+          "Vous allez supprimer {{ annotation.title }}. Êtes-vous certain(e) ?",
+        confirm_publish_message:
+          "Vous allez publier {{ annotation.title }}. Êtes-vous certain(e) ?",
         tweet_annotation: "Tweeter l'annotation",
-        external_annotation: "Cette annotation a été postée sur un autre projet",
+        external_annotation:
+          "Cette annotation a été postée sur un autre projet",
         everyone: "Tous",
         header: "Annotations sur ce contenu",
         segment_filter: "Tous les segments",
@@ -198,1017 +223,1217 @@
         confirm: "Confirmer",
         cancel: "Annuler",
         annotation_deletion_delete: "Vous allez supprimer cette annotation",
-        annotation_deletion_sending: "Votre demande de suppression est en cours d'envoi ... ",
+        annotation_deletion_sending:
+          "Votre demande de suppression est en cours d'envoi ... ",
         annotation_deletion_success: "L'annotation a été supprimée.",
-        annotation_deletion_error: "Une erreur s'est produite en contactant le serveur. L'annotation n'a pas été supprimée."
-    }
-};
+        annotation_deletion_error:
+          "Une erreur s'est produite en contactant le serveur. L'annotation n'a pas été supprimée.",
+      },
+    };
 
-IriSP.Widgets.AnnotationsList.prototype.template =
-    '{{#show_header}}<p class="Ldt-AnnotationsList-header">'
-    +     '{{#custom_header}}{{custom_header}}{{/custom_header}}'
-    +     '{{^custom_header}}{{l10n.header}}{{/custom_header}}'
-    + '</p>{{/show_header}}'
-    + '<div class="Ldt-AnnotationsListWidget">'
-    +     '<div class="Ldt-AnnotationsList-ScreenMain">'
-    +         '{{#show_filters}}'
-    +         '<div class="Ldt-AnnotationsList-Filters">'
-    +             '{{#keyword_filter}}<input class="Ldt-AnnotationsList-filter-text" id="Ldt-AnnotationsList-keywordsFilter" type="text" value=""></input>{{/keyword_filter}}'
-    +             '{{#user_filter}}<select class="Ldt-AnnotationsList-filter-dropdown" id="Ldt-AnnotationsList-userFilter"><option selected value="">{{l10n.everyone}}</option></select>{{/user_filter}}'
-    +             '{{#date_filter}}<label class="Ldt-AnnotationsList-filter-date">Date: <input id="Ldt-AnnotationsList-dateFilter" type="text"></input></label>{{/date_filter}}'
-    +             '{{#segment_filter}}<label class="Ldt-AnnotationsList-filter-checkbox"><input type="checkbox" id="Ldt-AnnotationsList-ignoreSegmentsFilter">{{l10n.segment_filter}}</label>{{/segment_filter}}'
-    +             '{{#latest_contributions_filter}}<label class="Ldt-AnnotationsList-filter-checkbox"><input type="checkbox" id="Ldt-AnnotationsList-latestContributionsFilter">{{l10n.latest_contributions}}</label>{{/latest_contributions_filter}}'
-    +         '</div>'
-    +         '{{/show_filters}}'
-    +         '{{#show_controls}}<div class="Ldt-AnnotationsList-Controls"><span class="Ldt-AnnotationsList-Control-Prev">{{ l10n.previous }}</span> | <span class="Ldt-AnnotationsList-Control-Next">{{ l10n.next }}</span></div>{{/show_controls}}'
-    +         '{{#show_audio}}<div class="Ldt-AnnotationsList-Audio"></div>{{/show_audio}}'
-    +         '<ul class="Ldt-AnnotationsList-ul">'
-    +         '</ul>'
-    +     '</div>'    
-    +     '{{#allow_annotations_deletion}}'
-    +     '<div data-annotation="{{id}}" class="Ldt-AnnotationsList-Screen Ldt-AnnotationsList-ScreenDelete">'
-    +         '<a title="{{l10n.close_widget}}" class="Ldt-AnnotationsList-Close" href="#"></a>' 
-    +         '{{l10n.annotation_deletion_delete}}'
-    +         '<ul class="Ldt-AnnotationsList-ul-ToDelete"></ul>'
-    +         '<a class="Ldt-AnnotationsList-ConfirmDelete">{{l10n.confirm}}</a> <a class="Ldt-AnnotationsList-CancelDelete">{{l10n.cancel}}</a>'
-    +     '</div>'
-    +     '<div data-annotation="{{id}}" class="Ldt-AnnotationsList-Screen Ldt-AnnotationsList-ScreenSending">'
-    +         '<a title="{{l10n.close_widget}}" class="Ldt-AnnotationsList-Close" href="#"></a>'  
-    +         '{{l10n.annotation_deletion_sending}}'
-    +     '</div>'
-    +     '<div data-annotation="{{id}}" class="Ldt-AnnotationsList-Screen Ldt-AnnotationsList-ScreenSuccess">'
-    +         '<a title="{{l10n.close_widget}}" class="Ldt-AnnotationsList-Close" href="#"></a>'  
-    +         '{{l10n.annotation_deletion_success}}'
-    +     '</div>'
-    +     '<div data.annotation="{{id}}" class="Ldt-AnnotationsList-Screen Ldt-AnnotationsList-ScreenError">'
-    +         '<a title="{{l10n.close_widget}}" class="Ldt-AnnotationsList-Close" href="#"></a>'  
-    +         '{{l10n.annotation_deletion_error}}'
-    +     '</div>'
-    +     '{{/allow_annotations_deletion}}'
-    + '</div>';
+    static template =
+      '{{#show_header}}<p class="Ldt-AnnotationsList-header">' +
+      "{{#custom_header}}{{custom_header}}{{/custom_header}}" +
+      "{{^custom_header}}{{l10n.header}}{{/custom_header}}" +
+      "</p>{{/show_header}}" +
+      '<div class="Ldt-AnnotationsListWidget">' +
+      '<div class="Ldt-AnnotationsList-ScreenMain">' +
+      "{{#show_filters}}" +
+      '<div class="Ldt-AnnotationsList-Filters">' +
+      '{{#keyword_filter}}<input class="Ldt-AnnotationsList-filter-text" id="Ldt-AnnotationsList-keywordsFilter" type="text" value=""></input>{{/keyword_filter}}' +
+      '{{#user_filter}}<select class="Ldt-AnnotationsList-filter-dropdown" id="Ldt-AnnotationsList-userFilter"><option selected value="">{{l10n.everyone}}</option></select>{{/user_filter}}' +
+      '{{#date_filter}}<label class="Ldt-AnnotationsList-filter-date">Date: <input id="Ldt-AnnotationsList-dateFilter" type="text"></input></label>{{/date_filter}}' +
+      '{{#segment_filter}}<label class="Ldt-AnnotationsList-filter-checkbox"><input type="checkbox" id="Ldt-AnnotationsList-ignoreSegmentsFilter">{{l10n.segment_filter}}</label>{{/segment_filter}}' +
+      '{{#latest_contributions_filter}}<label class="Ldt-AnnotationsList-filter-checkbox"><input type="checkbox" id="Ldt-AnnotationsList-latestContributionsFilter">{{l10n.latest_contributions}}</label>{{/latest_contributions_filter}}' +
+      "</div>" +
+      "{{/show_filters}}" +
+      '{{#show_controls}}<div class="Ldt-AnnotationsList-Controls"><span class="Ldt-AnnotationsList-Control-Prev">{{ l10n.previous }}</span> | <span class="Ldt-AnnotationsList-Control-Next">{{ l10n.next }}</span></div>{{/show_controls}}' +
+      '{{#show_audio}}<div class="Ldt-AnnotationsList-Audio"></div>{{/show_audio}}' +
+      '<ul class="Ldt-AnnotationsList-ul">' +
+      "</ul>" +
+      "</div>" +
+      "{{#allow_annotations_deletion}}" +
+      '<div data-annotation="{{id}}" class="Ldt-AnnotationsList-Screen Ldt-AnnotationsList-ScreenDelete">' +
+      '<a title="{{l10n.close_widget}}" class="Ldt-AnnotationsList-Close" href="#"></a>' +
+      "{{l10n.annotation_deletion_delete}}" +
+      '<ul class="Ldt-AnnotationsList-ul-ToDelete"></ul>' +
+      '<a class="Ldt-AnnotationsList-ConfirmDelete">{{l10n.confirm}}</a> <a class="Ldt-AnnotationsList-CancelDelete">{{l10n.cancel}}</a>' +
+      "</div>" +
+      '<div data-annotation="{{id}}" class="Ldt-AnnotationsList-Screen Ldt-AnnotationsList-ScreenSending">' +
+      '<a title="{{l10n.close_widget}}" class="Ldt-AnnotationsList-Close" href="#"></a>' +
+      "{{l10n.annotation_deletion_sending}}" +
+      "</div>" +
+      '<div data-annotation="{{id}}" class="Ldt-AnnotationsList-Screen Ldt-AnnotationsList-ScreenSuccess">' +
+      '<a title="{{l10n.close_widget}}" class="Ldt-AnnotationsList-Close" href="#"></a>' +
+      "{{l10n.annotation_deletion_success}}" +
+      "</div>" +
+      '<div data.annotation="{{id}}" class="Ldt-AnnotationsList-Screen Ldt-AnnotationsList-ScreenError">' +
+      '<a title="{{l10n.close_widget}}" class="Ldt-AnnotationsList-Close" href="#"></a>' +
+      "{{l10n.annotation_deletion_error}}" +
+      "</div>" +
+      "{{/allow_annotations_deletion}}" +
+      "</div>";
 
-IriSP.Widgets.AnnotationsList.prototype.annotationTemplate =
-    '<li class="Ldt-AnnotationsList-li Ldt-Highlighter-Annotation Ldt-TraceMe" data-annotation="{{ id }}" data-begin="{{ begin_ms }}" data-end="{{ end_ms }}" trace-info="annotation-id:{{id}}, media-id:{{media_id}}" style="{{specific_style}}">'
-    + '<div data-annotation="{{ id }}" class="Ldt-AnnotationsList-ThumbContainer Ldt-AnnotationsList-Annotation-Screen Ldt-AnnotationsList-Annotation-ScreenMain">'
-    +   '<a {{#url}}href="{{url}}"{{/url}} draggable="true">'
-    +     '<img title="{{^external}}{{ begin }} - {{ end }}{{/external}}{{#external}}{{l10n.external_annotation}}{{/external}}" class="Ldt-AnnotationsList-Thumbnail" src="{{thumbnail}}" />'
-    +     '{{#external}}<div title="{{l10n.external_annotation}}" class="Ldt-AnnotationsList-External-Icon"></div>{{/external}}'
-    +   '</a>'
-    + '</div>'
-    + '{{#allow_annotations_deletion}}'
-    + '<div data-annotation="{{ id }}" class="Ldt-AnnotationsList-DeleteButton">&#10006;</div>'
-    + '{{/allow_annotations_deletion}}'
-    + '{{#show_timecode}}<div title="{{l10n.set_time}}" class="Ldt-AnnotationsList-Duration"><span class="Ldt-AnnotationsList-Begin Ldt-live-editable Ldt-AnnotationsList-TimeEdit" data-editable_value="{{begin}}" data-editable_id="{{id}}" data-editable_field="begin" data-editable_type="timestamp">{{begin}}</span>{{#show_end_time}} - <span class="Ldt-AnnotationsList-End Ldt-live-editable" data-editable_value="{{end}}" data-editable_id="{{id}}" data-editable_field="end" data-editable_type="timestamp">{{end}}</span>{{/show_end_time}}</div>{{/show_timecode}}'
-    + '<h3 class="Ldt-AnnotationsList-Title Ldt-Annotation-Timecode" data-timecode="{{ begin_ms }}" draggable="true">'
-    + '{{#show_title}}<span class="Ldt-AnnotationsList-TitleContent Ldt-live-editable" data-editable_value="{{title}}" data-editable_type="multiline" data-editable_id="{{id}}" data-editable_field="title">{{{htitle}}}</span>{{/show_title}}'
-    + '{{#show_creator}}<span class="Ldt-AnnotationsList-Creator">{{ creator }}</span>{{/show_creator}}'
-    + '</h3>'
-    + '<p class="Ldt-AnnotationsList-Description Ldt-live-editable" data-editable_type="multiline" data-editable_value="{{description}}" data-editable_id="{{id}}" data-editable_field="description">{{{hdescription}}}</p>'
-    + '{{#created}}'
-    + '<div class="Ldt-AnnotationsList-CreationDate">{{{created}}}</div>'
-    + '{{/created}}'
-    + '{{#tags.length}}'
-    + '<ul class="Ldt-AnnotationsList-Tags">'
-    +   '{{#tags}}'
-    +   '{{#.}}'
-    +   '<li class="Ldt-AnnotationsList-Tag-Li">'
-    +     '<span>{{.}}</span>'
-    +   '</li>'
-    +   '{{/.}}'
-    +   '{{/tags}}'
-    + '</ul>'
-    + '{{/tags.length}}'
-    + '{{#audio}}<div class="Ldt-AnnotationsList-Play" data-annotation-id="{{id}}">{{l10n.voice_annotation}}</div>{{/audio}}'
-    + '<div class="Ldt-AnnotationsList-EditControls">'
-    +    '{{#show_twitter}}<a title="{{l10n.tweet_annotation}}" target="_blank" href="https://twitter.com/intent/tweet?{{twitter_param}}"><img width="16" height="16" src="metadataplayer/img/twitter.svg"></a>{{/show_twitter}}'
-    +    '{{#show_publish}}<div title="{{l10n.publish_annotation}}" class="Ldt-AnnotationsList-PublishAnnotation" data-editable_id="{{id}}"></div>{{/show_publish}}'
-    +    '{{#editable}}<div title="{{l10n.edit_annotation}}" class="Ldt-AnnotationsList-Edit" data-editable_id="{{id}}"></div>'
-    +    '<div title="{{l10n.delete_annotation}}" class="Ldt-AnnotationsList-Delete" data-editable_id="{{id}}"></div>{{/editable}}'
-    + '</div>'
-    + '</li>';
+    static annotationTemplate =
+      '<li class="Ldt-AnnotationsList-li Ldt-Highlighter-Annotation Ldt-TraceMe" data-annotation="{{ id }}" data-begin="{{ begin_ms }}" data-end="{{ end_ms }}" trace-info="annotation-id:{{id}}, media-id:{{media_id}}" style="{{specific_style}}">' +
+      '<div data-annotation="{{ id }}" class="Ldt-AnnotationsList-ThumbContainer Ldt-AnnotationsList-Annotation-Screen Ldt-AnnotationsList-Annotation-ScreenMain">' +
+      '<a {{#url}}href="{{url}}"{{/url}} draggable="true">' +
+      '<img title="{{^external}}{{ begin }} - {{ end }}{{/external}}{{#external}}{{l10n.external_annotation}}{{/external}}" class="Ldt-AnnotationsList-Thumbnail" src="{{thumbnail}}" />' +
+      '{{#external}}<div title="{{l10n.external_annotation}}" class="Ldt-AnnotationsList-External-Icon"></div>{{/external}}' +
+      "</a>" +
+      "</div>" +
+      "{{#allow_annotations_deletion}}" +
+      '<div data-annotation="{{ id }}" class="Ldt-AnnotationsList-DeleteButton">&#10006;</div>' +
+      "{{/allow_annotations_deletion}}" +
+      '{{#show_timecode}}<div title="{{l10n.set_time}}" class="Ldt-AnnotationsList-Duration"><span class="Ldt-AnnotationsList-Begin Ldt-live-editable Ldt-AnnotationsList-TimeEdit" data-editable_value="{{begin}}" data-editable_id="{{id}}" data-editable_field="begin" data-editable_type="timestamp">{{begin}}</span>{{#show_end_time}} - <span class="Ldt-AnnotationsList-End Ldt-live-editable" data-editable_value="{{end}}" data-editable_id="{{id}}" data-editable_field="end" data-editable_type="timestamp">{{end}}</span>{{/show_end_time}}</div>{{/show_timecode}}' +
+      '<h3 class="Ldt-AnnotationsList-Title Ldt-Annotation-Timecode" data-timecode="{{ begin_ms }}" draggable="true">' +
+      '{{#show_title}}<span class="Ldt-AnnotationsList-TitleContent Ldt-live-editable" data-editable_value="{{title}}" data-editable_type="multiline" data-editable_id="{{id}}" data-editable_field="title">{{{htitle}}}</span>{{/show_title}}' +
+      '{{#show_creator}}<span class="Ldt-AnnotationsList-Creator">{{ creator }}</span>{{/show_creator}}' +
+      "</h3>" +
+      '<p class="Ldt-AnnotationsList-Description Ldt-live-editable" data-editable_type="multiline" data-editable_value="{{description}}" data-editable_id="{{id}}" data-editable_field="description">{{{hdescription}}}</p>' +
+      "{{#created}}" +
+      '<div class="Ldt-AnnotationsList-CreationDate">{{{created}}}</div>' +
+      "{{/created}}" +
+      "{{#tags.length}}" +
+      '<ul class="Ldt-AnnotationsList-Tags">' +
+      "{{#tags}}" +
+      "{{#.}}" +
+      '<li class="Ldt-AnnotationsList-Tag-Li">' +
+      "<span>{{.}}</span>" +
+      "</li>" +
+      "{{/.}}" +
+      "{{/tags}}" +
+      "</ul>" +
+      "{{/tags.length}}" +
+      '{{#audio}}<div class="Ldt-AnnotationsList-Play" data-annotation-id="{{id}}">{{l10n.voice_annotation}}</div>{{/audio}}' +
+      '<div class="Ldt-AnnotationsList-EditControls">' +
+      '{{#show_twitter}}<a title="{{l10n.tweet_annotation}}" target="_blank" href="https://twitter.com/intent/tweet?{{twitter_param}}"><img width="16" height="16" src="metadataplayer/img/twitter.svg"></a>{{/show_twitter}}' +
+      '{{#show_publish}}<div title="{{l10n.publish_annotation}}" class="Ldt-AnnotationsList-PublishAnnotation" data-editable_id="{{id}}"></div>{{/show_publish}}' +
+      '{{#editable}}<div title="{{l10n.edit_annotation}}" class="Ldt-AnnotationsList-Edit" data-editable_id="{{id}}"></div>' +
+      '<div title="{{l10n.delete_annotation}}" class="Ldt-AnnotationsList-Delete" data-editable_id="{{id}}"></div>{{/editable}}' +
+      "</div>" +
+      "</li>";
 
-// obj.url = this.project_url + "/" + media + "/" + annotations[i].meta.project
-// + "/" + annotations[i].meta["id-ref"] + '#id=' + annotations[i].id;
+    // obj.url = this.project_url + "/" + media + "/" + annotations[i].meta.project
+    // + "/" + annotations[i].meta["id-ref"] + '#id=' + annotations[i].id;
 
-IriSP.Widgets.AnnotationsList.prototype.ajaxSource = function() {
-    var _currentTime = this.media.getCurrentTime(),
+    ajaxSource() {
+      var _currentTime = this.media.getCurrentTime(),
         _duration = this.media.duration;
-    this.lastAjaxQuery = _currentTime;
-    var _url = Mustache.to_html(this.ajax_url, {
-        media : this.source.currentMedia.id,
-        begin : Math.max(0, _currentTime - this.ajax_granularity),
-        end : Math.min(_duration.milliseconds, _currentTime + this.ajax_granularity)
-    });
-    this.currentSource = this.player.loadMetadata(IriSP._.defaults({
-        "url" : _url
-    }, this.metadata));
-};
+      this.lastAjaxQuery = _currentTime;
+      var _url = Mustache.render(this.ajax_url, {
+        media: this.source.currentMedia.id,
+        begin: Math.max(0, _currentTime - this.ajax_granularity),
+        end: Math.min(
+          _duration.milliseconds,
+          _currentTime + this.ajax_granularity
+        ),
+      });
+      this.currentSource = this.player.loadMetadata(
+        _.defaults(
+          {
+            url: _url,
+          },
+          this.metadata
+        )
+      );
+    }
 
-IriSP.Widgets.AnnotationsList.prototype.showScreen = function(_screenName) {
-    this.$.find('.Ldt-AnnotationsList-Screen' + _screenName).show()
-        .siblings().hide();
-}
+    showScreen(_screenName) {
+      this.$.find(".Ldt-AnnotationsList-Screen" + _screenName)
+        .show()
+        .siblings()
+        .hide();
+    }
 
-IriSP.Widgets.AnnotationsList.prototype.ajaxMashup = function() {
-    var _currentTime = this.media.getCurrentTime();
-    var _currentAnnotation = this.source.currentMedia.getAnnotationAtTime(_currentTime);
-    if (typeof _currentAnnotation !== "undefined" && _currentAnnotation.id !== this.lastMashupAnnotation) {
+    ajaxMashup() {
+      var _currentTime = this.media.getCurrentTime();
+      var _currentAnnotation =
+        this.source.currentMedia.getAnnotationAtTime(_currentTime);
+      if (
+        typeof _currentAnnotation !== "undefined" &&
+        _currentAnnotation.id !== this.lastMashupAnnotation
+      ) {
         this.lastMashupAnnotation = _currentAnnotation.id;
         var _currentMedia = _currentAnnotation.getMedia(),
-            _url = Mustache.to_html(this.ajax_url, {
-                media : _currentMedia.id,
-                begin : Math.max(0, _currentAnnotation.annotation.begin.milliseconds - this.ajax_granularity),
-                end : Math.min(_currentMedia.duration.milliseconds, _currentAnnotation.annotation.end.milliseconds + this.ajax_granularity)
-            });
-        this.currentSource = this.player.loadMetadata(IriSP._.defaults({
-            "url" : _url
-        }, this.metadata));
+          _url = Mustache.render(this.ajax_url, {
+            media: _currentMedia.id,
+            begin: Math.max(
+              0,
+              _currentAnnotation.annotation.begin.milliseconds -
+                this.ajax_granularity
+            ),
+            end: Math.min(
+              _currentMedia.duration.milliseconds,
+              _currentAnnotation.annotation.end.milliseconds +
+                this.ajax_granularity
+            ),
+          });
+        this.currentSource = this.player.loadMetadata(
+          _.defaults(
+            {
+              url: _url,
+            },
+            this.metadata
+          )
+        );
+      }
     }
-};
 
-/*
- * Import annotations
- */
-IriSP.Widgets.AnnotationsList.prototype.importAnnotations = function () {
-    var widget = this;
-    var $ = IriSP.jQuery;
-    var textarea = $("<textarea>");
-    var el = $("<div>")
-            .append($("<span>")
-                    .addClass("importAnnotationsLabel")
-                    .text(widget.messages.import_annotations))
-            .addClass("importContainer")
-            .dialog({
-                title: "Annotation import",
-                autoOpen: true,
-                width: '80%',
-                minHeight: '400',
-                height: 400,
-                buttons: [ { text: "Close", click: function() { $( this ).dialog( "close" ); } },
-                           // { text: "Load", click: function () {
-                           //     // TODO
-                           //     // http://www.html5rocks.com/en/tutorials/file/dndfiles/?redirect_from_locale=fr
-                           //     console.log("Load from a file");
-                           // } },
-                           { text: "Import", click: function () {
-                               // FIXME: this should be a model.Source method
-                               var time_regexp = /(\[[\d:]+\])/;
-                               console.log("Import data");
-                               // widget.localSource
-                               // Dummy parsing for the moment
-                               var data = textarea[0].value
-                                       .split(time_regexp)
-                                       .filter( function (s) { return ! s.match(/^\s*$/)});
-                               var begin = null,
-                                   end = null,
-                                   content = null,
-                                   // Previous is either null, timestamp or text
-                                   previous = null;
-                               for (var i = 0; i < data.length; i++) {
-                                   var el = data[i];
-                                   if (el.match(time_regexp)) {
-                                       if (previous == 'text') {
-                                           // Timestamp following text. Let's make it an annotation
-                                           end = IriSP.timestamp2ms(el.slice(1, -1));
-                                           TODO.createAnnotation(begin, end, content);
-                                           // Preserve the end value, which may be the begin value of the next annotation.
-                                           begin = end;
-                                           end = null;
-                                           content = null;
-                                       } else {
-                                           //  (previous == 'timestamp' || previous == null)
-                                           // 2 consecutive timestamps. Let's start a new annotation
-                                           content = null;
-                                           begin = IriSP.timestamp2ms(el.slice(1, -1));
-                                           end = null;
-                                       };
-                                       previous = 'timestamp';
-                                   } else {
-                                       // Text content
-                                       content = el;
-                                       previous = 'text';
-                                   }
-                                   // Last textual value
-                                   if (previous == 'text' && begin !== null) {
-                                       TODO.createAnnotation(begin, begin, content);
-                                   }
-                               }
-                           } } ]
-            });
+    /*
+     * Import annotations
+     */
+    importAnnotations() {
+      var widget = this;
+      var $ = jQuery;
+      var textarea = $("<textarea>");
+      var el = $("<div>")
+        .append(
+          $("<span>")
+            .addClass("importAnnotationsLabel")
+            .text(widget.messages.import_annotations)
+        )
+        .addClass("importContainer")
+        .dialog({
+          title: "Annotation import",
+          autoOpen: true,
+          width: "80%",
+          minHeight: "400",
+          height: 400,
+          buttons: [
+            {
+              text: "Close",
+              click: function () {
+                $(this).dialog("close");
+              },
+            },
+            // { text: "Load", click: function () {
+            //     // TODO
+            //     // http://www.html5rocks.com/en/tutorials/file/dndfiles/?redirect_from_locale=fr
+            //     console.log("Load from a file");
+            // } },
+            {
+              text: "Import",
+              click: function () {
+                // FIXME: this should be a model.Source method
+                var time_regexp = /(\[[\d:]+\])/;
+                // widget.localSource
+                // Dummy parsing for the moment
+                var data = textarea[0].value
+                  .split(time_regexp)
+                  .filter(function (s) {
+                    return !s.match(/^\s*$/);
+                  });
+                var begin = null,
+                  end = null,
+                  content = null,
+                  // Previous is either null, timestamp or text
+                  previous = null;
+                for (var i = 0; i < data.length; i++) {
+                  var el = data[i];
+                  if (el.match(time_regexp)) {
+                    if (previous == "text") {
+                      // Timestamp following text. Let's make it an annotation
+                      end = ns.timestamp2ms(el.slice(1, -1));
+                      TODO.createAnnotation(begin, end, content);
+                      // Preserve the end value, which may be the begin value of the next annotation.
+                      begin = end;
+                      end = null;
+                      content = null;
+                    } else {
+                      //  (previous == 'timestamp' || previous == null)
+                      // 2 consecutive timestamps. Let's start a new annotation
+                      content = null;
+                      begin = ns.timestamp2ms(el.slice(1, -1));
+                      end = null;
+                    }
+                    previous = "timestamp";
+                  } else {
+                    // Text content
+                    content = el;
+                    previous = "text";
+                  }
+                  // Last textual value
+                  if (previous == "text" && begin !== null) {
+                    TODO.createAnnotation(begin, begin, content);
+                  }
+                }
+              },
+            },
+          ],
+        });
+    }
 
-}
-
-IriSP.Widgets.AnnotationsList.prototype.refresh = function(_forceRedraw) {
-    _forceRedraw = (typeof _forceRedraw !== "undefined" && _forceRedraw);
-    if (this.currentSource.status !== IriSP.Model._SOURCE_STATUS_READY) {
+    refresh(_forceRedraw) {
+      _forceRedraw = typeof _forceRedraw !== "undefined" && _forceRedraw;
+      if (this.currentSource.status !== ns.Model._SOURCE_STATUS_READY) {
         return 0;
-    }
-    var _this = this,
+      }
+      var _this = this,
         _currentTime = this.media.getCurrentTime();
-    var _list = this.annotation_type ? this.currentSource.getAnnotationsByTypeTitle(this.annotation_type) : this.currentSource.getAnnotations();
-    if (this.mashupMode) {
-        var _currentAnnotation = this.source.currentMedia.getAnnotationAtTime(_currentTime);
+      var _list = this.annotation_type
+        ? this.currentSource.getAnnotationsByTypeTitle(this.annotation_type)
+        : this.currentSource.getAnnotations();
+      if (this.mashupMode) {
+        var _currentAnnotation =
+          this.source.currentMedia.getAnnotationAtTime(_currentTime);
         if (typeof _currentAnnotation !== "undefined") {
-            _currentTime = _currentTime - _currentAnnotation.begin + _currentAnnotation.annotation.begin;
-            var _mediaId = _currentAnnotation.getMedia().id;
-            _list = _list.filter(function(_annotation) {
-                return _annotation.getMedia().id === _mediaId;
-            });
+          _currentTime =
+            _currentTime -
+            _currentAnnotation.begin +
+            _currentAnnotation.annotation.begin;
+          var _mediaId = _currentAnnotation.getMedia().id;
+          _list = _list.filter(function (_annotation) {
+            return _annotation.getMedia().id === _mediaId;
+          });
         }
-    }
-    _list = _list.filter(function(_annotation) {
+      }
+      _list = _list.filter(function (_annotation) {
         return _annotation.found !== false;
-    });
-    
-    if ((this.filter_by_segments)&&(!(this.show_filters && this.segment_filter && this.ignoresegmentcheckbox_$[0].checked))) {
+      });
+
+      if (
+        this.filter_by_segments &&
+        !(
+          this.show_filters &&
+          this.segment_filter &&
+          this.ignoresegmentcheckbox_$[0].checked
+        )
+      ) {
         /*
-         *  A given annotation is considered "in" segment if the middle of it is between the segment beginning and the segment end. 
+         *  A given annotation is considered "in" segment if the middle of it is between the segment beginning and the segment end.
          *  Note this is meant to be used for "markings" annotations (not segments)
          */
-        _segmentsAnnotation = this.currentSource.getAnnotationsByTypeTitle(this.segments_annotation_type)
-        if (this.media.getTimeRange()){
-            _currentSegments = _segmentsAnnotation.filter(function(_segment){
-                return (_this.media.getTimeRange()[0] == _segment.begin && _this.media.getTimeRange()[1] == _segment.end)
-            });
-        }
-        else {
-            _currentSegments = _segmentsAnnotation.filter(function(_segment){
-                return (_currentTime >= _segment.begin && _currentTime <= _segment.end)
-            });
+        _segmentsAnnotation = this.currentSource.getAnnotationsByTypeTitle(
+          this.segments_annotation_type
+        );
+        if (this.media.getTimeRange()) {
+          _currentSegments = _segmentsAnnotation.filter(function (_segment) {
+            return (
+              _this.media.getTimeRange()[0] == _segment.begin &&
+              _this.media.getTimeRange()[1] == _segment.end
+            );
+          });
+        } else {
+          _currentSegments = _segmentsAnnotation.filter(function (_segment) {
+            return (
+              _currentTime >= _segment.begin && _currentTime <= _segment.end
+            );
+          });
         }
         if (_currentSegments.length == 0) {
-            _list = _list.filter(function(_annotation){
-                return false;
-            });
+          _list = _list.filter(function (_annotation) {
+            return false;
+          });
+        } else {
+          _list = _list.filter(function (_annotation) {
+            _annotation_time = (_annotation.begin + _annotation.end) / 2;
+            return (
+              _currentSegments[0].begin <= _annotation_time &&
+              _currentSegments[0].end >= _annotation_time
+            );
+          });
         }
-        else {
-            _list = _list.filter(function(_annotation){
-                _annotation_time = (_annotation.begin+_annotation.end)/2;
-                return (_currentSegments[0].begin <= _annotation_time && _currentSegments[0].end >= _annotation_time)
-            });
-        }
-        if(this.annotations_count_header && this.annotations_count != _list.length){
-            this.annotations_count = _list.length;
-            this.refreshHeader();
+        if (
+          this.annotations_count_header &&
+          this.annotations_count != _list.length
+        ) {
+          this.annotations_count = _list.length;
+          this.refreshHeader();
         }
-    }
-    if (this.show_only_annotation_from_user){
-        _list = _list.filter(function(_annotation){
-           return _annotation.creator == _this.show_only_annotation_from_user;
+      }
+      if (this.show_only_annotation_from_user) {
+        _list = _list.filter(function (_annotation) {
+          return _annotation.creator == _this.show_only_annotation_from_user;
         });
-    }
-    if (this.limit_count) {
+      }
+      if (this.limit_count) {
         /* Get the n annotations closest to current timecode */
-        _list = _list.sortBy(function(_annotation) {
-            return Math.abs((_annotation.begin + _annotation.end) / 2 - _currentTime);
-        }).slice(0, this.limit_count);
-    }
-    
-    if (this.newest_first) {
-        _list = _list.sortBy(function(_annotation) {
-            return -_annotation.created.valueOf();
+        _list = _list
+          .sortBy(function (_annotation) {
+            return Math.abs(
+              (_annotation.begin + _annotation.end) / 2 - _currentTime
+            );
+          })
+          .slice(0, this.limit_count);
+      }
+
+      if (this.newest_first) {
+        _list = _list.sortBy(function (_annotation) {
+          return -_annotation.created.valueOf();
         });
-    } else {
-        _list = _list.sortBy(function(_annotation) {
-            return _annotation.begin;
+      } else {
+        _list = _list.sortBy(function (_annotation) {
+          return _annotation.begin;
         });
-    }
-    
-    if (this.show_filters){
-        if (this.user_filter){
-            _username = this.userselect_$[0].options[this.userselect_$[0].selectedIndex].value;
-            if (_username != "false")
-            {
-                _list = _list.filter(function(_annotation){
-                    return _annotation.creator == _username
-                })
-            }
+      }
+
+      if (this.show_filters) {
+        if (this.user_filter) {
+          _username =
+            this.userselect_$[0].options[this.userselect_$[0].selectedIndex]
+              .value;
+          if (_username != "false") {
+            _list = _list.filter(function (_annotation) {
+              return _annotation.creator == _username;
+            });
+          }
         }
-        if (this.keyword_filter){
-        _keyword = this.keywordinput_$[0].value;
-            if (_keyword != ""){
-                _list = _list.filter(function(_annotation){
-                   return _annotation.description.toLowerCase().match(_keyword.toLowerCase());
-                });
-            }
+        if (this.keyword_filter) {
+          _keyword = this.keywordinput_$[0].value;
+          if (_keyword != "") {
+            _list = _list.filter(function (_annotation) {
+              return _annotation.description
+                .toLowerCase()
+                .match(_keyword.toLowerCase());
+            });
+          }
         }
-        if (this.date_filter){
-            if(this.datefilterinput_$[0].value != ""){
-                _date = this.datefilterinput_$.datepicker("getDate");
-                _list = _list.filter(function(_annotation){
-                    return ((_annotation.created.getDate() == _date.getDate())&&(_annotation.created.getMonth() == _date.getMonth())&&(_annotation.created.getFullYear() == _date.getFullYear()));
-                });
-            }
-        }
-        if (this.latest_contributions_filter && this.latestcontributionscheckbox_$[0].checked){
-            _list = _list.sortBy(function(_annotation) {
-                return -_annotation.created.valueOf();
+        if (this.date_filter) {
+          if (this.datefilterinput_$[0].value != "") {
+            _date = this.datefilterinput_$.datepicker("getDate");
+            _list = _list.filter(function (_annotation) {
+              return (
+                _annotation.created.getDate() == _date.getDate() &&
+                _annotation.created.getMonth() == _date.getMonth() &&
+                _annotation.created.getFullYear() == _date.getFullYear()
+              );
             });
-            this.usernames.forEach(function(_user){
-                
-                latest_ann = _list.filter(function(_annotation){
-                    return _annotation.creator == _user;
-                })[0];
-                _list = _list.filter(function(_annotation){
-                    return _annotation.id == (latest_ann ? latest_ann.id : false) || _annotation.creator != _user;
-                });
+          }
+        }
+        if (
+          this.latest_contributions_filter &&
+          this.latestcontributionscheckbox_$[0].checked
+        ) {
+          _list = _list.sortBy(function (_annotation) {
+            return -_annotation.created.valueOf();
+          });
+          this.usernames.forEach(function (_user) {
+            latest_ann = _list.filter(function (_annotation) {
+              return _annotation.creator == _user;
+            })[0];
+            _list = _list.filter(function (_annotation) {
+              return (
+                _annotation.id == (latest_ann ? latest_ann.id : false) ||
+                _annotation.creator != _user
+              );
             });
+          });
         }
-        
-    }
-    
-    var _ids = _list.idIndex;
+      }
+
+      var _ids = _list.idIndex;
 
-    if (_forceRedraw || !IriSP._.isEqual(_ids, this.lastIds) || this.searchString !== this.lastSearch) {
+      if (
+        _forceRedraw ||
+        !_.isEqual(_ids, this.lastIds) ||
+        this.searchString !== this.lastSearch
+      ) {
         /* This part only gets executed if the list needs updating */
         this.lastSearch = this.searchString;
         this.lastIds = _ids;
         this.list_$.html("");
-        _list.forEach(function(_annotation) {
-            var _url = (
-                ( typeof _annotation.url !== "undefined" && _annotation.url)
+        _list.forEach(function (_annotation) {
+          var _url =
+              typeof _annotation.url !== "undefined" && _annotation.url
                 ? _annotation.url
-                : (
-                    ( typeof _this.source.projectId !== "undefined" && typeof _annotation.project !== "undefined" && _annotation.project && _this.source.projectId !== _annotation.project )
-                    ? Mustache.to_html(
-                        _this.foreign_url,
-                        {
-                            project : _annotation.project,
-                            media : _annotation.media.id,
-                            annotation : _annotation.id,
-                            annotationType : _annotation.annotationType.id
-                        }
-                    )
-                    : document.location.href.replace(/#.*$/,'') + '#id=' + _annotation.id + '&t=' + (_annotation.begin / 1000.0)
-                    )
-                ),
-                _external = _annotation.project != _this.source.projectId ? true : false,
-                _title = "",
-                _description = _annotation.description,
-                _thumbnail = (typeof _annotation.thumbnail !== "undefined" && _annotation.thumbnail ? _annotation.thumbnail : _this.default_thumbnail);
-            if (_this.show_creator){
-                if (_annotation.creator) {
-                    var _users = [],
-                        _user = {},
-                        _creator = "";
-                    if (_this.source.users_data) {
-                        _users = _this.source.users_data.filter(function(_user_data){
-                            return _user_data.username == _annotation.creator;
-                        });
-                    }
-                    if (_users.length == 0){
-                        _user.username = _annotation.creator
-                    }
-                    else{
-                        _user = _users[0]
-                    }
-                    _creator = _this.make_name_string_function(_user);
-                }
+                : typeof _this.source.projectId !== "undefined" &&
+                  typeof _annotation.project !== "undefined" &&
+                  _annotation.project &&
+                  _this.source.projectId !== _annotation.project
+                ? Mustache.render(_this.foreign_url, {
+                    project: _annotation.project,
+                    media: _annotation.media.id,
+                    annotation: _annotation.id,
+                    annotationType: _annotation.annotationType.id,
+                  })
+                : document.location.href.replace(/#.*$/, "") +
+                  "#id=" +
+                  _annotation.id +
+                  "&t=" +
+                  _annotation.begin / 1000.0,
+            _external =
+              _annotation.project != _this.source.projectId ? true : false,
+            _title = "",
+            _description = _annotation.description,
+            _thumbnail =
+              typeof _annotation.thumbnail !== "undefined" &&
+              _annotation.thumbnail
+                ? _annotation.thumbnail
+                : _this.default_thumbnail;
+          if (_this.show_creator) {
+            if (_annotation.creator) {
+              var _users = [],
+                _user = {},
+                _creator = "";
+              if (_this.source.users_data) {
+                _users = _this.source.users_data.filter(function (_user_data) {
+                  return _user_data.username == _annotation.creator;
+                });
+              }
+              if (_users.length == 0) {
+                _user.username = _annotation.creator;
+              } else {
+                _user = _users[0];
+              }
+              _creator = _this.make_name_string_function(_user);
             }
-            if (_this.show_title && _annotation.title){
-                    var _title = _annotation.title;
-            }
-            var _bgcolor;
-            IriSP._(_this.polemics).each(function(_polemic) {
-                var _rgxp = IriSP.Model.regexpFromTextOrArray(_polemic.keyword, true);
-                if (_rgxp.test(_title + " " + _description)) {
-                    _bgcolor = _polemic.background_color;
-                }
-            });
-            var _created = false;
-            if (_this.show_creation_date) {
-                _created = _annotation.created.toLocaleDateString()+", "+_annotation.created.toLocaleTimeString().replace(/\u200E/g, '').replace(/^([^\d]*\d{1,2}:\d{1,2}):\d{1,2}([^\d]*)$/, '$1$2');;
-            }
-            if(this.tags == true){
-                var _tags = _annotation.getTagTexts();
-            }
-            else {
-                var _tags = false;
+          }
+          if (_this.show_title && _annotation.title) {
+            var _title = _annotation.title;
+          }
+          var _bgcolor;
+          _(_this.polemics).each(function (_polemic) {
+            var _rgxp = ns.Model.regexpFromTextOrArray(
+              _polemic.keyword,
+              true
+            );
+            if (_rgxp.test(_title + " " + _description)) {
+              _bgcolor = _polemic.background_color;
             }
-            var _data = {
-                id : _annotation.id,
-                media_id : _annotation.getMedia().id,
-                htitle : IriSP.textFieldHtml(_title),
-                title: _title,
-                creator: _creator,
-                hdescription : IriSP.textFieldHtml(_description),
-                description: _description,
-                begin : _annotation.begin.toString(),
-                end : _annotation.end.toString(),
-                created : _created,
-                show_timecode : _this.show_timecode,
-                show_end_time : _this.show_end_time,
-                show_title : _this.show_title && _title,
-                thumbnail : _thumbnail,
-                url : _url,
-                tags : _tags,
-                specific_style : (typeof _bgcolor !== "undefined" ? "background-color: " + _bgcolor : ""),
-                l10n: _this.l10n,
-                editable: _this.editable,
-                external: _external,
-                show_publish: _this.show_publish,
-                show_creator: _this.show_creator,
-                show_twitter: _this.show_twitter,
-                twitter_param: IriSP.jQuery.param({ url: _url, text: IriSP.textFieldHtml(_title) + (_this.twitter_hashtag ? ' #' + _this.twitter_hashtag : "") }),
-                allow_annotations_deletion: _this.allow_annotations_deletion
+          });
+          var _created = false;
+          if (_this.show_creation_date) {
+            _created =
+              _annotation.created.toLocaleDateString() +
+              ", " +
+              _annotation.created
+                .toLocaleTimeString()
+                .replace(/\u200E/g, "")
+                .replace(/^([^\d]*\d{1,2}:\d{1,2}):\d{1,2}([^\d]*)$/, "$1$2");
+          }
+          if (_this.tags == true) {
+            var _tags = _annotation.getTagTexts();
+          } else {
+            var _tags = false;
+          }
+          var _data = {
+            id: _annotation.id,
+            media_id: _annotation.getMedia().id,
+            htitle: ns.textFieldHtml(_title),
+            title: _title,
+            creator: _creator,
+            hdescription: ns.textFieldHtml(_description),
+            description: _description,
+            begin: _annotation.begin.toString(),
+            end: _annotation.end.toString(),
+            created: _created,
+            show_timecode: _this.show_timecode,
+            show_end_time: _this.show_end_time,
+            show_title: _this.show_title && _title,
+            thumbnail: _thumbnail,
+            url: _url,
+            tags: _tags,
+            specific_style:
+              typeof _bgcolor !== "undefined"
+                ? "background-color: " + _bgcolor
+                : "",
+            l10n: _this.l10n,
+            editable: _this.editable,
+            external: _external,
+            show_publish: _this.show_publish,
+            show_creator: _this.show_creator,
+            show_twitter: _this.show_twitter,
+            twitter_param: jQuery.param({
+              url: _url,
+              text:
+                ns.textFieldHtml(_title) +
+                (_this.twitter_hashtag ? " #" + _this.twitter_hashtag : ""),
+            }),
+            allow_annotations_deletion: _this.allow_annotations_deletion,
+          };
+          // if (
+          //   _this.show_audio &&
+          //   _annotation.audio &&
+          //   _annotation.audio.href &&
+          //   _annotation.audio.href != "null"
+          // ) {
+          //   _data.audio = true;
+          //   if (!_this.jwplayers[_annotation.id]) {
+          //     var _audiofile = _annotation.audio.href;
+          //     if (_this.audio_url_transform) {
+          //       _audiofile = _this.audio_url_transform(_annotation.audio.href);
+          //     }
+          //     var _tmpId = "jwplayer-" + ns.Model.getUID();
+          //     _this.jwplayers[_annotation.id] = _tmpId;
+          //     _this.$.find(".Ldt-AnnotationsList-Audio").append(
+          //       jQuery("<div>").attr("id", _tmpId)
+          //     );
+          //     jwplayer(_tmpId).setup({
+          //       //flashplayer: ns.getLib("jwPlayerSWF"),
+          //       file: _audiofile,
+          //       fallback: false,
+          //       primary: "flash",
+          //       controls: false,
+          //       width: 1,
+          //       height: 1,
+          //       events: {
+          //         onPause: function () {
+          //           _this.$.find(
+          //             ".Ldt-AnnotationsList-Play[data-annotation-id=" +
+          //               _annotation.id +
+          //               "]"
+          //           ).text(_this.l10n.voice_annotation);
+          //         },
+          //         onPlay: function () {
+          //           _this.$.find(
+          //             ".Ldt-AnnotationsList-Play[data-annotation-id=" +
+          //               _annotation.id +
+          //               "]"
+          //           ).text(_this.l10n.now_playing);
+          //         },
+          //       },
+          //     });
+          //   }
+          //}
+          var _html = Mustache.render(_this.constructor.annotationTemplate, _data),
+            _el = jQuery(_html),
+            _onselect = function () {
+              _this.$.find(".Ldt-AnnotationsList-li").removeClass("selected");
+              _el.addClass("selected");
+            },
+            _onunselect = function () {
+              _this.$.find(".Ldt-AnnotationsList-li").removeClass("selected");
             };
-            if (_this.show_audio && _annotation.audio && _annotation.audio.href && _annotation.audio.href != "null") {
-                _data.audio = true;
-                if (!_this.jwplayers[_annotation.id]) {
-                    var _audiofile = _annotation.audio.href;
-                    if (_this.audio_url_transform) {
-                        _audiofile = _this.audio_url_transform(_annotation.audio.href);
-                    }
-                    var _tmpId = "jwplayer-" + IriSP.Model.getUID();
-                    _this.jwplayers[_annotation.id] = _tmpId;
-                    _this.$.find(".Ldt-AnnotationsList-Audio").append(IriSP.jQuery("<div>").attr("id", _tmpId));
-                    jwplayer(_tmpId).setup({
-                        flashplayer: IriSP.getLib("jwPlayerSWF"),
-                        file: _audiofile,
-                        fallback: false,
-                        primary: "flash",
-                        controls: false,
-                        width: 1,
-                        height: 1,
-                        events: {
-                            onPause: function() {
-                                _this.$.find(".Ldt-AnnotationsList-Play[data-annotation-id=" + _annotation.id + "]").text(_this.l10n.voice_annotation);
-                            },
-                            onPlay: function() {
-                                _this.$.find(".Ldt-AnnotationsList-Play[data-annotation-id=" + _annotation.id + "]").text(_this.l10n.now_playing);
-                            }
-                        }
-                    });
+          _el
+            .mouseover(function () {
+              _annotation.trigger("select");
+            })
+            .mouseout(function () {
+              _annotation.trigger("unselect");
+            })
+            .click(function () {
+              if (_this.filter_by_segments && _this.media.getTimeRange()) {
+                _ann_time = (_annotation.begin + _annotation.end) / 2;
+                if (
+                  _ann_time <= _this.media.getTimeRange()[0] ||
+                  _ann_time >= _this.media.getTimeRange()[1]
+                ) {
+                  _this.media.resetTimeRange();
                 }
-            }
-            var _html = Mustache.to_html(_this.annotationTemplate, _data),
-                _el = IriSP.jQuery(_html),
-                _onselect = function() {
-                    _this.$.find('.Ldt-AnnotationsList-li').removeClass("selected");
-                    _el.addClass("selected");
-                },
-                _onunselect = function() {
-                    _this.$.find('.Ldt-AnnotationsList-li').removeClass("selected");
-                };
-            _el.mouseover(function() {
-                    _annotation.trigger("select");
-                })
-                .mouseout(function() {
-                    _annotation.trigger("unselect");
-                })
-                .click(function() {
-                    if (_this.filter_by_segments && _this.media.getTimeRange()){
-                        _ann_time = ( _annotation.begin + _annotation.end ) / 2;
-                        if ((_ann_time <= _this.media.getTimeRange()[0]) || (_ann_time >= _this.media.getTimeRange()[1])){
-                            _this.media.resetTimeRange()
-                        }
-                    }
-                    _annotation.trigger("click");
-                })
-                .appendTo(_this.list_$);
-            IriSP.attachDndData(_el.find("[draggable]"), {
-            	title: _title,
-            	description: _description,
-            	uri: _url,
-                image: _annotation.thumbnail,
-                text: '[' + _annotation.begin.toString() + '] ' + _title
-            });
-            _el.on("remove", function() {
-                _annotation.off("select", _onselect);
-                _annotation.off("unselect", _onunselect);
-            });
-            _annotation.on("select", _onselect);
-            _annotation.on("unselect", _onunselect);
+              }
+              _annotation.trigger("click");
+            })
+            .appendTo(_this.list_$);
+          ns.attachDndData(_el.find("[draggable]"), {
+            title: _title,
+            description: _description,
+            uri: _url,
+            image: _annotation.thumbnail,
+            text: "[" + _annotation.begin.toString() + "] " + _title,
+          });
+          _el.on("remove", function () {
+            _annotation.off("select", _onselect);
+            _annotation.off("unselect", _onunselect);
+          });
+          _annotation.on("select", _onselect);
+          _annotation.on("unselect", _onunselect);
         });
 
         /* Correct the empty tag bug */
-        this.$.find('.Ldt-AnnotationsList-Tag-Li').each(function() {
-            var _el = IriSP.jQuery(this);
-            if (!_el.text().replace(/(^\s+|\s+$)/g,'')) {
-                _el.remove();
-            }
+        this.$.find(".Ldt-AnnotationsList-Tag-Li").each(function () {
+          var _el = jQuery(this);
+          if (!_el.text().replace(/(^\s+|\s+$)/g, "")) {
+            _el.remove();
+          }
         });
 
         if (this.editable) {
-            var widget = _this;
-            var $ = IriSP.jQuery;
+          var widget = _this;
+          var $ = jQuery;
 
-            var edit_element = function (_this, insertion_point) {
-                var feedback_wrong = "#FF9999";
-                var feedback_ok = "#99FF99";
+          var edit_element = function (_this, insertion_point) {
+            var feedback_wrong = "#FF9999";
+            var feedback_ok = "#99FF99";
 
-                // insertion_point can be used to specify where to
-                // insert the input field.  Firefox is buggy wrt input
-                // fields inside <a> or <h?> tags, it does not
-                // propagate mouse clicks. If _this is a <a> then we
-                // have to specify the ancestor before which we can
-                // insert the input widget.
-                if (insertion_point === undefined)
-                    insertion_point = _this;
+            // insertion_point can be used to specify where to
+            // insert the input field.  Firefox is buggy wrt input
+            // fields inside <a> or <h?> tags, it does not
+            // propagate mouse clicks. If _this is a <a> then we
+            // have to specify the ancestor before which we can
+            // insert the input widget.
+            if (insertion_point === undefined) insertion_point = _this;
+
+            // Insert input element
+            var input_element = $(
+              _this.dataset.editable_type === "multiline"
+                ? "<textarea>"
+                : "<input>"
+            )
+              .addClass("editableInput")
+              .insertBefore($(insertion_point));
+            input_element[0].value = _this.dataset.editable_value;
+            $(input_element).show().focus();
+            $(_this).addClass("editing");
 
-                // Insert input element
-                var input_element = $(_this.dataset.editable_type === 'multiline' ? "<textarea>" : "<input>")
-                        .addClass("editableInput")
-                        .insertBefore($(insertion_point));
-                input_element[0].value = _this.dataset.editable_value;
-                $(input_element).show().focus();
-                $(_this).addClass("editing");
+            function feedback(color) {
+              // Give some feedback
+              $(_this).removeClass("editing");
+              input_element.remove();
+              var previous_color = $(_this).css("background-color");
+              $(_this)
+                .stop()
+                .css("background-color", color)
+                .animate({ backgroundColor: previous_color }, 1000);
+            }
 
-                function feedback(color) {
-                    // Give some feedback
-                    $(_this).removeClass("editing");
-                    input_element.remove();
-                    var previous_color = $(_this).css("background-color");
-                    $(_this).stop().css("background-color", color)
-                        .animate({ backgroundColor: previous_color}, 1000);
-                }
-
-                function cancelChanges(s) {
-                    feedback(feedback_wrong);
+            function cancelChanges(s) {
+              feedback(feedback_wrong);
+            }
+            function validateChanges() {
+              var n = input_element[0].value;
+              if (n == _this.dataset.editable_value) {
+                // No change
+                feedback(feedback_ok);
+                return;
+              }
+              if (n == "") {
+                // Delete annotation
+                delete_local_annotation(_this.dataset.editable_id);
+                widget.player.trigger(
+                  "Annotation.delete",
+                  _this.dataset.editable_id
+                );
+                return;
+              } else {
+                // Convert value if necessary.
+                var val = n;
+                if (_this.dataset.editable_type == "timestamp") {
+                  val = ns.timestamp2ms(n);
+                  if (Number.isNaN(val)) {
+                    // Invalid value. Cancel changes
+                    cancelChanges();
+                    return;
+                  }
                 }
-                function validateChanges() {
-                    var n = input_element[0].value;
-                    if (n == _this.dataset.editable_value) {
-                        // No change
-                        feedback(feedback_ok);
-                        return;
-                    }
-                    if (n == '') {
-                        // Delete annotation
-                        delete_local_annotation(_this.dataset.editable_id);
-                        widget.player.trigger("Annotation.delete", _this.dataset.editable_id);
-                        return;
-                    } else {
-                        // Convert value if necessary.
-                        var val = n;
-                        if (_this.dataset.editable_type == 'timestamp') {
-                            val = IriSP.timestamp2ms(n);
-                            if (Number.isNaN(val)) {
-                                // Invalid value. Cancel changes
-                                cancelChanges();
-                                return;
-                            }
-                        }
-                        _this.dataset.editable_value = n;
-                        n = val;
-                        $(_this).text(val);
-                    }
+                _this.dataset.editable_value = n;
+                n = val;
+                $(_this).text(val);
+              }
 
-                    // We cannot use .getElement since it fetches
-                    // elements from the global Directory
-                    var an = get_local_annotation(_this.dataset.editable_id);
-                    if (an === undefined) {
-                        console.log("Strange error: cannot find edited annotation");
-                        feedback(feedback_wrong);
-                    } else {
-                        _this.dataset.editable_value = n;
-                        // Update annotation for storage
-                        if (_this.dataset.editable_field == 'begin')
-                            an.setBegin(n);
-                        else if (_this.dataset.editable_field == 'end')
-                            an.setEnd(n);
-                        else
-                            an[_this.dataset.editable_field] = n;
-                        an.modified = new Date();
-                        // FIXME: use user name, when available
-                        an.contributor = widget.player.config.username || "COCo User";
-                        widget.player.addLocalAnnotation(an);
-                        widget.player.trigger("Annotation.update", an);
-                        feedback(feedback_ok);
-                    }
+              // We cannot use .getElement since it fetches
+              // elements from the global Directory
+              var an = get_local_annotation(_this.dataset.editable_id);
+              if (an === undefined) {
+                console.log("Strange error: cannot find edited annotation");
+                feedback(feedback_wrong);
+              } else {
+                _this.dataset.editable_value = n;
+                // Update annotation for storage
+                if (_this.dataset.editable_field == "begin") an.setBegin(n);
+                else if (_this.dataset.editable_field == "end") an.setEnd(n);
+                else an[_this.dataset.editable_field] = n;
+                an.modified = new Date();
+                // FIXME: use user name, when available
+                an.contributor = widget.player.config.username || "COCo User";
+                widget.player.addLocalAnnotation(an);
+                widget.player.trigger("Annotation.update", an);
+                feedback(feedback_ok);
+              }
+            }
+            $(input_element)
+              .bind("keydown", function (e) {
+                if (e.which == 13) {
+                  e.preventDefault();
+                  validateChanges();
+                } else if (e.which == 27) {
+                  e.preventDefault();
+                  cancelChanges();
                 }
-                $(input_element).bind('keydown', function(e) {
-                    if (e.which == 13) {
-                        e.preventDefault();
-                        validateChanges();
-                    } else if (e.which == 27) {
-                        e.preventDefault();
-                        cancelChanges();
-                    }
-                }).bind("blur", function (e) {
-                    validateChanges();
-                });
-            };
+              })
+              .bind("blur", function (e) {
+                validateChanges();
+              });
+          };
+
+          var get_local_annotation = function (ident) {
+            return widget.player.getLocalAnnotation(ident);
+          };
 
-            var get_local_annotation = function (ident) {
-                return widget.player.getLocalAnnotation(ident);
-            };
+          var save_local_annotations = function () {
+            widget.player.saveLocalAnnotations();
+            // Merge modifications into widget source
+            widget.source.merge(widget.player.localSource);
+          };
 
-            var save_local_annotations = function() {
-                widget.player.saveLocalAnnotations();
-                // Merge modifications into widget source
-                widget.source.merge(widget.player.localSource);
-            };
+          var delete_local_annotation = function (ident) {
+            widget.source.getAnnotations().removeId(ident, true);
+            widget.player.deleteLocalAnnotation(ident);
+            widget.refresh(true);
+          };
 
-            var delete_local_annotation = function(ident) {
-                widget.source.getAnnotations().removeId(ident, true);
-                widget.player.deleteLocalAnnotation(ident);
-                widget.refresh(true);
-            };
-
-            this.$.find('.Ldt-AnnotationsList-Delete').click(function(e) {
-                // Delete annotation
-                var _annotation = get_local_annotation(this.dataset.editable_id);
-                if (confirm(Mustache.to_html(widget.l10n.confirm_delete_message, { annotation: _annotation })))
-                    delete_local_annotation(this.dataset.editable_id);
-                widget.refresh(true);
-            });
-            this.$.find('.Ldt-AnnotationsList-Edit').click(function(e) {
-                if (widget.on_edit) {
-                    var _annotation = get_local_annotation(this.dataset.editable_id);
-                    widget.on_edit(_annotation);
-                } else {
-                    // Edit annotation title. We have to specify the insertion point.
-                    var element = $(this).parents(".Ldt-AnnotationsList-li").find(".Ldt-AnnotationsList-TitleContent.Ldt-live-editable");
-                    edit_element(element[0]);
-                }
+          this.$.find(".Ldt-AnnotationsList-Delete").click(function (e) {
+            // Delete annotation
+            var _annotation = get_local_annotation(this.dataset.editable_id);
+            if (
+              confirm(
+                Mustache.render(widget.l10n.confirm_delete_message, {
+                  annotation: _annotation,
+                })
+              )
+            )
+              delete_local_annotation(this.dataset.editable_id);
+            widget.refresh(true);
+          });
+          this.$.find(".Ldt-AnnotationsList-Edit").click(function (e) {
+            if (widget.on_edit) {
+              var _annotation = get_local_annotation(this.dataset.editable_id);
+              widget.on_edit(_annotation);
+            } else {
+              // Edit annotation title. We have to specify the insertion point.
+              var element = $(this)
+                .parents(".Ldt-AnnotationsList-li")
+                .find(".Ldt-AnnotationsList-TitleContent.Ldt-live-editable");
+              edit_element(element[0]);
+            }
+          });
+          this.$.find(".Ldt-AnnotationsList-PublishAnnotation").click(function (
+            e
+          ) {
+            var _annotation = get_local_annotation(this.dataset.editable_id);
+            // Publish annotation to the server
+            if (
+              !confirm(
+                Mustache.render(widget.l10n.confirm_publish_message, {
+                  annotation: _annotation,
+                })
+              )
+            )
+              return;
+            var _url = Mustache.render(widget.api_endpoint_template, {
+              id: widget.source.projectId,
             });
-            this.$.find('.Ldt-AnnotationsList-PublishAnnotation').click(function(e) {
-                var _annotation = get_local_annotation(this.dataset.editable_id);
-                // Publish annotation to the server
-                if (!confirm(Mustache.to_html(widget.l10n.confirm_publish_message, { annotation: _annotation })))
-                    return;
-                var _url = Mustache.to_html(widget.api_endpoint_template, {id: widget.source.projectId});
-                if (_url !== "") {
-                    var _export = widget.player.sourceManager.newLocalSource({serializer: IriSP.serializers[widget.api_serializer]});
+            if (_url !== "") {
+              var _export = widget.player.sourceManager.newLocalSource({
+                serializer: ns.serializers[widget.api_serializer],
+              });
 
-                    if (widget.publish_type) {
-                        // If publish_type is specified, try to set the annotation type of the exported annotation
-                        var at = widget.source.getAnnotationTypes().filter(function(at) { return at.title == widget.publish_type; });
-                        if (at.length == 1) {
-                            _annotation.setAnnotationType(at[0].id);
-                        }
-                    }
-                    var _exportedAnnotations = new IriSP.Model.List(widget.player.sourceManager);
-                    _exportedAnnotations.push(_annotation);
-                    _export.addList("annotation", _exportedAnnotations);
-                    IriSP.jQuery.ajax({
-                        url: _url,
-                        type: widget.api_method,
-                        contentType: 'application/json',
-                        data: _export.serialize(),
-                        success: function(_data) {
-                            $(this).addClass("published");
-                            // Save the published information
-                            var an = get_local_annotation(_annotation.id);
-                            // FIXME: handle "published" tag
-                            an.setTags( [ "published" ]);
-                            save_local_annotations();
-                            widget.player.trigger("Annotation.publish", _annotation);
-                        },
-                        error: function(_xhr, _error, _thrown) {
-                            IriSP.log("Error when sending annotation", _thrown);
-                        }
-                    });
+              if (widget.publish_type) {
+                // If publish_type is specified, try to set the annotation type of the exported annotation
+                var at = widget.source
+                  .getAnnotationTypes()
+                  .filter(function (at) {
+                    return at.title == widget.publish_type;
+                  });
+                if (at.length == 1) {
+                  _annotation.setAnnotationType(at[0].id);
                 }
-            });
-            this.$.find('.Ldt-AnnotationsList-TimeEdit').dblclick(function(e) {
-                var _this = this;
-                // Use current player time
-                var an = get_local_annotation(_this.dataset.editable_id);
-                if (an !== undefined) {
-                    // FIXME: implement Undo feature
-                    an.setBegin(widget.media.getCurrentTime().milliseconds);
-                    save_local_annotations();
-                    widget.player.trigger("Annotation.update", an);
-                    widget.refresh(true);
-                }
-            });
-        };
+              }
+              var _exportedAnnotations = new ns.Model.List(
+                widget.player.sourceManager
+              );
+              _exportedAnnotations.push(_annotation);
+              _export.addList("annotation", _exportedAnnotations);
+              jQuery.ajax({
+                url: _url,
+                type: widget.api_method,
+                contentType: "application/json",
+                data: _export.serialize(),
+                success: function (_data) {
+                  $(this).addClass("published");
+                  // Save the published information
+                  var an = get_local_annotation(_annotation.id);
+                  // FIXME: handle "published" tag
+                  an.setTags(["published"]);
+                  save_local_annotations();
+                  widget.player.trigger("Annotation.publish", _annotation);
+                },
+                error: function (_xhr, _error, _thrown) {
+                  ns.log("Error when sending annotation", _thrown);
+                },
+              });
+            }
+          });
+          this.$.find(".Ldt-AnnotationsList-TimeEdit").dblclick(function (e) {
+            var _this = this;
+            // Use current player time
+            var an = get_local_annotation(_this.dataset.editable_id);
+            if (an !== undefined) {
+              // FIXME: implement Undo feature
+              an.setBegin(widget.media.getCurrentTime().milliseconds);
+              save_local_annotations();
+              widget.player.trigger("Annotation.update", an);
+              widget.refresh(true);
+            }
+          });
+        }
 
-        this.$.find('.Ldt-AnnotationsList-Tag-Li').click(function() {
-            _this.source.getAnnotations().search(IriSP.jQuery(this).text().replace(/(^\s+|\s+$)/g,''));
+        this.$.find(".Ldt-AnnotationsList-Tag-Li").click(function () {
+          _this.source.getAnnotations().search(
+            jQuery(this)
+              .text()
+              .replace(/(^\s+|\s+$)/g, "")
+          );
         });
-        this.$.find('.Ldt-Annotation-Timecode').click(function () {
-            _this.media.setCurrentTime(Number(this.dataset.timecode));
+        this.$.find(".Ldt-Annotation-Timecode").click(function () {
+          _this.media.setCurrentTime(Number(this.dataset.timecode));
         });
 
-        this.$.find(".Ldt-AnnotationsList-Play").click(function() {
-            var _el = IriSP.jQuery(this),
-                _annid = _el.attr("data-annotation-id");
-            if (_this.jwplayers[_annid]) {
-                jwplayer(_this.jwplayers[_annid]).play();
-            }
-            _this.media.pause();
+        this.$.find(".Ldt-AnnotationsList-Play").click(function () {
+          var _el = jQuery(this),
+            _annid = _el.attr("data-annotation-id");
+          if (_this.jwplayers[_annid]) {
+            jwplayer(_this.jwplayers[_annid]).play();
+          }
+          _this.media.pause();
         });
 
         if (this.source.getAnnotations().searching) {
-            var rx = _this.source.getAnnotations().regexp || false;
-            this.$.find(".Ldt-AnnotationsList-Title a, .Ldt-AnnotationsList-Description").each(function() {
-                var _$ = IriSP.jQuery(this);
-                _$.html(IriSP.textFieldHtml(_$.text(), rx));
-            });
+          var rx = _this.source.getAnnotations().regexp || false;
+          this.$.find(
+            ".Ldt-AnnotationsList-Title a, .Ldt-AnnotationsList-Description"
+          ).each(function () {
+            var _$ = jQuery(this);
+            _$.html(ns.textFieldHtml(_$.text(), rx));
+          });
         }
 
-        this.$.find(".Ldt-AnnotationsList-DeleteButton").click(_this.functionWrapper("onDeleteClick"))
+        this.$.find(".Ldt-AnnotationsList-DeleteButton").click(
+          _this.functionWrapper("onDeleteClick")
+        );
+      }
+
+      if (this.ajax_url) {
+        if (this.mashupMode) {
+          this.ajaxMashup();
+        } else {
+          if (
+            Math.abs(_currentTime - this.lastAjaxQuery) > this.ajax_granularity
+          ) {
+            this.ajaxSource();
+          }
+        }
+      }
+
+      return _list.length;
     }
 
-    if (this.ajax_url) {
-        if (this.mashupMode) {
-            this.ajaxMashup();
-        } else {
-            if (Math.abs(_currentTime - this.lastAjaxQuery) > (this.ajax_granularity)) {
-                this.ajaxSource();
-            }
-        }
-    }
-    
-    return _list.length;
-};
-
-IriSP.Widgets.AnnotationsList.prototype.onDeleteClick = function(event){
-    _list = this.getWidgetAnnotations();
-    ann_id = event.target.dataset.annotation;
-    delete_preview_$ = this.$.find(".Ldt-AnnotationsList-ul-ToDelete");
-    delete_preview_$.html("");
-    _list = _list.filter(function(_annotation){
-        return _annotation.id == ann_id
-    })
-    var _annotation = _list[0],
+    onDeleteClick(event) {
+      _list = this.getWidgetAnnotations();
+      ann_id = event.target.dataset.annotation;
+      delete_preview_$ = this.$.find(".Ldt-AnnotationsList-ul-ToDelete");
+      delete_preview_$.html("");
+      _list = _list.filter(function (_annotation) {
+        return _annotation.id == ann_id;
+      });
+      var _annotation = _list[0],
         _title = "",
         _creator = "",
         _this = this;
-    if (_annotation.creator) {
+      if (_annotation.creator) {
         var _users = [],
-            _user = {};
+          _user = {};
         if (_this.source.users_data) {
-            _users = _this.source.users_data.filter(function(_user_data){
-                return _user_data.username == _annotation.creator;
-            });
+          _users = _this.source.users_data.filter(function (_user_data) {
+            return _user_data.username == _annotation.creator;
+          });
         }
-        if (_users.length == 0){
-            _user.username = _annotation.creator
-        }
-        else{
-            _user = _users[0]
+        if (_users.length == 0) {
+          _user.username = _annotation.creator;
+        } else {
+          _user = _users[0];
         }
         _creator = _this.make_name_string_function(_user);
-    }
-    if (_annotation.title) {
+      }
+      if (_annotation.title) {
         var tempTitle = _annotation.title;
-        if( tempTitle.substr(0, _title.length + 1) == (_title + ":") ){
-            _title = "";
+        if (tempTitle.substr(0, _title.length + 1) == _title + ":") {
+          _title = "";
         }
-        _title = _title + ( (_title=="") ? "" : ": ") + _annotation.title;
-    }
-    var _created = false;
-    if (this.show_creation_date) {
-        _created = _annotation.created.toLocaleDateString()+", "+_annotation.created.toLocaleTimeString();
+        _title = _title + (_title == "" ? "" : ": ") + _annotation.title;
+      }
+      var _created = false;
+      if (this.show_creation_date) {
+        _created =
+          _annotation.created.toLocaleDateString() +
+          ", " +
+          _annotation.created.toLocaleTimeString();
+      }
+      var _data = {
+        id: _annotation.id,
+        media_id: _annotation.getMedia().id,
+        htitle: ns.textFieldHtml(_title),
+        hdescription: ns.textFieldHtml(_annotation.description),
+        begin: _annotation.begin.toString(),
+        end: _annotation.end.toString(),
+        created: _created,
+        show_timecode: this.show_timecode,
+        show_creator: this.show_creator,
+        creator: _creator,
+        tags: false,
+        l10n: this.l10n,
+        allow_annotations_deletion: false,
+      };
+      _html = Mustache.render(this.constructor.annotationTemplate, _data);
+      delete_preview_$.html(_html);
+
+      this.$.find(".Ldt-AnnotationsList-ConfirmDelete").click(function () {
+        _this.sendDelete(ann_id);
+      });
+
+      this.showScreen("Delete");
     }
-    var _data = {
-            id : _annotation.id,
-            media_id : _annotation.getMedia().id,
-            htitle : IriSP.textFieldHtml(_title),
-            hdescription : IriSP.textFieldHtml(_annotation.description),
-            begin : _annotation.begin.toString(),
-            end : _annotation.end.toString(),
-            created : _created,
-            show_timecode : this.show_timecode,
-            show_creator : this.show_creator,
-            creator : _creator,
-            tags : false,
-            l10n: this.l10n,
-            allow_annotations_deletion: false
-    }
-    _html = Mustache.to_html(this.annotationTemplate, _data)
-    delete_preview_$.html(_html)
-    
-    this.$.find(".Ldt-AnnotationsList-ConfirmDelete").click(function(){
-        _this.sendDelete(ann_id);
-    });
-    
-    this.showScreen("Delete");    
-}
 
-IriSP.Widgets.AnnotationsList.prototype.refreshHeader = function() {
-    var annotation_count_string = " (" + this.annotations_count +" "+this.annotations_count_header_string+")";
-    this.$.find('.Ldt-AnnotationsList-header').html("");
-    this.$.find('.Ldt-AnnotationsList-header').html(
-        this.custom_header && typeof this.custom_header == "string"? this.custom_header + annotation_count_string : this.l10n.header + annotation_count_string
-    );
-}
+    refreshHeader() {
+      var annotation_count_string =
+        " (" +
+        this.annotations_count +
+        " " +
+        this.annotations_count_header_string +
+        ")";
+      this.$.find(".Ldt-AnnotationsList-header").html("");
+      this.$.find(".Ldt-AnnotationsList-header").html(
+        this.custom_header && typeof this.custom_header == "string"
+          ? this.custom_header + annotation_count_string
+          : this.l10n.header + annotation_count_string
+      );
+    }
 
-IriSP.Widgets.AnnotationsList.prototype.hide = function() {
-    var _this = this;
-    if (this.visible){
+    hide() {
+      var _this = this;
+      if (this.visible) {
         this.visible = false;
-        this.widget_$.slideUp(function(){
-            _this.$.find('.Ldt-AnnotationsList-header').hide();            
+        this.widget_$.slideUp(function () {
+          _this.$.find(".Ldt-AnnotationsList-header").hide();
         });
-        this.showScreen("Main")
+        this.showScreen("Main");
+      }
     }
-}
 
-IriSP.Widgets.AnnotationsList.prototype.show = function() {
-    if(!this.visible){
+    show() {
+      if (!this.visible) {
         this.visible = true;
-        this.$.find('.Ldt-AnnotationsList-header').show();
+        this.$.find(".Ldt-AnnotationsList-header").show();
         this.widget_$.slideDown();
-        this.showScreen("Main")
+        this.showScreen("Main");
+      }
     }
-}
-
 
-IriSP.Widgets.AnnotationsList.prototype.toggle = function() {
-    if (!this.always_visible) {
+    toggle() {
+      if (!this.always_visible) {
         if (this.visible) {
-            this.hide();
+          this.hide();
         } else {
-            this.show();
+          this.show();
         }
+      }
     }
-};
 
-IriSP.Widgets.AnnotationsList.prototype.revertToMainScreen = function(){
-    if (this.$.find(".Ldt-AnnotationsList-ScreenMain").is(":hidden")){
+    revertToMainScreen() {
+      if (this.$.find(".Ldt-AnnotationsList-ScreenMain").is(":hidden")) {
         this.showScreen("Main");
+      }
     }
-}
 
-IriSP.Widgets.AnnotationsList.prototype.sendDelete = function(id){
-    var _this = this,
-        _url = Mustache.to_html(this.api_delete_endpoint, {annotation_id: id, project_id: this.project_id})
-    
-    IriSP.jQuery.ajax({
+    sendDelete(id) {
+      var _this = this,
+        _url = Mustache.render(this.api_delete_endpoint, {
+          annotation_id: id,
+          project_id: this.project_id,
+        });
+
+      jQuery.ajax({
         url: _url,
         type: this.api_delete_method,
-        contentType: 'application/json',
-        success: function(_data) {
-            _this.showScreen('Success');
-            window.setTimeout(_this.functionWrapper("revertToMainScreen"),(_this.after_send_timeout || 2000));
-            _this.currentSource.getAnnotations().removeId(id);
-            _this.player.trigger("AnnotationsList.refresh");
+        contentType: "application/json",
+        success: function (_data) {
+          _this.showScreen("Success");
+          window.setTimeout(
+            _this.functionWrapper("revertToMainScreen"),
+            _this.after_send_timeout || 2000
+          );
+          _this.currentSource.getAnnotations().removeId(id);
+          _this.player.trigger("AnnotationsList.refresh");
         },
-        error: function(_xhr, _error, _thrown) {
-            IriSP.log("Error when sending annotation", _thrown);
-            _this.showScreen('Error');
-            window.setTimeout(_this.functionWrapper("revertToMainScreen"),(_this.after_send_timeout || 2000));
-        }
-    });
-    this.showScreen('Sending');
-}
-
-IriSP.Widgets.AnnotationsList.prototype.draw = function() {
-    this.jwplayers = {};
-    this.mashupMode = (this.media.elementType === "mashup");
-
-    this.renderTemplate();
-
-    var _this = this;
-    this.list_$ = this.$.find(".Ldt-AnnotationsList-ul");
-    this.widget_$ = this.$.find(".Ldt-AnnotationsListWidget");
-    
-    if (this.widget_max_height){
-        this.widget_$.css("max-height", this.widget_max_height)
+        error: function (_xhr, _error, _thrown) {
+          ns.log("Error when sending annotation", _thrown);
+          _this.showScreen("Error");
+          window.setTimeout(
+            _this.functionWrapper("revertToMainScreen"),
+            _this.after_send_timeout || 2000
+          );
+        },
+      });
+      this.showScreen("Sending");
     }
-    
-    if (this.show_filters){
-        if (this.user_filter){
-            this.userselect_$ = this.$.find("#Ldt-AnnotationsList-userFilter");
-            this.userselect_$.change(function(){
-                _this.player.trigger("AnnotationsList.refresh");
-            });
-            this.userselect_$.html("<option selected value='false'>"+this.l10n.everyone+"</option>");
-            this.usernames.forEach(function(_user){
-                var _users = _this.source.users_data.filter(function(_user_data){
-                    return _user_data.username == _user;
-                }),
-                    _user_data = {};
-                if (_users.length == 0){
-                    _user_data.username = _user;
-                }
-                else{
-                    _user_data = _users[0];
-                }
-                _this.userselect_$.append("<option value='"+_user+"'>"+_this.make_name_string_function(_user_data)+"</option>");
-            });
+
+    draw() {
+      this.jwplayers = {};
+      this.mashupMode = this.media.elementType === "mashup";
+
+      this.renderTemplate();
+
+      var _this = this;
+      this.list_$ = this.$.find(".Ldt-AnnotationsList-ul");
+      this.widget_$ = this.$.find(".Ldt-AnnotationsListWidget");
+
+      if (this.widget_max_height) {
+        this.widget_$.css("max-height", this.widget_max_height);
+      }
+
+      if (this.show_filters) {
+        if (this.user_filter) {
+          this.userselect_$ = this.$.find("#Ldt-AnnotationsList-userFilter");
+          this.userselect_$.change(function () {
+            _this.player.trigger("AnnotationsList.refresh");
+          });
+          this.userselect_$.html(
+            "<option selected value='false'>" + this.l10n.everyone + "</option>"
+          );
+          this.usernames.forEach(function (_user) {
+            var _users = _this.source.users_data.filter(function (_user_data) {
+                return _user_data.username == _user;
+              }),
+              _user_data = {};
+            if (_users.length == 0) {
+              _user_data.username = _user;
+            } else {
+              _user_data = _users[0];
+            }
+            _this.userselect_$.append(
+              "<option value='" +
+                _user +
+                "'>" +
+                _this.make_name_string_function(_user_data) +
+                "</option>"
+            );
+          });
         }
-        if (this.keyword_filter){
-            this.keywordinput_$ = this.$.find("#Ldt-AnnotationsList-keywordsFilter");
-            this.keywordinput_$.keyup(function(){
-                _this.player.trigger("AnnotationsList.refresh");
-            });
-            
+        if (this.keyword_filter) {
+          this.keywordinput_$ = this.$.find(
+            "#Ldt-AnnotationsList-keywordsFilter"
+          );
+          this.keywordinput_$.keyup(function () {
+            _this.player.trigger("AnnotationsList.refresh");
+          });
         }
-        if (this.segment_filter){
-            this.ignoresegmentcheckbox_$ = this.$.find("#Ldt-AnnotationsList-ignoreSegmentsFilter");
-            this.ignoresegmentcheckbox_$.click(function(){
-                _this.player.trigger("AnnotationsList.refresh");
-            });
+        if (this.segment_filter) {
+          this.ignoresegmentcheckbox_$ = this.$.find(
+            "#Ldt-AnnotationsList-ignoreSegmentsFilter"
+          );
+          this.ignoresegmentcheckbox_$.click(function () {
+            _this.player.trigger("AnnotationsList.refresh");
+          });
         }
-        if(this.date_filter){
-            this.datefilterinput_$ = this.$.find("#Ldt-AnnotationsList-dateFilter");
-            this.datefilterinput_$.datepicker({ dateFormat: 'dd/mm/yy' });
-            this.datefilterinput_$.change(function(){
-                _this.player.trigger("AnnotationsList.refresh")
-            })
-            if (this.current_day_filter){
-                currentDate = new Date();
-                this.datefilterinput_$.datepicker("setDate",currentDate);
-            }
+        if (this.date_filter) {
+          this.datefilterinput_$ = this.$.find(
+            "#Ldt-AnnotationsList-dateFilter"
+          );
+          this.datefilterinput_$.datepicker({ dateFormat: "dd/mm/yy" });
+          this.datefilterinput_$.change(function () {
+            _this.player.trigger("AnnotationsList.refresh");
+          });
+          if (this.current_day_filter) {
+            currentDate = new Date();
+            this.datefilterinput_$.datepicker("setDate", currentDate);
+          }
         }
-        if(this.latest_contributions_filter){
-            this.latestcontributionscheckbox_$ = this.$.find("#Ldt-AnnotationsList-latestContributionsFilter");
-            this.latestcontributionscheckbox_$.click(function(){
-                _this.player.trigger("AnnotationsList.refresh");
-            });
+        if (this.latest_contributions_filter) {
+          this.latestcontributionscheckbox_$ = this.$.find(
+            "#Ldt-AnnotationsList-latestContributionsFilter"
+          );
+          this.latestcontributionscheckbox_$.click(function () {
+            _this.player.trigger("AnnotationsList.refresh");
+          });
         }
-    }
-    
-    this.source.getAnnotations().on("search", function(_text) {
+      }
+
+      this.source.getAnnotations().on("search", function (_text) {
         _this.searchString = _text;
         if (_this.source !== _this.currentSource) {
-            _this.currentSource.getAnnotations().search(_text);
-            _this.throttledRefresh();
+          _this.currentSource.getAnnotations().search(_text);
+          _this.throttledRefresh();
         }
-    });
-    this.source.getAnnotations().on("found", function() {
+      });
+      this.source.getAnnotations().on("found", function () {
         _this.throttledRefresh();
-    });
-    this.source.getAnnotations().on("not-found", function() {
+      });
+      this.source.getAnnotations().on("not-found", function () {
         _this.throttledRefresh();
-    });
-    this.source.getAnnotations().on("clear-search", function() {
+      });
+      this.source.getAnnotations().on("clear-search", function () {
         _this.searchString = false;
         if (_this.source !== _this.currentSource) {
-            _this.currentSource.getAnnotations().trigger("clear-search");
+          _this.currentSource.getAnnotations().trigger("clear-search");
         }
-    });
-    
-    this.$.find(".Ldt-AnnotationsList-Close").click(function(){
+      });
+
+      this.$.find(".Ldt-AnnotationsList-Close").click(function () {
         _this.showScreen("Main");
-    })
-    
-    this.source.getAnnotations().on("search-cleared", function() {
+      });
+
+      this.source.getAnnotations().on("search-cleared", function () {
         _this.throttledRefresh();
-    });
+      });
 
-    this.onMdpEvent("AnnotationsList.refresh", function() {
+      this.onMdpEvent("AnnotationsList.refresh", function () {
         if (_this.ajax_url) {
-            if (_this.mashupMode) {
-                _this.ajaxMashup();
-            } else {
-                _this.ajaxSource();
-            }
+          if (_this.mashupMode) {
+            _this.ajaxMashup();
+          } else {
+            _this.ajaxSource();
+          }
         }
         _this.throttledRefresh(false);
-    });
+      });
 
-    this.onMdpEvent("AnnotationsList.update", function() {
+      this.onMdpEvent("AnnotationsList.update", function () {
         if (_this.ajax_url) {
-            if (_this.mashupMode) {
-                _this.ajaxMashup();
-            } else {
-                _this.ajaxSource();
-            }
+          if (_this.mashupMode) {
+            _this.ajaxMashup();
+          } else {
+            _this.ajaxSource();
+          }
         }
         _this.throttledRefresh(true);
-    });
+      });
 
-    if (this.ajax_url) {
+      if (this.ajax_url) {
         if (this.mashupMode) {
-            this.ajaxMashup();
+          this.ajaxMashup();
         } else {
-            this.ajaxSource();
+          this.ajaxSource();
         }
-    } else {
+      } else {
         this.currentSource = this.source;
-    }
+      }
+
+      if (this.refresh_interval) {
+        window.setInterval(function () {
+          _this.currentSource.get();
+        }, this.refresh_interval);
+      }
+
+      if (this.annotations_count_header) {
+        this.annotations_count = false;
+      }
+
+      this.onMdpEvent("AnnotationsList.toggle", "toggle");
+      this.onMdpEvent("AnnotationsList.hide", "hide");
+      this.onMdpEvent("AnnotationsList.show", "show");
 
-    if (this.refresh_interval) {
-        window.setInterval(function() {
-            _this.currentSource.get();
-        }, this.refresh_interval);
-    }
-    
-    if (this.annotations_count_header){
-        this.annotations_count = false;
+      this.onMdpEvent(
+        "createAnnotationWidget.addedAnnotation",
+        this.throttledRefresh
+      );
+      var _events = ["timeupdate", "seeked", "loadedmetadata", "settimerange"];
+      for (var _i = 0; _i < _events.length; _i++) {
+        this.onMediaEvent(_events[_i], this.throttledRefresh);
+      }
+
+      this.throttledRefresh();
+
+      this.showScreen("Main");
+      this.$.find(".Ldt-AnnotationsList-CancelDelete").click(function () {
+        _this.showScreen("Main");
+      });
+
+      this.visible = true;
+      if (!this.start_visible) {
+        this.hide();
+      }
     }
-    
-    this.onMdpEvent("AnnotationsList.toggle","toggle");
-    this.onMdpEvent("AnnotationsList.hide", "hide");
-    this.onMdpEvent("AnnotationsList.show", "show");
-    
-    this.onMdpEvent("createAnnotationWidget.addedAnnotation", this.throttledRefresh);
-    var _events = [
-        "timeupdate",
-        "seeked",
-        "loadedmetadata",
-        "settimerange"
-    ];
-    for (var _i = 0; _i < _events.length; _i++) {
-        this.onMediaEvent(_events[_i], this.throttledRefresh);
-    }
+  };
+};
 
-    this.throttledRefresh();
-    
-    this.showScreen("Main");
-    this.$.find(".Ldt-AnnotationsList-CancelDelete").click(function(){
-        _this.showScreen("Main")
-    });
-    
-    this.visible = true;
-    if (!this.start_visible){
-        this.hide();
-    }
-};
+export { AnnotationsList, annotationsListStyles };
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/widgets/AnnotationsList.module.css	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,254 @@
+/* AnnotationsListWidget */
+
+#ui-datepicker-div
+{
+    display: none;
+}
+
+.Ldt-AnnotationsListWidget {
+    border: none; 
+    margin: 0; 
+    padding: 0;
+    overflow: auto;
+}
+.Ldt-AnnotationsListWidget a {
+    text-decoration: none;
+}
+
+.Ldt-AnnotationsList-Audio {
+    width: 1px; height: 1px;
+}
+
+.Ldt-AnnotationsList-Filters {
+	display: table-cell;
+	width: 100%;
+	height: 30px;
+	vertical-align: middle;
+    text-align: center;
+	
+}
+
+.Ldt-AnnotationsList-filter-text {
+    text-align: left;
+	display: inline;
+	margin: 4px 2px;
+}
+
+.Ldt-AnnotationsList-filter-dropdown {
+    text-align: center;
+	display: inline;
+	margin: 4px 2px;
+}
+
+.Ldt-AnnotationsList-filter-checkbox {
+    text-align: center;
+	display: inline;
+	margin: 4px 2px;
+}
+
+ul.Ldt-AnnotationsList-ul, ul.Ldt-AnnotationsList-ul-toDelete  {
+    list-style: none;
+    padding: 0px;
+    margin: 0px;
+}
+
+li.Ldt-AnnotationsList-li {
+    width: 100%;
+    clear: both;
+    margin: 2px 0;
+    padding: 2px 0;
+    min-height: 3em;
+    position: relative;
+}
+.Ldt-AnnotationsList-li.selected {
+    background-image: url(img/pinstripe-grey.png);
+    z-index: 1;
+}
+.Ldt-AnnotationsList-ThumbContainer {
+    float: left;
+    width: 80px;
+    height: 50px;
+    text-align: center;
+    margin: 0px 2px 10px 2px;
+    box-shadow: #808080 0px 0px 2px;
+}
+.Ldt-AnnotationsList-Thumbnail {
+    border: none;
+    max-width: 100%;
+    max-height: 100%;
+    margin: 0 auto;
+}
+
+.Ldt-AnnotationsList-External-Icon {
+	background-image: url(img/external.png);
+	z-index: 100;
+	height: 15px;
+	width: 15px;
+	position: relative;
+	bottom: 20px;
+	left: 64px;
+}
+
+.Ldt-AnnotationsList-DeleteButton {
+	margin: 0px;
+	float: right;
+	font-size: 20px;
+	position: relative;
+	top: -50px;
+	left: -5px;
+	color: #787878
+}
+.Ldt-AnnotationsList-DeleteButton:hover {
+	color: #f7268e;
+	cursor: pointer;
+}
+
+.Ldt-AnnotationsList-Duration {
+    color: #f7268e;
+    float: right;
+    text-align: right;
+    font-size: 12px;
+    margin: 2px;
+}
+.Ldt-AnnotationsList-CreationDate {
+    color: #f7268e;
+    text-align: left;
+    font-size: 12px;
+    margin: 2px 2px 2px 89px;
+}
+h3.Ldt-AnnotationsList-Title span.Ldt-AnnotationsList-TitleContent{
+    color: #0068c4;
+    font-size: 13px;
+    margin-left: 5px;
+    font-weight: bold;
+}
+
+h3.Ldt-AnnotationsList-Title.Ldt-Annotation-Timecode{	
+    font-size: 13px;
+}
+
+.Ldt-AnnotationsList-Title a {
+    color: #0068c4;
+}
+
+.Ldt-AnnotationsList-Creator {
+    color: #4d90f4;
+    margin-left: 5px;
+    font-size: 13px;
+}
+
+p.Ldt-AnnotationsList-Description {
+    margin: 2px 0 2px 89px;
+    font-size: 12px;
+    color: #333333;
+}
+
+.Ldt-AnnotationsList-Description a {
+    color: #0068c4;
+}
+
+.Ldt-AnnotationsList-Description a:hover {
+    text-decoration: underline; color: #800000;
+}
+
+ul.Ldt-AnnotationsList-Tags {
+    list-style: none;
+    padding: 0;
+    margin: 2px 0 0 82px;
+}
+
+li.Ldt-AnnotationsList-Tag-Li {
+    display: inline-block; border: none; margin: 0 10px 5px 0; height: 23px; padding: 0 0 0 20px;
+    background: url(img/tag.png) left top no-repeat;
+    cursor: pointer;
+}
+
+.Ldt-AnnotationsList-Tag-Li span {
+    display: inline-block; font-size: 12px; height: 19px; padding: 4px 5px 0 0; border: none; margin: 0;
+    background: url(img/tag.png) right top no-repeat;
+}
+
+li.Ldt-AnnotationsList-Tag-Li:hover {
+    background-position: left -23px;
+}
+
+.Ldt-AnnotationsList-Tag-Li:hover span {
+    background-position: right -23px;
+}
+
+.Ldt-AnnotationsList-Play {
+    width: 125px; height: 20px; margin: 2px 0 2px 82px; text-align: center;
+    padding: 3px 5px 0 20px; font-size: 12px; cursor: pointer;
+    background: url(img/voiceannotation.png); color: #333333;
+}
+
+.Ldt-AnnotationsList-Play:hover {
+    background-position: 0 bottom;
+}
+
+.Ldt-AnnotationsList-EditControls {
+    opacity: 0;
+    position: absolute;
+    bottom: 2px;
+    right: 8px;
+}
+
+.Ldt-AnnotationsList-li:hover .Ldt-AnnotationsList-EditControls {
+    display: inline-block;
+    opacity: .8;
+    transition: opacity 1000ms ease-in-out;
+}
+
+.Ldt-AnnotationsList-EditControls > div {
+    display: inline-block;
+    width: 16px;
+    height: 16px;
+    cursor: pointer;
+    margin-left: 8px;
+}
+
+.Ldt-AnnotationsList-Delete {
+    background: url(img/delete.png);
+}
+
+.Ldt-AnnotationsList-Edit {
+    background: url(img/edit.png);
+}
+
+.Ldt-AnnotationsList-PublishAnnotation {
+    background: url(img/publish_annotation.png);
+}
+
+.published .Ldt-AnnotationsList-PublishAnnotation {
+    background: url(img/published_annotation.png);
+}
+
+.Ldt-AnnotationsList .editing {
+    display: none;
+}
+
+.Ldt-AnnotationsList .editableInput {
+    width: 80%;
+}
+
+.Ldt-AnnotationsList-ScreenMain{
+	margin: 0px;
+	padding: 0px;
+}
+
+.Ldt-AnnotationsList-ScreenDelete, .Ldt-AnnotationsList-ScreenSending, 
+.Ldt-AnnotationsList-ScreenError, .Ldt-AnnotationsList-ScreenSuccess{
+	margin-top: 15px;
+	width: 100%;
+	text-align: center;
+	vertical-align: middle;
+	font-size: 14px;
+	font-weight: bold;
+	color: #68273C;
+}
+
+a.Ldt-AnnotationsList-Close {
+    position: absolute; right: 2px;
+    display: inline-block; width: 17px; height: 17px; margin: 4px;
+    background: url(img/widget-control.png);
+}
\ No newline at end of file
--- a/src/widgets/Arrow.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/widgets/Arrow.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,88 +1,145 @@
-IriSP.Widgets.Arrow = function(player, config) {
-    IriSP.Widgets.Widget.call(this, player, config);
-    this.current_pilot_widget = this.pilot_widget
-};
+import Raphael from "raphael";
 
-IriSP.Widgets.Arrow.prototype = new IriSP.Widgets.Widget();
+// Arrow
+const Arrow = function (ns) {
+  return class extends ns.Widgets.Widget {
+    constructor(player, config) {
+      super(player, config);
+      this.current_pilot_widget = this.pilot_widget;
+    }
 
-IriSP.Widgets.Arrow.prototype.defaults = {
-    arrow_height : 12,
-    arrow_width : 20,
-    base_height : 0,
-    base_curve : 0,
-    fill_url: IriSP.widgetsDir + '/img/pinstripe.png',
-    fill_color: "#ffffff", //Gradients can be used, e.g. "90-#000-#fff" for vertical white-to-black
-    stroke_color: "#b7b7b7",
-    stroke_width: 1.5,
-    animation_speed: 20
-};
+    static defaults = {
+      arrow_height: 12,
+      arrow_width: 20,
+      base_height: 0,
+      base_curve: 0,
+      fill_url: ns.widgetsDir + "/img/pinstripe.png",
+      fill_color: "#ffffff", //Gradients can be used, e.g. "90-#000-#fff" for vertical white-to-black
+      stroke_color: "#b7b7b7",
+      stroke_width: 1.5,
+      animation_speed: 20,
+    };
 
-IriSP.Widgets.Arrow.prototype.draw = function() {
-    this.height = this.arrow_height + this.base_height;
-    this.$.addClass("Ldt-Arrow").css({
-        height: (1+this.height) + "px",
+    draw() {
+      this.height = this.arrow_height + this.base_height;
+      this.$.addClass("Ldt-Arrow").css({
+        height: 1 + this.height + "px",
         "margin-top": "1px",
-        overflow: "hidden"
-    });
-    this.paper = new Raphael(this.container, this.width, 1+this.height );
-    window.myArrow = this;
-    this.svgArrow = this.paper.path('M0,' + this.height + 'L' + this.width + ',' + this.height);
-    this.svgArrow.attr({
+        overflow: "hidden",
+      });
+      this.paper = new Raphael(this.container, this.width, 1 + this.height);
+      window.myArrow = this;
+      this.svgArrow = this.paper.path(
+        "M0," + this.height + "L" + this.width + "," + this.height
+      );
+      this.svgArrow.attr({
         stroke: this.stroke_color,
         "stroke-width": this.stroke_width,
-        fill: this.fill_url ? ( 'url(' + this.fill_url + ')' ) : this.fill_color
-    });
-    this.moveToX(0);
+        fill: this.fill_url ? "url(" + this.fill_url + ")" : this.fill_color,
+      });
+      this.moveToX(0);
+    }
+
+    drawAt(_x) {
+      _x = Math.max(0, Math.min(_x, this.width));
+      var _d =
+        "M0," +
+        this.height +
+        "L0," +
+        Math.min(this.height, this.arrow_height + this.base_curve) +
+        "Q0," +
+        this.arrow_height +
+        " " +
+        Math.max(0, Math.min(this.base_curve, _x - this.arrow_width / 2)) +
+        "," +
+        this.arrow_height +
+        "L" +
+        Math.max(0, _x - this.arrow_width / 2) +
+        "," +
+        this.arrow_height +
+        "L" +
+        Math.max(0, _x - this.arrow_width / 2) +
+        "," +
+        Math.min(
+          this.arrow_height,
+          (2 * this.arrow_height * _x) / this.arrow_width
+        ) +
+        "L" +
+        _x +
+        ",0" +
+        "L" +
+        Math.min(this.width, _x + this.arrow_width / 2) +
+        "," +
+        Math.min(
+          this.arrow_height,
+          (2 * this.arrow_height * (this.width - _x)) / this.arrow_width
+        ) +
+        "L" +
+        Math.min(this.width, _x + this.arrow_width / 2) +
+        "," +
+        this.arrow_height +
+        "L" +
+        Math.min(
+          this.width,
+          Math.max(this.width - this.base_curve, _x + this.arrow_width / 2)
+        ) +
+        "," +
+        this.arrow_height +
+        "Q" +
+        this.width +
+        "," +
+        this.arrow_height +
+        " " +
+        this.width +
+        "," +
+        Math.min(this.height, this.arrow_height + this.base_curve) +
+        "L" +
+        this.width +
+        "," +
+        this.height;
+      this.svgArrow.attr({
+        path: _d,
+      });
+    }
+
+    moveToX(_x) {
+      this.targetX = Math.max(0, Math.min(_x, this.width));
+      if (typeof this.animInterval === "undefined") {
+        this.animInterval = window.setInterval(
+          this.functionWrapper("increment"),
+          40
+        );
+      }
+      this.increment();
+    }
+
+    moveToTime(_t) {
+      this.moveToX((this.width * _t) / this.media.duration);
+    }
+
+    increment() {
+      if (typeof this.currentX === "undefined") {
+        this.currentX = this.targetX;
+      }
+      if (this.currentX < this.targetX) {
+        this.currentX = Math.min(
+          this.targetX,
+          this.currentX + this.animation_speed
+        );
+      }
+      if (this.currentX > this.targetX) {
+        this.currentX = Math.max(
+          this.targetX,
+          this.currentX - this.animation_speed
+        );
+      }
+      if (this.currentX === this.targetX) {
+        window.clearInterval(this.animInterval);
+        this.animInterval = undefined;
+      }
+      this.drawAt(this.currentX);
+    }
+  };
 };
 
-IriSP.Widgets.Arrow.prototype.drawAt = function(_x) {
-    _x = Math.max(0, Math.min(_x, this.width));
-    var _d = 'M0,' + this.height
-        + 'L0,' + Math.min( this.height, this.arrow_height + this.base_curve)
-        + 'Q0,' + this.arrow_height
-        + ' ' + Math.max(0, Math.min(this.base_curve, _x - this.arrow_width / 2)) + ',' + this.arrow_height
-        + 'L' + Math.max(0, _x - this.arrow_width / 2) + ',' + this.arrow_height
-        + 'L' + Math.max(0, _x - this.arrow_width / 2) + ',' + Math.min(this.arrow_height, 2 * this.arrow_height * _x / this.arrow_width)
-        + 'L' + _x + ',0'
-        + 'L' + Math.min(this.width, _x + this.arrow_width / 2) + ',' + Math.min(this.arrow_height, 2 * this.arrow_height * ( this.width - _x ) / this.arrow_width)
-        + 'L' + Math.min(this.width, _x + this.arrow_width / 2) + ',' + this.arrow_height
-        + 'L' + Math.min(this.width, Math.max(this.width - this.base_curve, _x + this.arrow_width / 2)) + ',' + this.arrow_height
-        + 'Q' + this.width + ',' + this.arrow_height
-        + ' ' + this.width + ',' + Math.min( this.height, this.arrow_height + this.base_curve)
-        + 'L' + this.width + ',' + this.height;
-    this.svgArrow.attr({
-        path: _d
-    });
-};
-
-IriSP.Widgets.Arrow.prototype.moveToX = function(_x) {
-    this.targetX = Math.max(0, Math.min(_x, this.width));
-    if (typeof this.animInterval === "undefined") {
-        this.animInterval = window.setInterval(
-            this.functionWrapper("increment"),
-            40
-        );
-    }
-    this.increment();
-};
-
-IriSP.Widgets.Arrow.prototype.moveToTime = function(_t) {
-    this.moveToX(this.width * _t / this.media.duration);
-};
-
-IriSP.Widgets.Arrow.prototype.increment = function() {
-    if (typeof this.currentX === "undefined") {
-        this.currentX = this.targetX;
-    }
-    if (this.currentX < this.targetX) {
-        this.currentX = Math.min(this.targetX, this.currentX + this.animation_speed);
-    }
-    if (this.currentX > this.targetX) {
-        this.currentX = Math.max(this.targetX, this.currentX - this.animation_speed);
-    }
-    if (this.currentX === this.targetX) {
-        window.clearInterval(this.animInterval);
-        this.animInterval = undefined;
-    }
-    this.drawAt(this.currentX);
-};
+export { Arrow };
--- a/src/widgets/AutoPlayer.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/widgets/AutoPlayer.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,76 +1,91 @@
-IriSP.Widgets.AutoPlayer = function(player, config) {
-    IriSP.Widgets.Widget.call(this, player, config);
-};
-
-IriSP.Widgets.AutoPlayer.prototype = new IriSP.Widgets.Widget();
+// AutoPlayer
 
-IriSP.Widgets.AutoPlayer.prototype.defaults = {
-    default_type: "JwpPlayer"
-};
-
-IriSP.Widgets.AutoPlayer.prototype.draw = function() {
-
-    if (typeof this.video === "undefined") {
-        this.video = this.media.video;
+const AutoPlayer = function (ns) {
+  return class extends ns.Widgets.Widget {
+    constructor(player, config) {
+      super(player, config);
     }
 
-    var _props = [ "live", "provider", "autostart", "streamer", "video", "height", "width", "url_transform" ],
+    static defaults = {
+      default_type: "HtmlPlayer",
+    };
+
+    draw() {
+      if (typeof this.video === "undefined") {
+        this.video = this.media.video;
+      }
+
+      var _props = [
+          "live",
+          "provider",
+          "autostart",
+          "streamer",
+          "video",
+          "height",
+          "width",
+          "url_transform",
+        ],
         _opts = {},
         _types = [
-            {
-                regexp: /^rtmp:\/\//,
-                type: "JwpPlayer"
-            },
-            {
-                regexp: /\.(mp4|m4v|mp3)$/,
-                type: "AdaptivePlayer"
-            },
-            {
-                regexp: /\.(ogg|ogv|webm)$/,
-                type: "HtmlPlayer"
-            },
-            {
-                regexp: /^(https?:\/\/)?(www\.)?youtube\.com/,
-                type: "PopcornPlayer"
-            },
-            {
-                regexp: /^(https?:\/\/)?(www\.)?vimeo\.com/,
-                type: "PopcornPlayer"
-            },
-            {
-                regexp: /^(https?:\/\/)?(www\.)?dailymotion\.com/,
-                type: "DailymotionPlayer"
-            }
+          {
+            regexp: /^rtmp:\/\//,
+            type: "JwpPlayer",
+          },
+          {
+            regexp: /\.(mp4|m4v|mp3)$/,
+            type: "AdaptivePlayer",
+          },
+          {
+            regexp: /\.(ogg|ogv|webm)$/,
+            type: "HtmlPlayer",
+          },
+          {
+            regexp: /^(https?:\/\/)?(www\.)?youtube\.com/,
+            type: "PopcornPlayer",
+          },
+          {
+            regexp: /^(https?:\/\/)?(www\.)?vimeo\.com/,
+            type: "PopcornPlayer",
+          },
+          {
+            regexp: /^(https?:\/\/)?(www\.)?dailymotion\.com/,
+            type: "DailymotionPlayer",
+          },
         ],
         _rtmprgx = /^rtmp:\/\//;
 
-    for (var i = 0; i < _types.length; i++) {
+      for (var i = 0; i < _types.length; i++) {
         if (this.video && _types[i].regexp.test(this.video.toLowerCase())) {
-            _opts.type =  _types[i].type;
-            break;
+          _opts.type = _types[i].type;
+          break;
         }
-    }
+      }
 
-    if (typeof _opts.type === "undefined") {
+      if (typeof _opts.type === "undefined") {
         _opts.type = this.default_type;
-    }
+      }
 
-    if (_opts.type === "AdaptivePlayer") {
-        var _canPlayType = document.createElement('video').canPlayType('video/mp4; codecs="avc1.42E01E"');
-        _opts.type = (_canPlayType !== "no") ? "HtmlPlayer" : "JwpPlayer";
-    }
+      if (_opts.type === "AdaptivePlayer") {
+        var _canPlayType = document
+          .createElement("video")
+          .canPlayType('video/mp4; codecs="avc1.42E01E"');
+        _opts.type = _canPlayType !== "no" ? "HtmlPlayer" : "JwpPlayer";
+      }
 
-    if (_rtmprgx.test(this.video)) {
+      if (_rtmprgx.test(this.video)) {
         _opts.provider = "rtmp";
         _opts.live = true;
-    }
+      }
 
-    for (var i = 0; i < _props.length; i++) {
+      for (var i = 0; i < _props.length; i++) {
         if (typeof this[_props[i]] !== "undefined") {
-            _opts[_props[i]] = this[_props[i]];
+          _opts[_props[i]] = this[_props[i]];
         }
-    }
+      }
 
-    this.insertSubwidget(this.$, _opts);
+      this.insertSubwidget(this.$, _opts);
+    };
+  };
+};
 
-};
+export { AutoPlayer };
--- a/src/widgets/Controller.css	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,248 +0,0 @@
-/* Player Widget */
-
-.Ldt-Ctrl {
-    font-size: 10px;
-    background: url('img/player_gradient.png') repeat-x transparent ;
-    height: 25px;
-    border: 1px solid #b6b8b8;
-    position: relative;
-    overflow: hidden;
-}
-
-.Ldt-Ctrl-Left {
-    float: left;
-}
-
-.Ldt-Ctrl-Right {
-    float: right;
-}
-
-.Ldt-Ctrl-button {
-    float: left;
-    width: 30px;
-    height: 25px;
-    background: url('img/player-sprites.png');
-    cursor: pointer;
-}
-
-.Ldt-Ctrl-spacer {
-    float: left;
-    width: 1px;
-    height: 25px;
-    background: #b6b8b8;
-}
-
-.Ldt-Ctrl-Play {
-    margin: 100px 0;
-    margin: 0 15px;
-}
-
-.Ldt-Ctrl-Play-PlayState {
-    background-position: 0 0;
-}
-
-.Ldt-Ctrl-Play-PlayState:hover {
-    background-position: 0 -25px;
-}
-
-.Ldt-Ctrl-Play-PlayState:active {
-    background-position: 0 -50px;
-}
-
-.Ldt-Ctrl-Play-PauseState {
-    background-position: -30px 0;
-}
-
-.Ldt-Ctrl-Play-PauseState:hover {
-    background-position: -30px -25px;
-}
-
-.Ldt-Ctrl-Play-PauseState:active {
-    background-position: -30px -50px;
-}
-
-.Ldt-Ctrl-Annotate {
-    margin: 0 2px;
-    background-position: -60px 0;
-}
-
-.Ldt-Ctrl-Annotate:hover {
-    background-position: -60px -25px;
-}
-
-.Ldt-Ctrl-Annotate:active {
-    background-position: -60px -50px;
-}
-
-.Ldt-Ctrl-SearchBtn {
-    margin: 0 2px;
-    background-position: -90px 0;
-}
-
-.Ldt-Ctrl-SearchBtn:hover {
-    background-position: -90px -25px;
-}
-
-.Ldt-Ctrl-SearchBtn:active {
-    background-position: -90px -50px;
-}
-
-.Ldt-Ctrl-Search {
-    width: 0; float: left; overflow: hidden;
-}
-
-input.Ldt-Ctrl-SearchInput {
-    -moz-box-sizing: border-box;
-    width: 145px;
-    height: 20px;
-    margin: 2px;
-    padding: 3px;
-    border: 1px solid #8080a0;
-    border-radius: 3px;
-    font-size: 13px;
-}
-
-.Ldt-Ctrl-Time {
-    float: left;
-    margin: 5px;
-    font-size: 12px;
-    font-family: Arial, Verdana, sans-serif;
-}
-
-.Ldt-Ctrl-Time-Elapsed {
-    float: left;
-    color: #4a4a4a;
-}
-
-.Ldt-Ctrl-Time-Separator {
-    margin: 0 4px;
-    float: left;
-}
-
-.Ldt-Ctrl-Time-Total {
-    float: left;
-    color: #b2b2b2;
-}
-
-.Ldt-Ctrl-Sound {
-    margin: 0 2px;
-}
-
-.Ldt-Ctrl-Sound-Full {
-    background-position: -120px 0;
-}
-
-.Ldt-Ctrl-Sound-Full:hover {
-    background-position: -120px -25px;
-}
-
-.Ldt-Ctrl-Sound-Full:active {
-    background-position: -120px -50px;
-}
-
-.Ldt-Ctrl-Sound-Mute {
-    background-position: -150px 0;
-}
-
-.Ldt-Ctrl-Sound-Mute:hover {
-    background-position: -150px -25px;
-}
-
-.Ldt-Ctrl-Sound-Mute:active {
-    background-position: -150px -50px;
-}
-
-.Ldt-Ctrl-Sound-Half {
-    background-position: -180px 0;
-}
-
-.Ldt-Ctrl-Sound-Half:hover {
-    background-position: -180px -25px;
-}
-
-.Ldt-Ctrl-Sound-Half:active {
-    background-position: -180px -50px;
-}
-
-.Ldt-Ctrl-Volume-Control {
-    display: none;
-    position: absolute;
-    background: url('img/player_gradient.png') repeat-x transparent ;
-    height: 25px;
-    width: 100px;
-    top: 25px;
-    right: -1px;
-    z-index: 100;
-    padding: 0 2px;
-    border: 1px solid #b6b8b8;
-}
-
-.Ldt-Ctrl-Volume-Bar {
-    height: 5px;
-    margin: 9px 3px 0;
-    background: #cccccc;
-    border: 1px solid #999999;
-    border-radius: 2px;
-}
-
-.Ldt-Ctrl-Volume-Control .ui-slider-handle {
-    width: 6px;
-    height: 19px;
-    background: #a8a8a8;
-    border: 1px solid #999999;
-    border-radius: 2px;
-    top: -8px;
-    margin-left: -4px;
-    cursor: pointer;
-}
-
-.Ldt-Ctrl-Volume-Control:hover .ui-slider-handle {
-    background: #F7268E;
-}
-
-/* quiz */
-
-.Ldt-Ctrl-Quiz-Enable button, .Ldt-Ctrl-Quiz-Create button, .Ldt-Ctrl-Quiz-Disactivated button, .Ldt-Ctrl-Fullscreen-Button{
-	border: none;
-	background: transparent;
-}
-
-.Ldt-Ctrl-Quiz-Enable {
-    background-image: url("img/quiz_off.svg");
-    float: left;
-    height: 22px;
-    width: 22px;
-    background-repeat: no-repeat;
-}
-.Ldt-Ctrl-Quiz-Enable.Ldt-Ctrl-Quiz-Toggle-Active {
-    background-image: url("img/quiz_on.svg");
-}
-
-.Ldt-Ctrl-Quiz-Create {
-    background-image: url("img/quiz_add_question.svg");
-    float: left;
-    height: 23px;
-    width: 26px;
-    background-repeat: no-repeat;
-    margin-left: 4px;
-    margin-top: 0px;
-    display: none;
-}
-.Ldt-Ctrl-Quiz-Create.Ldt-Ctrl-Quiz-Toggle-Active {
-    display: inline-block;
-}
-
-.Ldt-Ctrl-Fullscreen-Button {
-    margin-top: 3px;
-}
-
-.Ldt-Ctrl-Fullscreen-Button {
-    float: left;
-    background-image: url("img/fullscreen.svg");
-    background-position: right;
-    margin-right: 6px;
-    margin-top: 1px;
-    height: 22px;
-    width: 22px;
-    border: none;
-}
--- a/src/widgets/Controller.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/widgets/Controller.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,57 +1,62 @@
 /* Displays Play and Pause buttons, Search Button and Form, Volume Control */
+// Controller
 
-IriSP.Widgets.Controller = function(player, config) {
-    IriSP.Widgets.Widget.call(this, player, config);
-    this.lastSearchValue = "";
-};
+import controllerStyles from "./Controller.module.css";
 
-IriSP.Widgets.Controller.prototype = new IriSP.Widgets.Widget();
+import jQuery from "jquery";
 
-IriSP.Widgets.Controller.prototype.defaults = {
-    disable_annotate_btn: false,
-    disable_search_btn: false,
-    disable_ctrl_f: false,
-    disable_fullscreen : true,
-    always_show_search: false,
-    enable_quiz_toggle: undefined
-};
+const Controller = function (ns) {
+  return class extends ns.Widgets.Widget {
+    constructor(player, config) {
+      super(player, config);
+      this.lastSearchValue = "";
+    }
+
+    static defaults = {
+      disable_annotate_btn: false,
+      disable_search_btn: false,
+      disable_ctrl_f: false,
+      disable_fullscreen: true,
+      always_show_search: false,
+      enable_quiz_toggle: undefined,
+    };
 
-IriSP.Widgets.Controller.prototype.template =
-    '<div class="Ldt-Ctrl">'
-    + '<div class="Ldt-Ctrl-Left">'
-    + '<div class="Ldt-Ctrl-button Ldt-Ctrl-Play Ldt-Ctrl-Play-PlayState Ldt-TraceMe" title="{{l10n.play_pause}}"></div>'
-    + '<div class="Ldt-Ctrl-spacer"></div>'
-    + '{{^disable_annotate_btn}}'
-    + '<div class="Ldt-Ctrl-button Ldt-Ctrl-Annotate Ldt-TraceMe" title="{{l10n.annotate}}"></div>'
-    + '<div class="Ldt-Ctrl-spacer"></div>'
-    + '{{/disable_annotate_btn}}'
-    + '{{^disable_search_btn}}'
-    + '<div class="Ldt-Ctrl-button Ldt-Ctrl-SearchBtn Ldt-TraceMe" title="{{l10n.search}}"></div>'
-    + '{{/disable_search_btn}}'
-    + '<div class="Ldt-Ctrl-Search">'
-    + '<input placeholder="{{ l10n.search }}" type="search" class="Ldt-Ctrl-SearchInput Ldt-TraceMe"></input>'
-    + '</div>'
-    + '<div class="Ldt-Ctrl-Quiz-Enable Ldt-TraceMe" title="Activer/Désactiver le quiz"></div>'
-    + '<div class="Ldt-Ctrl-Quiz-Create Ldt-TraceMe" ></div>'
-    + '</div>'
-    + '<div class="Ldt-Ctrl-Right">'
-    + '{{^disable_fullscreen}}<div class="Ldt-Ctrl-Fullscreen-Button Ldt-TraceMe" title="Passer le lecteur en plein-écran"></div{{/disable_fullscreen}}'
-    + '<div class="Ldt-Ctrl-spacer"></div>'
-    + '<div class="Ldt-Ctrl-Time">'
-    + '<div class="Ldt-Ctrl-Time-Elapsed" title="{{l10n.elapsed_time}}">00:00</div>'
-    + '<div class="Ldt-Ctrl-Time-Separator">/</div>'
-    + '<div class="Ldt-Ctrl-Time-Total" title="{{l10n.total_time}}">00:00</div>'
-    + '</div>'
-    + '<div class="Ldt-Ctrl-spacer"></div>'
-    + '<div class="Ldt-Ctrl-button Ldt-Ctrl-Sound Ldt-Ctrl-Sound-Full Ldt-TraceMe" title="{{l10n.mute_unmute}}"></div>'
-    + '</div>'
-    + '<div class="Ldt-Ctrl-Volume-Control" title="{{l10n.volume_control}}">'
-    + '<div class="Ldt-Ctrl-Volume-Bar"></div>'
-    + '</div>'
-    + '</div>';
+    static template =
+      '<div class="Ldt-Ctrl">' +
+      '<div class="Ldt-Ctrl-Left">' +
+      '<div class="Ldt-Ctrl-button Ldt-Ctrl-Play Ldt-Ctrl-Play-PlayState Ldt-TraceMe" title="{{l10n.play_pause}}"></div>' +
+      '<div class="Ldt-Ctrl-spacer"></div>' +
+      "{{^disable_annotate_btn}}" +
+      '<div class="Ldt-Ctrl-button Ldt-Ctrl-Annotate Ldt-TraceMe" title="{{l10n.annotate}}"></div>' +
+      '<div class="Ldt-Ctrl-spacer"></div>' +
+      "{{/disable_annotate_btn}}" +
+      "{{^disable_search_btn}}" +
+      '<div class="Ldt-Ctrl-button Ldt-Ctrl-SearchBtn Ldt-TraceMe" title="{{l10n.search}}"></div>' +
+      "{{/disable_search_btn}}" +
+      '<div class="Ldt-Ctrl-Search">' +
+      '<input placeholder="{{ l10n.search }}" type="search" class="Ldt-Ctrl-SearchInput Ldt-TraceMe"></input>' +
+      "</div>" +
+      '<div class="Ldt-Ctrl-Quiz-Enable Ldt-TraceMe" title="Activer/Désactiver le quiz"></div>' +
+      '<div class="Ldt-Ctrl-Quiz-Create Ldt-TraceMe" ></div>' +
+      "</div>" +
+      '<div class="Ldt-Ctrl-Right">' +
+      '{{^disable_fullscreen}}<div class="Ldt-Ctrl-Fullscreen-Button Ldt-TraceMe" title="Passer le lecteur en plein-écran"></div{{/disable_fullscreen}}' +
+      '<div class="Ldt-Ctrl-spacer"></div>' +
+      '<div class="Ldt-Ctrl-Time">' +
+      '<div class="Ldt-Ctrl-Time-Elapsed" title="{{l10n.elapsed_time}}">00:00</div>' +
+      '<div class="Ldt-Ctrl-Time-Separator">/</div>' +
+      '<div class="Ldt-Ctrl-Time-Total" title="{{l10n.total_time}}">00:00</div>' +
+      "</div>" +
+      '<div class="Ldt-Ctrl-spacer"></div>' +
+      '<div class="Ldt-Ctrl-button Ldt-Ctrl-Sound Ldt-Ctrl-Sound-Full Ldt-TraceMe" title="{{l10n.mute_unmute}}"></div>' +
+      "</div>" +
+      '<div class="Ldt-Ctrl-Volume-Control" title="{{l10n.volume_control}}">' +
+      '<div class="Ldt-Ctrl-Volume-Bar"></div>' +
+      "</div>" +
+      "</div>";
 
-IriSP.Widgets.Controller.prototype.messages = {
-    en: {
+    static messages =  {
+      en: {
         play_pause: "Play/Pause",
         mute_unmute: "Mute/Unmute",
         play: "Play",
@@ -64,9 +69,9 @@
         total_time: "Total duration",
         volume: "Volume",
         volume_control: "Volume control",
-        enable_quiz: "Enable quiz"
-    },
-    fr: {
+        enable_quiz: "Enable quiz",
+      },
+      fr: {
         play_pause: "Lecture/Pause",
         mute_unmute: "Couper/Activer le son",
         play: "Lecture",
@@ -79,276 +84,301 @@
         total_time: "Durée totale",
         volume: "Niveau sonore",
         volume_control: "Réglage du niveau sonore",
-        enable_quiz: "Activer le quiz"
-    }
-};
-
-IriSP.Widgets.Controller.prototype.draw = function() {
-    var _this = this;
-    this.renderTemplate();
-
-    // Define blocks
-    this.$playButton = this.$.find(".Ldt-Ctrl-Play");
-    this.$searchBlock = this.$.find(".Ldt-Ctrl-Search");
-    this.$searchInput = this.$.find(".Ldt-Ctrl-SearchInput");
-    this.$volumeBar = this.$.find(".Ldt-Ctrl-Volume-Bar");
-
-    // handle events
-    this.onMediaEvent("play","playButtonUpdater");
-    this.onMediaEvent("pause","playButtonUpdater");
-    this.onMediaEvent("volumechange","volumeUpdater");
-    this.onMediaEvent("timeupdate","timeDisplayUpdater");
-    this.onMediaEvent("loadedmetadata","volumeUpdater");
-
-    // handle clicks
-    this.$playButton.click(this.functionWrapper("playHandler"));
-
-    if (this.enable_quiz_toggle !== undefined) {
-        if (this.enable_quiz_toggle) {
-            this.$.find(".Ldt-Ctrl-Quiz-Enable").addClass("Ldt-Ctrl-Quiz-Toggle-Active");
-            this.$.find(".Ldt-Ctrl-Quiz-Create").addClass("Ldt-Ctrl-Quiz-Toggle-Active");
-            // this.player.trigger("QuizCreator.show");
-            this.$.find("#QuizEditContainer").show();
-        }
-        else
-        {
-            this.$.find(".Ldt-Ctrl-Quiz-Enable").removeClass("Ldt-Ctrl-Quiz-Toggle-Active");
-            this.$.find(".Ldt-Ctrl-Quiz-Create").removeClass("Ldt-Ctrl-Quiz-Toggle-Active");
-            this.player.trigger("QuizCreator.hide");
-            this.$.find("#QuizEditContainer").hide();
-        }
-    } else {
-            this.$.find(".Ldt-Ctrl-Quiz-Enable").hide();
-    }
-
-    this.$.find(".Ldt-Ctrl-Annotate").click(function() {
-        _this.player.trigger("CreateAnnotation.toggle");
-    });
-    this.$.find(".Ldt-Ctrl-SearchBtn").click(this.functionWrapper("searchButtonHandler"));
-
-    this.$searchInput.keyup(this.functionWrapper("searchHandler"));
-    this.$searchInput.on("search", this.functionWrapper("searchHandler"));
-
-    // Fullscreen handling
-    this.$.find(".Ldt-Ctrl-Fullscreen-Button").click(this.functionWrapper("toggleFullscreen"));
-    var fullscreen_event_name = IriSP.getFullscreenEventname();
-    if (fullscreen_event_name) {
-        document.addEventListener(fullscreen_event_name, function() {
-            if (IriSP.isFullscreen() && IriSP.getFullscreenElement() == _this.$[0]) {
-                _this.$.addClass("Ldt-Fullscreen-Element");
-            } else {
-                _this.$.removeClass("Ldt-Fullscreen-Element");
-            }
-        });
+        enable_quiz: "Activer le quiz",
+      },
     };
 
-    // Quiz activation
-    this.$.find(".Ldt-Ctrl-Quiz-Enable").click(this.functionWrapper("toggleQuiz"));
-    this.$.find(".Ldt-Ctrl-Quiz-Create").click(this.functionWrapper("createQuiz"));
+    draw() {
+      var _this = this;
+      this.renderTemplate();
+
+      // Define blocks
+      this.$playButton = this.$.find(".Ldt-Ctrl-Play");
+      this.$searchBlock = this.$.find(".Ldt-Ctrl-Search");
+      this.$searchInput = this.$.find(".Ldt-Ctrl-SearchInput");
+      this.$volumeBar = this.$.find(".Ldt-Ctrl-Volume-Bar");
+
+      // handle events
+      this.onMediaEvent("play", "playButtonUpdater");
+      this.onMediaEvent("pause", "playButtonUpdater");
+      this.onMediaEvent("volumechange", "volumeUpdater");
+      this.onMediaEvent("timeupdate", "timeDisplayUpdater");
+      this.onMediaEvent("loadedmetadata", "volumeUpdater");
+
+      // handle clicks
+      this.$playButton.click(this.functionWrapper("playHandler"));
 
-    var _volctrl = this.$.find(".Ldt-Ctrl-Volume-Control");
-    this.$.find('.Ldt-Ctrl-Sound')
-        .click(this.functionWrapper("muteHandler"))
-        .mouseover(function() {
-            _volctrl.show();
-        })
-        .mouseout(function() {
-            _volctrl.hide();
+      if (this.enable_quiz_toggle !== undefined) {
+        if (this.enable_quiz_toggle) {
+          this.$.find(".Ldt-Ctrl-Quiz-Enable").addClass(
+            "Ldt-Ctrl-Quiz-Toggle-Active"
+          );
+          this.$.find(".Ldt-Ctrl-Quiz-Create").addClass(
+            "Ldt-Ctrl-Quiz-Toggle-Active"
+          );
+          // this.player.trigger("QuizCreator.show");
+          this.$.find("#QuizEditContainer").show();
+        } else {
+          this.$.find(".Ldt-Ctrl-Quiz-Enable").removeClass(
+            "Ldt-Ctrl-Quiz-Toggle-Active"
+          );
+          this.$.find(".Ldt-Ctrl-Quiz-Create").removeClass(
+            "Ldt-Ctrl-Quiz-Toggle-Active"
+          );
+          this.player.trigger("QuizCreator.hide");
+          this.$.find("#QuizEditContainer").hide();
+        }
+      } else {
+        this.$.find(".Ldt-Ctrl-Quiz-Enable").hide();
+      }
+
+      this.$.find(".Ldt-Ctrl-Annotate").click(function () {
+        _this.player.trigger("CreateAnnotation.toggle");
+      });
+      this.$.find(".Ldt-Ctrl-SearchBtn").click(
+        this.functionWrapper("searchButtonHandler")
+      );
+
+      this.$searchInput.keyup(this.functionWrapper("searchHandler"));
+      this.$searchInput.on("search", this.functionWrapper("searchHandler"));
+
+      // Fullscreen handling
+      this.$.find(".Ldt-Ctrl-Fullscreen-Button").click(
+        this.functionWrapper("toggleFullscreen")
+      );
+      var fullscreen_event_name = ns.getFullscreenEventname();
+      if (fullscreen_event_name) {
+        document.addEventListener(fullscreen_event_name, function () {
+          if (ns.isFullscreen() && ns.getFullscreenElement() == _this.$[0]) {
+            _this.$.addClass("Ldt-Fullscreen-Element");
+          } else {
+            _this.$.removeClass("Ldt-Fullscreen-Element");
+          }
         });
-    _volctrl.mouseover(function() {
-        _volctrl.show();
-    }).mouseout(function() {
-        _volctrl.hide();
-    });
+      }
+
+      // Quiz activation
+      this.$.find(".Ldt-Ctrl-Quiz-Enable").click(
+        this.functionWrapper("toggleQuiz")
+      );
+      this.$.find(".Ldt-Ctrl-Quiz-Create").click(
+        this.functionWrapper("createQuiz")
+      );
 
-    // Handle CTRL-F
-    if (!this.disable_ctrl_f) {
+      var _volctrl = this.$.find(".Ldt-Ctrl-Volume-Control");
+      this.$.find(".Ldt-Ctrl-Sound")
+        .click(this.functionWrapper("muteHandler"))
+        .mouseover(function () {
+          _volctrl.show();
+        })
+        .mouseout(function () {
+          _volctrl.hide();
+        });
+      _volctrl
+        .mouseover(function () {
+          _volctrl.show();
+        })
+        .mouseout(function () {
+          _volctrl.hide();
+        });
+
+      // Handle CTRL-F
+      if (!this.disable_ctrl_f) {
         var _fKey = "F".charCodeAt(0),
-            _lastCtrlFTime = 0;
-        IriSP.jQuery(document).keydown(function(_event) {
-            if (_event.keyCode === _fKey && (_event.ctrlKey || _event.metaKey)) {
-                var _time = IriSP.jQuery.now();
-                if (_time - _lastCtrlFTime > 2000) {
-                    _this.searchButtonHandler();
-                }
-                _lastCtrlFTime = _time;
-                return false;
+          _lastCtrlFTime = 0;
+        jQuery(document).keydown(function (_event) {
+          if (_event.keyCode === _fKey && (_event.ctrlKey || _event.metaKey)) {
+            var _time = jQuery.now();
+            if (_time - _lastCtrlFTime > 2000) {
+              _this.searchButtonHandler();
             }
+            _lastCtrlFTime = _time;
+            return false;
+          }
         });
+      }
+
+      // Allow Volume Cursor Dragging
+      this.$volumeBar.slider({
+        slide: function (event, ui) {
+          _this.$volumeBar.attr(
+            "title",
+            _this.l10n.volume + ": " + ui.value + "%"
+          );
+          _this.media.setVolume(ui.value / 100);
+        },
+        stop: this.functionWrapper("volumeUpdater"),
+      });
+
+      // trigger an ns.Player.MouseOver to the widgets that are interested (i.e : sliderWidget)
+      this.$.hover(
+        function () {
+          _this.player.trigger("Player.MouseOver");
+        },
+        function () {
+          _this.player.trigger("Player.MouseOut");
+        }
+      );
+
+      this.timeDisplayUpdater(new ns.Model.Time(0));
+
+      var annotations = this.source.getAnnotations();
+      annotations.on("search", function (_text) {
+        _this.$searchInput.val(_text);
+        _this.showSearchBlock();
+      });
+      annotations.on("found", function (_text) {
+        _this.$searchInput.css("background-color", "#e1ffe1");
+      });
+      annotations.on("not-found", function (_text) {
+        _this.$searchInput.css("background-color", "#d62e3a");
+      });
+      annotations.on("search-cleared", function () {
+        _this.hideSearchBlock();
+      });
+      if (_this.always_show_search) {
+        _this.showSearchBlock();
+      }
     }
 
-    // Allow Volume Cursor Dragging
-    this.$volumeBar.slider({
-        slide: function(event, ui) {
-            _this.$volumeBar.attr("title",_this.l10n.volume+': ' + ui.value + '%');
-            _this.media.setVolume(ui.value / 100);
-        },
-        stop: this.functionWrapper("volumeUpdater")
-    });
-
-    // trigger an IriSP.Player.MouseOver to the widgets that are interested (i.e : sliderWidget)
-    this.$.hover(
-        function() {
-            _this.player.trigger("Player.MouseOver");
-        },
-        function() {
-            _this.player.trigger("Player.MouseOut");
-        });
-
-    this.timeDisplayUpdater(new IriSP.Model.Time(0));
+    /* Update the elasped time div */
+    timeDisplayUpdater(_time) {
+      // we get it at each call because it may change.
+      var _totalTime = this.media.duration;
+      this.$.find(".Ldt-Ctrl-Time-Elapsed").html(_time.toString());
+      this.$.find(".Ldt-Ctrl-Time-Total").html(_totalTime.toString());
+    }
 
-    var annotations = this.source.getAnnotations();
-    annotations.on("search", function(_text) {
-        _this.$searchInput.val(_text);
-        _this.showSearchBlock();
-    });
-    annotations.on("found", function(_text) {
-        _this.$searchInput.css('background-color','#e1ffe1');
-    });
-    annotations.on("not-found", function(_text) {
-        _this.$searchInput.css('background-color', "#d62e3a");
-    });
-    annotations.on("search-cleared", function() {
-        _this.hideSearchBlock();
-    });
-    if (_this.always_show_search) {
-        _this.showSearchBlock();
-    }
-};
-
-/* Update the elasped time div */
-IriSP.Widgets.Controller.prototype.timeDisplayUpdater = function(_time) {
-
-    // we get it at each call because it may change.
-    var _totalTime = this.media.duration;
-    this.$.find(".Ldt-Ctrl-Time-Elapsed").html(_time.toString());
-    this.$.find(".Ldt-Ctrl-Time-Total").html(_totalTime.toString());
-};
-
-/* update the icon of the button - separate function from playHandler
+    /* update the icon of the button - separate function from playHandler
    because in some cases (for instance, when the user directly clicks on
    the jwplayer window) we have to change the icon without playing/pausing
 */
-IriSP.Widgets.Controller.prototype.playButtonUpdater = function() {
-    if (this.media.getPaused()) {
-    /* the background sprite is changed by adding/removing the correct classes */
+    playButtonUpdater() {
+      if (this.media.getPaused()) {
+        /* the background sprite is changed by adding/removing the correct classes */
         this.$playButton
-            .attr("title", this.l10n.play)
-            .removeClass("Ldt-Ctrl-Play-PauseState")
-            .addClass("Ldt-Ctrl-Play-PlayState");
-    } else {
+          .attr("title", this.l10n.play)
+          .removeClass("Ldt-Ctrl-Play-PauseState")
+          .addClass("Ldt-Ctrl-Play-PlayState");
+      } else {
         this.$playButton
-            .attr("title", this.l10n.pause)
-            .removeClass("Ldt-Ctrl-Play-PlayState")
-            .addClass("Ldt-Ctrl-Play-PauseState");
+          .attr("title", this.l10n.pause)
+          .removeClass("Ldt-Ctrl-Play-PlayState")
+          .addClass("Ldt-Ctrl-Play-PauseState");
+      }
     }
-};
 
-//FullScreen
-IriSP.Widgets.Controller.prototype.toggleFullscreen = function() {
-    if (IriSP.isFullscreen()) {
-        IriSP.setFullScreen(this.$[0], false);
-    } else {
-        IriSP.setFullScreen(this.$[0], true);
+    //FullScreen
+    toggleFullscreen() {
+      if (ns.isFullscreen()) {
+        ns.setFullScreen(this.$[0], false);
+      } else {
+        ns.setFullScreen(this.$[0], true);
+      }
     }
-};
 
-//Quiz
-IriSP.Widgets.Controller.prototype.createQuiz = function() {
-    this.player.trigger("Quiz.hide");
-    this.media.pause();
-    this.player.trigger("QuizCreator.create");
-};
+    //Quiz
+    createQuiz() {
+      this.player.trigger("Quiz.hide");
+      this.media.pause();
+      this.player.trigger("QuizCreator.create");
+    }
 
-IriSP.Widgets.Controller.prototype.toggleQuiz = function() {
-    this.enable_quiz_toggle = !this.enable_quiz_toggle;
-    if (this.enable_quiz_toggle) {
+    toggleQuiz() {
+      this.enable_quiz_toggle = !this.enable_quiz_toggle;
+      if (this.enable_quiz_toggle) {
         $(".Ldt-Ctrl-Quiz-Enable").addClass("Ldt-Ctrl-Quiz-Toggle-Active");
         $(".Ldt-Ctrl-Quiz-Create").addClass("Ldt-Ctrl-Quiz-Toggle-Active");
         this.player.trigger("Quiz.activate");
-    }
-    else
-    {
+      } else {
         $(".Ldt-Ctrl-Quiz-Enable").removeClass("Ldt-Ctrl-Quiz-Toggle-Active");
         $(".Ldt-Ctrl-Quiz-Create").removeClass("Ldt-Ctrl-Quiz-Toggle-Active");
         this.player.trigger("Quiz.deactivate");
         this.player.trigger("QuizCreator.hide");
-    }
-};
-
-IriSP.Widgets.Controller.prototype.playHandler = function() {
-    if (this.media.getPaused()) {
-        this.media.play();
-    } else {
-        this.media.pause();
+      }
     }
-};
-
-IriSP.Widgets.Controller.prototype.muteHandler = function() {
-    this.media.setMuted(!this.media.getMuted());
-};
 
-IriSP.Widgets.Controller.prototype.volumeUpdater = function() {
-    var _muted = this.media.getMuted(),
-        _vol = this.media.getVolume();
-    if (_vol === false) {
-        _vol = .5;
+    playHandler() {
+      if (this.media.getPaused()) {
+        this.media.play();
+      } else {
+        this.media.pause();
+      }
+    }
+
+    muteHandler() {
+      this.media.setMuted(!this.media.getMuted());
     }
-    var _soundCtl = this.$.find(".Ldt-Ctrl-Sound");
-    _soundCtl.removeClass("Ldt-Ctrl-Sound-Mute Ldt-Ctrl-Sound-Half Ldt-Ctrl-Sound-Full");
-    if (_muted) {
-        _soundCtl.attr("title", this.l10n.unmute)
-            .addClass("Ldt-Ctrl-Sound-Mute");
-    } else {
-        _soundCtl.attr("title", this.l10n.mute)
-            .addClass(_vol < .5 ? "Ldt-Ctrl-Sound-Half" : "Ldt-Ctrl-Sound-Full" );
-    }
-    this.$volumeBar.slider("value", _muted ? 0 : 100 * _vol);
-};
 
-IriSP.Widgets.Controller.prototype.showSearchBlock = function() {
-    this.$searchBlock.animate({ width:"160px" }, 200);
-    this.$searchInput.css('background-color','#fff');
-    this.$searchInput.focus();
-};
+    volumeUpdater() {
+      var _muted = this.media.getMuted(),
+        _vol = this.media.getVolume();
+      if (_vol === false) {
+        _vol = 0.5;
+      }
+      var _soundCtl = this.$.find(".Ldt-Ctrl-Sound");
+      _soundCtl.removeClass(
+        "Ldt-Ctrl-Sound-Mute Ldt-Ctrl-Sound-Half Ldt-Ctrl-Sound-Full"
+      );
+      if (_muted) {
+        _soundCtl
+          .attr("title", this.l10n.unmute)
+          .addClass("Ldt-Ctrl-Sound-Mute");
+      } else {
+        _soundCtl
+          .attr("title", this.l10n.mute)
+          .addClass(_vol < 0.5 ? "Ldt-Ctrl-Sound-Half" : "Ldt-Ctrl-Sound-Full");
+      }
+      this.$volumeBar.slider("value", _muted ? 0 : 100 * _vol);
+    }
 
-IriSP.Widgets.Controller.prototype.hideSearchBlock = function() {
-    if (! this.always_show_search) {
-        this.$searchBlock.animate( { width: 0 }, 200);
+    showSearchBlock() {
+      this.$searchBlock.animate({ width: "160px" }, 200);
+      this.$searchInput.css("background-color", "#fff");
+      this.$searchInput.focus();
     }
-};
 
-/** react to clicks on the search button */
-IriSP.Widgets.Controller.prototype.searchButtonHandler = function() {
-    if ( !this.$searchBlock.width() ) {
+    hideSearchBlock() {
+      if (!this.always_show_search) {
+        this.$searchBlock.animate({ width: 0 }, 200);
+      }
+    }
+
+    /** react to clicks on the search button */
+    searchButtonHandler() {
+      if (!this.$searchBlock.width()) {
         this.showSearchBlock();
         var _val = this.$searchInput.val();
         if (_val) {
-            this.source.getAnnotations().search(_val);
+          this.source.getAnnotations().search(_val);
         }
-	} else {
+      } else {
         this.hideSearchBlock();
+      }
     }
+
+    /** this handler is called whenever the content of the search
+   field changes */
+    searchHandler() {
+      if (!this.$searchBlock.width()) {
+        this.$searchBlock.css({ width: "160px" });
+        this.$searchInput.css("background-color", "#fff");
+      }
+      var _val = this.$searchInput.val();
+      this._positiveMatch = false;
+
+      // do nothing if the search field is empty, instead of highlighting everything.
+      if (_val !== this.lastSearchValue) {
+        if (_val) {
+          this.source.getAnnotations().search(_val);
+        } else {
+          this.source.getAnnotations().trigger("clear-search");
+          this.$searchInput.css("background-color", "");
+        }
+      }
+      this.lastSearchValue = _val;
+    }
+  };
 };
 
-/** this handler is called whenever the content of the search
-   field changes */
-IriSP.Widgets.Controller.prototype.searchHandler = function() {
-    if ( !this.$searchBlock.width() ) {
-        this.$searchBlock.css({ width:"160px" });
-        this.$searchInput.css('background-color','#fff');
-    }
-    var _val = this.$searchInput.val();
-    this._positiveMatch = false;
-
-    // do nothing if the search field is empty, instead of highlighting everything.
-    if (_val !== this.lastSearchValue) {
-        if (_val) {
-            this.source.getAnnotations().search(_val);
-        } else {
-            this.source.getAnnotations().trigger("clear-search");
-            this.$searchInput.css('background-color','');
-        }
-    }
-    this.lastSearchValue = _val;
-};
+export { Controller, controllerStyles };
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/widgets/Controller.module.css	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,249 @@
+/* Player Widget */
+
+.Ldt-Ctrl {
+    font-size: 10px;
+    background: url('img/player_gradient.png') repeat-x transparent ;
+    height: 25px;
+    border: 1px solid #b6b8b8;
+    position: relative;
+    overflow: hidden;
+}
+
+.Ldt-Ctrl-Left {
+    float: left;
+}
+
+.Ldt-Ctrl-Right {
+    float: right;
+}
+
+.Ldt-Ctrl-button {
+    float: left;
+    width: 30px;
+    height: 25px;
+    background: url('img/player-sprites.png');
+    cursor: pointer;
+}
+
+.Ldt-Ctrl-spacer {
+    float: left;
+    width: 1px;
+    height: 25px;
+    background: #b6b8b8;
+}
+
+.Ldt-Ctrl-Play {
+    margin: 100px 0;
+    margin: 0 15px;
+}
+
+.Ldt-Ctrl-Play-PlayState {
+    background-position: 0 0;
+}
+
+.Ldt-Ctrl-Play-PlayState:hover {
+    background-position: 0 -25px;
+}
+
+.Ldt-Ctrl-Play-PlayState:active {
+    background-position: 0 -50px;
+}
+
+.Ldt-Ctrl-Play-PauseState {
+    background-position: -30px 0;
+}
+
+.Ldt-Ctrl-Play-PauseState:hover {
+    background-position: -30px -25px;
+}
+
+.Ldt-Ctrl-Play-PauseState:active {
+    background-position: -30px -50px;
+}
+
+.Ldt-Ctrl-Annotate {
+    margin: 0 2px;
+    background-position: -60px 0;
+}
+
+.Ldt-Ctrl-Annotate:hover {
+    background-position: -60px -25px;
+}
+
+.Ldt-Ctrl-Annotate:active {
+    background-position: -60px -50px;
+}
+
+.Ldt-Ctrl-SearchBtn {
+    margin: 0 2px;
+    background-position: -90px 0;
+}
+
+.Ldt-Ctrl-SearchBtn:hover {
+    background-position: -90px -25px;
+}
+
+.Ldt-Ctrl-SearchBtn:active {
+    background-position: -90px -50px;
+}
+
+.Ldt-Ctrl-Search {
+    width: 0; float: left; overflow: hidden;
+}
+
+input.Ldt-Ctrl-SearchInput {
+    -moz-box-sizing: border-box;
+    box-sizing: border-box;
+    width: 145px;
+    height: 20px;
+    margin: 2px;
+    padding: 3px;
+    border: 1px solid #8080a0;
+    border-radius: 3px;
+    font-size: 13px;
+}
+
+.Ldt-Ctrl-Time {
+    float: left;
+    margin: 5px;
+    font-size: 12px;
+    font-family: Arial, Verdana, sans-serif;
+}
+
+.Ldt-Ctrl-Time-Elapsed {
+    float: left;
+    color: #4a4a4a;
+}
+
+.Ldt-Ctrl-Time-Separator {
+    margin: 0 4px;
+    float: left;
+}
+
+.Ldt-Ctrl-Time-Total {
+    float: left;
+    color: #b2b2b2;
+}
+
+.Ldt-Ctrl-Sound {
+    margin: 0 2px;
+}
+
+.Ldt-Ctrl-Sound-Full {
+    background-position: -120px 0;
+}
+
+.Ldt-Ctrl-Sound-Full:hover {
+    background-position: -120px -25px;
+}
+
+.Ldt-Ctrl-Sound-Full:active {
+    background-position: -120px -50px;
+}
+
+.Ldt-Ctrl-Sound-Mute {
+    background-position: -150px 0;
+}
+
+.Ldt-Ctrl-Sound-Mute:hover {
+    background-position: -150px -25px;
+}
+
+.Ldt-Ctrl-Sound-Mute:active {
+    background-position: -150px -50px;
+}
+
+.Ldt-Ctrl-Sound-Half {
+    background-position: -180px 0;
+}
+
+.Ldt-Ctrl-Sound-Half:hover {
+    background-position: -180px -25px;
+}
+
+.Ldt-Ctrl-Sound-Half:active {
+    background-position: -180px -50px;
+}
+
+.Ldt-Ctrl-Volume-Control {
+    display: none;
+    position: absolute;
+    background: url('img/player_gradient.png') repeat-x transparent ;
+    height: 25px;
+    width: 100px;
+    top: 25px;
+    right: -1px;
+    z-index: 100;
+    padding: 0 2px;
+    border: 1px solid #b6b8b8;
+}
+
+.Ldt-Ctrl-Volume-Bar {
+    height: 5px;
+    margin: 9px 3px 0;
+    background: #cccccc;
+    border: 1px solid #999999;
+    border-radius: 2px;
+}
+
+.Ldt-Ctrl-Volume-Control .ui-slider-handle {
+    width: 6px;
+    height: 19px;
+    background: #a8a8a8;
+    border: 1px solid #999999;
+    border-radius: 2px;
+    top: -8px;
+    margin-left: -4px;
+    cursor: pointer;
+}
+
+.Ldt-Ctrl-Volume-Control:hover .ui-slider-handle {
+    background: #F7268E;
+}
+
+/* quiz */
+
+.Ldt-Ctrl-Quiz-Enable button, .Ldt-Ctrl-Quiz-Create button, .Ldt-Ctrl-Quiz-Disactivated button, .Ldt-Ctrl-Fullscreen-Button{
+	border: none;
+	background: transparent;
+}
+
+.Ldt-Ctrl-Quiz-Enable {
+    background-image: url("img/quiz_off.svg");
+    float: left;
+    height: 22px;
+    width: 22px;
+    background-repeat: no-repeat;
+}
+.Ldt-Ctrl-Quiz-Enable.Ldt-Ctrl-Quiz-Toggle-Active {
+    background-image: url("img/quiz_on.svg");
+}
+
+.Ldt-Ctrl-Quiz-Create {
+    background-image: url("img/quiz_add_question.svg");
+    float: left;
+    height: 23px;
+    width: 26px;
+    background-repeat: no-repeat;
+    margin-left: 4px;
+    margin-top: 0px;
+    display: none;
+}
+.Ldt-Ctrl-Quiz-Create.Ldt-Ctrl-Quiz-Toggle-Active {
+    display: inline-block;
+}
+
+.Ldt-Ctrl-Fullscreen-Button {
+    margin-top: 3px;
+}
+
+.Ldt-Ctrl-Fullscreen-Button {
+    float: left;
+    background-image: url("img/fullscreen.svg");
+    background-position: right;
+    margin-right: 6px;
+    margin-top: 1px;
+    height: 22px;
+    width: 22px;
+    border: none;
+}
--- a/src/widgets/CreateAnnotation.css	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,180 +0,0 @@
-/*
- *
- */
-
-.Ldt-CreateAnnotation {
-    border-style: none solid solid;
-    border-width: 1px;
-    border-color: #b7b7b7;
-    padding: 0 1px 1px;
-    margin: 0;
-}
-
-.Ldt-CreateAnnotation-Inner {
-    background: url(img/pinstripe.png); padding: 5px; margin: 0; position: relative;
-}
-
-.Ldt-CreateAnnotation-Inner h3 {
-    margin: 5px 0; font-size: 14px; font-weight: bold; text-align: right; clear:both; color: #0068c4;
-}
-
-.Ldt-CreateAnnotation-h3Left {
-    float: left;
-}
-
-.Ldt-CreateAnnotation-Main {
-    min-height: 50px;
-}
-
-.Ldt-CreateAnnotation-Title, .Ldt-CreateAnnotation-Creator {
-    font-size: 14px;
-    font-weight: bold;
-    color: #0068c4;
-    border: 1px solid #666666;
-    border-radius: 2px;
-}
-
-.Ldt-CreateAnnotation-Title.empty, .Ldt-CreateAnnotation-Creator.empty {
-    font-style: italic;
-    color: #90b0d0;
-}
-
-.Ldt-CreateAnnotation-Times {
-    color: #ff3b77
-}
-
-.Ldt-CreateAnnotation-Submit,
-.Ldt-CreateAnnotation-Cancel,
-.Ldt-CreateAnnotation-PreviewSubmit{
-    position: absolute;
-    bottom: 7px;
-    color: #ffffff;
-    cursor: pointer;
-    height: 50px;
-    width: 50px;
-    padding: 28px 0 0;
-    font-size: 12px;
-    border: none;
-    text-align: center;
-    cursor: pointer;
-}
-
-
-.Ldt-CreateAnnotation-Cancel{
-    right: 7px;
-    background: url('img/cancel_annotation.png');
-}
-
-.Ldt-CreateAnnotation-Submit{
-	right: 67px; 
-	background: url('img/submit_annotation.png');
-}
-
-.Ldt-CreateAnnotation-Submit:hover,
-.Ldt-CreateAnnotation-Cancel:hover{
-    background-position: -50px 0;
-}
-
-.Ldt-CreateAnnotation-Description {
-    height: 3em;
-    padding: 2px;
-    resize: none;
-    width: calc(100% - 122px);
-    border: 1px solid #666666;
-    border-radius: 2px;
-}
-
-.Ldt-CreateAnnotation-Description.empty {
-    font-style: italic; color: #999999;
-}
-
-.Ldt-CreateAnnotation-Avatar {
-    float: right;
-    width: 48px;
-    height: 48px;
-    margin: 5px 0;
-    padding: 0 0 0 15px;
-    background: url('img/profile_arrow.png') left no-repeat;
-}
-
-.Ldt-CreateAnnotation-Avatar img {
-    float: right;
-    display: block;
-    max-width: 100%;
-    max-height: 100%;
-    border: 1px solid #bbbbbb;
-}
-
-.Ldt-CreateAnnotation-RecBlock {
-    width: 220px; float: left;
-}
-
-.Ldt-CreateAnnotation-TagTitle, .Ldt-CreateAnnotation-PolemicTitle, .Ldt-CreateAnnotation-RecLabel {
-    display: block; margin: 5px 0 2px; font-size: 12px;
-}
-
-.Ldt-CreateAnnotation-TagList, .Ldt-CreateAnnotation-PolemicList {
-    list-style: none;
-    width: calc(100% - 122px);
-    padding-left: 0px;
-}
-
-li.Ldt-CreateAnnotation-TagLi {
-    display: inline-block; border: none; margin: 0 10px 5px 0; height: 23px; padding: 0 0 0 20px;
-    background: url(img/tag.png) left top no-repeat;
-    cursor: pointer;
-}
-
-.Ldt-CreateAnnotation-TagButton {
-    display: inline-block; font-size: 12px; height: 19px; padding: 4px 5px 0 0; border: none; margin: 0;
-    background: url(img/tag.png) right top no-repeat;
-}
-
-li.Ldt-CreateAnnotation-TagLi:hover {
-    background-position: left -23px;
-}
-
-.Ldt-CreateAnnotation-TagLi:hover .Ldt-CreateAnnotation-TagButton {
-    background-position: right -23px;
-}
-
-li.Ldt-CreateAnnotation-TagLi.selected {
-    background-position: left -46px;
-}
-
-.Ldt-CreateAnnotation-TagLi.selected .Ldt-CreateAnnotation-TagButton {
-    background-position: right -46px;
-}
-
-li.Ldt-CreateAnnotation-PolemicLi {
-    display: inline-block; border: none; margin: 0 5px 0; height: 21px; width: 26px; padding: 2px 0 0;
-    background: url(img/polemic.png) left top no-repeat; font-size: 14px; font-weight: bold; text-align: center;
-    cursor: pointer;
-}
-
-li.Ldt-CreateAnnotation-PolemicLi:hover {
-    background-position: 0 -23px;
-}
-
-li.Ldt-CreateAnnotation-PolemicLi.selected {
-    background-position: 0 -46px;
-}
-
-.Ldt-CreateAnnotation-InnerBox {
-    margin: 20px 50px;
-    border: 1px solid #CCCCCC;
-    padding: 20px;
-    background: #FFFFFF;
-    color: #FF3B77; text-align: center;
-    font-size: 13px; font-weight: bold;
-}
-
-a.Ldt-CreateAnnotation-Close {
-    position: absolute; top: 2px; right: 2px;
-    display: inline-block; width: 17px; height: 17px; margin: 2px;
-    background: url(img/widget-control.png);
-}
-
-a.Ldt-CreateAnnotation-Close:hover {
-    background-position: -17px 0;
-}
\ No newline at end of file
--- a/src/widgets/CreateAnnotation.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/widgets/CreateAnnotation.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,75 +1,89 @@
 /* TODO: Add Social Network Sharing */
+// CreateAnnotation
+
+import createAnnotationStyles from "./CreateAnnotation.module.css";
+import Mustache from "mustache";
+import _ from "lodash";
+import jQuery from "jquery";
 
-IriSP.Widgets.CreateAnnotation = function(player, config) {
-    IriSP.Widgets.Widget.call(this, player, config);
-    if (_this.editable_storage != '' && window.localStorage[_this.editable_storage]) {
+const CreateAnnotation = function (ns) {
+  return class extends ns.Widgets.Widget {
+    constructor(player, config) {
+      super(player, config);
+      if (
+        this.editable_storage != "" &&
+        window.localStorage[this.editable_storage]
+      ) {
         this.source.onLoad(function () {
-            var _export = _this.player.sourceManager.newLocalSource({serializer: IriSP.serializers['ldt_localstorage']});
-            _export.deSerialize(window.localStorage[_this.editable_storage]);
-            _this.source.merge(_export);
+          var _export = this.player.sourceManager.newLocalSource({
+            serializer: ns.serializers["ldt_localstorage"],
+          });
+          _export.deSerialize(window.localStorage[this.editable_storage]);
+          _this.source.merge(_export);
         });
-    };
-};
-
-IriSP.Widgets.CreateAnnotation.prototype = new IriSP.Widgets.Widget();
+      }
+    }
 
-IriSP.Widgets.CreateAnnotation.prototype.defaults = {
-    show_title_field : true,
-    show_creator_field : true,
-    creator_field_readonly : false,
-    start_visible : true,
-    always_visible : false,
-    show_slice : true,
-    show_arrow : true,
-    show_mic_record: false,
-    show_mic_play: false,
-    show_time: true,
-    minimize_annotation_widget : true,
-    creator_name : "",
-    creator_avatar : "",
-    tags : false,
-    tag_titles : false,
-    pause_on_write : true,
-    max_tags : 8,
-    polemics : [{
-        keyword: "++",
-        background_color: "#00a000",
-        text_color: "#ffffff"
-    },{
-        keyword: "--",
-        background_color: "#c00000",
-        text_color: "#ffffff"
-    },{
-        keyword: "??",
-        background_color: "#0000e0",
-        text_color: "#ffffff"
-    },{
-        keyword: "==",
-        background_color: "#f0e000",
-        text_color: "#000000"
-    }],
-    slice_annotation_type: "chap",
-    annotation_type: "Contributions",
-    post_at_segment_time: false,
-    segment_annotation_type: "chap",
-    api_serializer: "ldt_annotate",
-    api_endpoint_template: "",
-    api_method: "POST",
-    // Id that will be used as localStorage key
-    editable_storage: "",
-    project_id: "",
-    after_send_timeout: 0,
-    close_after_send: false,
-    tag_prefix: "#",
-    pause_when_displaying: false,
-    custom_send_button: false,
-    custom_cancel_button: false,
-    custom_description_placeholder: false,
-    preview_mode: false,
-};
+    static defaults = {
+      show_title_field: true,
+      show_creator_field: true,
+      creator_field_readonly: false,
+      start_visible: true,
+      always_visible: false,
+      show_slice: true,
+      show_arrow: true,
+      show_time: true,
+      minimize_annotation_widget: true,
+      creator_name: "",
+      creator_avatar: "",
+      tags: false,
+      tag_titles: false,
+      pause_on_write: true,
+      max_tags: 8,
+      polemics: [
+        {
+          keyword: "++",
+          background_color: "#00a000",
+          text_color: "#ffffff",
+        },
+        {
+          keyword: "--",
+          background_color: "#c00000",
+          text_color: "#ffffff",
+        },
+        {
+          keyword: "??",
+          background_color: "#0000e0",
+          text_color: "#ffffff",
+        },
+        {
+          keyword: "==",
+          background_color: "#f0e000",
+          text_color: "#000000",
+        },
+      ],
+      slice_annotation_type: "chap",
+      annotation_type: "Contributions",
+      post_at_segment_time: false,
+      segment_annotation_type: "chap",
+      api_serializer: "ldt_annotate",
+      api_endpoint_template: "",
+      api_method: "POST",
+      // Id that will be used as localStorage key
+      editable_storage: "",
+      project_id: "",
+      after_send_timeout: 0,
+      close_after_send: false,
+      tag_prefix: "#",
+      pause_when_displaying: false,
+      custom_send_button: false,
+      custom_cancel_button: false,
+      custom_description_placeholder: false,
+      preview_mode: false,
+    };
 
-IriSP.Widgets.CreateAnnotation.prototype.messages = {
-    en: {
+    static messages =  {
+      en: {
         from_time: "from",
         to_time: "to",
         at_time: "at",
@@ -82,8 +96,10 @@
         annotate_video: "New note",
         type_title: "Annotation title",
         type_description: "Enter a new note...",
-        wait_while_processing: "Please wait while your annotation is being processed...",
-        error_while_contacting: "An error happened while contacting the server. Your annotation has not been saved.",
+        wait_while_processing:
+          "Please wait while your annotation is being processed...",
+        error_while_contacting:
+          "An error happened while contacting the server. Your annotation has not been saved.",
         annotation_saved: "Thank you, your annotation has been saved.",
         share_annotation: "Would you like to share it on social networks ?",
         close_widget: "Hide the annotation form",
@@ -91,16 +107,17 @@
         "polemic--": "Disagree",
         "polemic??": "Question",
         "polemic==": "Reference",
-        "in_tooltip": "Set begin time to current player time",
-        "out_tooltip": "Set begin time to current player time",
-        "play_tooltip": "Play the fragment"
-    },
-    fr: {
+        in_tooltip: "Set begin time to current player time",
+        out_tooltip: "Set begin time to current player time",
+        play_tooltip: "Play the fragment",
+      },
+      fr: {
         from_time: "de",
         to_time: "à",
         at_time: "à",
         submit: "Envoyer",
-        preview_submit: "Vous ne pouvez pas envoyer d'annotation en mode aperçu",
+        preview_submit:
+          "Vous ne pouvez pas envoyer d'annotation en mode aperçu",
         cancel: "Annuler",
         add_keywords_: "Ajouter des mots-clés\u00a0:",
         add_polemic_keywords_: "Ajouter des attributs polémiques\u00a0:",
@@ -108,517 +125,580 @@
         annotate_video: "Entrez une nouvelle note...",
         type_title: "Titre de l'annotation",
         type_description: "Prenez vos notes...",
-        wait_while_processing: "Veuillez patienter pendant le traitement de votre annotation...",
-        error_while_contacting: "Une erreur s'est produite en contactant le serveur. Votre annotation n'a pas été enregistrée.",
+        wait_while_processing:
+          "Veuillez patienter pendant le traitement de votre annotation...",
+        error_while_contacting:
+          "Une erreur s'est produite en contactant le serveur. Votre annotation n'a pas été enregistrée.",
         annotation_saved: "Merci, votre annotation a été enregistrée.",
-        share_annotation: "Souhaitez-vous la partager sur les réseaux sociaux ?",
+        share_annotation:
+          "Souhaitez-vous la partager sur les réseaux sociaux ?",
         close_widget: "Cacher le formulaire de création d'annotations",
         "polemic++": "Accord",
         "polemic--": "Désaccord",
         "polemic??": "Question",
         "polemic==": "Référence",
-        "in_tooltip": "Utiliser le temps courant comme début",
-        "out_tooltip": "Utiliser le temps courant comme fin",
-        "play_tooltip": "Jouer le fragment"
-    }
-};
+        in_tooltip: "Utiliser le temps courant comme début",
+        out_tooltip: "Utiliser le temps courant comme fin",
+        play_tooltip: "Jouer le fragment",
+      },
+    };
 
-IriSP.Widgets.CreateAnnotation.prototype.template =
-    '{{#show_slice}}<div class="Ldt-CreateAnnotation-Slice Ldt-TraceMe"></div>{{/show_slice}}'
-    + '{{^show_slice}}{{#show_arrow}}<div class="Ldt-CreateAnnotation-Arrow"></div>{{/show_arrow}}{{/show_slice}}'
-    + '<div class="Ldt-CreateAnnotation"><div class="Ldt-CreateAnnotation-Inner">'
-    + '<form class="Ldt-CreateAnnotation-Screen Ldt-CreateAnnotation-Main">'
-    + '<h3><span class="Ldt-CreateAnnotation-h3Left">{{l10n.annotate_video}}{{#show_title_field}}</span></h3>'
-    + '<h3><span class="Ldt-CreateAnnotation-h3Left"><input class="Ldt-CreateAnnotation-Title empty" placeholder="{{l10n.type_title}}" />{{/show_title_field}}'
-    + '{{#show_time}}<span class="Ldt-CreateAnnotation-Times"> {{#show_slice}}{{l10n.from_time}} {{/show_slice}}{{^show_slice}}{{l10n.at_time}} {{/show_slice}} <span class="Ldt-CreateAnnotation-Begin">00:00</span>{{/show_time}}'
-    + '{{#show_slice}} {{l10n.to_time}} <span class="Ldt-CreateAnnotation-End">{{end}}</span>{{/show_slice}}</span></span>'
-    + '{{#show_creator_field}}{{l10n.your_name_}} <input class="Ldt-CreateAnnotation-Creator empty" value="{{creator_name}}" {{#creator_field_readonly}}readonly{{/creator_field_readonly}}/>{{/show_creator_field}}</h3>'
-    + '{{#show_controls}}<div class="Ldt-CreateAnnotation-Controls">'
-    +   '<span title="{{l10n.in_tooltip}}" class="Ldt-CreateAnnotation-Control-In">In</span>'
-    +   '<span title="{{l10n.out_tooltip}}" class="Ldt-CreateAnnotation-Control-Out">Out</span>'
-    +   '<span title="{{l10n.play_tooltip}}" class="Ldt-CreateAnnotation-Control-Play">Play</span>'
-    + '</div>{{/show_controls}}'
-    + '<textarea class="Ldt-CreateAnnotation-Description Ldt-TraceMe empty" placeholder="{{#custom_description_placeholder}}{{custom_description_placeholder}}{{/custom_description_placeholder}}{{^custom_description_placeholder}}{{l10n.type_description}}{{/custom_description_placeholder}}"></textarea>'
-    + '{{#show_creator_field}}<div class="Ldt-CreateAnnotation-Avatar"><img src="{{creator_avatar}}" title="{{creator_name}}"></img></div>{{/show_creator_field}}'
-    + '<div class="Ldt-CreateAnnotation-SubmitArea Ldt-TraceMe">'
-    +  '{{#preview_mode}}<input type="button" class="Ldt-CreateAnnotation-PreviewSubmit" title="{{l10n.preview_submit}}" value="{{#custom_send_button}}{{custom_send_button}}{{/custom_send_button}}{{^custom_send_button}}{{l10n.submit}}{{/custom_send_button}}" />{{/preview_mode}}'
-    +  '{{^preview_mode}}<input type="submit" class="Ldt-CreateAnnotation-Submit" value="{{#custom_send_button}}{{custom_send_button}}{{/custom_send_button}}{{^custom_send_button}}{{l10n.submit}}{{/custom_send_button}}" />{{/preview_mode}}'
-    +   '<input type="button" class="Ldt-CreateAnnotation-Cancel" value="{{#custom_cancel_button}}{{custom_cancel_button}}{{/custom_cancel_button}}{{^custom_cancel_button}}{{l10n.cancel}}{{/custom_cancel_button}}" />'
-    +   '<div class="Ldt-CreateAnnotation-Begin Ldt-CreateAnnotation-Times">00:00</div>'
-    + '</div>'
-    + '{{#show_mic_record}}<div class="Ldt-CreateAnnotation-RecBlock"><div class="Ldt-CreateAnnotation-RecLabel">Add voice annotation</div>'
-    + '    <object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="220" height="160">'
-    + '        <param name="movie" value="{{record_swf}}" />'
-    + '        <param name="quality" value="high" />'
-    + '        <param name="bgcolor" value="#ffffff" />'
-    + '        <param name="play" value="true" />'
-    + '        <param name="loop" value="true" />'
-    + '        <param name="wmode" value="transparent" />'
-    + '        <param name="scale" value="showall" />'
-    + '        <param name="menu" value="true" />'
-    + '        <param name="devicefont" value="false" />'
-    + '        <param name="salign" value="" />'
-    + '        <param name="allowScriptAccess" value="always" />'
-    + '        <param name="allowFullScreen" value="true" />'
-    + '        <param name="flashvars" value="playVisible={{show_mic_play}}">'
-    + '        <embed src="{{record_swf}}"" quality="high" bgcolor="#ffffff"'
-    + '             width="220" height="160" name="ExternalInterfaceExample" align="middle"'
-    + '             play="true" loop="false" quality="high" allowScriptAccess="always" '
-    + '             type="application/x-shockwave-flash" allowFullScreen="true" wmode="transparent" '
-    + '             flashvars="playVisible={{show_mic_play}}"'
-    + '             pluginspage="http://www.macromedia.com/go/getflashplayer">'
-    + '        </embed>'
-    + '    </object>'
-    + '</div>{{/show_mic_record}}' 
-    + '{{#tags.length}}<div class="Ldt-CreateAnnotation-Tags"><div class="Ldt-CreateAnnotation-TagTitle">{{l10n.add_keywords_}}</div><ul class="Ldt-CreateAnnotation-TagList">'
-    + '{{#tags}}<li class="Ldt-CreateAnnotation-TagLi" tag-id="{{id}}" data-text="{{tag_prefix}}{{title}}"><span class="Ldt-CreateAnnotation-TagButton">{{title}}</span></li>{{/tags}}</ul></div>{{/tags.length}}'
-    + '{{#polemics.length}}<div class="Ldt-CreateAnnotation-Polemics"><div class="Ldt-CreateAnnotation-PolemicTitle">{{l10n.add_polemic_keywords_}}</div><ul class="Ldt-CreateAnnotation-PolemicList">'
-    + '{{#polemics}}<li class="Ldt-CreateAnnotation-PolemicLi" style="background-color: {{background_color}}; color: {{text_color}}" data-text="{{keyword}}">{{keyword}}</li>{{/polemics}}</ul></div>{{/polemics.length}}'
-    + '<div style="clear: both;"></div></form>'
-    + '<div class="Ldt-CreateAnnotation-Screen Ldt-CreateAnnotation-Wait"><div class="Ldt-CreateAnnotation-InnerBox">{{l10n.wait_while_processing}}</div></div>'
-    + '<div class="Ldt-CreateAnnotation-Screen Ldt-CreateAnnotation-Error">{{^always_visible}}<a title="{{l10n.close_widget}}" class="Ldt-CreateAnnotation-Close" href="#"></a>{{/always_visible}}<div class="Ldt-CreateAnnotation-InnerBox">{{l10n.error_while_contacting}}</div></div>'
-    + '<div class="Ldt-CreateAnnotation-Screen Ldt-CreateAnnotation-Saved">{{^always_visible}}<a title="{{l10n.close_widget}}" class="Ldt-CreateAnnotation-Close" href="#"></a>{{/always_visible}}<div class="Ldt-CreateAnnotation-InnerBox">{{l10n.annotation_saved}}</div></div>'
-    + '</div></div>';
-    
-IriSP.Widgets.CreateAnnotation.prototype.draw = function() {
-    var _this = this;
-    
-    this.begin = new IriSP.Model.Time();
-    this.end = this.source.getDuration();
-    
-    this.tag_prefix = this.tag_prefix || "";
-    
-    if (this.tag_titles && !this.tags) {
-		if(!(this.tag_titles.length==1 && this.tag_titles[0]=="")){
-			this.tags = IriSP._(this.tag_titles).map(function(_tag_title) {
-				var _tag,
-					_tags = _this.source.getTags().searchByTitle(_tag_title, true);
-				if (_tags.length) {
-					_tag = _tags[0];
-				} else {
-					_tag = new IriSP.Model.Tag(false, _this.source);
-					_this.source.getTags().push(_tag);
-					_tag.title = _tag_title;
-				}
-				return _tag;
-			});
-        }
-        else{
-        	// we forced no tags if this.tag_titles = [''] (and not false)
-        	this.tags = true;
+    static template =
+      '{{#show_slice}}<div class="Ldt-CreateAnnotation-Slice Ldt-TraceMe"></div>{{/show_slice}}' +
+      '{{^show_slice}}{{#show_arrow}}<div class="Ldt-CreateAnnotation-Arrow"></div>{{/show_arrow}}{{/show_slice}}' +
+      '<div class="Ldt-CreateAnnotation"><div class="Ldt-CreateAnnotation-Inner">' +
+      '<form class="Ldt-CreateAnnotation-Screen Ldt-CreateAnnotation-Main">' +
+      '<h3><span class="Ldt-CreateAnnotation-h3Left">{{l10n.annotate_video}}{{#show_title_field}}</span></h3>' +
+      '<h3><span class="Ldt-CreateAnnotation-h3Left"><input class="Ldt-CreateAnnotation-Title empty" placeholder="{{l10n.type_title}}" />{{/show_title_field}}' +
+      '{{#show_time}}<span class="Ldt-CreateAnnotation-Times"> {{#show_slice}}{{l10n.from_time}} {{/show_slice}}{{^show_slice}}{{l10n.at_time}} {{/show_slice}} <span class="Ldt-CreateAnnotation-Begin">00:00</span>{{/show_time}}' +
+      '{{#show_slice}} {{l10n.to_time}} <span class="Ldt-CreateAnnotation-End">{{end}}</span>{{/show_slice}}</span></span>' +
+      '{{#show_creator_field}}{{l10n.your_name_}} <input class="Ldt-CreateAnnotation-Creator empty" value="{{creator_name}}" {{#creator_field_readonly}}readonly{{/creator_field_readonly}}/>{{/show_creator_field}}</h3>' +
+      '{{#show_controls}}<div class="Ldt-CreateAnnotation-Controls">' +
+      '<span title="{{l10n.in_tooltip}}" class="Ldt-CreateAnnotation-Control-In">In</span>' +
+      '<span title="{{l10n.out_tooltip}}" class="Ldt-CreateAnnotation-Control-Out">Out</span>' +
+      '<span title="{{l10n.play_tooltip}}" class="Ldt-CreateAnnotation-Control-Play">Play</span>' +
+      "</div>{{/show_controls}}" +
+      '<textarea class="Ldt-CreateAnnotation-Description Ldt-TraceMe empty" placeholder="{{#custom_description_placeholder}}{{custom_description_placeholder}}{{/custom_description_placeholder}}{{^custom_description_placeholder}}{{l10n.type_description}}{{/custom_description_placeholder}}"></textarea>' +
+      '{{#show_creator_field}}<div class="Ldt-CreateAnnotation-Avatar"><img src="{{creator_avatar}}" title="{{creator_name}}"></img></div>{{/show_creator_field}}' +
+      '<div class="Ldt-CreateAnnotation-SubmitArea Ldt-TraceMe">' +
+      '{{#preview_mode}}<input type="button" class="Ldt-CreateAnnotation-PreviewSubmit" title="{{l10n.preview_submit}}" value="{{#custom_send_button}}{{custom_send_button}}{{/custom_send_button}}{{^custom_send_button}}{{l10n.submit}}{{/custom_send_button}}" />{{/preview_mode}}' +
+      '{{^preview_mode}}<input type="submit" class="Ldt-CreateAnnotation-Submit" value="{{#custom_send_button}}{{custom_send_button}}{{/custom_send_button}}{{^custom_send_button}}{{l10n.submit}}{{/custom_send_button}}" />{{/preview_mode}}' +
+      '<input type="button" class="Ldt-CreateAnnotation-Cancel" value="{{#custom_cancel_button}}{{custom_cancel_button}}{{/custom_cancel_button}}{{^custom_cancel_button}}{{l10n.cancel}}{{/custom_cancel_button}}" />' +
+      '<div class="Ldt-CreateAnnotation-Begin Ldt-CreateAnnotation-Times">00:00</div>' +
+      "</div>" +
+      '{{#tags.length}}<div class="Ldt-CreateAnnotation-Tags"><div class="Ldt-CreateAnnotation-TagTitle">{{l10n.add_keywords_}}</div><ul class="Ldt-CreateAnnotation-TagList">' +
+      '{{#tags}}<li class="Ldt-CreateAnnotation-TagLi" tag-id="{{id}}" data-text="{{tag_prefix}}{{title}}"><span class="Ldt-CreateAnnotation-TagButton">{{title}}</span></li>{{/tags}}</ul></div>{{/tags.length}}' +
+      '{{#polemics.length}}<div class="Ldt-CreateAnnotation-Polemics"><div class="Ldt-CreateAnnotation-PolemicTitle">{{l10n.add_polemic_keywords_}}</div><ul class="Ldt-CreateAnnotation-PolemicList">' +
+      '{{#polemics}}<li class="Ldt-CreateAnnotation-PolemicLi" style="background-color: {{background_color}}; color: {{text_color}}" data-text="{{keyword}}">{{keyword}}</li>{{/polemics}}</ul></div>{{/polemics.length}}' +
+      '<div style="clear: both;"></div></form>' +
+      '<div class="Ldt-CreateAnnotation-Screen Ldt-CreateAnnotation-Wait"><div class="Ldt-CreateAnnotation-InnerBox">{{l10n.wait_while_processing}}</div></div>' +
+      '<div class="Ldt-CreateAnnotation-Screen Ldt-CreateAnnotation-Error">{{^always_visible}}<a title="{{l10n.close_widget}}" class="Ldt-CreateAnnotation-Close" href="#"></a>{{/always_visible}}<div class="Ldt-CreateAnnotation-InnerBox">{{l10n.error_while_contacting}}</div></div>' +
+      '<div class="Ldt-CreateAnnotation-Screen Ldt-CreateAnnotation-Saved">{{^always_visible}}<a title="{{l10n.close_widget}}" class="Ldt-CreateAnnotation-Close" href="#"></a>{{/always_visible}}<div class="Ldt-CreateAnnotation-InnerBox">{{l10n.annotation_saved}}</div></div>' +
+      "</div></div>";
+
+    draw() {
+      var _this = this;
+
+      this.begin = new ns.Model.Time();
+      this.end = this.source.getDuration();
+
+      this.tag_prefix = this.tag_prefix || "";
+
+      if (this.tag_titles && !this.tags) {
+        if (!(this.tag_titles.length == 1 && this.tag_titles[0] == "")) {
+          this.tags = _(this.tag_titles).map(function (_tag_title) {
+            var _tag,
+              _tags = _this.source.getTags().searchByTitle(_tag_title, true);
+            if (_tags.length) {
+              _tag = _tags[0];
+            } else {
+              _tag = new ns.Model.Tag(false, _this.source);
+              _this.source.getTags().push(_tag);
+              _tag.title = _tag_title;
+            }
+            return _tag;
+          }).value();
+        } else {
+          // we forced no tags if this.tag_titles = [''] (and not false)
+          this.tags = true;
         }
-    }
-    if (!this.tags) {
-        this.tags = this.source.getTags()
-            .sortBy(function (_tag) {
-                return -_tag.getAnnotations().length;
-            })
-            .slice(0, this.max_tags)
-            .map(function(_tag) {
-                return _tag;
-            });
+      }
+      if (!this.tags) {
+        this.tags = this.source
+          .getTags()
+          .sortBy(function (_tag) {
+            return -_tag.getAnnotations().length;
+          })
+          .slice(0, this.max_tags)
+          .map(function (_tag) {
+            return _tag;
+          });
         /* We have to use the map function because Mustache doesn't like our tags object */
-    }
-    this.record_swf = IriSP.getLib("recordMicSwf");
-    this.renderTemplate();
-    if (this.show_mic_record) {
-        this.recorder = this.$.find("embed")[0];
-        
-        window.setAudioUrl = function(_url) {
-            _this.audio_url = _url;
-        }
-    }
-    if (this.show_slice) {
+      }
+      this.renderTemplate();
+      if (this.show_slice) {
         this.insertSubwidget(
-            this.$.find(".Ldt-CreateAnnotation-Slice"),
-            {
-                type: "Slice",
-                show_arrow: this.show_arrow,
-                annotation_type: this.slice_annotation_type,
-                onBoundsChanged: function(_from, _to) {
-                    _this.setBeginEnd(_from, _to);
-                }
+          this.$.find(".Ldt-CreateAnnotation-Slice"),
+          {
+            type: "Slice",
+            show_arrow: this.show_arrow,
+            annotation_type: this.slice_annotation_type,
+            onBoundsChanged: function (_from, _to) {
+              _this.setBeginEnd(_from, _to);
             },
-            "slice"
+          },
+          "slice"
         );
-    } else {
+      } else {
         if (this.show_arrow) {
-            this.insertSubwidget(this.$.find(".Ldt-CreateAnnotation-Arrow"), {type: "Arrow"},"arrow");
+          this.insertSubwidget(
+            this.$.find(".Ldt-CreateAnnotation-Arrow"),
+            { type: "Arrow" },
+            "arrow"
+          );
         }
-        this.onMediaEvent("timeupdate", function(_time) {
-            // Do not update timecode if description is not empty
-            if (_this.$.find(".Ldt-CreateAnnotation-Description").val().trim() == "") {
-                _this.setBeginEnd(_time, _time);
-                if (_this.arrow) {
-                    _this.arrow.moveToTime(_time);
-                }
-            };
+        this.onMediaEvent("timeupdate", function (_time) {
+          // Do not update timecode if description is not empty
+          if (
+            _this.$.find(".Ldt-CreateAnnotation-Description").val().trim() == ""
+          ) {
+            _this.setBeginEnd(_time, _time);
+            if (_this.arrow) {
+              _this.arrow.moveToTime(_time);
+            }
+          }
         });
-    }
-    this.$.find(".Ldt-CreateAnnotation-Cancel").click(function() {
+      }
+      this.$.find(".Ldt-CreateAnnotation-Cancel").click(function () {
         _this.player.trigger("CreateAnnotation.hide");
-    });
-    this.$.find(".Ldt-CreateAnnotation-Close").click(function() {
+      });
+      this.$.find(".Ldt-CreateAnnotation-Close").click(function () {
         _this.close_after_send
-        ? _this.player.trigger("CreateAnnotation.hide")
-        : _this.showScreen("Main");
+          ? _this.player.trigger("CreateAnnotation.hide")
+          : _this.showScreen("Main");
         return false;
-    });
-    this.$.find(".Ldt-CreateAnnotation-TagLi, .Ldt-CreateAnnotation-PolemicLi").click(function() {
-        _this.addKeyword(IriSP.jQuery(this).attr("data-text"));
+      });
+      this.$.find(
+        ".Ldt-CreateAnnotation-TagLi, .Ldt-CreateAnnotation-PolemicLi"
+      ).click(function () {
+        _this.addKeyword(jQuery(this).attr("data-text"));
         return false;
-    });
-    this.$.find(".Ldt-CreateAnnotation-PolemicLi").each(function() {
-        var _el = IriSP.jQuery(this),
-            _kw = _el.attr("data-text"),
-            _msg = _this.l10n["polemic" + _kw];
+      });
+      this.$.find(".Ldt-CreateAnnotation-PolemicLi").each(function () {
+        var _el = jQuery(this),
+          _kw = _el.attr("data-text"),
+          _msg = _this.l10n["polemic" + _kw];
         if (_msg) {
-            _el.attr("title",_msg);
+          _el.attr("title", _msg);
         }
-    });
-    this.$.find(".Ldt-CreateAnnotation-Description").bind("change keyup input paste", this.functionWrapper("onDescriptionChange"));
-    if (this.show_title_field) {
-        this.$.find(".Ldt-CreateAnnotation-Title").bind("change keyup input paste", this.functionWrapper("onTitleChange"));
-    }
-    if (this.show_creator_field) {
-        this.$.find(".Ldt-CreateAnnotation-Creator").bind("change keyup input paste", this.functionWrapper("onCreatorChange"));
-    }
-    this.$.find("[class^='Ldt-CreateAnnotation-Control-']").click(function() {
-        var action = this.className.replace('Ldt-CreateAnnotation-Control-', '');
-        switch (action) {
+      });
+      this.$.find(".Ldt-CreateAnnotation-Description").bind(
+        "change keyup input paste",
+        this.functionWrapper("onDescriptionChange")
+      );
+      if (this.show_title_field) {
+        this.$.find(".Ldt-CreateAnnotation-Title").bind(
+          "change keyup input paste",
+          this.functionWrapper("onTitleChange")
+        );
+      }
+      if (this.show_creator_field) {
+        this.$.find(".Ldt-CreateAnnotation-Creator").bind(
+          "change keyup input paste",
+          this.functionWrapper("onCreatorChange")
+        );
+      }
+      this.$.find("[class^='Ldt-CreateAnnotation-Control-']").click(
+        function () {
+          var action = this.className.replace(
+            "Ldt-CreateAnnotation-Control-",
+            ""
+          );
+          switch (action) {
             case "In":
-               // Set In bound to current player time
-               this.setBegin(_this.media.getCurrentTime());
-               break;
+              // Set In bound to current player time
+              this.setBegin(_this.media.getCurrentTime());
+              break;
             case "Out":
-               // Set In bound to current player time
-               this.setEnd(_this.media.getCurrentTime() || _this.media.duration);
-               break;
+              // Set In bound to current player time
+              this.setEnd(_this.media.getCurrentTime() || _this.media.duration);
+              break;
             case "Play":
-               this.media.setCurrentTime(_this.begin);
-               this.media.play();
-               break;
+              this.media.setCurrentTime(_this.begin);
+              this.media.play();
+              break;
+          }
+          return false;
         }
-        return false;
-    });
+      );
 
-    if (this.start_visible) {
+      if (this.start_visible) {
         this.show();
-    } else {
+      } else {
         this.$.hide();
         this.hide();
+      }
+
+      this.onMdpEvent("CreateAnnotation.toggle", "toggle");
+      this.onMdpEvent("CreateAnnotation.hide", "hide");
+      this.onMdpEvent("CreateAnnotation.show", "show");
+      this.$.find("form").submit(this.functionWrapper("onSubmit"));
     }
-    
-    this.onMdpEvent("CreateAnnotation.toggle","toggle");
-    this.onMdpEvent("CreateAnnotation.hide", "hide");
-    this.onMdpEvent("CreateAnnotation.show", "show");
-    this.$.find("form").submit(this.functionWrapper("onSubmit"));
-};
 
-IriSP.Widgets.CreateAnnotation.prototype.setBegin = function (t) {
-    this.begin = new IriSP.Model.Time(t || 0);
-    this.$.find(".Ldt-CreateAnnotation-Begin").html(this.begin.toString());
-};
+    setBegin(t) {
+      this.begin = new ns.Model.Time(t || 0);
+      this.$.find(".Ldt-CreateAnnotation-Begin").html(this.begin.toString());
+    }
 
-IriSP.Widgets.CreateAnnotation.prototype.setEnd = function (t) {
-    this.end = new IriSP.Model.Time(t || 0);
-    this.$.find(".Ldt-CreateAnnotation-End").html(this.end.toString());
-};
+    setEnd(t) {
+      this.end = new ns.Model.Time(t || 0);
+      this.$.find(".Ldt-CreateAnnotation-End").html(this.end.toString());
+    }
+
+    setBeginEnd(begin, end) {
+      this.setBegin(begin);
+      this.setEnd(end);
+    }
 
-IriSP.Widgets.CreateAnnotation.prototype.setBeginEnd = function (begin, end) {
-    this.setBegin(begin);
-    this.setEnd(end);
-};
-
-IriSP.Widgets.CreateAnnotation.prototype.showScreen = function(_screenName) {
-    this.$.find('.Ldt-CreateAnnotation-' + _screenName).show()
-        .siblings().hide();
-};
+    showScreen(_screenName) {
+      this.$.find(".Ldt-CreateAnnotation-" + _screenName)
+        .show()
+        .siblings()
+        .hide();
+    }
 
-IriSP.Widgets.CreateAnnotation.prototype.show = function() {
-    if (!this.visible){
+    show() {
+      if (!this.visible) {
         this.visible = true;
-        if (this.pause_when_displaying){
-            this.media.pause();
+        if (this.pause_when_displaying) {
+          this.media.pause();
         }
-        this.showScreen('Main');
-        this.$.find(".Ldt-CreateAnnotation-Description").val("").css("border-color", "#666666").addClass("empty");
+        this.showScreen("Main");
+        this.$.find(".Ldt-CreateAnnotation-Description")
+          .val("")
+          .css("border-color", "#666666")
+          .addClass("empty");
         if (this.show_title_field) {
-            this.$.find(".Ldt-CreateAnnotation-Title").val("").css("border-color", "#666666").addClass("empty");
+          this.$.find(".Ldt-CreateAnnotation-Title")
+            .val("")
+            .css("border-color", "#666666")
+            .addClass("empty");
         }
         if (this.show_creator_field) {
-            this.$.find(".Ldt-CreateAnnotation-Creator").val(this.creator_name).css("border-color", "#666666");
-            if (!this.creator_name) {
-                this.$.find(".Ldt-CreateAnnotation-Creator").addClass("empty");
-            }
+          this.$.find(".Ldt-CreateAnnotation-Creator")
+            .val(this.creator_name)
+            .css("border-color", "#666666");
+          if (!this.creator_name) {
+            this.$.find(".Ldt-CreateAnnotation-Creator").addClass("empty");
+          }
         }
-        this.$.find(".Ldt-CreateAnnotation-TagLi, .Ldt-CreateAnnotation-PolemicLi").removeClass("selected");
+        this.$.find(
+          ".Ldt-CreateAnnotation-TagLi, .Ldt-CreateAnnotation-PolemicLi"
+        ).removeClass("selected");
         this.$.slideDown();
         if (this.minimize_annotation_widget) {
-            this.player.trigger("Annotation.minimize");
+          this.player.trigger("Annotation.minimize");
         }
+      }
     }
-};
 
-IriSP.Widgets.CreateAnnotation.prototype.hide = function() {
-    if (this.visible){
-        if (this.recorder) {
-            this.recorder.stopRecord();
-        }
+    hide() {
+      if (this.visible) {
         if (!this.always_visible) {
-            this.visible = false;
-            this.$.slideUp();
-            if (this.minimize_annotation_widget) {
-                this.player.trigger("Annotation.maximize");
-            }
+          this.visible = false;
+          this.$.slideUp();
+          if (this.minimize_annotation_widget) {
+            this.player.trigger("Annotation.maximize");
+          }
         }
+      }
     }
-};
 
-IriSP.Widgets.CreateAnnotation.prototype.toggle = function() {
-    if (!this.always_visible) {
+    toggle() {
+      if (!this.always_visible) {
         if (this.visible) {
-            this.hide();
+          this.hide();
         } else {
-            var t = this.media.getCurrentTime() || 0;
-            this.setBeginEnd(t, t);
-            if (this.slice_widget) {
-                this.slice_widget.setBounds(this.begin, this.end);
-            }
-            this.show();
-            // Set focus on textarea
-            this.$.find(".Ldt-CreateAnnotation-Description").focus();
+          var t = this.media.getCurrentTime() || 0;
+          this.setBeginEnd(t, t);
+          if (this.slice_widget) {
+            this.slice_widget.setBounds(this.begin, this.end);
+          }
+          this.show();
+          // Set focus on textarea
+          this.$.find(".Ldt-CreateAnnotation-Description").focus();
         }
+      }
     }
-};
 
-IriSP.Widgets.CreateAnnotation.prototype.addKeyword = function(_keyword) {
-    var _field = this.$.find(".Ldt-CreateAnnotation-Description"),
-        _rx = IriSP.Model.regexpFromTextOrArray(_keyword),
+    addKeyword(_keyword) {
+      var _field = this.$.find(".Ldt-CreateAnnotation-Description"),
+        _rx = ns.Model.regexpFromTextOrArray(_keyword),
         _contents = _field.val();
-    _contents = ( !!_contents.match(_rx)
-        ? _contents.replace(_rx,"")
-        : _contents + " " + _keyword
-    );
-    _field.val(_contents.replace(/\s{2,}/g,' ').replace(/(^\s+|\s+$)/g,''));
-    this.onDescriptionChange();
-};
+      _contents = !!_contents.match(_rx)
+        ? _contents.replace(_rx, "")
+        : _contents + " " + _keyword;
+      _field.val(_contents.replace(/\s{2,}/g, " ").replace(/(^\s+|\s+$)/g, ""));
+      this.onDescriptionChange();
+    }
 
-IriSP.Widgets.CreateAnnotation.prototype.pauseOnWrite = function() {
-    if (this.pause_on_write && !this.media.getPaused()) {
+    pauseOnWrite() {
+      if (this.pause_on_write && !this.media.getPaused()) {
         this.media.pause();
+      }
     }
-};
 
-IriSP.Widgets.CreateAnnotation.prototype.onDescriptionChange = function(e) {
-    if (e !== undefined && e.keyCode == 13 && !e.shiftKey) {
+    onDescriptionChange(e) {
+      if (e !== undefined && e.keyCode == 13 && !e.shiftKey) {
         // Return: submit. Use shift-Return to insert a LF
         this.onSubmit();
         return true;
-    }
-    var _field = this.$.find(".Ldt-CreateAnnotation-Description"),
+      }
+      var _field = this.$.find(".Ldt-CreateAnnotation-Description"),
         _contents = _field.val();
-    _field.css("border-color", !!_contents ? "#666666" : "#ff0000");
-    if (!!_contents) {
+      _field.css("border-color", !!_contents ? "#666666" : "#ff0000");
+      if (!!_contents) {
         _field.removeClass("empty");
-    } else {
+      } else {
         _field.addClass("empty");
-    }
-    this.$.find(".Ldt-CreateAnnotation-TagLi, .Ldt-CreateAnnotation-PolemicLi").each(function() {
-        var _rx = IriSP.Model.regexpFromTextOrArray(IriSP.jQuery(this).attr("data-text"));
+      }
+      this.$.find(
+        ".Ldt-CreateAnnotation-TagLi, .Ldt-CreateAnnotation-PolemicLi"
+      ).each(function () {
+        var _rx = ns.Model.regexpFromTextOrArray(
+          jQuery(this).attr("data-text")
+        );
         if (_contents.match(_rx)) {
-            IriSP.jQuery(this).addClass("selected");
+          jQuery(this).addClass("selected");
         } else {
-            IriSP.jQuery(this).removeClass("selected");
+          jQuery(this).removeClass("selected");
         }
-    });
-    this.pauseOnWrite();
-    return !!_contents;
-};
+      });
+      this.pauseOnWrite();
+      return !!_contents;
+    }
 
-IriSP.Widgets.CreateAnnotation.prototype.onTitleChange = function() {
-    var _field = this.$.find(".Ldt-CreateAnnotation-Title"),
+    onTitleChange() {
+      var _field = this.$.find(".Ldt-CreateAnnotation-Title"),
         _contents = _field.val();
-    _field.css("border-color", !!_contents ? "#666666" : "#ff0000");
-    if (!!_contents) {
+      _field.css("border-color", !!_contents ? "#666666" : "#ff0000");
+      if (!!_contents) {
         _field.removeClass("empty");
-    } else {
+      } else {
         _field.addClass("empty");
+      }
+      this.pauseOnWrite();
+      return !!_contents;
     }
-    this.pauseOnWrite();
-    return !!_contents;
-};
-
 
-IriSP.Widgets.CreateAnnotation.prototype.onCreatorChange = function() {
-    var _field = this.$.find(".Ldt-CreateAnnotation-Creator"),
+    onCreatorChange() {
+      var _field = this.$.find(".Ldt-CreateAnnotation-Creator"),
         _contents = _field.val();
-    _field.css("border-color", !!_contents ? "#666666" : "#ff0000");
-    if (!!_contents) {
+      _field.css("border-color", !!_contents ? "#666666" : "#ff0000");
+      if (!!_contents) {
         _field.removeClass("empty");
-    } else {
+      } else {
         _field.addClass("empty");
+      }
+      this.pauseOnWrite();
+      return !!_contents;
     }
-    this.pauseOnWrite();
-    return !!_contents;
-};
 
-IriSP.Widgets.CreateAnnotation.prototype.onSubmit = function() {
-    /* If mandatory fields are empty, we cancel the sending */
-    if (!this.onDescriptionChange() || (this.show_title_field && !this.onTitleChange()) || (this.show_creator_field && !this.onCreatorChange())) {
+    onSubmit() {
+      /* If mandatory fields are empty, we cancel the sending */
+      if (
+        !this.onDescriptionChange() ||
+        (this.show_title_field && !this.onTitleChange()) ||
+        (this.show_creator_field && !this.onCreatorChange())
+      ) {
         return false;
-    }
-    
-    if (this.recorder) {
-        this.recorder.stopRecord();
-    }
-    
-    var _this = this,
-        _exportedAnnotations = new IriSP.Model.List(this.player.sourceManager), /* We create a List to send to the server that will contains the annotation */
-        _export = this.player.sourceManager.newLocalSource({serializer: IriSP.serializers[this.api_serializer]}), /* We create a source object using a specific serializer for export */
-        _local_export = this.player.sourceManager.newLocalSource({serializer: IriSP.serializers['ldt_localstorage']}), /* Source object using a specific serializer for local export */
-        _annotation = new IriSP.Model.Annotation(false, _export), /* We create an annotation in the source with a generated ID (param. false) */
-        _annotationTypes = this.source.getAnnotationTypes().searchByTitle(this.annotation_type, true), /* We get the AnnotationType in which the annotation will be added */
-        _annotationType = (_annotationTypes.length ? _annotationTypes[0] : new IriSP.Model.AnnotationType(false, _export)), /* If it doesn't already exists, we create it */
-        _url = Mustache.to_html(this.api_endpoint_template, {id: this.source.projectId}); /* We make the url to send the request to, must include project id */
-    
-    /* If we created an AnnotationType on the spot ... */
-    if (!_annotationTypes.length) {
+      }
+
+      var _this = this,
+        _exportedAnnotations = new ns.Model.List(
+          this.player.sourceManager
+        ) /* We create a List to send to the server that will contains the annotation */,
+        _export = this.player.sourceManager.newLocalSource({
+          serializer: ns.serializers[this.api_serializer],
+        }) /* We create a source object using a specific serializer for export */,
+        _local_export = this.player.sourceManager.newLocalSource({
+          serializer: ns.serializers["ldt_localstorage"],
+        }) /* Source object using a specific serializer for local export */,
+        _annotation = new ns.Model.Annotation(
+          false,
+          _export
+        ) /* We create an annotation in the source with a generated ID (param. false) */,
+        _annotationTypes = this.source
+          .getAnnotationTypes()
+          .searchByTitle(
+            this.annotation_type,
+            true
+          ) /* We get the AnnotationType in which the annotation will be added */,
+        _annotationType = _annotationTypes.length
+          ? _annotationTypes[0]
+          : new ns.Model.AnnotationType(
+              false,
+              _export
+            ) /* If it doesn't already exists, we create it */,
+        _url = Mustache.render(this.api_endpoint_template, {
+          id: this.source.projectId,
+        }); /* We make the url to send the request to, must include project id */
+
+      /* If we created an AnnotationType on the spot ... */
+      if (!_annotationTypes.length) {
         /* ... We must not send its id to the server ... */
         _annotationType.dont_send_id = true;
         /* ... And we must include its title. */
         _annotationType.title = this.annotation_type;
-    }
-    
-    /*
-     * Will fill the generated annotation object's data
-     * WARNING: If we're on a MASHUP, these datas must refer the ORIGINAL MEDIA
-     * */
-    _annotation.setMedia(this.source.currentMedia.id); /* Annotated media ID */
-    
-    if (this.post_at_segment_time){
-        var _currentTime = this.media.getCurrentTime() 
-        var _segmentsAnnotations = this.source.getAnnotationsByTypeTitle(this.segments_annotation_type)
-        var _currentSegments = _segmentsAnnotations.filter(function(_segment){
-            return (_currentTime >= _segment.begin && _currentTime <= _segment.end)
+      }
+
+      /*
+       * Will fill the generated annotation object's data
+       * WARNING: If we're on a MASHUP, these datas must refer the ORIGINAL MEDIA
+       * */
+      _annotation.setMedia(
+        this.source.currentMedia.id
+      ); /* Annotated media ID */
+
+      if (this.post_at_segment_time) {
+        var _currentTime = this.media.getCurrentTime();
+        var _segmentsAnnotations = this.source.getAnnotationsByTypeTitle(
+          this.segments_annotation_type
+        );
+        var _currentSegments = _segmentsAnnotations.filter(function (_segment) {
+          return _currentTime >= _segment.begin && _currentTime <= _segment.end;
         });
-        if (_currentSegments.length == 0){
-            _annotation.setBegin(this.begin); /* Widget starting timecode */
-            _annotation.setEnd(this.end); /* Widget end timecode */
+        if (_currentSegments.length == 0) {
+          _annotation.setBegin(this.begin); /* Widget starting timecode */
+          _annotation.setEnd(this.end); /* Widget end timecode */
+        } else {
+          _annotation.setBegin(
+            _currentSegments[0].begin
+          ); /* Segment starting timecode */
+          _annotation.setEnd(
+            _currentSegments[0].end
+          ); /* Segment end timecode */
         }
-        else {
-            _annotation.setBegin(_currentSegments[0].begin); /* Segment starting timecode */
-            _annotation.setEnd(_currentSegments[0].end); /* Segment end timecode */
-        }
-    }
-    else {
-        _annotation.setBeginEnd(this.begin, this.end); /* Widget end/start timecodes */
-    }
-    _annotation.setAnnotationType(_annotationType.id); /* Annotation type ID */
-    if (this.show_title_field) {
+      } else {
+        _annotation.setBeginEnd(
+          this.begin,
+          this.end
+        ); /* Widget end/start timecodes */
+      }
+      _annotation.setAnnotationType(
+        _annotationType.id
+      ); /* Annotation type ID */
+      if (this.show_title_field) {
         /* Title field, only if it's visible */
         _annotation.title = this.$.find(".Ldt-CreateAnnotation-Title").val();
-    }if (this.project_id != ""){
-    	/* Project id, only if it's been specifiec in the config */
-    	_annotation.project_id = this.project_id;
-    }
-    _annotation.created = new Date(); /* Annotation creation date */
-    _annotation.description = this.$.find(".Ldt-CreateAnnotation-Description").val(); /* Description field */
-   
-    var tagIds = Array.prototype.map.call(
+      }
+      if (this.project_id != "") {
+        /* Project id, only if it's been specifiec in the config */
+        _annotation.project_id = this.project_id;
+      }
+      _annotation.created = new Date(); /* Annotation creation date */
+      _annotation.description = this.$.find(
+        ".Ldt-CreateAnnotation-Description"
+      ).val(); /* Description field */
+
+      var tagIds = Array.prototype.map.call(
         this.$.find(".Ldt-CreateAnnotation-TagLi.selected"),
-        function(el) { return IriSP.jQuery(el).attr("tag-id"); }
-    );
-        
-    IriSP._(_annotation.description.match(/#[^\s#.,;]+/g)).each(function(_tt) {
+        function (el) {
+          return jQuery(el).attr("tag-id");
+        }
+      );
+
+      _(_annotation.description.match(/#[^\s#.,;]+/g)).each(function (_tt) {
         var _tag,
-            _tag_title = _tt.replace(/^#/,''),
-            _tags = _this.source.getTags().searchByTitle(_tag_title, true);
+          _tag_title = _tt.replace(/^#/, ""),
+          _tags = _this.source.getTags().searchByTitle(_tag_title, true);
         if (_tags.length) {
-            _tag = _tags[0];
+          _tag = _tags[0];
         } else {
-            _tag = new IriSP.Model.Tag(false, _this.source);
-            _this.source.getTags().push(_tag);
-            _tag.title = _tag_title;
+          _tag = new ns.Model.Tag(false, _this.source);
+          _this.source.getTags().push(_tag);
+          _tag.title = _tag_title;
         }
         if (tagIds.indexOf(_tag.id) === -1) {
-            tagIds.push(_tag.id);
+          tagIds.push(_tag.id);
         }
-    });
-    _annotation.setTags(IriSP._(tagIds).uniq()); /* Tag ids list */
-    if (this.audio_url) {
+      });
+      _annotation.setTags(_(tagIds).uniq()); /* Tag ids list */
+      if (this.audio_url) {
         _annotation.audio = {
-            src: "mic",
-            mimetype: "audio/mp3",
-            href: this.audio_url
+          src: "mic",
+          mimetype: "audio/mp3",
+          href: this.audio_url,
         };
-    }
-    if (this.show_creator_field) {
-        _annotation.creator = this.$.find(".Ldt-CreateAnnotation-Creator").val();
-    } else {
+      }
+      if (this.show_creator_field) {
+        _annotation.creator = this.$.find(
+          ".Ldt-CreateAnnotation-Creator"
+        ).val();
+      } else {
         _annotation.creator = this.creator_name;
-    }
-    _exportedAnnotations.push(_annotation); /* Ajout de l'annotation à la liste à exporter */
-    
-    if (this.editable_storage != '') {
+      }
+      _exportedAnnotations.push(
+        _annotation
+      ); /* Ajout de l'annotation à la liste à exporter */
+
+      if (this.editable_storage != "") {
         // Append to localStorage annotations
 
         // FIXME: handle movie ids
-        _local_export.addList("annotation", _exportedAnnotations); /* Ajout de la liste à exporter à l'objet Source */
-        _this.source.merge(_local_export); /* On ajoute la nouvelle annotation au recueil original */
+        _local_export.addList(
+          "annotation",
+          _exportedAnnotations
+        ); /* Ajout de la liste à exporter à l'objet Source */
+        _this.source.merge(
+          _local_export
+        ); /* On ajoute la nouvelle annotation au recueil original */
         // Import previously saved local annotations
         if (window.localStorage[this.editable_storage]) {
-            _local_export.deSerialize(window.localStorage[this.editable_storage]);
+          _local_export.deSerialize(window.localStorage[this.editable_storage]);
         }
         // Save everything back
         window.localStorage[_this.editable_storage] = _local_export.serialize();
-        _this.player.trigger("AnnotationsList.refresh"); /* On force le rafraîchissement du widget AnnotationsList */
+        _this.player.trigger(
+          "AnnotationsList.refresh"
+        ); /* On force le rafraîchissement du widget AnnotationsList */
         _this.player.trigger("Annotation.create", _annotation);
         _this.$.find(".Ldt-CreateAnnotation-Description").val("");
-    }
-    
-    if (_url !== "") {
-        _exportedAnnotations.push(_annotation); /* We add the annotation in the list to export */
-        _export.addList("annotation",_exportedAnnotations); /* We add the list to the source object */ 
+      }
+
+      if (_url !== "") {
+        _exportedAnnotations.push(
+          _annotation
+        ); /* We add the annotation in the list to export */
+        _export.addList(
+          "annotation",
+          _exportedAnnotations
+        ); /* We add the list to the source object */
         var _this = this;
         /* We send the AJAX request to the server ! */
-        IriSP.jQuery.ajax({
-            url: _url,
-            type: this.api_method,
-            contentType: 'application/json',
-            data: _export.serialize(), /* Source is serialized */
-            success: function(_data) {
-                _this.showScreen('Saved'); 
-                if (_this.after_send_timeout) { 
-                    window.setTimeout(
-                        function() {
-                            _this.close_after_send
-                                ? _this.player.trigger("CreateAnnotation.hide")
-                                : _this.player.trigger("CreateAnnotation.show");
-                        },
-                        _this.after_send_timeout
-                    );
-                }
-                _export.getAnnotations().removeElement(_annotation, true); /* We delete the sent annotation to avoid redundancy */
-                _export.deSerialize(_data); /* Data deserialization */
-                _this.source.merge(_export); /* We merge the deserialized data with the current source data */
-                if (_this.pause_on_write && _this.media.getPaused()) {
-                    _this.media.play();
-                }
-                _this.player.trigger("AnnotationsList.refresh"); 
-            },
-            error: function(_xhr, _error, _thrown) {
-                IriSP.log("Error when sending annotation", _thrown);
-                _export.getAnnotations().removeElement(_annotation, true);
-                _this.showScreen('Error');
-                window.setTimeout(function(){
-                    _this.showScreen("Main")
-                },
-                                  (_this.after_send_timeout || 5000));
+        jQuery.ajax({
+          url: _url,
+          type: this.api_method,
+          contentType: "application/json",
+          data: _export.serialize() /* Source is serialized */,
+          success: function (_data) {
+            _this.showScreen("Saved");
+            if (_this.after_send_timeout) {
+              window.setTimeout(function () {
+                _this.close_after_send
+                  ? _this.player.trigger("CreateAnnotation.hide")
+                  : _this.player.trigger("CreateAnnotation.show");
+              }, _this.after_send_timeout);
             }
+            _export
+              .getAnnotations()
+              .removeElement(
+                _annotation,
+                true
+              ); /* We delete the sent annotation to avoid redundancy */
+            _export.deSerialize(_data); /* Data deserialization */
+            _this.source.merge(
+              _export
+            ); /* We merge the deserialized data with the current source data */
+            if (_this.pause_on_write && _this.media.getPaused()) {
+              _this.media.play();
+            }
+            _this.player.trigger("AnnotationsList.refresh");
+          },
+          error: function (_xhr, _error, _thrown) {
+            ns.log("Error when sending annotation", _thrown);
+            _export.getAnnotations().removeElement(_annotation, true);
+            _this.showScreen("Error");
+            window.setTimeout(function () {
+              _this.showScreen("Main");
+            }, _this.after_send_timeout || 5000);
+          },
         });
-        this.showScreen('Wait');
-    };
-    return false;
+        this.showScreen("Wait");
+      }
+      return false;
+    }
+  };
 };
 
+export { CreateAnnotation, createAnnotationStyles };
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/widgets/CreateAnnotation.module.css	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,180 @@
+/*
+ *
+ */
+
+.Ldt-CreateAnnotation {
+    border-style: none solid solid;
+    border-width: 1px;
+    border-color: #b7b7b7;
+    padding: 0 1px 1px;
+    margin: 0;
+}
+
+.Ldt-CreateAnnotation-Inner {
+    background: url(img/pinstripe.png); padding: 5px; margin: 0; position: relative;
+}
+
+.Ldt-CreateAnnotation-Inner h3 {
+    margin: 5px 0; font-size: 14px; font-weight: bold; text-align: right; clear:both; color: #0068c4;
+}
+
+.Ldt-CreateAnnotation-h3Left {
+    float: left;
+}
+
+.Ldt-CreateAnnotation-Main {
+    min-height: 50px;
+}
+
+.Ldt-CreateAnnotation-Title, .Ldt-CreateAnnotation-Creator {
+    font-size: 14px;
+    font-weight: bold;
+    color: #0068c4;
+    border: 1px solid #666666;
+    border-radius: 2px;
+}
+
+.Ldt-CreateAnnotation-Title.empty, .Ldt-CreateAnnotation-Creator.empty {
+    font-style: italic;
+    color: #90b0d0;
+}
+
+.Ldt-CreateAnnotation-Times {
+    color: #ff3b77
+}
+
+.Ldt-CreateAnnotation-Submit,
+.Ldt-CreateAnnotation-Cancel,
+.Ldt-CreateAnnotation-PreviewSubmit{
+    position: absolute;
+    bottom: 7px;
+    color: #ffffff;
+    cursor: pointer;
+    height: 50px;
+    width: 50px;
+    padding: 28px 0 0;
+    font-size: 12px;
+    border: none;
+    text-align: center;
+    cursor: pointer;
+}
+
+
+.Ldt-CreateAnnotation-Cancel{
+    right: 7px;
+    background: url('img/cancel_annotation.png');
+}
+
+.Ldt-CreateAnnotation-Submit{
+	right: 67px; 
+	background: url('img/submit_annotation.png');
+}
+
+.Ldt-CreateAnnotation-Submit:hover,
+.Ldt-CreateAnnotation-Cancel:hover{
+    background-position: -50px 0;
+}
+
+.Ldt-CreateAnnotation-Description {
+    height: 3em;
+    padding: 2px;
+    resize: none;
+    width: calc(100% - 122px);
+    border: 1px solid #666666;
+    border-radius: 2px;
+}
+
+.Ldt-CreateAnnotation-Description.empty {
+    font-style: italic; color: #999999;
+}
+
+.Ldt-CreateAnnotation-Avatar {
+    float: right;
+    width: 48px;
+    height: 48px;
+    margin: 5px 0;
+    padding: 0 0 0 15px;
+    background: url('img/profile_arrow.png') left no-repeat;
+}
+
+.Ldt-CreateAnnotation-Avatar img {
+    float: right;
+    display: block;
+    max-width: 100%;
+    max-height: 100%;
+    border: 1px solid #bbbbbb;
+}
+
+.Ldt-CreateAnnotation-RecBlock {
+    width: 220px; float: left;
+}
+
+.Ldt-CreateAnnotation-TagTitle, .Ldt-CreateAnnotation-PolemicTitle, .Ldt-CreateAnnotation-RecLabel {
+    display: block; margin: 5px 0 2px; font-size: 12px;
+}
+
+.Ldt-CreateAnnotation-TagList, .Ldt-CreateAnnotation-PolemicList {
+    list-style: none;
+    width: calc(100% - 122px);
+    padding-left: 0px;
+}
+
+li.Ldt-CreateAnnotation-TagLi {
+    display: inline-block; border: none; margin: 0 10px 5px 0; height: 23px; padding: 0 0 0 20px;
+    background: url(img/tag.png) left top no-repeat;
+    cursor: pointer;
+}
+
+.Ldt-CreateAnnotation-TagButton {
+    display: inline-block; font-size: 12px; height: 19px; padding: 4px 5px 0 0; border: none; margin: 0;
+    background: url(img/tag.png) right top no-repeat;
+}
+
+li.Ldt-CreateAnnotation-TagLi:hover {
+    background-position: left -23px;
+}
+
+.Ldt-CreateAnnotation-TagLi:hover .Ldt-CreateAnnotation-TagButton {
+    background-position: right -23px;
+}
+
+li.Ldt-CreateAnnotation-TagLi.selected {
+    background-position: left -46px;
+}
+
+.Ldt-CreateAnnotation-TagLi.selected .Ldt-CreateAnnotation-TagButton {
+    background-position: right -46px;
+}
+
+li.Ldt-CreateAnnotation-PolemicLi {
+    display: inline-block; border: none; margin: 0 5px 0; height: 21px; width: 26px; padding: 2px 0 0;
+    background: url(img/polemic.png) left top no-repeat; font-size: 14px; font-weight: bold; text-align: center;
+    cursor: pointer;
+}
+
+li.Ldt-CreateAnnotation-PolemicLi:hover {
+    background-position: 0 -23px;
+}
+
+li.Ldt-CreateAnnotation-PolemicLi.selected {
+    background-position: 0 -46px;
+}
+
+.Ldt-CreateAnnotation-InnerBox {
+    margin: 20px 50px;
+    border: 1px solid #CCCCCC;
+    padding: 20px;
+    background: #FFFFFF;
+    color: #FF3B77; text-align: center;
+    font-size: 13px; font-weight: bold;
+}
+
+a.Ldt-CreateAnnotation-Close {
+    position: absolute; top: 2px; right: 2px;
+    display: inline-block; width: 17px; height: 17px; margin: 2px;
+    background: url(img/widget-control.png);
+}
+
+a.Ldt-CreateAnnotation-Close:hover {
+    background-position: -17px 0;
+}
\ No newline at end of file
--- a/src/widgets/CurrentSegmentInfobox.css	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,192 +0,0 @@
-.Ldt-CurrentSegmentInfobox{
-	background: url(img/pinstripe.png);
-	width: 535px;
-	max-height: 280px;
-	margin: 0px;
-	margin-top: 4px;
-	border-style: solid;
-	border-width: 1px;
-	border-color: #b7b7b7;
-}
-
-.Ldt-CurrentSegmentInfobox-Element{
-	margin: 5px;
-	vertical-align: top;
-}
-
-.Ldt-CurrentSegmentInfobox-Tags-Ul{
-	list-style: none;
-	margin: 0px;
-}
-
-.Ldt-CurrentSegmentInfobox-Tags{
-	margin: 0px;
-}
-
-.Ldt-CurrentSegmentInfobox-Tags-Li{
-	display: inline-block;
-	background-color: #ffffff;
-	margin: 2px;
-	padding: 2px;
-	border: solid 1px;
-	border-color: #aeaeae;
-}
-
-.Ldt-CurrentSegmentInfobox-Title{
-	color: #0068c4;
-    font-size: 15px;
-    font-weight: bold;
-}
-
-.Ldt-CurrentSegmentInfobox-Description{
-	font-size: 13px;
-	font-weight: bold;
-}
-
-textarea.Ldt-CurrentSegmentInfobox-DescriptionInput.Ldt-CurrentSegmentInfobox-Description{
-	display: inline-block;
-	width: 95%;
-}
-
-.Ldt-CurrentSegmentInfobox-Tags{
-}
-
-.Ldt-CurrentSegmentInfobox-NoSegment{
-	font-size: 15px;
-	font-weight: bold;
-}
-
-.Ldt-CurrentSegmentInfobox-SubmitButton{
-	display: inline-block;
-    background-color: #d93c71;
-    color: #ffffff;
-    cursor: pointer;
-    height: 14px;
-    width: 100px;
-    margin: 2px;
-    margin-top: 5px;
-    padding: 2px;
-    font-size: 11px;
-    border: 1px solid;
-    border-color: #eca3bc #631e34 #36101c #e16e93;
-    cursor: pointer;
-    text-align: center;
-    vertical-align: middle;
-}
-
-.Ldt-CurrentSegmentInfobox-CancelButton{
-	display: inline-block;
-    background-color: #d93c71;
-    color: #ffffff;
-    cursor: pointer;
-    height: 14px;
-    width: 100px;
-    margin: 2px;
-    margin-top: 5px;
-    margin-right: 5px;
-    padding: 2px;
-    font-size: 11px;
-    border: 1px solid;
-    border-color: #eca3bc #631e34 #36101c #e16e93;
-    cursor: pointer;
-    text-align: center;
-    vertical-align: middle;
-}
-
-.Ldt-CurrentSegmentInfobox-CreateTagButton{
-	display: block;
-    background-color: #d93c71;
-    color: #ffffff;
-    cursor: pointer;
-    height: 14px;
-    width: 75px;
-    margin: 2px;
-    padding: 2px;
-    font-size: 11px;
-    border: 1px solid;
-    border-color: #eca3bc #631e34 #36101c #e16e93;
-    cursor: pointer;
-    text-align: center;
-    vertical-align: middle;
-}
-
-.Ldt-CurrentSegmentInfobox-Tags-Li-Input{
-	width: 80px;
-}
-
-.Ldt-CurrentSegmentInfobox-EditButton{
-	float: right;
-	display: inline-block;
-    background-color: #d93c71;
-    color: #ffffff;
-    cursor: pointer;
-    height: 18px;
-    width: 95px;
-    font-size: 14px;
-    border: 1px solid;
-    border-color: #eca3bc #631e34 #36101c #e16e93;
-    cursor: pointer;
-    margin-right: 5px;
-    margin-left: 5px;
-    margin-bottom: 5px;
-    margin-top: 5px;
-    padding: 4px;
-    text-align: center;
-	vertical-align: middle;
-	line-height: 18px;
-}
-
-.Ldt-CurrentSegmentInfobox-EditButton:hover, .Ldt-CurrentSegmentInfobox-CreateTagInput-Add:hover{
-	background-color: #e15581;
-	border-color: #222222 #e87d9f #f0adc3 #68273c;
-}
-
-.Ldt-CurrentSegmentInfobox-CreateTagButton:hover, .Ldt-CurrentSegmentInfobox-CancelButton:hover,
-.Ldt-CurrentSegmentInfobox-SubmitButton:hover{
-	background-color: #e15581;
-	border-color: #222222 #e87d9f #f0adc3 #68273c;
-}
-
-.Ldt-CurrentSegmentInfobox-Tags-Li-DeleteTagButton{
-	font-weight: bold;
-	color: #d93c71
-}
-
-.Ldt-CurrentSegmentInfobox-Tags-Li-DeleteTagButton:hover{
-	color: #e16e93
-}
-
-.Ldt-CurrentSegmentInfobox-FieldsHeader{
-	margin: 5px;
-}
-
-.Ldt-CurrentSegmentInfobox-TagsHeader{
-	margin-top: 10px;
-	margin-left: 5px;
-}
-
-.Ldt-CurrentSegmentInfobox-CreateTagInput{
-    border: 2px solid #848484;
-    margin: 5px 2px;
-    padding: 4px;
-}
-
-.Ldt-CurrentSegmentInfobox-CreateTagInput-Add{
-    margin: 5px;
-    padding: 4px;
-	display: inline-block;
-    background-color: #d93c71;
-    color: #ffffff;
-    cursor: pointer;
-    height: 14px;
-    width: 14px;
-    font-size: 14px;
-    font-style: bold;
-    border: 1px solid;
-    border-color: #eca3bc #631e34 #36101c #e16e93;
-    cursor: pointer;
-    padding: 4px;
-    text-align: center;
-	vertical-align: middle;
-	line-height: 14px;
-}
\ No newline at end of file
--- a/src/widgets/CurrentSegmentInfobox.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/widgets/CurrentSegmentInfobox.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,334 +1,427 @@
 /* Widget displays info on the current segment, with possibility of config for editing description and tags */
+// CurrentSegmentInfobox
+
+import currentSegmentInfoboxStyles from "./CurrentSegmentInfobox.module.css";
+import Mustache from "mustache";
+import _ from "lodash";
+
+const CurrentSegmentInfobox = function (ns) {
+  return class extends ns.Widgets.Widget {
+    constructor(player, config) {
+      super(player, config);
+    }
+
+    static defaults = {
+      annotation_type: "chap",
+      editable_segments: false,
+      empty_message: false,
+      project_id: false,
+      api_serializer: "ldt_annotate",
+      api_method: "PUT",
+      api_endpoint_template: "",
+      new_tag_button: true,
+      show_headers: false,
+      custom_edit_text: false,
+      empty_description_placeholder: false,
+    };
+
+    static template =
+      '<div class="Ldt-CurrentSegmentInfobox">' +
+      '<div class="Ldt-CurrentSegmentInfobox-SelectedSegment">' +
+      '{{#editable_segments}}<div class="Ldt-CurrentSegmentInfobox-EditButton">{{edit}}</div>{{/editable_segments}}' +
+      '<div class="Ldt-CurrentSegmentInfobox-Element Ldt-CurrentSegmentInfobox-Title">{{title}}</div>' +
+      '<div class="Ldt-CurrentSegmentInfobox-Element Ldt-CurrentSegmentInfobox-Description">{{description}}</div>' +
+      '{{^description}}{{^tags.length}}{{#description_placeholder}}<div class="Ldt-CurrentSegmentInfobox-Element Ldt-CurrentSegmentInfobox-Description-placeholder">{{description_placeholder}}</div>{{/description_placeholder}}{{/tags.length}}{{/description}}' +
+      '<div class="Ldt-CurrentSegmentInfobox-Element Ldt-CurrentSegmentInfobox-Tags">' +
+      "{{#tags.length}}" +
+      '<ul class="Ldt-CurrentSegmentInfobox-Tags-Ul">' +
+      "{{#tags}}" +
+      "{{#.}}" +
+      '<li class="Ldt-CurrentSegmentInfobox-Tags-Li">' +
+      "<span>{{.}}</span>" +
+      "</li>" +
+      "{{/.}}" +
+      "{{/tags}}" +
+      "</ul>" +
+      "{{/tags.length}}" +
+      "</div>" +
+      "</div>" +
+      "</div>";
+
+    static editTemplate =
+      '<div class="Ldt-CurrentSegmentInfobox">' +
+      '<div class="Ldt-CurrentSegmentInfobox-SelectedSegment">' +
+      '{{#headers}}<div class="Ldt-CurrentSegmentInfobox-FieldsHeader">{{fields_header}}</div>{{/headers}}' +
+      '<input type="text" class="Ldt-CurrentSegmentInfobox-Element Ldt-CurrentSegmentInfobox-TitleInput Ldt-CurrentSegmentInfobox-Title" value="{{title}}"></input>' +
+      '<textarea class="Ldt-CurrentSegmentInfobox-Element Ldt-CurrentSegmentInfobox-DescriptionInput Ldt-CurrentSegmentInfobox-Description">{{description}}</textarea>' +
+      '<div class="Ldt-CurrentSegmentInfobox-Element Ldt-CurrentSegmentInfobox-Tags">' +
+      '{{#headers}}<div class="Ldt-CurrentSegmentInfobox-TagsHeader">{{tags_header}}</div>{{/headers}}' +
+      "{{#new_tag_button}}" +
+      '<div class="Ldt-CurrentSegmentInfobox-CreateTagButton">{{new_tag}}</div>' +
+      "{{/new_tag_button}}" +
+      "{{^new_tag_button}}" +
+      '<input class="Ldt-CurrentSegmentInfobox-CreateTagInput" placeholder="{{new_tag}}"></input>' +
+      '<div class="Ldt-CurrentSegmentInfobox-CreateTagInput-Add">+</div>' +
+      "{{/new_tag_button}}" +
+      '<ul class="Ldt-CurrentSegmentInfobox-Tags-Ul">' +
+      "{{#tags}}" +
+      "{{#.}}" +
+      '<li class="Ldt-CurrentSegmentInfobox-Tags-Li">' +
+      '<input type="text" class="Ldt-CurrentSegmentInfobox-Tags-Li-Input" value="{{.}}"></input>' +
+      '<div class="Ldt-CurrentSegmentInfobox-Tags-Li-DeleteTagButton">{{delete_tag}}</div>' +
+      "</li>" +
+      "{{/.}}" +
+      "{{/tags}}" +
+      "</ul>" +
+      "</div>" +
+      '<div class="Ldt-CurrentSegmentInfobox-SubmitButton">{{submit}}</div>' +
+      '<div class="Ldt-CurrentSegmentInfobox-CancelButton">{{cancel}}</div>' +
+      "</div>" +
+      "</div>";
 
-IriSP.Widgets.CurrentSegmentInfobox = function(player, config){
-    IriSP.Widgets.Widget.call(this, player, config);
-};
+    static messages =  {
+      fr: {
+        submit: "Soumettre",
+        cancel: "Annuler",
+        edit: "Editer",
+        new_tag: "Nouveau tag",
+        delete_tag: "Supprimer",
+        fields_header: "Commentaire associé à ce segment",
+        tags_header: "Mots-clés associés à ce segment",
+        empty: "Le player vidéo ne lit actuellement aucun segment",
+      },
+      en: {
+        submit: "Submit",
+        cancel: "Cancel",
+        edit: "Edit",
+        new_tag: "New tag",
+        delete_tag: "Delete tag",
+        fields_header: "Current segment content",
+        tags_header: "Current segment tags",
+        empty: "The player currently doesn't read any segment",
+      },
+    };
 
-IriSP.Widgets.CurrentSegmentInfobox.prototype = new IriSP.Widgets.Widget();
+    draw() {
+      var _this = this;
+      this.segments = this.getWidgetAnnotations();
+      this.renderTemplate();
+      this.currentSegment = false;
+      this.clearBox();
+      this.refresh();
+      this.onMediaEvent("timeupdate", "refresh");
+      this.onMediaEvent("settimerange", function (_timeRange) {
+        var _segmentBegin = _timeRange[0],
+          _segmentEnd = _timeRange[1],
+          _list = _this.segments.filter(function (_segment) {
+            return (
+              _segment.begin.milliseconds == _segmentBegin.milliseconds &&
+              _segment.end.milliseconds == _segmentEnd.milliseconds
+            );
+          });
+        if (_list.length > 0) {
+          _this.$.toggleClass("editing", false);
+          if (_this.currentSegment.id != _list[0].id) {
+            _this.currentSegment = _list[0];
+            _data = {
+              editable_segments: _this.editable_segments,
+              edit: _this.custom_edit_text
+                ? _this.custom_edit_text
+                : _this.l10n.edit,
+              title: _this.currentSegment.title,
+              description: _this.currentSegment.description,
+              description_placeholder: _this.empty_description_placeholder,
+              tags: _this.currentSegment.getTagTexts(),
+            };
+            _this.$.html(Mustache.render(_this.template, _data));
+            if (_this.editable_segments && _this.currentSegment) {
+              _this.$.find(".Ldt-CurrentSegmentInfobox").click(
+                _this.functionWrapper("enableEditMode")
+              );
+            }
+          }
+        }
+      });
+
+      if (this.editable_segments && this.currentSegment) {
+        this.$.find(".Ldt-CurrentSegmentInfobox").click(
+          _this.functionWrapper("enableEditMode")
+        );
+      }
+    }
+
+    enableEditMode() {
+      var _this = this;
+      if (this.currentSegment) {
+        _data = {
+          title: this.currentSegment.title,
+          description: this.currentSegment.description,
+          tags: this.currentSegment.getTagTexts(),
+          submit: this.l10n.submit,
+          cancel: this.l10n.cancel,
+          headers: this.show_headers,
+          tags_header: this.custom_tags_header
+            ? this.custom_tags_header
+            : this.l10n.tags_header,
+          fields_header: this.custom_fields_header
+            ? this.custom_fields_header
+            : this.l10n.fields_header,
+          new_tag: this.l10n.new_tag,
+          delete_tag: this.l10n.delete_tag,
+          new_tag_button: this.new_tag_button,
+        };
+        this.$.toggleClass("editing", true);
+        this.$.html(Mustache.render(this.editTemplate, _data));
+        this.$.find(".Ldt-CurrentSegmentInfobox-CancelButton").click(
+          this.functionWrapper("disableEditMode")
+        );
+        if (this.new_tag_button) {
+          this.$.find(".Ldt-CurrentSegmentInfobox-CreateTagButton").click(
+            this.functionWrapper("insertTagInput")
+          );
+        } else {
+          this.$.find(".Ldt-CurrentSegmentInfobox-CreateTagInput").keypress(
+            this.functionWrapper("insertTagInputKeypress")
+          );
+          this.$.find(".Ldt-CurrentSegmentInfobox-CreateTagInput-Add").click(
+            this.functionWrapper("insertTagInputKeypress")
+          );
+        }
+        this.$.find(".Ldt-CurrentSegmentInfobox-Tags-Li-DeleteTagButton").click(
+          this.functionWrapper("deleteTagInput")
+        );
+        this.$.find(".Ldt-CurrentSegmentInfobox-SubmitButton").click(
+          this.functionWrapper("onSubmit")
+        );
+      }
+    }
 
-IriSP.Widgets.CurrentSegmentInfobox.prototype.defaults = {
-    annotation_type: "chap",
-    editable_segments: false,
-    empty_message: false,
-    project_id: false,
-    api_serializer: "ldt_annotate",
-    api_method: "PUT",
-    api_endpoint_template: "",
-    new_tag_button: true,
-    show_headers: false,
-    custom_edit_text: false,
-    empty_description_placeholder: false,
+    disableEditMode() {
+      if (this.currentSegment) {
+        _data = {
+          editable_segments: this.editable_segments,
+          edit: this.custom_edit_text ? this.custom_edit_text : this.l10n.edit,
+          title: this.currentSegment.title,
+          description: this.currentSegment.description,
+          description_placeholder: this.empty_description_placeholder,
+          tags: this.currentSegment.getTagTexts(),
+        };
+        this.$.toggleClass("editing", false);
+        this.$.html(Mustache.render(this.template, _data));
+        this.$.find(".Ldt-CurrentSegmentInfobox").click(
+          this.functionWrapper("enableEditMode")
+        );
+      }
+    }
+
+    insertTagInput() {
+      if (
+        !this.currentSegment.getTagTexts().length &&
+        !this.$.find(".Ldt-CurrentSegmentInfobox-Tags-Ul").length
+      ) {
+        this.$.find(".Ldt-CurrentSegmentInfobox-Tags").prepend(
+          '<ul class="Ldt-CurrentSegmentInfobox-Tags-Ul"></ul>'
+        );
+      }
+      this.$.find(".Ldt-CurrentSegmentInfobox-Tags-Ul").append(
+        '<li class="Ldt-CurrentSegmentInfobox-Tags-Li">' +
+          '<input type="text" class="Ldt-CurrentSegmentInfobox-Tags-Li-Input" value=""></input>' +
+          '<div class="Ldt-CurrentSegmentInfobox-Tags-Li-DeleteTagButton">' +
+          this.l10n.delete_tag +
+          "</div>" +
+          "</li>"
+      );
+      this.$.find(".Ldt-CurrentSegmentInfobox-Tags-Li-DeleteTagButton").click(
+        this.functionWrapper("deleteTagInput")
+      );
+    }
+
+    insertTagInputKeypress(event) {
+      var keycode = event.keyCode ? event.keyCode : event.which;
+      if (keycode == "13" || event.type == "click") {
+        if (
+          !this.currentSegment.getTagTexts().length &&
+          !this.$.find(".Ldt-CurrentSegmentInfobox-Tags-Ul").length
+        ) {
+          this.$.find(".Ldt-CurrentSegmentInfobox-Tags").prepend(
+            '<ul class="Ldt-CurrentSegmentInfobox-Tags-Ul"></ul>'
+          );
+        }
+        this.$.find(".Ldt-CurrentSegmentInfobox-Tags-Ul").append(
+          '<li class="Ldt-CurrentSegmentInfobox-Tags-Li">' +
+            '<input type="text" class="Ldt-CurrentSegmentInfobox-Tags-Li-Input" value="' +
+            this.$.find(".Ldt-CurrentSegmentInfobox-CreateTagInput").val() +
+            '"></input>' +
+            '<div class="Ldt-CurrentSegmentInfobox-Tags-Li-DeleteTagButton">' +
+            this.l10n.delete_tag +
+            "</div>" +
+            "</li>"
+        );
+        this.$.find(".Ldt-CurrentSegmentInfobox-Tags-Li-DeleteTagButton").click(
+          this.functionWrapper("deleteTagInput")
+        );
+        this.$.find(".Ldt-CurrentSegmentInfobox-CreateTagInput").val("");
+        return false;
+      }
+    }
+
+    deleteTagInput(clickEvent) {
+      $(clickEvent.currentTarget).parent().remove();
+    }
+
+    onSubmit() {
+      new_tags_titles = this.$.find(
+        ".Ldt-CurrentSegmentInfobox-Tags-Li-Input"
+      ).map(function () {
+        if ($(this).val()) {
+          return $(this).val();
+        }
+      });
+      new_title = this.$.find(".Ldt-CurrentSegmentInfobox-TitleInput").val();
+      new_description = this.$.find(
+        ".Ldt-CurrentSegmentInfobox-DescriptionInput"
+      ).val();
+
+      var _this = this,
+        _exportedAnnotations = new ns.Model.List(
+          this.player.sourceManager
+        ) /* We create an Annotations List to send to the server */,
+        _export = this.player.sourceManager.newLocalSource({
+          serializer: ns.serializers[this.api_serializer],
+        }) /* We create a source object using a specific serializer for export */,
+        _annotation = new ns.Model.Annotation(
+          this.currentSegment.id,
+          _export
+        ); /* We create an annotation in the source with a generated ID (param. false) */
+
+      _annotation.setAnnotationType(this.currentSegment.getAnnotationType().id);
+      _annotation.setMedia(this.currentSegment.getMedia().id);
+      _annotation.setBegin(this.currentSegment.begin);
+      _annotation.setEnd(this.currentSegment.end);
+      _annotation.created = this.currentSegment.created;
+      _annotation.creator = this.currentSegment.creator;
+      _annotation.title = new_title; /* Title field */
+      _annotation.description = new_description; /* Description field */
+      var _tagIds = _(new_tags_titles).map(function (_title) {
+        var _tags = _this.source.getTags(true).searchByTitle(_title, true);
+        if (_tags.length) {
+          var _tag = _tags[0];
+        } else {
+          _tag = new ns.Model.Tag(_title.replace(/\W/g, "_"), _this.source);
+          _tag.title = _title;
+          _this.source.getTags().push(_tag);
+        }
+        return _tag.id;
+      }).value();
+      _annotation.setTags(_tagIds);
+      _annotation.project_id = this.project_id;
+
+      _exportedAnnotations.push(
+        _annotation
+      ); /* We add the annotation in the list to export */
+      _export.addList(
+        "annotation",
+        _exportedAnnotations
+      ); /* We add the list to the source object */
+
+      _url = Mustache.render(this.api_endpoint_template, {
+        annotation_id: this.currentSegment.id,
+      });
+
+      ns.jQuery.ajax({
+        url: _url,
+        type: this.api_method,
+        contentType: "application/json",
+        data: _export.serialize() /* Source is serialized */,
+        success: function (_data) {
+          _export
+            .getAnnotations()
+            .removeElement(
+              _annotation,
+              true
+            ); /* We delete the sent annotation to avoid redundancy */
+          _export.deSerialize(_data); /* Data deserialization */
+          _this.source.merge(
+            _export
+          ); /* We merge the deserialized data with the current source data */
+          _this.segments.forEach(function (_segment) {
+            if (_segment.id == _annotation.id) {
+              _this.segments.removeElement(_segment);
+            }
+          });
+          _this.segments.push(_annotation);
+          _this.currentSegment = _annotation;
+          _data = {
+            editable_segments: _this.editable_segments,
+            edit: _this.custom_edit_text
+              ? _this.custom_edit_text
+              : _this.l10n.edit,
+            title: _this.currentSegment.title,
+            description: _this.currentSegment.description,
+            description_placeholder: _this.empty_description_placeholder,
+            tags: _this.currentSegment.getTagTexts(),
+          };
+          _this.$.html(Mustache.render(_this.template, _data));
+          if (_this.editable_segments && _this.currentSegment) {
+            _this.$.find(".Ldt-CurrentSegmentInfobox").click(
+              _this.functionWrapper("enableEditMode")
+            );
+          }
+          _this.$.toggleClass("editing", false);
+        },
+        error: function (_xhr, _error, _thrown) {
+          ns.log("Error when sending annotation", _thrown);
+          _export.getAnnotations().removeElement(_annotation, true);
+        },
+      });
+    }
+
+    refresh() {
+      if (!this.media.getTimeRange()) {
+        var _currentTime = this.media.getCurrentTime();
+        var _list = this.segments.filter(function (_segment) {
+          return _segment.begin <= _currentTime && _segment.end >= _currentTime;
+        });
+
+        if (_list.length > 0) {
+          if (this.currentSegment.id != _list[0].id) {
+            this.currentSegment = _list[0];
+            _data = {
+              editable_segments: this.editable_segments,
+              edit: this.custom_edit_text
+                ? this.custom_edit_text
+                : this.l10n.edit,
+              title: this.currentSegment.title,
+              description: this.currentSegment.description,
+              description_placeholder: this.empty_description_placeholder,
+              tags: this.currentSegment.getTagTexts(),
+            };
+            this.$.html(Mustache.render(this.template, _data));
+            if (this.editable_segments && this.currentSegment) {
+              this.$.find(".Ldt-CurrentSegmentInfobox").click(
+                this.functionWrapper("enableEditMode")
+              );
+            }
+          }
+        } else {
+          this.currentSegment = false;
+          this.clearBox();
+        }
+      }
+    }
+
+    clearBox() {
+      var _empty_message = this.l10n.empty;
+      if (this.empty_message) {
+        _empty_message = this.empty_message;
+      }
+      this.$.find(".Ldt-CurrentSegmentInfobox").html(
+        "<div class='Ldt-CurrentSegmentInfobox-Element Ldt-CurrentSegmentInfobox-NoSegment'>" +
+          _empty_message +
+          "</div>"
+      );
+    }
+  };
 };
 
-IriSP.Widgets.CurrentSegmentInfobox.prototype.template = 
-      '<div class="Ldt-CurrentSegmentInfobox">'
-    +   '<div class="Ldt-CurrentSegmentInfobox-SelectedSegment">'
-    +     '{{#editable_segments}}<div class="Ldt-CurrentSegmentInfobox-EditButton">{{edit}}</div>{{/editable_segments}}'
-    +     '<div class="Ldt-CurrentSegmentInfobox-Element Ldt-CurrentSegmentInfobox-Title">{{title}}</div>'
-    +     '<div class="Ldt-CurrentSegmentInfobox-Element Ldt-CurrentSegmentInfobox-Description">{{description}}</div>' 
-    +     '{{^description}}{{^tags.length}}{{#description_placeholder}}<div class="Ldt-CurrentSegmentInfobox-Element Ldt-CurrentSegmentInfobox-Description-placeholder">{{description_placeholder}}</div>{{/description_placeholder}}{{/tags.length}}{{/description}}' 
-    +     '<div class="Ldt-CurrentSegmentInfobox-Element Ldt-CurrentSegmentInfobox-Tags">'
-    +         '{{#tags.length}}'
-    +         '<ul class="Ldt-CurrentSegmentInfobox-Tags-Ul">'
-    +         '{{#tags}}'
-    +             '{{#.}}'
-    +             '<li class="Ldt-CurrentSegmentInfobox-Tags-Li">'
-    +                 '<span>{{.}}</span>'
-    +             '</li>'
-    +             '{{/.}}'
-    +         '{{/tags}}'
-    +         '</ul>'
-    +         '{{/tags.length}}'
-    +     '</div>'
-    +   '</div>'
-    + '</div>'
-
-IriSP.Widgets.CurrentSegmentInfobox.prototype.editTemplate = 
-      '<div class="Ldt-CurrentSegmentInfobox">'
-    +   '<div class="Ldt-CurrentSegmentInfobox-SelectedSegment">'
-    +     '{{#headers}}<div class="Ldt-CurrentSegmentInfobox-FieldsHeader">{{fields_header}}</div>{{/headers}}'
-    +     '<input type="text" class="Ldt-CurrentSegmentInfobox-Element Ldt-CurrentSegmentInfobox-TitleInput Ldt-CurrentSegmentInfobox-Title" value="{{title}}"></input>'   
-    +     '<textarea class="Ldt-CurrentSegmentInfobox-Element Ldt-CurrentSegmentInfobox-DescriptionInput Ldt-CurrentSegmentInfobox-Description">{{description}}</textarea>'
-    +     '<div class="Ldt-CurrentSegmentInfobox-Element Ldt-CurrentSegmentInfobox-Tags">'
-    +         '{{#headers}}<div class="Ldt-CurrentSegmentInfobox-TagsHeader">{{tags_header}}</div>{{/headers}}'
-    +     '{{#new_tag_button}}'
-    +         '<div class="Ldt-CurrentSegmentInfobox-CreateTagButton">{{new_tag}}</div>'
-    +     '{{/new_tag_button}}'
-    +     '{{^new_tag_button}}'
-    +         '<input class="Ldt-CurrentSegmentInfobox-CreateTagInput" placeholder="{{new_tag}}"></input>'
-    +         '<div class="Ldt-CurrentSegmentInfobox-CreateTagInput-Add">+</div>'
-    +     '{{/new_tag_button}}'
-    +         '<ul class="Ldt-CurrentSegmentInfobox-Tags-Ul">'
-    +         '{{#tags}}'
-    +             '{{#.}}'
-    +             '<li class="Ldt-CurrentSegmentInfobox-Tags-Li">'
-    +                 '<input type="text" class="Ldt-CurrentSegmentInfobox-Tags-Li-Input" value="{{.}}"></input>'
-    +                 '<div class="Ldt-CurrentSegmentInfobox-Tags-Li-DeleteTagButton">{{delete_tag}}</div>'
-    +             '</li>'
-    +             '{{/.}}'
-    +         '{{/tags}}'
-    +         '</ul>'
-    +     '</div>'
-    +     '<div class="Ldt-CurrentSegmentInfobox-SubmitButton">{{submit}}</div>'
-    +     '<div class="Ldt-CurrentSegmentInfobox-CancelButton">{{cancel}}</div>'
-    +   '</div>'
-    + '</div>'
-    
-IriSP.Widgets.CurrentSegmentInfobox.prototype.messages = {
-    fr : {
-        submit : "Soumettre",
-        cancel : "Annuler",
-        edit : "Editer",
-        new_tag : "Nouveau tag",
-        delete_tag : "Supprimer",
-        fields_header : "Commentaire associé à ce segment",
-        tags_header : "Mots-clés associés à ce segment",
-        empty : "Le player vidéo ne lit actuellement aucun segment"
-    },
-    en: {
-        submit : "Submit",
-        cancel : "Cancel",
-        edit : "Edit",
-        new_tag : "New tag",
-        delete_tag : "Delete tag",
-        fields_header : "Current segment content",
-        tags_header : "Current segment tags",
-        empty : "The player currently doesn't read any segment"
-    }
-}    
-    
-IriSP.Widgets.CurrentSegmentInfobox.prototype.draw = function() {
-    var _this = this;
-    this.segments = this.getWidgetAnnotations();
-    this.renderTemplate();
-    this.currentSegment = false;
-    this.clearBox();
-    this.refresh();
-    this.onMediaEvent("timeupdate", "refresh");
-    this.onMediaEvent("settimerange", function(_timeRange){
-        var _segmentBegin = _timeRange[0],
-            _segmentEnd = _timeRange[1],
-            _list = _this.segments.filter(function(_segment){
-                return _segment.begin.milliseconds == _segmentBegin.milliseconds && _segment.end.milliseconds == _segmentEnd.milliseconds
-            });
-        if (_list.length >0){
-            _this.$.toggleClass("editing", false);
-            if (_this.currentSegment.id != _list[0].id){
-                _this.currentSegment = _list[0];
-                _data = {
-                        editable_segments: _this.editable_segments,
-                        edit: _this.custom_edit_text ? _this.custom_edit_text : _this.l10n.edit,
-                        title: _this.currentSegment.title,
-                        description : _this.currentSegment.description,
-                        description_placeholder : _this.empty_description_placeholder,
-                        tags : _this.currentSegment.getTagTexts()
-                }
-                _this.$.html(Mustache.to_html(_this.template, _data))
-                if(_this.editable_segments&&_this.currentSegment){
-                    _this.$.find(".Ldt-CurrentSegmentInfobox").click(_this.functionWrapper("enableEditMode"));            
-                }
-            }
-        }
-    });
-    
-    if(this.editable_segments&&this.currentSegment){
-        this.$.find(".Ldt-CurrentSegmentInfobox").click(_this.functionWrapper("enableEditMode"));        
-    }
-}
-
-IriSP.Widgets.CurrentSegmentInfobox.prototype.enableEditMode = function() {
-    var _this = this;
-    if(this.currentSegment){
-        _data = {
-            title: this.currentSegment.title,
-            description : this.currentSegment.description,
-            tags : this.currentSegment.getTagTexts(),
-            submit : this.l10n.submit,
-            cancel : this.l10n.cancel,
-            headers : this.show_headers,
-            tags_header : this.custom_tags_header ? this.custom_tags_header : this.l10n.tags_header,
-            fields_header : this.custom_fields_header ? this.custom_fields_header : this.l10n.fields_header,
-            new_tag : this.l10n.new_tag,
-            delete_tag : this.l10n.delete_tag,
-            new_tag_button : this.new_tag_button,
-        }
-        this.$.toggleClass("editing", true);
-        this.$.html(Mustache.to_html(this.editTemplate, _data));
-        this.$.find(".Ldt-CurrentSegmentInfobox-CancelButton").click(this.functionWrapper("disableEditMode"));
-        if (this.new_tag_button){
-            this.$.find(".Ldt-CurrentSegmentInfobox-CreateTagButton").click(this.functionWrapper("insertTagInput"));            
-        } else {
-            this.$.find(".Ldt-CurrentSegmentInfobox-CreateTagInput").keypress(this.functionWrapper("insertTagInputKeypress"));
-            this.$.find(".Ldt-CurrentSegmentInfobox-CreateTagInput-Add").click(this.functionWrapper("insertTagInputKeypress"));
-        }
-        this.$.find(".Ldt-CurrentSegmentInfobox-Tags-Li-DeleteTagButton").click(this.functionWrapper("deleteTagInput"));
-        this.$.find(".Ldt-CurrentSegmentInfobox-SubmitButton").click(this.functionWrapper("onSubmit"))
-    }
-}
-
-IriSP.Widgets.CurrentSegmentInfobox.prototype.disableEditMode = function() {
-    if(this.currentSegment){
-        _data = {
-                editable_segments: this.editable_segments,
-                edit: this.custom_edit_text ? this.custom_edit_text : this.l10n.edit,
-                title: this.currentSegment.title,
-                description : this.currentSegment.description,
-                description_placeholder : this.empty_description_placeholder,
-                tags : this.currentSegment.getTagTexts()
-            }
-        this.$.toggleClass("editing", false);
-        this.$.html(Mustache.to_html(this.template, _data));
-        this.$.find(".Ldt-CurrentSegmentInfobox").click(this.functionWrapper("enableEditMode")); 
-    }
-}
-
-IriSP.Widgets.CurrentSegmentInfobox.prototype.insertTagInput = function() {
-    if((!this.currentSegment.getTagTexts().length)&&(!this.$.find(".Ldt-CurrentSegmentInfobox-Tags-Ul").length)){
-        this.$.find(".Ldt-CurrentSegmentInfobox-Tags").prepend('<ul class="Ldt-CurrentSegmentInfobox-Tags-Ul"></ul>')
-    }
-    this.$.find(".Ldt-CurrentSegmentInfobox-Tags-Ul").append(
-        '<li class="Ldt-CurrentSegmentInfobox-Tags-Li">'
-        +'<input type="text" class="Ldt-CurrentSegmentInfobox-Tags-Li-Input" value=""></input>'
-        +'<div class="Ldt-CurrentSegmentInfobox-Tags-Li-DeleteTagButton">'+this.l10n.delete_tag+'</div>'
-        +'</li>');
-    this.$.find(".Ldt-CurrentSegmentInfobox-Tags-Li-DeleteTagButton").click(this.functionWrapper("deleteTagInput"));
-}
-
-IriSP.Widgets.CurrentSegmentInfobox.prototype.insertTagInputKeypress = function(event) {
-    var keycode = (event.keyCode ? event.keyCode : event.which);
-    if(keycode == '13' || event.type == 'click'){
-        if((!this.currentSegment.getTagTexts().length)&&(!this.$.find(".Ldt-CurrentSegmentInfobox-Tags-Ul").length)){
-            this.$.find(".Ldt-CurrentSegmentInfobox-Tags").prepend('<ul class="Ldt-CurrentSegmentInfobox-Tags-Ul"></ul>')
-        }
-        this.$.find(".Ldt-CurrentSegmentInfobox-Tags-Ul").append(
-            '<li class="Ldt-CurrentSegmentInfobox-Tags-Li">'
-            +'<input type="text" class="Ldt-CurrentSegmentInfobox-Tags-Li-Input" value="'+ this.$.find(".Ldt-CurrentSegmentInfobox-CreateTagInput").val() +'"></input>'
-            +'<div class="Ldt-CurrentSegmentInfobox-Tags-Li-DeleteTagButton">'+this.l10n.delete_tag+'</div>'
-            +'</li>');
-        this.$.find(".Ldt-CurrentSegmentInfobox-Tags-Li-DeleteTagButton").click(this.functionWrapper("deleteTagInput"));
-        this.$.find(".Ldt-CurrentSegmentInfobox-CreateTagInput").val("");
-        return false;
-    }
-}
-
-IriSP.Widgets.CurrentSegmentInfobox.prototype.deleteTagInput = function(clickEvent) {
-    $(clickEvent.currentTarget).parent().remove();
-}
-
-IriSP.Widgets.CurrentSegmentInfobox.prototype.onSubmit = function() {
-    new_tags_titles = this.$.find(".Ldt-CurrentSegmentInfobox-Tags-Li-Input").map(function(){
-        if($(this).val()){
-            return $(this).val()
-        }
-    });
-    new_title = this.$.find(".Ldt-CurrentSegmentInfobox-TitleInput").val()
-    new_description = this.$.find(".Ldt-CurrentSegmentInfobox-DescriptionInput").val()
-    
-    var _this = this,
-        _exportedAnnotations = new IriSP.Model.List(this.player.sourceManager), /* We create an Annotations List to send to the server */
-        _export = this.player.sourceManager.newLocalSource({serializer: IriSP.serializers[this.api_serializer]}), /* We create a source object using a specific serializer for export */
-        _annotation = new IriSP.Model.Annotation(this.currentSegment.id, _export); /* We create an annotation in the source with a generated ID (param. false) */
-    
-    _annotation.setAnnotationType(this.currentSegment.getAnnotationType().id);
-    _annotation.setMedia(this.currentSegment.getMedia().id);
-    _annotation.setBegin(this.currentSegment.begin);
-    _annotation.setEnd(this.currentSegment.end);
-    _annotation.created = this.currentSegment.created;
-    _annotation.creator = this.currentSegment.creator;
-    _annotation.title = new_title /* Title field */
-    _annotation.description = new_description /* Description field */
-    var _tagIds = IriSP._(new_tags_titles).map(function(_title) {
-        var _tags = _this.source.getTags(true).searchByTitle(_title, true);
-        if (_tags.length) {
-            var _tag = _tags[0];
-        }
-        else {
-            _tag = new IriSP.Model.Tag(_title.replace(/\W/g,'_'), _this.source);
-            _tag.title = _title;
-            _this.source.getTags().push(_tag);
-        }
-        return _tag.id;
-    });
-    _annotation.setTags(_tagIds);
-    _annotation.project_id = this.project_id;
-    
-    _exportedAnnotations.push(_annotation); /* We add the annotation in the list to export */
-    _export.addList("annotation",_exportedAnnotations); /* We add the list to the source object */    
-    
-    _url = Mustache.to_html(this.api_endpoint_template, {annotation_id: this.currentSegment.id});
-    
-    IriSP.jQuery.ajax({
-        url: _url,
-        type: this.api_method,
-        contentType: 'application/json',
-        data: _export.serialize(), /* Source is serialized */
-        success: function(_data) {
-            _export.getAnnotations().removeElement(_annotation, true); /* We delete the sent annotation to avoid redundancy */
-            _export.deSerialize(_data); /* Data deserialization */
-            _this.source.merge(_export); /* We merge the deserialized data with the current source data */
-            _this.segments.forEach(function(_segment){
-                if (_segment.id == _annotation.id){
-                    _this.segments.removeElement(_segment)
-                }
-            })
-            _this.segments.push(_annotation)
-            _this.currentSegment = _annotation
-            _data = {
-                    editable_segments: _this.editable_segments,
-                    edit: _this.custom_edit_text ? _this.custom_edit_text : _this.l10n.edit,
-                    title: _this.currentSegment.title,
-                    description : _this.currentSegment.description,
-                    description_placeholder : _this.empty_description_placeholder,
-                    tags : _this.currentSegment.getTagTexts()
-                }
-            _this.$.html(Mustache.to_html(_this.template, _data))
-            if(_this.editable_segments&&_this.currentSegment){
-                _this.$.find(".Ldt-CurrentSegmentInfobox").click(_this.functionWrapper("enableEditMode"));             
-            }
-            _this.$.toggleClass("editing", false);
-        },
-        error: function(_xhr, _error, _thrown) {
-            IriSP.log("Error when sending annotation", _thrown);
-            _export.getAnnotations().removeElement(_annotation, true);
-        }
-    });
-}
-
-IriSP.Widgets.CurrentSegmentInfobox.prototype.refresh = function() {
-    if(!this.media.getTimeRange()){
-        var _currentTime = this.media.getCurrentTime();
-        var _list = this.segments.filter(function(_segment){
-            return (_segment.begin <= _currentTime && _segment.end >= _currentTime);
-        })
-        
-        if (_list.length > 0){
-            if (this.currentSegment.id != _list[0].id){
-                this.currentSegment = _list[0];
-                _data = {
-                    editable_segments: this.editable_segments,
-                    edit: this.custom_edit_text ? this.custom_edit_text : this.l10n.edit,
-                    title: this.currentSegment.title,
-                    description : this.currentSegment.description,
-                    description_placeholder : this.empty_description_placeholder,
-                    tags : this.currentSegment.getTagTexts()
-                }
-                this.$.html(Mustache.to_html(this.template, _data))
-                if(this.editable_segments&&this.currentSegment){
-                    this.$.find(".Ldt-CurrentSegmentInfobox").click(this.functionWrapper("enableEditMode"));             
-                }
-            }
-        }
-        else {
-            this.currentSegment = false;
-            this.clearBox();
-        }
-    }
-}
-
-IriSP.Widgets.CurrentSegmentInfobox.prototype.clearBox = function(){
-    var _empty_message = this.l10n.empty
-    if (this.empty_message) {
-        _empty_message = this.empty_message
-    }
-    this.$.find(".Ldt-CurrentSegmentInfobox").html("<div class='Ldt-CurrentSegmentInfobox-Element Ldt-CurrentSegmentInfobox-NoSegment'>"+_empty_message+"</div>");
-}
\ No newline at end of file
+export { CurrentSegmentInfobox, currentSegmentInfoboxStyles };
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/widgets/CurrentSegmentInfobox.module.css	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,189 @@
+.Ldt-CurrentSegmentInfobox{
+	background: url(img/pinstripe.png);
+	width: 535px;
+	max-height: 280px;
+	margin: 0px;
+	margin-top: 4px;
+	border-style: solid;
+	border-width: 1px;
+	border-color: #b7b7b7;
+}
+
+.Ldt-CurrentSegmentInfobox-Element{
+	margin: 5px;
+	vertical-align: top;
+}
+
+.Ldt-CurrentSegmentInfobox-Tags-Ul{
+	list-style: none;
+	margin: 0px;
+}
+
+.Ldt-CurrentSegmentInfobox-Tags{
+	margin: 0px;
+}
+
+.Ldt-CurrentSegmentInfobox-Tags-Li{
+	display: inline-block;
+	background-color: #ffffff;
+	margin: 2px;
+	padding: 2px;
+	border: solid 1px;
+	border-color: #aeaeae;
+}
+
+.Ldt-CurrentSegmentInfobox-Title{
+	color: #0068c4;
+    font-size: 15px;
+    font-weight: bold;
+}
+
+.Ldt-CurrentSegmentInfobox-Description{
+	font-size: 13px;
+	font-weight: bold;
+}
+
+textarea.Ldt-CurrentSegmentInfobox-DescriptionInput.Ldt-CurrentSegmentInfobox-Description{
+	display: inline-block;
+	width: 95%;
+}
+
+.Ldt-CurrentSegmentInfobox-NoSegment{
+	font-size: 15px;
+	font-weight: bold;
+}
+
+.Ldt-CurrentSegmentInfobox-SubmitButton{
+	display: inline-block;
+    background-color: #d93c71;
+    color: #ffffff;
+    cursor: pointer;
+    height: 14px;
+    width: 100px;
+    margin: 2px;
+    margin-top: 5px;
+    padding: 2px;
+    font-size: 11px;
+    border: 1px solid;
+    border-color: #eca3bc #631e34 #36101c #e16e93;
+    cursor: pointer;
+    text-align: center;
+    vertical-align: middle;
+}
+
+.Ldt-CurrentSegmentInfobox-CancelButton{
+	display: inline-block;
+    background-color: #d93c71;
+    color: #ffffff;
+    cursor: pointer;
+    height: 14px;
+    width: 100px;
+    margin: 2px;
+    margin-top: 5px;
+    margin-right: 5px;
+    padding: 2px;
+    font-size: 11px;
+    border: 1px solid;
+    border-color: #eca3bc #631e34 #36101c #e16e93;
+    cursor: pointer;
+    text-align: center;
+    vertical-align: middle;
+}
+
+.Ldt-CurrentSegmentInfobox-CreateTagButton{
+	display: block;
+    background-color: #d93c71;
+    color: #ffffff;
+    cursor: pointer;
+    height: 14px;
+    width: 75px;
+    margin: 2px;
+    padding: 2px;
+    font-size: 11px;
+    border: 1px solid;
+    border-color: #eca3bc #631e34 #36101c #e16e93;
+    cursor: pointer;
+    text-align: center;
+/*    vertical-align: middle; */
+}
+
+.Ldt-CurrentSegmentInfobox-Tags-Li-Input{
+	width: 80px;
+}
+
+.Ldt-CurrentSegmentInfobox-EditButton{
+	float: right;
+	display: inline-block;
+    background-color: #d93c71;
+    color: #ffffff;
+    cursor: pointer;
+    height: 18px;
+    width: 95px;
+    font-size: 14px;
+    border: 1px solid;
+    border-color: #eca3bc #631e34 #36101c #e16e93;
+    cursor: pointer;
+    margin-right: 5px;
+    margin-left: 5px;
+    margin-bottom: 5px;
+    margin-top: 5px;
+    padding: 4px;
+    text-align: center;
+	vertical-align: middle;
+	line-height: 18px;
+}
+
+.Ldt-CurrentSegmentInfobox-EditButton:hover, .Ldt-CurrentSegmentInfobox-CreateTagInput-Add:hover{
+	background-color: #e15581;
+	border-color: #222222 #e87d9f #f0adc3 #68273c;
+}
+
+.Ldt-CurrentSegmentInfobox-CreateTagButton:hover, .Ldt-CurrentSegmentInfobox-CancelButton:hover,
+.Ldt-CurrentSegmentInfobox-SubmitButton:hover{
+	background-color: #e15581;
+	border-color: #222222 #e87d9f #f0adc3 #68273c;
+}
+
+.Ldt-CurrentSegmentInfobox-Tags-Li-DeleteTagButton{
+	font-weight: bold;
+	color: #d93c71
+}
+
+.Ldt-CurrentSegmentInfobox-Tags-Li-DeleteTagButton:hover{
+	color: #e16e93
+}
+
+.Ldt-CurrentSegmentInfobox-FieldsHeader{
+	margin: 5px;
+}
+
+.Ldt-CurrentSegmentInfobox-TagsHeader{
+	margin-top: 10px;
+	margin-left: 5px;
+}
+
+.Ldt-CurrentSegmentInfobox-CreateTagInput{
+    border: 2px solid #848484;
+    margin: 5px 2px;
+    padding: 4px;
+}
+
+.Ldt-CurrentSegmentInfobox-CreateTagInput-Add{
+    margin: 5px;
+    padding: 4px;
+	display: inline-block;
+    background-color: #d93c71;
+    color: #ffffff;
+    cursor: pointer;
+    height: 14px;
+    width: 14px;
+    font-size: 14px;
+    font-style: bold;
+    border: 1px solid;
+    border-color: #eca3bc #631e34 #36101c #e16e93;
+    cursor: pointer;
+    padding: 4px;
+    text-align: center;
+	vertical-align: middle;
+	line-height: 14px;
+}
\ No newline at end of file
--- a/src/widgets/DailymotionPlayer.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/widgets/DailymotionPlayer.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,150 +1,182 @@
-IriSP.Widgets.DailymotionPlayer = function(player, config) {
-    IriSP.Widgets.Widget.call(this, player, config);
-};
-
-IriSP.Widgets.DailymotionPlayer.prototype = new IriSP.Widgets.Widget();
+// DailymotionPlayer
+import Mustache from "mustache";
 
-IriSP.Widgets.DailymotionPlayer.prototype.defaults = {
-    aspect_ratio: 14/9
-};
-
-IriSP.Widgets.DailymotionPlayer.prototype.draw = function() {
-
-    if (typeof this.video === "undefined") {
-        this.video = this.media.video;
+const DailymotionPlayer = function (ns) {
+  return class extends ns.Widgets.Widget {
+    constructor(player, config) {
+      super(player, config);
     }
 
-    this.height = this.height || Math.floor(this.width / this.aspect_ratio);
+    static defaults = {
+      aspect_ratio: 14 / 9,
+    };
 
-    var _media = this.media,
+    draw = function () {
+      if (typeof this.video === "undefined") {
+        this.video = this.media.video;
+      }
+
+      this.height = this.height || Math.floor(this.width / this.aspect_ratio);
+
+      var _media = this.media,
         videoid = null,
         _this = this,
         state = {
-            pause: true,
-            apiready: false,
-            volume: 0,
-            time: 0,
-            duration: 0
+          pause: true,
+          apiready: false,
+          volume: 0,
+          time: 0,
+          duration: 0,
         };
 
-    var m = this.video.match(/www.dailymotion.com\/video\/(.+)/);
-    if (m) {
+      var m = this.video.match(/www.dailymotion.com\/video\/(.+)/);
+      if (m) {
         videoid = m[1];
-    }
+      }
+
+      var player_url = Mustache.render(
+        "{{ protocol }}//www.dailymotion.com/embed/video/{{ videoid }}",
+        {
+          protocol:
+            document.location.protocol.search("http") == 0
+              ? document.location.protocol
+              : "http:",
+          videoid: videoid,
+        }
+      );
+      var params = {
+        api: "postMessage",
+        chromeless: 1,
+        id: "dm_player",
+        related: 0,
+        autoplay: 1,
+      };
 
-    var player_url = Mustache.to_html('{{ protocol }}//www.dailymotion.com/embed/video/{{ videoid }}', {
-        protocol: document.location.protocol.search('http') == 0 ? document.location.protocol : 'http:',
-        videoid: videoid
-    });
-    var params = {
-        'api': 'postMessage',
-        'chromeless': 1,
-        'id': 'dm_player',
-        'related': 0,
-        'autoplay': 1
-    };
+      _this.$.html(
+        Mustache.render(
+          '<iframe id="{{ id }}" src="{{ player_url }}?{{ params }}" width="{{ width }}" height="{{ height }}" frameborder="0"></iframe>',
+          {
+            player_url: player_url,
+            params: Object.keys(params)
+              .reduce(function (a, k) {
+                a.push(k + "=" + encodeURIComponent(params[k]));
+                return a;
+              }, [])
+              .join("&"),
+            width: this.width,
+            height: this.height,
+            id: params.id,
+          }
+        )
+      );
 
-    _this.$.html(Mustache.to_html('<iframe id="{{ id }}" src="{{ player_url }}?{{ params }}" width="{{ width }}" height="{{ height }}" frameborder="0"></iframe>', {
-        player_url: player_url,
-        params: Object.keys(params).reduce(function(a,k){a.push(k+'='+encodeURIComponent(params[k]));return a;},[]).join('&'),
-        width: this.width,
-        height: this.height,
-        id: params.id
-    }));
-
-    function setup_media_methods () {
+      function setup_media_methods() {
         var dest = _this.$.find("#" + params.id)[0].contentWindow;
-        var execute = function(c, v) {
-            if (v !== undefined)
-                c = c + "=" + v;
-            dest.postMessage(c, "*");
+        var execute = function (c, v) {
+          if (v !== undefined) c = c + "=" + v;
+          dest.postMessage(c, "*");
         };
 
-        _media.getCurrentTime = function() {
-            return state.time;
+        _media.getCurrentTime = function () {
+          return state.time;
         };
-        _media.getVolume = function() {
-            return state.volume;
+        _media.getVolume = function () {
+          return state.volume;
         };
-        _media.getPaused = function() {
-            return state.pause;
+        _media.getPaused = function () {
+          return state.pause;
         };
-        _media.getMuted = function() {
-            return state.muted;
+        _media.getMuted = function () {
+          return state.muted;
+        };
+        _media.setCurrentTime = function (_milliseconds) {
+          execute("seek", _milliseconds / 1000);
         };
-        _media.setCurrentTime = function(_milliseconds) {
-            execute("seek", _milliseconds / 1000);
+        _media.setVolume = function (_vol) {
+          execute("volume", _vol * 100);
         };
-        _media.setVolume = function(_vol) {
-            execute("volume", _vol * 100);
+        _media.mute = function () {
+          execute("muted", 1);
         };
-        _media.mute = function() {
-            execute("muted", 1);
+        _media.unmute = function () {
+          execute("muted", 0);
         };
-        _media.unmute = function() {
-            execute("muted", 0);
+        _media.play = function () {
+          execute("play");
+        };
+        _media.pause = function () {
+          execute("pause");
         };
-        _media.play = function() {
-            execute("play");
-        };
-        _media.pause = function() {
-            execute("pause");
-        };
-    };
+      }
 
-    window.addEventListener("message", function (event) {
-        // Parse event.data (query-string for to object)
+      window.addEventListener(
+        "message",
+        function (event) {
+          // Parse event.data (query-string for to object)
+
+          // Duck-checking if event.data is a string
+          if (event.data.split === undefined) return;
 
-        // Duck-checking if event.data is a string
-        if (event.data.split === undefined)
-            return;
-
-        var info = event.data.split("&").map( function(s) { return s.split("="); }).reduce( function(o, v) { o[v[0]] = decodeURIComponent(v[1]); return o; }, {});
+          var info = event.data
+            .split("&")
+            .map(function (s) {
+              return s.split("=");
+            })
+            .reduce(function (o, v) {
+              o[v[0]] = decodeURIComponent(v[1]);
+              return o;
+            }, {});
 
-        switch (info.event) {
-        case "apiready":
-            state.apiready = true;
-            setup_media_methods();
-            break;
-        //case "canplay":
-        //    break;
-        case "durationchange":
-            if (info.duration.slice(-2) == "sc") {
+          switch (info.event) {
+            case "apiready":
+              state.apiready = true;
+              setup_media_methods();
+              break;
+            //case "canplay":
+            //    break;
+            case "durationchange":
+              if (info.duration.slice(-2) == "sc") {
                 state.duration = 1000 * Number(info.duration.slice(0, -2));
                 _media.setDuration(state.duration);
-            }
-            break;
-        case "ended":
-            state.pause = true;
-            break;
-        case "loadedmetadata":
-            _media.trigger("loadedmetadata");
-            break;
-        case "pause":
-            state.pause = true;
-            _media.trigger("pause");
-            break;
-        case "play":
-            state.pause = false;
-            _media.trigger("play");
-            break;
+              }
+              break;
+            case "ended":
+              state.pause = true;
+              break;
+            case "loadedmetadata":
+              _media.trigger("loadedmetadata");
+              break;
+            case "pause":
+              state.pause = true;
+              _media.trigger("pause");
+              break;
+            case "play":
+              state.pause = false;
+              _media.trigger("play");
+              break;
             //case "playing":
             //    break;
             //case "progress":
             //  Loading progress
             //    break;
-        case "seeked":
-            state.time = new IriSP.Model.Time(1000 * Number(info.time));
-            _media.trigger("seeked");            
-            break;
-        case "timeupdate":
-            state.time = new IriSP.Model.Time(1000 * Number(info.time));
-            _media.trigger("timeupdate", state.time);
-            break;
-        case "volumechange":
-            state.muted = (info.muted == "true");
-            state.volume = Number(info.volume) / 100;
-            break;
-        }
-    }, false);
+            case "seeked":
+              state.time = new ns.Model.Time(1000 * Number(info.time));
+              _media.trigger("seeked");
+              break;
+            case "timeupdate":
+              state.time = new ns.Model.Time(1000 * Number(info.time));
+              _media.trigger("timeupdate", state.time);
+              break;
+            case "volumechange":
+              state.muted = info.muted == "true";
+              state.volume = Number(info.volume) / 100;
+              break;
+          }
+        },
+        false
+      );
+    };
+  };
 };
+
+export { DailymotionPlayer };
--- a/src/widgets/EnrichedPlan.css	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,207 +0,0 @@
-.Ldt-EnrichedPlan-Slide {
-    border-bottom: 2px dotted #ccc;
-    padding-top: 4px;
-    cursor: pointer;
-}
-
-.Ldt-EnrichedPlan-SlideItem {
-    max-height: 3000px;
-    transition: max-height .6s;
-}
-
-.Ldt-EnrichedPlan-SlideItem.filtered_out {
-    max-height: 0px;
-    overflow: hidden;
-}
-
-.Ldt-EnrichedPlan-SlideTimecode {
-    display: inline-block;
-    width: 24px;
-    color: #999 !important;
-    font-size: 9px !important;
-    width: 24px;
-    vertical-align: top;
-}
-
-.Ldt-EnrichedPlan-SlideThumbnail {
-    display: inline-block;
-    width: 180px;
-    height: 100px;
-    padding-left: 10px;
-    margin: 0;
-    vertical-align: top;
-}
-
-.Ldt-EnrichedPlan-SlideThumbnail img {
-    max-width: 180px;
-    max-height: 100px;
-    margin: auto;
-    border: 1px solid #ccc;
-}
-
-.Ldt-EnrichedPlan-SlideContent {
-    display: inline-block;
-    width: calc(100% - 220px);
-    transition: width .4s;
-}
-
-.Ldt-EnrichedPlan-SlideThumbnail.filtered_out + .Ldt-EnrichedPlan-SlideContent {
-    width: calc(100% - 40px);
-}
-
-.Ldt-EnrichedPlan-SlideTitle {
-    display: inline-block;
-    font-size: 14px;
-    width: 100%;
-    height: 1em;
-    overflow: hidden;
-    white-space: nowrap;
-    text-overflow: ellipsis;
-}
-
-.Ldt-EnrichedPlan-SlideTitle1 {
-    text-transform: uppercase;
-    font-size: 13px;
-    font-weight: 600;
-}
-
-.Ldt-EnrichedPlan-Note {
-    font-weight: normal;
-    font-size: 14px;
-    font-family: Roboto-italic;
-}
-.Ldt-EnrichedPlan-Note:hover {
-    background-color: #eee;
-}
-
-.Ldt-EnrichedPlan-Note-Teacher {
-    color: #e5007e;
-    font-style: italic;
-}
-.Ldt-EnrichedPlan-Note-Own {
-    color: #66ccff;
-}
-.Ldt-EnrichedPlan-Note-Other {
-    color: #996633;
-}
-
-.Ldt-EnrichedPlan-Note-Text {
-    line-height: 22px;
-    word-wrap: break-word;
-}
-
-.Ldt-EnrichedPlan-Note-Author {
-    text-transform: uppercase;
-    font-size: 10px;
-}
-
-.Ldt-EnrichedPlan-Content {
-    margin-top: 37px;
-}
-
-.Ldt-EnrichedPlan-Controls {
-    height: 36px;
-    padding: 9px 0px 6px 0px;
-    border-bottom: 1px solid #000;
-    overflow-y: hidden;
-    overflow-x: hidden;
-    position: absolute;
-    top: 0px;
-    left: 0px;
-    right: 0px;
-    z-index: 1;
-    background-color: #fff;
-}
-
-.Ldt-EnrichedPlan-Control-Label {
-    display: inline-block;
-    text-transform: uppercase;
-    line-height: 10px;
-    font-family: Roboto;
-    font-size: 10px;
-    font-weight: 100;
-    width: 80px;
-    position: relative;
-}
-.Ldt-EnrichedPlan-Controls .Ldt-EnrichedPlan-Search-Input {
-    float: right;
-    font-family: Roboto;
-    font-size: 16px;
-    width: calc(100% - 340px);
-}
-
-.Ldt-EnrichedPlan-Note.non_matching {
-    display: none;
-}
-
-.Ldt-EnrichedPlan-Control- {
-    font-style: normal;
-}
-    /**********************************************************/
-/* Base for label styling */
-.Ldt-EnrichedPlan-Control-Checkbox:not(:checked),
-.Ldt-EnrichedPlan-Control-Checkbox:checked {
-  position: absolute;
-  left: -9999px;
-}
-.Ldt-EnrichedPlan-Control-Checkbox:not(:checked) + label,
-.Ldt-EnrichedPlan-Control-Checkbox:checked + label {
-  position: relative;
-  padding-left: 20px;
-  cursor: pointer;
-}
-
-/* checkbox aspect */
-.Ldt-EnrichedPlan-Control-Checkbox:not(:checked) + label:before,
-.Ldt-EnrichedPlan-Control-Checkbox:checked + label:before {
-  content: '';
-  position: absolute;
-  left:0; top: 2px;
-  width: 13px; height: 13px;
-  border: 1px solid #aaa;
-}
-/* checked mark aspect */
-.Ldt-EnrichedPlan-Control-Checkbox:not(:checked) + label:after,
-.Ldt-EnrichedPlan-Control-Checkbox:checked + label:after {
-    content: '\2a2f';
-    font-style: normal;
-    position: absolute;
-    top: 3px; left: -1px;
-    font-size: 20px;
-    transition: all .2s;
-}
-/* checked mark aspect changes */
-.Ldt-EnrichedPlan-Control-Checkbox:not(:checked) + label:after {
-  opacity: 0;
-}
-.Ldt-EnrichedPlan-Control-Checkbox:checked + label:after {
-  opacity: 1;
-}
-/* disabled checkbox */
-.Ldt-EnrichedPlan-Control-Checkbox:disabled:not(:checked) + label:before,
-.Ldt-EnrichedPlan-Control-Checkbox:disabled:checked + label:before {
-  box-shadow: none;
-  border-color: #bbb;
-  background-color: #ddd;
-}
-.Ldt-EnrichedPlan-Control-Checkbox:disabled:checked + label:after {
-  color: #999;
-}
-.Ldt-EnrichedPlan-Control-Checkbox:disabled + label {
-  color: #aaa;
-}
-/* accessibility */
-.Ldt-EnrichedPlan-Control-Checkbox:checked:focus + label:before,
-.Ldt-EnrichedPlan-Control-Checkbox:not(:checked):focus + label:before {
-  border: 1px dotted blue;
-}
-
-/* hover style just for information */
-label:hover:before {
-  border: 1px solid #4778d9!important;
-}
-
-/* hover style just for information */
-label:hover:before {
-    background-color: #ededed;
-}
--- a/src/widgets/EnrichedPlan.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/widgets/EnrichedPlan.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,145 +1,171 @@
 /* TODO
 - add callbacks
  */
+// EnrichedPlan
+import Mustache from "mustache";
 
-IriSP.Widgets.EnrichedPlan = function(player, config) {
-    IriSP.Widgets.Widget.call(this, player, config);
-}
-
-IriSP.Widgets.EnrichedPlan.prototype = new IriSP.Widgets.Widget();
+import enrichedPlanStyles from "./EnrichedPlan.module.css";
 
-IriSP.Widgets.EnrichedPlan.prototype.defaults = {
-    // Main type for slide segmentation
-    annotation_type: "Slides",
-    // If no annotation type list is specified, use all other types
-    annotation_types: [],
-    show_controls: true,
-    show_slides: true,
-    show_teacher_notes: true,
-    show_other_notes: true,
-    show_own_notes: true
-}
-
-IriSP.Widgets.EnrichedPlan.prototype.template =
-      '<div class="Ldt-EnrichedPlan-Container">'
-    + '{{#show_controls}}<form class="Ldt-EnrichedPlan-Controls">'
-    + ' <input id="{{prefix}}teacher_note_checkbox" class="Ldt-EnrichedPlan-Control-Checkbox Ldt-EnrichedPlan-Note-Teacher" {{#show_teacher_notes}}checked{{/show_teacher_notes}} type="checkbox">'
-    + ' <label for="{{prefix}}teacher_note_checkbox" class="Ldt-EnrichedPlan-Control-Label Ldt-EnrichedPlan-Note-Teacher">Notes Enseignant</label>'
-    + ' <input id="{{prefix}}other_note_checkbox" class="Ldt-EnrichedPlan-Control-Checkbox Ldt-EnrichedPlan-Note-Other" {{#show_other_notes}}checked{{/show_other_notes}} type="checkbox">'
-    + ' <label for="{{prefix}}other_note_checkbox" class="Ldt-EnrichedPlan-Control-Label Ldt-EnrichedPlan-Note-Other">Notes Autres</label>'
-    + ' <input id="{{prefix}}simplified_plan_checkbox" class="Ldt-EnrichedPlan-Control-Checkbox Ldt-EnrichedPlan-Note-Own" {{#show_own_notes}}checked{{/show_own_notes}} type="checkbox">'
-    + ' <label for="{{prefix}}simplified_plan_checkbox" class="Ldt-EnrichedPlan-Control-Label Ldt-EnrichedPlan-Note-Own">Notes perso.</label>'
-    + ' <input id="{{prefix}}slide_display_checkbox" class="Ldt-EnrichedPlan-Control-Checkbox Ldt-EnrichedPlan-Slide-Display" {{#show_slides}}checked{{/show_slides}} type="checkbox">'
-    + ' <label for="{{prefix}}slide_display_checkbox" class="Ldt-EnrichedPlan-Control-Label Ldt-EnrichedPlan-Slide-Display">Diapo<br/>&nbsp;</label>'
-    + ' <input class="Ldt-EnrichedPlan-Search-Input" type="search" incremental placeholder="Recherchez"/>'
-    + '</form>{{/show_controls}}'
-    + '<div class="Ldt-EnrichedPlan-Content"></div>'
-    + '</div>';
+const EnrichedPlan = function (ns) {
+  return class extends ns.Widgets.Widget {
+    constructor(player, config) {
+      super(player, config);
+    }
 
-IriSP.Widgets.EnrichedPlan.prototype.slideTemplate =
-      '<div data-id="{{ id }}" class="Ldt-EnrichedPlan-Slide">'
-    + '  <div class="Ldt-EnrichedPlan-SlideItem Ldt-EnrichedPlan-SlideTimecode">{{ begin }}</div>'
-    + '  <div data-timecode="{{begintc}}" class="Ldt-EnrichedPlan-SlideItem {{^show_slides}}filtered_out{{/show_slides}} Ldt-EnrichedPlan-SlideThumbnail Ldt-EnrichedPlan-Slide-Display"><img title="{{ begin }} - {{ atitle }}" src="{{ thumbnail }}"></div>'
-    + '  <div class="Ldt-EnrichedPlan-SlideContent">'
-    + '     <div data-timecode="{{begintc}}" class="Ldt-EnrichedPlan-SlideTitle Ldt-EnrichedPlan-SlideTitle{{ level }}">{{ atitle }}</div>'
-    + '     <div class="Ldt-EnrichedPlan-SlideNotes">{{{ notes }}}</div>'
-    + '  </div>'
-    + '</div>';
-
-IriSP.Widgets.EnrichedPlan.prototype.annotationTemplate = '<div title="{{ begin }} - {{ atitle }}" data-id="{{ id }}" data-timecode="{{begintc}}" class="Ldt-EnrichedPlan-SlideItem Ldt-EnrichedPlan-Note {{category}} {{filtered}}"><span class="Ldt-EnrichedPlan-Note-Text">{{{ text }}}</span> <span class="Ldt-EnrichedPlan-Note-Author">{{ author }}</span></div>';
-
-IriSP.Widgets.EnrichedPlan.prototype.draw = function() {
-    var _this = this;
-    // Generate a unique prefix, so that ids of input fields
-    // (necessary for label association) are unique too.
-    _this.prefix = "TODO";
-    // slides content: title, level (for toc)
-    var _slides = this.getWidgetAnnotations().sortBy(function(_annotation) {
-        return _annotation.begin;
-    });
-    // All other annotations
-    var _annotations = this.media.getAnnotations().filter( function (a) {
-        return a.getAnnotationType().title != _this.annotation_type;
-    }).sortBy(function(_annotation) {
-        return _annotation.begin;
-    });
-
-    // Reference annotations in each slide: assume that end time is
-    // correctly set.
-    _slides.forEach( function (slide) {
-        slide.annotations = _annotations.filter( function (a) {
-            return a.begin >= slide.begin && a.begin <= slide.end;
-        });
-    });
-
-    _this.renderTemplate();
-    var container = _this.$.find('.Ldt-EnrichedPlan-Container');
-    var content = _this.$.find('.Ldt-EnrichedPlan-Content');
-
-    // Returns the note category: Own, Other, Teacher
-    function note_category(a) {
-        return a.title.indexOf('Anonyme') < 0 ? "Own" : "Other";
+    static defaults = {
+      // Main type for slide segmentation
+      annotation_type: "Slides",
+      // If no annotation type list is specified, use all other types
+      annotation_types: [],
+      show_controls: true,
+      show_slides: true,
+      show_teacher_notes: true,
+      show_other_notes: true,
+      show_own_notes: true,
     };
 
-    _slides.forEach(function(slide) {
-        var _html = Mustache.to_html(_this.slideTemplate, {
-            id : slide.id,
-            atitle : IriSP.textFieldHtml(slide.title),
-            level: slide.content.level || 1,
-            begin : slide.begin.toString(),
-            begintc: slide.begin.milliseconds,
-            thumbnail: slide.thumbnail,
-            show_slides: _this.show_slides,
-            notes: slide.annotations.map( function (a) {
-                return Mustache.to_html(_this.annotationTemplate, {
-                    id: a.id,
-                    text: IriSP.textFieldHtml(a.description || a.title),
-                    author: a.creator,
-                    begin: a.begin.toString(),
-                    begintc: a.begin.milliseconds,
-                    atitle: a.title.slice(0, 20),
-                    // FIXME: Temporary hack waiting for a proper metadata definition
-                    category: "Ldt-EnrichedPlan-Note-" + note_category(a),
-                    filtered: ( (note_category(a) == 'Own' && ! _this.show_own_notes)
-                                || (note_category(a) == 'Other' && ! _this.show_other_notes)
-                                || (note_category(a) == 'Teacher' && ! _this.show_teacher_notes) ) ? 'filtered_out' : ''
-                });
-            }).join("\n")
+    static template =
+      '<div class="Ldt-EnrichedPlan-Container">' +
+      '{{#show_controls}}<form class="Ldt-EnrichedPlan-Controls">' +
+      ' <input id="{{prefix}}teacher_note_checkbox" class="Ldt-EnrichedPlan-Control-Checkbox Ldt-EnrichedPlan-Note-Teacher" {{#show_teacher_notes}}checked{{/show_teacher_notes}} type="checkbox">' +
+      ' <label for="{{prefix}}teacher_note_checkbox" class="Ldt-EnrichedPlan-Control-Label Ldt-EnrichedPlan-Note-Teacher">Notes Enseignant</label>' +
+      ' <input id="{{prefix}}other_note_checkbox" class="Ldt-EnrichedPlan-Control-Checkbox Ldt-EnrichedPlan-Note-Other" {{#show_other_notes}}checked{{/show_other_notes}} type="checkbox">' +
+      ' <label for="{{prefix}}other_note_checkbox" class="Ldt-EnrichedPlan-Control-Label Ldt-EnrichedPlan-Note-Other">Notes Autres</label>' +
+      ' <input id="{{prefix}}simplified_plan_checkbox" class="Ldt-EnrichedPlan-Control-Checkbox Ldt-EnrichedPlan-Note-Own" {{#show_own_notes}}checked{{/show_own_notes}} type="checkbox">' +
+      ' <label for="{{prefix}}simplified_plan_checkbox" class="Ldt-EnrichedPlan-Control-Label Ldt-EnrichedPlan-Note-Own">Notes perso.</label>' +
+      ' <input id="{{prefix}}slide_display_checkbox" class="Ldt-EnrichedPlan-Control-Checkbox Ldt-EnrichedPlan-Slide-Display" {{#show_slides}}checked{{/show_slides}} type="checkbox">' +
+      ' <label for="{{prefix}}slide_display_checkbox" class="Ldt-EnrichedPlan-Control-Label Ldt-EnrichedPlan-Slide-Display">Diapo<br/>&nbsp;</label>' +
+      ' <input class="Ldt-EnrichedPlan-Search-Input" type="search" incremental placeholder="Recherchez"/>' +
+      "</form>{{/show_controls}}" +
+      '<div class="Ldt-EnrichedPlan-Content"></div>' +
+      "</div>";
+
+    static slideTemplate =
+      '<div data-id="{{ id }}" class="Ldt-EnrichedPlan-Slide">' +
+      '  <div class="Ldt-EnrichedPlan-SlideItem Ldt-EnrichedPlan-SlideTimecode">{{ begin }}</div>' +
+      '  <div data-timecode="{{begintc}}" class="Ldt-EnrichedPlan-SlideItem {{^show_slides}}filtered_out{{/show_slides}} Ldt-EnrichedPlan-SlideThumbnail Ldt-EnrichedPlan-Slide-Display"><img title="{{ begin }} - {{ atitle }}" src="{{ thumbnail }}"></div>' +
+      '  <div class="Ldt-EnrichedPlan-SlideContent">' +
+      '     <div data-timecode="{{begintc}}" class="Ldt-EnrichedPlan-SlideTitle Ldt-EnrichedPlan-SlideTitle{{ level }}">{{ atitle }}</div>' +
+      '     <div class="Ldt-EnrichedPlan-SlideNotes">{{{ notes }}}</div>' +
+      "  </div>" +
+      "</div>";
+
+    annotationTemplate =
+      '<div title="{{ begin }} - {{ atitle }}" data-id="{{ id }}" data-timecode="{{begintc}}" class="Ldt-EnrichedPlan-SlideItem Ldt-EnrichedPlan-Note {{category}} {{filtered}}"><span class="Ldt-EnrichedPlan-Note-Text">{{{ text }}}</span> <span class="Ldt-EnrichedPlan-Note-Author">{{ author }}</span></div>';
+
+    draw() {
+      var _this = this;
+      // Generate a unique prefix, so that ids of input fields
+      // (necessary for label association) are unique too.
+      _this.prefix = "TODO";
+      // slides content: title, level (for toc)
+      var _slides = this.getWidgetAnnotations().sortBy(function (_annotation) {
+        return _annotation.begin;
+      });
+      // All other annotations
+      var _annotations = this.media
+        .getAnnotations()
+        .filter(function (a) {
+          return a.getAnnotationType().title != _this.annotation_type;
+        })
+        .sortBy(function (_annotation) {
+          return _annotation.begin;
+        });
+
+      // Reference annotations in each slide: assume that end time is
+      // correctly set.
+      _slides.forEach(function (slide) {
+        slide.annotations = _annotations.filter(function (a) {
+          return a.begin >= slide.begin && a.begin <= slide.end;
         });
-        var _el = IriSP.jQuery(_html);
-        content.append(_el);
-    });
+      });
+
+      _this.renderTemplate();
+      var container = _this.$.find(".Ldt-EnrichedPlan-Container");
+      var content = _this.$.find(".Ldt-EnrichedPlan-Content");
+
+      // Returns the note category: Own, Other, Teacher
+      function note_category(a) {
+        return a.title.indexOf("Anonyme") < 0 ? "Own" : "Other";
+      }
 
-    container.on("click", "[data-timecode]", function () {
+      _slides.forEach(function (slide) {
+        var _html = Mustache.render(_this.slideTemplate, {
+          id: slide.id,
+          atitle: ns.textFieldHtml(slide.title),
+          level: slide.content.level || 1,
+          begin: slide.begin.toString(),
+          begintc: slide.begin.milliseconds,
+          thumbnail: slide.thumbnail,
+          show_slides: _this.show_slides,
+          notes: slide.annotations
+            .map(function (a) {
+              return Mustache.render(_this.annotationTemplate, {
+                id: a.id,
+                text: ns.textFieldHtml(a.description || a.title),
+                author: a.creator,
+                begin: a.begin.toString(),
+                begintc: a.begin.milliseconds,
+                atitle: a.title.slice(0, 20),
+                // FIXME: Temporary hack waiting for a proper metadata definition
+                category: "Ldt-EnrichedPlan-Note-" + note_category(a),
+                filtered:
+                  (note_category(a) == "Own" && !_this.show_own_notes) ||
+                  (note_category(a) == "Other" && !_this.show_other_notes) ||
+                  (note_category(a) == "Teacher" && !_this.show_teacher_notes)
+                    ? "filtered_out"
+                    : "",
+              });
+            })
+            .join("\n"),
+        });
+        var _el = ns.jQuery(_html);
+        content.append(_el);
+      });
+
+      container.on("click", "[data-timecode]", function () {
         _this.media.setCurrentTime(Number(this.dataset.timecode));
-    });
+      });
 
-    container.on("click", ".Ldt-EnrichedPlan-Control-Checkbox", function () {
-        var classname = _.first(_.filter(this.classList, function (s) { return s != "Ldt-EnrichedPlan-Control-Checkbox"; }));
+      container.on("click", ".Ldt-EnrichedPlan-Control-Checkbox", function () {
+        var classname = _.first(
+          _.filter(this.classList, function (s) {
+            return s != "Ldt-EnrichedPlan-Control-Checkbox";
+          })
+        );
         if (classname !== undefined) {
-            if ($(this).is(':checked')) {
-                content.find(".Ldt-EnrichedPlan-Slide ." + classname).removeClass("filtered_out");
-            } else {
-                content.find(".Ldt-EnrichedPlan-Slide ." + classname).addClass("filtered_out");
-             }
+          if ($(this).is(":checked")) {
+            content
+              .find(".Ldt-EnrichedPlan-Slide ." + classname)
+              .removeClass("filtered_out");
+          } else {
+            content
+              .find(".Ldt-EnrichedPlan-Slide ." + classname)
+              .addClass("filtered_out");
+          }
         }
-
-    });
+      });
 
-    container.find(".Ldt-EnrichedPlan-Search-Input").on("search", function () {
-        var q = $(this).val().toLocaleLowerCase();
-        if (q === "") {
+      container
+        .find(".Ldt-EnrichedPlan-Search-Input")
+        .on("search", function () {
+          var q = $(this).val().toLocaleLowerCase();
+          if (q === "") {
             // Show all
             content.find(".Ldt-EnrichedPlan-Note").removeClass("non_matching");
-        } else {
-            $(".Ldt-EnrichedPlan-Note").each( function () {
-                var node = $(this);
-                if (node.text().toLocaleLowerCase().indexOf(q) > -1) {
-                    node.removeClass("non_matching");
-                } else {
-                    node.addClass("non_matching");
-                }
+          } else {
+            $(".Ldt-EnrichedPlan-Note").each(function () {
+              var node = $(this);
+              if (node.text().toLocaleLowerCase().indexOf(q) > -1) {
+                node.removeClass("non_matching");
+              } else {
+                node.addClass("non_matching");
+              }
             });
-        }
-    });
+          }
+        });
+    }
+  };
 };
+
+export { EnrichedPlan, enrichedPlanStyles };
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/widgets/EnrichedPlan.module.css	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,207 @@
+.Ldt-EnrichedPlan-Slide {
+    border-bottom: 2px dotted #ccc;
+    padding-top: 4px;
+    cursor: pointer;
+}
+
+.Ldt-EnrichedPlan-SlideItem {
+    max-height: 3000px;
+    transition: max-height .6s;
+}
+
+.Ldt-EnrichedPlan-SlideItem.filtered_out {
+    max-height: 0px;
+    overflow: hidden;
+}
+
+.Ldt-EnrichedPlan-SlideTimecode {
+    display: inline-block;
+    width: 24px;
+    color: #999 !important;
+    font-size: 9px !important;
+    width: 24px;
+    vertical-align: top;
+}
+
+.Ldt-EnrichedPlan-SlideThumbnail {
+    display: inline-block;
+    width: 180px;
+    height: 100px;
+    padding-left: 10px;
+    margin: 0;
+    vertical-align: top;
+}
+
+.Ldt-EnrichedPlan-SlideThumbnail img {
+    max-width: 180px;
+    max-height: 100px;
+    margin: auto;
+    border: 1px solid #ccc;
+}
+
+.Ldt-EnrichedPlan-SlideContent {
+    display: inline-block;
+    width: calc(100% - 220px);
+    transition: width .4s;
+}
+
+.Ldt-EnrichedPlan-SlideThumbnail.filtered_out + .Ldt-EnrichedPlan-SlideContent {
+    width: calc(100% - 40px);
+}
+
+.Ldt-EnrichedPlan-SlideTitle {
+    display: inline-block;
+    font-size: 14px;
+    width: 100%;
+    height: 1em;
+    overflow: hidden;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+}
+
+.Ldt-EnrichedPlan-SlideTitle1 {
+    text-transform: uppercase;
+    font-size: 13px;
+    font-weight: 600;
+}
+
+.Ldt-EnrichedPlan-Note {
+    font-weight: normal;
+    font-size: 14px;
+    font-family: Roboto-italic;
+}
+.Ldt-EnrichedPlan-Note:hover {
+    background-color: #eee;
+}
+
+.Ldt-EnrichedPlan-Note-Teacher {
+    color: #e5007e;
+    font-style: italic;
+}
+.Ldt-EnrichedPlan-Note-Own {
+    color: #66ccff;
+}
+.Ldt-EnrichedPlan-Note-Other {
+    color: #996633;
+}
+
+.Ldt-EnrichedPlan-Note-Text {
+    line-height: 22px;
+    word-wrap: break-word;
+}
+
+.Ldt-EnrichedPlan-Note-Author {
+    text-transform: uppercase;
+    font-size: 10px;
+}
+
+.Ldt-EnrichedPlan-Content {
+    margin-top: 37px;
+}
+
+.Ldt-EnrichedPlan-Controls {
+    height: 36px;
+    padding: 9px 0px 6px 0px;
+    border-bottom: 1px solid #000;
+    overflow-y: hidden;
+    overflow-x: hidden;
+    position: absolute;
+    top: 0px;
+    left: 0px;
+    right: 0px;
+    z-index: 1;
+    background-color: #fff;
+}
+
+.Ldt-EnrichedPlan-Control-Label {
+    display: inline-block;
+    text-transform: uppercase;
+    line-height: 10px;
+    font-family: Roboto;
+    font-size: 10px;
+    font-weight: 100;
+    width: 80px;
+    position: relative;
+}
+.Ldt-EnrichedPlan-Controls .Ldt-EnrichedPlan-Search-Input {
+    float: right;
+    font-family: Roboto;
+    font-size: 16px;
+    width: calc(100% - 340px);
+}
+
+.Ldt-EnrichedPlan-Note.non_matching {
+    display: none;
+}
+
+.Ldt-EnrichedPlan-Control- {
+    font-style: normal;
+}
+    /**********************************************************/
+/* Base for label styling */
+.Ldt-EnrichedPlan-Control-Checkbox:not(:checked),
+.Ldt-EnrichedPlan-Control-Checkbox:checked {
+  position: absolute;
+  left: -9999px;
+}
+.Ldt-EnrichedPlan-Control-Checkbox:not(:checked) + label,
+.Ldt-EnrichedPlan-Control-Checkbox:checked + label {
+  position: relative;
+  padding-left: 20px;
+  cursor: pointer;
+}
+
+/* checkbox aspect */
+.Ldt-EnrichedPlan-Control-Checkbox:not(:checked) + label:before,
+.Ldt-EnrichedPlan-Control-Checkbox:checked + label:before {
+  content: '';
+  position: absolute;
+  left:0; top: 2px;
+  width: 13px; height: 13px;
+  border: 1px solid #aaa;
+}
+/* checked mark aspect */
+.Ldt-EnrichedPlan-Control-Checkbox:not(:checked) + label:after,
+.Ldt-EnrichedPlan-Control-Checkbox:checked + label:after {
+    content: '\2a2f';
+    font-style: normal;
+    position: absolute;
+    top: 3px; left: -1px;
+    font-size: 20px;
+    transition: all .2s;
+}
+/* checked mark aspect changes */
+.Ldt-EnrichedPlan-Control-Checkbox:not(:checked) + label:after {
+  opacity: 0;
+}
+.Ldt-EnrichedPlan-Control-Checkbox:checked + label:after {
+  opacity: 1;
+}
+/* disabled checkbox */
+.Ldt-EnrichedPlan-Control-Checkbox:disabled:not(:checked) + label:before,
+.Ldt-EnrichedPlan-Control-Checkbox:disabled:checked + label:before {
+  box-shadow: none;
+  border-color: #bbb;
+  background-color: #ddd;
+}
+.Ldt-EnrichedPlan-Control-Checkbox:disabled:checked + label:after {
+  color: #999;
+}
+.Ldt-EnrichedPlan-Control-Checkbox:disabled + label {
+  color: #aaa;
+}
+/* accessibility */
+.Ldt-EnrichedPlan-Control-Checkbox:checked:focus + label:before,
+.Ldt-EnrichedPlan-Control-Checkbox:not(:checked):focus + label:before {
+  border: 1px dotted blue;
+}
+
+/* hover style just for information */
+label:hover:before {
+  border: 1px solid #4778d9!important;
+}
+
+/* hover style just for information */
+label:hover:before {
+    background-color: #ededed;
+}
--- a/src/widgets/HelloWorld.css	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-.Ldt-HelloWorld p {
-    text-align: center; font-size: 12px; margin: 2px 0;
-}
--- a/src/widgets/HelloWorld.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/widgets/HelloWorld.js	Wed Sep 04 17:32:50 2024 +0200
@@ -4,30 +4,37 @@
  * - Use of internationalization
  */
 
-IriSP.Widgets.HelloWorld = function(player, config) {
-    console.log("Calling IriSP.Widget's constructor from IriSP.HelloWorldWidget");
-    IriSP.Widgets.Widget.call(this, player, config);
-};
-
-IriSP.Widgets.HelloWorld.prototype = new IriSP.Widgets.Widget();
+import helloWorldStyles from "./HelloWorld.module.css";
 
-IriSP.Widgets.HelloWorld.prototype.defaults = {
-    text: "world"
-};
+const HelloWorld = function (ns) {
+   return class extends ns.Widgets.Widget {
+    constructor(player, config) {
+      super(player,config);
+      console.log(
+        "Calling IriSP.Widget's constructor from IriSP.HelloWorldWidget"
+      );
+    }
 
-IriSP.Widgets.HelloWorld.prototype.template =
-    '<div class="Ldt-HelloWorld"><p>{{l10n.Hello}} {{text}}</p><p>Looks like we have {{source.contents.annotation.length}} annotations in this feed</p></div>';
+    static defaults = {
+      text: "world",
+    };
+
+    static template = `<div class="Ldt-HelloWorld"><p>{{l10n.Hello}} {{text}}</p><p>Looks like we have <span class="Ldt-HelloWorld-annotations">{{source.contents.annotation.length}} annotations</span> in this feed</p></div>`;
 
-IriSP.Widgets.HelloWorld.prototype.messages = {
-    "fr": {
-        "Hello" : "Bonjour,"
-    },
-    "en" : {
-        "Hello" : "Hello,"
-    }
-};
+    static messages =  {
+      fr: {
+        Hello: "Bonjour,",
+      },
+      en: {
+        Hello: "Hello,",
+      },
+    };
 
-IriSP.Widgets.HelloWorld.prototype.draw = function() {
-    this.renderTemplate();
-    console.log("HelloWorldWidget was drawn");
-};
\ No newline at end of file
+    draw = function () {
+      this.renderTemplate();
+      console.log("HelloWorldWidget was drawn");
+    };
+  };
+}
+
+export { HelloWorld, helloWorldStyles};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/widgets/HelloWorld.module.css	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,8 @@
+.Ldt-HelloWorld p {
+    text-align: center; font-size: 12px; margin: 2px 0;
+}
+
+.Ldt-HelloWorld-annotations {
+    color: red;
+    font-weight: bold;
+}
--- a/src/widgets/Highlighter.css	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-.currentAnnotation  {
-    border: solid 3px red;
-}
--- a/src/widgets/Highlighter.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/widgets/Highlighter.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,43 +1,55 @@
-IriSP.Widgets.Highlighter = function(player, config) {
-    var _this = this;
-    IriSP.Widgets.Widget.call(this, player, config);
-    this.throttledRefresh = IriSP._.throttle(function() {
+// Highlighter
+
+import highlighterStyles from "./Highlighter.module.css";
+import _ from "lodash";
+
+const Highlighter = function (ns) {
+  return class extends ns.Widgets.Widget {
+    constructor(player, config) {
+      super(player, config);
+      var _this = this;
+      this.throttledRefresh = _.throttle(function () {
         console.log("highlighter Refresh");
         _this.update();
-    }, 800);
+      }, 800);
+    }
+
+    /**
+     * Highlighter widget
+     * This widgets highlights the current annotations by setting the
+     * .activeAnnotation class on appropriate .Ldt-Highlighter-Annotation
+     * elements. These elements *must* have data-begin and data-end properties specifying their bounds (in ms) (and data-media specifying the media-id)
+     */
+
+    static defaults = {};
+
+    update() {
+      var _this = this;
+      var _currentTime = _this.media.getCurrentTime();
+      _this.$.find(".Ldt-Highlighter-Annotation", document).toggleClass(
+        "currentAnnotation",
+        function () {
+          return (
+            this.dataset.media === _this.media.id &&
+            this.dataset.begin <= _currentTime &&
+            _currentTime < this.dataset.end
+          );
+        }
+      );
+      console.log(_this.$.find(".currentAnnotation"));
+      return false;
+    }
+
+    draw() {
+      var _this = this;
+
+      var _events = ["timeupdate", "seeked", "loadedmetadata"];
+      for (var _i = 0; _i < _events.length; _i++) {
+        _this.onMediaEvent(_events[_i], _this.throttledRefresh);
+      }
+      _this.throttledRefresh();
+    }
+  };
 };
 
-/**
- * Highlighter widget
- * This widgets highlights the current annotations by setting the
- * .activeAnnotation class on appropriate .Ldt-Highlighter-Annotation
- * elements. These elements *must* have data-begin and data-end properties specifying their bounds (in ms) (and data-media specifying the media-id)
- */
-IriSP.Widgets.Highlighter.prototype = new IriSP.Widgets.Widget();
-
-IriSP.Widgets.Highlighter.prototype.defaults =  {
-}
-
-IriSP.Widgets.Highlighter.prototype.update = function() {
-    var  _this = this;
-    var _currentTime = _this.media.getCurrentTime();
-    _this.$.find(".Ldt-Highlighter-Annotation", document).toggleClass("currentAnnotation", function () {
-        return (this.dataset.media === _this.media.id && this.dataset.begin <= _currentTime && _currentTime < this.dataset.end);
-    });
-    console.log(_this.$.find(".currentAnnotation"));
-    return false;
-};
-
-IriSP.Widgets.Highlighter.prototype.draw = function() {
-    var  _this = this;
-    
-    var _events = [
-        "timeupdate",
-        "seeked",
-        "loadedmetadata"
-    ];
-    for (var _i = 0; _i < _events.length; _i++) {
-        _this.onMediaEvent(_events[_i], _this.throttledRefresh);
-    }
-    _this.throttledRefresh();
-};
+export { Highlighter, highlighterStyles };
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/widgets/Highlighter.module.css	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,3 @@
+.currentAnnotation  {
+    border: solid 3px red;
+}
--- a/src/widgets/HtmlMashupPlayer.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/widgets/HtmlMashupPlayer.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,42 +1,42 @@
-IriSP.Widgets.HtmlMashupPlayer = function(player, config) {
-    IriSP.Widgets.Widget.call(this, player, config);
-};
+//HtmlMashupPlayer
 
-IriSP.Widgets.HtmlMashupPlayer.prototype = new IriSP.Widgets.Widget();
-
+const HtmlMashupPlayer = function (ns) {
+  return class extends ns.Widgets.Widget {
+    constructor(player, config) {
+      super(player, config);
+    }
 
-IriSP.Widgets.HtmlMashupPlayer.prototype.defaults = {
-    aspect_ratio: 14/9,
-    background: "#333333"
-};
+    static defaults = {
+      aspect_ratio: 14 / 9,
+      background: "#333333",
+    };
 
-IriSP.Widgets.HtmlMashupPlayer.prototype.draw = function() {
-    
-    if (!this.height && this.aspect_ratio) {
+    draw() {
+      if (!this.height && this.aspect_ratio) {
         this.height = this.width / this.aspect_ratio;
         this.$.css("height", this.height);
-    }
-    
-    if (this.background) {
+      }
+
+      if (this.background) {
         this.$.css("background", this.background);
-    }
-    
-    var mashup = this.media,
+      }
+
+      var mashup = this.media,
         sel = this.$,
         width = this.width,
         height = this.height,
         url_transform = this.url_transform;
-    
-    mashup.currentMedia = null;
-    mashup.currentAnnotation = null;
-    mashup.seeking = false;
-    var mashupSegmentBegin,
+
+      mashup.currentMedia = null;
+      mashup.currentAnnotation = null;
+      mashup.seeking = false;
+      var mashupSegmentBegin,
         mashupSegmentEnd,
         mashupTimecode = 0,
- //       seekdiv = $(".video-wait"),
+        //       seekdiv = $(".video-wait"),
         mashupTimedelta;
-        
-/*    
+
+      /*    
     function showSeek() {
         if (currentMedia.seeking) {
             seekdiv.show();
@@ -44,302 +44,328 @@
     }
 */
 
-    function changeCurrentAnnotation() {
+      function changeCurrentAnnotation() {
         if (mashupTimecode >= mashup.duration) {
-            if (!mashup.paused) {
-                mashup.paused = true;
-                mashup.trigger("pause");
-            }
-            mashupTimecode = 0;
+          if (!mashup.paused) {
+            mashup.paused = true;
+            mashup.trigger("pause");
+          }
+          mashupTimecode = 0;
         }
-        var _annotation = mashup.getAnnotationAtTime( mashupTimecode );
+        var _annotation = mashup.getAnnotationAtTime(mashupTimecode);
         if (typeof _annotation === "undefined") {
-            if (mashup.currentMedia) {
-                mashup.currentMedia.pause();
-                if (!mashup.paused) {
-                    mashup.paused = true;
-                    mashup.trigger("pause");
-                }
+          if (mashup.currentMedia) {
+            mashup.currentMedia.pause();
+            if (!mashup.paused) {
+              mashup.paused = true;
+              mashup.trigger("pause");
             }
-            return;
+          }
+          return;
         }
         mashup.currentAnnotation = _annotation;
-        mashupSegmentBegin = mashup.currentAnnotation.annotation.begin.milliseconds;
+        mashupSegmentBegin =
+          mashup.currentAnnotation.annotation.begin.milliseconds;
         mashupSegmentEnd = mashup.currentAnnotation.annotation.end.milliseconds;
-        mashupTimedelta = mashupSegmentBegin - mashup.currentAnnotation.begin.milliseconds;
+        mashupTimedelta =
+          mashupSegmentBegin - mashup.currentAnnotation.begin.milliseconds;
         mashup.currentMedia = mashup.currentAnnotation.getMedia();
-        mashup.getMedias().forEach(function(_media) {
-            if (_media !== mashup.currentMedia) {
-                _media.hide();
-                _media.pause();
-            } else {
-                _media.show();
-            }
+        mashup.getMedias().forEach(function (_media) {
+          if (_media !== mashup.currentMedia) {
+            _media.hide();
+            _media.pause();
+          } else {
+            _media.show();
+          }
         });
-        
-        mashup.currentMedia.setCurrentTime( mashupTimecode + mashupTimedelta);
+
+        mashup.currentMedia.setCurrentTime(mashupTimecode + mashupTimedelta);
         mashup.currentMedia.seeking = true;
-        
-        if (!mashup.paused) {
-            mashup.currentMedia.play();
-            mashup.seeking = true;
-//            setTimeout(showSeek,200);
-        }
-        mashup.trigger("timeupdate", new IriSP.Model.Time(mashupTimecode));
 
-    }
-    
-    mashup.getMedias().forEach(addMedia);
-    changeCurrentAnnotation();
-    mashup.trigger("loadedmetadata");
-    
-    function addMedia(media) {
+        if (!mashup.paused) {
+          mashup.currentMedia.play();
+          mashup.seeking = true;
+          //            setTimeout(showSeek,200);
+        }
+        mashup.trigger("timeupdate", new ns.Model.Time(mashupTimecode));
+      }
+
+      mashup.getMedias().forEach(addMedia);
+      changeCurrentAnnotation();
+      mashup.trigger("loadedmetadata");
+
+      function addMedia(media) {
         if (media.has_player) {
-            return;
+          return;
         }
         media.has_player = true;
         var videourl = media.video;
         if (typeof url_transform === "function") {
-            videourl = url_transform(media.video);
+          videourl = url_transform(media.video);
         }
         var videoid = "video_" + media.id,
-            videoElement;
-        
-        media.show = function() {
-            
-            if (document.getElementById(videoid)) {
-                return;
-            }
-            
-            media.loaded = false;
-            media.paused = true;
-            var videoSelector = $('<video>');
-            
-            videoSelector.attr({
-                id : videoid,
-                width : width,
-                height : height
-            }).css({
-                width: width,
-                height: height
-            });
-            
-            if (typeof videourl === "string") {
-                videoSelector.attr( "src", videourl );
-            } else {
-                for (var i = 0; i < videourl.length; i++) {
-                    var _srcNode = IriSP.jQuery('<source>');
-                    _srcNode.attr({
-                        src: videourl[i].src,
-                        type: videourl[i].type
-                    });
-                    videoSelector.append(_srcNode);
-                }
-            }
-            
-            sel.append(videoSelector);
-            
-            videoElement = videoSelector[0];
-            
-            // Binding DOM events to media
-            
-            function getVolume() {
-                media.muted = videoElement.muted;
-                media.volume = videoElement.volume;
-            }
-            
-            videoSelector.on("loadedmetadata", function() {
-                getVolume();
-                media.loaded = true;
-                media.trigger("loadedmetadata");
-                media.trigger("volumechange");
-            });
-            
-            videoSelector.on("timeupdate", function() {
-                media.trigger("timeupdate", new IriSP.Model.Time(1000*videoElement.currentTime));
-            });
-            
-            videoSelector.on("volumechange", function() {
-                getVolume();
-                media.trigger("volumechange");
+          videoElement;
+
+        media.show = function () {
+          if (document.getElementById(videoid)) {
+            return;
+          }
+
+          media.loaded = false;
+          media.paused = true;
+          var videoSelector = $("<video>");
+
+          videoSelector
+            .attr({
+              id: videoid,
+              width: width,
+              height: height,
+            })
+            .css({
+              width: width,
+              height: height,
             });
-            
-            videoSelector.on("play", function() {
-                media.trigger("play");
-            });
-            
-            videoSelector.on("pause", function() {
-                media.trigger("pause");
-            });
-            
-            videoSelector.on("seeking", function() {
-                media.trigger("seeking");
-            });
-            
-            videoSelector.on("seeked", function() {
-                media.trigger("seeked");
-            });
+
+          if (typeof videourl === "string") {
+            videoSelector.attr("src", videourl);
+          } else {
+            for (var i = 0; i < videourl.length; i++) {
+              var _srcNode = ns.jQuery("<source>");
+              _srcNode.attr({
+                src: videourl[i].src,
+                type: videourl[i].type,
+              });
+              videoSelector.append(_srcNode);
+            }
+          }
+
+          sel.append(videoSelector);
+
+          videoElement = videoSelector[0];
+
+          // Binding DOM events to media
+
+          function getVolume() {
+            media.muted = videoElement.muted;
+            media.volume = videoElement.volume;
+          }
+
+          videoSelector.on("loadedmetadata", function () {
+            getVolume();
+            media.loaded = true;
+            media.trigger("loadedmetadata");
+            media.trigger("volumechange");
+          });
+
+          videoSelector.on("timeupdate", function () {
+            media.trigger(
+              "timeupdate",
+              new ns.Model.Time(1000 * videoElement.currentTime)
+            );
+          });
+
+          videoSelector.on("volumechange", function () {
+            getVolume();
+            media.trigger("volumechange");
+          });
+
+          videoSelector.on("play", function () {
+            media.trigger("play");
+          });
+
+          videoSelector.on("pause", function () {
+            media.trigger("pause");
+          });
+
+          videoSelector.on("seeking", function () {
+            media.trigger("seeking");
+          });
+
+          videoSelector.on("seeked", function () {
+            media.trigger("seeked");
+          });
         };
-        
-        media.hide = function() {
-            videoElement = undefined;
-            sel.find("#" + videoid).remove();
+
+        media.hide = function () {
+          videoElement = undefined;
+          sel.find("#" + videoid).remove();
         };
-        
+
         // Binding functions to Media Element Functions
-        
+
         var deferredTime = undefined,
-            deferredPlayPause = undefined;
-        
-        media.on("setcurrenttime", function(_milliseconds) {
-            if (videoElement && videoElement.readyState >= videoElement.HAVE_METADATA) {
-                try {
-                    videoElement.currentTime = (_milliseconds / 1000);
-                    deferredTime = undefined;
-                } catch(err) {
-                    deferredTime = _milliseconds;
-                }
-            } else {
-                deferredTime = _milliseconds;
-            }
-        });
-        
-        media.on("setvolume", function(_vol) {
-            if (videoElement && videoElement.readyState >= videoElement.HAVE_METADATA) {
-                media.volume = _vol;
-                videoElement.volume = _vol;
+          deferredPlayPause = undefined;
+
+        media.on("setcurrenttime", function (_milliseconds) {
+          if (
+            videoElement &&
+            videoElement.readyState >= videoElement.HAVE_METADATA
+          ) {
+            try {
+              videoElement.currentTime = _milliseconds / 1000;
+              deferredTime = undefined;
+            } catch (err) {
+              deferredTime = _milliseconds;
             }
-        });
-        
-        media.on("setmuted", function(_muted) {
-            if (videoElement && videoElement.readyState >= videoElement.HAVE_METADATA) {
-                media.muted = _muted;
-                videoElement.muted = _muted;
-            }
+          } else {
+            deferredTime = _milliseconds;
+          }
         });
-        
-        media.on("setplay", function() {
-            if (videoElement && videoElement.readyState >= videoElement.HAVE_METADATA) {
-                try {
-                    videoElement.play();
-                    deferredPlayPause = undefined;
-                } catch(err) {
-                    deferredPlayPause = true;
-                }
-            } else {
-                deferredPlayPause = true;
-            }
+
+        media.on("setvolume", function (_vol) {
+          if (
+            videoElement &&
+            videoElement.readyState >= videoElement.HAVE_METADATA
+          ) {
+            media.volume = _vol;
+            videoElement.volume = _vol;
+          }
+        });
+
+        media.on("setmuted", function (_muted) {
+          if (
+            videoElement &&
+            videoElement.readyState >= videoElement.HAVE_METADATA
+          ) {
+            media.muted = _muted;
+            videoElement.muted = _muted;
+          }
         });
 
-        media.on("setpause", function() {
-            if (videoElement && videoElement.readyState >= videoElement.HAVE_METADATA) {
-                try {
-                    videoElement.pause();
-                    deferredPlayPause = undefined;
-                } catch(err) {
-                    deferredPlayPause = false;
-                }
-            } else {
-                deferredPlayPause = false;
-            }
-        });
-        
-        media.on("loadedmetadata", function() {
-            if (typeof deferredTime !== "undefined") {
-                media.setCurrentTime(deferredTime);
+        media.on("setplay", function () {
+          if (
+            videoElement &&
+            videoElement.readyState >= videoElement.HAVE_METADATA
+          ) {
+            try {
+              videoElement.play();
+              deferredPlayPause = undefined;
+            } catch (err) {
+              deferredPlayPause = true;
             }
-            if (typeof deferredPlayPause !== "undefined") {
-                if (deferredPlayPause) {
-                    media.play();
-                } else {
-                    media.pause();
-                }
-            }
+          } else {
+            deferredPlayPause = true;
+          }
         });
-        
-        // Binding UI Events and Mashup Playing to Media
-        
-        media.on("play", function() {
-            if (media === mashup.currentMedia) {
-                mashup.trigger("play");
+
+        media.on("setpause", function () {
+          if (
+            videoElement &&
+            videoElement.readyState >= videoElement.HAVE_METADATA
+          ) {
+            try {
+              videoElement.pause();
+              deferredPlayPause = undefined;
+            } catch (err) {
+              deferredPlayPause = false;
             }
+          } else {
+            deferredPlayPause = false;
+          }
         });
-        
-        media.on("pause", function() {
-            if (media === mashup.currentMedia) {
-                mashup.trigger("pause");
+
+        media.on("loadedmetadata", function () {
+          if (typeof deferredTime !== "undefined") {
+            media.setCurrentTime(deferredTime);
+          }
+          if (typeof deferredPlayPause !== "undefined") {
+            if (deferredPlayPause) {
+              media.play();
+            } else {
+              media.pause();
             }
+          }
         });
-        
-        media.on("timeupdate", function(_time) {
-            if (!mashup.paused && media === mashup.currentMedia && !media.seeking) {
-                if ( _time < mashupSegmentEnd ) {
-                    if ( _time >= mashupSegmentBegin ) {
-                        mashupTimecode = _time - mashupTimedelta;
-                    } else {
-                        mashupTimecode = mashupSegmentBegin - mashupTimedelta;
-                        media.setCurrentTime(mashupSegmentBegin);
-                    }
-                } else {
-                    mashupTimecode = mashupSegmentEnd - mashupTimedelta;
-                    media.pause();
-                    changeCurrentAnnotation();
-                }
-                mashup.trigger("timeupdate", new IriSP.Model.Time(mashupTimecode));
-            }
+
+        // Binding UI Events and Mashup Playing to Media
+
+        media.on("play", function () {
+          if (media === mashup.currentMedia) {
+            mashup.trigger("play");
+          }
+        });
+
+        media.on("pause", function () {
+          if (media === mashup.currentMedia) {
+            mashup.trigger("pause");
+          }
         });
-        
-        media.on("seeked", function() {
-            media.seeking = false;
-            if (media === mashup.currentMedia && mashup.seeking) {
-                mashup.seeking = false;
+
+        media.on("timeupdate", function (_time) {
+          if (
+            !mashup.paused &&
+            media === mashup.currentMedia &&
+            !media.seeking
+          ) {
+            if (_time < mashupSegmentEnd) {
+              if (_time >= mashupSegmentBegin) {
+                mashupTimecode = _time - mashupTimedelta;
+              } else {
+                mashupTimecode = mashupSegmentBegin - mashupTimedelta;
+                media.setCurrentTime(mashupSegmentBegin);
+              }
+            } else {
+              mashupTimecode = mashupSegmentEnd - mashupTimedelta;
+              media.pause();
+              changeCurrentAnnotation();
             }
-//            seekdiv.hide();
+            mashup.trigger("timeupdate", new ns.Model.Time(mashupTimecode));
+          }
         });
-        
-        media.on("volumechange", function() {
-            mashup.muted = media.muted;
-            mashup.volume = media.volume;
-            mashup.trigger("volumechange");
+
+        media.on("seeked", function () {
+          media.seeking = false;
+          if (media === mashup.currentMedia && mashup.seeking) {
+            mashup.seeking = false;
+          }
+          //            seekdiv.hide();
         });
-        
-    }
 
-    // Mashup Events
-    
-    mashup.on("setcurrenttime", function(_milliseconds) {
+        media.on("volumechange", function () {
+          mashup.muted = media.muted;
+          mashup.volume = media.volume;
+          mashup.trigger("volumechange");
+        });
+      }
+
+      // Mashup Events
+
+      mashup.on("setcurrenttime", function (_milliseconds) {
         mashupTimecode = _milliseconds;
         changeCurrentAnnotation();
-    });
-    
-    mashup.on("setvolume", function(_vol) {
-        mashup.getMedias().forEach(function(_media) {
-            _media.setVolume(_vol);
+      });
+
+      mashup.on("setvolume", function (_vol) {
+        mashup.getMedias().forEach(function (_media) {
+          _media.setVolume(_vol);
         });
         mashup.volume = _vol;
-    });
-    
-    mashup.on("setmuted", function(_muted) {
-        mashup.getMedias().forEach(function(_media) {
-            _media.setMuted(_muted);
+      });
+
+      mashup.on("setmuted", function (_muted) {
+        mashup.getMedias().forEach(function (_media) {
+          _media.setMuted(_muted);
         });
         mashup.muted = _muted;
-    });
-    
-    mashup.on("setplay", function() {
+      });
+
+      mashup.on("setplay", function () {
         mashup.paused = false;
         changeCurrentAnnotation();
-    });
-    
-    mashup.on("setpause", function() {
+      });
+
+      mashup.on("setpause", function () {
         mashup.paused = true;
         if (mashup.currentMedia) {
-            mashup.currentMedia.pause();
+          mashup.currentMedia.pause();
         }
-    });
-    
-    mashup.on("loadedmetadata", function() {
+      });
+
+      mashup.on("loadedmetadata", function () {
         changeCurrentAnnotation();
-    });
-    
-};
\ No newline at end of file
+      });
+    }
+  };
+};
+
+export { HtmlMashupPlayer };
--- a/src/widgets/HtmlPlayer.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/widgets/HtmlPlayer.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,15 +1,17 @@
-IriSP.Widgets.HtmlPlayer = function(player, config) {
-    IriSP.Widgets.Widget.call(this, player, config);
+//HtmlPlayer
+
+const HtmlPlayer = function (ns) {
+  return class extends ns.Widgets.Widget {
+    constructor(player, config) {
+      super(player, config);
+    }
+
+    static defaults = {};
+
+    draw() {
+      ns.htmlPlayer(this.media, this.$, this);
+    }
+  };
 };
 
-IriSP.Widgets.HtmlPlayer.prototype = new IriSP.Widgets.Widget();
-
-
-IriSP.Widgets.HtmlPlayer.prototype.defaults = {
-};
-
-IriSP.Widgets.HtmlPlayer.prototype.draw = function() {
-
-    IriSP.htmlPlayer(this.media, this.$, this);
-    
-};
\ No newline at end of file
+export { HtmlPlayer };
--- a/src/widgets/ImageDisplay.css	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,36 +0,0 @@
-.Ldt-ImageDisplay-Container {
-    width: 100%;
-    height: 100%;
-    background-color: white;
-    background-repeat: no-repeat;
-    background-position: center;
-    background-size: contain;
-}
-
-.Ldt-ImageDisplay-Image {
-    max-width: 100%;
-    max-height: 100%;
-}
-
-.Ldt-ImageDisplay-Overlay {
-    width: 30%;
-    min-width: 20px;
-    height: 100%;
-    opacity: 0.1;
-    position: absolute;
-    top: 0px;
-    bottom: 0px;
-}
-
-.Ldt-ImageDisplay-Overlay:hover {
-}
-
-.Ldt-ImageDisplay-Overlay-Left {
-    left: 0px;
-    cursor: url(img/left_arrow.svg) 20 20, pointer;
-}
-
-.Ldt-ImageDisplay-Overlay-Right {
-    right: 0px;
-    cursor: url(img/right_arrow.svg) 20 20, pointer;
-}
--- a/src/widgets/ImageDisplay.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/widgets/ImageDisplay.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,42 +1,57 @@
 /* This widget displays the image associated to the annotation in the given container */
+// ImageDisplay
+import imageDisplayStyles from "./ImageDisplay.module.css";
+
+const ImageDisplay = function (ns) {
+  return class extends ns.Widgets.Widget {
+    constructor(player, config) {
+      super(player, config);
+    }
 
-IriSP.Widgets.ImageDisplay = function(player, config) {
-    IriSP.Widgets.Widget.call(this, player, config);
-}
+    static defaults = {
+      annotation_type: "Slides",
+      // container: "imageContainer"
+    };
 
-IriSP.Widgets.ImageDisplay.prototype = new IriSP.Widgets.Widget();
+    static template =
+      '<div class="Ldt-ImageDisplay-Container"><div class="Ldt-ImageDisplay-Overlay Ldt-ImageDisplay-Overlay-Left"></div><div class="Ldt-ImageDisplay-Overlay Ldt-ImageDisplay-Overlay-Right"></div></div>';
+
+    annotationTemplate = "";
 
-IriSP.Widgets.ImageDisplay.prototype.defaults = {
-    annotation_type: "Slides"
-    // container: "imageContainer"
-}
-
-IriSP.Widgets.ImageDisplay.prototype.template = '<div class="Ldt-ImageDisplay-Container"><div class="Ldt-ImageDisplay-Overlay Ldt-ImageDisplay-Overlay-Left"></div><div class="Ldt-ImageDisplay-Overlay Ldt-ImageDisplay-Overlay-Right"></div></div>';
+    update(annotation) {
+      // Update the widget with data corresponding to the annotation
+      this.image.css("background-image", "url(" + annotation.thumbnail + ")");
+      this.image.attr(
+        "title",
+        ns.textFieldHtml(annotation.title) + " - " + annotation.begin.toString()
+      );
+    }
 
-IriSP.Widgets.ImageDisplay.prototype.annotationTemplate = '';
+    draw() {
+      var _annotations = this.getWidgetAnnotations().sortBy(function (
+        _annotation
+      ) {
+        return _annotation.begin;
+      });
+      var _this = this;
+      _this.renderTemplate();
+      _this.image = _this.$.find(".Ldt-ImageDisplay-Container");
 
-IriSP.Widgets.ImageDisplay.prototype.update = function(annotation) {
-    // Update the widget with data corresponding to the annotation
-    this.image.css("background-image", "url(" + annotation.thumbnail + ")");
-    this.image.attr("title", IriSP.textFieldHtml(annotation.title) + " - " + annotation.begin.toString());
+      _this.$.find(".Ldt-ImageDisplay-Overlay-Left").on("click", function () {
+        _this.navigate(-1);
+      });
+      _this.$.find(".Ldt-ImageDisplay-Overlay-Right").on("click", function () {
+        _this.navigate(+1);
+      });
+
+      _annotations.forEach(function (_a) {
+        _a.on("enter", function () {
+          _this.update(_a);
+        });
+      });
+      if (_annotations.length) _this.update(_annotations[0]);
+    }
+  };
 };
 
-IriSP.Widgets.ImageDisplay.prototype.draw = function() {
-    var _annotations = this.getWidgetAnnotations().sortBy(function(_annotation) {
-        return _annotation.begin;
-    });
-    var _this = this;
-    _this.renderTemplate();
-    _this.image = _this.$.find(".Ldt-ImageDisplay-Container");
-
-    _this.$.find(".Ldt-ImageDisplay-Overlay-Left").on("click", function () { _this.navigate(-1); });
-    _this.$.find(".Ldt-ImageDisplay-Overlay-Right").on("click", function () { _this.navigate(+1); });
-
-    _annotations.forEach(function(_a) {
-        _a.on("enter", function() {
-            _this.update(_a);
-        });
-    });
-    if (_annotations.length)
-        _this.update(_annotations[0]);
-}
+export { ImageDisplay, imageDisplayStyles };
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/widgets/ImageDisplay.module.css	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,36 @@
+.Ldt-ImageDisplay-Container {
+    width: 100%;
+    height: 100%;
+    background-color: white;
+    background-repeat: no-repeat;
+    background-position: center;
+    background-size: contain;
+}
+
+.Ldt-ImageDisplay-Image {
+    max-width: 100%;
+    max-height: 100%;
+}
+
+.Ldt-ImageDisplay-Overlay {
+    width: 30%;
+    min-width: 20px;
+    height: 100%;
+    opacity: 0.1;
+    position: absolute;
+    top: 0px;
+    bottom: 0px;
+}
+
+.Ldt-ImageDisplay-Overlay:hover {
+}
+
+.Ldt-ImageDisplay-Overlay-Left {
+    left: 0px;
+    cursor: url(img/left_arrow.svg) 20 20, pointer;
+}
+
+.Ldt-ImageDisplay-Overlay-Right {
+    right: 0px;
+    cursor: url(img/right_arrow.svg) 20 20, pointer;
+}
--- a/src/widgets/JwpPlayer.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/widgets/JwpPlayer.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,122 +1,132 @@
-IriSP.Widgets.JwpPlayer = function(player, config) {
-    IriSP.Widgets.Widget.call(this, player, config);
-};
+// JwpPlayer
 
-IriSP.Widgets.JwpPlayer.prototype = new IriSP.Widgets.Widget();
+import { Player } from "jwplayer";
 
-IriSP.Widgets.JwpPlayer.prototype.defaults = {
-};
+const JwpPlayerWidget = function (ns) {
+  return class extends ns.Widgets.Widget {
+    constructor(player, config) {
+      super(player, config);
+    }
 
-IriSP.Widgets.JwpPlayer.prototype.draw = function() {
-    
-    var _opts = {},
-        _player = jwplayer(this.$[0]),
+    static defaults = {};
+
+    draw() {
+      var _opts = {},
+        _player = Player(this.$[0]),
         _seekPause = false,
         _pauseState = true;
-    
-    if (typeof this.video === "undefined") {
+
+      if (typeof this.video === "undefined") {
         this.video = this.media.video;
-    }
-        
-    _opts.file = this.video;
-    _opts.flashplayer = IriSP.getLib("jwPlayerSWF");
-    _opts.primary = "flash";
-    _opts.fallback = false;
-    _opts.controls = false;
-    _opts.width = this.width;
-    if (this.height) {
+      }
+
+      _opts.file = this.video;
+      _opts.primary = "flash";
+      _opts.fallback = false;
+      _opts.controls = false;
+      _opts.width = this.width;
+      if (this.height) {
         _opts.height = this.height;
-    }
-    
-    if (this.autostart) { // There seems to be an autostart bug
+      }
+
+      if (this.autostart) {
+        // There seems to be an autostart bug
         //_opts.autostart = true;
         //_pauseState = false;
         //this.media.trigger("play");
-    }
-    
-    if (this.url_transform) {
+      }
+
+      if (this.url_transform) {
         _opts.file = this.url_transform(_opts.file);
-    }
+      }
 
-    // Binding functions to jwplayer
+      // Binding functions to jwplayer
 
-    var _media = this.media;
-    
-    _media.on("setcurrenttime", function(_milliseconds) {
+      var _media = this.media;
+
+      _media.on("setcurrenttime", function (_milliseconds) {
         _seekPause = _pauseState;
         _player.seek(_milliseconds / 1000);
-    });
-    
-    _media.on("setvolume", function(_vol) {
-        _player.setVolume(Math.floor(_vol*100));
+      });
+
+      _media.on("setvolume", function (_vol) {
+        _player.setVolume(Math.floor(_vol * 100));
         _media.volume = _vol;
-    });
-    
-    _media.on("setmuted", function(_muted) {
+      });
+
+      _media.on("setmuted", function (_muted) {
         _player.setMute(_muted);
         _media.muted = _muted;
-    });
-    
-    _media.on("setplay", function() {
+      });
+
+      _media.on("setplay", function () {
         _player.play(true);
         _media.paused = false;
-    });
-    
-    _media.on("setpause", function() {
+      });
+
+      _media.on("setpause", function () {
         _player.pause(true);
         _media.paused = true;
-    });
-    
-    // Binding jwplater events to media
-    
-    function getVolume() {
+      });
+
+      // Binding jwplater events to media
+
+      function getVolume() {
         _media.muted = _player.getMute();
         _media.volume = _player.getVolume() / 100;
-    }
-    
-    _opts.events = {
-        onReady: function() {
-            getVolume();
-            _media.currentTime = new IriSP.Model.Time(1000*_player.getPosition() || 0);
-            _media.trigger("loadedmetadata");
+      }
+
+      _opts.events = {
+        onReady: function () {
+          getVolume();
+          _media.currentTime = new ns.Model.Time(
+            1000 * _player.getPosition() || 0
+          );
+          _media.trigger("loadedmetadata");
         },
-        onTime: function(_progress) {
-            if (_seekPause) {
-                _player.pause(true);
-                _seekPause = false;
-            } else {
-                if (_pauseState && _player.getState() === "PLAYING") {
-                    _pauseState = false;
-                    _media.trigger("play");
-                }
+        onTime: function (_progress) {
+          if (_seekPause) {
+            _player.pause(true);
+            _seekPause = false;
+          } else {
+            if (_pauseState && _player.getState() === "PLAYING") {
+              _pauseState = false;
+              _media.trigger("play");
             }
-            _media.trigger("timeupdate", new IriSP.Model.Time(_progress.position * 1000));
+          }
+          _media.trigger(
+            "timeupdate",
+            new ns.Model.Time(_progress.position * 1000)
+          );
         },
-        onPlay: function() {
-            if (!_seekPause) {
-                _pauseState = false;
-                _media.trigger("play");
-            }
+        onPlay: function () {
+          if (!_seekPause) {
+            _pauseState = false;
+            _media.trigger("play");
+          }
         },
-        onPause: function() {
-            _pauseState = true;
-            _media.trigger("pause");
+        onPause: function () {
+          _pauseState = true;
+          _media.trigger("pause");
         },
-        onSeek: function() {
-            _media.trigger("seeked");
+        onSeek: function () {
+          _media.trigger("seeked");
         },
-        onMute: function(_event) {
-            _media.muted = _event.mute;
-            _media.trigger("volumechange");
+        onMute: function (_event) {
+          _media.muted = _event.mute;
+          _media.trigger("volumechange");
+        },
+        onVolume: function (_event) {
+          _media.volume = _event.volume / 100;
+          _media.trigger("volumechange");
         },
-        onVolume: function(_event) {
-            _media.volume = _event.volume / 100;
-            _media.trigger("volumechange");
-        }
-    };
-    
-    _player = _player.setup(_opts);
-    
-    this.jwplayer = _player;
-    
-};
\ No newline at end of file
+      };
+
+      _player = _player.setup(_opts);
+
+      this.jwplayer = _player;
+    }
+  };
+};
+
+export { JwpPlayerWidget as JwpPlayer };
--- a/src/widgets/KnowledgeConcierge.css	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,97 +0,0 @@
-.Ldt-Kc-Slider {
-    width: 100%; height: 8px; margin: 3px 0; font-size: 8px;
-}
-
-.Ldt-Kc-Canvas {
-    border: 1px solid #999999;
-}
-
-.Ldt-Kc-Related {
-    display: none;
-}
-
-.Ldt-Kc-Related-Empty {
-    text-align: center; font-weight: bold; font-style: italic;
-    font-size: 14px; color: #999999; margin: 5px 0;
-}
-
-.Ldt-Kc-Related h2 {
-    border: none;
-    color: #330099;
-    font-size: 18px;
-    margin: 8px 0 2px;
-    padding: 0 5px;
-}
-
-h3.Ldt-Kc-For-Keywords {
-    border-bottom: 1px solid #666666;
-    color: #000000;
-    font-size: 12px;
-    margin: 2px 0 5px;
-    padding: 0 5px 5px;
-    text-align: right;
-}
-
-.Ldt-Kc-Keywords {
-    color: #d000c0; font-weight: bold;
-}
-
-.Ldt-Kc-Related-Item {
-    width: 235px; float: left; margin: 4px 0; padding: 4px 0;
-}
-
-.Ldt-Kc-Related-Item:hover {
-    background: #e8e8e8;
-}
-
-.Ldt-Kc-Related-Item:nth-child(even) {
-    margin-left: 10px;
-}
-
-.Ldt-Kc-Related-Item a {
-    text-decoration: none;
-}
-
-.Ldt-Kc-Related-Item img {
-    max-width: 80px; max-height: 60px; float: left;
-}
-
-.Ldt-Kc-Related-Item h3, .Ldt-Kc-Related-Item p {
-    margin: 0 0 5px 85px;
-}
-
-.Ldt-Kc-Related-Item h3 {
-    font-size: 14px; font-weight: 600;
-}
-
-.Ldt-Kc-Related-Item h3 a {
-     color: #330099;
-}
-
-.Ldt-Kc-Related-Item h3 a:hover {
-    text-decoration: underline;
-}
-
-.Ldt-Kc-Related-Item p {
-    font-size: 12px;
-}
-
-.Ldt-Kc-Item-Duration {
-    color: #c00000;
-}
-
-.Ldt-Kc-Row {
-    border-bottom: 1px solid #CCCCCC;
-    clear: both; float: left; width: 100%;
-}
-
-.Ldt-Kc-Clearer {
-    clear: both;
-}
-
-.Ldt-Kc-Waiting {
-    display: none;
-    height: 128px;
-    width: 100%;
-    background:url(img/loader.gif) center no-repeat;
-}
--- a/src/widgets/KnowledgeConcierge.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/widgets/KnowledgeConcierge.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,333 +1,431 @@
-IriSP.Widgets.KnowledgeConcierge = function(player, config) {
-    IriSP.Widgets.Widget.call(this, player, config);
-};
+// KnowledgeConcierge
+
+import knowledgeConciergeStyles from "./KnowledgeConcierge.module.css";
 
-IriSP.Widgets.KnowledgeConcierge.prototype = new IriSP.Widgets.Widget();
+import Processing from "processing";
+import Mustache from "mustache";
+
+const KnowledgeConcierge = function (ns) {
+  return class extends ns.Widgets.Widget {
+    constructor(player, config) {
+      super(player, config);
+    }
 
-IriSP.Widgets.KnowledgeConcierge.prototype.defaults = {
-    width: 600,
-    height: 500,
-    sketch_path: "tmgraph",
-    sketch_files: [ "tmgraph.pde", "physics.pde", "model.pde", "javascript.pde", "menu.pde", "event.pde", "constants.pde", "initialdata.pde"],
-    kc_api_root: "/kn-concierge/",
-    related_api_endpoint: "",
-    use_word_boundaries: false,
-    related_data_type: 'json', // SET TO "jsonp" FOR CROSS-DOMAIN OPERATION
-    related_count: 8,
-};
+    static defaults = {
+      width: 600,
+      height: 500,
+      sketch_path: "tmgraph",
+      sketch_files: [
+        "tmgraph.pde",
+        "physics.pde",
+        "model.pde",
+        "javascript.pde",
+        "menu.pde",
+        "event.pde",
+        "constants.pde",
+        "initialdata.pde",
+      ],
+      kc_api_root: "/kn-concierge/",
+      related_api_endpoint: "",
+      use_word_boundaries: false,
+      related_data_type: "json", // SET TO "jsonp" FOR CROSS-DOMAIN OPERATION
+      related_count: 8,
+    };
 
-IriSP.Widgets.KnowledgeConcierge.prototype.messages = {
-    "fr": {
+    static messages =  {
+      fr: {
         related_videos: "Vidéos liées",
         duration_: "Durée\u00a0:",
         for_keywords_: "pour le(s) mots-clé(s)\u00a0:",
-        no_matching_videos: "Pas de vidéos correspondantes"
-    },
-    "en": {
+        no_matching_videos: "Pas de vidéos correspondantes",
+      },
+      en: {
         related_videos: "Related Videos",
         duration_: "Duration:",
         for_keywords_: "for keyword(s):",
-        no_matching_videos: "No matching videos"
-    }
-};
+        no_matching_videos: "No matching videos",
+      },
+    };
 
-IriSP.Widgets.KnowledgeConcierge.prototype.template =
-    '<div class="Ldt-Kc-Slider"></div><canvas class="Ldt-Kc-Canvas" />'
-    + '<div class="Ldt-Kc-Related"><h2>{{ l10n.related_videos }}</h2>'
-    + '<h3 class="Ldt-Kc-For-Keywords">{{l10n.for_keywords_}} <span class="Ldt-Kc-Keywords"></span></h3>'
-    + '<div class="Ldt-Kc-Waiting"></div>'
-    + '<div class="Ldt-Kc-Related-List"></div></div>';
+    template =
+      '<div class="Ldt-Kc-Slider"></div><canvas class="Ldt-Kc-Canvas" />' +
+      '<div class="Ldt-Kc-Related"><h2>{{ l10n.related_videos }}</h2>' +
+      '<h3 class="Ldt-Kc-For-Keywords">{{l10n.for_keywords_}} <span class="Ldt-Kc-Keywords"></span></h3>' +
+      '<div class="Ldt-Kc-Waiting"></div>' +
+      '<div class="Ldt-Kc-Related-List"></div></div>';
 
-IriSP.Widgets.KnowledgeConcierge.prototype.draw = function() {
-    this.renderTemplate();
-    var _canvasHeight = this.height - 16,
+    draw() {
+      this.renderTemplate();
+      var _canvasHeight = this.height - 16,
         _canvasWidth = this.width - 2,
         _canvas = this.$.find(".Ldt-Kc-Canvas"),
-        _tmpId = IriSP._.uniqueId("Processing-"),
+        _tmpId = _.uniqueId("Processing-"),
         _slider = this.$.find(".Ldt-Kc-Slider"),
-        radius = .375 * Math.min(_canvasHeight, _canvasWidth);
-    _canvas.attr({
-        width: _canvasWidth,
-        height: _canvasHeight,
-        id: _tmpId
-    }).css({
-        width: _canvasWidth,
-        height: _canvasHeight
-    });
-    var _this = this,
-        _pjsfiles = IriSP._(this.sketch_files).map(function(_f) { return _this.sketch_path + "/" + _f; }),
+        radius = 0.375 * Math.min(_canvasHeight, _canvasWidth);
+      _canvas
+        .attr({
+          width: _canvasWidth,
+          height: _canvasHeight,
+          id: _tmpId,
+        })
+        .css({
+          width: _canvasWidth,
+          height: _canvasHeight,
+        });
+      var _this = this,
+        _pjsfiles = _(this.sketch_files).map(function (_f) {
+          return _this.sketch_path + "/" + _f;
+        }),
         _selectedText = "",
         currentNodesList = "",
         relatedCache = {},
         relatedRequests = {},
-        relatedTemplate = '<div class="Ldt-Kc-Related-Item"><a href="{{ widget.video_url_base }}{{ media.iri_id }}#keyword={{ escaped_keyword }}"><img src="{{ media.image }}"></a>'
-            + '<h3><a href="{{ widget.video_url_base }}{{ media.iri_id }}#keyword={{ escaped_keyword }}">{{ media.title }}</a></h3><p>{{ description }}</p>'
-            + '<p>{{ widget.l10n.duration_ }} <span class="Ldt-Kc-Item-Duration">{{ duration }}</span></p>'
-            + '</a><div class="Ldt-Kc-Clearer"></div></div>';
-            
-    Processing.loadSketchFromSources(_canvas[0],_pjsfiles);
-    
-    function renderRelated() {
+        relatedTemplate =
+          '<div class="Ldt-Kc-Related-Item"><a href="{{ widget.video_url_base }}{{ media.iri_id }}#keyword={{ escaped_keyword }}"><img src="{{ media.image }}"></a>' +
+          '<h3><a href="{{ widget.video_url_base }}{{ media.iri_id }}#keyword={{ escaped_keyword }}">{{ media.title }}</a></h3><p>{{ description }}</p>' +
+          '<p>{{ widget.l10n.duration_ }} <span class="Ldt-Kc-Item-Duration">{{ duration }}</span></p>' +
+          '</a><div class="Ldt-Kc-Clearer"></div></div>';
+
+      Processing.loadSketchFromSources(_canvas[0], _pjsfiles);
+
+      function renderRelated() {
         var keywords = currentNodesList;
         _this.$.find(".Ldt-Kc-Related").show();
         if (typeof relatedCache[keywords] === "undefined") {
-            return;
+          return;
         }
         _this.$.find(".Ldt-Kc-Waiting").hide();
         if (relatedCache[keywords].length) {
-            var _html = '<div class="Ldt-Kc-Row">';
-            IriSP._(relatedCache[keywords]).each(function(media, i) {
-                var _tmpldata = {
-                    widget: _this,
-                    media: media,
-                    description: media.description.replace(/(\n|\r|\r\n)/mg,' ').replace(/(^.{120,140})[\s].+$/m,'$1&hellip;'),
-                    duration: new IriSP.Model.Time(media.duration).toString(),
-                    escaped_keyword: encodeURIComponent(keywords.split(",")[0])
-                };
-                _html += Mustache.to_html(relatedTemplate, _tmpldata);
-                if (i % 2) {
-                    _html += '</div><div class="Ldt-Kc-Row">';
-                }
-            });
-            _html += '</div>';
-            _this.$.find(".Ldt-Kc-Related-List").html(_html);
+          var _html = '<div class="Ldt-Kc-Row">';
+          _(relatedCache[keywords]).each(function (media, i) {
+            var _tmpldata = {
+              widget: _this,
+              media: media,
+              description: media.description
+                .replace(/(\n|\r|\r\n)/gm, " ")
+                .replace(/(^.{120,140})[\s].+$/m, "$1&hellip;"),
+              duration: new ns.Model.Time(media.duration).toString(),
+              escaped_keyword: encodeURIComponent(keywords.split(",")[0]),
+            };
+            _html += Mustache.render(relatedTemplate, _tmpldata);
+            if (i % 2) {
+              _html += '</div><div class="Ldt-Kc-Row">';
+            }
+          });
+          _html += "</div>";
+          _this.$.find(".Ldt-Kc-Related-List").html(_html);
         } else {
-            _this.$.find(".Ldt-Kc-Related-List").html("<p class='Ldt-Kc-Related-Empty'>" + _this.l10n.no_matching_videos + "</p>");
+          _this.$.find(".Ldt-Kc-Related-List").html(
+            "<p class='Ldt-Kc-Related-Empty'>" +
+              _this.l10n.no_matching_videos +
+              "</p>"
+          );
         }
-    }    
+      }
 
-    function triggerSearch(text) {
+      function triggerSearch(text) {
         if (_selectedText !== text) {
-            _selectedText = text;
-            _this.source.getAnnotations().search(text);
+          _selectedText = text;
+          _this.source.getAnnotations().search(text);
         }
-    }
-    
-    function searchNodes(tags) {
-        var _tlist = (_this.use_word_boundaries ? IriSP._(tags).map(function(t) { return "\\\\y" + t + "\\\\y" }) : tags),
-            _q = "(?i)(" + _tlist.join("|") + ")";
+      }
+
+      function searchNodes(tags) {
+        var _tlist = _this.use_word_boundaries
+            ? _(tags).map(function (t) {
+                return "\\\\y" + t + "\\\\y";
+              })
+            : tags,
+          _q = "(?i)(" + _tlist.join("|") + ")";
         jQuery.getJSON(
-            _this.kc_api_root + "topics.jsp",
-            {
-                proj: _this.project_id,
-                q: _q
-            },
-            function(data) {
-                if (data && data.items && data.items.length) {
-                    for (var i=0, l=data.items.length; i<l; i++) {
-                        var node = data.items[i];
-                        if (i == 0) {
-                            _pjs.initNode(node.id, node.name, node.grp, node.uid, node.proj);
-                            var node = _pjs.findNode(node.id, node.proj);
-                        } else {
-                            var node = _pjs.newNode(node.id, node.name, node.grp, node.uid, node.proj);
-                            node.root = true;
-                            node.fix();
-                        }
-                        _fns.countassoc(node.id, node.proj);
-                        if (l > 1) {
-                            node.position(Math.floor(radius*Math.sin(2 * Math.PI * i / l)),Math.floor(radius*Math.cos(2 * Math.PI * i / l)));
-                        }
-                    }
+          _this.kc_api_root + "topics.jsp",
+          {
+            proj: _this.project_id,
+            q: _q,
+          },
+          function (data) {
+            if (data && data.items && data.items.length) {
+              for (var i = 0, l = data.items.length; i < l; i++) {
+                var node = data.items[i];
+                if (i == 0) {
+                  _pjs.initNode(
+                    node.id,
+                    node.name,
+                    node.grp,
+                    node.uid,
+                    node.proj
+                  );
+                  var node = _pjs.findNode(node.id, node.proj);
+                } else {
+                  var node = _pjs.newNode(
+                    node.id,
+                    node.name,
+                    node.grp,
+                    node.uid,
+                    node.proj
+                  );
+                  node.root = true;
+                  node.fix();
                 }
+                _fns.countassoc(node.id, node.proj);
+                if (l > 1) {
+                  node.position(
+                    Math.floor(radius * Math.sin((2 * Math.PI * i) / l)),
+                    Math.floor(radius * Math.cos((2 * Math.PI * i) / l))
+                  );
+                }
+              }
             }
+          }
         );
-    }
-    
-    function showRelated(nodetexts) {
+      }
+
+      function showRelated(nodetexts) {
         currentNodesList = nodetexts;
         _this.$.find(".Ldt-Kc-Related-List").html("");
-        _this.$.find(".Ldt-Kc-Keywords").html(nodetexts.replace(/\,/g,", "));
+        _this.$.find(".Ldt-Kc-Keywords").html(nodetexts.replace(/\,/g, ", "));
         if (typeof relatedCache[nodetexts] === "undefined") {
-            _this.$.find(".Ldt-Kc-Waiting").show();
-            if (relatedRequests[nodetexts]) {
-                return;
+          _this.$.find(".Ldt-Kc-Waiting").show();
+          if (relatedRequests[nodetexts]) {
+            return;
+          }
+          relatedRequests[nodetexts] = true;
+          ns.jQuery.ajax({
+            url: _this.related_api_endpoint,
+            data: {
+              format: _this.related_data_type,
+              keywords: nodetexts,
+            },
+            dataType: _this.related_data_type,
+            success: function (data) {
+              relatedCache[nodetexts] = ns
+                ._(data.objects)
+                .chain()
+                .filter(function (o) {
+                  return o.iri_id !== _this.media.id;
+                })
+                .sortBy(function (o) {
+                  return -o.score;
+                })
+                .first(_this.related_count)
+                .value();
+              renderRelated();
+            },
+          });
+        } else {
+          renderRelated();
+        }
+      }
+
+      function rootNode(id, proj) {
+        jQuery.getJSON(
+          _this.kc_api_root + "topic.jsp",
+          {
+            id: id,
+            proj: proj,
+          },
+          function (response) {
+            if (response != null && response.items.length > 0) {
+              item = response.items[0];
+              _pjs.initNode(item.id, item.name, item.grp, item.uid, item.proj);
+              _fns.countassoc(item.id, item.proj);
             }
-            relatedRequests[nodetexts] = true;
-            IriSP.jQuery.ajax({
-                url: _this.related_api_endpoint,
-                data: {
-                    format: _this.related_data_type,
-                    keywords: nodetexts
-                },
-                dataType: _this.related_data_type,
-                success: function(data) {
-                    relatedCache[nodetexts] = IriSP._(data.objects)
-                        .chain()
-                        .filter(function(o) {
-                            return o.iri_id !== _this.media.id;
-                        })
-                        .sortBy(function(o) {
-                            return - o.score;
-                        })
-                        .first(_this.related_count)
-                        .value();
-                    renderRelated();
-                }
-            });
-        } else {
-            renderRelated();
-        }
-    }
-    
-    function rootNode(id, proj) {
-        jQuery.getJSON(
-            _this.kc_api_root + "topic.jsp",
-            {
-                id: id,
-                proj: proj
-            },
-            function(response) {
-                if (response != null && response.items.length > 0){
-                    item = response.items[0];
-                    _pjs.initNode(item.id, item.name, item.grp, item.uid, item.proj);
-                    _fns.countassoc(item.id, item.proj);
-                }
-            }
+          }
         );
-    }
-    
-    function bindJavascript() {
+      }
+
+      function bindJavascript() {
         _pjs = Processing.getInstanceById(_tmpId);
         if (_pjs && typeof _pjs.bindJavascript === "function") {
-            setTimeout(function() {
-                _pjs.bindJavascript(_fns);
-                _pjs.setSize(_canvasWidth,_canvasHeight);
-                var _edit = false,
-                    _teamMode = true;
-                _pjs.saveMode("en",false,_teamMode,false,"both",_edit);
-                rootNode(_this.topic_id, _this.project_id);
-                _slider.slider({
-                    min: -20,
-                    max: 20,
-                    value: 0,
-                    range: "min",
-                    slide: function(event, ui) {
-                        _pjs.zoom(Math.exp(ui.value / 10));
-                    }
-                });
-            }, 1000);
+          setTimeout(function () {
+            _pjs.bindJavascript(_fns);
+            _pjs.setSize(_canvasWidth, _canvasHeight);
+            var _edit = false,
+              _teamMode = true;
+            _pjs.saveMode("en", false, _teamMode, false, "both", _edit);
+            rootNode(_this.topic_id, _this.project_id);
+            _slider.slider({
+              min: -20,
+              max: 20,
+              value: 0,
+              range: "min",
+              slide: function (event, ui) {
+                _pjs.zoom(Math.exp(ui.value / 10));
+              },
+            });
+          }, 1000);
         } else {
-            setTimeout(bindJavascript, 1000); 
+          setTimeout(bindJavascript, 1000);
         }
-    }
-    var currentSelection = null;
-    var _fns = {
-        adjacentnodes: function(id, proj, adj, both) {
-            jQuery.ajax({
-                url: _this.kc_api_root + "associations-bd.jsp",
-                cache: false,
-                data: {
-                    id: id,
-                    proj: proj,
-                    both: both,
-                    adj: adj
-                },
-                success: function(response) {
-                    if (response.items.length > 0){
-                        for(i = 0, end = response.items.length; i < end; i++) {
-                            item = response.items[i];
-                            _pjs.addEdge(item.asc_id, item.id, item.from_proj, item.to_id, item.to_proj,
-                                        item.r_name, item.r_from,  item.r_to, item.uid, item.proj);
-                            _pjs.setNodeName( item.id,   item.from_proj,item.name);
-                            _pjs.setNodeValue(item.id,   item.from_proj,item.name,   item.grp,   item.abst,   item.from_uid);
-                            if (item.from_assoc!=null) {
-                                _pjs.setNodeAssoc(item.id, item.from_proj, item.from_assoc);
-                            }
-                            _pjs.setNodeName( item.to_id,item.to_proj,  item.to_name);
-                            _pjs.setNodeValue(item.to_id,item.to_proj,  item.to_name,item.to_grp,item.to_abst,item.to_uid);
-                            if (item.to_assoc!=null) {
-                                _pjs.setNodeAssoc(item.to_id, item.to_proj, item.to_assoc);
-                            }
-                        }
-                        return response;
-                    } else {
-                        //.debug('No such topic.');
-                        return null;
-                    }
+      }
+      var currentSelection = null;
+      var _fns = {
+        adjacentnodes: function (id, proj, adj, both) {
+          jQuery.ajax({
+            url: _this.kc_api_root + "associations-bd.jsp",
+            cache: false,
+            data: {
+              id: id,
+              proj: proj,
+              both: both,
+              adj: adj,
+            },
+            success: function (response) {
+              if (response.items.length > 0) {
+                for (i = 0, end = response.items.length; i < end; i++) {
+                  item = response.items[i];
+                  _pjs.addEdge(
+                    item.asc_id,
+                    item.id,
+                    item.from_proj,
+                    item.to_id,
+                    item.to_proj,
+                    item.r_name,
+                    item.r_from,
+                    item.r_to,
+                    item.uid,
+                    item.proj
+                  );
+                  _pjs.setNodeName(item.id, item.from_proj, item.name);
+                  _pjs.setNodeValue(
+                    item.id,
+                    item.from_proj,
+                    item.name,
+                    item.grp,
+                    item.abst,
+                    item.from_uid
+                  );
+                  if (item.from_assoc != null) {
+                    _pjs.setNodeAssoc(item.id, item.from_proj, item.from_assoc);
+                  }
+                  _pjs.setNodeName(item.to_id, item.to_proj, item.to_name);
+                  _pjs.setNodeValue(
+                    item.to_id,
+                    item.to_proj,
+                    item.to_name,
+                    item.to_grp,
+                    item.to_abst,
+                    item.to_uid
+                  );
+                  if (item.to_assoc != null) {
+                    _pjs.setNodeAssoc(item.to_id, item.to_proj, item.to_assoc);
+                  }
                 }
-            });
+                return response;
+              } else {
+                //.debug('No such topic.');
+                return null;
+              }
+            },
+          });
         },
-        setscale: function(scl){
-            _slider.slider("value", 10*Math.log(scl));
+        setscale: function (scl) {
+          _slider.slider("value", 10 * Math.log(scl));
         },
-        countassoc: function(id, proj) {
-            jQuery.ajax({
-                url: _this.kc_api_root + "count-assoc.jsp",
-                data: {
-                    id: id,
-                    proj: proj
-                },
-                success: function(response) {
-                    if (response.items.length > 0){
-                        for(i = 0, end = response.items.length; i < end; i++) {
-                            item = response.items[i];
-                            _pjs.setNodeValue(item.id, item.proj, item.name, item.grp, item.abst);
-                            if (item.assoc!=null) _pjs.setNodeAssoc(item.id, item.proj, item.assoc);
-                            if (item.mass!=null) _pjs.setNodeMass( item.id, item.proj, item.mass);
-                        }
-                    }
+        countassoc: function (id, proj) {
+          jQuery.ajax({
+            url: _this.kc_api_root + "count-assoc.jsp",
+            data: {
+              id: id,
+              proj: proj,
+            },
+            success: function (response) {
+              if (response.items.length > 0) {
+                for (i = 0, end = response.items.length; i < end; i++) {
+                  item = response.items[i];
+                  _pjs.setNodeValue(
+                    item.id,
+                    item.proj,
+                    item.name,
+                    item.grp,
+                    item.abst
+                  );
+                  if (item.assoc != null)
+                    _pjs.setNodeAssoc(item.id, item.proj, item.assoc);
+                  if (item.mass != null)
+                    _pjs.setNodeMass(item.id, item.proj, item.mass);
                 }
-            });
+              }
+            },
+          });
         },
-        username: function() {
-            var nodes = _pjs.getNodes().values().toArray(),
-                nodetexts = IriSP._(nodes).chain().pluck("name").sortBy().value().join(",");
-            showRelated(nodetexts);
+        username: function () {
+          var nodes = _pjs.getNodes().values().toArray(),
+            nodetexts = ns
+              ._(nodes)
+              .chain()
+              .map("name")
+              .sortBy()
+              .value()
+              .join(",");
+          showRelated(nodetexts);
         },
-        mousemove: function(selection) {
-            if (selection !== currentSelection) {
-                if (selection) {
-                    triggerSearch(selection.name);
-                }
-                currentSelection = selection;
-            }
-        },
-        click: function(selection) {
+        mousemove: function (selection) {
+          if (selection !== currentSelection) {
             if (selection) {
-                triggerSearch(selection.name);
-                showRelated(selection.name);
-            } else {
-                triggerSearch();
+              triggerSearch(selection.name);
             }
-        }
-    };
-    var uselessfuncts = [
-        "selectnode", "selectedge", "topicnode","group_shapes",
-        "allbackup", "allretrieve", "new_topic", "pedia", "set_mode",
-        "new_relation", "startexpand", "endexpand", "new_select" //, "mouseover" //, "username"
-    ];
-    
-    IriSP._(uselessfuncts).each(function(funcname) {
-        _fns[funcname] = function() {
-//            console.log("Function", funcname, "called with arguments", arguments);
-        }
-    });
-    
-    this.getWidgetAnnotations().forEach(function(annotation) {
-        annotation.on("click", function() {
-            var _tags = annotation.getTagTexts();
-            if (_tags.length) {
-                searchNodes(_tags);
-            }
+            currentSelection = selection;
+          }
+        },
+        click: function (selection) {
+          if (selection) {
+            triggerSearch(selection.name);
+            showRelated(selection.name);
+          } else {
+            triggerSearch();
+          }
+        },
+      };
+      var uselessfuncts = [
+        "selectnode",
+        "selectedge",
+        "topicnode",
+        "group_shapes",
+        "allbackup",
+        "allretrieve",
+        "new_topic",
+        "pedia",
+        "set_mode",
+        "new_relation",
+        "startexpand",
+        "endexpand",
+        "new_select", //, "mouseover" //, "username"
+      ];
+
+      _(uselessfuncts).each(function (funcname) {
+        _fns[funcname] = function () {
+          //            console.log("Function", funcname, "called with arguments", arguments);
+        };
+      });
+
+      this.getWidgetAnnotations().forEach(function (annotation) {
+        annotation.on("click", function () {
+          var _tags = annotation.getTagTexts();
+          if (_tags.length) {
+            searchNodes(_tags);
+          }
         });
-    });
-    
-    this.source.getTags().forEach(function(tag) {
-        tag.on("click", function() {
-            if (tag.title) {
-                searchNodes([tag.title]);
-            }
+      });
+
+      this.source.getTags().forEach(function (tag) {
+        tag.on("click", function () {
+          if (tag.title) {
+            searchNodes([tag.title]);
+          }
         });
-    });
-    
-    var keywmatch = document.location.hash.match(/keyword=([^#?&]+)/);
-    if (keywmatch) {
-        this.player.on("widgets-loaded", function() {
-            triggerSearch(decodeURIComponent(keywmatch[1]));
+      });
+
+      var keywmatch = document.location.hash.match(/keyword=([^#?&]+)/);
+      if (keywmatch) {
+        this.player.on("widgets-loaded", function () {
+          triggerSearch(decodeURIComponent(keywmatch[1]));
         });
+      }
+
+      bindJavascript();
     }
-    
-    bindJavascript();
-    
+  };
 };
+
+export { KnowledgeConcierge, knowledgeConciergeStyles };
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/widgets/KnowledgeConcierge.module.css	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,97 @@
+.Ldt-Kc-Slider {
+    width: 100%; height: 8px; margin: 3px 0; font-size: 8px;
+}
+
+.Ldt-Kc-Canvas {
+    border: 1px solid #999999;
+}
+
+.Ldt-Kc-Related {
+    display: none;
+}
+
+.Ldt-Kc-Related-Empty {
+    text-align: center; font-weight: bold; font-style: italic;
+    font-size: 14px; color: #999999; margin: 5px 0;
+}
+
+.Ldt-Kc-Related h2 {
+    border: none;
+    color: #330099;
+    font-size: 18px;
+    margin: 8px 0 2px;
+    padding: 0 5px;
+}
+
+h3.Ldt-Kc-For-Keywords {
+    border-bottom: 1px solid #666666;
+    color: #000000;
+    font-size: 12px;
+    margin: 2px 0 5px;
+    padding: 0 5px 5px;
+    text-align: right;
+}
+
+.Ldt-Kc-Keywords {
+    color: #d000c0; font-weight: bold;
+}
+
+.Ldt-Kc-Related-Item {
+    width: 235px; float: left; margin: 4px 0; padding: 4px 0;
+}
+
+.Ldt-Kc-Related-Item:hover {
+    background: #e8e8e8;
+}
+
+.Ldt-Kc-Related-Item:nth-child(even) {
+    margin-left: 10px;
+}
+
+.Ldt-Kc-Related-Item a {
+    text-decoration: none;
+}
+
+.Ldt-Kc-Related-Item img {
+    max-width: 80px; max-height: 60px; float: left;
+}
+
+.Ldt-Kc-Related-Item h3, .Ldt-Kc-Related-Item p {
+    margin: 0 0 5px 85px;
+}
+
+.Ldt-Kc-Related-Item h3 {
+    font-size: 14px; font-weight: 600;
+}
+
+.Ldt-Kc-Related-Item h3 a {
+     color: #330099;
+}
+
+.Ldt-Kc-Related-Item h3 a:hover {
+    text-decoration: underline;
+}
+
+.Ldt-Kc-Related-Item p {
+    font-size: 12px;
+}
+
+.Ldt-Kc-Item-Duration {
+    color: #c00000;
+}
+
+.Ldt-Kc-Row {
+    border-bottom: 1px solid #CCCCCC;
+    clear: both; float: left; width: 100%;
+}
+
+.Ldt-Kc-Clearer {
+    clear: both;
+}
+
+.Ldt-Kc-Waiting {
+    display: none;
+    height: 128px;
+    width: 100%;
+    background:url(img/loader.gif) center no-repeat;
+}
--- a/src/widgets/LatestAnnotation.css	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,63 +0,0 @@
-.Ldt-LatestAnnotation{
-	background: url(img/pinstripe.png);
-	width: 535px;
-	max-height: 180px;
-	margin: 0px;
-	margin-top: 4px;
-	border-style: solid;
-	border-width: 1px;
-	border-color: #b7b7b7;
-}
-
-.Ldt-LatestAnnotation-Element{
-	margin: 5px;
-	display: inline-block;
-	vertical-align: top;
-}
-
-.Ldt-LatestAnnotation-Box{
-	background-color: #ffffff;
-	margin: 3px;
-}
-
-.Ldt-LatestAnnotation-CreationDate{
-	color: #f7268e;
-}
-
-.Ldt-LatestAnnotation-Content{
-	text-align: justify;
-}
-
-.Ldt-LatestAnnotation-Title{
-	color: #0068c4;
-    font-size: 14px;
-    font-weight: bold;
-}
-
-.Ldt-LatestAnnotation-NoAnnotation{
-	font-size: 14px;
-    font-weight: bold;
-}
-
-.Ldt-LatestAnnotation-CopyEditButton{
-	display: inline-block;
-    background-color: #d93c71;
-    color: #ffffff;
-    float: right;
-    cursor: pointer;
-    height: 14px;
-    width: 100px;
-    margin: 2px;
-    padding: 2px;
-    font-size: 11px;
-    border: 1px solid;
-    border-color: #eca3bc #631e34 #36101c #e16e93;
-    cursor: pointer;
-    text-align: center;
-    vertical-align: middle;
-}
-
-.Ldt-LatestAnnotation-CopyEditButton:hover{
-	background-color: #e15581;
-	border-color: #222222 #e87d9f #f0adc3 #68273c;
-}
\ No newline at end of file
--- a/src/widgets/LatestAnnotation.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/widgets/LatestAnnotation.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,303 +1,335 @@
 /* Widget that displays the last annotation that was posted, optionally for current segment, optionally for a given username */
+import Mustache from "mustache";
+import jQuery from "jquery";
+
+import latestAnnotationStyles from "./LatestAnnotation.module.css";
 
-IriSP.Widgets.LatestAnnotation = function(player, config){
-    IriSP.Widgets.Widget.call(this, player, config);
-};
+const LatestAnnotation = function (ns) {
+  return class extends ns.Widgets.Widget {
+    constructor(player, config) {
+      super(player, config);
+    }
 
-IriSP.Widgets.LatestAnnotation.prototype = new IriSP.Widgets.Widget();
-
-IriSP.Widgets.LatestAnnotation.prototype.defaults = {
-    pre_draw_callback: function(){
+    static defaults = {
+      pre_draw_callback: function () {
         return this.importUsers();
-    },
-    from_user: false,
-    filter_by_segment: false,
-    segments_annotation_type: "chap",
-    hide_without_segment: false,
-    annotation_type: "contribution",
-    /*
-     * Set to a username if you only want to display annotations from a given user
-     */
-    show_only_annotation_from_user: false,
-    /*
-     * Displays a button that copy currently displayed annotation into CreateAnnotation input field
-     */
-    copy_and_edit_button: false,
-    hide_annotations_list: false,
-    /*
-     * Allows clicks on an annotation from Annotations to display the annotation content into this widget
-     */
-    selectable_annotations: false,
-    empty_message: false,
-    starts_hidden: false,
-    show_header: false,
-    custom_header: false,
-    make_name_string_function: function(params){
+      },
+      from_user: false,
+      filter_by_segment: false,
+      segments_annotation_type: "chap",
+      hide_without_segment: false,
+      annotation_type: "contribution",
+      /*
+       * Set to a username if you only want to display annotations from a given user
+       */
+      show_only_annotation_from_user: false,
+      /*
+       * Displays a button that copy currently displayed annotation into CreateAnnotation input field
+       */
+      copy_and_edit_button: false,
+      hide_annotations_list: false,
+      /*
+       * Allows clicks on an annotation from Annotations to display the annotation content into this widget
+       */
+      selectable_annotations: false,
+      empty_message: false,
+      starts_hidden: false,
+      show_header: false,
+      custom_header: false,
+      make_name_string_function: function (params) {
         return params.username ? params.username : "Anonymous";
-    }, 
-};
+      },
+    };
 
-IriSP.Widgets.LatestAnnotation.prototype.messages = {
-    fr : {
+    static messages =  {
+      fr: {
         copy_and_edit: "Copier et Editer",
-        empty : "Aucune annotation à afficher",
-        header: "Dernière annotation"
-    },
-    en: {
+        empty: "Aucune annotation à afficher",
+        header: "Dernière annotation",
+      },
+      en: {
         copy_and_edit: "Copy and Edit",
         empty: "No annotation to display",
-        header: "Last annotation"
-    }
-}
-
-IriSP.Widgets.LatestAnnotation.prototype.template = 
-    "{{#show_header}}"
-    + "<p class='Ldt-LatestAnnotation-header'>"
-    +     "{{#custom_header}}{{custom_header}}{{/custom_header}}"
-    +     "{{^custom_header}}{{l10n.header}}{{/custom_header}}"
-    + "</p>"
-    + "{{/show_header}}"
-    + "<div class='Ldt-LatestAnnotation'>"
-    + "</div>";
+        header: "Last annotation",
+      },
+    };
 
-IriSP.Widgets.LatestAnnotation.prototype.annotationTemplate =
-    "<div class='Ldt-LatestAnnotation-Box'>"
-    + "{{#copy_and_edit_button}}<div class='Ldt-LatestAnnotation-CopyEditButton'>{{button_text}}</div>{{/copy_and_edit_button}}"
-    +     "<div class='Ldt-LatestAnnotation-Element Ldt-LatestAnnotation-CreationDate'>{{{annotation_created}}}</div>" 
-    +     "<div class='Ldt-LatestAnnotation-Element Ldt-LatestAnnotation-Title'>{{{annotation_creator}}}{{#annotation_title}}: {{{annotation_title}}}{{/annotation_title}}</div>" 
-    +     "<div class='Ldt-LatestAnnotation-Element Ldt-LatestAnnotation-Content'>"
-    +         "{{{annotation_content}}}"
-    +     "</div>"
-    + "</div>"
+    static template =
+      "{{#show_header}}" +
+      "<p class='Ldt-LatestAnnotation-header'>" +
+      "{{#custom_header}}{{custom_header}}{{/custom_header}}" +
+      "{{^custom_header}}{{l10n.header}}{{/custom_header}}" +
+      "</p>" +
+      "{{/show_header}}" +
+      "<div class='Ldt-LatestAnnotation'>" +
+      "</div>";
 
+    static annotationTemplate =
+      "<div class='Ldt-LatestAnnotation-Box'>" +
+      "{{#copy_and_edit_button}}<div class='Ldt-LatestAnnotation-CopyEditButton'>{{button_text}}</div>{{/copy_and_edit_button}}" +
+      "<div class='Ldt-LatestAnnotation-Element Ldt-LatestAnnotation-CreationDate'>{{{annotation_created}}}</div>" +
+      "<div class='Ldt-LatestAnnotation-Element Ldt-LatestAnnotation-Title'>{{{annotation_creator}}}{{#annotation_title}}: {{{annotation_title}}}{{/annotation_title}}</div>" +
+      "<div class='Ldt-LatestAnnotation-Element Ldt-LatestAnnotation-Content'>" +
+      "{{{annotation_content}}}" +
+      "</div>" +
+      "</div>";
 
-IriSP.Widgets.LatestAnnotation.prototype.importUsers = function(){
-    if (!this.source.users_data){
+    importUsers() {
+      if (!this.source.users_data) {
         this.usernames = Array();
         var _this = this,
-            _list = this.getWidgetAnnotations(),
-            usernames_list_string = "";
-        
-        _list.forEach(function(_annotation){
-            if(_this.usernames.indexOf(_annotation.creator) == -1){
-                _this.usernames.push(_annotation.creator);
-            }
+          _list = this.getWidgetAnnotations(),
+          usernames_list_string = "";
+
+        _list.forEach(function (_annotation) {
+          if (_this.usernames.indexOf(_annotation.creator) == -1) {
+            _this.usernames.push(_annotation.creator);
+          }
+        });
+        this.usernames.forEach(function (_username) {
+          usernames_list_string += _username + ",";
         });
-        this.usernames.forEach(function(_username){
-            usernames_list_string+=_username+","
-        })
-        usernames_list_string = usernames_list_string.substring(0, usernames_list_string.length - 1);
-        _url = Mustache.to_html(this.api_users_endpoint, {usernames_list_string: encodeURIComponent(usernames_list_string), usernames_list_length: this.usernames.length});
-        return IriSP.jQuery.ajax({
-            async: false,
-            url: _url,
-            type: "GET",
-            success: function(_data) {
-                _this.source.users_data = _data.objects
-            },
-            error: function(_xhr, _error, _thrown) {
-                console.log(_xhr)
-                console.log(_error)
-                console.log(_thrown)
-            }
-        })
+        usernames_list_string = usernames_list_string.substring(
+          0,
+          usernames_list_string.length - 1
+        );
+        _url = Mustache.render(this.api_users_endpoint, {
+          usernames_list_string: encodeURIComponent(usernames_list_string),
+          usernames_list_length: this.usernames.length,
+        });
+        return jQuery.ajax({
+          async: false,
+          url: _url,
+          type: "GET",
+          success: function (_data) {
+            _this.source.users_data = _data.objects;
+          },
+          error: function (_xhr, _error, _thrown) {
+            console.log(_xhr);
+            console.log(_error);
+            console.log(_thrown);
+          },
+        });
+      }
     }
-}
-    
-IriSP.Widgets.LatestAnnotation.prototype.draw = function(){
-    var _this = this;
-    this.renderTemplate();
-    
-    this.annotationContainer_$ = this.$.find('.Ldt-LatestAnnotation');
-    
-    if (this.selectable_annotations){
-        this.onMdpEvent("AnnotationsList.refresh", function(){
-            _this.getWidgetAnnotations().forEach(function(_annotation){
-                _annotation.off("click");
-                _annotation.on("click", function(){
-                    var _user = {},
-                        _user_display_string = "",
-                        _users = this.source.users_data.filter(function(_user_data){
-                            return _user_data.username == _annotation.creator
-                        });
-                    if (_users.length == 0){
-                        _user.username = _annotation.creator;
-                    }
-                    else {
-                        _user = _users[0];
-                    }
-                    _user_display_string = _this.make_name_string_function(_user)
-                    _html = Mustache.to_html(_this.annotationTemplate, {
-                        annotation_created: _annotation.created.toLocaleDateString()+", "+_annotation.created.toLocaleTimeString(),
-                        annotation_creator: _user_display_string,
-                        annotation_title: _annotation.title,
-                        annotation_content: _annotation.description,
-                        copy_and_edit_button: _this.copy_and_edit_button,
-                        button_text: _this.l10n.copy_and_edit,
-                    });
-                    _this.annotationContainer_$.html(_html);
-                    _this.selectedAnnotation = true;
+
+    draw() {
+      var _this = this;
+      this.renderTemplate();
+
+      this.annotationContainer_$ = this.$.find(".Ldt-LatestAnnotation");
+
+      if (this.selectable_annotations) {
+        this.onMdpEvent("AnnotationsList.refresh", function () {
+          _this.getWidgetAnnotations().forEach(function (_annotation) {
+            _annotation.off("click");
+            _annotation.on("click", function () {
+              var _user = {},
+                _user_display_string = "",
+                _users = this.source.users_data.filter(function (_user_data) {
+                  return _user_data.username == _annotation.creator;
                 });
-            }); 
+              if (_users.length == 0) {
+                _user.username = _annotation.creator;
+              } else {
+                _user = _users[0];
+              }
+              _user_display_string = _this.make_name_string_function(_user);
+              _html = Mustache.render(_this.annotationTemplate, {
+                annotation_created:
+                  _annotation.created.toLocaleDateString() +
+                  ", " +
+                  _annotation.created.toLocaleTimeString(),
+                annotation_creator: _user_display_string,
+                annotation_title: _annotation.title,
+                annotation_content: _annotation.description,
+                copy_and_edit_button: _this.copy_and_edit_button,
+                button_text: _this.l10n.copy_and_edit,
+              });
+              _this.annotationContainer_$.html(_html);
+              _this.selectedAnnotation = true;
+            });
+          });
         });
-        
-        this.segments = _this.source.getAnnotationsByTypeTitle(this.segments_annotation_type)
-        this.segments.forEach(function(_segment){
-            _segment.on("click", function(){
-                _this.selectedAnnotation = false;
-            })
-        })
+
+        this.segments = _this.source.getAnnotationsByTypeTitle(
+          this.segments_annotation_type
+        );
+        this.segments.forEach(function (_segment) {
+          _segment.on("click", function () {
+            _this.selectedAnnotation = false;
+          });
+        });
         this.currentSegment = false;
-    }
-    
-    this.onMediaEvent("timeupdate", function(){
+      }
+
+      this.onMediaEvent("timeupdate", function () {
         _this.refresh();
-    });
-    this.onMediaEvent("settimerange", function(_timeRange){
+      });
+      this.onMediaEvent("settimerange", function (_timeRange) {
         _this.refresh(_timeRange);
-    })
-    
-    if (this.starts_hidden){
+      });
+
+      if (this.starts_hidden) {
         this.visible = true;
         this.hide();
-    }
-    else{
+      } else {
         this.visible = false;
         this.show();
-    }
-    
-    this.selectedAnnotation = false; // This flag tells the widget if it must display last annotation (false) or clicked annotation (true)
-    this.player.trigger("AnnotationsList.refresh");
-    this.refresh();
-}
-
+      }
 
-IriSP.Widgets.LatestAnnotation.prototype.refresh = function(_timeRange){
-    _timeRange = typeof _timeRange !== 'undefined' ? _timeRange : false ;
-    var _this = this;
-    if (this.hide_without_segment){
-        if (!_timeRange && !this.media.getTimeRange()){
-            var _currentTime = this.media.getCurrentTime();
-            var _currentSegments = this.segments.filter(function(_segment){
-                return (_currentTime >= _segment.begin && _currentTime <= _segment.end)
-            });
-            if (_currentSegments.length == 0){
-                this.currentSegment = false;
-                this.selectedAnnotation = false;
-            }
-            else {
-                this.currentSegment = _currentSegments[0]
-            }
-        }
-        else {
-            var _segmentBegin = _timeRange? _timeRange[0] : this.media.getTimeRange()[0],
-                _segmentEnd = _timeRange? _timeRange[1] : this.media.getTimeRange()[1];
-            if ((!this.currentSegment)||(this.currentSegment.begin != _segmentBegin || this.currentSegment.end != _segmentEnd)) {
-                var _currentSegments = this.segments.filter(function(_segment){
-                    return _segment.begin == _segmentBegin && _segment.end == _segmentEnd
-                });
-                if (_currentSegments.length > 0){
-                    this.selectedAnnotation = false;
-                    this.currentSegment = _currentSegments[0];
-                }
-            }
-        }
-        if (!this.currentSegment){
-            if (this.visible){
-                this.hide();
-            }
-        }
-        else {
-            if (!this.visible){
-                this.show();
-            }
-        }
-    }
-    
-    if (this.visible && !this.selectedAnnotation){
-        var _list = this.getWidgetAnnotations();
-        
-        if(this.filter_by_segment){
-            if (!this.currentSegment) {
-                _list = _list.filter(function(_annotation){
-                    return false;
-                });
-            }
-            else {
-                _list = _list.filter(function(_annotation){
-                    _annotationTime = (_annotation.begin+_annotation.end)/2;
-                    return (_this.currentSegment.begin <= _annotationTime && _this.currentSegment.end >= _annotationTime);
-                });
-            }
-        }
-        _list = _list.sortBy(function(_annotation){
-            return _annotation.created;
-        });
-        
-        var _latestAnnotation = false,
-            _html="",
-            _user_display_string = "",
-            _user = {};
-        if (_list.length != 0){
-            _latestAnnotation = _list.pop();
-            _users = this.source.users_data.filter(function(_user_data){
-                return _user_data.username == _latestAnnotation.creator
-            })
-            if (_users.length == 0){
-                _user.username = _latestAnnotation.creator;
-            }
-            else {
-                _user = _users[0];
-            }
-            _user_display_string = this.make_name_string_function(_user)
-            _html = Mustache.to_html(this.annotationTemplate, {
-                annotation_created: _latestAnnotation.created.toLocaleDateString()+", "+_latestAnnotation.created.toLocaleTimeString(),
-                annotation_creator: _user_display_string,
-                annotation_title: _latestAnnotation.title,
-                annotation_content: _latestAnnotation.description,
-                copy_and_edit_button: this.copy_and_edit_button,
-                button_text: this.l10n.copy_and_edit,
-            });
-        }
-        else {
-            var _empty_message = this.l10n.empty
-            if (this.empty_message) {
-                _empty_message = this.empty_message
-            }
-            _html = "<div class='Ldt-LatestAnnotation-Element Ldt-LatestAnnotation-NoAnnotation'>"+_empty_message+"</div>";
-        }
-        this.annotationContainer_$.html(_html);    
+      this.selectedAnnotation = false; // This flag tells the widget if it must display last annotation (false) or clicked annotation (true)
+      this.player.trigger("AnnotationsList.refresh");
+      this.refresh();
     }
 
-    if(this.copy_and_edit_button){
-        this.copyAndEditButton_$ = this.$.find('.Ldt-LatestAnnotation-CopyEditButton');
+    refresh(_timeRange) {
+      _timeRange = typeof _timeRange !== "undefined" ? _timeRange : false;
+      var _this = this;
+      if (this.hide_without_segment) {
+        if (!_timeRange && !this.media.getTimeRange()) {
+          var _currentTime = this.media.getCurrentTime();
+          var _currentSegments = this.segments.filter(function (_segment) {
+            return (
+              _currentTime >= _segment.begin && _currentTime <= _segment.end
+            );
+          });
+          if (_currentSegments.length == 0) {
+            this.currentSegment = false;
+            this.selectedAnnotation = false;
+          } else {
+            this.currentSegment = _currentSegments[0];
+          }
+        } else {
+          var _segmentBegin = _timeRange
+              ? _timeRange[0]
+              : this.media.getTimeRange()[0],
+            _segmentEnd = _timeRange
+              ? _timeRange[1]
+              : this.media.getTimeRange()[1];
+          if (
+            !this.currentSegment ||
+            this.currentSegment.begin != _segmentBegin ||
+            this.currentSegment.end != _segmentEnd
+          ) {
+            var _currentSegments = this.segments.filter(function (_segment) {
+              return (
+                _segment.begin == _segmentBegin && _segment.end == _segmentEnd
+              );
+            });
+            if (_currentSegments.length > 0) {
+              this.selectedAnnotation = false;
+              this.currentSegment = _currentSegments[0];
+            }
+          }
+        }
+        if (!this.currentSegment) {
+          if (this.visible) {
+            this.hide();
+          }
+        } else {
+          if (!this.visible) {
+            this.show();
+          }
+        }
+      }
+
+      if (this.visible && !this.selectedAnnotation) {
+        var _list = this.getWidgetAnnotations();
+
+        if (this.filter_by_segment) {
+          if (!this.currentSegment) {
+            _list = _list.filter(function (_annotation) {
+              return false;
+            });
+          } else {
+            _list = _list.filter(function (_annotation) {
+              _annotationTime = (_annotation.begin + _annotation.end) / 2;
+              return (
+                _this.currentSegment.begin <= _annotationTime &&
+                _this.currentSegment.end >= _annotationTime
+              );
+            });
+          }
+        }
+        _list = _list.sortBy(function (_annotation) {
+          return _annotation.created;
+        });
+
+        var _latestAnnotation = false,
+          _html = "",
+          _user_display_string = "",
+          _user = {};
+        if (_list.length != 0) {
+          _latestAnnotation = _list.pop();
+          _users = this.source.users_data.filter(function (_user_data) {
+            return _user_data.username == _latestAnnotation.creator;
+          });
+          if (_users.length == 0) {
+            _user.username = _latestAnnotation.creator;
+          } else {
+            _user = _users[0];
+          }
+          _user_display_string = this.make_name_string_function(_user);
+          _html = Mustache.render(this.annotationTemplate, {
+            annotation_created:
+              _latestAnnotation.created.toLocaleDateString() +
+              ", " +
+              _latestAnnotation.created.toLocaleTimeString(),
+            annotation_creator: _user_display_string,
+            annotation_title: _latestAnnotation.title,
+            annotation_content: _latestAnnotation.description,
+            copy_and_edit_button: this.copy_and_edit_button,
+            button_text: this.l10n.copy_and_edit,
+          });
+        } else {
+          var _empty_message = this.l10n.empty;
+          if (this.empty_message) {
+            _empty_message = this.empty_message;
+          }
+          _html =
+            "<div class='Ldt-LatestAnnotation-Element Ldt-LatestAnnotation-NoAnnotation'>" +
+            _empty_message +
+            "</div>";
+        }
+        this.annotationContainer_$.html(_html);
+      }
+
+      if (this.copy_and_edit_button) {
+        this.copyAndEditButton_$ = this.$.find(
+          ".Ldt-LatestAnnotation-CopyEditButton"
+        );
         this.copyAndEditButton_$.click(this.functionWrapper("copy_and_edit"));
-    }
-}
-
-IriSP.Widgets.LatestAnnotation.prototype.copy_and_edit = function(){
-    this.player.trigger("CreateAnnotation.show");
-    if (this.hide_annotations_list){
-        this.player.trigger("AnnotationsList.hide");
+      }
     }
-    annotationText = $('.Ldt-LatestAnnotation-Content').get(0).innerHTML;
-    
-    $('.Ldt-CreateAnnotation-Description').removeClass('empty');
-    $('.Ldt-CreateAnnotation-Description').val(annotationText);
-}
 
-IriSP.Widgets.LatestAnnotation.prototype.hide = function() {
-    if (this.visible){
+    copy_and_edit() {
+      this.player.trigger("CreateAnnotation.show");
+      if (this.hide_annotations_list) {
+        this.player.trigger("AnnotationsList.hide");
+      }
+      annotationText = $(".Ldt-LatestAnnotation-Content").get(0).innerHTML;
+
+      $(".Ldt-CreateAnnotation-Description").removeClass("empty");
+      $(".Ldt-CreateAnnotation-Description").val(annotationText);
+    }
+
+    hide() {
+      if (this.visible) {
         this.visible = false;
-        this.$.find('.Ldt-LatestAnnotation-header').hide();
-        this.annotationContainer_$.hide()
+        this.$.find(".Ldt-LatestAnnotation-header").hide();
+        this.annotationContainer_$.hide();
+      }
     }
-}
 
-IriSP.Widgets.LatestAnnotation.prototype.show = function() {
-    if(!this.visible){
+    show() {
+      if (!this.visible) {
         this.visible = true;
-        this.$.find('.Ldt-LatestAnnotation-header').show();
-        this.annotationContainer_$.show()
+        this.$.find(".Ldt-LatestAnnotation-header").show();
+        this.annotationContainer_$.show();
+      }
     }
-}
+  };
+};
+
+export { LatestAnnotation, latestAnnotationStyles };
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/widgets/LatestAnnotation.module.css	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,63 @@
+.Ldt-LatestAnnotation{
+	background: url(img/pinstripe.png);
+	width: 535px;
+	max-height: 180px;
+	margin: 0px;
+	margin-top: 4px;
+	border-style: solid;
+	border-width: 1px;
+	border-color: #b7b7b7;
+}
+
+.Ldt-LatestAnnotation-Element{
+	margin: 5px;
+	display: inline-block;
+	vertical-align: top;
+}
+
+.Ldt-LatestAnnotation-Box{
+	background-color: #ffffff;
+	margin: 3px;
+}
+
+.Ldt-LatestAnnotation-CreationDate{
+	color: #f7268e;
+}
+
+.Ldt-LatestAnnotation-Content{
+	text-align: justify;
+}
+
+.Ldt-LatestAnnotation-Title{
+	color: #0068c4;
+    font-size: 14px;
+    font-weight: bold;
+}
+
+.Ldt-LatestAnnotation-NoAnnotation{
+	font-size: 14px;
+    font-weight: bold;
+}
+
+.Ldt-LatestAnnotation-CopyEditButton{
+	display: inline-block;
+    background-color: #d93c71;
+    color: #ffffff;
+    float: right;
+    cursor: pointer;
+    height: 14px;
+    width: 100px;
+    margin: 2px;
+    padding: 2px;
+    font-size: 11px;
+    border: 1px solid;
+    border-color: #eca3bc #631e34 #36101c #e16e93;
+    cursor: pointer;
+    text-align: center;
+    vertical-align: middle;
+}
+
+.Ldt-LatestAnnotation-CopyEditButton:hover{
+	background-color: #e15581;
+	border-color: #222222 #e87d9f #f0adc3 #68273c;
+}
\ No newline at end of file
--- a/src/widgets/Markers.css	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,186 +0,0 @@
-
-.Ldt-Markers-Marker {
-    position: absolute; 
-    margin-left: -1px; 
-    border: 1px solid #ffffff;
-}
-
-.Ldt-Markers-MarkerBall {
-	background: #ffffff;
-}
-
-.Ldt-Markers-MarkerBall:hover {
-	background: #bebebe;
-}
-
-.Ldt-Markers-List{
-	overflow: hidden;
-}
-
-.Ldt-Markers-Position {
-    background: #fc00ff;
-    position: relative;
-    left: 0;
-    margin-left: -1px;
-    width: 2px;
-    bottom: -1px;
-    z-index: 80000;
-}
-
-.Ldt-Markers-Inputs{
-	background-color: #e0e0e0;
-	margin-top: 1px;
-}
-
-.Ldt-Markers-RoundButton{
-	display: inline-block;
-    background-color: #d93c71;
-    color: #ffffff;
-    cursor: pointer;
-    height: 20px;
-    width: 20px;
-    border-radius: 20px;
-    font-size: 25px;
-    font-style: bold;
-    border: 1px solid;
-    border-color: #eca3bc #631e34 #36101c #e16e93;
-    cursor: pointer;
-    margin-right: 0px;
-    margin-left: 13px;
-    margin-bottom: 10px;
-    margin-top: 10px;
-    padding: 4px;
-    text-align: center;
-	vertical-align: top;
-	line-height: 20px;
-}
-
-.Ldt-Markers-RoundButton.Ldt-Markers-CannotCreate,
-.Ldt-Markers-RoundButton.Ldt-Markers-PreviewDelete{
-	background-color: #999999;
-	border-color: #797979 #444444 #222222 #696969;
-}
-
-.Ldt-Markers-RoundButton.Ldt-Markers-Delete{
-	line-height: 23px;
-	text-indent: 2px;
-}
-
-.Ldt-Markers-RoundButton.Ldt-Markers-PreviewDelete{
-	line-height: 23px;
-	text-indent: 2px;
-}
-
-.Ldt-Markers-Info{
-	width: 90%;
-	display: inline-block;
-	margin: 0px;
-}
-
-.Ldt-Markers-Screen{
-	margin: 0px;
-}
-
-.Ldt-Markers-ScreenSending, .Ldt-Markers-ScreenFailure, .Ldt-Markers-ScreenSuccess, 
-.Ldt-Markers-ScreenConfirmDelete, .Ldt-Markers-ScreenDeleteSuccess{
-	text-align: center;
-	vertical-align: middle;
-	line-height: 125px;
-	font-size: 18px;
-	font-weight: bold;
-	color: #68273C;
-}
-
-.Ldt-Markers-Screen-InnerBox{
-    border: 1px solid #CCCCCC;
-    background: #FFFFFF;
-    color: #FF3B77; text-align: center;
-    font-size: 13px; font-weight: bold;
-}
-
-a.Ldt-Markers-Close {
-    position: relative; 
-    float: right;
-    right: 2px;
-    top: 2px;
-    display: inline-block; width: 17px; height: 17px; margin: 4px;
-    background: url(img/widget-control.png);
-}
-
-a.Ldt-Markers-Screen-SubmitDelete, a.Ldt-Markers-Screen-CancelDelete {
-	color: #3366BB;
-	cursor: pointer;
-}
-
-a.Ldt-Markers-Screen-SubmitDelete:hover, a.Ldt-Markers-Screen-CancelDelete:hover {
-	color: #3a75ff;
-}
-
-.Ldt-Markers-MarkerDescription{
-	width: 90%;
-	border: 1px solid #68273c;
-	margin: 10px;
-	padding: 10px;
-	background: #ffffff;
-	overflow: scroll;
-}
-
-.Ldt-Markers-MarkerDescription:hover{
-	border: 2px solid #e87d9f;
-}
-
-.Ldt-Markers-MarkerEdit{
-	width: 100%;
-	margin: 10px;
-}
-
-.Ldt-Markers-MarkerTextArea{
-	height: auto;
-	width: auto;
-	max-width: 82%;
-	max-height: 100%;
-	padding: 10px;
-	background: #ffffff;
-	border: 2px solid #e87d9f;
-	margin: 0px;
-}
-
-.Ldt-Markers-Buttons{
-	display: inline-block;
-	width: 17%;
-	vertical-align: top;
-}
-
-.Ldt-Markers-MarkerSend, .Ldt-Markers-MarkerPreviewSend, .Ldt-Markers-MarkerCancel{
-	display: inline-block;
-    background-color: #d93c71;
-    color: #ffffff;
-    cursor: pointer;
-    height: 20px;
-    width: 80px;
-    font-size: 11;
-    font-style: bold;
-    border: 1px solid;
-    border-color: #eca3bc #631e34 #36101c #e16e93;
-    cursor: pointer;
-    margin-right: 5px;
-    margin-left: 5px;
-    margin-bottom: 10px;
-    margin-top: 0px;
-    padding: 4px;
-    text-align: center;
-	vertical-align: top;
-	line-height: 20px;
-	vertical-align: top;
-}
-
-.Ldt-Markers-RoundButton:hover, .Ldt-Markers-MarkerSend:hover, .Ldt-Markers-MarkerPreviewSend:hover, .Ldt-Markers-MarkerCancel:hover{
-	background-color: #e15581;
-	border-color: #222222 #e87d9f #f0adc3 #68273c;
-}
-
-.Ldt-Markers-RoundButton.Ldt-Markers-CannotCreate:hover, 
-.Ldt-Markers-RoundButton.Ldt-Markers-PreviewDelete:hover{	
-	background-color: #999999;
-	border-color: #797979 #444444 #222222 #696969;
-}
\ No newline at end of file
--- a/src/widgets/Markers.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/widgets/Markers.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,632 +1,789 @@
+import Mustache from "mustache";
+import jQuery from "jquery";
 
-IriSP.Widgets.Markers = function(player, config) {
-    IriSP.Widgets.Widget.call(this, player, config);
-};
+import markersStyles from "./Markers.module.css";
 
-IriSP.Widgets.Markers.prototype = new IriSP.Widgets.Widget();
+const Markers = function (ns) {
+  return class extends ns.Widgets.Widget {
+    constructor(player, config) {
+      super(player, config);
+    }
 
-IriSP.Widgets.Markers.prototype.defaults = {
-    pre_draw_callback: function(){
+    static defaults = {
+      pre_draw_callback: function () {
         return this.importUsers();
-    },
-    annotation_type: "markers",
-    line_height: 8,
-    background: "#e0e0e0",
-    marker_color: "#ff80fc",
-    placeholder_color: "#ffffff",
-    hover_color: "#e15581",
-    selected_color: "#74d600",
-    ball_radius: 4,
-    pause_on_write: true,
-    play_on_submit: true,
-    api_serializer: "ldt_annotate",
-    api_endpoint_template_create: "",
-    api_endpoint_template_edit: "",
-    api_endpoint_template_delete: "",
-    api_method_create: "POST",
-    api_method_edit: "PUT",
-    api_method_delete: "DELETE",
-    project_id: "",
-    creator_name: "",
-    after_send_timeout: 0,
-    markers_gap: 2000,
-    allow_empty_markers: false,
-    close_after_send: false,
-    custom_send_button: false,
-    custom_cancel_button: false,
-    preview_mode: false,
-    filter_per_user: false,
-    api_users_endpoint: "",
-    make_username_string_function: function(params){
+      },
+      annotation_type: "markers",
+      line_height: 8,
+      background: "#e0e0e0",
+      marker_color: "#ff80fc",
+      placeholder_color: "#ffffff",
+      hover_color: "#e15581",
+      selected_color: "#74d600",
+      ball_radius: 4,
+      pause_on_write: true,
+      play_on_submit: true,
+      api_serializer: "ldt_annotate",
+      api_endpoint_template_create: "",
+      api_endpoint_template_edit: "",
+      api_endpoint_template_delete: "",
+      api_method_create: "POST",
+      api_method_edit: "PUT",
+      api_method_delete: "DELETE",
+      project_id: "",
+      creator_name: "",
+      after_send_timeout: 0,
+      markers_gap: 2000,
+      allow_empty_markers: false,
+      close_after_send: false,
+      custom_send_button: false,
+      custom_cancel_button: false,
+      preview_mode: false,
+      filter_per_user: false,
+      api_users_endpoint: "",
+      make_username_string_function: function (params) {
         return params.username ? params.username : "Anonymous";
-    },
-    hide_if_empty: false,
-};
+      },
+      hide_if_empty: false,
+    };
 
-IriSP.Widgets.Markers.prototype.template = 
-    '<div class="Ldt-Markers-Display" style="height:{{line_height}}px;">'
-    +     '<div class="Ldt-Markers-List" style="height:{{line_height}}px; position: relative;"></div>'
-    +     '<div class="Ldt-Markers-Position" style="height: {{line_height}}px; top: -{{line_height}};"></div>'
-    + '</div>'
-    + '<div class="Ldt-Markers-Inputs">'
-    +     '<div class="Ldt-Markers-Screen Ldt-Markers-ScreenMain">'
-    +         '<div class="Ldt-Markers-RoundButton Ldt-Markers-CannotCreate" title="{{#preview_mode}}{{l10n.preview_mode_submit}}{{/preview_mode}}{{^preview_mode}}{{l10n.cannot_create}}{{/preview_mode}}">+</div>'
-    +         '<div class="Ldt-Markers-RoundButton Ldt-Markers-Create">+</div>'
-    +         '{{^preview_mode}}<div class="Ldt-Markers-RoundButton Ldt-Markers-Delete">&#10006;</div>{{/preview_mode}}'
-    +         '{{#preview_mode}}<div class="Ldt-Markers-RoundButton Ldt-Markers-PreviewDelete" title="{{l10n.preview_mode_delete}}">&#10006;</div>{{/preview_mode}}'
-    +         '{{#filter_per_user}}{{#preview_mode}}<select class="Ldt-Markers-userFilter-dropdown" id="Ldt-Markers-userFilter"></select>{{/preview_mode}}{{/filter_per_user}}'
-    +         '<div class="Ldt-Markers-Info"></div>'
-    +     '</div>'
-    +     '<div class="Ldt-Markers-Screen Ldt-Markers-ScreenSending">'  
-    +         '<div class="Ldt-Markers-Screen-InnerBox">{{l10n.wait_while_processing}}</div>'
-    +     '</div>'
-    +     '<div class="Ldt-Markers-Screen Ldt-Markers-ScreenSuccess">'
-    +         '<a title="{{l10n.close_widget}}" class="Ldt-Markers-Close" href="#"></a>'    
-    +         '<div class="Ldt-Markers-Screen-InnerBox">{{l10n.annotation_saved}}</div>'
-    +     '</div>'
-    +     '<div class="Ldt-Markers-Screen Ldt-Markers-ScreenDeleteSuccess">'
-    +         '<a title="{{l10n.close_widget}}" class="Ldt-Markers-Close" href="#"></a>'    
-    +         '<div class="Ldt-Markers-Screen-InnerBox">{{l10n.delete_saved}}</div>'
-    +     '</div>'
-    +     '<div class="Ldt-Markers-Screen Ldt-Markers-ScreenFailure">'
-    +         '<a title="{{l10n.close_widget}}" class="Ldt-Markers-Close" href="#"></a>'
-    +         '<div class="Ldt-Markers-Screen-InnerBox">{{l10n.error_while_contacting}}</div>'
-    +     '</div>'
-    +     '<div class="Ldt-Markers-Screen Ldt-Markers-ScreenConfirmDelete">'
-    +         '<a title="{{l10n.close_widget}}" class="Ldt-Markers-Close" href="#"></a>'
-    +         '<div class="Ldt-Markers-Screen-InnerBox">'
-    +           '{{l10n.delete_text}} '
-    +           '<a class="Ldt-Markers-Screen-SubmitDelete">{{l10n.submit_delete}}</a> '
-    +           '<a class="Ldt-Markers-Screen-CancelDelete">{{l10n.cancel}}</a>'
-    +         '</div>'
-    +     '</div>'
-    + '</div>';
+    static template =
+      '<div class="Ldt-Markers-Display" style="height:{{line_height}}px;">' +
+      '<div class="Ldt-Markers-List" style="height:{{line_height}}px; position: relative;"></div>' +
+      '<div class="Ldt-Markers-Position" style="height: {{line_height}}px; top: -{{line_height}};"></div>' +
+      "</div>" +
+      '<div class="Ldt-Markers-Inputs">' +
+      '<div class="Ldt-Markers-Screen Ldt-Markers-ScreenMain">' +
+      '<div class="Ldt-Markers-RoundButton Ldt-Markers-CannotCreate" title="{{#preview_mode}}{{l10n.preview_mode_submit}}{{/preview_mode}}{{^preview_mode}}{{l10n.cannot_create}}{{/preview_mode}}">+</div>' +
+      '<div class="Ldt-Markers-RoundButton Ldt-Markers-Create">+</div>' +
+      '{{^preview_mode}}<div class="Ldt-Markers-RoundButton Ldt-Markers-Delete">&#10006;</div>{{/preview_mode}}' +
+      '{{#preview_mode}}<div class="Ldt-Markers-RoundButton Ldt-Markers-PreviewDelete" title="{{l10n.preview_mode_delete}}">&#10006;</div>{{/preview_mode}}' +
+      '{{#filter_per_user}}{{#preview_mode}}<select class="Ldt-Markers-userFilter-dropdown" id="Ldt-Markers-userFilter"></select>{{/preview_mode}}{{/filter_per_user}}' +
+      '<div class="Ldt-Markers-Info"></div>' +
+      "</div>" +
+      '<div class="Ldt-Markers-Screen Ldt-Markers-ScreenSending">' +
+      '<div class="Ldt-Markers-Screen-InnerBox">{{l10n.wait_while_processing}}</div>' +
+      "</div>" +
+      '<div class="Ldt-Markers-Screen Ldt-Markers-ScreenSuccess">' +
+      '<a title="{{l10n.close_widget}}" class="Ldt-Markers-Close" href="#"></a>' +
+      '<div class="Ldt-Markers-Screen-InnerBox">{{l10n.annotation_saved}}</div>' +
+      "</div>" +
+      '<div class="Ldt-Markers-Screen Ldt-Markers-ScreenDeleteSuccess">' +
+      '<a title="{{l10n.close_widget}}" class="Ldt-Markers-Close" href="#"></a>' +
+      '<div class="Ldt-Markers-Screen-InnerBox">{{l10n.delete_saved}}</div>' +
+      "</div>" +
+      '<div class="Ldt-Markers-Screen Ldt-Markers-ScreenFailure">' +
+      '<a title="{{l10n.close_widget}}" class="Ldt-Markers-Close" href="#"></a>' +
+      '<div class="Ldt-Markers-Screen-InnerBox">{{l10n.error_while_contacting}}</div>' +
+      "</div>" +
+      '<div class="Ldt-Markers-Screen Ldt-Markers-ScreenConfirmDelete">' +
+      '<a title="{{l10n.close_widget}}" class="Ldt-Markers-Close" href="#"></a>' +
+      '<div class="Ldt-Markers-Screen-InnerBox">' +
+      "{{l10n.delete_text}} " +
+      '<a class="Ldt-Markers-Screen-SubmitDelete">{{l10n.submit_delete}}</a> ' +
+      '<a class="Ldt-Markers-Screen-CancelDelete">{{l10n.cancel}}</a>' +
+      "</div>" +
+      "</div>" +
+      "</div>";
 
+    static markerTemplate =
+      '<div class="Ldt-Markers-Marker" style="height:{{height}}px; left:{{left}}px; width: 2px; background-color: black;">' +
+      '<div class="Ldt-Markers-MarkerBall" style="background-color: {{marker_color}}; position: relative; width: {{ball_diameter}}px; height: {{ball_diameter}}px; left: {{ball_left}}px; top: {{ball_top}}px; border: 1px solid; border-radius: {{ball_radius}}px"></div>' +
+      "</div>";
 
-IriSP.Widgets.Markers.prototype.markerTemplate = 
-    '<div class="Ldt-Markers-Marker" style="height:{{height}}px; left:{{left}}px; width: 2px; background-color: black;">' +
-        '<div class="Ldt-Markers-MarkerBall" style="background-color: {{marker_color}}; position: relative; width: {{ball_diameter}}px; height: {{ball_diameter}}px; left: {{ball_left}}px; top: {{ball_top}}px; border: 1px solid; border-radius: {{ball_radius}}px"></div>' + 
-    '</div>';
-
-IriSP.Widgets.Markers.prototype.markerPlaceholderTemplate = 
-    '<div class="Ldt-Markers-Marker Ldt-Markers-PlaceholderMarker" style="height:{{height}}px; left:{{left}}px; width: 2px; background-color: black;">' +
-        '<div class="Ldt-Markers-MarkerBall" style="background-color: {{marker_color}}; position: relative; width: {{ball_diameter}}px; height: {{ball_diameter}}px; left: {{ball_left}}px; top: {{ball_top}}px; border: 1px solid; border-radius: {{ball_radius}}px"></div>' + 
-    '</div>'; 
+    static markerPlaceholderTemplate =
+      '<div class="Ldt-Markers-Marker Ldt-Markers-PlaceholderMarker" style="height:{{height}}px; left:{{left}}px; width: 2px; background-color: black;">' +
+      '<div class="Ldt-Markers-MarkerBall" style="background-color: {{marker_color}}; position: relative; width: {{ball_diameter}}px; height: {{ball_diameter}}px; left: {{ball_left}}px; top: {{ball_top}}px; border: 1px solid; border-radius: {{ball_radius}}px"></div>' +
+      "</div>";
 
-IriSP.Widgets.Markers.prototype.infoTemplate = 
-    '{{^edit}}<div class="Ldt-Markers-MarkerDescription">{{marker_info}}</div>{{/edit}}' +
-    '{{#edit}}<div class="Ldt-Markers-MarkerEdit">' + 
-        '<textarea class="Ldt-Markers-MarkerTextArea" cols="60" rows="4">{{marker_info}}</textarea>' +
-        '<div class="Ldt-Markers-Buttons">' +
-            '{{^preview_mode}}<div class="Ldt-Markers-MarkerSend">{{send}}</div>{{/preview_mode}}' +
-            '{{#preview_mode}}<div class="Ldt-Markers-MarkerPreviewSend" title="{{preview_mode_text}}">{{send}}</div>{{/preview_mode}}' +
-            '<div class="Ldt-Markers-MarkerCancel">{{cancel}}</div>' +
-        '</div>' +
-    '</div>{{/edit}}'
+    static infoTemplate =
+      '{{^edit}}<div class="Ldt-Markers-MarkerDescription">{{marker_info}}</div>{{/edit}}' +
+      '{{#edit}}<div class="Ldt-Markers-MarkerEdit">' +
+      '<textarea class="Ldt-Markers-MarkerTextArea" cols="60" rows="4">{{marker_info}}</textarea>' +
+      '<div class="Ldt-Markers-Buttons">' +
+      '{{^preview_mode}}<div class="Ldt-Markers-MarkerSend">{{send}}</div>{{/preview_mode}}' +
+      '{{#preview_mode}}<div class="Ldt-Markers-MarkerPreviewSend" title="{{preview_mode_text}}">{{send}}</div>{{/preview_mode}}' +
+      '<div class="Ldt-Markers-MarkerCancel">{{cancel}}</div>' +
+      "</div>" +
+      "</div>{{/edit}}";
 
-IriSP.Widgets.Markers.prototype.messages = {
-    en : {
-        send : "Send",
+    static messages =  {
+      en: {
+        send: "Send",
         submit_delete: "Delete",
-        cancel : "Cancel",
+        cancel: "Cancel",
         preview_mode_submit: "You cannot submit a marker in preview mode.",
         preview_mode_delete: "You cannot delete a marker in preview mode",
-        wait_while_processing: "Please wait while your annotation is being processed...",
+        wait_while_processing:
+          "Please wait while your annotation is being processed...",
         delete_text: "The selected marker will be deleted. Continue?",
-        error_while_contacting: "An error happened while contacting the server. Your annotation has not been saved.",
+        error_while_contacting:
+          "An error happened while contacting the server. Your annotation has not been saved.",
         annotation_saved: "Thank you, your annotation has been saved.",
         delete_saved: "Thank you, your annotation has been deleted",
         close_widget: "Close",
-        cannot_create: "Cannot create marker on this timecode"
-    },
-    fr : {
-        send : "Envoyer",
+        cannot_create: "Cannot create marker on this timecode",
+      },
+      fr: {
+        send: "Envoyer",
         submit_delete: "Supprimer",
-        cancel : "Annuler",
-        preview_mode_submit: "Vous ne pouvez pas créer ou éditer de marqueur en mode aperçu",
-        preview_mode_delete: "Vous ne pouvez pas supprimer de marqueur en mode aperçu",
-        wait_while_processing: "Veuillez patienter pendant le traitement de votre annotation...",
+        cancel: "Annuler",
+        preview_mode_submit:
+          "Vous ne pouvez pas créer ou éditer de marqueur en mode aperçu",
+        preview_mode_delete:
+          "Vous ne pouvez pas supprimer de marqueur en mode aperçu",
+        wait_while_processing:
+          "Veuillez patienter pendant le traitement de votre annotation...",
         delete_text: "Le marqueur sélectionné sera supprimé. Continuer?",
-        error_while_contacting: "Une erreur s'est produite en contactant le serveur. Votre annotation n'a pas été enregistrée.",
+        error_while_contacting:
+          "Une erreur s'est produite en contactant le serveur. Votre annotation n'a pas été enregistrée.",
         annotation_saved: "Merci, votre annotation a été enregistrée.",
         delete_saved: "Merci, votre annotation a été supprimée",
         close_widget: "Fermer",
-        cannot_create: "Impossible de créer un marqueur sur ce timecode"
-    }
-}
+        cannot_create: "Impossible de créer un marqueur sur ce timecode",
+      },
+    };
 
-IriSP.Widgets.Markers.prototype.importUsers = function(){
-    if (this.filter_per_user && this.preview_mode){
+    importUsers() {
+      if (this.filter_per_user && this.preview_mode) {
         this.usernames = Array();
-        if (!this.source.users_data && this.api_users_endpoint){
-            var _this = this,
-                _list = this.getWidgetAnnotations(),
-                usernames_list_string = "";
+        if (!this.source.users_data && this.api_users_endpoint) {
+          var _this = this,
+            _list = this.getWidgetAnnotations(),
+            usernames_list_string = "";
 
-            _list.forEach(function(_annotation){
-                if(_this.usernames.indexOf(_annotation.creator) == -1){
-                    _this.usernames.push(_annotation.creator);
-                }
-            });
-            this.usernames.forEach(function(_username){
-                usernames_list_string+=_username+","
-            })
-            usernames_list_string = usernames_list_string.substring(0, usernames_list_string.length - 1);
-            _url = Mustache.to_html(this.api_users_endpoint, {usernames_list_string: encodeURIComponent(usernames_list_string), usernames_list_length: this.usernames.length});
-            return IriSP.jQuery.ajax({
-                async: false,
-                url: _url,
-                type: "GET",
-                success: function(_data) {
-                    _this.source.users_data = _data.objects
-                },
-                error: function(_xhr, _error, _thrown) {
-                    console.log(_xhr)
-                    console.log(_error)
-                    console.log(_thrown)
-                }
-            })
+          _list.forEach(function (_annotation) {
+            if (_this.usernames.indexOf(_annotation.creator) == -1) {
+              _this.usernames.push(_annotation.creator);
+            }
+          });
+          this.usernames.forEach(function (_username) {
+            usernames_list_string += _username + ",";
+          });
+          usernames_list_string = usernames_list_string.substring(
+            0,
+            usernames_list_string.length - 1
+          );
+          _url = Mustache.render(this.api_users_endpoint, {
+            usernames_list_string: encodeURIComponent(usernames_list_string),
+            usernames_list_length: this.usernames.length,
+          });
+          return jQuery.ajax({
+            async: false,
+            url: _url,
+            type: "GET",
+            success: function (_data) {
+              _this.source.users_data = _data.objects;
+            },
+            error: function (_xhr, _error, _thrown) {
+              console.log(_xhr);
+              console.log(_error);
+              console.log(_thrown);
+            },
+          });
         }
+      }
     }
-}
 
-IriSP.Widgets.Markers.prototype.draw = function(){
-    var _this = this;
-    this.renderTemplate();
-    if ((!this.filter_per_user) || (!this.preview_mode) || (this.usernames.length <= 1)){
+    draw() {
+      var _this = this;
+      this.renderTemplate();
+      if (
+        !this.filter_per_user ||
+        !this.preview_mode ||
+        this.usernames.length <= 1
+      ) {
         this.$.find(".Ldt-Markers-userFilter-dropdown").hide();
-    }
-    else {
-        this.usernames.forEach(function(_user){
-            var _users = _this.source.users_data.filter(function(_user_data){
-                return _user_data.username == _user;
+      } else {
+        this.usernames.forEach(function (_user) {
+          var _users = _this.source.users_data.filter(function (_user_data) {
+              return _user_data.username == _user;
             }),
-               _user_data = {};
-            if (_users.length == 0){
-                _user_data.username = _user;
-            }
-            else{
-                _user_data = _users[0];
-            }
-            _this.$.find(".Ldt-Markers-userFilter-dropdown").append("<option value='"+_user+"'>"+_this.make_name_string_function(_user_data)+"</option>")
-        }); 
-        this.$.find(".Ldt-Markers-userFilter-dropdown").change(this.functionWrapper("drawMarkers"))
-        this.$.find(".Ldt-Markers-userFilter-dropdown").change(this.functionWrapper("clearSelectedMarker"))
-        
-    }
-    
-    this.markers = this.getWidgetAnnotations().filter(function(_ann) {
-        return ((_ann.getDuration() == 0) || (_ann.begin == _ann.end));
-    });
-    if (this.hide_if_empty && this.markers.length <= 0){
+            _user_data = {};
+          if (_users.length == 0) {
+            _user_data.username = _user;
+          } else {
+            _user_data = _users[0];
+          }
+          _this.$.find(".Ldt-Markers-userFilter-dropdown").append(
+            "<option value='" +
+              _user +
+              "'>" +
+              _this.make_name_string_function(_user_data) +
+              "</option>"
+          );
+        });
+        this.$.find(".Ldt-Markers-userFilter-dropdown").change(
+          this.functionWrapper("drawMarkers")
+        );
+        this.$.find(".Ldt-Markers-userFilter-dropdown").change(
+          this.functionWrapper("clearSelectedMarker")
+        );
+      }
+
+      this.markers = this.getWidgetAnnotations().filter(function (_ann) {
+        return _ann.getDuration() == 0 || _ann.begin == _ann.end;
+      });
+      if (this.hide_if_empty && this.markers.length <= 0) {
         this.$.hide();
-    } 
-    else {
+      } else {
         this.drawMarkers();
-        
-        this.$.find(".Ldt-Markers-Create").click(this.functionWrapper("onCreateClick"));
-        this.$.find(".Ldt-Markers-Delete").click(this.functionWrapper("onDeleteClick"));
-        this.$.find(".Ldt-Markers-RoundButton").hide()
-        this.updateCreateButtonState(this.media.getCurrentTime())
-        this.$.find(".Ldt-Markers-Screen-SubmitDelete").click(this.functionWrapper("sendDelete"));
-        this.$.find(".Ldt-Markers-Screen-CancelDelete").click(function(){
-            _this.showScreen("Main");
-            _this.cancelEdit();
-        })
+
+        this.$.find(".Ldt-Markers-Create").click(
+          this.functionWrapper("onCreateClick")
+        );
+        this.$.find(".Ldt-Markers-Delete").click(
+          this.functionWrapper("onDeleteClick")
+        );
+        this.$.find(".Ldt-Markers-RoundButton").hide();
+        this.updateCreateButtonState(this.media.getCurrentTime());
+        this.$.find(".Ldt-Markers-Screen-SubmitDelete").click(
+          this.functionWrapper("sendDelete")
+        );
+        this.$.find(".Ldt-Markers-Screen-CancelDelete").click(function () {
+          _this.showScreen("Main");
+          _this.cancelEdit();
+        });
         this.showScreen("Main");
         this.$.css({
-            margin: "1px 0",
-            background: this.background
+          margin: "1px 0",
+          background: this.background,
         });
-        
-        this.$.find(".Ldt-Markers-Close").click(this.functionWrapper("revertToMainScreen"));
-        
+
+        this.$.find(".Ldt-Markers-Close").click(
+          this.functionWrapper("revertToMainScreen")
+        );
+
         this.onMediaEvent("timeupdate", this.functionWrapper("updatePosition"));
-        this.onMediaEvent("timeupdate", this.functionWrapper("updateCreateButtonState"));
+        this.onMediaEvent(
+          "timeupdate",
+          this.functionWrapper("updateCreateButtonState")
+        );
         this.onMediaEvent("play", this.functionWrapper("clearSelectedMarker"));
         this.onMdpEvent("Markers.refresh", this.functionWrapper("drawMarkers"));
-       
+
         this.newMarkerTimeCode = 0;
         this.selectedMarker = false;
+      }
     }
-}
-
 
-IriSP.Widgets.Markers.prototype.updatePosition = function(_time) {    
-    var _x = Math.floor( this.width * _time / this.media.duration);
-    this.$.find('.Ldt-Markers-Position').css({
-        left: _x + "px"
-    });
-}
+    updatePosition(_time) {
+      var _x = Math.floor((this.width * _time) / this.media.duration);
+      this.$.find(".Ldt-Markers-Position").css({
+        left: _x + "px",
+      });
+    }
 
-IriSP.Widgets.Markers.prototype.updateCreateButtonState = function(_time){
-    _this = this
-    var can_create = this.preview_mode? false : this.markers.every(function(_marker){   
-        return ((_time < (_marker.begin-_this.markers_gap))||(_time > (_marker.begin+_this.markers_gap)))
-    });
-    if (can_create){
-        if ((this.$.find(".Ldt-Markers-Create").is(":hidden"))&&(this.$.find(".Ldt-Markers-Delete").is(":hidden")||this.$.find(".Ldt-Markers-PreviewDelete").is(":hidden"))){
-            this.$.find(".Ldt-Markers-RoundButton").hide();
-            this.$.find(".Ldt-Markers-Create").show();
+    updateCreateButtonState(_time) {
+      _this = this;
+      var can_create = this.preview_mode
+        ? false
+        : this.markers.every(function (_marker) {
+            return (
+              _time < _marker.begin - _this.markers_gap ||
+              _time > _marker.begin + _this.markers_gap
+            );
+          });
+      if (can_create) {
+        if (
+          this.$.find(".Ldt-Markers-Create").is(":hidden") &&
+          (this.$.find(".Ldt-Markers-Delete").is(":hidden") ||
+            this.$.find(".Ldt-Markers-PreviewDelete").is(":hidden"))
+        ) {
+          this.$.find(".Ldt-Markers-RoundButton").hide();
+          this.$.find(".Ldt-Markers-Create").show();
         }
+      } else {
+        if (
+          this.$.find(".Ldt-Markers-CannotCreate").is(":hidden") &&
+          (this.$.find(".Ldt-Markers-Delete").is(":hidden") ||
+            this.$.find(".Ldt-Markers-PreviewDelete").is(":hidden"))
+        ) {
+          this.$.find(".Ldt-Markers-RoundButton").hide();
+          this.$.find(".Ldt-Markers-CannotCreate").show();
+        }
+      }
     }
-    else {
-        if ((this.$.find(".Ldt-Markers-CannotCreate").is(":hidden"))&&(this.$.find(".Ldt-Markers-Delete").is(":hidden")||this.$.find(".Ldt-Markers-PreviewDelete").is(":hidden"))){
-            this.$.find(".Ldt-Markers-RoundButton").hide();
-            this.$.find(".Ldt-Markers-CannotCreate").show();
-        }
-    }
-}
 
-IriSP.Widgets.Markers.prototype.onCreateClick = function(){
-    this.pauseOnWrite();
-    if (!this.selectedMarker){
+    onCreateClick() {
+      this.pauseOnWrite();
+      if (!this.selectedMarker) {
         this.newMarkerCurrentTime = this.media.getCurrentTime();
         this.showPlaceholder(this.media.getCurrentTime());
         this.startEdit();
+      }
     }
-}
 
-IriSP.Widgets.Markers.prototype.onDeleteClick = function(){
-    _this = this;
-    this.pauseOnWrite();
-    if(this.selectedMarker){
+    onDeleteClick() {
+      _this = this;
+      this.pauseOnWrite();
+      if (this.selectedMarker) {
         this.showScreen("ConfirmDelete");
-    }
-    else {
+      } else {
         // Click on "x" without a selected marker: back to initial state
         this.cancelEdit();
-    }
-}
-
-IriSP.Widgets.Markers.prototype.startEdit = function(){
-    if (this.selectedMarker){
-        _divHtml = Mustache.to_html(this.infoTemplate, {
-            edit: true,
-            preview_mode: this.preview_mode,
-            preview_mode_text: this.l10n.preview_mode_submit,
-            marker_info: this.selectedMarker.description,
-            send: this.custom_send_button? this.custom_send_button : this.l10n.send,
-            cancel: this.custom_cancel_button? this.custom_cancel_button :this.l10n.cancel
-        })
-    }
-    else {
-        _divHtml = Mustache.to_html(this.infoTemplate, {
-            edit: true,
-            marker_info: "",
-            preview_mode: this.preview_mode,
-            preview_mode_text: this.l10n.preview_mode_submit,
-            send: this.custom_send_button? this.custom_send_button : this.l10n.send,
-            cancel: this.custom_cancel_button? this.custom_cancel_button :this.l10n.cancel
-        })
+      }
     }
-    this.$.find(".Ldt-Markers-Info").html(_divHtml);
-    this.$.find(".Ldt-Markers-MarkerSend").click(this.functionWrapper("onSubmit"));
-    this.$.find(".Ldt-Markers-MarkerCancel").click(this.functionWrapper("cancelEdit"));
-    this.$.find(".Ldt-Markers-MarkerTextArea").bind("change keyup input paste", this.functionWrapper("onDescriptionChange"));
-    this.$.find(".Ldt-Markers-RoundButton").hide();
-    if (this.preview_mode){
-        this.$.find(".Ldt-Markers-PreviewDelete").show(); 
-    }
-    else {
-        this.$.find(".Ldt-Markers-Delete").show();
-    }
-    this.editing = true;
-}
 
-IriSP.Widgets.Markers.prototype.cancelEdit = function(){
-    if (this.selectedMarker){
+    startEdit() {
+      if (this.selectedMarker) {
+        _divHtml = Mustache.render(this.infoTemplate, {
+          edit: true,
+          preview_mode: this.preview_mode,
+          preview_mode_text: this.l10n.preview_mode_submit,
+          marker_info: this.selectedMarker.description,
+          send: this.custom_send_button
+            ? this.custom_send_button
+            : this.l10n.send,
+          cancel: this.custom_cancel_button
+            ? this.custom_cancel_button
+            : this.l10n.cancel,
+        });
+      } else {
+        _divHtml = Mustache.render(this.infoTemplate, {
+          edit: true,
+          marker_info: "",
+          preview_mode: this.preview_mode,
+          preview_mode_text: this.l10n.preview_mode_submit,
+          send: this.custom_send_button
+            ? this.custom_send_button
+            : this.l10n.send,
+          cancel: this.custom_cancel_button
+            ? this.custom_cancel_button
+            : this.l10n.cancel,
+        });
+      }
+      this.$.find(".Ldt-Markers-Info").html(_divHtml);
+      this.$.find(".Ldt-Markers-MarkerSend").click(
+        this.functionWrapper("onSubmit")
+      );
+      this.$.find(".Ldt-Markers-MarkerCancel").click(
+        this.functionWrapper("cancelEdit")
+      );
+      this.$.find(".Ldt-Markers-MarkerTextArea").bind(
+        "change keyup input paste",
+        this.functionWrapper("onDescriptionChange")
+      );
+      this.$.find(".Ldt-Markers-RoundButton").hide();
+      if (this.preview_mode) {
+        this.$.find(".Ldt-Markers-PreviewDelete").show();
+      } else {
+        this.$.find(".Ldt-Markers-Delete").show();
+      }
+      this.editing = true;
+    }
+
+    cancelEdit() {
+      if (this.selectedMarker) {
         // Click on "cancel" while editing a marker: back to visualization state
-        _divHtml = Mustache.to_html(this.infoTemplate, {
-            edit: false,
-            marker_info: this.selectedMarker.description,
-        })
+        _divHtml = Mustache.render(this.infoTemplate, {
+          edit: false,
+          marker_info: this.selectedMarker.description,
+        });
         this.$.find(".Ldt-Markers-Info").html(_divHtml);
-        if (!this.preview_mode){
-            this.$.find(".Ldt-Markers-MarkerDescription").click(this.functionWrapper("startEdit"));
+        if (!this.preview_mode) {
+          this.$.find(".Ldt-Markers-MarkerDescription").click(
+            this.functionWrapper("startEdit")
+          );
         }
-    }
-    else {
+      } else {
         // Click on "cancel" while editing a marker: back to initial state
         this.hidePlaceholder();
         this.$.find(".Ldt-Markers-Info").html("");
-        this.$.find(".Ldt-Markers-RoundButton").hide()
-        this.$.find(".Ldt-Markers-Create").show()
-        this.updateCreateButtonState(this.media.getCurrentTime())
+        this.$.find(".Ldt-Markers-RoundButton").hide();
+        this.$.find(".Ldt-Markers-Create").show();
+        this.updateCreateButtonState(this.media.getCurrentTime());
+      }
+      this.editing = false;
     }
-    this.editing = false;
-}
 
-IriSP.Widgets.Markers.prototype.onDescriptionChange = function(){
-    // Returns false if the textarea is empty, true if there is text in it
-    if(!this.allow_empty_markers){
+    onDescriptionChange() {
+      // Returns false if the textarea is empty, true if there is text in it
+      if (!this.allow_empty_markers) {
         var _field = this.$.find(".Ldt-Markers-MarkerTextArea"),
-            _contents = _field.val();
+          _contents = _field.val();
         _field.css("border-color", !!_contents ? "#e87d9f" : "#ff0000");
         if (!!_contents) {
-            _field.removeClass("empty");
+          _field.removeClass("empty");
         } else {
-            _field.addClass("empty");
+          _field.addClass("empty");
         }
         this.pauseOnWrite();
         return !!_contents;
-    }
-    else {
+      } else {
         // If the widget is configured to allow to post empty markers, it returns true
-        return true
+        return true;
+      }
     }
-};
 
-IriSP.Widgets.Markers.prototype.pauseOnWrite = function(){
-    if (this.pause_on_write && !this.media.getPaused()) {
+    pauseOnWrite() {
+      if (this.pause_on_write && !this.media.getPaused()) {
         this.media.pause();
+      }
     }
-};
 
-IriSP.Widgets.Markers.prototype.showScreen = function(_screenName) {
-    this.$.find('.Ldt-Markers-Screen' + _screenName).show()
-        .siblings().hide();
-}
+    showScreen(_screenName) {
+      this.$.find(".Ldt-Markers-Screen" + _screenName)
+        .show()
+        .siblings()
+        .hide();
+    }
 
-IriSP.Widgets.Markers.prototype.revertToMainScreen = function(){
-    if (this.$.find(".Ldt-Markers-ScreenMain").is(":hidden")){
+    revertToMainScreen() {
+      if (this.$.find(".Ldt-Markers-ScreenMain").is(":hidden")) {
         this.showScreen("Main");
         this.cancelEdit();
-        if (this.selectedMarker){
-            this.$.find(".Ldt-Markers-RoundButton").hide();
-            if (this.preview_mode){
-                this.$.find(".Ldt-Markers-PreviewDelete").show(); 
-            }
-            else {
-                this.$.find(".Ldt-Markers-Delete").show();
-            }
+        if (this.selectedMarker) {
+          this.$.find(".Ldt-Markers-RoundButton").hide();
+          if (this.preview_mode) {
+            this.$.find(".Ldt-Markers-PreviewDelete").show();
+          } else {
+            this.$.find(".Ldt-Markers-Delete").show();
+          }
+        } else {
+          this.$.find(".Ldt-Markers-RoundButton").hide();
+          this.$.find(".Ldt-Markers-Create").show();
+          this.updateCreateButtonState();
         }
-        else {
-            this.$.find(".Ldt-Markers-RoundButton").hide();
-            this.$.find(".Ldt-Markers-Create").show();
-            this.updateCreateButtonState();
-        }
+      }
     }
-}
 
-IriSP.Widgets.Markers.prototype.hidePlaceholder = function(){
-    this.$.find(".Ldt-Markers-PlaceholderMarker").remove();
-}
+    hidePlaceholder() {
+      this.$.find(".Ldt-Markers-PlaceholderMarker").remove();
+    }
 
-IriSP.Widgets.Markers.prototype.showPlaceholder = function(_time){   
-    var _scale = this.width / this.source.getDuration(),
-        _left = _time * _scale -1,
+    showPlaceholder(_time) {
+      var _scale = this.width / this.source.getDuration(),
+        _left = _time * _scale - 1,
         _data = {
-            left: _left,
-            height: this.line_height-1,
-            ball_top: (this.ball_radius*2 > this.line_height) ? 0 : ((this.line_height - this.ball_radius*2)/2)-1,
-            ball_radius: (this.ball_radius*2 > this.line_height) ? this.line_height/2 : this.ball_radius,
-            ball_diameter: (this.ball_radius*2 > this.line_height) ? this.line_height/2 : this.ball_radius*2,
-            ball_left: -this.ball_radius,
-            marker_color: this.placeholder_color
+          left: _left,
+          height: this.line_height - 1,
+          ball_top:
+            this.ball_radius * 2 > this.line_height
+              ? 0
+              : (this.line_height - this.ball_radius * 2) / 2 - 1,
+          ball_radius:
+            this.ball_radius * 2 > this.line_height
+              ? this.line_height / 2
+              : this.ball_radius,
+          ball_diameter:
+            this.ball_radius * 2 > this.line_height
+              ? this.line_height / 2
+              : this.ball_radius * 2,
+          ball_left: -this.ball_radius,
+          marker_color: this.placeholder_color,
         },
-        _html = Mustache.to_html(this.markerPlaceholderTemplate, _data),
-        _el = IriSP.jQuery(_html);
-        
-    list_$ = this.$.find(".Ldt-Markers-List");
-    _el.appendTo(list_$);
-}
+        _html = Mustache.render(this.markerPlaceholderTemplate, _data),
+        _el = jQuery(_html);
 
-IriSP.Widgets.Markers.prototype.clearSelectedMarker = function(){
-    if (this.selectedMarker){
+      list_$ = this.$.find(".Ldt-Markers-List");
+      _el.appendTo(list_$);
+    }
+
+    clearSelectedMarker() {
+      if (this.selectedMarker) {
         var _divHtml = "";
-        
+
         this.selectedMarker = false;
         this.$.find(".Ldt-Markers-Info").html(_divHtml);
         this.$.find(".Ldt-Markers-RoundButton").hide();
         this.$.find(".Ldt-Markers-Create").show();
         this.$.find(".Ldt-Markers-MarkerBall").toggleClass("selected", false);
-        this.updateCreateButtonState(this.media.getCurrentTime())
+        this.updateCreateButtonState(this.media.getCurrentTime());
+      }
     }
-}
 
-IriSP.Widgets.Markers.prototype.drawMarkers = function(){
-    var _this = this,
+    drawMarkers() {
+      var _this = this,
         _scale = this.width / this.source.getDuration(),
-        list_$ = this.$.find('.Ldt-Markers-List'),
+        list_$ = this.$.find(".Ldt-Markers-List"),
         _displayed_markers = this.markers;
 
-    this.$.remove("Ldt-Markers-Marker");
-    list_$.html("");
-    
-    if (this.filter_per_user && this.usernames.length > 1){
-        var _username = this.$.find(".Ldt-Markers-userFilter-dropdown")[0].options[this.$.find(".Ldt-Markers-userFilter-dropdown")[0].selectedIndex].value;
-        _displayed_markers = _displayed_markers.filter(function(_marker){
-            return _marker.creator == _username;
-        })
-    }
-    
-    _displayed_markers.forEach(function(_marker){
-        var _left = _marker.begin * _scale -1,
-            _data = {
-                left: _left,
-                height: _this.line_height-1,
-                ball_top: (_this.ball_radius*2 > _this.line_height) ? 0 : ((_this.line_height - _this.ball_radius*2)/2)-1,
-                ball_radius: (_this.ball_radius*2 > _this.line_height) ? _this.line_height/2 : _this.ball_radius,
-                ball_diameter: (_this.ball_radius*2 > _this.line_height) ? _this.line_height/2 : _this.ball_radius*2,
-                ball_left: -_this.ball_radius,
-                marker_color: ((_this.selectedMarker)&&(_this.selectedMarker.id == _marker.id))? _this.selected_color : _this.marker_color
-            },
-            _html = Mustache.to_html(_this.markerTemplate, _data),
-            _el = IriSP.jQuery(_html);
-        
-        if ((_this.selectedMarker)&&(_this.selectedMarker.id == _marker.id)){
-            _el.children().toggleClass("selected", true);
+      this.$.remove("Ldt-Markers-Marker");
+      list_$.html("");
+
+      if (this.filter_per_user && this.usernames.length > 1) {
+        var _username = this.$.find(".Ldt-Markers-userFilter-dropdown")[0]
+          .options[
+          this.$.find(".Ldt-Markers-userFilter-dropdown")[0].selectedIndex
+        ].value;
+        _displayed_markers = _displayed_markers.filter(function (_marker) {
+          return _marker.creator == _username;
+        });
+      }
+
+      _displayed_markers.forEach(function (_marker) {
+        var _left = _marker.begin * _scale - 1,
+          _data = {
+            left: _left,
+            height: _this.line_height - 1,
+            ball_top:
+              _this.ball_radius * 2 > _this.line_height
+                ? 0
+                : (_this.line_height - _this.ball_radius * 2) / 2 - 1,
+            ball_radius:
+              _this.ball_radius * 2 > _this.line_height
+                ? _this.line_height / 2
+                : _this.ball_radius,
+            ball_diameter:
+              _this.ball_radius * 2 > _this.line_height
+                ? _this.line_height / 2
+                : _this.ball_radius * 2,
+            ball_left: -_this.ball_radius,
+            marker_color:
+              _this.selectedMarker && _this.selectedMarker.id == _marker.id
+                ? _this.selected_color
+                : _this.marker_color,
+          },
+          _html = Mustache.render(_this.markerTemplate, _data),
+          _el = jQuery(_html);
+
+        if (_this.selectedMarker && _this.selectedMarker.id == _marker.id) {
+          _el.children().toggleClass("selected", true);
         }
-        
-        _el.mouseover(function(){
-                if (!((_this.selectedMarker)&&(_this.selectedMarker.id == _marker.id))){
-                    _el.children().css("background-color", _this.hover_color);
-                };
-            })
-           .mouseout(function(){
-              if (!((_this.selectedMarker)&&(_this.selectedMarker.id == _marker.id))){
-                  _el.children().css("background-color", _this.marker_color);
-              };
-           })
-           .click(function(){
-               _this.showScreen("Main");
-               _this.cancelEdit();
-               _this.hidePlaceholder();
-               if (!((_this.selectedMarker)&&(_this.selectedMarker.id == _marker.id))){
-                  // if there either is no marker selected or we click a different marker
-                  list_$.find(".Ldt-Markers-MarkerBall").css("background-color", _this.marker_color)
-                  list_$.find(".Ldt-Markers-MarkerBall").toggleClass("selected", false);
-                  _el.children().toggleClass("selected", true);
-                  _el.children().css("background-color", _this.selected_color)
-                  _this.selectedMarker = _marker;
-                  
-                  _divHtml = Mustache.to_html(_this.infoTemplate, {
-                      edit: false,
-                      marker_info: _marker.description,
-                  })
-                  
-                  _this.$.find(".Ldt-Markers-Info").html(_divHtml);
-                  if (!_this.preview_mode){
-                      _this.$.find(".Ldt-Markers-MarkerDescription").click(_this.functionWrapper("startEdit"));
-                  }
-                  _this.$.find(".Ldt-Markers-RoundButton").hide();
-                  if (_this.preview_mode){
-                      _this.$.find(".Ldt-Markers-PreviewDelete").show(); 
-                  }
-                  else {
-                      _this.$.find(".Ldt-Markers-Delete").show();
-                  }
+
+        _el
+          .mouseover(function () {
+            if (
+              !(_this.selectedMarker && _this.selectedMarker.id == _marker.id)
+            ) {
+              _el.children().css("background-color", _this.hover_color);
+            }
+          })
+          .mouseout(function () {
+            if (
+              !(_this.selectedMarker && _this.selectedMarker.id == _marker.id)
+            ) {
+              _el.children().css("background-color", _this.marker_color);
+            }
+          })
+          .click(function () {
+            _this.showScreen("Main");
+            _this.cancelEdit();
+            _this.hidePlaceholder();
+            if (
+              !(_this.selectedMarker && _this.selectedMarker.id == _marker.id)
+            ) {
+              // if there either is no marker selected or we click a different marker
+              list_$
+                .find(".Ldt-Markers-MarkerBall")
+                .css("background-color", _this.marker_color);
+              list_$
+                .find(".Ldt-Markers-MarkerBall")
+                .toggleClass("selected", false);
+              _el.children().toggleClass("selected", true);
+              _el.children().css("background-color", _this.selected_color);
+              _this.selectedMarker = _marker;
+
+              _divHtml = Mustache.render(_this.infoTemplate, {
+                edit: false,
+                marker_info: _marker.description,
+              });
 
-               }
-               else {
-                   // if we click the currently selected marker, we unselect it
-                   _el.children().css("background-color", _this.hover_color);
-                   _this.clearSelectedMarker();
-               }
-               
-               if (_this.selectedMarker) {
-                   // Only if we select a new marker do we pause video and time jump
-                   _this.media.pause();
-                   _marker.trigger("click");
-               }
-           })
-           .appendTo(list_$);
-    })
-}
+              _this.$.find(".Ldt-Markers-Info").html(_divHtml);
+              if (!_this.preview_mode) {
+                _this.$.find(".Ldt-Markers-MarkerDescription").click(
+                  _this.functionWrapper("startEdit")
+                );
+              }
+              _this.$.find(".Ldt-Markers-RoundButton").hide();
+              if (_this.preview_mode) {
+                _this.$.find(".Ldt-Markers-PreviewDelete").show();
+              } else {
+                _this.$.find(".Ldt-Markers-Delete").show();
+              }
+            } else {
+              // if we click the currently selected marker, we unselect it
+              _el.children().css("background-color", _this.hover_color);
+              _this.clearSelectedMarker();
+            }
 
+            if (_this.selectedMarker) {
+              // Only if we select a new marker do we pause video and time jump
+              _this.media.pause();
+              _marker.trigger("click");
+            }
+          })
+          .appendTo(list_$);
+      });
+    }
 
-IriSP.Widgets.Markers.prototype.onSubmit = function(){
-    
-    /* If mandatory fields are empty, we cancel the sending */
-    if (!this.allow_empty_markers && !this.onDescriptionChange()){
+    onSubmit() {
+      /* If mandatory fields are empty, we cancel the sending */
+      if (!this.allow_empty_markers && !this.onDescriptionChange()) {
         return false;
-    }
-    
-    /* We pause the video if it's still playing */
-    if (!this.media.getPaused()){
+      }
+
+      /* We pause the video if it's still playing */
+      if (!this.media.getPaused()) {
         this.media.pause();
-    }
-    
-    var _this = this,
-        _exportedAnnotations = new IriSP.Model.List(this.player.sourceManager), /* We create a List to send to the server that will contains the annotation */
-        _export = this.player.sourceManager.newLocalSource({serializer: IriSP.serializers[this.api_serializer]}), /* We create a source object using a specific serializer for export */
-        _annotationTypes = this.source.getAnnotationTypes().searchByTitle(this.annotation_type, true), /* We get the AnnotationType in which the annotation will be added */
-        _annotationType = (_annotationTypes.length ? _annotationTypes[0] : new IriSP.Model.AnnotationType(false, _export)); /* If it doesn't already exists, we create it */
-    if (this.selectedMarker){
+      }
+
+      var _this = this,
+        _exportedAnnotations = new ns.Model.List(
+          this.player.sourceManager
+        ) /* We create a List to send to the server that will contains the annotation */,
+        _export = this.player.sourceManager.newLocalSource({
+          serializer: ns.serializers[this.api_serializer],
+        }) /* We create a source object using a specific serializer for export */,
+        _annotationTypes = this.source
+          .getAnnotationTypes()
+          .searchByTitle(
+            this.annotation_type,
+            true
+          ) /* We get the AnnotationType in which the annotation will be added */,
+        _annotationType = _annotationTypes.length
+          ? _annotationTypes[0]
+          : new ns.Model.AnnotationType(
+              false,
+              _export
+            ); /* If it doesn't already exists, we create it */
+      if (this.selectedMarker) {
         var _annotation = this.selectedMarker,
-            _url = Mustache.to_html(this.api_endpoint_template_edit, {annotation_id: this.selectedMarker ? this.selectedMarker.id : ""});
-        _annotation.source = _export
-        _annotation.description = this.$.find(".Ldt-Markers-MarkerTextArea").val(); /* Description field */
-    }
-    else {
-        var _annotation = new IriSP.Model.Annotation(false, _export),
-            _url = Mustache.to_html(this.api_endpoint_template_create);
-        
+          _url = Mustache.render(this.api_endpoint_template_edit, {
+            annotation_id: this.selectedMarker ? this.selectedMarker.id : "",
+          });
+        _annotation.source = _export;
+        _annotation.description = this.$.find(
+          ".Ldt-Markers-MarkerTextArea"
+        ).val(); /* Description field */
+      } else {
+        var _annotation = new ns.Model.Annotation(false, _export),
+          _url = Mustache.render(this.api_endpoint_template_create);
+
         /* If we created an AnnotationType on the spot ... */
         if (!_annotationTypes.length) {
-            /* ... We must not send its id to the server ... */
-            _annotationType.dont_send_id = true;
-            /* ... And we must include its title. */
-            _annotationType.title = this.annotation_type;
+          /* ... We must not send its id to the server ... */
+          _annotationType.dont_send_id = true;
+          /* ... And we must include its title. */
+          _annotationType.title = this.annotation_type;
         }
-        
-        _annotation.setMedia(this.source.currentMedia.id); /* Annotated media ID */
-        if (!this.selectedMarker){
-            _annotation.setBegin(this.newMarkerCurrentTime);
-            _annotation.setEnd(this.newMarkerCurrentTime);
+
+        _annotation.setMedia(
+          this.source.currentMedia.id
+        ); /* Annotated media ID */
+        if (!this.selectedMarker) {
+          _annotation.setBegin(this.newMarkerCurrentTime);
+          _annotation.setEnd(this.newMarkerCurrentTime);
         }
-        _annotation.setAnnotationType(_annotationType.id); /* AnnotationType ID */
-        if (this.project_id != ""){
-            /* Project id, only if it's been specifiec in the config */
-            _annotation.project_id = this.project_id;
+        _annotation.setAnnotationType(
+          _annotationType.id
+        ); /* AnnotationType ID */
+        if (this.project_id != "") {
+          /* Project id, only if it's been specifiec in the config */
+          _annotation.project_id = this.project_id;
         }
         _annotation.created = new Date(); /* Creation date */
-        _annotation.description = this.$.find(".Ldt-Markers-MarkerTextArea").val(); /* Description field */
+        _annotation.description = this.$.find(
+          ".Ldt-Markers-MarkerTextArea"
+        ).val(); /* Description field */
         _annotation.creator = this.creator_name;
-    }
-    _annotation.project_id = this.project_id;
-    
-    _exportedAnnotations.push(_annotation); /* We add the annotation in the list to export */
-    _export.addList("annotation",_exportedAnnotations); /* We add the list to the source object */ 
-    
-    /* We send the AJAX request to the server ! */
-    IriSP.jQuery.ajax({
+      }
+      _annotation.project_id = this.project_id;
+
+      _exportedAnnotations.push(
+        _annotation
+      ); /* We add the annotation in the list to export */
+      _export.addList(
+        "annotation",
+        _exportedAnnotations
+      ); /* We add the list to the source object */
+
+      /* We send the AJAX request to the server ! */
+      jQuery.ajax({
         url: _url,
-        type: this.selectedMarker ? this.api_method_edit : this.api_method_create,
-        contentType: 'application/json',
+        type: this.selectedMarker
+          ? this.api_method_edit
+          : this.api_method_create,
+        contentType: "application/json",
         data: _export.serialize(),
-        success: function(_data) {
-            _this.showScreen('Success');
-            window.setTimeout(_this.functionWrapper("revertToMainScreen"),(_this.after_send_timeout || 5000));
-            _export.getAnnotations().removeElement(_annotation, true); /* We delete the sent annotation to avoid redundancy */
-            _export.deSerialize(_data); /* Data deserialization */
-            _annotation.id = _data.id;
-            _this.source.merge(_export); /* We merge the deserialized data with the current source data */
-            if (_this.pause_on_write && _this.media.getPaused() && _this.play_on_submit) {
-                _this.media.play();
-            }
-            _this.markers.push(_annotation);
-            _this.selectedMarker = _annotation;
-            _this.drawMarkers();
-            _this.player.trigger("AnnotationsList.refresh");
-            _this.player.trigger("Markers.refresh");
+        success: function (_data) {
+          _this.showScreen("Success");
+          window.setTimeout(
+            _this.functionWrapper("revertToMainScreen"),
+            _this.after_send_timeout || 5000
+          );
+          _export
+            .getAnnotations()
+            .removeElement(
+              _annotation,
+              true
+            ); /* We delete the sent annotation to avoid redundancy */
+          _export.deSerialize(_data); /* Data deserialization */
+          _annotation.id = _data.id;
+          _this.source.merge(
+            _export
+          ); /* We merge the deserialized data with the current source data */
+          if (
+            _this.pause_on_write &&
+            _this.media.getPaused() &&
+            _this.play_on_submit
+          ) {
+            _this.media.play();
+          }
+          _this.markers.push(_annotation);
+          _this.selectedMarker = _annotation;
+          _this.drawMarkers();
+          _this.player.trigger("AnnotationsList.refresh");
+          _this.player.trigger("Markers.refresh");
+        },
+        error: function (_xhr, _error, _thrown) {
+          ns.log("Error when sending annotation", _thrown);
+          _export.getAnnotations().removeElement(_annotation, true);
+          _this.showScreen("Failure");
+          window.setTimeout(
+            _this.functionWrapper("revertToMainScreen"),
+            _this.after_send_timeout || 5000
+          );
         },
-        error: function(_xhr, _error, _thrown) {
-            IriSP.log("Error when sending annotation", _thrown);
-            _export.getAnnotations().removeElement(_annotation, true);
-            _this.showScreen('Failure');
-            window.setTimeout(_this.functionWrapper("revertToMainScreen"),(_this.after_send_timeout || 5000));
-        }
-    });
-    this.showScreen('Sending');
-    
-    return false;
+      });
+      this.showScreen("Sending");
+
+      return false;
+    }
+
+    sendDelete() {
+      _this = this;
+      _url = Mustache.render(this.api_endpoint_template_delete, {
+        annotation_id: this.selectedMarker ? this.selectedMarker.id : "",
+        project_id: this.selectedMarker.project_id
+          ? this.selectedMarker.project_id
+          : this.project_id,
+      });
+      jQuery.ajax({
+        url: _url,
+        type: this.api_method_delete,
+        contentType: "application/json",
+        success: function (_data) {
+          _this.showScreen("DeleteSuccess");
+          window.setTimeout(
+            _this.functionWrapper("revertToMainScreen"),
+            _this.after_send_timeout || 5000
+          );
+          if (
+            _this.pause_on_write &&
+            _this.media.getPaused() &&
+            _this.play_on_submit
+          ) {
+            _this.media.play();
+          }
+          _this.markers.removeElement(_this.selectedMarker);
+          _this.selectedMarker = false;
+          _this.player.trigger("AnnotationsList.refresh");
+          _this.player.trigger("Markers.refresh");
+        },
+        error: function (_xhr, _error, _thrown) {
+          ns.log("Error when sending annotation", _thrown);
+          _this.showScreen("Failure");
+          window.setTimeout(
+            _this.functionWrapper("revertToMainScreen"),
+            _this.after_send_timeout || 5000
+          );
+        },
+      });
+      this.showScreen("Sending");
+    }
+  };
 };
 
-IriSP.Widgets.Markers.prototype.sendDelete = function(){
-    _this = this;
-    _url = Mustache.to_html(this.api_endpoint_template_delete, {annotation_id: this.selectedMarker ? this.selectedMarker.id : "", project_id: this.selectedMarker.project_id? this.selectedMarker.project_id : this.project_id});
-    IriSP.jQuery.ajax({
-        url: _url,
-        type: this.api_method_delete,
-        contentType: 'application/json',
-        success: function(_data) {
-            _this.showScreen('DeleteSuccess');
-            window.setTimeout(_this.functionWrapper("revertToMainScreen"),(_this.after_send_timeout || 5000));
-            if (_this.pause_on_write && _this.media.getPaused() && _this.play_on_submit) {
-                _this.media.play();
-            }
-            _this.markers.removeElement(_this.selectedMarker);
-            _this.selectedMarker = false
-            _this.player.trigger("AnnotationsList.refresh");
-            _this.player.trigger("Markers.refresh");
-        },
-        error: function(_xhr, _error, _thrown) {
-            IriSP.log("Error when sending annotation", _thrown);
-            _this.showScreen('Failure');
-            window.setTimeout(_this.functionWrapper("revertToMainScreen"),(_this.after_send_timeout || 5000));
-        }
-    });
-    this.showScreen("Sending")
-}
\ No newline at end of file
+export { Markers, markersStyles };
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/widgets/Markers.module.css	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,186 @@
+
+.Ldt-Markers-Marker {
+    position: absolute; 
+    margin-left: -1px; 
+    border: 1px solid #ffffff;
+}
+
+.Ldt-Markers-MarkerBall {
+	background: #ffffff;
+}
+
+.Ldt-Markers-MarkerBall:hover {
+	background: #bebebe;
+}
+
+.Ldt-Markers-List{
+	overflow: hidden;
+}
+
+.Ldt-Markers-Position {
+    background: #fc00ff;
+    position: relative;
+    left: 0;
+    margin-left: -1px;
+    width: 2px;
+    bottom: -1px;
+    z-index: 80000;
+}
+
+.Ldt-Markers-Inputs{
+	background-color: #e0e0e0;
+	margin-top: 1px;
+}
+
+.Ldt-Markers-RoundButton{
+	display: inline-block;
+    background-color: #d93c71;
+    color: #ffffff;
+    cursor: pointer;
+    height: 20px;
+    width: 20px;
+    border-radius: 20px;
+    font-size: 25px;
+    font-style: bold;
+    border: 1px solid;
+    border-color: #eca3bc #631e34 #36101c #e16e93;
+    cursor: pointer;
+    margin-right: 0px;
+    margin-left: 13px;
+    margin-bottom: 10px;
+    margin-top: 10px;
+    padding: 4px;
+    text-align: center;
+	vertical-align: top;
+	line-height: 20px;
+}
+
+.Ldt-Markers-RoundButton.Ldt-Markers-CannotCreate,
+.Ldt-Markers-RoundButton.Ldt-Markers-PreviewDelete{
+	background-color: #999999;
+	border-color: #797979 #444444 #222222 #696969;
+}
+
+.Ldt-Markers-RoundButton.Ldt-Markers-Delete{
+	line-height: 23px;
+	text-indent: 2px;
+}
+
+.Ldt-Markers-RoundButton.Ldt-Markers-PreviewDelete{
+	line-height: 23px;
+	text-indent: 2px;
+}
+
+.Ldt-Markers-Info{
+	width: 90%;
+	display: inline-block;
+	margin: 0px;
+}
+
+.Ldt-Markers-Screen{
+	margin: 0px;
+}
+
+.Ldt-Markers-ScreenSending, .Ldt-Markers-ScreenFailure, .Ldt-Markers-ScreenSuccess, 
+.Ldt-Markers-ScreenConfirmDelete, .Ldt-Markers-ScreenDeleteSuccess{
+	text-align: center;
+	vertical-align: middle;
+	line-height: 125px;
+	font-size: 18px;
+	font-weight: bold;
+	color: #68273C;
+}
+
+.Ldt-Markers-Screen-InnerBox{
+    border: 1px solid #CCCCCC;
+    background: #FFFFFF;
+    color: #FF3B77; text-align: center;
+    font-size: 13px; font-weight: bold;
+}
+
+a.Ldt-Markers-Close {
+    position: relative; 
+    float: right;
+    right: 2px;
+    top: 2px;
+    display: inline-block; width: 17px; height: 17px; margin: 4px;
+    background: url(img/widget-control.png);
+}
+
+a.Ldt-Markers-Screen-SubmitDelete, a.Ldt-Markers-Screen-CancelDelete {
+	color: #3366BB;
+	cursor: pointer;
+}
+
+a.Ldt-Markers-Screen-SubmitDelete:hover, a.Ldt-Markers-Screen-CancelDelete:hover {
+	color: #3a75ff;
+}
+
+.Ldt-Markers-MarkerDescription{
+	width: 90%;
+	border: 1px solid #68273c;
+	margin: 10px;
+	padding: 10px;
+	background: #ffffff;
+	overflow: scroll;
+}
+
+.Ldt-Markers-MarkerDescription:hover{
+	border: 2px solid #e87d9f;
+}
+
+.Ldt-Markers-MarkerEdit{
+	width: 100%;
+	margin: 10px;
+}
+
+.Ldt-Markers-MarkerTextArea{
+	height: auto;
+	width: auto;
+	max-width: 82%;
+	max-height: 100%;
+	padding: 10px;
+	background: #ffffff;
+	border: 2px solid #e87d9f;
+	margin: 0px;
+}
+
+.Ldt-Markers-Buttons{
+	display: inline-block;
+	width: 17%;
+	vertical-align: top;
+}
+
+.Ldt-Markers-MarkerSend, .Ldt-Markers-MarkerPreviewSend, .Ldt-Markers-MarkerCancel{
+	display: inline-block;
+    background-color: #d93c71;
+    color: #ffffff;
+    cursor: pointer;
+    height: 20px;
+    width: 80px;
+    font-size: 11;
+    font-style: bold;
+    border: 1px solid;
+    border-color: #eca3bc #631e34 #36101c #e16e93;
+    cursor: pointer;
+    margin-right: 5px;
+    margin-left: 5px;
+    margin-bottom: 10px;
+    margin-top: 0px;
+    padding: 4px;
+    text-align: center;
+	vertical-align: top;
+	line-height: 20px;
+	vertical-align: top;
+}
+
+.Ldt-Markers-RoundButton:hover, .Ldt-Markers-MarkerSend:hover, .Ldt-Markers-MarkerPreviewSend:hover, .Ldt-Markers-MarkerCancel:hover{
+	background-color: #e15581;
+	border-color: #222222 #e87d9f #f0adc3 #68273c;
+}
+
+.Ldt-Markers-RoundButton.Ldt-Markers-CannotCreate:hover, 
+.Ldt-Markers-RoundButton.Ldt-Markers-PreviewDelete:hover{	
+	background-color: #999999;
+	border-color: #797979 #444444 #222222 #696969;
+}
\ No newline at end of file
--- a/src/widgets/MashupPlayer.css	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,11 +0,0 @@
-.Ldt-MashupPlayer-Media {
-    position: absolute;
-}
-
-.Ldt-MashupPlayer-Waiting {
-    position: absolute; left: 0; top: 0; width: 100%; height: 100%;
-    background-color: rgba(120, 120, 140, .6);
-    background-image: url(img/reel.gif);
-    background-position: center;
-    background-repeat: no-repeat;
-}
--- a/src/widgets/MashupPlayer.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/widgets/MashupPlayer.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,19 +1,23 @@
-IriSP.Widgets.MashupPlayer = function(player, config) {
-    IriSP.Widgets.Widget.call(this, player, config);
-    this.is_mashup = true;
-};
-
-IriSP.Widgets.MashupPlayer.prototype = new IriSP.Widgets.Widget();
+import _ from "lodash";
+import jQuery from "jquery";
+import mashupPlayerStyles from "./MashupPlayer.module.css";
 
-IriSP.Widgets.MashupPlayer.prototype.defaults = {
-    aspect_ratio: 14/9,
-    split_screen: false,
-    player_type: "PopcornPlayer",
-    background: "#000000"
-};
+const MashupPlayer = function (ns) {
+  return class extends ns.Widgets.Widget {
+    constructor(player, config) {
+      super(player, config);
+      this.is_mashup = true;
+    }
 
-IriSP.Widgets.MashupPlayer.prototype.draw = function() {
-    var _this = this,
+    static defaults = {
+      aspect_ratio: 14 / 9,
+      split_screen: false,
+      player_type: "PopcornPlayer",
+      background: "#000000",
+    };
+
+    draw() {
+      var _this = this,
         _mashup = this.media,
         _currentMedia = null,
         _currentAnnotation = null,
@@ -24,233 +28,240 @@
         _seekdiv,
         _timedelta,
         medialist = _mashup.getMedias();
-    
-    _mashup.paused = (!this.autostart && !this.autoplay);
-    
-    function changeCurrentAnnotation() {
+
+      _mashup.paused = !this.autostart && !this.autoplay;
+
+      function changeCurrentAnnotation() {
         if (_timecode >= _mashup.duration) {
-            if (!_mashup.paused) {
-                _mashup.paused = true;
-                _mashup.trigger("pause");
-            }
-            _timecode = 0;
+          if (!_mashup.paused) {
+            _mashup.paused = true;
+            _mashup.trigger("pause");
+          }
+          _timecode = 0;
         }
-        var _annotation = _mashup.getAnnotationAtTime( _timecode );
+        var _annotation = _mashup.getAnnotationAtTime(_timecode);
         if (typeof _annotation === "undefined") {
-            if (_currentMedia) {
-                _currentMedia.pause();
-                if (!_mashup.paused) {
-                    _mashup.paused = true;
-                    _mashup.trigger("pause");
-                }
+          if (_currentMedia) {
+            _currentMedia.pause();
+            if (!_mashup.paused) {
+              _mashup.paused = true;
+              _mashup.trigger("pause");
             }
-            return;
+          }
+          return;
         }
         if (_annotation !== _currentAnnotation) {
-            _currentAnnotation = _annotation;
-            _segmentBegin = _currentAnnotation.annotation.begin.milliseconds;
-            _segmentEnd = _currentAnnotation.annotation.end.milliseconds;
-            _timedelta = _segmentBegin - _currentAnnotation.begin.milliseconds;
-            _currentMedia = _currentAnnotation.getMedia();
-            
-            for (var _i = 0; _i < medialist.length; _i++) {
-                if (medialist[_i].id !== _currentMedia.id) {
-                    if (!_this.split_screen) {
-                        medialist[_i].hide();
-                    }
-                    medialist[_i].pause();
-                } else {
-                    medialist[_i].show();
-                }
+          _currentAnnotation = _annotation;
+          _segmentBegin = _currentAnnotation.annotation.begin.milliseconds;
+          _segmentEnd = _currentAnnotation.annotation.end.milliseconds;
+          _timedelta = _segmentBegin - _currentAnnotation.begin.milliseconds;
+          _currentMedia = _currentAnnotation.getMedia();
+
+          for (var _i = 0; _i < medialist.length; _i++) {
+            if (medialist[_i].id !== _currentMedia.id) {
+              if (!_this.split_screen) {
+                medialist[_i].hide();
+              }
+              medialist[_i].pause();
+            } else {
+              medialist[_i].show();
             }
-            
-    /* PRELOADING */
-            var _preloadedMedias = [],
-                _toPreload = _mashup.getAnnotations().filter(function(_a) {
-                return (_a.begin >= _currentAnnotation.end && _a.getMedia() !== _currentMedia);
+          }
+
+          /* PRELOADING */
+          var _preloadedMedias = [],
+            _toPreload = _mashup.getAnnotations().filter(function (_a) {
+              return (
+                _a.begin >= _currentAnnotation.end &&
+                _a.getMedia() !== _currentMedia
+              );
             });
-            IriSP._(_toPreload).each(function(_a) {
-                var _media = _a.getMedia();
-                if (IriSP._(_preloadedMedias).indexOf(_media.id) === -1) {
-                    _preloadedMedias.push(_media.id);
-                    _media.setCurrentTime(_a.annotation.begin.getSeconds());
-                    _media.seeking = true;
-/*
+          _(_toPreload).each(function (_a) {
+            var _media = _a.getMedia();
+            if (_(_preloadedMedias).indexOf(_media.id) === -1) {
+              _preloadedMedias.push(_media.id);
+              _media.setCurrentTime(_a.annotation.begin.getSeconds());
+              _media.seeking = true;
+              /*
                     console.log("Preloading ", _media.id, " at t=", _a.annotation.begin.getSeconds());
 */
-                }
-            });
-            
-    //        console.log("Changed segment: media="+ this.currentMedia.id + ", from=" + this.segmentBegin + " to=" + this.segmentEnd +", timedelta = ", this.timedelta)
-    //    } else {
-    //        console.log("changeCurrentAnnotation called, but segment hasn't changed");
+            }
+          });
+
+          //        console.log("Changed segment: media="+ this.currentMedia.id + ", from=" + this.segmentBegin + " to=" + this.segmentEnd +", timedelta = ", this.timedelta)
+          //    } else {
+          //        console.log("changeCurrentAnnotation called, but segment hasn't changed");
         }
-        
-        _currentMedia.setCurrentTime( _timecode + _timedelta);
+
+        _currentMedia.setCurrentTime(_timecode + _timedelta);
         _currentMedia.seeking = true;
-        
+
         if (!_mashup.paused) {
-            _currentMedia.play();
-            _seeking = true;
-            _seekdiv.show();
+          _currentMedia.play();
+          _seeking = true;
+          _seekdiv.show();
         }
-/*
+        /*
         console.log("Setting time of media", _currentMedia.id, "to", _timecode + _timedelta)     
 */
-        _mashup.trigger("timeupdate", new IriSP.Model.Time(_timecode));
+        _mashup.trigger("timeupdate", new ns.Model.Time(_timecode));
+      }
 
-    }
-    
-    if (!this.height) {
-        this.height = Math.floor(this.width/this.aspect_ratio);
+      if (!this.height) {
+        this.height = Math.floor(this.width / this.aspect_ratio);
         this.$.css({
-            height: this.height
+          height: this.height,
         });
-    }
-    
-    this.$.css({
-        background: this.background
-    });
-    
-    var _grid = Math.ceil(Math.sqrt(medialist.length)),
-        _width = (this.split_screen ? this.width / _grid : this.width),
-        _height = (this.split_screen ? this.height / _grid : this.height);
+      }
+
+      this.$.css({
+        background: this.background,
+      });
+
+      var _grid = Math.ceil(Math.sqrt(medialist.length)),
+        _width = this.split_screen ? this.width / _grid : this.width,
+        _height = this.split_screen ? this.height / _grid : this.height;
 
-    IriSP._(medialist).each(function(_media, _key) {
-        var _el = IriSP.jQuery('<div class="Ldt-MashupPlayer-Media"><div class="Ldt-MashupPlayer-Subwidget"></div></div>');
+      _(medialist).each(function (_media, _key) {
+        var _el = jQuery(
+          '<div class="Ldt-MashupPlayer-Media"><div class="Ldt-MashupPlayer-Subwidget"></div></div>'
+        );
         _el.css({
-            top: (_this.split_screen ? _height * Math.floor(_key / _grid) : 0),
-            left: (_this.split_screen ? _width * (_key % _grid) : 0),
-            height: _height,
-            width: _width,
-            display: (_this.split_screen ? "block" : "none")
+          top: _this.split_screen ? _height * Math.floor(_key / _grid) : 0,
+          left: _this.split_screen ? _width * (_key % _grid) : 0,
+          height: _height,
+          width: _width,
+          display: _this.split_screen ? "block" : "none",
         });
         _this.$.append(_el);
-        
+
         _this.insertSubwidget(
-            _el.find(".Ldt-MashupPlayer-Subwidget"),
-            IriSP._({
-                type: _this.player_type,
-                media_id: _media.id,
-                height: _height,
-                width: _width,
-                url_transform: _this.url_transform
-            }).extend(_this.player_options)
+          _el.find(".Ldt-MashupPlayer-Subwidget"),
+          _({
+            type: _this.player_type,
+            media_id: _media.id,
+            height: _height,
+            width: _width,
+            url_transform: _this.url_transform,
+          }).extend(_this.player_options)
         );
-        
+
         _media.loadedMetadata = false;
-        _media.show = function() {
-            _el.show();
+        _media.show = function () {
+          _el.show();
         };
-        _media.hide = function() {
-            _el.hide();
+        _media.hide = function () {
+          _el.hide();
         };
-        _media.on("loadedmetadata", function() {
-            _media.loadedMetadata = true;
-            var _allLoaded = true;
-            for (var _i = 0; _i < medialist.length; _i++) {
-                _allLoaded = _allLoaded && medialist[_i].loadedMetadata;
-            }
-            if (_allLoaded) {
-                _seekdiv.fadeOut();
-                changeCurrentAnnotation();
-                _mashup.trigger("loadedmetadata");
-            }
+        _media.on("loadedmetadata", function () {
+          _media.loadedMetadata = true;
+          var _allLoaded = true;
+          for (var _i = 0; _i < medialist.length; _i++) {
+            _allLoaded = _allLoaded && medialist[_i].loadedMetadata;
+          }
+          if (_allLoaded) {
+            _seekdiv.fadeOut();
+            changeCurrentAnnotation();
+            _mashup.trigger("loadedmetadata");
+          }
         });
-        _media.on("timeupdate", function(_time) {
-            if (!_mashup.paused && _media === _currentMedia && !_media.seeking) {
-/*
+        _media.on("timeupdate", function (_time) {
+          if (!_mashup.paused && _media === _currentMedia && !_media.seeking) {
+            /*
                 var _status = "Timeupdate from " + _media.id + " at time " + _time;
 */
-                if ( _time < _segmentEnd ) {
-                    if ( _time >= _segmentBegin ) {
-                        _timecode = _time - _timedelta;
-/*
+            if (_time < _segmentEnd) {
+              if (_time >= _segmentBegin) {
+                _timecode = _time - _timedelta;
+                /*
                         _status += " within segment";
 */
-                    } else {
-                        _timecode = _segmentBegin - _timedelta;
-                        _media.setCurrentTime(_segmentBegin);
-/*
+              } else {
+                _timecode = _segmentBegin - _timedelta;
+                _media.setCurrentTime(_segmentBegin);
+                /*
                         _status += " before segment";
 */
-                    }
-                } else {
-                    _timecode = _segmentEnd - _timedelta;
-                    _media.pause();
-                    changeCurrentAnnotation();
-/*
+              }
+            } else {
+              _timecode = _segmentEnd - _timedelta;
+              _media.pause();
+              changeCurrentAnnotation();
+              /*
                     _status += " after segment";
 */
-                }
-/*
+            }
+            /*
                 _status += " (" + _segmentBegin + " to " + _segmentEnd + ")" + ", translated to " + _timecode;
                 console.log(_status);
 */
-                _mashup.trigger("timeupdate", new IriSP.Model.Time(_timecode));
-            }
+            _mashup.trigger("timeupdate", new ns.Model.Time(_timecode));
+          }
         });
-        _media.on("seeked", function() {
-            _media.seeking = false;
-            if (_media === _currentMedia && _seeking) {
-                _seeking = false;
-                _seekdiv.hide();
-            }
+        _media.on("seeked", function () {
+          _media.seeking = false;
+          if (_media === _currentMedia && _seeking) {
+            _seeking = false;
+            _seekdiv.hide();
+          }
         });
-        _media.on("play", function() {
-            if (_media === _currentMedia) {
-                _mashup.trigger("play");
-            }
+        _media.on("play", function () {
+          if (_media === _currentMedia) {
+            _mashup.trigger("play");
+          }
         });
-        _media.on("pause", function() {
-            if (_media === _currentMedia) {
-                _mashup.trigger("pause");
-            }
+        _media.on("pause", function () {
+          if (_media === _currentMedia) {
+            _mashup.trigger("pause");
+          }
         });
-        _media.on("volumechange", function() {
-            _mashup.muted = _media.muted;
-            _mashup.volume = _media.volume;
-            _mashup.trigger("volumechange");
+        _media.on("volumechange", function () {
+          _mashup.muted = _media.muted;
+          _mashup.volume = _media.volume;
+          _mashup.trigger("volumechange");
         });
-    });
-    
-    _seekdiv = IriSP.jQuery('<div class="Ldt-MashupPlayer-Waiting"></div>');
-    
-    this.$.append(_seekdiv);
+      });
+
+      _seekdiv = jQuery('<div class="Ldt-MashupPlayer-Waiting"></div>');
 
-    // Binding functions to Popcorn
-    
-    _mashup.on("setcurrenttime", function(_milliseconds) {
+      this.$.append(_seekdiv);
+
+      // Binding functions to Popcorn
+
+      _mashup.on("setcurrenttime", function (_milliseconds) {
         _timecode = _milliseconds;
         changeCurrentAnnotation();
-    });
-    
-    _mashup.on("setvolume", function(_vol) {
+      });
+
+      _mashup.on("setvolume", function (_vol) {
         for (var _i = 0; _i < medialist.length; _i++) {
-            medialist[_i].setVolume(_vol);
+          medialist[_i].setVolume(_vol);
         }
         _mashup.volume = _vol;
-    });
-    
-    _mashup.on("setmuted", function(_muted) {
+      });
+
+      _mashup.on("setmuted", function (_muted) {
         for (var _i = 0; _i < medialist.length; _i++) {
-            medialist[_i].setMuted(_muted);
+          medialist[_i].setMuted(_muted);
         }
         _mashup.muted = _muted;
-    });
-    
-    _mashup.on("setplay", function() {
+      });
+
+      _mashup.on("setplay", function () {
         _mashup.paused = false;
         changeCurrentAnnotation();
-    });
-    
-    _mashup.on("setpause", function() {
+      });
+
+      _mashup.on("setpause", function () {
         _mashup.paused = true;
         if (_currentMedia) {
-            _currentMedia.pause();
+          _currentMedia.pause();
         }
-    });
-    
-    _mashup.on("loadedmetadata", changeCurrentAnnotation);
-   
-};
\ No newline at end of file
+      });
+
+      _mashup.on("loadedmetadata", changeCurrentAnnotation);
+    }
+  };
+};
+
+export { MashupPlayer, mashupPlayerStyles };
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/widgets/MashupPlayer.module.css	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,11 @@
+.Ldt-MashupPlayer-Media {
+    position: absolute;
+}
+
+.Ldt-MashupPlayer-Waiting {
+    position: absolute; left: 0; top: 0; width: 100%; height: 100%;
+    background-color: rgba(120, 120, 140, .6);
+    background-image: url(img/reel.gif);
+    background-position: center;
+    background-repeat: no-repeat;
+}
--- a/src/widgets/MediaList.css	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,102 +0,0 @@
-.Ldt-MediaListWidget a {
-    text-decoration: none;
-}
-
-.Ldt-MediaListWidget h2 {
-    clear: both;
-}
-
-.Ldt-MediaList-NowContainer {
-    min-height: 60px;
-    margin: 2px 0;
-}
-
-h3.Ldt-MediaList-Now-Title {
-    font-size: 13px;
-    margin: 2px 2px 0 82px;
-    font-weight: bold;
-}
-
-.Ldt-MediaListWidget h3 a {
-    color: #0068c4;
-}
-
-p.Ldt-MediaList-Now-Description {
-    margin: 2px 0 2px 82px;
-    font-size: 12px;
-    color: #666666;
-}
-
-ul.Ldt-MediaList-OtherList {
-    list-style: none;
-    padding: 2px;
-    margin: 0;
-}
-
-li.Ldt-MediaList-OtherList-li {
-    width: 100%;
-    clear: both;
-    margin: 2px 0;
-    padding: 2px 0;
-    min-height: 48px;
-}
-
-.Ldt-MediaList-OtherList-li:hover, .Ldt-MediaList-NowContainer:hover {
-    background: url(img/pinstripe-grey.png);
-}
-
-.Ldt-MediaList-Now-ThumbContainer, .Ldt-MediaList-Other-ThumbContainer {
-    float: left;
-    width: 80px;
-    height: 50px;
-    text-align: center;
-    margin: 2px 0;
-}
-
-.Ldt-MediaList-Now-ThumbContainer {
-    float: left;
-    width: 80px;
-    height: 50px;
-    text-align: center;
-    margin: 2px 0;
-}
-
-.Ldt-MediaList-Other-ThumbContainer {
-    width: 60px;
-    height: 38px;
-}
-
-.Ldt-MediaList-Now-Thumbnail, .Ldt-MediaList-Other-Thumbnail {
-    border: none;
-    max-width: 100%;
-    max-height: 100%;
-    margin: 0 auto;
-}
-
-h3.Ldt-MediaList-Other-Title {
-    font-size: 12px;
-    margin: 2px 2px 0 62px;
-    font-weight: bold;
-}
-
-p.Ldt-MediaList-Other-Description {
-    margin: 2px 0 2px 62px;
-    font-size: 10px;
-    color: #666666;
-}
-
-.Ldt-MediaList-Now-MediaView {
-    clear: both; width: 100%; height: 12px; margin: 5px 0 0; overflow: hidden; position: relative;
-}
-
-.Ldt-MediaList-Other-MediaView {
-    clear: both; width: 100%; height: 6px; margin: 5px 0 0; overflow: hidden; position: relative;
-}
-
-.Ldt-MediaList-MediaView-Background {
-    position: absolute; top: 0; left: 0; width: 100%; height: 100%; filter: alpha(opacity=50); opacity: 0.5; background: #999999;
-}
-
-.Ldt-MediaList-Segment {
-    position: absolute; top: 0; height: 100%; border-style: none solid; margin-left: -1px; border-color: #ffffff; border-width: 1px;
-}
--- a/src/widgets/MediaList.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/widgets/MediaList.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,130 +1,150 @@
-IriSP.Widgets.MediaList = function(player, config) {
-    IriSP.Widgets.Widget.call(this, player, config);
-    this.lastMedia = false;
-};
+import Mustache from "mustache";
+import mediaListStyles from "./MediaList.module.css";
 
-IriSP.Widgets.MediaList.prototype = new IriSP.Widgets.Widget();
+const MediaList = function (ns) {
+  return class extends ns.Widgets.Widget {
+    constructor(player, config) {
+      super(player, config);
+      this.lastMedia = false;
+    }
 
-IriSP.Widgets.MediaList.prototype.messages = {
-    "fr": {
+    static messages =  {
+      fr: {
         now_playing: "Vidéo en cours",
         all_media: "Toutes les vidéos",
-        other_media: "Autres vidéos"
-    },
-    "en": {
+        other_media: "Autres vidéos",
+      },
+      en: {
         now_playing: "Now playing",
         all_media: "All videos",
-        other_media: "Other videos"
-    }
-};
+        other_media: "Other videos",
+      },
+    };
+
+    static defaults = {
+      default_thumbnail:
+        "http://ldt.iri.centrepompidou.fr/static/site/ldt/css/imgs/video_sequence.png",
+      media_url_template:
+        "http://ldt.iri.centrepompidou.fr/ldtplatform/ldt/front/player/{{media}}/",
+      default_color: "#000080",
+    };
+
+    static template =
+      '<div class="Ldt-MediaList-NowPlaying"><h2>{{l10n.now_playing}}</h2><hr />' +
+      '<div class="Ldt-MediaList-NowContainer">' +
+      '<div class="Ldt-MediaList-Now-ThumbContainer"><a href="" target="_blank">' +
+      '<img class="Ldt-MediaList-Now-Thumbnail" src="" /></a></div>' +
+      '<h3 class="Ldt-MediaList-Now-Title"><a href="" target="_blank"></a></h3>' +
+      '<p class="Ldt-MediaList-Now-Description"></p><div class="Ldt-MediaList-Now-MediaView"></div></div></div>' +
+      '<div class="Ldt-MediaList-Other"><h2></h2><hr /><ul class="Ldt-MediaList-OtherList"></ul></div>';
+
+    static mediaViewTemplate =
+      '<div class="Ldt-MediaList-MediaView-Background"></div>{{#segments}}<div class="Ldt-MediaList-Segment" style="background: {{color}}; left: {{left}}px; width: {{width}}px;"></div>{{/segments}}';
 
-IriSP.Widgets.MediaList.prototype.defaults = {
-    default_thumbnail : "http://ldt.iri.centrepompidou.fr/static/site/ldt/css/imgs/video_sequence.png",
-    media_url_template : "http://ldt.iri.centrepompidou.fr/ldtplatform/ldt/front/player/{{media}}/",
-    default_color : "#000080"
-};
+    static mediaTemplate =
+      '<li class="Ldt-MediaList-OtherList-li"><div class="Ldt-MediaList-Other-ThumbContainer"><a href="{{url}}" target="_blank">' +
+      '<img class="Ldt-MediaList-Other-Thumbnail" src="{{thumbnail}}" /></a></div>' +
+      '<h3 class="Ldt-MediaList-Other-Title"><a href="{{url}}" target="_blank">{{title}}</a></h3>' +
+      '<p class="Ldt-MediaList-Other-Description">{{description}}</p><div class="Ldt-MediaList-Other-MediaView">' +
+      MediaList.mediaViewTemplate +
+      "</div></li>";
 
-IriSP.Widgets.MediaList.prototype.template =
-    '<div class="Ldt-MediaList-NowPlaying"><h2>{{l10n.now_playing}}</h2><hr />'
-    + '<div class="Ldt-MediaList-NowContainer">'
-    + '<div class="Ldt-MediaList-Now-ThumbContainer"><a href="" target="_blank">'
-    + '<img class="Ldt-MediaList-Now-Thumbnail" src="" /></a></div>'
-    + '<h3 class="Ldt-MediaList-Now-Title"><a href="" target="_blank"></a></h3>'
-    + '<p class="Ldt-MediaList-Now-Description"></p><div class="Ldt-MediaList-Now-MediaView"></div></div></div>'
-    + '<div class="Ldt-MediaList-Other"><h2></h2><hr /><ul class="Ldt-MediaList-OtherList"></ul></div>';
+    onSearch(searchString) {
+      this.searchString =
+        typeof searchString !== "undefined" ? searchString : "";
+      var _n = this.refresh(true);
+      if (this.searchString) {
+        if (_n) {
+          this.player.trigger("search.matchFound");
+        } else {
+          this.player.trigger("search.noMatchFound");
+        }
+      }
+    }
+
+    draw() {
+      this.$.addClass("Ldt-MediaListWidget");
+      this.renderTemplate();
+      var _this = this;
+      if (typeof this.media.getMedias === "function") {
+        this.media.on("enter-annotation", function (_a) {
+          _this.redraw(_a.getMedia());
+        });
+      }
+      this.redraw();
+    }
 
-IriSP.Widgets.MediaList.prototype.mediaViewTemplate =
-    '<div class="Ldt-MediaList-MediaView-Background"></div>{{#segments}}<div class="Ldt-MediaList-Segment" style="background: {{color}}; left: {{left}}px; width: {{width}}px;"></div>{{/segments}}';
-
-IriSP.Widgets.MediaList.prototype.mediaTemplate =
-    '<li class="Ldt-MediaList-OtherList-li"><div class="Ldt-MediaList-Other-ThumbContainer"><a href="{{url}}" target="_blank">'
-    + '<img class="Ldt-MediaList-Other-Thumbnail" src="{{thumbnail}}" /></a></div>'
-    + '<h3 class="Ldt-MediaList-Other-Title"><a href="{{url}}" target="_blank">{{title}}</a></h3>'
-    + '<p class="Ldt-MediaList-Other-Description">{{description}}</p><div class="Ldt-MediaList-Other-MediaView">'
-    + IriSP.Widgets.MediaList.prototype.mediaViewTemplate + '</div></li>';
-
+    getSegments(_media) {
+      var _this = this,
+        _scale = this.$.width() / _media.duration.milliseconds;
+      return this.getWidgetAnnotations()
+        .filter(function (_annotation) {
+          return _annotation.getMedia().id == _media.id;
+        })
+        .map(function (_a) {
+          var _annotation = (_a.type = "mashedAnnotation" ? _a.annotation : _a);
+          return {
+            left: _scale * _annotation.begin,
+            width: _scale * (_annotation.end - _annotation.begin),
+            color:
+              typeof _annotation.color !== "undefined" && _annotation.color
+                ? _annotation.color
+                : _this.default_color,
+          };
+        });
+    }
 
-IriSP.Widgets.MediaList.prototype.onSearch = function(searchString) {
-    this.searchString = typeof searchString !== "undefined" ? searchString : '';
-    var _n = this.refresh(true);
-    if (this.searchString) {
-        if (_n) {
-            this.player.trigger("search.matchFound");
-        } else {
-            this.player.trigger("search.noMatchFound");
-        }
+    redraw(_media) {
+      if (typeof _media !== "undefined") {
+        this.$.find(".Ldt-MediaList-Other h2").html(this.l10n.other_media);
+        this.$.find(".Ldt-MediaList-NowPlaying").show();
+        this.$.find(".Ldt-MediaList-Now-Thumbnail").attr(
+          "src",
+          _media.thumbnail || this.default_thumbnail
+        );
+        this.$.find(".Ldt-MediaList-Now-Title a").html(_media.title);
+        this.$.find(".Ldt-MediaList-Now-Description").html(_media.description);
+        var _url =
+          _media.url ||
+          Mustache.render(this.media_url_template, {
+            media: _media.id,
+          });
+        this.$.find(".Ldt-MediaList-NowContainer a").attr("href", _url);
+        var _mediaView = Mustache.render(this.mediaViewTemplate, {
+          segments: this.getSegments(_media),
+        });
+        this.$.find(".Ldt-MediaList-Now-MediaView").html(_mediaView);
+      } else {
+        this.$.find(".Ldt-MediaList-Other h2").html(this.l10n.all_media);
+        this.$.find(".Ldt-MediaList-NowPlaying").hide();
+      }
+      var _this = this,
+        _otherlist = this.source.getMedias().filter(function (_m) {
+          return _m.id !== _this.lastMedia;
+        });
+      if (_otherlist.length) {
+        this.$.find(".Ldt-MediaList-Other").show();
+        var _html = _otherlist
+          .map(function (_media) {
+            return Mustache.render(_this.mediaTemplate, {
+              thumbnail: _media.thumbnail || _this.default_thumbnail,
+              url:
+                _media.url ||
+                Mustache.render(_this.media_url_template, {
+                  media: _media.id,
+                }),
+              title: _media.title,
+              description: _media.description,
+              segments: _this.getSegments(_media),
+            });
+          })
+          .join("");
+        this.$.find(".Ldt-MediaList-OtherList").html(_html);
+      } else {
+        this.$.find(".Ldt-MediaList-Other").hide();
+      }
     }
+  };
 };
 
-IriSP.Widgets.MediaList.prototype.draw = function() {
-    this.$.addClass("Ldt-MediaListWidget")
-    this.renderTemplate();
-    var _this = this;
-    if (typeof this.media.getMedias === "function") {
-        this.media.on("enter-annotation", function(_a) {
-            _this.redraw(_a.getMedia());
-        });
-    }
-    this.redraw();
-};
-
-IriSP.Widgets.MediaList.prototype.getSegments = function(_media) {
-    var _this = this,
-        _scale = this.$.width()/_media.duration.milliseconds;
-    return this.getWidgetAnnotations()
-        .filter(function(_annotation) {
-            return _annotation.getMedia().id == _media.id;
-        })
-        .map(function(_a) {
-            var _annotation = ( _a.type = "mashedAnnotation" ? _a.annotation : _a );
-            return {
-                left: _scale * _annotation.begin,
-                width: _scale * (_annotation.end - _annotation.begin),
-                color: ( typeof _annotation.color !== "undefined" && _annotation.color ? _annotation.color : _this.default_color )
-            };
-        });
-};
-
-IriSP.Widgets.MediaList.prototype.redraw = function(_media) {
-    if (typeof _media !== "undefined") {
-        this.$.find('.Ldt-MediaList-Other h2').html(this.l10n.other_media);
-        this.$.find('.Ldt-MediaList-NowPlaying').show();
-        this.$.find('.Ldt-MediaList-Now-Thumbnail').attr("src", _media.thumbnail || this.default_thumbnail);
-        this.$.find('.Ldt-MediaList-Now-Title a').html(_media.title);
-        this.$.find('.Ldt-MediaList-Now-Description').html(_media.description);
-        var _url = _media.url || Mustache.to_html(
-                this.media_url_template, {
-                    media: _media.id
-                });
-        this.$.find('.Ldt-MediaList-NowContainer a').attr("href", _url);
-        var _mediaView = Mustache.to_html( this.mediaViewTemplate, {
-            segments: this.getSegments(_media)
-        });
-        this.$.find('.Ldt-MediaList-Now-MediaView').html(_mediaView);
-    } else {
-        this.$.find('.Ldt-MediaList-Other h2').html(this.l10n.all_media);
-        this.$.find('.Ldt-MediaList-NowPlaying').hide();
-    }
-    var _this = this,
-        _otherlist = this.source.getMedias().filter(function(_m) {
-            return (_m.id !== _this.lastMedia)
-        });
-    if (_otherlist.length) {
-        this.$.find('.Ldt-MediaList-Other').show();
-        var _html = _otherlist.map(function(_media) {
-            return Mustache.to_html(_this.mediaTemplate, {
-                thumbnail: _media.thumbnail || _this.default_thumbnail,
-                url: _media.url || Mustache.to_html(
-                    _this.media_url_template, {
-                        media: _media.id
-                    }),
-                title: _media.title,
-                description: _media.description,
-                segments: _this.getSegments(_media)
-            });
-        }).join("");
-        this.$.find('.Ldt-MediaList-OtherList').html(_html);
-    } else {
-        this.$.find('.Ldt-MediaList-Other').hide();
-    }
-};
+export { MediaList, mediaListStyles };
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/widgets/MediaList.module.css	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,102 @@
+.Ldt-MediaListWidget a {
+    text-decoration: none;
+}
+
+.Ldt-MediaListWidget h2 {
+    clear: both;
+}
+
+.Ldt-MediaList-NowContainer {
+    min-height: 60px;
+    margin: 2px 0;
+}
+
+h3.Ldt-MediaList-Now-Title {
+    font-size: 13px;
+    margin: 2px 2px 0 82px;
+    font-weight: bold;
+}
+
+.Ldt-MediaListWidget h3 a {
+    color: #0068c4;
+}
+
+p.Ldt-MediaList-Now-Description {
+    margin: 2px 0 2px 82px;
+    font-size: 12px;
+    color: #666666;
+}
+
+ul.Ldt-MediaList-OtherList {
+    list-style: none;
+    padding: 2px;
+    margin: 0;
+}
+
+li.Ldt-MediaList-OtherList-li {
+    width: 100%;
+    clear: both;
+    margin: 2px 0;
+    padding: 2px 0;
+    min-height: 48px;
+}
+
+.Ldt-MediaList-OtherList-li:hover, .Ldt-MediaList-NowContainer:hover {
+    background: url(img/pinstripe-grey.png);
+}
+
+.Ldt-MediaList-Now-ThumbContainer, .Ldt-MediaList-Other-ThumbContainer {
+    float: left;
+    width: 80px;
+    height: 50px;
+    text-align: center;
+    margin: 2px 0;
+}
+
+.Ldt-MediaList-Now-ThumbContainer {
+    float: left;
+    width: 80px;
+    height: 50px;
+    text-align: center;
+    margin: 2px 0;
+}
+
+.Ldt-MediaList-Other-ThumbContainer {
+    width: 60px;
+    height: 38px;
+}
+
+.Ldt-MediaList-Now-Thumbnail, .Ldt-MediaList-Other-Thumbnail {
+    border: none;
+    max-width: 100%;
+    max-height: 100%;
+    margin: 0 auto;
+}
+
+h3.Ldt-MediaList-Other-Title {
+    font-size: 12px;
+    margin: 2px 2px 0 62px;
+    font-weight: bold;
+}
+
+p.Ldt-MediaList-Other-Description {
+    margin: 2px 0 2px 62px;
+    font-size: 10px;
+    color: #666666;
+}
+
+.Ldt-MediaList-Now-MediaView {
+    clear: both; width: 100%; height: 12px; margin: 5px 0 0; overflow: hidden; position: relative;
+}
+
+.Ldt-MediaList-Other-MediaView {
+    clear: both; width: 100%; height: 6px; margin: 5px 0 0; overflow: hidden; position: relative;
+}
+
+.Ldt-MediaList-MediaView-Background {
+    position: absolute; top: 0; left: 0; width: 100%; height: 100%; filter: alpha(opacity=50); opacity: 0.5; background: #999999;
+}
+
+.Ldt-MediaList-Segment {
+    position: absolute; top: 0; height: 100%; border-style: none solid; margin-left: -1px; border-color: #ffffff; border-width: 1px;
+}
--- a/src/widgets/Mediafragment.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/widgets/Mediafragment.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,98 +1,109 @@
-IriSP.Widgets.Mediafragment = function(player, config) {
-    IriSP.Widgets.Widget.call(this, player, config);
-    this.last_hash_key = "";
-    this.last_hash_value = "";
-    this.last_extra_key = "";
-    this.last_extra_value = "";
+import _ from "lodash";
 
-    window.onhashchange = this.functionWrapper("goToHash");
-    if (typeof window.addEventListener !== "undefined") {
-        var _this = this;
-        window.addEventListener('message', function(_msg) {
-            if (/^#/.test(_msg.data)) {
-                _this.setWindowHash(_msg.data);
-            }
-        });
-    };
-    this.onMdpEvent("Mediafragment.setHashToAnnotation","setHashToAnnotation");
-    this.blocked = false;
-};
-
-IriSP.Widgets.Mediafragment.prototype = new IriSP.Widgets.Widget();
+const Mediafragment = function (ns) {
+  return class extends ns.Widgets.Widget {
+    constructor(player, config) {
+      super(player, config);
+      this.last_hash_key = "";
+      this.last_hash_value = "";
+      this.last_extra_key = "";
+      this.last_extra_value = "";
 
-IriSP.Widgets.Mediafragment.prototype.draw = function() {
-    this.onMediaEvent("setpause","setHashToTime");
-    var _this = this;
-    this.getWidgetAnnotations().forEach(function(_annotation) {
-        _annotation.on("click", function() {
-            _this.setHashToAnnotation(_annotation);
+      window.onhashchange = this.functionWrapper("goToHash");
+      if (typeof window.addEventListener !== "undefined") {
+        var _this = this;
+        window.addEventListener("message", function (_msg) {
+          if (/^#/.test(_msg.data)) {
+            _this.setWindowHash(_msg.data);
+          }
         });
-    });
-    if (this.media.loadedMetadata) {
+      }
+      this.onMdpEvent(
+        "Mediafragment.setHashToAnnotation",
+        "setHashToAnnotation"
+      );
+      this.blocked = false;
+    }
+
+    draw() {
+      this.onMediaEvent("setpause", "setHashToTime");
+      var _this = this;
+      this.getWidgetAnnotations().forEach(function (_annotation) {
+        _annotation.on("click", function () {
+          _this.setHashToAnnotation(_annotation);
+        });
+      });
+      if (this.media.loadedMetadata) {
         this.goToHash();
-    } else {
-        this.onMediaEvent("loadedmetadata","goToHash");
+      } else {
+        this.onMediaEvent("loadedmetadata", "goToHash");
+      }
     }
-};
 
-IriSP.Widgets.Mediafragment.prototype.setWindowHash = function(_hash) {
-    if (typeof window.history !== "undefined" && typeof window.history.replaceState !== "undefined") {
+    setWindowHash(_hash) {
+      if (
+        typeof window.history !== "undefined" &&
+        typeof window.history.replaceState !== "undefined"
+      ) {
         window.history.replaceState({}, "", _hash);
-    } else {
+      } else {
         document.location.hash = _hash;
+      }
     }
-};
 
-IriSP.Widgets.Mediafragment.prototype.getLastHash = function() {
-    var _tab = document.location.hash.replace(/^#/,'').split('&');
-    _tab = IriSP._(_tab).filter(function(_el) {
+    getLastHash() {
+      var _tab = document.location.hash.replace(/^#/, "").split("&");
+      _tab = _(_tab).filter(function (_el) {
         return _el && !/^(id|t)=/.test(_el);
-    });
-    if (this.last_hash_key) {
-        _tab.push(this.last_hash_key + '=' + this.last_hash_value);
+      });
+      if (this.last_hash_key) {
+        _tab.push(this.last_hash_key + "=" + this.last_hash_value);
+      }
+      if (this.last_extra_key) {
+        _tab.push(this.last_extra_key + "=" + this.last_extra_value);
+      }
+      return "#" + _tab.join("&");
     }
-    if (this.last_extra_key) {
-        _tab.push(this.last_extra_key + '=' + this.last_extra_value);
-    }
-    return '#' + _tab.join('&');
-};
 
-IriSP.Widgets.Mediafragment.prototype.goToHash = function() {
-    if (document.location.hash !== this.getLastHash()) {
-        var _tab = document.location.hash.replace(/^#/,'').split('&');
+    goToHash() {
+      if (document.location.hash !== this.getLastHash()) {
+        var _tab = document.location.hash.replace(/^#/, "").split("&");
         for (var _i = 0; _i < _tab.length; _i++) {
-            var _subtab = _tab[_i].split("=");
-            if (_subtab[0] == "id" || _subtab[0] == "t") {
-                this.last_hash_key = _subtab[0];
-                this.last_hash_value = _subtab[1];
-                if (this.last_hash_key == "id") {
-                    var _annotation = this.source.getElement(this.last_hash_value);
-                    if (typeof _annotation !== "undefined") {
-                        this.media.setCurrentTime(_annotation.begin);
-                    } else {
-                        /* Proceed parsing elements, maybe a t was specified */
-                        continue;
-                    }
-                }
-                if (this.last_hash_key == "t") {
-                    this.media.setCurrentTime(1000 * this.last_hash_value);
-                }
-                break;
+          var _subtab = _tab[_i].split("=");
+          if (_subtab[0] == "id" || _subtab[0] == "t") {
+            this.last_hash_key = _subtab[0];
+            this.last_hash_value = _subtab[1];
+            if (this.last_hash_key == "id") {
+              var _annotation = this.source.getElement(this.last_hash_value);
+              if (typeof _annotation !== "undefined") {
+                this.media.setCurrentTime(_annotation.begin);
+              } else {
+                /* Proceed parsing elements, maybe a t was specified */
+                continue;
+              }
+            }
+            if (this.last_hash_key == "t") {
+              this.media.setCurrentTime(1000 * this.last_hash_value);
             }
+            break;
+          }
         }
+      }
     }
-};
+
+    setHashToAnnotation(_annotation) {
+      this.setHash("id", _annotation.id, "t", _annotation.begin / 1000.0);
+    }
 
-IriSP.Widgets.Mediafragment.prototype.setHashToAnnotation = function(_annotation) {
-    this.setHash( 'id', _annotation.id, 't', _annotation.begin / 1000.0 );
-};
+    setHashToTime() {
+      this.setHash("t", this.media.getCurrentTime().getSeconds());
+    }
 
-IriSP.Widgets.Mediafragment.prototype.setHashToTime = function() {
-    this.setHash( 't', this.media.getCurrentTime().getSeconds() );
-};
-
-IriSP.Widgets.Mediafragment.prototype.setHash = function(_key, _value, _key2, _value2) {
-    if (!this.blocked && (this.last_hash_key !== _key || this.last_hash_value !== _value)) {
+    setHash(_key, _value, _key2, _value2) {
+      if (
+        !this.blocked &&
+        (this.last_hash_key !== _key || this.last_hash_value !== _value)
+      ) {
         this.last_hash_key = _key;
         this.last_hash_value = _value;
         this.last_extra_key = _key2;
@@ -101,24 +112,31 @@
         var _hash = this.getLastHash();
         this.setWindowHash(_hash);
         if (window.parent !== window) {
-            window.parent.postMessage(_hash,"*");
+          window.parent.postMessage(_hash, "*");
         }
         this.block();
+      }
     }
+
+    unblock() {
+      if (typeof this.blockTimeout !== "undefined") {
+        window.clearTimeout(this.blockTimeout);
+      }
+      this.blockTimeout = undefined;
+      this.blocked = false;
+    }
+
+    block() {
+      if (typeof this.blockTimeout !== "undefined") {
+        window.clearTimeout(this.blockTimeout);
+      }
+      this.blocked = true;
+      this.blockTimeout = window.setTimeout(
+        this.functionWrapper("unblock"),
+        1500
+      );
+    }
+  };
 };
 
-IriSP.Widgets.Mediafragment.prototype.unblock = function() {
-    if (typeof this.blockTimeout !== "undefined") {
-        window.clearTimeout(this.blockTimeout);
-    }
-    this.blockTimeout = undefined;
-    this.blocked = false;
-};
-
-IriSP.Widgets.Mediafragment.prototype.block = function() {
-    if (typeof this.blockTimeout !== "undefined") {
-        window.clearTimeout(this.blockTimeout);
-    }
-    this.blocked = true;
-    this.blockTimeout = window.setTimeout(this.functionWrapper("unblock"), 1500);
-};
+export { Mediafragment };
--- a/src/widgets/MultiSegments.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/widgets/MultiSegments.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,124 +1,127 @@
-IriSP.Widgets.MultiSegments = function(player, config) {
-    IriSP.Widgets.Widget.call(this, player, config);
-};
+import _ from "lodash";
+import jQuery from "jquery";
 
-IriSP.Widgets.MultiSegments.prototype = new IriSP.Widgets.Widget();
+const MultiSegments = function (ns) {
+  return class extends ns.Widgets.Widget {
+    constructor(player, config) {
+      super(player, config);
+    }
 
-IriSP.Widgets.MultiSegments.prototype.defaults = {
-    annotation_show_arrow: true,
-    annotation_start_minimized: false,
-    annotation_show_annotation_type: true,
-    show_all: false
-};
+    static defaults = {
+      annotation_show_arrow: true,
+      annotation_start_minimized: false,
+      annotation_show_annotation_type: true,
+      show_all: false,
+    };
 
-IriSP.Widgets.MultiSegments.prototype.draw = function() {
-    var _this = this,
+    draw() {
+      var _this = this,
         lines = [],
         currentLine = null,
         segmentsopts = {},
         annotationopts = {};
-    IriSP._(this).each(function(_v,_k) {
+      _(this).each(function (_v, _k) {
         if (/^segments_/.test(_k)) {
-            segmentsopts[_k.replace(/^segments_/,"")] = _v;
+          segmentsopts[_k.replace(/^segments_/, "")] = _v;
         }
         if (/^annotation_/.test(_k)) {
-            annotationopts[_k.replace(/^annotation_/,"")] = _v;
+          annotationopts[_k.replace(/^annotation_/, "")] = _v;
         }
-    });
-    this.source.getAnnotationTypes().forEach(function(_anntype) {
-        var segments = _anntype.getAnnotations().filter(function(_ann) {
-            return _ann.getDuration() > 0 && _ann.getMedia().id == _this.media.id;
+      });
+      this.source.getAnnotationTypes().forEach(function (_anntype) {
+        var segments = _anntype.getAnnotations().filter(function (_ann) {
+          return _ann.getDuration() > 0 && _ann.getMedia().id == _this.media.id;
         });
         if (segments.length) {
-            
-            var visible = false;
-            
-            var line = {
-                segmentWidget: IriSP.jQuery("<div>"),
-                annotationWidget: IriSP.jQuery("<div>"),
-                hasSegmentsNow: function() {
-                    var _time = _this.media.getCurrentTime();
-                    return !!segments.filter(function(_annotation) {
-                        return _annotation.begin <= _time && _annotation.end > _time;
-                    }).length;
-                },
-                hide: function() {
-                    if (visible) {
-                        visible = false;
-                        this.annotationWidget.slideUp();
-                    }
-                },
-                show: function() {
-                    if (!visible) {
-                        visible = true;
-                        this.annotationWidget.slideDown();
-                    }
-                }
-            };
-                
-                
-            line.segmentWidget
-                .addClass("Ldt-MultiSegments-Segment")
-                .appendTo(_this.$);
-                
-            if (!_this.show_all) {
-                line.segmentWidget.mouseenter(function() {
-                    if (line.hasSegmentsNow()) {
-                        currentLine = line;
-                        checkVisibilities();
-                    }
-                });
-            }
-            
-            line.annotationWidget
-                .addClass("Ldt-MultiSegments-Annotation")
-                .appendTo(_this.$)
-                .hide();
-                
-            _this.insertSubwidget(
-                line.segmentWidget,
-                IriSP._({
-                    type: "Segments",
-                    annotation_type: _anntype,
-                    width: '100%'
-                }).extend(segmentsopts)
-            );
-            
-            _this.insertSubwidget(
-                line.annotationWidget,
-                IriSP._({
-                    type: "Annotation",
-                    annotation_type: _anntype,
-                    width: '100%'
-                }).extend(annotationopts)
-            );
-            
-            lines.push(line);
+          var visible = false;
+
+          var line = {
+            segmentWidget: jQuery("<div>"),
+            annotationWidget: jQuery("<div>"),
+            hasSegmentsNow: function () {
+              var _time = _this.media.getCurrentTime();
+              return !!segments.filter(function (_annotation) {
+                return _annotation.begin <= _time && _annotation.end > _time;
+              }).length;
+            },
+            hide: function () {
+              if (visible) {
+                visible = false;
+                this.annotationWidget.slideUp();
+              }
+            },
+            show: function () {
+              if (!visible) {
+                visible = true;
+                this.annotationWidget.slideDown();
+              }
+            },
+          };
+
+          line.segmentWidget
+            .addClass("Ldt-MultiSegments-Segment")
+            .appendTo(_this.$);
+
+          if (!_this.show_all) {
+            line.segmentWidget.on("mouseenter", function () {
+              if (line.hasSegmentsNow()) {
+                currentLine = line;
+                checkVisibilities();
+              }
+            });
+          }
+
+          line.annotationWidget
+            .addClass("Ldt-MultiSegments-Annotation")
+            .appendTo(_this.$)
+            .hide();
+
+          _this.insertSubwidget(
+            line.segmentWidget,
+            _({
+              type: "Segments",
+              annotation_type: _anntype,
+              width: "100%",
+            }).extend(segmentsopts).value()
+          );
+
+          _this.insertSubwidget(
+            line.annotationWidget,
+            _({
+              type: "Annotation",
+              annotation_type: _anntype,
+              width: "100%",
+            }).extend(annotationopts).value()
+          );
+
+          lines.push(line);
         }
-    });
-    
-    // open line on segment click
-    IriSP.jQuery(document).on("click",".Ldt-Segments-Segment",function(e){
-    	if (!_this.show_all && currentLine && !currentLine.hasSegmentsNow()) {
-            currentLine = undefined;
+      });
+
+      // open line on segment click
+      jQuery(document).on("click", ".Ldt-Segments-Segment", function (e) {
+        if (!_this.show_all && currentLine && !currentLine.hasSegmentsNow()) {
+          currentLine = undefined;
         }
-        IriSP._(lines).each(function(line) {
-        	if(IriSP.jQuery(e.target).parent().parent()[0]==line.segmentWidget[0]){
-        		currentLine = line;
-        		line.show();
-        	} else {
-                line.hide();
-            }
+        _(lines).each(function (line) {
+          if (
+            jQuery(e.target).parent().parent()[0] == line.segmentWidget[0]
+          ) {
+            currentLine = line;
+            line.show();
+          } else {
+            line.hide();
+          }
         });
-    });
-    
-    //var _annotationWidgets = _this.$.find(".Ldt-MultiSegments-Annotation");
-    
-    function checkVisibilities(_time) {
+      });
+
+      //var _annotationWidgets = _this.$.find(".Ldt-MultiSegments-Annotation");
+
+      function checkVisibilities(_time) {
         /*if (!_this.show_all && currentLine && !currentLine.hasSegmentsNow()) {
             currentLine = undefined;
         }
-        IriSP._(lines).each(function(line) {
+        _(lines).each(function(line) {
             if (line.hasSegmentsNow()) {
                 if (!_this.show_all && !currentLine) {
                     currentLine = line;
@@ -132,5 +135,9 @@
                 line.hide();
             }
         });*/
+      }
     }
+  };
 };
+
+export { MultiSegments };
--- a/src/widgets/NoteTaking.css	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-/* NoteTaking widget */
-.Ldt-NoteTaking-Text {
-    width: 100%;
-    min-height: 360px;
-}
--- a/src/widgets/NoteTaking.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/widgets/NoteTaking.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,91 +1,105 @@
 /* This widget displays a note-taking view, that can be saved to localStorage */
-
-IriSP.Widgets.NoteTaking = function(player, config) {
-    IriSP.Widgets.Widget.call(this, player, config);
-}
-
-IriSP.Widgets.NoteTaking.prototype = new IriSP.Widgets.Widget();
-
-IriSP.Widgets.NoteTaking.prototype.defaults = {
-    // Id that will be used as localStorage key
-    editable_storage: ""
-}
+import noteTakingStyles from "./NoteTaking.module.css";
+import jQuery from "jquery";
 
-IriSP.Widgets.NoteTaking.prototype.template = '<textarea class="Ldt-NoteTaking-Text"></textarea>';
-
-IriSP.Widgets.NoteTaking.prototype.draw = function() {
-    var widget = this;
-    var content;
-    var $ = IriSP.jQuery;
-
-    widget.renderTemplate();
-    content = widget.$.find('.Ldt-NoteTaking-Text');
-
-    function load_content() {
-        $(content).val(window.localStorage[widget.editable_storage]);
-    }
-    function save_content() {
-        window.localStorage[widget.editable_storage] = $(content).val();
+const NoteTaking = function (ns) {
+  return class extends ns.Widgets.Widget {
+    constructor(player, config) {
+      super(player, config);
     }
 
-    // Load current transcript
-    if (window.localStorage[widget.editable_storage]) {
-        load_content();
-    }
-
-    // Thanks to http://stackoverflow.com/questions/4456545/how-to-insert-text-at-the-current-caret-position-in-a-textarea
-    $.fn.insertAtCaret = function(text) {
-        return this.each(function() {
-            if (this.selectionStart !== undefined) {
-                // mozilla/netscape support
-                var startPos = this.selectionStart,
-                    endPos = this.selectionEnd,
-                    scrollTop = this.scrollTop;
-                this.value = this.value.substring(0, startPos) + text + this.value.substring(endPos, this.value.length);
-                this.focus();
-                this.selectionStart = startPos + text.length;
-                this.selectionEnd = startPos + text.length;
-                this.scrollTop = scrollTop;
-            } else {
-                // IE input[type=text] and other browsers
-                this.value += text;
-                this.focus();
-                this.value = this.value;    // forces cursor to end
-            }
-        });
+    static defaults = {
+      // Id that will be used as localStorage key
+      editable_storage: "",
     };
 
-    function getAroundCaret(el, length) {
+    static template = '<textarea class="Ldt-NoteTaking-Text"></textarea>';
+
+    draw() {
+      var widget = this;
+      var content;
+      var $ = jQuery;
+
+      widget.renderTemplate();
+      content = widget.$.find(".Ldt-NoteTaking-Text");
+
+      function load_content() {
+        $(content).val(window.localStorage[widget.editable_storage]);
+      }
+      function save_content() {
+        window.localStorage[widget.editable_storage] = $(content).val();
+      }
+
+      // Load current transcript
+      if (window.localStorage[widget.editable_storage]) {
+        load_content();
+      }
+
+      // Thanks to http://stackoverflow.com/questions/4456545/how-to-insert-text-at-the-current-caret-position-in-a-textarea
+      $.fn.insertAtCaret = function (text) {
+        return this.each(function () {
+          if (this.selectionStart !== undefined) {
+            // mozilla/netscape support
+            var startPos = this.selectionStart,
+              endPos = this.selectionEnd,
+              scrollTop = this.scrollTop;
+            this.value =
+              this.value.substring(0, startPos) +
+              text +
+              this.value.substring(endPos, this.value.length);
+            this.focus();
+            this.selectionStart = startPos + text.length;
+            this.selectionEnd = startPos + text.length;
+            this.scrollTop = scrollTop;
+          } else {
+            // IE input[type=text] and other browsers
+            this.value += text;
+            this.focus();
+            this.value = this.value; // forces cursor to end
+          }
+        });
+      };
+
+      function getAroundCaret(el, length) {
         // Return a selection of 2 * length characters around the caret
         var startPos = el.selectionStart;
         return el.value.substring(startPos - length, startPos + length);
-    };
-
+      }
 
-    $(content).keydown(function (_event) {
-        if (_event.keyCode == 13 && (_event.ctrlKey || _event.metaKey)) {
+      $(content)
+        .keydown(function (_event) {
+          if (_event.keyCode == 13 && (_event.ctrlKey || _event.metaKey)) {
             // Insert current timestamp
             _event.preventDefault();
             // Get current value
             var match = /\[([\d:]+)\]/.exec(getAroundCaret(content[0], 8));
             if (match) {
-                // Found a timecode. Go to position.
-                widget.media.setCurrentTime(IriSP.timestamp2ms(match[1]));
+              // Found a timecode. Go to position.
+              widget.media.setCurrentTime(ns.timestamp2ms(match[1]));
             } else {
-                $(content).insertAtCaret("[" + (new IriSP.Model.Time(widget.media.getCurrentTime())).toString() + "]");
-                save_content();
+              $(content).insertAtCaret(
+                "[" +
+                  new ns.Model.Time(widget.media.getCurrentTime()).toString() +
+                  "]"
+              );
+              save_content();
             }
-        }
-    }).on("input", function (_event) {
-        console.log("Change");
-        // Store updated value
-        save_content();
-    }).on("dblclick", function (_event) {
-            var match = /\[([\d:]+)\]/.exec(getAroundCaret(content[0], 8));
-            if (match) {
-                // Found a timecode. Go to position.
-                _event.preventDefault();
-                widget.media.setCurrentTime(IriSP.timestamp2ms(match[1]));
-            };
-    });
+          }
+        })
+        .on("input", function (_event) {
+          // Store updated value
+          save_content();
+        })
+        .on("dblclick", function (_event) {
+          var match = /\[([\d:]+)\]/.exec(getAroundCaret(content[0], 8));
+          if (match) {
+            // Found a timecode. Go to position.
+            _event.preventDefault();
+            widget.media.setCurrentTime(ns.timestamp2ms(match[1]));
+          }
+        });
+    }
+  };
 };
+
+export { NoteTaking, noteTakingStyles };
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/widgets/NoteTaking.module.css	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,5 @@
+/* NoteTaking widget */
+.Ldt-NoteTaking-Text {
+    width: 100%;
+    min-height: 360px;
+}
--- a/src/widgets/PlaceholderPlayer.css	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-.Ldt-PlaceholderPlayer {
-    font-size: 40px; text-align: center;
-    padding: 40px 0; font-weight: bolder;
-    background: #333333; color: #FFFFFF;
-}
--- a/src/widgets/PlaceholderPlayer.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/widgets/PlaceholderPlayer.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,69 +1,71 @@
 /* This is a fake player, for when no video is available */
+import placeholderPlayerStyles from "./PlaceholderPlayer.module.css";
 
-IriSP.Widgets.PlaceholderPlayer = function(player, config) {
-    IriSP.Widgets.Widget.call(this, player, config);
-};
-
-IriSP.Widgets.PlaceholderPlayer.prototype = new IriSP.Widgets.Widget();
+const PlaceholderPlayer = function (ns) {
+  return class extends ns.Widgets.Widget {
+    constructor(player, config) {
+      super(player, config);
+    }
 
-IriSP.Widgets.PlaceholderPlayer.prototype.defaults = {
-    autostart: false
-};
+    static defaults = {
+      autostart: false,
+    };
 
-IriSP.Widgets.PlaceholderPlayer.prototype.template = '<div class="Ldt-PlaceholderPlayer">(loading)</div>';
+    static template = '<div class="Ldt-PlaceholderPlayer">(loading)</div>';
 
-IriSP.Widgets.PlaceholderPlayer.prototype.draw = function() {
-    
-    this.renderTemplate();
-    
-    var paused = true,
+    draw() {
+      this.renderTemplate();
+
+      var paused = true,
         timeDelta = 0,
-        currentTime = new IriSP.Model.Time(0),
+        currentTime = new ns.Model.Time(0),
         media = this.media,
         sel = this.$.find(".Ldt-PlaceholderPlayer");
-    
-    function updateTime() {
+
+      function updateTime() {
         if (!paused) {
-            currentTime = new IriSP.Model.Time(new Date().valueOf() - timeDelta);
-            if (currentTime <= media.duration) {
-                media.trigger("timeupdate", currentTime);
-                setTimeout(updateTime, 100);
-            } else {
-                currentTime = media.duration;
-                media.pause();
-            }
+          currentTime = new ns.Model.Time(new Date().valueOf() - timeDelta);
+          if (currentTime <= media.duration) {
+            media.trigger("timeupdate", currentTime);
+            setTimeout(updateTime, 100);
+          } else {
+            currentTime = media.duration;
+            media.pause();
+          }
         }
         sel.text(currentTime.toString(true));
-    }
-    
-    
-    // Binding functions to Popcorn
-    media.on("setcurrenttime", function(_milliseconds) {
+      }
+
+      // Binding functions to Popcorn
+      media.on("setcurrenttime", function (_milliseconds) {
         timeDelta = new Date().valueOf() - _milliseconds;
-        currentTime = new IriSP.Model.Time(_milliseconds);
+        currentTime = new ns.Model.Time(_milliseconds);
         media.trigger("seeked");
         media.trigger("timeupdate", currentTime);
         sel.text(currentTime.toString(true));
-    });
-    
-    media.on("setplay", function() {
+      });
+
+      media.on("setplay", function () {
         paused = false;
-        timeDelta = new Date().valueOf() - currentTime
+        timeDelta = new Date().valueOf() - currentTime;
         media.trigger("play");
         updateTime();
-    });
-    
-    media.on("setpause", function() {
+      });
+
+      media.on("setpause", function () {
         paused = true;
         media.trigger("pause");
         updateTime();
-    });
-    
-    media.trigger("loadedmetadata");
-    media.trigger("setcurrenttime", 0);
-    
-    if (this.autostart) {
+      });
+
+      media.trigger("loadedmetadata");
+      media.trigger("setcurrenttime", 0);
+
+      if (this.autostart) {
         media.trigger("setplay");
+      }
     }
-    
-};
\ No newline at end of file
+  };
+};
+
+export { PlaceholderPlayer, placeholderPlayerStyles };
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/widgets/PlaceholderPlayer.module.css	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,5 @@
+.Ldt-PlaceholderPlayer {
+    font-size: 40px; text-align: center;
+    padding: 40px 0; font-weight: bolder;
+    background: #333333; color: #FFFFFF;
+}
--- a/src/widgets/Polemic.css	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,22 +0,0 @@
-/*
- * Polemic Widget CSS
- */
-
-.Ldt-Polemic {
-    border-style: solid none; border-color: #cccccc; border-width: 1px;
-}
-
-.Ldt-Polemic-Position {
-    background: #fc00ff;
-    position: absolute;
-    top: 0;
-    left: 0;
-    margin-left: -1px;
-    width: 2px;
-    height: 100%;
-}
-
-.Ldt-Polemic-TweetDiv {
-    position: absolute;
-}
-
--- a/src/widgets/Polemic.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/widgets/Polemic.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,249 +1,269 @@
-IriSP.Widgets.Polemic = function(player, config) {
-    IriSP.Widgets.Widget.call(this, player, config);
-};
+import Mustache from "mustache";
+import _ from "lodash";
+import jQuery from "jquery";
+import polemicStyles from "./Polemic.module.css";
 
-IriSP.Widgets.Polemic.prototype = new IriSP.Widgets.Widget();
-
-IriSP.Widgets.Polemic.prototype.messages = {
-    fr: {
+const Polemic = function (ns) {
+  return class extends ns.Widgets.Widget {
+    static messages =  {
+      fr: {
         from_: "de ",
         _to_: " à ",
-        _annotations: " annotation(s)"
-    },
-    en: {
+        _annotations: " annotation(s)",
+      },
+      en: {
         from_: "from ",
         _to_: " to ",
-        _annotations: " annotation(s)"
-    }
-};
+        _annotations: " annotation(s)",
+      },
+    };
 
-IriSP.Widgets.Polemic.prototype.defaults = {
-    element_width : 5,
-    element_height : 5,
-    max_elements: 20,
-    annotation_type : "tweet",
-    defaultcolor : "#585858",
-    foundcolor : "#fc00ff",
-    default_version : "1",
-    polemics : {
-        "1" : [
-            {
-                "name" : "OK",
-                "keywords" : [ "++" ],
-                "color" : "#1D973D"
-            },
-            {
-                "name" : "KO",
-                "keywords" : [ "--" ],
-                "color" : "#CE0A15"
-            },
-            {
-                "name" : "REF",
-                "keywords" : [ "==", "http://" ],
-                "color" : "#C5A62D"
-            },
-            {
-                "name" : "Q",
-                "keywords" : [ "?" ],
-                "color" : "#036AAE"
-            }
+    static defaults = {
+      element_width: 5,
+      element_height: 5,
+      max_elements: 20,
+      annotation_type: "tweet",
+      defaultcolor: "#585858",
+      foundcolor: "#fc00ff",
+      default_version: "1",
+      polemics: {
+        1: [
+          {
+            name: "OK",
+            keywords: ["++"],
+            color: "#1D973D",
+          },
+          {
+            name: "KO",
+            keywords: ["--"],
+            color: "#CE0A15",
+          },
+          {
+            name: "REF",
+            keywords: ["==", "http://"],
+            color: "#C5A62D",
+          },
+          {
+            name: "Q",
+            keywords: ["?"],
+            color: "#036AAE",
+          },
         ],
-        "2" : [
-            {
-                "name" : "OK",
-                "keywords" : [ "++" ],
-                "color" : "#1D973D"
-            },
-            {
-                "name" : "KO",
-                "keywords" : [ "!!" ],
-                "color" : "#CE0A15"
-            },
-            {
-                "name" : "REF",
-                "keywords" : [ "==", "http://" ],
-                "color" : "#C5A62D"
-            },
-            {
-                "name" : "Q",
-                "keywords" : [ "?" ],
-                "color" : "#036AAE"
-            }
-        ]
+        2: [
+          {
+            name: "OK",
+            keywords: ["++"],
+            color: "#1D973D",
+          },
+          {
+            name: "KO",
+            keywords: ["!!"],
+            color: "#CE0A15",
+          },
+          {
+            name: "REF",
+            keywords: ["==", "http://"],
+            color: "#C5A62D",
+          },
+          {
+            name: "Q",
+            keywords: ["?"],
+            color: "#036AAE",
+          },
+        ],
+      },
+    };
+
+    constructor(player, config) {
+      super(player, config);
     }
-};
 
-IriSP.Widgets.Polemic.prototype.getPolemics = function(version) {
-    if(typeof(version) === "undefined" || !version) {
+    getPolemics(version) {
+      if (typeof version === "undefined" || !version) {
         version = this.default_version;
-    }
-    if(this.polemics.constructor === Array) {
+      }
+      if (this.polemics.constructor === Array) {
         return this.polemics;
-    } else {
+      } else {
         return this.polemics[version];
+      }
     }
-};
-
-IriSP.Widgets.Polemic.prototype.drawNoStackgraph = function(_max, _slices) {
 
-    var _this = this;
-    this.is_stackgraph = false;
-    if (_max) {
-
+    drawNoStackgraph(_max, _slices) {
+      var _this = this;
+      this.is_stackgraph = false;
+      if (_max) {
         this.height = (2 + _max) * this.element_height;
         this.$zone.css({
-            width: this.width + "px",
-            height: this.height + "px",
-            position: "relative"
+          width: this.width + "px",
+          height: this.height + "px",
+          position: "relative",
         });
 
         var _x = 0;
 
         function displayAnnotation(_elx, _ely, _pol, _col, _annotation) {
-            var _htmlAnnot = Mustache.to_html(
-                '<div class="Ldt-Polemic-TweetDiv Ldt-TraceMe" trace-info="annotation-id:{{id}}, media-id:{{media_id}}, polemic:{{polemic}}, time:{{time}}" polemic-color="{{color}}"'
-                + ' tweet-title="{{title}}" annotation-id="{{id}}" style="width: {{width}}px; height: {{height}}px; top: {{top}}px; left: {{left}}px; background: {{color}}"></div>',
+          var _htmlAnnot = Mustache.render(
+            '<div class="Ldt-Polemic-TweetDiv Ldt-TraceMe" trace-info="annotation-id:{{id}}, media-id:{{media_id}}, polemic:{{polemic}}, time:{{time}}" polemic-color="{{color}}"' +
+              ' tweet-title="{{title}}" annotation-id="{{id}}" style="width: {{width}}px; height: {{height}}px; top: {{top}}px; left: {{left}}px; background: {{color}}"></div>',
             {
-                id: _annotation.id,
-                media_id: _this.source.currentMedia.id,
-                polemic: _pol,
-                left: _elx,
-                top: _ely,
-                color: _col,
-                width: (_this.element_width-1),
-                height: _this.element_height,
-                title: _annotation.title,
-                time: _annotation.begin.toString()
-            });
-            var _el = IriSP.jQuery(_htmlAnnot);
-            _el.mouseover(function() {
-                _annotation.trigger("select");
-            }).mouseout(function() {
-                _annotation.trigger("unselect");
-            }).click(function() {
-                _annotation.trigger("click");
-                return false;
+              id: _annotation.id,
+              media_id: _this.source.currentMedia.id,
+              polemic: _pol,
+              left: _elx,
+              top: _ely,
+              color: _col,
+              width: _this.element_width - 1,
+              height: _this.element_height,
+              title: _annotation.title,
+              time: _annotation.begin.toString(),
+            }
+          );
+          var _el = jQuery(_htmlAnnot);
+          _el
+            .on("mouseover", function () {
+              _annotation.trigger("select");
+            })
+            .on("mouseout", function () {
+              _annotation.trigger("unselect");
+            })
+            .on("click", function () {
+              _annotation.trigger("click");
+              return false;
             });
-            IriSP.attachDndData(_el, {
-                title: _annotation.title,
-                description: _annotation.description,
-                image: _annotation.thumbnail,
-                uri: (typeof _annotation.url !== "undefined"
-                    ? _annotation.url
-                    : (document.location.href.replace(/#.*$/,'') + '#id='  + _annotation.id)),
-            text: '[' + _annotation.begin.toString() + '] ' + _annotation.title
-            });
-            // test if annotation has several colors.
-            var colAr = [];
-            var _polemicVersion = (_annotation.content && _annotation.content.polemic_version) || _this.default_version,
-                _polemics = _this.getPolemics(_polemicVersion) || [],
-                _pol,
-                _polKey,
-                _polDef,
-                _rgxp;
-
-            for(var _j = 0; _j < _polemics.length; _j++) {
-                _pol = _polemics[_j];
-                _rgxp = IriSP.Model.regexpFromTextOrArray(_pol.keywords);
-                if(_rgxp.test(_annotation.description)) {
-                    colAr.push(_pol.color);
-                }
-            }
+          ns.attachDndData(_el, {
+            title: _annotation.title,
+            description: _annotation.description,
+            image: _annotation.thumbnail,
+            uri:
+              typeof _annotation.url !== "undefined"
+                ? _annotation.url
+                : document.location.href.replace(/#.*$/, "") +
+                  "#id=" +
+                  _annotation.id,
+            text: "[" + _annotation.begin.toString() + "] " + _annotation.title,
+          });
+          // test if annotation has several colors.
+          var colAr = [];
+          var _polemicVersion =
+              (_annotation.content && _annotation.content.polemic_version) ||
+              _this.default_version,
+            _polemics = _this.getPolemics(_polemicVersion) || [],
+            _pol,
+            _polKey,
+            _polDef,
+            _rgxp;
 
-            // display annotation
-            _annotation.on("select", function() {
-                if (_this.tooltip) {
-                    _this.tooltip.show(
-                        + Math.floor(_elx + (_this.element_width - 1) / 2),
-                        + _ely,
-                        _annotation.title,
-                        ( (colAr.length>1) ? colAr : _col )
-                    );
-                }
-                _this.$tweets.each(function() {
-                    var _e = IriSP.jQuery(this);
-                    _e.css(
-                        "opacity",
-                        ( _e.attr("annotation-id") == _annotation.id ? 1 : .3 )
-                    );
-                });
-            });
-            _annotation.on("unselect", function() {
-                if (_this.tooltip) {
-                    _this.tooltip.hide();
-                }
-                _this.$tweets.css("opacity",1);
+          for (var _j = 0; _j < _polemics.length; _j++) {
+            _pol = _polemics[_j];
+            _rgxp = ns.Model.regexpFromTextOrArray(_pol.keywords);
+            if (_rgxp.test(_annotation.description)) {
+              colAr.push(_pol.color);
+            }
+          }
+
+          // display annotation
+          _annotation.on("select", function () {
+            if (_this.tooltip) {
+              _this.tooltip.show(
+                +Math.floor(_elx + (_this.element_width - 1) / 2),
+                +_ely,
+                _annotation.title,
+                colAr.length > 1 ? colAr : _col
+              );
+            }
+            _this.$tweets.each(function () {
+              var _e = jQuery(this);
+              _e.css(
+                "opacity",
+                _e.attr("annotation-id") == _annotation.id ? 1 : 0.3
+              );
             });
-            _annotation.on("found", function() {
-                _el.css({
-                    "background" : _this.foundcolor,
-                    "opacity" : 1
-                });
+          });
+          _annotation.on("unselect", function () {
+            if (_this.tooltip) {
+              _this.tooltip.hide();
+            }
+            _this.$tweets.css("opacity", 1);
+          });
+          _annotation.on("found", function () {
+            _el.css({
+              background: _this.foundcolor,
+              opacity: 1,
             });
-            _annotation.on("not-found", function() {
-                _el.css({
-                    "background" : _col,
-                    "opacity" : .3
-                });
+          });
+          _annotation.on("not-found", function () {
+            _el.css({
+              background: _col,
+              opacity: 0.3,
             });
-            _this.$zone.append(_el);
-        };
+          });
+          _this.$zone.append(_el);
+        }
 
-        IriSP._(_slices).forEach(function(_slice) {
-            var _y = _this.height;
-            _slice.annotations.forEach(function(_annotation) {
-                _y -= _this.element_height;
-                displayAnnotation(_x, _y, "none", _this.defaultcolor, _annotation);
+        _(_slices).forEach(function (_slice) {
+          var _y = _this.height;
+          _slice.annotations.forEach(function (_annotation) {
+            _y -= _this.element_height;
+            displayAnnotation(_x, _y, "none", _this.defaultcolor, _annotation);
+          });
+          _(_slice.polemicStacks).forEach(function (_annotations) {
+            var _color = _annotations.polemicDef.color,
+              _polemic = _annotations.polemicDef.name;
+            _annotations.annotations.forEach(function (_annotation) {
+              _y -= _this.element_height;
+              displayAnnotation(_x, _y, _polemic, _color, _annotation);
             });
-            IriSP._(_slice.polemicStacks).forEach(function(_annotations) {
-                var _color = _annotations.polemicDef.color,
-                    _polemic = _annotations.polemicDef.name;
-                _annotations.annotations.forEach(function(_annotation) {
-                    _y -= _this.element_height;
-                    displayAnnotation(_x, _y, _polemic, _color, _annotation);
-                });
-            });
-            _x += _this.element_width;
+          });
+          _x += _this.element_width;
         });
 
         this.$tweets = this.$.find(".Ldt-Polemic-TweetDiv");
 
-        this.source.getAnnotations().on("search-cleared", function() {
-            _this.$tweets.each(function() {
-                var _el = IriSP.jQuery(this);
-                _el.css({
-                    "background" : _el.attr("polemic-color"),
-                    "opacity" : 1
-                });
+        this.source.getAnnotations().on("search-cleared", function () {
+          _this.$tweets.each(function () {
+            var _el = jQuery(this);
+            _el.css({
+              background: _el.attr("polemic-color"),
+              opacity: 1,
             });
+          });
         });
+      } else {
+        this.$zone.hide();
+      }
+    }
 
-    } else {
-        this.$zone.hide();
-    }
-}
+    drawStackgraph(_max, _slices) {
+      this.is_stackgraph = true;
 
-IriSP.Widgets.Polemic.prototype.drawStackgraph = function(_max, _slices) {
-    this.is_stackgraph = true;
+      var _this = this;
 
-    var _this = this;
-
-    this.height = (2 + this.max_elements) * this.element_height;
-    this.$zone.css({
+      this.height = (2 + this.max_elements) * this.element_height;
+      this.$zone.css({
         width: this.width + "px",
         height: this.height + "px",
-        position: "relative"
-    });
+        position: "relative",
+      });
+
+      var _x = 0,
+        _html = "",
+        _scale = (this.max_elements * this.element_height) / _max;
 
-    var _x = 0,
-        _html = '',
-        _scale = this.max_elements * this.element_height / _max;
-
-    function displayStackElement(_x, _y, _h, _color, _nums, _begin, _end, _polemic) {
-        _html += Mustache.to_html(
-            '<div class="Ldt-Polemic-TweetDiv Ldt-TraceMe" trace-info="annotation-block, media-id={{media_id}}, polemic={{polemic}}, time:{{begin}}" pos-x="{{posx}}" pos-y="{{top}}" annotation-counts="{{nums}}" begin-time="{{begin}}" end-time="{{end}}"'
-            + ' style="width: {{width}}px; height: {{height}}px; top: {{top}}px; left: {{left}}px; background: {{color}}"></div>',
-        {
+      function displayStackElement(
+        _x,
+        _y,
+        _h,
+        _color,
+        _nums,
+        _begin,
+        _end,
+        _polemic
+      ) {
+        _html += Mustache.render(
+          '<div class="Ldt-Polemic-TweetDiv Ldt-TraceMe" trace-info="annotation-block, media-id={{media_id}}, polemic={{polemic}}, time:{{begin}}" pos-x="{{posx}}" pos-y="{{top}}" annotation-counts="{{nums}}" begin-time="{{begin}}" end-time="{{end}}"' +
+            ' style="width: {{width}}px; height: {{height}}px; top: {{top}}px; left: {{left}}px; background: {{color}}"></div>',
+          {
             nums: _nums,
             posx: Math.floor(_x + (_this.element_width - 1) / 2),
             media_id: _this.source.currentMedia.id,
@@ -251,164 +271,218 @@
             left: _x,
             top: _y,
             color: _color,
-            width: (_this.element_width-1),
+            width: _this.element_width - 1,
             height: _h,
             begin: _begin,
-            end: _end
+            end: _end,
+          }
+        );
+      }
+
+      _(_slices).forEach(function (_slice) {
+        var _y = _this.height,
+          _nums =
+            _slice.annotations.length +
+            "|" +
+            _this.defaultcolor +
+            "," +
+            _(_slice.polemicStacks)
+              .map(function (_annotations) {
+                return (
+                  _annotations.annotations.length +
+                  "|" +
+                  _annotations.polemicDef.color
+                );
+              })
+              .join(",");
+        if (_slice.annotations.length) {
+          var _h = Math.ceil(_scale * _slice.annotations.length);
+          _y -= _h;
+          displayStackElement(
+            _x,
+            _y,
+            _h,
+            _this.defaultcolor,
+            _nums,
+            _slice.begin,
+            _slice.end,
+            "none"
+          );
+        }
+        _(_slice.polemicStacks).forEach(function (_annotations) {
+          if (_annotations.annotations.length) {
+            var _color = _annotations.polemicDef.color,
+              _polemic = _annotations.polemicDef.name,
+              _h = Math.ceil(_scale * _annotations.annotations.length);
+            _y -= _h;
+            displayStackElement(
+              _x,
+              _y,
+              _h,
+              _color,
+              _nums,
+              _slice.begin,
+              _slice.end,
+              _polemic
+            );
+          }
+        });
+        _x += _this.element_width;
+      });
+
+      this.$zone.append(_html);
+
+      this.$tweets = this.$.find(".Ldt-Polemic-TweetDiv");
+
+      this.$tweets
+        .mouseover(function () {
+          var _el = jQuery(this),
+            _nums = _el.attr("annotation-counts").split(","),
+            _html =
+              "<p>" +
+              _this.l10n.from_ +
+              _el.attr("begin-time") +
+              _this.l10n._to_ +
+              _el.attr("end-time") +
+              "</p>";
+          _html = _.reduce(
+            _nums,
+            function (_htmlStr, _countStr) {
+              var _components = _countStr.split("|");
+              _htmlStr +=
+                '<div class="Ldt-Tooltip-AltColor" style="background: ' +
+                _components[1] +
+                '"></div><p>' +
+                _components[0] +
+                _this.l10n._annotations +
+                "</p>";
+              return _htmlStr;
+            },
+            _html
+          );
+          if (_this.tooltip) {
+            _this.tooltip.show(+_el.attr("pos-x"), +_el.attr("pos-y"), _html);
+          }
+        })
+        .mouseout(function () {
+          if (_this.tooltip) {
+            _this.tooltip.hide();
+          }
         });
     }
 
-    IriSP._(_slices).forEach(function(_slice) {
-        var _y = _this.height,
-            _nums = _slice.annotations.length + "|" + _this.defaultcolor + "," + IriSP._(_slice.polemicStacks).map(function(_annotations) {
-                return _annotations.annotations.length + "|" + _annotations.polemicDef.color;
-            }).join(",");
-        if (_slice.annotations.length) {
-            var _h = Math.ceil(_scale * _slice.annotations.length);
-            _y -= _h;
-            displayStackElement(_x, _y, _h, _this.defaultcolor, _nums, _slice.begin, _slice.end, "none");
-        }
-        IriSP._(_slice.polemicStacks).forEach(function(_annotations) {
-            if (_annotations.annotations.length) {
-                var _color = _annotations.polemicDef.color,
-                    _polemic = _annotations.polemicDef.name,
-                    _h = Math.ceil(_scale * _annotations.annotations.length);
-                _y -= _h;
-                displayStackElement(_x, _y, _h, _color, _nums, _slice.begin, _slice.end, _polemic);
-            }
-        });
-        _x += _this.element_width;
-    });
-
-    this.$zone.append(_html);
-
-    this.$tweets = this.$.find(".Ldt-Polemic-TweetDiv");
+    draw() {
+      this.onMediaEvent("timeupdate", "onTimeupdate");
+      this.$zone = jQuery("<div>");
+      this.$zone.addClass("Ldt-Polemic");
+      this.$.append(this.$zone);
 
-    this.$tweets
-        .mouseover(function() {
-            var _el = IriSP.jQuery(this),
-                _nums = _el.attr("annotation-counts").split(","),
-                _html = '<p>' + _this.l10n.from_ + _el.attr("begin-time") + _this.l10n._to_ + _el.attr("end-time") + '</p>';
-            _html = IriSP._.reduce(_nums, function(_htmlStr, _countStr) {
-                var _components = _countStr.split("|");
-                _htmlStr += '<div class="Ldt-Tooltip-AltColor" style="background: ' + _components[1] + '"></div><p>' + _components[0] + _this.l10n._annotations + '</p>';
-                return _htmlStr;
-            }, _html);
-            if (_this.tooltip) {
-                _this.tooltip.show(+ _el.attr("pos-x"), + _el.attr("pos-y"), _html);
-            }
-        })
-        .mouseout(function() {
-            if (_this.tooltip) {
-                _this.tooltip.hide();
-            }
-        });
-}
-
+      this.$elapsed = jQuery("<div>").css({
+        background: "#cccccc",
+        position: "absolute",
+        top: 0,
+        left: 0,
+        width: 0,
+        height: "100%",
+      });
 
-IriSP.Widgets.Polemic.prototype.draw = function() {
-
-    this.onMediaEvent("timeupdate", "onTimeupdate");
-    this.$zone = IriSP.jQuery('<div>');
-    this.$zone.addClass("Ldt-Polemic");
-    this.$.append(this.$zone);
+      this.$zone.append(this.$elapsed);
 
-    this.$elapsed = IriSP.jQuery('<div>')
-        .css({
-            background: '#cccccc',
-            position: "absolute",
-            top: 0,
-            left: 0,
-            width: 0,
-            height: "100%"
-        });
-
-    this.$zone.append(this.$elapsed);
-
-    // we don't filter with null duration anymore
-    var _slices = [],
-        _slice_count = Math.floor( this.width / this.element_width ),
+      // we don't filter with null duration anymore
+      var _slices = [],
+        _slice_count = Math.floor(this.width / this.element_width),
         _duration = this.source.getDuration(),
         _max = 0,
         _list = this.getWidgetAnnotations(),
         _this = this;
 
-    for (var _i = 0; _i < _slice_count; _i++) {
-        var _begin = new IriSP.Model.Time( _i * _duration / _slice_count ),
-            _end = new IriSP.Model.Time( ( _i + 1 ) * _duration / _slice_count ),
-            _count = 0,
-            _res = {
-                begin : _begin.toString(),
-                end : _end.toString(),
-                annotations : _list.filter(function(_annotation) {
-                    return _annotation.begin >= _begin && _annotation.begin < _end;
-                }),
-                polemicStacks : {}
-            };
+      for (var _i = 0; _i < _slice_count; _i++) {
+        var _begin = new ns.Model.Time((_i * _duration) / _slice_count),
+          _end = new ns.Model.Time(((_i + 1) * _duration) / _slice_count),
+          _count = 0,
+          _res = {
+            begin: _begin.toString(),
+            end: _end.toString(),
+            annotations: _list.filter(function (_annotation) {
+              return _annotation.begin >= _begin && _annotation.begin < _end;
+            }),
+            polemicStacks: {},
+          };
 
-        _res.annotations = _res.annotations.filter(function(_annotation) {
-            var _polemicVersion = (_annotation.content && _annotation.content.polemic_version) || _this.default_version,
-                _polemics = _this.getPolemics(_polemicVersion) || [],
-                _pol,
-                _polKey,
-                _polDef,
-                _rgxp,
-                _notMatched = true;
+        _res.annotations = _res.annotations.filter(function (_annotation) {
+          var _polemicVersion =
+              (_annotation.content && _annotation.content.polemic_version) ||
+              _this.default_version,
+            _polemics = _this.getPolemics(_polemicVersion) || [],
+            _pol,
+            _polKey,
+            _polDef,
+            _rgxp,
+            _notMatched = true;
+
+          for (var _j = 0; _j < _polemics.length; _j++) {
+            _pol = _polemics[_j];
+            _rgxp = ns.Model.regexpFromTextOrArray(_pol.keywords);
 
-            for(var _j = 0; _j < _polemics.length; _j++) {
-                _pol = _polemics[_j];
-                _rgxp = IriSP.Model.regexpFromTextOrArray(_pol.keywords);
-
-                if(_rgxp.test(_annotation.description)) {
-                    _polKey = _polemicVersion + "_" + _pol.name;
-                    _polDef = _res.polemicStacks[_polKey] || (_res.polemicStacks[_polKey] = { 'polemicDef' : _pol, 'annotations': []});
-                    _polDef.annotations.push(_annotation);
-                    _notMatched = false;
-                    _count++;
-                }
+            if (_rgxp.test(_annotation.description)) {
+              _polKey = _polemicVersion + "_" + _pol.name;
+              _polDef =
+                _res.polemicStacks[_polKey] ||
+                (_res.polemicStacks[_polKey] = {
+                  polemicDef: _pol,
+                  annotations: [],
+                });
+              _polDef.annotations.push(_annotation);
+              _notMatched = false;
+              _count++;
             }
-            return _notMatched;
+          }
+          return _notMatched;
         });
         _count += _res.annotations.length;
 
         _max = Math.max(_max, _count);
         _slices.push(_res);
-    }
+      }
+
+      if (_max < this.max_elements) {
+        this.drawNoStackgraph(_max, _slices);
+      } else {
+        this.drawStackgraph(_max, _slices);
+      }
+
+      this.$position = jQuery("<div>").addClass("Ldt-Polemic-Position");
+
+      this.$zone.append(this.$position);
 
-    if (_max < this.max_elements) {
-        this.drawNoStackgraph(_max, _slices);
-    } else {
-        this.drawStackgraph(_max, _slices);
+      this.$zone.on("click", function (_e) {
+        var _x = _e.pageX - _this.$zone.offset().left;
+        _this.media.setCurrentTime((_this.media.duration * _x) / _this.width);
+      });
+
+      this.$.append('<div class="Ldt-Polemic-Tooltip"></div>');
+
+      this.insertSubwidget(
+        this.$.find(".Ldt-Polemic-Tooltip"),
+        {
+          type: "Tooltip",
+          min_x: 0,
+          max_x: this.width,
+        },
+        "tooltip"
+      );
     }
 
-    this.$position = IriSP.jQuery('<div>').addClass("Ldt-Polemic-Position");
-
-    this.$zone.append(this.$position);
-
-    this.$zone.click(function(_e) {
-        var _x = _e.pageX - _this.$zone.offset().left;
-        _this.media.setCurrentTime(_this.media.duration * _x / _this.width);
-    });
-
-    this.$.append('<div class="Ldt-Polemic-Tooltip"></div>');
-
-    this.insertSubwidget(
-        this.$.find(".Ldt-Polemic-Tooltip"),
-        {
-            type: "Tooltip",
-            min_x: 0,
-            max_x: this.width
-        },
-        "tooltip"
-    );
+    onTimeupdate(_time) {
+      var _x = Math.floor((this.width * _time) / this.media.duration);
+      this.$elapsed.css({
+        width: _x + "px",
+      });
+      this.$position.css({
+        left: _x + "px",
+      });
+    }
+  };
 };
 
-IriSP.Widgets.Polemic.prototype.onTimeupdate = function(_time) {
-    var _x = Math.floor( this.width * _time / this.media.duration);
-    this.$elapsed.css({
-        width:  _x + "px"
-    });
-    this.$position.css({
-        left: _x + "px"
-    });
-};
+export { Polemic, polemicStyles };
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/widgets/Polemic.module.css	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,22 @@
+/*
+ * Polemic Widget CSS
+ */
+
+.Ldt-Polemic {
+    border-style: solid none; border-color: #cccccc; border-width: 1px;
+}
+
+.Ldt-Polemic-Position {
+    background: #fc00ff;
+    position: absolute;
+    top: 0;
+    left: 0;
+    margin-left: -1px;
+    width: 2px;
+    height: 100%;
+}
+
+.Ldt-Polemic-TweetDiv {
+    position: absolute;
+}
+
--- a/src/widgets/PopcornPlayer.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/widgets/PopcornPlayer.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,139 +1,147 @@
-IriSP.Widgets.PopcornPlayer = function(player, config) {
-    IriSP.Widgets.Widget.call(this, player, config);
-};
-
-IriSP.Widgets.PopcornPlayer.prototype = new IriSP.Widgets.Widget();
+import jQuery from "jquery";
 
-/* A Popcorn-based player for HTML5 Video, Youtube and Vimeo */
-
-IriSP.Widgets.PopcornPlayer.prototype.defaults = {
-};
-
-IriSP.Widgets.PopcornPlayer.prototype.draw = function() {
-    if (typeof this.video === "undefined") {
-        this.video = this.media.video;
+const PopcornPlayer = function (ns) {
+  return class extends ns.Widgets.Widget {
+    constructor(player, config) {
+      super(player, config);
     }
 
-    if (this.url_transform) {
-        this.video = this.url_transform(this.video);
-    }
+    /* A Popcorn-based player for HTML5 Video, Youtube and Vimeo */
+
+    static defaults = {};
 
-    var _url = this.video;
+    draw() {
+      if (typeof this.video === "undefined") {
+        this.video = this.media.video;
+      }
 
-    if (/^(https?:\/\/)?(www\.)?youtube\.com/.test(this.video)) {
+      if (this.url_transform) {
+        this.video = this.url_transform(this.video);
+      }
+
+      var _url = this.video;
+
+      if (/^(https?:\/\/)?(www\.)?youtube\.com/.test(this.video)) {
         /* YOUTUBE */
         var _urlparts = this.video.split(/[?&]/),
-            _params = {};
+          _params = {};
         for (var i = 1; i < _urlparts.length; i++) {
-            var _ppart = _urlparts[i].split('=');
-            _params[_ppart[0]] = decodeURIComponent(_ppart[1]);
+          var _ppart = _urlparts[i].split("=");
+          _params[_ppart[0]] = decodeURIComponent(_ppart[1]);
         }
         _params.controls = 0;
         _params.modestbranding = 1;
         if (this.autostart || this.autoplay) {
-            _params.autoplay = 1;
+          _params.autoplay = 1;
         }
-        _url = _urlparts[0] + '?' + IriSP.jQuery.param(_params);
+        _url = _urlparts[0] + "?" + jQuery.param(_params);
+      } // else {
+      //     /* DEFAULT HTML5 */
+      //     var _tmpId = ns._.uniqueId("popcorn"),
+      //         _videoEl = jQuery('<video>');
+      //     _videoEl.attr({
+      //         id : _tmpId,
+      //         width : this.width,
+      //         height : this.height || undefined
+      //     });
+      //     if(typeof this.video === "string"){
+      //         _videoEl.attr("src",this.video);
+      //     } else {
+      //         for (var i = 0; i < this.video.length; i++) {
+      //             var _srcNode = jQuery('<source>');
+      //             _srcNode.attr({
+      //                 src: this.video[i].src,
+      //                 type: this.video[i].type
+      //             });
+      //             _videoEl.append(_srcNode);
+      //         }
+      //     }
+      //     this.$.html(_videoEl);
+      // }
 
-    }// else {
-    //     /* DEFAULT HTML5 */
-    //     var _tmpId = IriSP._.uniqueId("popcorn"),
-    //         _videoEl = IriSP.jQuery('<video>');
-    //     _videoEl.attr({
-    //         id : _tmpId,
-    //         width : this.width,
-    //         height : this.height || undefined
-    //     });
-    //     if(typeof this.video === "string"){
-    //         _videoEl.attr("src",this.video);
-    //     } else {
-    //         for (var i = 0; i < this.video.length; i++) {
-    //             var _srcNode = IriSP.jQuery('<source>');
-    //             _srcNode.attr({
-    //                 src: this.video[i].src,
-    //                 type: this.video[i].type
-    //             });
-    //             _videoEl.append(_srcNode);
-    //         }
-    //     }
-    //     this.$.html(_videoEl);
-    // }
+      var _popcorn = global.Popcorn.smart("#" + this.container, _url);
+
+      if (this.autostart || this.autoplay) {
+        _popcorn.autoplay(true);
+      }
+
+      var _media = this.media;
 
-    var _popcorn = Popcorn.smart("#"+this.container, _url);
-
-    if (this.autostart || this.autoplay) {
-        _popcorn.autoplay(true);
-    }
-
-    var _media = this.media;
+      // Binding functions to Popcorn
 
-    // Binding functions to Popcorn
-
-    _media.on("setcurrenttime", function(_milliseconds) {
+      _media.on("setcurrenttime", function (_milliseconds) {
         _popcorn.currentTime(_milliseconds / 1000);
-    });
+      });
 
-    _media.on("setvolume", function(_vol) {
+      _media.on("setvolume", function (_vol) {
         _popcorn.volume(_vol);
         _media.volume = _vol;
-    });
+      });
 
-    _media.on("setmuted", function(_muted) {
+      _media.on("setmuted", function (_muted) {
         _popcorn.muted(_muted);
         _media.muted = _muted;
-    });
+      });
 
-    _media.on("setplay", function() {
+      _media.on("setplay", function () {
         _popcorn.play();
-    });
+      });
 
-    _media.on("setpause", function() {
+      _media.on("setpause", function () {
         _popcorn.pause();
-    });
-    _media.on("settimerange", function(_timeRange){
+      });
+      _media.on("settimerange", function (_timeRange) {
         _media.timeRange = _timeRange;
         try {
-            if (_media.getCurrentTime() > _timeRange[0] || _media.getCurrentTime() < _timeRange){
-                _popcorn.currentTime(_timeRange[0] / 1000);
-            }
-        } catch (err) {
-        }
-    })
-    _media.on("resettimerange", function(){
+          if (
+            _media.getCurrentTime() > _timeRange[0] ||
+            _media.getCurrentTime() < _timeRange
+          ) {
+            _popcorn.currentTime(_timeRange[0] / 1000);
+          }
+        } catch (err) {}
+      });
+      _media.on("resettimerange", function () {
         _media.timeRange = false;
-    })
-    // Binding Popcorn events to media
+      });
+      // Binding Popcorn events to media
 
-    function getVolume() {
+      function getVolume() {
         _media.muted = _popcorn.muted();
         _media.volume = _popcorn.volume();
-    }
+      }
 
-    _popcorn.on("loadedmetadata", function() {
+      _popcorn.on("loadedmetadata", function () {
         getVolume();
         _media.trigger("loadedmetadata");
         _media.trigger("volumechange");
-    });
+      });
 
-    _popcorn.on("timeupdate", function() {
-        _media.trigger("timeupdate", new IriSP.Model.Time(1000*_popcorn.currentTime()));
-    });
+      _popcorn.on("timeupdate", function () {
+        _media.trigger(
+          "timeupdate",
+          new ns.Model.Time(1000 * _popcorn.currentTime())
+        );
+      });
 
-    _popcorn.on("volumechange", function() {
+      _popcorn.on("volumechange", function () {
         getVolume();
         _media.trigger("volumechange");
-    });
+      });
 
-    _popcorn.on("play", function(e) {
+      _popcorn.on("play", function (e) {
         _media.trigger("play");
-    });
+      });
 
-    _popcorn.on("pause", function() {
+      _popcorn.on("pause", function () {
         _media.trigger("pause");
-    });
+      });
 
-    _popcorn.on("seeked", function() {
+      _popcorn.on("seeked", function () {
         _media.trigger("seeked");
-    });
+      });
+    }
+  };
+};
 
-};
+export { PopcornPlayer };
--- a/src/widgets/Quiz.css	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,224 +0,0 @@
-/* Nothing */
-
-.Ldt-Quiz-Container {
-  	position: absolute;
-  	height: calc(100% - 4px);
-  	top: 0px;
-  	width: calc(100% - 20px);
-	margin: auto;
-	border: 1px solid black;
-	font-size: 18pt;
-}
-
-.Ldt-Quiz-Title {
-    line-height: 1;
-    padding-top: 10px;
-    text-align: center;
-}
-
-.Ldt-Quiz-Header {
-	font-size: 12px;
-	color: black;
-	border-bottom: 1px solid green;
-	padding: 2px;
-    height: 22px;
-}
-
-.Ldt-Quiz-Content {
-    height: calc(100% - 82px);
-    overflow-y: auto;
-}
-
-.Ldt-Quiz-Footer {
-    height: 60px;
-	width: 100%;
-	position: absolute;
-	bottom: 0px;
-	border-top: 2px solid black;
-	background-color: white;
-}
-
-
-.Ldt-Quiz-Score {
-	display: inline-block;
-	position: absolute;
-	right: 20px;
-}
-
-.Ldt-Quiz-Index {
-	display: inline-block;
-}
-
-.Ldt-Quiz-Image {
-    max-width: 100%;
-    max-height: 100%;
-}
-
-.Ldt-Quiz-Questions {
-    height: calc(100% - 2.5em);
-    margin: 10px;
-    padding: 10px;
-    border-left: 5px solid gray;
-}
-
-.quiz-question-block {
-    padding-top: 10px;
-}
-.quiz-resource-block {
-    padding-top: 10px;
-    float: right;
-    max-height: 100%;
-    height: 100%;
-}
-.quiz-resource-block img {
-    max-height: 100%;
-    max-width: 100%;
-}
-
-.quiz-question-feedback {
-	font-size: 15px;
-}
-
-.quiz-question-feedback div {
-    display: inline-block;
-	height: 100%;
-}
-
-.quiz-question-correct-feedback:before, .quiz-question-incorrect-feedback:before {
-		                                    content: '';
-		                                    vertical-align: middle;
-		                                    display: inline-block;
-		                                    width: 48px;
-		                                    height: 48px;
-                                        }
-
-.quiz-question-correct-feedback:before {
-	background: url(img/valid_sprites.png) left top no-repeat;
-}
-
-.quiz-question-incorrect-feedback:before {
-	background: url(img/valid_sprites.png) -49px top no-repeat;
-}
-
-.Ldt-Quiz-Correct-Answer:before {
-	background: url(img/min_valid_sprites.png) left top no-repeat;
-}
-
-.Ldt-Quiz-Incorrect-Answer:before {
-	background: url(img/min_valid_sprites.png) -13px top no-repeat;
-}
-
-.Ldt-Quiz-Correct-Answer:before, .Ldt-Quiz-Incorrect-Answer:before {
-		                              content: '';
-		                              vertical-align: middle;
-		                              display: inline-block;
-		                              width: 12px;
-		                              height: 12px;
-                                  }
-
-.Ldt-Quiz-Submit {
-    margin: 10px;
-}
-
-.Ldt-Quiz-Submit .Ldt-Quiz-Submit-Skip-Link {
-    float: left;
-}
-
-.Ldt-Quiz-Submit-Skip-Link a {
-    text-decoration: none;
-    font-size: 16pt;
-}
-
-.Ldt-Quiz-Submit .Ldt-Quiz-Submit-Button {
-    float: right;
-}
-
-.Ldt-Quiz-Votes {
-    display: none;
-    height: 53px;
-    position: relative;
-}
-
-.Ldt-Quiz-Votes-Question {
-    font-size: 16px;
-    position: absolute;
-    top: 2px;
-    left: 0px;
-}
-
-.Ldt-Quiz-Votes-Buttons {
-    position: absolute;
-    bottom: 2px;
-    left: 0px;
-    right: 0px;
-}
-
-.Ldt-Quiz-Votes-Buttons div {
-    display: inline-block;
-    width: 33%;
-    text-align: center;
-}
-
-.Ldt-Quiz-Vote-Skip-Block {
-    width: 30% !important;
-    text-align: right;
-}
-
-.Ldt-Quiz-Vote-Skip-Block a {
-    text-decoration: none;
-}
-
-.Ldt-Quiz-Overlay {
-    position: absolute;
-    top: 0px;
-    background-color: white;
-    z-index: 5;
-    width: 100%;
-    height: 100%;
-}
-
-.Ldt-Pause-Add-Question {
-    background: url(img/quiz_add_question.svg) no-repeat;
-    background-position: center;
-    background-size: contain;
-  	position: absolute;
-    bottom: 40px;
-    right: 0px;
-    height: 15%;
-    width: 15%;
-    max-width: 64px;
-    max-height: 64px;
-    z-index: 10;
-}
-
-.Ldt-Quiz-Result {
-    position: absolute;
-	height: 0px;
-    bottom: 0;
-    left: 0;
-    right: 0;
-    background: #fde073;
-    text-align: center;
-    line-height: 2.5;
-    overflow: hidden;
-    -webkit-box-shadow: 0 0 5px black;
-    -moz-box-shadow:    0 0 5px black;
-    box-shadow:         0 0 5px black;
-}
-
-input[type="button"] {
-    border: none;
-    font-size: 18pt;
-    text-align: center;
-    background-color: #5BCE5B;
-    color: #fff;
-    cursor: pointer;
-}
-
-input[value="Non"] {
-    background-color: #F86060;
-}
-
-input.quiz-question:checked + .quiz-question-label {
-    text-decoration: underline;
-}
--- a/src/widgets/Quiz.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/widgets/Quiz.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,388 +1,543 @@
-IriSP.Widgets.Quiz = function(player, config) {
-    IriSP.Widgets.Widget.call(this, player, config);
-}
-
-IriSP.Widgets.Quiz.prototype = new IriSP.Widgets.Widget();
-
-IriSP.Widgets.Quiz.prototype.defaults = {
-    // annotation_type: "at_quiz",
-	quiz_activated: true,
-	api_serializer: "ldt_annotate",
-    analytics_api: "",
-    api_method: "POST",
-    user: "",
-    userid:""
-}
-
-IriSP.Widgets.Quiz.prototype.template = '<div class="Ldt-Quiz-Container">'
-	                                    + '<div class="Ldt-Quiz-Header">'
-                                        + '  <div class="Ldt-Quiz-Index"></div><div class="Ldt-Quiz-Score"></div>'
-                                        + '</div>'
-                                        + '<div class="Ldt-Quiz-Content">'
-                                        + '  <h1 class="Ldt-Quiz-Title">{{question}}</h1>'
-                                        + '  <div class="Ldt-Quiz-Questions">'
-                                        + '  </div>'
-                                        + '</div>'
-                                        + '<div class="Ldt-Quiz-Footer">'
-                                        + '  <div class="Ldt-Quiz-Votes">'
-                                        + '      <span class="Ldt-Quiz-Votes-Question">Avez-vous trouvé cette question utile ?</span>'
-                                        + '      <div class="Ldt-Quiz-Votes-Buttons">'
-                                        + '          <div class="Ldt-Quiz-Vote-Skip-Block"><a href="#" class="Ldt-Quiz-Vote-Skip">Passer</a></div>'
-                                        + '          <div><input type="button" value="Non" class="Ldt-Quiz-Vote-Useless" /></div>'
-                                        + '          <div><input type="button" value="Oui" class="Ldt-Quiz-Vote-Useful" /></div>'
-                                        + '      </div>'
-                                        + '  </div>'
-                                        + '  <div class="Ldt-Quiz-Submit">'
-                                        + '      <div class="Ldt-Quiz-Submit-Button"><input type="button" value="Valider" /></div>'
-                                        + '      <div class="Ldt-Quiz-Submit-Skip-Link"><a href="#">Passer</a></div><div style="clear:both;"></div>'
-                                        + '  </div>'
-                                        + '  <div class="Ldt-Quiz-Result">Bonne réponse</div>'
-                                        + '</div>'
-										+ '</div>';
-
-IriSP.Widgets.Quiz.prototype.annotationTemplate = '';
-
-IriSP.Widgets.Quiz.prototype.update = function(annotation) {
-	var _this = this;
-
-	if (this.quiz_activated &&
-		this.correct[annotation.id] != 1 &&
-		this.correct[annotation.id] != 0) {
-
-		_this.quiz_displayed = true;
-
-		//Pause the current video
-		this.media.pause();
-
-		this.annotation = annotation;
-
-		var question = annotation.content.data.question;
-		var answers = annotation.content.data.answers;
-		var resource = annotation.content.data.resource;
-
-		$(".Ldt-Quiz-Votes").hide();
-        $(".Ldt-Pause-Add-Question").hide();
-		$(".Ldt-Quiz-Container .Ldt-Quiz-Title").html(question);
-
-		var i = 0;
+import Mustache from "mustache";
+import quizStyles from "./Quiz.module.css";
+import jQuery from "jquery";
 
-		var score = Mustache.to_html('<span class="Ldt-Quiz-Correct-Answer">{{ correctness.0 }}</span> / <span class="Ldt-Quiz-Incorrect-Answer">{{ correctness.1 }}</span>', { correctness: this.globalScore() });
-		$(".Ldt-Quiz-Index").html(Mustache.to_html("Q{{index}}/{{total}}", { index: annotation.number + 1,
-                                                                              total: this.totalAmount }));
-		$(".Ldt-Quiz-Score").html(score);
-		this.question = new IriSP.Widgets.UniqueChoiceQuestion(annotation);
-		this.resource = new IriSP.Widgets.UniqueChoiceQuestion(resource);
-
-		if (annotation.content.data.type == "multiple_choice") {
-			this.question = new IriSP.Widgets.MultipleChoiceQuestion(annotation);
-		this.resource = new IriSP.Widgets.MultipleChoiceQuestion(resource);
-		}
-		else if (annotation.content.data.type == "unique_choice") {
-			this.question = new IriSP.Widgets.UniqueChoiceQuestion(annotation);
-		this.resource = new IriSP.Widgets.UniqueChoiceQuestion(resource);
-		}
-
-		var output = "";
-		for (i = 0; i < answers.length; i++) {
-			output += '<div class="quiz-question-block"><p>' + this.question.renderQuizTemplate(answers[i], i) + '<span class="quiz-question-label">'+ answers[i].content + '</span></p></div>';
-		}
-
-
-		var QR = '';
-		//If there is an attached resource, display it on the resources overlay
-		if (resource != null) {
-            QR = '<div class="quiz-resource-block" id="resource" >' + resource + '</div>';
-        };
-		$(".Ldt-Quiz-Questions").html(QR + output);
-		$(".Ldt-Quiz-Overlay").fadeIn();
-
-		$(".Ldt-Quiz-Submit").fadeIn();
+const Quiz = function (ns) {
+  return class extends ns.Widgets.Widget {
+    constructor(player, config) {
+      super(player, config);
+    }
 
-		//Let's automatically check the checkbox/radio if we click on the label
-		$(".quiz-question-label").click(function() {
-            var input = $(this).siblings("input");
-            if (input.prop('checked') && input.prop('type') == 'radio') {
-                // Already checked. Consider a double click on unique question as a validation.
-		        _this.answer();
-            } else {
-                input.prop('checked', !input.prop('checked'));
-            }
-		});
-
-		//In case we click on the first "Skip" link
-		$(".Ldt-Quiz-Submit-Skip-Link").click({media: this.media}, function(event) {
-			_this.hide();
-			_this.player.trigger("QuizCreator.skip");
-			event.data.media.play();
-		});
-	}
-};
-
-IriSP.Widgets.Quiz.prototype.hide = function() {
-	var _this = this;
-
-	$(".Ldt-Quiz-Votes").hide();
-	$(".Ldt-Quiz-Overlay").hide();
-	$(".Ldt-Pause-Add-Question").hide();
-	_this.quiz_displayed = false;
-}
-
-IriSP.Widgets.Quiz.prototype.answer = function() {
-	var _this = this;
-
-    function insert_timecode_links (s) {
-        return (s || "").replace(/\s(\d+:\d+)/, function (match, timecode) {
-            return ' <a href="#t=' + (IriSP.timestamp2ms(timecode) / 1000) + '">' + timecode + '</a>';
-        });
+    static defaults = {
+      // annotation_type: "at_quiz",
+      quiz_activated: true,
+      api_serializer: "ldt_annotate",
+      analytics_api: "",
+      api_method: "POST",
+      user: "",
+      userid: "",
     };
 
-	var answers = _this.annotation.content.data.answers;
+    static template =
+      '<div class="Ldt-Quiz-Container">' +
+      '<div class="Ldt-Quiz-Header">' +
+      '  <div class="Ldt-Quiz-Index"></div><div class="Ldt-Quiz-Score"></div>' +
+      "</div>" +
+      '<div class="Ldt-Quiz-Content">' +
+      '  <h1 class="Ldt-Quiz-Title">{{question}}</h1>' +
+      '  <div class="Ldt-Quiz-Questions">' +
+      "  </div>" +
+      "</div>" +
+      '<div class="Ldt-Quiz-Footer">' +
+      '  <div class="Ldt-Quiz-Votes">' +
+      '      <span class="Ldt-Quiz-Votes-Question">Avez-vous trouvé cette question utile ?</span>' +
+      '      <div class="Ldt-Quiz-Votes-Buttons">' +
+      '          <div class="Ldt-Quiz-Vote-Skip-Block"><a href="#" class="Ldt-Quiz-Vote-Skip">Passer</a></div>' +
+      '          <div><input type="button" value="Non" class="Ldt-Quiz-Vote-Useless" /></div>' +
+      '          <div><input type="button" value="Oui" class="Ldt-Quiz-Vote-Useful" /></div>' +
+      "      </div>" +
+      "  </div>" +
+      '  <div class="Ldt-Quiz-Submit">' +
+      '      <div class="Ldt-Quiz-Submit-Button"><input type="button" value="Valider" /></div>' +
+      '      <div class="Ldt-Quiz-Submit-Skip-Link"><a href="#">Passer</a></div><div style="clear:both;"></div>' +
+      "  </div>" +
+      '  <div class="Ldt-Quiz-Result">Bonne réponse</div>' +
+      "</div>" +
+      "</div>";
+
+    static annotationTemplate = "";
+
+    update(annotation) {
+      var _this = this;
+
+      if (
+        this.quiz_activated &&
+        this.correct[annotation.id] != 1 &&
+        this.correct[annotation.id] != 0
+      ) {
+        _this.quiz_displayed = true;
+
+        //Pause the current video
+        this.media.pause();
+
+        this.annotation = annotation;
+
+        var question = annotation.content.data.question;
+        var answers = annotation.content.data.answers;
+        var resource = annotation.content.data.resource;
+
+        $(".Ldt-Quiz-Votes").hide();
+        $(".Ldt-Pause-Add-Question").hide();
+        $(".Ldt-Quiz-Container .Ldt-Quiz-Title").html(question);
+
+        var i = 0;
+
+        var score = Mustache.render(
+          '<span class="Ldt-Quiz-Correct-Answer">{{ correctness.0 }}</span> / <span class="Ldt-Quiz-Incorrect-Answer">{{ correctness.1 }}</span>',
+          { correctness: this.globalScore() }
+        );
+        $(".Ldt-Quiz-Index").html(
+          Mustache.render("Q{{index}}/{{total}}", {
+            index: annotation.number + 1,
+            total: this.totalAmount,
+          })
+        );
+        $(".Ldt-Quiz-Score").html(score);
+        this.question = new ns.Widgets.UniqueChoiceQuestion(annotation);
+        this.resource = new ns.Widgets.UniqueChoiceQuestion(resource);
+
+        if (annotation.content.data.type == "multiple_choice") {
+          this.question = new ns.Widgets.MultipleChoiceQuestion(annotation);
+          this.resource = new ns.Widgets.MultipleChoiceQuestion(resource);
+        } else if (annotation.content.data.type == "unique_choice") {
+          this.question = new ns.Widgets.UniqueChoiceQuestion(annotation);
+          this.resource = new ns.Widgets.UniqueChoiceQuestion(resource);
+        }
 
-    // Augment answers with the correct feedback
-    var i = 0;
-    var wrong = 0;
-    // Signature is an array giving the answers signature: 1 for checked, 0 for unchecked
-    // We cannot simply store the right answer index, since there may be multiple-choice questions
-    var signature = [];
-    _this.$.find(".Ldt-Quiz-Question-Check").each( function (code) {
+        var output = "";
+        for (i = 0; i < answers.length; i++) {
+          output +=
+            '<div class="quiz-question-block"><p>' +
+            this.question.renderQuizTemplate(answers[i], i) +
+            '<span class="quiz-question-label">' +
+            answers[i].content +
+            "</span></p></div>";
+        }
+
+        var QR = "";
+        //If there is an attached resource, display it on the resources overlay
+        if (resource != null) {
+          QR =
+            '<div class="quiz-resource-block" id="resource" >' +
+            resource +
+            "</div>";
+        }
+        $(".Ldt-Quiz-Questions").html(QR + output);
+        $(".Ldt-Quiz-Overlay").fadeIn();
+
+        $(".Ldt-Quiz-Submit").fadeIn();
+
+        //Let's automatically check the checkbox/radio if we click on the label
+        $(".quiz-question-label").click(function () {
+          var input = $(this).siblings("input");
+          if (input.prop("checked") && input.prop("type") == "radio") {
+            // Already checked. Consider a double click on unique question as a validation.
+            _this.answer();
+          } else {
+            input.prop("checked", !input.prop("checked"));
+          }
+        });
+
+        //In case we click on the first "Skip" link
+        $(".Ldt-Quiz-Submit-Skip-Link").click(
+          { media: this.media },
+          function (event) {
+            _this.hide();
+            _this.player.trigger("QuizCreator.skip");
+            event.data.media.play();
+          }
+        );
+      }
+    }
+
+    hide() {
+      var _this = this;
+
+      $(".Ldt-Quiz-Votes").hide();
+      $(".Ldt-Quiz-Overlay").hide();
+      $(".Ldt-Pause-Add-Question").hide();
+      _this.quiz_displayed = false;
+    }
+
+    answer() {
+      var _this = this;
+
+      function insert_timecode_links(s) {
+        return (s || "").replace(/\s(\d+:\d+)/, function (match, timecode) {
+          return (
+            ' <a href="#t=' +
+            ns.timestamp2ms(timecode) / 1000 +
+            '">' +
+            timecode +
+            "</a>"
+          );
+        });
+      }
+
+      var answers = _this.annotation.content.data.answers;
+
+      // Augment answers with the correct feedback
+      var i = 0;
+      var wrong = 0;
+      // Signature is an array giving the answers signature: 1 for checked, 0 for unchecked
+      // We cannot simply store the right answer index, since there may be multiple-choice questions
+      var signature = [];
+      _this.$.find(".Ldt-Quiz-Question-Check").each(function (code) {
         var checked = $(this).is(":checked");
         signature.push(checked ? 1 : 0);
         var ans = answers[i];
-        if ((ans.correct && !checked)
-            || (!ans.correct && checked)) {
-            wrong += 1;
-            IriSP.jQuery(this).parents(".quiz-question-block").append('<div class="quiz-question-feedback quiz-question-incorrect-feedback">'+ insert_timecode_links(ans.feedback) +'</div>');
+        if ((ans.correct && !checked) || (!ans.correct && checked)) {
+          wrong += 1;
+          jQuery(this)
+            .parents(".quiz-question-block")
+            .append(
+              '<div class="quiz-question-feedback quiz-question-incorrect-feedback">' +
+                insert_timecode_links(ans.feedback) +
+                "</div>"
+            );
         } else {
-            IriSP.jQuery(this).parents(".quiz-question-block").append('<div class="quiz-question-feedback quiz-question-correct-feedback">'+ insert_timecode_links(ans.feedback) +'</div>');
+          jQuery(this)
+            .parents(".quiz-question-block")
+            .append(
+              '<div class="quiz-question-feedback quiz-question-correct-feedback">' +
+                insert_timecode_links(ans.feedback) +
+                "</div>"
+            );
         }
         i++;
-    });
+      });
 
-	if (wrong) {
-		$(".Ldt-Quiz-Result").html("Mauvaise réponse");
-		$(".Ldt-Quiz-Result").css({"background-color" : "red"});
-		this.correct[this.annotation.id] = 0;
-	} else {
-		$(".Ldt-Quiz-Result").html("Bonne réponse !");
-		$(".Ldt-Quiz-Result").css({"background-color" : "green"});
-		this.correct[this.annotation.id] = 1;
-	}
+      if (wrong) {
+        $(".Ldt-Quiz-Result").html("Mauvaise réponse");
+        $(".Ldt-Quiz-Result").css({ "background-color": "red" });
+        this.correct[this.annotation.id] = 0;
+      } else {
+        $(".Ldt-Quiz-Result").html("Bonne réponse !");
+        $(".Ldt-Quiz-Result").css({ "background-color": "green" });
+        this.correct[this.annotation.id] = 1;
+      }
 
-	$(".Ldt-Quiz-Result").animate({height:"100%"},500, "linear", function() {
-		$(".Ldt-Quiz-Result").delay(2000).animate({ height:"0%" }, 500);
-	});
+      $(".Ldt-Quiz-Result").animate(
+        { height: "100%" },
+        500,
+        "linear",
+        function () {
+          $(".Ldt-Quiz-Result").delay(2000).animate({ height: "0%" }, 500);
+        }
+      );
 
-	var question_number = this.annotation.number + 1;
-	var correctness = this.globalScore();
-	var score = "";
-	score += '<span class="Ldt-Quiz-Correct-Answer">' + correctness[0] +'</span> / <span class="Ldt-Quiz-Incorrect-Answer">' + correctness[1] + '</span>';
-	$(".Ldt-Quiz-Index").html("Q"+ question_number + "/" + this.totalAmount);
-	$(".Ldt-Quiz-Score").html(score);
+      var question_number = this.annotation.number + 1;
+      var correctness = this.globalScore();
+      var score = "";
+      score +=
+        '<span class="Ldt-Quiz-Correct-Answer">' +
+        correctness[0] +
+        '</span> / <span class="Ldt-Quiz-Incorrect-Answer">' +
+        correctness[1] +
+        "</span>";
+      $(".Ldt-Quiz-Index").html("Q" + question_number + "/" + this.totalAmount);
+      $(".Ldt-Quiz-Score").html(score);
 
-	this.submit(this.user, this.userid, this.annotation.id, wrong ? 'wrong_answer' : 'right_answer', signature.join(""));
-
-	//Hide the "Validate" button and display the UI dedicated to votes
-	$(".Ldt-Quiz-Submit").fadeOut(400, function () {
-	    $(".Ldt-Quiz-Votes").show();
-    });
-};
+      this.submit(
+        this.user,
+        this.userid,
+        this.annotation.id,
+        wrong ? "wrong_answer" : "right_answer",
+        signature.join("")
+      );
 
-IriSP.Widgets.Quiz.prototype.globalScore = function() {
-    // Return 2 variables to know how many right and wrong answers there are
-    var values = _.values(this.correct);
-    var ok = values.filter( function (s) { return s == 1; }).length;
-    var not_ok = values.filter( function (s) { return s == 0; }).length;
-	return [ok, not_ok];
-};
+      //Hide the "Validate" button and display the UI dedicated to votes
+      $(".Ldt-Quiz-Submit").fadeOut(400, function () {
+        $(".Ldt-Quiz-Votes").show();
+      });
+    }
 
-IriSP.Widgets.Quiz.prototype.refresh = function() {
-    var _annotations = this.getWidgetAnnotations().sortBy(function(_annotation) {
+    globalScore() {
+      // Return 2 variables to know how many right and wrong answers there are
+      var values = _.values(this.correct);
+      var ok = values.filter(function (s) {
+        return s == 1;
+      }).length;
+      var not_ok = values.filter(function (s) {
+        return s == 0;
+      }).length;
+      return [ok, not_ok];
+    }
+
+    refresh() {
+      var _annotations = this.getWidgetAnnotations().sortBy(function (
+        _annotation
+      ) {
         return _annotation.begin;
-    });
-
-    var _this = this;
+      });
 
-	_this.totalAmount = _annotations.length;
-	_this.number = 0;
-	_this.correct = {};
-	_this.keys = {};
+      var _this = this;
+
+      _this.totalAmount = _annotations.length;
+      _this.number = 0;
+      _this.correct = {};
+      _this.keys = {};
 
-    _annotations.forEach(function(_a) {
-		//Fix each annotation as "non-answered yet"
-		_this.correct[_a.id] = -1;
-		_this.keys[_this.number] = _a.id;
-		_a.number = _this.number++;
-    });
+      _annotations.forEach(function (_a) {
+        //Fix each annotation as "non-answered yet"
+        _this.correct[_a.id] = -1;
+        _this.keys[_this.number] = _a.id;
+        _a.number = _this.number++;
+      });
+    }
 
-}
-
-IriSP.Widgets.Quiz.prototype.draw = function() {
-	var _this = this;
-	_this.quiz_displayed = false;
-    this.onMediaEvent("enter-annotation", function (annotation) {
-        var an = _this.getWidgetAnnotations().filter( function (a) { return a === annotation; });
+    draw() {
+      var _this = this;
+      _this.quiz_displayed = false;
+      this.onMediaEvent("enter-annotation", function (annotation) {
+        var an = _this.getWidgetAnnotations().filter(function (a) {
+          return a === annotation;
+        });
         if (an.number === undefined) {
-            _this.refresh();
+          _this.refresh();
         }
         if (an.length) {
-            _this.update(an[0]);
-        };
-    });
-    this.onMdpEvent("Quiz.activate", function() {
-		_this.quiz_activated = true;
-    });
+          _this.update(an[0]);
+        }
+      });
+      this.onMdpEvent("Quiz.activate", function () {
+        _this.quiz_activated = true;
+      });
 
-    this.onMdpEvent("Quiz.deactivate", function() {
-		_this.quiz_activated = false;
-		_this.hide();
-    });
+      this.onMdpEvent("Quiz.deactivate", function () {
+        _this.quiz_activated = false;
+        _this.hide();
+      });
 
-    this.onMdpEvent("Quiz.hide", function() {
-		_this.hide();
-    });
+      this.onMdpEvent("Quiz.hide", function () {
+        _this.hide();
+      });
+
+      this.onMdpEvent("Quiz.refresh", function () {
+        _this.refresh();
+      });
 
-    this.onMdpEvent("Quiz.refresh", function() {
-		_this.refresh();
-    });
+      this.onMediaEvent("pause", function () {
+        if (!_this.quiz_displayed) {
+          $(".Ldt-Pause-Add-Question").show();
+        }
+      });
 
-    this.onMediaEvent("pause", function() {
-		if (! _this.quiz_displayed) {
-		    $(".Ldt-Pause-Add-Question").show();
-        }
-    });
+      this.onMediaEvent("play", function () {
+        $(".Ldt-Pause-Add-Question").hide();
+      });
 
-    this.onMediaEvent("play", function() {
-	   $(".Ldt-Pause-Add-Question").hide();
-    });
+      // Add Ldt-Quiz-Overlay widget on top of video player
+      _this.overlay = $("<div class='Ldt-Quiz-Overlay'></div>").appendTo(
+        $("#" + _this.container)
+      );
+      _this.PauseAddQuestion = $(
+        "<div class='Ldt-Pause-Add-Question' title='Ajoutez une question !'>"
+      )
+        .on("click", function () {
+          _this.player.trigger("QuizCreator.create");
+        })
+        .appendTo($("#" + _this.container));
+      _this.overlay.html(this.template);
 
-    // Add Ldt-Quiz-Overlay widget on top of video player
-	_this.overlay = $("<div class='Ldt-Quiz-Overlay'></div>").appendTo($('#' + _this.container));
-	_this.PauseAddQuestion = $("<div class='Ldt-Pause-Add-Question' title='Ajoutez une question !'>")
-        .on("click", function() { _this.player.trigger("QuizCreator.create"); })
-        .appendTo($('#' + _this.container));
-	_this.overlay.html(this.template);
+      $(".Ldt-Quiz-Overlay").hide();
 
-	$(".Ldt-Quiz-Overlay").hide();
+      $(".Ldt-Quiz-Submit input").click(function () {
+        _this.answer();
+      });
 
-    $(".Ldt-Quiz-Submit input").click(function() {
-		_this.answer();
-    });
+      //In case we click on the first "Skip" link
+      $(".Ldt-Quiz-Submit-Skip-Link").click(
+        { media: this.media },
+        function (event) {
+          _this.submit(
+            _this.user,
+            _this.userid,
+            _this.annotation.id,
+            "skipped_answer",
+            0
+          );
+          _this.hide();
+          _this.player.trigger("QuizCreator.skip");
+          event.data.media.play();
+        }
+      );
 
-	//In case we click on the first "Skip" link
-	$(".Ldt-Quiz-Submit-Skip-Link").click({ media: this.media }, function(event) {
-		_this.submit(_this.user, _this.userid, _this.annotation.id, "skipped_answer", 0);
-		_this.hide();
-		_this.player.trigger("QuizCreator.skip");
-		event.data.media.play();
-	});
+      $(
+        '.Ldt-Quiz-Votes-Buttons input[type="button"], .Ldt-Quiz-Votes-Buttons a'
+      ).click({ media: this.media }, function (event) {
+        var vote_prop, vote_val;
 
-    $(".Ldt-Quiz-Votes-Buttons input[type=\"button\"], .Ldt-Quiz-Votes-Buttons a").click({media: this.media}, function(event) {
-		var vote_prop, vote_val;
+        if ($(this).hasClass("Ldt-Quiz-Vote-Useful")) {
+          vote_prop = "useful";
+          vote_val = 1;
+        } else if ($(this).hasClass("Ldt-Quiz-Vote-Useless")) {
+          vote_prop = "useless";
+          vote_val = -1;
 
-		if ($(this).hasClass("Ldt-Quiz-Vote-Useful")) {
-			vote_prop = "useful";
-			vote_val = 1;
-		} else if ($(this).hasClass("Ldt-Quiz-Vote-Useless")) {
-			vote_prop = "useless";
-			vote_val = -1;
-
-			$(".Ldt-Ctrl-Quiz-Create").addClass("button_highlight").delay(5000).queue(function() {
-                $(this).removeClass("button_highlight").dequeue();
+          $(".Ldt-Ctrl-Quiz-Create")
+            .addClass("button_highlight")
+            .delay(5000)
+            .queue(function () {
+              $(this).removeClass("button_highlight").dequeue();
             });
-		}else{
-			vote_prop = "skipped_vote";
-			vote_val = 0;
-		}
+        } else {
+          vote_prop = "skipped_vote";
+          vote_val = 0;
+        }
 
-		_this.submit(_this.user, _this.userid, _this.annotation.id, vote_prop, vote_val);
+        _this.submit(
+          _this.user,
+          _this.userid,
+          _this.annotation.id,
+          vote_prop,
+          vote_val
+        );
 
-		//Resume the current video
-		event.data.media.play();
+        //Resume the current video
+        event.data.media.play();
+
+        _this.hide();
+        $(".Ldt-Pause-Add-Question").hide();
 
-		_this.hide();
-		$(".Ldt-Pause-Add-Question").hide();
+        _this.player.trigger("QuizCreator.skip");
+      });
 
-		_this.player.trigger("QuizCreator.skip");
-	});
-
-    _this.refresh();
+      _this.refresh();
+    }
+  };
 };
 
-//Generates uid
-//source : http://stackoverflow.com/questions/105034/create-guid-uuid-in-javascript
-IriSP.Widgets.Widget.prototype.generateUid = function () {
-    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
-        var r = Math.random()*16|0, v = c === 'x' ? r : (r&0x3|0x8);
-        return v.toString(16);
-    });
-}
+const UniqueChoiceQuestion = function (ns) {
+  return class extends ns.Widgets.Widget {
+    constructor(annotation) {
+      this.annotation = annotation;
+    }
 
-//UniqueChoice Question
-IriSP.Widgets.UniqueChoiceQuestion = function(annotation) {
-    this.annotation = annotation;
-}
-
-IriSP.Widgets.UniqueChoiceQuestion.prototype = new IriSP.Widgets.Widget();
+    renderQuizTemplate(answer, identifier) {
+      return (
+        '<input type="radio" class="quiz-question Ldt-Quiz-Question-Check Ldt-Quiz-Question-Check-' +
+        identifier +
+        '" name="question" data-question="' +
+        identifier +
+        '" value="' +
+        identifier +
+        '" />'
+      );
+    }
 
-IriSP.Widgets.UniqueChoiceQuestion.prototype.renderQuizTemplate = function(answer, identifier) {
-	return '<input type="radio" class="quiz-question Ldt-Quiz-Question-Check Ldt-Quiz-Question-Check-' + identifier + '" name="question" data-question="' + identifier + '" value="' + identifier + '" />';
-}
+    renderTemplate(answer, identifier) {
+      var id = this.generateUid();
+      return (
+        '<input type="radio" id="' +
+        id +
+        '" class="quiz-question-edition Ldt-Quiz-Question-Check Ldt-Quiz-Question-Check-' +
+        identifier +
+        '" name="question" data-question="' +
+        identifier +
+        '" value="' +
+        identifier +
+        '" /><label for="' +
+        id +
+        '" title="Veuillez sélectionner la réponse correcte"></label>'
+      );
+    }
 
-IriSP.Widgets.UniqueChoiceQuestion.prototype.renderTemplate = function(answer, identifier) {
-	var id = this.generateUid();
-	return '<input type="radio" id="' + id + '" class="quiz-question-edition Ldt-Quiz-Question-Check Ldt-Quiz-Question-Check-'+ identifier +'" name="question" data-question="'+ identifier +'" value="' + identifier + '" /><label for="'+ id +'" title="Veuillez sélectionner la réponse correcte"></label>';
-}
+    renderFullTemplate(answer, identifier) {
+      var correct = answer && answer.correct ? "checked" : "";
+      var id = this.generateUid();
+      return (
+        '<input type="radio" id="' +
+        id +
+        '" ' +
+        correct +
+        ' class="quiz-question-edition Ldt-Quiz-Question-Check Ldt-Quiz-Question-Check-' +
+        identifier +
+        '" name="question" data-question="' +
+        identifier +
+        '" value="' +
+        identifier +
+        '" /><label for="' +
+        id +
+        '"></label>'
+      );
+    }
+  };
+};
 
-IriSP.Widgets.UniqueChoiceQuestion.prototype.renderFullTemplate = function(answer, identifier) {
-	var correct = (answer && answer.correct) ? "checked" : "";
-	var id = this.generateUid();
-	return '<input type="radio" id="'+ id +'" '+ correct +' class="quiz-question-edition Ldt-Quiz-Question-Check Ldt-Quiz-Question-Check-'+ identifier +'" name="question" data-question="'+ identifier +'" value="' + identifier + '" /><label for="'+ id +'"></label>';
-}
-
+const MultipleChoiceQuestion = function (ns) {
+  return class extends ns.Widgets.Widget {
+    constructor(annotation) {
+      this.annotation = annotation;
+    }
 
-//MultipleChoice Question
-IriSP.Widgets.MultipleChoiceQuestion = function(annotation) {
-    this.annotation = annotation;
-}
-
-IriSP.Widgets.MultipleChoiceQuestion.prototype = new IriSP.Widgets.Widget();
+    renderQuizTemplate(answer, identifier) {
+      return (
+        '<input type="checkbox" class="quiz-question Ldt-Quiz-Question-Check Ldt-Quiz-Question-Check-' +
+        identifier +
+        '" name="question[' +
+        identifier +
+        ']" data-question="' +
+        identifier +
+        '" value="' +
+        identifier +
+        '" /> '
+      );
+    }
 
-IriSP.Widgets.MultipleChoiceQuestion.prototype.renderQuizTemplate = function(answer, identifier) {
-	return '<input type="checkbox" class="quiz-question Ldt-Quiz-Question-Check Ldt-Quiz-Question-Check-'+ identifier + '" name="question['+ identifier +']" data-question="'+ identifier +'" value="' + identifier + '" /> ';
-}
-
-IriSP.Widgets.MultipleChoiceQuestion.prototype.renderTemplate = function(answer, identifier) {
-	var id = this.generateUid();
-	return '<input type="checkbox" id="'+ id +'" class="quiz-question-edition Ldt-Quiz-Question-Check" name="question['+ identifier +']" data-question="'+ identifier +'" value="' + identifier + '" /><label for="'+ id +'" title="Veuillez sélectionner la ou les réponses correctes"></label>';
-}
+    renderTemplate(answer, identifier) {
+      var id = this.generateUid();
+      return (
+        '<input type="checkbox" id="' +
+        id +
+        '" class="quiz-question-edition Ldt-Quiz-Question-Check" name="question[' +
+        identifier +
+        ']" data-question="' +
+        identifier +
+        '" value="' +
+        identifier +
+        '" /><label for="' +
+        id +
+        '" title="Veuillez sélectionner la ou les réponses correctes"></label>'
+      );
+    }
 
-IriSP.Widgets.MultipleChoiceQuestion.prototype.renderFullTemplate = function(answer, identifier) {
-	var correct = (answer && answer.correct) ? "checked" : "";
-	var id = this.generateUid();
-	return '<input type="checkbox" id="'+ id +'" '+ correct +' class="quiz-question-edition Ldt-Quiz-Question-Check" name="question['+ identifier +']" data-question="'+ identifier +'" value="' + identifier + '" /><label for="'+ id +'"></label> ';
-}
+    renderFullTemplate(answer, identifier) {
+      var correct = answer && answer.correct ? "checked" : "";
+      var id = this.generateUid();
+      return (
+        '<input type="checkbox" id="' +
+        id +
+        '" ' +
+        correct +
+        ' class="quiz-question-edition Ldt-Quiz-Question-Check" name="question[' +
+        identifier +
+        ']" data-question="' +
+        identifier +
+        '" value="' +
+        identifier +
+        '" /><label for="' +
+        id +
+        '"></label> '
+      );
+    }
 
-IriSP.Widgets.Quiz.prototype.submit = function(user,user_id,question,prop,val) {
-    var _this = this;
-	var _url = Mustache.to_html(this.analytics_api, {id: this.source.projectId}),
-	donnees = {
-			"username": user,
-			"useruuid": user_id,
-			"subject": question,
-			"property": prop,
-		    "value": val,
-            "session": _this.session_id
-		};
+    submit(user, user_id, question, prop, val) {
+      var _this = this;
+      var _url = Mustache.render(this.analytics_api, {
+          id: this.source.projectId,
+        }),
+        donnees = {
+          username: user,
+          useruuid: user_id,
+          subject: question,
+          property: prop,
+          value: val,
+          session: _this.session_id,
+        };
 
-	IriSP.jQuery.ajax({
+      jQuery.ajax({
         url: _url,
         type: this.api_method,
-        contentType: 'application/json',
+        contentType: "application/json",
         data: JSON.stringify(donnees),
-        success: function(_data) {
+        success: function (_data) {},
+        error: function (_xhr, _error, _thrown) {
+          ns.log("Error when sending annotation", _thrown);
         },
-        error: function(_xhr, _error, _thrown) {
-            IriSP.log("Error when sending annotation", _thrown);
-        }
-    });
-}
+      });
+    }
+  };
+};
+
+export { Quiz, UniqueChoiceQuestion, MultipleChoiceQuestion, quizStyles };
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/widgets/Quiz.module.css	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,224 @@
+/* Nothing */
+
+.Ldt-Quiz-Container {
+  	position: absolute;
+  	height: calc(100% - 4px);
+  	top: 0px;
+  	width: calc(100% - 20px);
+	margin: auto;
+	border: 1px solid black;
+	font-size: 18pt;
+}
+
+.Ldt-Quiz-Title {
+    line-height: 1;
+    padding-top: 10px;
+    text-align: center;
+}
+
+.Ldt-Quiz-Header {
+	font-size: 12px;
+	color: black;
+	border-bottom: 1px solid green;
+	padding: 2px;
+    height: 22px;
+}
+
+.Ldt-Quiz-Content {
+    height: calc(100% - 82px);
+    overflow-y: auto;
+}
+
+.Ldt-Quiz-Footer {
+    height: 60px;
+	width: 100%;
+	position: absolute;
+	bottom: 0px;
+	border-top: 2px solid black;
+	background-color: white;
+}
+
+
+.Ldt-Quiz-Score {
+	display: inline-block;
+	position: absolute;
+	right: 20px;
+}
+
+.Ldt-Quiz-Index {
+	display: inline-block;
+}
+
+.Ldt-Quiz-Image {
+    max-width: 100%;
+    max-height: 100%;
+}
+
+.Ldt-Quiz-Questions {
+    height: calc(100% - 2.5em);
+    margin: 10px;
+    padding: 10px;
+    border-left: 5px solid gray;
+}
+
+.quiz-question-block {
+    padding-top: 10px;
+}
+.quiz-resource-block {
+    padding-top: 10px;
+    float: right;
+    max-height: 100%;
+    height: 100%;
+}
+.quiz-resource-block img {
+    max-height: 100%;
+    max-width: 100%;
+}
+
+.quiz-question-feedback {
+	font-size: 15px;
+}
+
+.quiz-question-feedback div {
+    display: inline-block;
+	height: 100%;
+}
+
+.quiz-question-correct-feedback:before, .quiz-question-incorrect-feedback:before {
+		                                    content: '';
+		                                    vertical-align: middle;
+		                                    display: inline-block;
+		                                    width: 48px;
+		                                    height: 48px;
+                                        }
+
+.quiz-question-correct-feedback:before {
+	background: url(img/valid_sprites.png) left top no-repeat;
+}
+
+.quiz-question-incorrect-feedback:before {
+	background: url(img/valid_sprites.png) -49px top no-repeat;
+}
+
+.Ldt-Quiz-Correct-Answer:before {
+	background: url(img/min_valid_sprites.png) left top no-repeat;
+}
+
+.Ldt-Quiz-Incorrect-Answer:before {
+	background: url(img/min_valid_sprites.png) -13px top no-repeat;
+}
+
+.Ldt-Quiz-Correct-Answer:before, .Ldt-Quiz-Incorrect-Answer:before {
+		                              content: '';
+		                              vertical-align: middle;
+		                              display: inline-block;
+		                              width: 12px;
+		                              height: 12px;
+                                  }
+
+.Ldt-Quiz-Submit {
+    margin: 10px;
+}
+
+.Ldt-Quiz-Submit .Ldt-Quiz-Submit-Skip-Link {
+    float: left;
+}
+
+.Ldt-Quiz-Submit-Skip-Link a {
+    text-decoration: none;
+    font-size: 16pt;
+}
+
+.Ldt-Quiz-Submit .Ldt-Quiz-Submit-Button {
+    float: right;
+}
+
+.Ldt-Quiz-Votes {
+    display: none;
+    height: 53px;
+    position: relative;
+}
+
+.Ldt-Quiz-Votes-Question {
+    font-size: 16px;
+    position: absolute;
+    top: 2px;
+    left: 0px;
+}
+
+.Ldt-Quiz-Votes-Buttons {
+    position: absolute;
+    bottom: 2px;
+    left: 0px;
+    right: 0px;
+}
+
+.Ldt-Quiz-Votes-Buttons div {
+    display: inline-block;
+    width: 33%;
+    text-align: center;
+}
+
+.Ldt-Quiz-Vote-Skip-Block {
+    width: 30% !important;
+    text-align: right;
+}
+
+.Ldt-Quiz-Vote-Skip-Block a {
+    text-decoration: none;
+}
+
+.Ldt-Quiz-Overlay {
+    position: absolute;
+    top: 0px;
+    background-color: white;
+    z-index: 5;
+    width: 100%;
+    height: 100%;
+}
+
+.Ldt-Pause-Add-Question {
+    background: url(img/quiz_add_question.svg) no-repeat;
+    background-position: center;
+    background-size: contain;
+  	position: absolute;
+    bottom: 40px;
+    right: 0px;
+    height: 15%;
+    width: 15%;
+    max-width: 64px;
+    max-height: 64px;
+    z-index: 10;
+}
+
+.Ldt-Quiz-Result {
+    position: absolute;
+	height: 0px;
+    bottom: 0;
+    left: 0;
+    right: 0;
+    background: #fde073;
+    text-align: center;
+    line-height: 2.5;
+    overflow: hidden;
+    -webkit-box-shadow: 0 0 5px black;
+    -moz-box-shadow:    0 0 5px black;
+    box-shadow:         0 0 5px black;
+}
+
+input[type="button"] {
+    border: none;
+    font-size: 18pt;
+    text-align: center;
+    background-color: #5BCE5B;
+    color: #fff;
+    cursor: pointer;
+}
+
+input[value="Non"] {
+    background-color: #F86060;
+}
+
+input.quiz-question:checked + .quiz-question-label {
+    text-decoration: underline;
+}
--- a/src/widgets/QuizCreator.css	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,75 +0,0 @@
-.Ldt-QuizCreator-Ui {
-	width: 100%;
-	padding: 10px;
-}
-
-.Ldt-QuizCreator-Form {
-	width: 100%;
-}
-
-.Ldt-QuizCreator-Question-Type {
-}
-
-.Ldt-QuizCreator-Question-Area,
-.Ldt-QuizCreator-Resource-Area {
-    width: calc(100% - 20px);
-}
-
-.Ldt-QuizCreator-Questions-Block {
-	width: 100%;
-}
-
-.Ldt-QuizCreator-Questions-Answer {
-	margin-top: 5px;
-	border-top: 1px solid black;
-}
-
-.Ldt-QuizCreator-Questions-Answer div {
-	display: inline-block;
-	vertical-align: middle;
-}
-
-.Ldt-QuizCreator-Questions-Answer-Content {
-	width: calc(100% - 80px);
-}
-
-.Ldt-QuizCreator-Questions-Answer-Content input, .Ldt-QuizCreator-Questions-Answer-Content textarea {
-	width: calc(100% - 20px);
-}
-
-.Ldt-QuizCreator-Questions-Answer-Time input {
-	width: 60px;
-}
-
-.Ldt-QuizCreator-Questions-Answer-Delete {
-	width: 15px;
-	height: 15px;
-}
-
-.Ldt-QuizCreator-Remove {
-	width: 15px;
-	height: 15px;
-    margin-left: 8px;
-	cursor: pointer;
-    background: url(img/delete.png);
-}
-
-input.quiz-question-edition {
-    display: none;
-}
-
-input.quiz-question-edition[type='radio'] + label,
-input.quiz-question-edition[type='checkbox'] + label {
-	height: 12px;
-	width: 24px;
-	display: inline-block;
-	background: url(img/min_wrong_toggle.png);
-	cursor: pointer;
-    content: "Mauvaise";
-}
-
-input.quiz-question-edition[type='radio']:checked + label,
-input.quiz-question-edition[type='checkbox']:checked + label {
-	background: url(img/min_right_toggle.png);
-    content: "Bonne";
-}
--- a/src/widgets/QuizCreator.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/widgets/QuizCreator.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,306 +1,360 @@
 /* TODO: Add Social Network Sharing */
+import quizCreatorStyles from "./QuizCreator.module.css";
 
-IriSP.Widgets.QuizCreator = function(player, config) {
-    var _this = this;
-    IriSP.Widgets.Widget.call(this, player, config);
-};
-
-IriSP.Widgets.QuizCreator.prototype = new IriSP.Widgets.Widget();
+const QuizCreator = function (ns) {
+  return class extends ns.Widgets.Widget {
+    constructor(player, config) {
+      super(player, config);
+      var _this = this;
+    }
 
-IriSP.Widgets.QuizCreator.prototype.defaults = {
-    creator_name : "",
-    tags : false,
-    tag_titles : false,
-    pause_on_write : true,
-    annotation_type: "Quiz",
-    api_serializer: "ldt_annotate",
-    api_endpoint_template: "",
-    api_method: "POST"
-};
+    static defaults = {
+      creator_name: "",
+      tags: false,
+      tag_titles: false,
+      pause_on_write: true,
+      annotation_type: "Quiz",
+      api_serializer: "ldt_annotate",
+      api_endpoint_template: "",
+      api_method: "POST",
+    };
 
-IriSP.Widgets.QuizCreator.prototype.messages = {
-    en: {
-    },
-    fr: {
-    }
-};
+    static messages =  {
+      en: {},
+      fr: {},
+    };
 
-IriSP.Widgets.QuizCreator.prototype.template =
-	  '<div class="Ldt-QuizCreator-Ui Ldt-TraceMe">'
-	+	'<div class="Ldt-QuizCreator-Question-Form">'
-	+		'<textarea class="Ldt-QuizCreator-Question-Area" placeholder="Votre question"></textarea><br />'
-	+		'<textarea class="Ldt-QuizCreator-Resource-Area" placeholder="Ressources (lien vers une image, etc.)"></textarea><br />'
-	+	'</div>'
-	+		'<p>Type de question  '
-	+ 		'<select name="type" class="Ldt-QuizCreator-Question-Type">'
-	+			'<option value="unique_choice">Choix unique</option>'
-	+			'<option value="multiple_choice">Choix multiple</option>'
-	+		'</select>'
-	+		' à <input type="text" placeholder="hh:mm:ss" size="6" class="Ldt-QuizCreator-Time" />'
-	+ 	'<div class="Ldt-QuizCreator-Questions-Block">'
-	+ 	'</div>'
-	+	'<div>'
-    +   '  <button class="Ldt-QuizCreator-Question-Add">Ajouter une réponse</button><hr>'
-    +   '  <button class="Ldt-QuizCreator-Question-Save">Sauvegarder</button>'
-    +   '</div>'
-	+ '</div>';
+    static template =
+      '<div class="Ldt-QuizCreator-Ui Ldt-TraceMe">' +
+      '<div class="Ldt-QuizCreator-Question-Form">' +
+      '<textarea class="Ldt-QuizCreator-Question-Area" placeholder="Votre question"></textarea><br />' +
+      '<textarea class="Ldt-QuizCreator-Resource-Area" placeholder="Ressources (lien vers une image, etc.)"></textarea><br />' +
+      "</div>" +
+      "<p>Type de question  " +
+      '<select name="type" class="Ldt-QuizCreator-Question-Type">' +
+      '<option value="unique_choice">Choix unique</option>' +
+      '<option value="multiple_choice">Choix multiple</option>' +
+      "</select>" +
+      ' à <input type="text" placeholder="hh:mm:ss" size="6" class="Ldt-QuizCreator-Time" />' +
+      '<div class="Ldt-QuizCreator-Questions-Block">' +
+      "</div>" +
+      "<div>" +
+      '  <button class="Ldt-QuizCreator-Question-Add">Ajouter une réponse</button><hr>' +
+      '  <button class="Ldt-QuizCreator-Question-Save">Sauvegarder</button>' +
+      "</div>" +
+      "</div>";
 
-/* Hide and clear the interface is case of someone skipped or answer the current question in the Quiz panel*/
-IriSP.Widgets.QuizCreator.prototype.skip = function() {
-	this.$.find(".Ldt-QuizCreator-Time").val("");
-	this.$.find(".Ldt-QuizCreator-Question-Area").val("");
-	this.$.find(".Ldt-QuizCreator-Resource-Area").val("");
-	this.$.find(".Ldt-QuizCreator-Questions-Block").html("");
-    this.current_annotation = undefined;
-};
+    /* Hide and clear the interface is case of someone skipped or answer the current question in the Quiz panel*/
+    skip() {
+      this.$.find(".Ldt-QuizCreator-Time").val("");
+      this.$.find(".Ldt-QuizCreator-Question-Area").val("");
+      this.$.find(".Ldt-QuizCreator-Resource-Area").val("");
+      this.$.find(".Ldt-QuizCreator-Questions-Block").html("");
+      this.current_annotation = undefined;
+    }
+
+    nbAnswers() {
+      var numItems = this.$.find(".Ldt-QuizCreator-Questions-Answer").length;
+      return numItems;
+    }
 
-IriSP.Widgets.QuizCreator.prototype.nbAnswers = function(){
-	var numItems = this.$.find('.Ldt-QuizCreator-Questions-Answer').length;
-	return numItems;
-};
+    draw() {
+      var _this = this;
 
-IriSP.Widgets.QuizCreator.prototype.draw = function() {
-	var _this = this;
+      this.onMediaEvent("timeupdate", function (_time) {
+        _this.setBegin(_time);
+      });
 
-    this.onMediaEvent("timeupdate", function(_time) {
-    	_this.setBegin(_time);
-    });
+      this.onMdpEvent("QuizCreator.show", function () {
+        _this.setBegin(_this.media.currentTime);
+      });
 
-	this.onMdpEvent("QuizCreator.show", function() {
-		_this.setBegin(_this.media.currentTime);
-    });
+      this.onMdpEvent("QuizCreator.create", function () {
+        _this.skip();
+        _this.setBegin(_this.media.currentTime);
+      });
 
-	this.onMdpEvent("QuizCreator.create", function() {
-		_this.skip();
-		_this.setBegin(_this.media.currentTime);
-    });
+      this.onMdpEvent("QuizCreator.skip", function () {
+        _this.skip();
+      });
 
-    this.onMdpEvent("QuizCreator.skip", function() {
-		_this.skip();
-    });
-
-    this.onMdpEvent("QuizCreator.edit", function (_annotation) {
-		_this.skip();
+      this.onMdpEvent("QuizCreator.edit", function (_annotation) {
+        _this.skip();
         _this.addQuestion(_annotation);
-    });
+      });
 
-	this.$.on("click", ".Ldt-QuizCreator-Remove", function() {
+      this.$.on("click", ".Ldt-QuizCreator-Remove", function () {
         $(this).parents(".Ldt-QuizCreator-Questions-Answer").remove();
-	});
+      });
 
-    this.begin = new IriSP.Model.Time();
-    this.end = this.source.getDuration();
-	this.answers = [];
+      this.begin = new ns.Model.Time();
+      this.end = this.source.getDuration();
+      this.answers = [];
 
-    this.renderTemplate();
+      this.renderTemplate();
 
-	/* Quiz creator */
+      /* Quiz creator */
+
+      this.question = new ns.Widgets.UniqueChoiceQuestion();
 
-	this.question = new IriSP.Widgets.UniqueChoiceQuestion();
-
-	this.$.find(".Ldt-QuizCreator-Question-Type").bind("change", this.functionWrapper("onQuestionTypeChange"));
-	this.$.find(".Ldt-QuizCreator-Question-Add").bind("click", this.functionWrapper("onQuestionAdd"));
-	this.$.find(".Ldt-QuizCreator-Question-Save").bind("click", this.functionWrapper("onSave"));
+      this.$.find(".Ldt-QuizCreator-Question-Type").bind(
+        "change",
+        this.functionWrapper("onQuestionTypeChange")
+      );
+      this.$.find(".Ldt-QuizCreator-Question-Add").bind(
+        "click",
+        this.functionWrapper("onQuestionAdd")
+      );
+      this.$.find(".Ldt-QuizCreator-Question-Save").bind(
+        "click",
+        this.functionWrapper("onSave")
+      );
 
-	this.$.find(".Ldt-QuizCreator-Time").keyup(function() {
-		var str = _this.$.find(".Ldt-QuizCreator-Time").val();
-		_this.begin = IriSP.timestamp2ms(str);
-		_this.end = _this.begin + 1000;
-	});
+      this.$.find(".Ldt-QuizCreator-Time").keyup(function () {
+        var str = _this.$.find(".Ldt-QuizCreator-Time").val();
+        _this.begin = ns.timestamp2ms(str);
+        _this.end = _this.begin + 1000;
+      });
 
-    this.onMediaEvent("timeupdate", function(_time) {
+      this.onMediaEvent("timeupdate", function (_time) {
         // Do not update timecode if description is not empty
         if (_this.getDescription()) {
-            _this.setBegin(_time);
-        };
-    });
-};
+          _this.setBegin(_time);
+        }
+      });
+    }
 
-IriSP.Widgets.QuizCreator.prototype.getDescription = function() {
-    return this.$.find(".Ldt-QuizCreator-Question-Area").val().trim();
-};
-
-IriSP.Widgets.QuizCreator.prototype.addQuestion = function(annotation, number) {
-    var _this = this;
+    getDescription() {
+      return this.$.find(".Ldt-QuizCreator-Question-Area").val().trim();
+    }
 
-	if (annotation.content.data.type == "multiple_choice") {
-		this.question = new IriSP.Widgets.MultipleChoiceQuestion(annotation);
-	}
-	else if (annotation.content.data.type == "unique_choice") {
-		this.question = new IriSP.Widgets.UniqueChoiceQuestion(annotation);
-	}
+    addQuestion(annotation, number) {
+      var _this = this;
 
-	var answers = annotation.content.data.answers;
+      if (annotation.content.data.type == "multiple_choice") {
+        this.question = new ns.Widgets.MultipleChoiceQuestion(annotation);
+      } else if (annotation.content.data.type == "unique_choice") {
+        this.question = new ns.Widgets.UniqueChoiceQuestion(annotation);
+      }
 
-	this.answers = [];
+      var answers = annotation.content.data.answers;
 
+      this.answers = [];
 
-	this.$.find(".Ldt-QuizCreator-Time").val(annotation.begin);
-	this.$.find(".Ldt-QuizCreator-Question-Area").val(annotation.content.data.question);
-	this.$.find(".Ldt-QuizCreator-Resource-Area").val(annotation.content.data.resource);
-	this.$.find(".Ldt-QuizCreator-Questions-Block").html('');
-    answers.forEach( function (ans) {
+      this.$.find(".Ldt-QuizCreator-Time").val(annotation.begin);
+      this.$.find(".Ldt-QuizCreator-Question-Area").val(
+        annotation.content.data.question
+      );
+      this.$.find(".Ldt-QuizCreator-Resource-Area").val(
+        annotation.content.data.resource
+      );
+      this.$.find(".Ldt-QuizCreator-Questions-Block").html("");
+      answers.forEach(function (ans) {
         _this.onQuestionAdd(null, ans);
-    });
-    _this.current_annotation = annotation;
-};
+      });
+      _this.current_annotation = annotation;
+    }
 
-IriSP.Widgets.QuizCreator.prototype.onQuestionTypeChange = function(e) {
-
-    var _field = this.$.find(".Ldt-QuizCreator-Question-Type");
-    var _contents = _field.val();
+    onQuestionTypeChange(e) {
+      var _field = this.$.find(".Ldt-QuizCreator-Question-Type");
+      var _contents = _field.val();
 
-	var _this = this;
-	switch(_contents) {
-		case "unique_choice":
-			this.question = new IriSP.Widgets.UniqueChoiceQuestion();
-		break;
+      var _this = this;
+      switch (_contents) {
+        case "unique_choice":
+          this.question = new ns.Widgets.UniqueChoiceQuestion();
+          break;
 
-		case "multiple_choice":
-			this.question = new IriSP.Widgets.MultipleChoiceQuestion();
-		break;
-	}
+        case "multiple_choice":
+          this.question = new ns.Widgets.MultipleChoiceQuestion();
+          break;
+      }
 
-	var output = "";
+      var output = "";
 
-	_this.$.find(".Ldt-QuizCreator-Questions-Block").html(output);
+      _this.$.find(".Ldt-QuizCreator-Questions-Block").html(output);
 
-    this.pauseOnWrite();
-};
+      this.pauseOnWrite();
+    }
 
-// Either e !== undefined, then it has been called by the interface and answer === undefined, generate an empty form.
-// Or e === null && answer !== undefined, an existing answer is provided.
-IriSP.Widgets.QuizCreator.prototype.onQuestionAdd = function(e, answer) {
-	var output = '<div class="Ldt-QuizCreator-Questions-Answer">'
-		+	'Réponse <div class="Ldt-QuizCreator-Questions-Answer-Correct">'+ this.question.renderFullTemplate(answer, this.nbAnswers()) +'</div><br />'
-		+ 	'<div class="Ldt-QuizCreator-Questions-Answer-Content">'
-		+		'<input type="text" class="Ldt-QuizCreator-Answer-Content" data-question="'+ this.nbAnswers() +'" id="question'+ this.nbAnswers() + '"' +  (answer ? ' value="'+ answer.content + '"' : "") + '/><br />'
-		+		'Commentaire <br/><textarea class="Ldt-QuizCreator-Answer-Feedback" data-question="'+ this.nbAnswers() +'" id="feedback'+ this.nbAnswers() +'">' + (answer ? answer.feedback : "") + '</textarea>'
-		+	'</div>'
-		+ 	'<div class="Ldt-QuizCreator-Questions-Answer-Delete"><div class="Ldt-QuizCreator-Remove">&nbsp;</div></div>'
-		+	'</div>';
-	this.$.find(".Ldt-QuizCreator-Questions-Block").append(output);
-	this.$.find(".Ldt-QuizCreator-Answer-Content").last().focus();
+    // Either e !== undefined, then it has been called by the interface and answer === undefined, generate an empty form.
+    // Or e === null && answer !== undefined, an existing answer is provided.
+    onQuestionAdd(e, answer) {
+      var output =
+        '<div class="Ldt-QuizCreator-Questions-Answer">' +
+        'Réponse <div class="Ldt-QuizCreator-Questions-Answer-Correct">' +
+        this.question.renderFullTemplate(answer, this.nbAnswers()) +
+        "</div><br />" +
+        '<div class="Ldt-QuizCreator-Questions-Answer-Content">' +
+        '<input type="text" class="Ldt-QuizCreator-Answer-Content" data-question="' +
+        this.nbAnswers() +
+        '" id="question' +
+        this.nbAnswers() +
+        '"' +
+        (answer ? ' value="' + answer.content + '"' : "") +
+        "/><br />" +
+        'Commentaire <br/><textarea class="Ldt-QuizCreator-Answer-Feedback" data-question="' +
+        this.nbAnswers() +
+        '" id="feedback' +
+        this.nbAnswers() +
+        '">' +
+        (answer ? answer.feedback : "") +
+        "</textarea>" +
+        "</div>" +
+        '<div class="Ldt-QuizCreator-Questions-Answer-Delete"><div class="Ldt-QuizCreator-Remove">&nbsp;</div></div>' +
+        "</div>";
+      this.$.find(".Ldt-QuizCreator-Questions-Block").append(output);
+      this.$.find(".Ldt-QuizCreator-Answer-Content").last().focus();
 
-    this.pauseOnWrite();
-};
-
-IriSP.Widgets.QuizCreator.prototype.pauseOnWrite = function() {
-    if (this.pause_on_write && !this.media.getPaused()) {
-        this.media.pause();
+      this.pauseOnWrite();
     }
-};
 
-IriSP.Widgets.QuizCreator.prototype.setBegin = function (t) {
-    this.begin = new IriSP.Model.Time(t || 0);
-	this.end = this.begin + 500;
-    this.$.find(".Ldt-QuizCreator-Time").val(this.begin.toString());
-};
-
-IriSP.Widgets.QuizCreator.prototype.get_local_annotation = function (ident) {
-    return this.player.getLocalAnnotation(ident);
-};
+    pauseOnWrite() {
+      if (this.pause_on_write && !this.media.getPaused()) {
+        this.media.pause();
+      }
+    }
 
-IriSP.Widgets.QuizCreator.prototype.save_local_annotations = function() {
-    this.player.saveLocalAnnotations();
-    // Merge modifications into widget source
-    this.source.merge(this.player.localSource);
-};
+    setBegin(t) {
+      this.begin = new ns.Model.Time(t || 0);
+      this.end = this.begin + 500;
+      this.$.find(".Ldt-QuizCreator-Time").val(this.begin.toString());
+    }
+
+    get_local_annotation(ident) {
+      return this.player.getLocalAnnotation(ident);
+    }
 
-IriSP.Widgets.QuizCreator.prototype.delete_local_annotation = function(ident) {
-    this.source.getAnnotations().removeId(ident);
-    this.player.deleteLocalAnnotation(ident);
-    this.current_annotation = undefined;
-    this.refresh(true);
-};
+    save_local_annotations() {
+      this.player.saveLocalAnnotations();
+      // Merge modifications into widget source
+      this.source.merge(this.player.localSource);
+    }
 
-IriSP.Widgets.QuizCreator.prototype.show = function() {
-	this.$.find(".Ldt-QuizCreator-Question-Area").focus();
-};
+    delete_local_annotation(ident) {
+      this.source.getAnnotations().removeId(ident);
+      this.player.deleteLocalAnnotation(ident);
+      this.current_annotation = undefined;
+      this.refresh(true);
+    }
 
-IriSP.Widgets.QuizCreator.prototype.hide = function() {
-	this.$.find(".Ldt-QuizCreator-Questions-Block").html("");
-	this.$.find(".Ldt-QuizCreator-Question-Area").val("");
-	this.$.find(".Ldt-QuizCreator-Resource-Area").val("");
-	this.$.find(".Ldt-QuizCreator-Time").val("");
-};
+    show() {
+      this.$.find(".Ldt-QuizCreator-Question-Area").focus();
+    }
+
+    hide() {
+      this.$.find(".Ldt-QuizCreator-Questions-Block").html("");
+      this.$.find(".Ldt-QuizCreator-Question-Area").val("");
+      this.$.find(".Ldt-QuizCreator-Resource-Area").val("");
+      this.$.find(".Ldt-QuizCreator-Time").val("");
+    }
 
-/* Save a local annotation */
-IriSP.Widgets.QuizCreator.prototype.onSave = function(event, should_publish) {
-    // Either the annotation already exists (then we overwrite its
-    // content) or it must be created.
-    var is_created = false;
+    /* Save a local annotation */
+    onSave(event, should_publish) {
+      // Either the annotation already exists (then we overwrite its
+      // content) or it must be created.
+      var is_created = false;
 
-	if (this.nbAnswers() <= 0) {
-		alert("Vous devez spécifier au moins une réponse à votre question !");
-		return false;
-	};
-    // Check that there is at least 1 valid answer
-    if (! this.$.find(".quiz-question-edition:checked").length) {
+      if (this.nbAnswers() <= 0) {
+        alert("Vous devez spécifier au moins une réponse à votre question !");
+        return false;
+      }
+      // Check that there is at least 1 valid answer
+      if (!this.$.find(".quiz-question-edition:checked").length) {
         alert("Vous n'avez pas indiqué de bonne réponse.");
         return false;
-    };
-    var _annotation;
-    if (this.current_annotation) {
+      }
+      var _annotation;
+      if (this.current_annotation) {
         is_created = false;
         _annotation = this.current_annotation;
-    } else {
+      } else {
         is_created = true;
-        var _annotationTypes = this.source.getAnnotationTypes().searchByTitle(this.annotation_type, true), /* Récupération du type d'annotation dans lequel l'annotation doit être ajoutée */
-        _annotationType = (_annotationTypes.length ? _annotationTypes[0] : new IriSP.Model.AnnotationType(false, this.player.localSource)); /* Si le Type d'Annotation n'existe pas, il est créé à la volée */
+        var _annotationTypes = this.source
+            .getAnnotationTypes()
+            .searchByTitle(
+              this.annotation_type,
+              true
+            ) /* Récupération du type d'annotation dans lequel l'annotation doit être ajoutée */,
+          _annotationType = _annotationTypes.length
+            ? _annotationTypes[0]
+            : new ns.Model.AnnotationType(
+                false,
+                this.player.localSource
+              ); /* Si le Type d'Annotation n'existe pas, il est créé à la volée */
 
         /* Si nous avons dû générer un ID d'annotationType à la volée... */
         if (!_annotationTypes.length) {
-            /* Il ne faudra pas envoyer l'ID généré au serveur */
-            _annotationType.dont_send_id = true;
-            /* Il faut inclure le titre dans le type d'annotation */
-            _annotationType.title = this.annotation_type;
+          /* Il ne faudra pas envoyer l'ID généré au serveur */
+          _annotationType.dont_send_id = true;
+          /* Il faut inclure le titre dans le type d'annotation */
+          _annotationType.title = this.annotation_type;
         }
 
-        _annotation = new IriSP.Model.Annotation(false, this.player.localSource); /* Création d'une annotation dans cette source avec un ID généré à la volée (param. false) */
+        _annotation = new ns.Model.Annotation(
+          false,
+          this.player.localSource
+        ); /* Création d'une annotation dans cette source avec un ID généré à la volée (param. false) */
 
         // Initialize some fields in case of creation
         _annotation.created = new Date(); /* Date de création de l'annotation */
         _annotation.creator = this.creator_name;
-        _annotation.setAnnotationType(_annotationType.id); /* Id du type d'annotation */
+        _annotation.setAnnotationType(
+          _annotationType.id
+        ); /* Id du type d'annotation */
         this.player.localSource.getMedias().push(this.source.currentMedia);
-        _annotation.setMedia(this.source.currentMedia.id); /* Id du média annoté */
-    }
+        _annotation.setMedia(
+          this.source.currentMedia.id
+        ); /* Id du média annoté */
+      }
 
-    /*
-     * Nous remplissons les données de l'annotation
-     * */
-    _annotation.setBeginEnd(this.begin, this.end);
-    _annotation.modified = new Date(); /* Date de modification de l'annotation */
-    _annotation.contributor = this.creator_name;
-    _annotation.description = this.getDescription();
-    _annotation.title = _annotation.description;
-	_annotation.content = {};
-	_annotation.content.data = {};
-	_annotation.content.data.type = this.$.find(".Ldt-QuizCreator-Question-Type").val();
-	_annotation.content.data.question = _annotation.description;
-	_annotation.content.data.resource = this.$.find(".Ldt-QuizCreator-Resource-Area").val();
-    _annotation.content.data.answers = $.makeArray($(".Ldt-QuizCreator-Questions-Answer")
-                                                   .map(function (ans)
-                                                        {
-                                                            return {
-                                                                content: $(this).find(".Ldt-QuizCreator-Answer-Content").val(),
-                                                                feedback: $(this).find(".Ldt-QuizCreator-Answer-Feedback").val(),
-                                                                correct: $(this).find(".Ldt-Quiz-Question-Check").is(':checked')
-                                                            };
-                                                        }));
-    this.current_annotation = _annotation;
-    if (is_created) {
+      /*
+       * Nous remplissons les données de l'annotation
+       * */
+      _annotation.setBeginEnd(this.begin, this.end);
+      _annotation.modified =
+        new Date(); /* Date de modification de l'annotation */
+      _annotation.contributor = this.creator_name;
+      _annotation.description = this.getDescription();
+      _annotation.title = _annotation.description;
+      _annotation.content = {};
+      _annotation.content.data = {};
+      _annotation.content.data.type = this.$.find(
+        ".Ldt-QuizCreator-Question-Type"
+      ).val();
+      _annotation.content.data.question = _annotation.description;
+      _annotation.content.data.resource = this.$.find(
+        ".Ldt-QuizCreator-Resource-Area"
+      ).val();
+      _annotation.content.data.answers = $.makeArray(
+        $(".Ldt-QuizCreator-Questions-Answer").map(function (ans) {
+          return {
+            content: $(this).find(".Ldt-QuizCreator-Answer-Content").val(),
+            feedback: $(this).find(".Ldt-QuizCreator-Answer-Feedback").val(),
+            correct: $(this).find(".Ldt-Quiz-Question-Check").is(":checked"),
+          };
+        })
+      );
+      this.current_annotation = _annotation;
+      if (is_created) {
         // Add the annotation to the localSource
         this.player.addLocalAnnotation(_annotation);
         // Update also the remote source
-        this.source.merge([ _annotation ]);
+        this.source.merge([_annotation]);
         this.player.trigger("Annotation.create", _annotation);
-    } else {
+      } else {
         // Update the annotation
         this.player.saveLocalAnnotations();
         this.player.trigger("Annotation.update", _annotation);
-    };
-    this.player.trigger("AnnotationsList.update"); /* On force le rafraîchissement des widgets AnnotationsList */
-    this.player.trigger("Quiz.refresh"); /* On force le rafraîchissement des widgets Quiz */
+      }
+      this.player.trigger(
+        "AnnotationsList.update"
+      ); /* On force le rafraîchissement des widgets AnnotationsList */
+      this.player.trigger(
+        "Quiz.refresh"
+      ); /* On force le rafraîchissement des widgets Quiz */
+    }
+  };
 };
+
+export { QuizCreator, quizCreatorStyles };
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/widgets/QuizCreator.module.css	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,75 @@
+.Ldt-QuizCreator-Ui {
+	width: 100%;
+	padding: 10px;
+}
+
+.Ldt-QuizCreator-Form {
+	width: 100%;
+}
+
+.Ldt-QuizCreator-Question-Type {
+}
+
+.Ldt-QuizCreator-Question-Area,
+.Ldt-QuizCreator-Resource-Area {
+    width: calc(100% - 20px);
+}
+
+.Ldt-QuizCreator-Questions-Block {
+	width: 100%;
+}
+
+.Ldt-QuizCreator-Questions-Answer {
+	margin-top: 5px;
+	border-top: 1px solid black;
+}
+
+.Ldt-QuizCreator-Questions-Answer div {
+	display: inline-block;
+	vertical-align: middle;
+}
+
+.Ldt-QuizCreator-Questions-Answer-Content {
+	width: calc(100% - 80px);
+}
+
+.Ldt-QuizCreator-Questions-Answer-Content input, .Ldt-QuizCreator-Questions-Answer-Content textarea {
+	width: calc(100% - 20px);
+}
+
+.Ldt-QuizCreator-Questions-Answer-Time input {
+	width: 60px;
+}
+
+.Ldt-QuizCreator-Questions-Answer-Delete {
+	width: 15px;
+	height: 15px;
+}
+
+.Ldt-QuizCreator-Remove {
+	width: 15px;
+	height: 15px;
+    margin-left: 8px;
+	cursor: pointer;
+    background: url(img/delete.png);
+}
+
+input.quiz-question-edition {
+    display: none;
+}
+
+input.quiz-question-edition[type='radio'] + label,
+input.quiz-question-edition[type='checkbox'] + label {
+	height: 12px;
+	width: 24px;
+	display: inline-block;
+	background: url(img/min_wrong_toggle.png);
+	cursor: pointer;
+    content: "Mauvaise";
+}
+
+input.quiz-question-edition[type='radio']:checked + label,
+input.quiz-question-edition[type='checkbox']:checked + label {
+	background: url(img/min_right_toggle.png);
+    content: "Bonne";
+}
--- a/src/widgets/Renkan.css	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,130 +0,0 @@
-
-.Ldt-Renkan-Container {
-    position: relative; width: 100%; height: 100%;
-}
-
-.Ldt-Renkan a {
-    color: #303080;
-}
-
-
-.Rk-Main {
-    position: absolute; left: 0; top: 0; right: 0; bottom: 0;
-}
-
-.Rk-Render {
-    position: absolute; left: 0; top: 0; right: 0; bottom: 0;
-    background: #ffffff;
-}
-
-/* Canvas */
-
-.Rk-Editing-Space {
-    position: absolute; left: 0; top: 35px; right: 0; bottom: 0; overflow: hidden;
-    background: -moz-radial-gradient( center, circle, #ffffff 40%, #e0e0e0 90%);
-    background: -webkit-radial-gradient( center, circle, #ffffff 40%, #e0e0e0 90%);
-    background: -ms-radial-gradient( center, circle, #ffffff 40%, #e0e0e0 90%);
-}
-
-.Rk-Editing-Space-Full {
-    top: 0;
-}
-
-.Rk-Canvas {
-    position: absolute; left: 0; top: 0; right: 0; bottom: 0; z-index: 2;
-}
-
-/* Node Labels */
-
-.Rk-Labels {
-    position: absolute; left: 0; top: 0; z-index: 1;
-    font-family: "Segoe UI", "Helvetica Neue", Arial, Helvetica, sans-serif;
-}
-
-.Rk-Label {
-    position: absolute; width: 160px; margin-left: -80px; text-align: center; font-size: 13px; line-height: 13px;
-}
-
-.Rk-Edge-Label {
-    font-size: 11px; transform-origin: 50% 0; -moz-transform-origin: 50% 0;
-    -webkit-transform-origin: 50% 0; -ms-transform-origin: 50% 0;
-}
-
-/* Editors */
-
-.Rk-Editor {
-    position: absolute; left: 0; top: 0; z-index: 3;
-}
-
-.Rk-Notifications {
-    position: absolute; right: 15px; top: 15px; width: 200px;
-    padding: 10px; border-radius: 8px; display: none;
-    color: #ffffff; font-size: 13px; text-align: center; font-weight: bold;
-    background: rgba(20,20,20,.7);
-    background: -moz-linear-gradient(top, rgba(40,40,40,.7) 20%, rgba(0,0,0,.7) 80%);
-    background: -webkit-linear-gradient(top, rgba(40,40,40,.7) 20%, rgba(0,0,0,.7) 80%);
-    background: -ms-linear-gradient(top, rgba(40,40,40,.7) 20%, rgba(0,0,0,.7) 80%);
-    filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#202020', endColorstr='#000000',GradientType=0 );
-}
-
-.Rk-CloseX {
-    float: right; cursor: pointer;
-}
-
-.Rk-Editor h2 {
-    font-size: 16px; font-weight: bold; padding: 0;
-}
-
-.Rk-Editor p, .Rk-Editor-p {
-    margin: 5px 0; font-size: 12px; clear: both; padding: 0;
-}
-
-.Rk-Editor-Label {
-    float: left; width: 80px;
-}
-
-.Rk-UserColor {
-    display: inline-block; width: 12px; height: 12px; border: 1px solid #666666; margin: -2px 2px;
-}
-
-.Rk-Display-Title a {
-    text-decoration: none; color: #000000;
-}
-
-.Rk-Display-Title a:hover {
-    text-decoration: underline;
-}
-
-.Rk-Display-URI {
-    font-style: italic;
-}
-
-.Rk-Display-ImgPreview {
-    margin: 5px auto; display: block; max-width: 255px !important; max-height: 120px !important;
-}
-
-
-.Rk-ZoomButtons {
-    position: absolute; left: 0; top: 35px; cursor: pointer;
-}
-
-.Rk-Editing-Space-Full .Rk-ZoomButtons {
-    top: 0;
-}
-
-.Rk-ZoomIn, .Rk-ZoomOut {
-    width: 21px; height: 20px; background: url(img/zoombuttons.png); margin: 5px;
-}
-
-.Rk-ZoomIn:hover {
-    background-position: 0 -20px;
-}
-
-.Rk-ZoomOut {
-    background-position: -21px 0;
-}
-
-.Rk-ZoomOut:hover {
-    background-position: -21px -20px;
-}
-
--- a/src/widgets/Renkan.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/widgets/Renkan.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,134 +1,150 @@
-IriSP.Widgets.Renkan = function(player, config) {
-    IriSP.Widgets.Widget.call(this, player, config);
-};
+import _ from "lodash";
+import renkanStyles from "./Renkan.module.css";
 
-IriSP.Widgets.Renkan.prototype = new IriSP.Widgets.Widget();
+const Renkan = function (ns) {
+  const Rkns = global.Rkns;
+  return class extends ns.Widgets.Widget {
+    constructor(player, config) {
+      super(player, config);
+    }
 
-IriSP.Widgets.Renkan.prototype.defaults = {
-    annotation_regexp: /player\/([a-zA-Z0-9_-]+)\/.*id=([a-zA-Z0-9_-]+)/,
-    tag_regexp: /search=([^&=]+)/,
-    min_duration: 5000,
-    renkan_options: {}
-};
+    static defaults = {
+      annotation_regexp: /player\/([a-zA-Z0-9_-]+)\/.*id=([a-zA-Z0-9_-]+)/,
+      tag_regexp: /search=([^&=]+)/,
+      min_duration: 5000,
+      renkan_options: {},
+    };
 
-IriSP.Widgets.Renkan.prototype.messages = {
-    "fr": {
-    },
-    "en": {
-    }
-};
+    static messages =  {
+      fr: {},
+      en: {},
+    };
+
+    static template =
+      '<div class="Ldt-Renkan-Container"><div class="Ldt-Renkan"></div></div>';
 
-IriSP.Widgets.Renkan.prototype.template =
-    '<div class="Ldt-Renkan-Container"><div class="Ldt-Renkan"></div></div>';
-
-IriSP.Widgets.Renkan.prototype.draw = function() {
-    this.renderTemplate();
-    var _id = IriSP.Model.getUID();
-    this.$.find(".Ldt-Renkan").attr("id", _id);
-    var renkan_options = IriSP._.extend({
-        container: _id,
-        editor_mode: false,
-        show_bins: false,
-        show_top_bar: false,
-        force_resize: true,
-        language: IriSP.language
-    }, this.renkan_options);
-    this.renkan = new Rkns.Renkan(renkan_options);
-    this.node_times = [];
-    var _this = this,
+    draw() {
+      this.messages
+this.messages
+this.messages
+this.messages
+this.messagesthis.renderTemplate();
+      var _id = ns.Model.getUID();
+      this.$.find(".Ldt-Renkan").attr("id", _id);
+      var renkan_options = _.extend(
+        {
+          container: _id,
+          editor_mode: false,
+          show_bins: false,
+          show_top_bar: false,
+          force_resize: true,
+          language: ns.language,
+        },
+        this.renkan_options
+      );
+      this.renkan = new Rkns.Renkan(renkan_options);
+      this.node_times = [];
+      var _this = this,
         _list = this.getWidgetAnnotations();
-    this.renkan.project.on("add:nodes", function(_node) {
+      this.renkan.project.on("add:nodes", function (_node) {
         var _uri = _node.get("uri"),
-            _annmatch = _uri.match(_this.annotation_regexp);
+          _annmatch = _uri.match(_this.annotation_regexp);
         if (_annmatch) {
-            var _annotations = _list.filter(function(_ann) {
-                return _ann.getMedia().id == _annmatch[1] && _ann.id == _annmatch[2];
+          var _annotations = _list.filter(function (_ann) {
+            return (
+              _ann.getMedia().id == _annmatch[1] && _ann.id == _annmatch[2]
+            );
+          });
+          _annotations.forEach(function (_ann) {
+            var _duration = _ann.getDuration(),
+              _preroll =
+                +(_duration < _this.min_duration) * (_this.min_duration / 2);
+            var _nt = {
+              uri: _uri,
+              selected: false,
+              node: _node,
+              annotation: _ann,
+              begin: _ann.begin - _preroll,
+              end: _ann.end + _preroll,
+            };
+            _this.node_times.push(_nt);
+            var _annselected = false,
+              _nodeselected = false;
+            _ann.on("select", function () {
+              _annselected = true;
+              if (!_nodeselected) {
+                _node.trigger("select", true);
+              }
             });
-            _annotations.forEach(function(_ann) {
-                var _duration = _ann.getDuration(),
-                    _preroll = + ( _duration < _this.min_duration ) * ( _this.min_duration / 2);
-                var _nt = {
-                    uri: _uri,
-                    selected: false,
-                    node: _node,
-                    annotation: _ann,
-                    begin: _ann.begin - _preroll,
-                    end: _ann.end + _preroll
-                };
-                _this.node_times.push(_nt);
-                var _annselected = false,
-                    _nodeselected = false;
-                _ann.on("select", function() {
-                    _annselected = true;
-                    if (!_nodeselected) {
-                        _node.trigger("select",true);
-                    }
-                });
-                _node.on("selected", function() {
-                    _nodeselected = true;
-                    if (!_annselected) {
-                        _ann.trigger("select",true);
-                    }
-                });
-                _ann.on("unselect", function() {
-                    _annselected = false;
-                    if (_nodeselected) {
-                        _node.trigger("unselect",true);
-                    }
-                });
-                _node.on("unselected", function() {
-                    _nodeselected = false;
-                    _nt.selected = false;
-                    if (_annselected) {
-                        _ann.trigger("unselect",true);
-                    }
-                });
-                _node.on("clicked", function() {
-                    _ann.trigger("click");
-                });
+            _node.on("selected", function () {
+              _nodeselected = true;
+              if (!_annselected) {
+                _ann.trigger("select", true);
+              }
+            });
+            _ann.on("unselect", function () {
+              _annselected = false;
+              if (_nodeselected) {
+                _node.trigger("unselect", true);
+              }
             });
+            _node.on("unselected", function () {
+              _nodeselected = false;
+              _nt.selected = false;
+              if (_annselected) {
+                _ann.trigger("unselect", true);
+              }
+            });
+            _node.on("clicked", function () {
+              _ann.trigger("click");
+            });
+          });
         }
         var _tagmatch = _uri.match(_this.tag_regexp);
         if (_tagmatch) {
-            _node.on("select", function() {
-                _this.source.getAnnotations().search(_tagmatch[1]);
-            });
-            _node.on("unselect", function() {
-                _this.source.getAnnotations().search("");
-            });
+          _node.on("select", function () {
+            _this.source.getAnnotations().search(_tagmatch[1]);
+          });
+          _node.on("unselect", function () {
+            _this.source.getAnnotations().search("");
+          });
         }
-    });
-    Rkns.jsonIO(this.renkan, {
-        url: this.data
-    });
-    
-    this.onMediaEvent("timeupdate","onTimeupdate");
-    
-    this.$.find(".Rk-Editor").on("click", "a", function() {
+      });
+      Rkns.jsonIO(this.renkan, {
+        url: this.data,
+      });
+
+      this.onMediaEvent("timeupdate", "onTimeupdate");
+
+      this.$.find(".Rk-Editor").on("click", "a", function () {
         var href = this.href,
-            times = _this.node_times.filter(function(t) {
-                return t.uri == href;
-            });
+          times = _this.node_times.filter(function (t) {
+            return t.uri == href;
+          });
         if (times.length) {
-            IriSP._(times).each(function(t) {
-                t.annotation.trigger("click");
-            });
-            return false;
+          _(times).each(function (t) {
+            t.annotation.trigger("click");
+          });
+          return false;
         }
-    });
+      });
+    }
+
+    onTimeupdate(_time) {
+      _(this.node_times).each(function (_nt) {
+        if (_nt.begin <= _time && _nt.end >= _time) {
+          if (!_nt.selected) {
+            _nt.selected = true;
+            _nt.node.trigger("select");
+          }
+        } else {
+          if (_nt.selected) {
+            _nt.node.trigger("unselect");
+          }
+        }
+      });
+    }
+  };
 };
 
-IriSP.Widgets.Renkan.prototype.onTimeupdate = function(_time) {
-    IriSP._(this.node_times).each(function(_nt) {
-        if (_nt.begin <= _time && _nt.end >= _time) {
-            if (!_nt.selected) {
-                _nt.selected = true;
-                _nt.node.trigger("select");
-            }
-        } else {
-            if (_nt.selected) {
-                _nt.node.trigger("unselect");
-            }
-        }
-    });
-};
+export { Renkan, renkanStyles };
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/widgets/Renkan.module.css	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,130 @@
+
+.Ldt-Renkan-Container {
+    position: relative; width: 100%; height: 100%;
+}
+
+.Ldt-Renkan a {
+    color: #303080;
+}
+
+
+.Rk-Main {
+    position: absolute; left: 0; top: 0; right: 0; bottom: 0;
+}
+
+.Rk-Render {
+    position: absolute; left: 0; top: 0; right: 0; bottom: 0;
+    background: #ffffff;
+}
+
+/* Canvas */
+
+.Rk-Editing-Space {
+    position: absolute; left: 0; top: 35px; right: 0; bottom: 0; overflow: hidden;
+    background: -moz-radial-gradient( center, circle, #ffffff 40%, #e0e0e0 90%);
+    background: -webkit-radial-gradient( center, circle, #ffffff 40%, #e0e0e0 90%);
+    background: -ms-radial-gradient( center, circle, #ffffff 40%, #e0e0e0 90%);
+}
+
+.Rk-Editing-Space-Full {
+    top: 0;
+}
+
+.Rk-Canvas {
+    position: absolute; left: 0; top: 0; right: 0; bottom: 0; z-index: 2;
+}
+
+/* Node Labels */
+
+.Rk-Labels {
+    position: absolute; left: 0; top: 0; z-index: 1;
+    font-family: "Segoe UI", "Helvetica Neue", Arial, Helvetica, sans-serif;
+}
+
+.Rk-Label {
+    position: absolute; width: 160px; margin-left: -80px; text-align: center; font-size: 13px; line-height: 13px;
+}
+
+.Rk-Edge-Label {
+    font-size: 11px; transform-origin: 50% 0; -moz-transform-origin: 50% 0;
+    -webkit-transform-origin: 50% 0; -ms-transform-origin: 50% 0;
+}
+
+/* Editors */
+
+.Rk-Editor {
+    position: absolute; left: 0; top: 0; z-index: 3;
+}
+
+.Rk-Notifications {
+    position: absolute; right: 15px; top: 15px; width: 200px;
+    padding: 10px; border-radius: 8px; display: none;
+    color: #ffffff; font-size: 13px; text-align: center; font-weight: bold;
+    background: rgba(20,20,20,.7);
+    background: -moz-linear-gradient(top, rgba(40,40,40,.7) 20%, rgba(0,0,0,.7) 80%);
+    background: -webkit-linear-gradient(top, rgba(40,40,40,.7) 20%, rgba(0,0,0,.7) 80%);
+    background: -ms-linear-gradient(top, rgba(40,40,40,.7) 20%, rgba(0,0,0,.7) 80%);
+    filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#202020', endColorstr='#000000',GradientType=0 );
+}
+
+.Rk-CloseX {
+    float: right; cursor: pointer;
+}
+
+.Rk-Editor h2 {
+    font-size: 16px; font-weight: bold; padding: 0;
+}
+
+.Rk-Editor p, .Rk-Editor-p {
+    margin: 5px 0; font-size: 12px; clear: both; padding: 0;
+}
+
+.Rk-Editor-Label {
+    float: left; width: 80px;
+}
+
+.Rk-UserColor {
+    display: inline-block; width: 12px; height: 12px; border: 1px solid #666666; margin: -2px 2px;
+}
+
+.Rk-Display-Title a {
+    text-decoration: none; color: #000000;
+}
+
+.Rk-Display-Title a:hover {
+    text-decoration: underline;
+}
+
+.Rk-Display-URI {
+    font-style: italic;
+}
+
+.Rk-Display-ImgPreview {
+    margin: 5px auto; display: block; max-width: 255px !important; max-height: 120px !important;
+}
+
+
+.Rk-ZoomButtons {
+    position: absolute; left: 0; top: 35px; cursor: pointer;
+}
+
+.Rk-Editing-Space-Full .Rk-ZoomButtons {
+    top: 0;
+}
+
+.Rk-ZoomIn, .Rk-ZoomOut {
+    width: 21px; height: 20px; background: url(img/zoombuttons.png); margin: 5px;
+}
+
+.Rk-ZoomIn:hover {
+    background-position: 0 -20px;
+}
+
+.Rk-ZoomOut {
+    background-position: -21px 0;
+}
+
+.Rk-ZoomOut:hover {
+    background-position: -21px -20px;
+}
+
--- a/src/widgets/Segments.css	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,18 +0,0 @@
-/*
- * Segments Widget
- */
-
-.Ldt-Segments-Segment {
-    position: absolute; margin-left: -1px; border: 1px solid #ffffff;
-}
-
-.Ldt-Segments-Position {
-    background: #fc00ff;
-    position: absolute;
-    top: -1px;
-    left: 0;
-    margin-left: -1px;
-    width: 2px;
-    bottom: -1px;
-    z-index: 80000;
-}
\ No newline at end of file
--- a/src/widgets/Segments.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/widgets/Segments.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,241 +1,315 @@
-// TODO: Trigger IriSP.SegmentsWidget.click
+// TODO: Trigger ns.SegmentsWidget.click
+import Mustache from "mustache";
+import _ from "lodash";
+import jQuery from "jquery";
 
-IriSP.Widgets.Segments = function(player, config) {
-    IriSP.Widgets.Widget.call(this, player, config);
-};
+import segmentsStyles from "./Segments.module.css";
 
-IriSP.Widgets.Segments.prototype = new IriSP.Widgets.Widget();
+const Segments = function (ns) {
+  return class extends ns.Widgets.Widget {
+    constructor(player, config) {
+      super(player, config);
+    }
 
-IriSP.Widgets.Segments.prototype.defaults = {
-    annotation_type : "chap",
-    colors: ["#1f77b4","#aec7e8","#ff7f0e","#ffbb78","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5","#8c564b","#c49c94","#e377c2","#f7b6d2","#7f7f7f","#c7c7c7","#bcbd22","#dbdb8d","#17becf","#9edae5"],
-    line_height: 8,
-    background: "#e0e0e0",
-    overlap: .25,
-    found_color: "#FF00FC",
-    faded_found_color: "#ff80fc",
-    selected_color: "#74d600",
-    faded_selected_color: "#baf9b5",
-    no_tooltip: false,
-    use_timerange: false,
-    scale_to_parent: true
-};
+    static defaults = {
+      annotation_type: "chap",
+      colors: [
+        "#1f77b4",
+        "#aec7e8",
+        "#ff7f0e",
+        "#ffbb78",
+        "#2ca02c",
+        "#98df8a",
+        "#d62728",
+        "#ff9896",
+        "#9467bd",
+        "#c5b0d5",
+        "#8c564b",
+        "#c49c94",
+        "#e377c2",
+        "#f7b6d2",
+        "#7f7f7f",
+        "#c7c7c7",
+        "#bcbd22",
+        "#dbdb8d",
+        "#17becf",
+        "#9edae5",
+      ],
+      line_height: 8,
+      background: "#e0e0e0",
+      overlap: 0.25,
+      found_color: "#FF00FC",
+      faded_found_color: "#ff80fc",
+      selected_color: "#74d600",
+      faded_selected_color: "#baf9b5",
+      no_tooltip: false,
+      use_timerange: false,
+      scale_to_parent: true,
+    };
 
-IriSP.Widgets.Segments.prototype.template =
-    '<div class="Ldt-Segments-List"></div>'
-    + '<div class="Ldt-Segments-Position"></div>'
-    + '<div class="Ldt-Segments-Tooltip"></div>';
+    static template =
+      '<div class="Ldt-Segments-List"></div>' +
+      '<div class="Ldt-Segments-Position"></div>' +
+      '<div class="Ldt-Segments-Tooltip"></div>';
 
-IriSP.Widgets.Segments.prototype.annotationTemplate =
-    '<div class="Ldt-Segments-Segment Ldt-TraceMe" trace-info="segment-id:{{id}}, media-id:{{media_id}}, from:{{from}}, to:{{to}}" segment-text="{{text}}"'
-    + 'style="top:{{top}}px; height:{{height}}px; left:{{left}}px; width:{{width}}px; background:{{medcolor}}" data-base-color="{{color}}" data-low-color="{{lowcolor}}" data-medium-color="{{medcolor}}"></div>';
+    static annotationTemplate =
+      '<div class="Ldt-Segments-Segment Ldt-TraceMe" trace-info="segment-id:{{id}}, media-id:{{media_id}}, from:{{from}}, to:{{to}}" segment-text="{{text}}"' +
+      'style="top:{{top}}px; height:{{height}}px; left:{{left}}px; width:{{width}}px; background:{{medcolor}}" data-base-color="{{color}}" data-low-color="{{lowcolor}}" data-medium-color="{{medcolor}}"></div>';
 
-
-IriSP.Widgets.Segments.prototype.do_draw = function (isRedraw) {
-    if (this.width != this.$.parent().width() && this.scale_to_parent) {
+    do_draw(isRedraw) {
+      if (this.width != this.$.parent().width() && this.scale_to_parent) {
         // Reset width
         this.width = this.$.parent().width();
-        this.$.css({ width : this.width + "px" });
-    }
-    var _this = this,
-        _list = this.getWidgetAnnotations().filter(function(_ann) {
-            return _ann.getDuration() > 0 && _ann.getMedia().id == _this.media.id;
+        this.$.css({ width: this.width + "px" });
+      }
+      var _this = this,
+        _list = this.getWidgetAnnotations().filter(function (_ann) {
+          return _ann.getDuration() > 0 && _ann.getMedia().id == _this.media.id;
         }),
         _scale = this.width / this.source.getDuration(),
-        list_$ = this.$.find('.Ldt-Segments-List'),
+        list_$ = this.$.find(".Ldt-Segments-List"),
         lines = [],
         zindex = 1,
         searching = false;
-    
-    function saturate(r, g, b, s) {
+
+      function saturate(r, g, b, s) {
         function satcomp(c) {
-            return Math.floor(240 * (1 - s) + c * s);
+          return Math.floor(240 * (1 - s) + c * s);
         }
-        var res = ( 0x10000 * satcomp(r) + 0x100 * satcomp(g) + satcomp(b)).toString(16);
+        var res = (
+          0x10000 * satcomp(r) +
+          0x100 * satcomp(g) +
+          satcomp(b)
+        ).toString(16);
         while (res.length < 6) {
-            res = "0" + res;
+          res = "0" + res;
         }
         return "#" + res;
-    }
+      }
 
-    if (isRedraw) {
+      if (isRedraw) {
         // Remove all previous elements before recreating them. Not very efficient.
-        this.$.find('.Ldt-Segments-Segment').remove();
-    }
-    _list.forEach(function(_annotation, _k) {
+        this.$.find(".Ldt-Segments-Segment").remove();
+      }
+      _list.forEach(function (_annotation, _k) {
         var _left = _annotation.begin * _scale,
-            _width = ( _annotation.getDuration() ) * _scale,
-            _center = Math.floor( _left + _width / 2 ),
-            _fulltext = _annotation.title + ( _annotation.description ? ( '<br/>' + _annotation.description ) : '' ),
-            line = IriSP._(lines).find(function(line) {
-                return !IriSP._(line.annotations).find(function(a) {
-                    return a.begin < _annotation.end && a.end > _annotation.begin;
-                });
+          _width = _annotation.getDuration() * _scale,
+          _center = Math.floor(_left + _width / 2),
+          _fulltext =
+            _annotation.title +
+            (_annotation.description ? "<br/>" + _annotation.description : ""),
+          line = _(lines).find(function (line) {
+            return !_(line.annotations).find(function (a) {
+              return a.begin < _annotation.end && a.end > _annotation.begin;
             });
+          });
         if (!line) {
-            line = { index: lines.length, annotations: []};
-            lines.push(line); 
+          line = { index: lines.length, annotations: [] };
+          lines.push(line);
         }
         line.annotations.push(_annotation);
-        var _top = ((1 - _this.overlap) * line.index) * _this.line_height,
-            color = ( typeof _annotation.color !== "undefined" && _annotation.color ? _annotation.color : _this.colors[_k % _this.colors.length] ),
-            r = parseInt(color.substr(1,2),16),
-            g = parseInt(color.substr(3,2),16),
-            b = parseInt(color.substr(5,2),16),
-            medcolor = saturate(r, g, b, .5),
-            lowcolor = saturate(r, g, b, .2);
+        var _top = (1 - _this.overlap) * line.index * _this.line_height,
+          color =
+            typeof _annotation.color !== "undefined" && _annotation.color
+              ? _annotation.color
+              : _this.colors[_k % _this.colors.length],
+          r = parseInt(color.substr(1, 2), 16),
+          g = parseInt(color.substr(3, 2), 16),
+          b = parseInt(color.substr(5, 2), 16),
+          medcolor = saturate(r, g, b, 0.5),
+          lowcolor = saturate(r, g, b, 0.2);
         var _data = {
-            color : color,
-            medcolor: medcolor,
-            lowcolor: lowcolor,
-            text: (_annotation.creator ? (_annotation.creator + " : ") : "" ) + _fulltext.replace(/(\n|\r|\r\n)/mg,' ').replace(/(^.{120,140})[\s].+$/m,'$1&hellip;'),
-            left : _left,
-            width : _width,
-            top: _top,
-            height: _this.line_height - 1,
-            id : _annotation.id,
-            media_id : _annotation.getMedia().id,
-            from: _annotation.begin.toString(),
-            to: _annotation.end.toString()
+          color: color,
+          medcolor: medcolor,
+          lowcolor: lowcolor,
+          text:
+            (_annotation.creator ? _annotation.creator + " : " : "") +
+            _fulltext
+              .replace(/(\n|\r|\r\n)/gm, " ")
+              .replace(/(^.{120,140})[\s].+$/m, "$1&hellip;"),
+          left: _left,
+          width: _width,
+          top: _top,
+          height: _this.line_height - 1,
+          id: _annotation.id,
+          media_id: _annotation.getMedia().id,
+          from: _annotation.begin.toString(),
+          to: _annotation.end.toString(),
         };
-        var _html = Mustache.to_html(_this.annotationTemplate, _data),
-            _el = IriSP.jQuery(_html);
-        _el.mouseover(function() {
-                _annotation.trigger("select");
-            })
-            .mouseout(function() {
-                _annotation.trigger("unselect");
-            })
-            .click(function() {
-                if(_this.use_timerange){
-                    if(!_this.media.getTimeRange()){
-                        _this.media.setCurrentTime(_annotation.begin);
-                        _this.media.setTimeRange(_annotation.begin, _annotation.end);
-                        _this.media.play();
-                        _this.$segments.each(function(){
-                            var _segment = IriSP.jQuery(this);
-                            _segment.css("background", lowcolor).removeClass("selected");
-                        })
-                        _el.css("background", _this.selected_color).addClass("selected");
-                    }
-                    else if (_this.media.getTimeRange()[0]==_annotation.begin || _this.media.getTimeRange()[1]==_annotation.end){
-                        _this.media.resetTimeRange();
-                        _this.$segments.each(function(){
-                            var _segment = IriSP.jQuery(this);
-                            _segment.css("background", lowcolor).removeClass("selected");
-                            _annotation.trigger("select");
-                        })
-                    }
-                    else {
-                        _this.media.setCurrentTime(_annotation.begin);
-                        _this.media.setTimeRange(_annotation.begin, _annotation.end);
-                        _this.media.play();
-                        _this.$segments.each(function(){
-                            var _segment = IriSP.jQuery(this);
-                            _segment.css("background", lowcolor).removeClass("selected");
-                        })
-                        _el.css("background", _this.selected_color).addClass("selected");
-                    }
-                }
-                _annotation.trigger("click");
-            })
-            .appendTo(list_$);
-        IriSP.attachDndData(_el, {
-        	title: _annotation.title,
-        	description: _annotation.description,
-        	uri: (typeof _annotation.url !== "undefined" 
-                ? _annotation.url
-                : (document.location.href.replace(/#.*$/,'') + '#id='  + _annotation.id)),
-            image: _annotation.thumbnail,
-            text: '[' + _annotation.begin.toString() + '] ' + _annotation.title
+        var _html = Mustache.render(_this.constructor.annotationTemplate, _data),
+          _el = jQuery(_html);
+        _el
+          .on("mouseover", function () {
+            _annotation.trigger("select");
+          })
+          .on("mouseout", function () {
+            _annotation.trigger("unselect");
+          })
+          .on("click", function () {
+            if (_this.use_timerange) {
+              if (!_this.media.getTimeRange()) {
+                _this.media.setCurrentTime(_annotation.begin);
+                _this.media.setTimeRange(_annotation.begin, _annotation.end);
+                _this.media.play();
+                _this.$segments.each(function () {
+                  var _segment = jQuery(this);
+                  _segment.css("background", lowcolor).removeClass("selected");
+                });
+                _el
+                  .css("background", _this.selected_color)
+                  .addClass("selected");
+              } else if (
+                _this.media.getTimeRange()[0] == _annotation.begin ||
+                _this.media.getTimeRange()[1] == _annotation.end
+              ) {
+                _this.media.resetTimeRange();
+                _this.$segments.each(function () {
+                  var _segment = jQuery(this);
+                  _segment.css("background", lowcolor).removeClass("selected");
+                  _annotation.trigger("select");
+                });
+              } else {
+                _this.media.setCurrentTime(_annotation.begin);
+                _this.media.setTimeRange(_annotation.begin, _annotation.end);
+                _this.media.play();
+                _this.$segments.each(function () {
+                  var _segment = jQuery(this);
+                  _segment.css("background", lowcolor).removeClass("selected");
+                });
+                _el
+                  .css("background", _this.selected_color)
+                  .addClass("selected");
+              }
+            }
+            _annotation.trigger("click");
+          })
+          .appendTo(list_$);
+        ns.attachDndData(_el, {
+          title: _annotation.title,
+          description: _annotation.description,
+          uri:
+            typeof _annotation.url !== "undefined"
+              ? _annotation.url
+              : document.location.href.replace(/#.*$/, "") +
+                "#id=" +
+                _annotation.id,
+          image: _annotation.thumbnail,
+          text: "[" + _annotation.begin.toString() + "] " + _annotation.title,
+        });
+        _annotation.on("select", function () {
+          _this.$segments.each(function () {
+            var _segment = jQuery(this);
+            _segment.css({
+              background: _segment.hasClass("found")
+                ? _this.faded_found_color
+                : _segment.attr("data-low-color"),
+            });
+            _segment.css({
+              background: _segment.hasClass("selected")
+                ? _this.faded_selected_color
+                : _segment.attr("data-low-color"),
+            });
+          });
+          _el.css({
+            background: _el.hasClass("found") ? _this.found_color : color,
+            background: _el.hasClass("selected") ? _this.selected_color : color,
+            "z-index": ++zindex,
+          });
+          if (_this.tooltip) {
+            _this.tooltip.show(_center, _top, _data.text, _data.color);
+          }
         });
-        _annotation.on("select", function() {
-            _this.$segments.each(function() {
-                var _segment = IriSP.jQuery(this);
-                _segment.css({
-                    background: _segment.hasClass("found") ? _this.faded_found_color : _segment.attr("data-low-color")
-                });
-                _segment.css({
-                    background: _segment.hasClass("selected") ? _this.faded_selected_color : _segment.attr("data-low-color")
-                })
-            });
-            _el.css({
-                background: _el.hasClass("found") ? _this.found_color: color,
-                background: _el.hasClass("selected") ? _this.selected_color: color,
-                "z-index": ++zindex
-            });
-            if (_this.tooltip) {
-                _this.tooltip.show( _center, _top, _data.text, _data.color );
-            }
+        _annotation.on("unselect", function () {
+          if (_this.tooltip) {
+            _this.tooltip.hide();
+          }
+          _this.$segments.each(function () {
+            var _segment = jQuery(this);
+            _segment.css(
+              "background",
+              _segment.hasClass("found")
+                ? _this.found_color
+                : _segment.attr(
+                    searching ? "data-low-color" : "data-medium-color"
+                  )
+            );
+            _segment.css(
+              "background",
+              _segment.hasClass("selected")
+                ? _this.selected_color
+                : _segment.attr(
+                    searching ? "data-low-color" : "data-medium-color"
+                  )
+            );
+          });
+        });
+        _annotation.on("found", function () {
+          _el.css("background", _this.found_color).addClass("found");
+        });
+        _annotation.on("not-found", function () {
+          _el.css("background", lowcolor).removeClass("found");
+        });
+      });
+
+      this.onMediaEvent("resettimerange", function () {
+        _this.$segments.each(function () {
+          var _segment = jQuery(this);
+          _segment.removeClass("selected");
         });
-        _annotation.on("unselect", function() {
-            if (_this.tooltip) {
-                _this.tooltip.hide();
-            }
-            _this.$segments.each(function() {
-                var _segment = IriSP.jQuery(this);
-                _segment.css("background", _segment.hasClass("found") ? _this.found_color : _segment.attr(searching ? "data-low-color" : "data-medium-color"));
-                _segment.css("background", _segment.hasClass("selected") ? _this.selected_color : _segment.attr(searching ? "data-low-color" : "data-medium-color"));
-            });
-        });
-        _annotation.on("found", function() {
-            _el.css("background", _this.found_color).addClass("found");
-        });
-        _annotation.on("not-found", function() {
-            _el.css("background", lowcolor).removeClass("found");
+      });
+
+      this.$.css({
+        width: this.width + "px",
+        height:
+          ((1 - this.overlap) * lines.length + this.overlap) *
+            this.line_height +
+          "px",
+        background: this.background,
+        margin: "1px 0",
+      });
+      this.$segments = this.$.find(".Ldt-Segments-Segment");
+    }
+
+    draw() {
+      var widget = this;
+      widget.onMediaEvent("timeupdate", "onTimeupdate");
+      widget.renderTemplate();
+      widget.do_draw();
+      if (!this.no_tooltip) {
+        widget.insertSubwidget(
+          widget.$.find(".Ldt-Segments-Tooltip"),
+          {
+            type: "Tooltip",
+            min_x: 0,
+            max_x: this.width,
+          },
+          "tooltip"
+        );
+      }
+      widget.source.getAnnotations().on("search", function () {
+        searching = true;
+      });
+      widget.source.getAnnotations().on("search-cleared", function () {
+        searching = false;
+        _this.$segments.each(function () {
+          var _segment = jQuery(this);
+          _segment
+            .css("background", _segment.attr("data-medium-color"))
+            .removeClass("found");
         });
-    });
-    
-    this.onMediaEvent("resettimerange", function(){
-        
-        _this.$segments.each(function(){
-            var _segment = IriSP.jQuery(this);
-            _segment.removeClass("selected");
-        })
-    });
-    
-    this.$.css({
-        width : this.width + "px",
-        height : (((1 - this.overlap) * lines.length + this.overlap) * this.line_height) + "px",
-        background : this.background,
-        margin: "1px 0"
-    });
-    this.$segments = this.$.find('.Ldt-Segments-Segment');
+      });
+      this.$.on("resize", function () {
+        widget.do_draw(true);
+      });
+    }
+
+    onTimeupdate(_time) {
+      var _x = Math.floor((this.width * _time) / this.media.duration);
+      this.$.find(".Ldt-Segments-Position").css({
+        left: _x + "px",
+      });
+    }
+  };
 };
 
-IriSP.Widgets.Segments.prototype.draw = function() {
-    var widget = this;
-    widget.onMediaEvent("timeupdate", "onTimeupdate");
-    widget.renderTemplate();
-    widget.do_draw();
-    if (!this.no_tooltip) {
-        widget.insertSubwidget(
-            widget.$.find(".Ldt-Segments-Tooltip"),
-            {
-                type: "Tooltip",
-                min_x: 0,
-                max_x: this.width
-            },
-            "tooltip"
-        );
-    };
-    widget.source.getAnnotations().on("search", function() {
-        searching = true;
-    });
-    widget.source.getAnnotations().on("search-cleared", function() {
-        searching = false;
-        _this.$segments.each(function() {
-            var _segment = IriSP.jQuery(this);
-            _segment.css("background", _segment.attr("data-medium-color")).removeClass("found");
-        });
-    });
-    this.$.on("resize", function () { widget.do_draw(true); });
-};
-
-IriSP.Widgets.Segments.prototype.onTimeupdate = function(_time) {    
-    var _x = Math.floor( this.width * _time / this.media.duration);
-    this.$.find('.Ldt-Segments-Position').css({
-        left: _x + "px"
-    });
-};
-
+export { Segments, segmentsStyles };
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/widgets/Segments.module.css	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,18 @@
+/*
+ * Segments Widget
+ */
+
+.Ldt-Segments-Segment {
+    position: absolute; margin-left: -1px; border: 1px solid #ffffff;
+}
+
+.Ldt-Segments-Position {
+    background: #fc00ff;
+    position: absolute;
+    top: -1px;
+    left: 0;
+    margin-left: -1px;
+    width: 2px;
+    bottom: -1px;
+    z-index: 80000;
+}
\ No newline at end of file
--- a/src/widgets/Shortcuts.css	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-/* Empty file */
--- a/src/widgets/Shortcuts.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/widgets/Shortcuts.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,64 +1,83 @@
-IriSP.Widgets.Shortcuts = function(player, config) {
-    IriSP.Widgets.Widget.call(this, player, config);
-};
+import shortcutsStyles from "./Shortcuts.module.css";
 
-/**
- * Keyboard shortcuts widget
- * This widgets add global shortcuts for common actions.
- * The default shortcuts are: 
- * - Control-space for play/pause
- * - Control-left for rewind (+shift to go faster)
- * - Control-right for forward (+shift to go faster)
- */
-IriSP.Widgets.Shortcuts.prototype = new IriSP.Widgets.Widget();
+const Shortcuts = function (ns) {
+  return class extends ns.Widgets.Widget {
+    constructor(player, config) {
+      super(player, config);
+    }
 
-IriSP.Widgets.Shortcuts.prototype.defaults =  {
-    // Time increment, in ms, for backward/forward navigation
-    time_increment: 2000
-}
+    /**
+     * Keyboard shortcuts widget
+     * This widgets add global shortcuts for common actions.
+     * The default shortcuts are:
+     * - Control-space for play/pause
+     * - Control-left for rewind (+shift to go faster)
+     * - Control-right for forward (+shift to go faster)
+     */
+    static defaults = {
+      // Time increment, in ms, for backward/forward navigation
+      time_increment: 2000,
+    };
 
-IriSP.Widgets.Shortcuts.prototype.draw = function() {
-    var  _this = this;
-    
-    /* Standard shortcuts */
-    Mousetrap.bindGlobal("ctrl+space", function (e) {
+    draw() {
+      var _this = this;
+
+      /* Standard shortcuts */
+      Mousetrap.bindGlobal("ctrl+space", function (e) {
         e.preventDefault();
-        if (! _this.media.getPaused()) {
-            _this.media.pause();
+        if (!_this.media.getPaused()) {
+          _this.media.pause();
         } else {
-            _this.media.play();
+          _this.media.play();
         }
         return false;
-    });
-    Mousetrap.bindGlobal("ctrl+left", function (e) {
+      });
+      Mousetrap.bindGlobal("ctrl+left", function (e) {
         // Backward
         e.preventDefault();
-        _this.media.setCurrentTime(Math.max(0, _this.media.getCurrentTime() - _this.time_increment));
+        _this.media.setCurrentTime(
+          Math.max(0, _this.media.getCurrentTime() - _this.time_increment)
+        );
         return false;
-    });
-    Mousetrap.bindGlobal("ctrl+shift+left", function (e) {
+      });
+      Mousetrap.bindGlobal("ctrl+shift+left", function (e) {
         // Backward
         e.preventDefault();
-        _this.media.setCurrentTime(Math.max(0, _this.media.getCurrentTime() - 5 * _this.time_increment));
+        _this.media.setCurrentTime(
+          Math.max(0, _this.media.getCurrentTime() - 5 * _this.time_increment)
+        );
         return false;
-    });
-    Mousetrap.bindGlobal("ctrl+right", function (e) {
+      });
+      Mousetrap.bindGlobal("ctrl+right", function (e) {
         // Forward
         e.preventDefault();
-        _this.media.setCurrentTime(Math.min(_this.media.duration, _this.media.getCurrentTime() + _this.time_increment));
+        _this.media.setCurrentTime(
+          Math.min(
+            _this.media.duration,
+            _this.media.getCurrentTime() + _this.time_increment
+          )
+        );
         return false;
-    });
-    Mousetrap.bindGlobal("ctrl+shift+right", function (e) {
+      });
+      Mousetrap.bindGlobal("ctrl+shift+right", function (e) {
         // Forward
         e.preventDefault();
-        _this.media.setCurrentTime(Math.min(_this.media.duration, _this.media.getCurrentTime() + 5 * _this.time_increment));
+        _this.media.setCurrentTime(
+          Math.min(
+            _this.media.duration,
+            _this.media.getCurrentTime() + 5 * _this.time_increment
+          )
+        );
         return false;
-    });
-    Mousetrap.bindGlobal("ctrl+a", function (e) {
+      });
+      Mousetrap.bindGlobal("ctrl+a", function (e) {
         // Annotate
         e.preventDefault();
         _this.player.trigger("CreateAnnotation.toggle");
         return false;
-    });
+      });
+    }
+  };
+};
 
-};
+export { Shortcuts, shortcutsStyles };
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/widgets/Shortcuts.module.css	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,1 @@
+/* Empty file */
--- a/src/widgets/Slice.css	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,23 +0,0 @@
-/* Slider Widget */
-
-.Ldt-Slice {
-    border-radius: 0; border: none; padding: 0; margin: 12px 0 12px; background: #B6B8B8; height: 8px;
-}
-
-.Ldt-Slice .ui-slider-handle {
-    width: 7px; height: 20px; top: 0; border: none; margin: 0; padding: 0;
-    background: url(img/slice-handles.png); border-radius: 0; cursor: pointer;
-}
-
-.ui-slider-handle.Ldt-Slice-left-handle {
-    margin-left: -7px;
-}
-
-.ui-slider-handle.Ldt-Slice-right-handle {
-    margin-left: 0; background-position: -7px 0;
-}
-
-.Ldt-Slice .ui-slider-range {
-    background: url(img/pinstripe-purple.png);
-}
-
--- a/src/widgets/Slice.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/widgets/Slice.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,23 +1,24 @@
 /*
  The Slider Widget shows time position and allows seek
  */
+import sliceStyles from "./Slice.module.css";
 
-IriSP.Widgets.Slice = function(player, config) {
-    IriSP.Widgets.Widget.call(this, player, config);
+const Slice = function(ns) {
+    return class extends ns.Widgets.Widget {
+constructor(player, config) {
+    super(player, config);
     this.sliding = false;
 };
 
-IriSP.Widgets.Slice.prototype = new IriSP.Widgets.Widget();
-
-IriSP.Widgets.Slice.prototype.defaults = {
+static defaults = {
     show_arrow: false
 };
 
-IriSP.Widgets.Slice.prototype.template =
+static template =
     '<div class="Ldt-Slice"></div>'
     + '{{#show_arrow}}<div class="Ldt-Slice-Arrow"></div>{{/show_arrow}}';
 
-IriSP.Widgets.Slice.prototype.draw = function() {
+draw() {
     
     this.renderTemplate();
     
@@ -75,14 +76,18 @@
     });
 };
 
-IriSP.Widgets.Slice.prototype.setBounds = function(begin, end) {
+setBounds(begin, end) {
     this.$slider.slider("values", [ begin, end ]);
 };
 
-IriSP.Widgets.Slice.prototype.show = function() {
+show() {
     this.$slider.show();
 };
 
-IriSP.Widgets.Slice.prototype.hide = function() {
+hide() {
     this.$slider.hide();
 };
+
+    }}
+
+export { Slice, sliceStyles };
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/widgets/Slice.module.css	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,23 @@
+/* Slider Widget */
+
+.Ldt-Slice {
+    border-radius: 0; border: none; padding: 0; margin: 12px 0 12px; background: #B6B8B8; height: 8px;
+}
+
+.Ldt-Slice .ui-slider-handle {
+    width: 7px; height: 20px; top: 0; border: none; margin: 0; padding: 0;
+    background: url(img/slice-handles.png); border-radius: 0; cursor: pointer;
+}
+
+.ui-slider-handle.Ldt-Slice-left-handle {
+    margin-left: -7px;
+}
+
+.ui-slider-handle.Ldt-Slice-right-handle {
+    margin-left: 0; background-position: -7px 0;
+}
+
+.Ldt-Slice .ui-slider-range {
+    background: url(img/pinstripe-purple.png);
+}
+
--- a/src/widgets/SlidePreview.css	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,43 +0,0 @@
-.Ldt-SlidePreview-Container {
-    background-color: #999;
-    left: 0px;
-    right: 0px;
-    height: 36px;
-    padding-left: 4px;
-    overflow: hidden;
-}
-.Ldt-SlidePreview-Slides {
-    display: -webkit-inline-flex;
-    display: inline-flex;
-    -webkit-flex-direction: row;
-    flex-direction:         row;
-    -webkit-flex-wrap: nowrap;
-    flex-wrap:         nowrap;
-    overflow-x: hidden;
-    left: 0px;
-    right: 0px;
-    height: 36px;
-    padding: 0;
-    padding-top: 12px;
-    margin: 0;
-    overflow-y: hidden;
-}
-.Ldt-SlidePreview-Item {
-    display: inline-block;
-    width: 20px;
-    height: 12px;
-    background-color: #fff;
-    transition: transform .2s ease-in-out;
-}
-.Ldt-SlidePreview-Item img {
-    max-width: 100%;
-    max-height: 100%;
-}
-.Ldt-SlidePreview-Item:hover {
-    -webkit-transform: scale(2.8);
-    z-index: 4;
-}
-.Ldt-SlidePreview-Item:hover + .slidepreviewitem {
-    -webkit-transform: scale(1.8);
-    z-index: 1;
-}
--- a/src/widgets/SlidePreview.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/widgets/SlidePreview.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,38 +1,50 @@
-IriSP.Widgets.SlidePreview = function(player, config) {
-    IriSP.Widgets.Widget.call(this, player, config);
-}
+import Mustache from "mustache";
+import slidePreviewStyles from "./SlidePreview.module.css";
+import jQuery from "jquery";
 
-IriSP.Widgets.SlidePreview.prototype = new IriSP.Widgets.Widget();
+const SlidePreview = function (ns) {
+  return class extends ns.Widgets.Widget {
+    constructor(player, config) {
+      super(player, config);
+    }
 
-IriSP.Widgets.SlidePreview.prototype.defaults = {
-    annotation_type: "Slides"
-}
+    static defaults = {
+      annotation_type: "Slides",
+    };
+
+    static template =
+      '<div class="Ldt-SlidePreview-Container"><div class="Ldt-SlidePreview-Slides"></div></div>';
 
-IriSP.Widgets.SlidePreview.prototype.template = '<div class="Ldt-SlidePreview-Container"><div class="Ldt-SlidePreview-Slides"></div></div>';
+    static annotationTemplate =
+      '<div data-id="{{ id }}" data-timecode="{{ ms }}" class="Ldt-SlidePreview-Item"><img title="{{ begin }} - {{ atitle }}" class="Ldt-AnnotationsList-Thumbnail" src="{{ thumbnail }}"></div>';
 
-IriSP.Widgets.SlidePreview.prototype.annotationTemplate = '<div data-id="{{ id }}" data-timecode="{{ ms }}" class="Ldt-SlidePreview-Item"><img title="{{ begin }} - {{ atitle }}" class="Ldt-AnnotationsList-Thumbnail" src="{{ thumbnail }}"></div>';
-
-IriSP.Widgets.SlidePreview.prototype.draw = function() {
-    var _annotations = this.getWidgetAnnotations().sortBy(function(_annotation) {
+    draw() {
+      var _annotations = this.getWidgetAnnotations().sortBy(function (
+        _annotation
+      ) {
         return _annotation.begin;
-    });
-    var _this = this;
-    _this.renderTemplate();
-    var content = _this.$.find('.Ldt-SlidePreview-Slides');
+      });
+      var _this = this;
+      _this.renderTemplate();
+      var content = _this.$.find(".Ldt-SlidePreview-Slides");
 
-    this.getWidgetAnnotations().forEach(function(_a) {
+      this.getWidgetAnnotations().forEach(function (_a) {
         var _data = {
-            id : _a.id,
-            content : IriSP.textFieldHtml(_a.title),
-            begin : _a.begin.toString(),
-            ms: _a.begin.milliseconds,
-            thumbnail: _a.thumbnail
-            };
-        var _html = Mustache.to_html(_this.annotationTemplate, _data);
-        var _el = IriSP.jQuery(_html);
+          id: _a.id,
+          content: ns.textFieldHtml(_a.title),
+          begin: _a.begin.toString(),
+          ms: _a.begin.milliseconds,
+          thumbnail: _a.thumbnail,
+        };
+        var _html = Mustache.render(_this.annotationTemplate, _data);
+        var _el = jQuery(_html);
         content.append(_el);
-    });
-    _this.$.on("click", ".Ldt-SlidePreview-Item", function () {
+      });
+      _this.$.on("click", ".Ldt-SlidePreview-Item", function () {
         _this.media.setCurrentTime(Number(this.dataset.timecode));
-    });
+      });
+    }
+  };
 };
+
+export { SlidePreview, slidePreviewStyles };
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/widgets/SlidePreview.module.css	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,43 @@
+.Ldt-SlidePreview-Container {
+    background-color: #999;
+    left: 0px;
+    right: 0px;
+    height: 36px;
+    padding-left: 4px;
+    overflow: hidden;
+}
+.Ldt-SlidePreview-Slides {
+    display: -webkit-inline-flex;
+    display: inline-flex;
+    -webkit-flex-direction: row;
+    flex-direction:         row;
+    -webkit-flex-wrap: nowrap;
+    flex-wrap:         nowrap;
+    overflow-x: hidden;
+    left: 0px;
+    right: 0px;
+    height: 36px;
+    padding: 0;
+    padding-top: 12px;
+    margin: 0;
+    overflow-y: hidden;
+}
+.Ldt-SlidePreview-Item {
+    display: inline-block;
+    width: 20px;
+    height: 12px;
+    background-color: #fff;
+    transition: transform .2s ease-in-out;
+}
+.Ldt-SlidePreview-Item img {
+    max-width: 100%;
+    max-height: 100%;
+}
+.Ldt-SlidePreview-Item:hover {
+    -webkit-transform: scale(2.8);
+    z-index: 4;
+}
+.Ldt-SlidePreview-Item:hover + .slidepreviewitem {
+    -webkit-transform: scale(1.8);
+    z-index: 1;
+}
--- a/src/widgets/SlideVideoPlayer.css	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,56 +0,0 @@
-.Ldt-SlideVideoPlayer-panel {
-    display: -webkit-flex;
-    display: flex;
-    width: 50%;
-    float: left;
-}
-
-.Ldt-SlideVideoPlayer {
-    width: 100%;
-    max-width: 100%;
-    height: 100%;
-    max-height: 100%;
-}
-
-.Ldt-SlideVideoPlayer-pip-main {
-    position: relative;
-    width: 100%;
-    height: 100%;
-    top: 0px;
-    left: 0px;
-    right: 0px;
-    bottom: 0px;
-    z-index: 1;
-}
-
-.Ldt-SlideVideoPlayer-pip-pip {
-    position: absolute;
-    width: 30%;
-    height: 30%;
-    right: 2px;
-    bottom: 2px;
-    z-index: 3;
-}
-
-.Ldt-SlideVideoPlayer h2 {
-    display: none;
-}
-.Ldt-SlideVideoPlayer-pip-menu {
-    position: absolute;
-    top: 0px;
-    right: 0px;
-    z-index: 10;
-    display: none;
-}
-.Ldt-SlideVideoPlayer-pip-pip:hover .Ldt-SlideVideoPlayer-pip-menu {
-    background-color: #000;
-    opacity: .5;
-    display: inline-block;
-}
-
-.Ldt-SlideVideoPlayer-pip-menu-toggle {
-    width: 18px;
-    height: 18px;
-    cursor: pointer;
-    background-image: url(img/pip_toggle.svg);
-}
--- a/src/widgets/SlideVideoPlayer.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/widgets/SlideVideoPlayer.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,86 +1,112 @@
-IriSP.Widgets.SlideVideoPlayer = function(player, config) {
-    IriSP.loadCss(IriSP.getLib("cssSplitter"));
-    IriSP.Widgets.Widget.call(this, player, config);
-};
+import slideVideoPlayerStyles from "./SlideVideoPlayer.module.css";
 
-IriSP.Widgets.SlideVideoPlayer.prototype = new IriSP.Widgets.Widget();
-
+const SlideVideoPlayer = function (ns) {
+  return class extends ns.Widgets.Widget {
+    constructor(player, config) {
+      //IriSP.loadCss(IriSP.getLib("cssSplitter"));
+      super(player, config);
+    }
 
-IriSP.Widgets.SlideVideoPlayer.prototype.defaults = {
-    playerModule: "HtmlPlayer",
-    // mode is either "sidebyside" or "pip"
-    mode: "sidebyside"
-};
+    static defaults = {
+      playerModule: "HtmlPlayer",
+      // mode is either "sidebyside" or "pip"
+      mode: "sidebyside",
+    };
 
-IriSP.Widgets.SlideVideoPlayer.prototype.template = '<div class="Ldt-SlideVideoPlayer">\
+    template =
+      '<div class="Ldt-SlideVideoPlayer">\
   <div class="Ldt-SlideVideoPlayer-slide Ldt-SlideVideoPlayer-panel">\
   </div>\
   <div class="Ldt-SlideVideoPlayer-video Ldt-SlideVideoPlayer-panel">\
   </div>\
 </div>';
 
-IriSP.Widgets.SlideVideoPlayer.prototype.draw = function() {
-    var _this = this;
+    draw() {
+      var _this = this;
 
-    _this.renderTemplate();
-    this.insertSubwidget(
+      _this.renderTemplate();
+      this.insertSubwidget(
         _this.$.find(".Ldt-SlideVideoPlayer-panel.Ldt-SlideVideoPlayer-slide"),
-            {
-                type: "ImageDisplay",
-                annotation_type: _this.annotation_type
-            },
-            "slide"
-        );
-    this.insertSubwidget(
+        {
+          type: "ImageDisplay",
+          annotation_type: _this.annotation_type,
+        },
+        "slide"
+      );
+      this.insertSubwidget(
         _this.$.find(".Ldt-SlideVideoPlayer-panel.Ldt-SlideVideoPlayer-video"),
-            {
-                type: _this.playerModule,
-                video: _this.video,
-                width: '100%',
-                url_transform: _this.url_transform
-            },
-            "player"
-    );
+        {
+          type: _this.playerModule,
+          video: _this.video,
+          width: "100%",
+          url_transform: _this.url_transform,
+        },
+        "player"
+      );
 
-    if (_this.mode == 'pip') {
-        _this.$.find(".Ldt-SlideVideoPlayer-panel").append('<div class="Ldt-SlideVideoPlayer-pip-menu"><div class="Ldt-SlideVideoPlayer-pip-menu-toggle"></div></div>');
-        _this.$.on("click", ".Ldt-SlideVideoPlayer-pip-menu-toggle", function () {
+      if (_this.mode == "pip") {
+        _this.$.find(".Ldt-SlideVideoPlayer-panel").append(
+          '<div class="Ldt-SlideVideoPlayer-pip-menu"><div class="Ldt-SlideVideoPlayer-pip-menu-toggle"></div></div>'
+        );
+        _this.$.on(
+          "click",
+          ".Ldt-SlideVideoPlayer-pip-menu-toggle",
+          function () {
             _this.toggleMainDisplay();
-        });
+          }
+        );
         window.setTimeout(function () {
-            _this.setMainDisplay('video');
+          _this.setMainDisplay("video");
         }, 1500);
-    } else {
+      } else {
         // Default : side by side
         // FIXME: this should be better implemented through a signal sent
         // when widgets are ready (and not just loaded)
         window.setTimeout(function () {
-            _this.$.find(".Ldt-SlideVideoPlayer").touchSplit({ orientation: (screen.height > screen.width) ? 'vertical' : 'horizontal',
-                                                               leftMin: 20,
-                                                               topMin: 20
-                                                             });
+          _this.$.find(".Ldt-SlideVideoPlayer").touchSplit({
+            orientation:
+              screen.height > screen.width ? "vertical" : "horizontal",
+            leftMin: 20,
+            topMin: 20,
+          });
         }, 1500);
+      }
     }
-};
 
-IriSP.Widgets.SlideVideoPlayer.prototype.toggleMainDisplay = function() {
-    if (this.$.find(".Ldt-SlideVideoPlayer-panel.Ldt-SlideVideoPlayer-video").hasClass("Ldt-SlideVideoPlayer-pip-main")) {
-        this.setMainDisplay('slides');
-    } else {
-        this.setMainDisplay('video');
+    toggleMainDisplay() {
+      if (
+        this.$.find(
+          ".Ldt-SlideVideoPlayer-panel.Ldt-SlideVideoPlayer-video"
+        ).hasClass("Ldt-SlideVideoPlayer-pip-main")
+      ) {
+        this.setMainDisplay("slides");
+      } else {
+        this.setMainDisplay("video");
+      }
     }
-};
 
-// Set main display (in case of a "switch" display mode)
-// main is either 'video' or 'slides'
-IriSP.Widgets.SlideVideoPlayer.prototype.setMainDisplay = function(video_or_slides) {
-    var main = this.$.find(".Ldt-SlideVideoPlayer-panel.Ldt-SlideVideoPlayer-video");
-    var pip = this.$.find(".Ldt-SlideVideoPlayer-panel.Ldt-SlideVideoPlayer-slide");
-    if (video_or_slides == 'slides') {
+    // Set main display (in case of a "switch" display mode)
+    // main is either 'video' or 'slides'
+    setMainDisplay(video_or_slides) {
+      var main = this.$.find(
+        ".Ldt-SlideVideoPlayer-panel.Ldt-SlideVideoPlayer-video"
+      );
+      var pip = this.$.find(
+        ".Ldt-SlideVideoPlayer-panel.Ldt-SlideVideoPlayer-slide"
+      );
+      if (video_or_slides == "slides") {
         var temp = main;
         main = pip;
         pip = temp;
-    };
-    main.removeClass('Ldt-SlideVideoPlayer-pip-pip').addClass('Ldt-SlideVideoPlayer-pip-main');
-    pip.removeClass('Ldt-SlideVideoPlayer-pip-main').addClass('Ldt-SlideVideoPlayer-pip-pip');
-}
+      }
+      main
+        .removeClass("Ldt-SlideVideoPlayer-pip-pip")
+        .addClass("Ldt-SlideVideoPlayer-pip-main");
+      pip
+        .removeClass("Ldt-SlideVideoPlayer-pip-main")
+        .addClass("Ldt-SlideVideoPlayer-pip-pip");
+    }
+  };
+};
+
+export { SlideVideoPlayer, slideVideoPlayerStyles };
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/widgets/SlideVideoPlayer.module.css	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,56 @@
+.Ldt-SlideVideoPlayer-panel {
+    display: -webkit-flex;
+    display: flex;
+    width: 50%;
+    float: left;
+}
+
+.Ldt-SlideVideoPlayer {
+    width: 100%;
+    max-width: 100%;
+    height: 100%;
+    max-height: 100%;
+}
+
+.Ldt-SlideVideoPlayer-pip-main {
+    position: relative;
+    width: 100%;
+    height: 100%;
+    top: 0px;
+    left: 0px;
+    right: 0px;
+    bottom: 0px;
+    z-index: 1;
+}
+
+.Ldt-SlideVideoPlayer-pip-pip {
+    position: absolute;
+    width: 30%;
+    height: 30%;
+    right: 2px;
+    bottom: 2px;
+    z-index: 3;
+}
+
+.Ldt-SlideVideoPlayer h2 {
+    display: none;
+}
+.Ldt-SlideVideoPlayer-pip-menu {
+    position: absolute;
+    top: 0px;
+    right: 0px;
+    z-index: 10;
+    display: none;
+}
+.Ldt-SlideVideoPlayer-pip-pip:hover .Ldt-SlideVideoPlayer-pip-menu {
+    background-color: #000;
+    opacity: .5;
+    display: inline-block;
+}
+
+.Ldt-SlideVideoPlayer-pip-menu-toggle {
+    width: 18px;
+    height: 18px;
+    cursor: pointer;
+    background-image: url(img/pip_toggle.svg);
+}
--- a/src/widgets/Slider.css	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,38 +0,0 @@
-/* Slider Widget */
-
-.Ldt-Slider {
-    border: none;
-    border-radius: 0;
-    padding: 0;
-    margin: 0;
-    background: #B6B8B8;
-}
-
-.Ldt-Slider .ui-slider-handle {
-    border-radius: 8px;
-    top: -2px;
-    background: #fc00ff;
-    border: 1px solid #ffffff;
-}
-
-.Ldt-Slider .ui-slider-range {
-    background: #747474;
-}
-
-.Ldt-Slider-Time {
-    position: absolute;
-    bottom: 32px;
-    background: #ffffc0;
-    color: #000000;
-    border-radius: 3px;
-    z-index: 8;
-    font-size: 10px;
-    width: 34px;
-    border: 1px solid #999999;
-    padding: 1px;
-    margin-left: -20px;
-    display: none;
-    text-align: center;
-    font-weight: bold;
-    pointer-events: none;
-}
--- a/src/widgets/Slider.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/widgets/Slider.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,133 +1,139 @@
 /*
  The Slider Widget fits right under the video
  */
-
-IriSP.Widgets.Slider = function(player, config) {
-    IriSP.Widgets.Widget.call(this, player, config);
-};
-
-IriSP.Widgets.Slider.prototype = new IriSP.Widgets.Widget();
+import sliderStyles from "./Slider.module.css";
+import jQuery from "jquery";
 
-IriSP.Widgets.Slider.prototype.defaults = {
-    minimized_height : 4,
-    maximized_height : 4,
-    minimize_timeout : 1500 /*  time before minimizing slider after mouseout,
-                                set to zero for fixed slider */
-};
+const Slider = function (ns) {
+  return class extends ns.Widgets.Widget {
+    constructor(player, config) {
+      super(player, config);
+    }
 
-IriSP.Widgets.Slider.prototype.template =
-    '<div class="Ldt-Slider"></div><div class="Ldt-Slider-Time">00:00</div>';
+    static defaults = {
+      minimized_height: 4,
+      maximized_height: 4,
+      minimize_timeout: 1500 /*  time before minimizing slider after mouseout,
+                                set to zero for fixed slider */,
+    };
 
-IriSP.Widgets.Slider.prototype.draw = function() {
-
-    this.renderTemplate();
+    static template =
+      '<div class="Ldt-Slider"></div><div class="Ldt-Slider-Time">00:00</div>';
 
-    this.$time = this.$.find(".Ldt-Slider-Time");
+    draw() {
+      this.renderTemplate();
 
-    this.$slider = this.$.find(".Ldt-Slider");
+      this.$time = this.$.find(".Ldt-Slider-Time");
 
-    var _this = this;
+      this.$slider = this.$.find(".Ldt-Slider");
 
-    this.$slider.slider({
+      var _this = this;
+
+      this.$slider.slider({
         range: "min",
         value: 0,
         min: 0,
         max: this.source.getDuration().milliseconds,
-        slide: function(event, ui) {
-            _this.media.setCurrentTime(ui.value);
-            _this.player.trigger("Mediafragment.setHashToTime");
-        }
-    });
+        slide: function (event, ui) {
+          _this.media.setCurrentTime(ui.value);
+          _this.player.trigger("Mediafragment.setHashToTime");
+        },
+      });
 
-    this.$handle = this.$slider.find('.ui-slider-handle');
+      this.$handle = this.$slider.find(".ui-slider-handle");
 
-    this.onMediaEvent("timeupdate","onTimeupdate");
-    this.onMdpEvent("Player.MouseOver","onMouseover");
-    this.onMdpEvent("Player.MouseOut","onMouseout");
+      this.onMediaEvent("timeupdate", "onTimeupdate");
+      this.onMdpEvent("Player.MouseOver", "onMouseover");
+      this.onMdpEvent("Player.MouseOut", "onMouseout");
 
-    if (this.minimize_timeout) {
+      if (this.minimize_timeout) {
         this.$slider.css(this.calculateSliderCss(this.minimized_height));
         this.$handle.css(this.calculateHandleCss(this.minimized_height));
 
         this.maximized = false;
         this.timeoutId = false;
-    }
+      }
 
-    this.$slider
-        .mouseover(function() {
-            _this.$time.show();
-            _this.onMouseover();
+      this.$slider
+        .mouseover(function () {
+          _this.$time.show();
+          _this.onMouseover();
         })
         .mouseout(this.functionWrapper("onMouseout"))
-        .mousemove(function(_e) {
-            var _x = _e.pageX - _this.$.offset().left,
-                _t = new IriSP.Model.Time(_this.media.duration * _x / _this.width);
-            _this.$time.text(_t.toString()).css("left",_x);
+        .mousemove(function (_e) {
+          var _x = _e.pageX - _this.$.offset().left,
+            _t = new ns.Model.Time((_this.media.duration * _x) / _this.width);
+          _this.$time.text(_t.toString()).css("left", _x);
         });
-};
+    }
 
-IriSP.Widgets.Slider.prototype.onTimeupdate = function(_time) {
-    this.$slider.slider("value",_time);
-    this.player.trigger("Arrow.updatePosition",{widget: this.type, time: _time});
-};
+    onTimeupdate(_time) {
+      this.$slider.slider("value", _time);
+      this.player.trigger("Arrow.updatePosition", {
+        widget: this.type,
+        time: _time,
+      });
+    }
 
-IriSP.Widgets.Slider.prototype.onMouseover = function() {
-    if (this.minimize_timeout) {
+    onMouseover() {
+      if (this.minimize_timeout) {
         if (this.timeoutId) {
-            window.clearTimeout(this.timeoutId);
-            this.timeoutId = false;
+          window.clearTimeout(this.timeoutId);
+          this.timeoutId = false;
         }
         if (!this.maximized) {
-           this.animateToHeight(this.maximized_height);
-           this.maximized = true;
+          this.animateToHeight(this.maximized_height);
+          this.maximized = true;
+        }
+      }
+    }
+
+    onMouseout() {
+      this.$time.hide();
+      if (this.minimize_timeout) {
+        if (this.timeoutId) {
+          window.clearTimeout(this.timeoutId);
+          this.timeoutId = false;
         }
+        var _this = this;
+        this.timeoutId = window.setTimeout(function () {
+          if (_this.maximized) {
+            _this.animateToHeight(_this.minimized_height);
+            _this.maximized = false;
+          }
+          _this.timeoutId = false;
+        }, this.minimize_timeout);
+      }
     }
+
+    animateToHeight(_height) {
+      this.$slider
+        .stop()
+        .animate(this.calculateSliderCss(_height), 500, function () {
+          jQuery(this).css("overflow", "visible");
+        });
+      this.$handle
+        .stop()
+        .animate(this.calculateHandleCss(_height), 500, function () {
+          jQuery(this).css("overflow", "visible");
+        });
+    }
+
+    calculateSliderCss(_size) {
+      return {
+        height: _size + "px",
+        "margin-top": this.minimized_height - _size + "px",
+      };
+    }
+
+    calculateHandleCss = function (_size) {
+      return {
+        height: 2 + _size + "px",
+        width: 2 + _size + "px",
+        "margin-left": -Math.ceil(2 + _size / 2) + "px",
+      };
+    };
+  };
 };
 
-IriSP.Widgets.Slider.prototype.onMouseout = function() {
-    this.$time.hide();
-    if (this.minimize_timeout) {
-        if (this.timeoutId) {
-            window.clearTimeout(this.timeoutId);
-            this.timeoutId = false;
-        }
-        var _this = this;
-        this.timeoutId = window.setTimeout(function() {
-            if (_this.maximized) {
-                _this.animateToHeight(_this.minimized_height);
-                _this.maximized = false;
-            }
-            _this.timeoutId = false;
-        }, this.minimize_timeout);
-    }
-};
-
-IriSP.Widgets.Slider.prototype.animateToHeight = function(_height) {
-    this.$slider.stop().animate(
-        this.calculateSliderCss(_height),
-        500,
-        function() {
-            IriSP.jQuery(this).css("overflow","visible");
-        });
-    this.$handle.stop().animate(
-        this.calculateHandleCss(_height),
-        500,
-        function() {
-            IriSP.jQuery(this).css("overflow","visible");
-        });
-};
-
-IriSP.Widgets.Slider.prototype.calculateSliderCss = function(_size) {
-    return {
-        height: _size + "px",
-        "margin-top": (this.minimized_height - _size) + "px"
-    };
-};
-
-IriSP.Widgets.Slider.prototype.calculateHandleCss = function(_size) {
-    return {
-        height: (2 + _size) + "px",
-        width: (2 + _size) + "px",
-        "margin-left": -Math.ceil(2 + _size / 2) + "px"
-    };
-};
+export { Slider, sliderStyles };
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/widgets/Slider.module.css	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,38 @@
+/* Slider Widget */
+
+.Ldt-Slider {
+    border: none;
+    border-radius: 0;
+    padding: 0;
+    margin: 0;
+    background: #B6B8B8;
+}
+
+.Ldt-Slider .ui-slider-handle {
+    border-radius: 8px;
+    top: -2px;
+    background: #fc00ff;
+    border: 1px solid #ffffff;
+}
+
+.Ldt-Slider .ui-slider-range {
+    background: #747474;
+}
+
+.Ldt-Slider-Time {
+    position: absolute;
+    bottom: 32px;
+    background: #ffffc0;
+    color: #000000;
+    border-radius: 3px;
+    z-index: 8;
+    font-size: 10px;
+    width: 34px;
+    border: 1px solid #999999;
+    padding: 1px;
+    margin-left: -20px;
+    display: none;
+    text-align: center;
+    font-weight: bold;
+    pointer-events: none;
+}
--- a/src/widgets/Slideshare.css	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-/* Slideshare widget */
-
--- a/src/widgets/Slideshare.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/widgets/Slideshare.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,17 +1,19 @@
 /* TODO: Add Slide synchronization */
+import slideshareStyles from "./Slideshare.module.css";
+import jQuery from "jquery";
 
-IriSP.Widgets.Slideshare = function(player, config) {
-    IriSP.Widgets.Widget.call(this, player, config);
+const Slideshare = function(ns) {
+    return class extends ns.Widgets.Widget {
+        constructor(player, config) {
+    super(player, config);
 };
 
-IriSP.Widgets.Slideshare.prototype = new IriSP.Widgets.Widget();
-
-IriSP.Widgets.Slideshare.prototype.defaults = {
+static defaults = {
     annotation_type: "slide",
     sync: true,
 };
 
-IriSP.Widgets.Slideshare.prototype.messages = {
+static messages =  {
     fr: {
         slides_ : "Diapositives"
     },
@@ -20,10 +22,10 @@
     }
 };
 
-IriSP.Widgets.Slideshare.prototype.template =
+static template =
     '<div class="Ldt-SlideShare"><h2>{{l10n.slides_}}</h2><hr /><div class="Ldt-SlideShare-Container"></div></div>';
 
-IriSP.Widgets.Slideshare.prototype.draw = function() {
+draw() {
     
     function insertSlideshare(_presentation, _slide) {
         if (_lastEmbedded === _presentation) {
@@ -32,7 +34,7 @@
             }
         } else {
             _lastEmbedded = _presentation;
-            var _id = IriSP.Model.getUID(),
+            var _id = ns.Model.getUID(),
                 _params = {
                     allowScriptAccess: "always"
                 },
@@ -92,7 +94,7 @@
                             var _ajaxUrl = "http://www.slideshare.net/api/oembed/1?url="
                                 + encodeURIComponent(_presentation)
                                 + "&format=jsonp&callback=?";
-                            IriSP.jQuery.getJSON(_ajaxUrl, function(_oembedData) {
+                            jQuery.getJSON(_ajaxUrl, function(_oembedData) {
                                 var _presmatch = _oembedData.html.match(/doc=([a-z0-9\-_%]+)/i);
                                 if (_presmatch && _presmatch.length > 1) {
                                     _oembedCache[_presentation] =  _presmatch[1];
@@ -115,3 +117,6 @@
         });
     }
 };
+    }}
+
+export { Slideshare, slideshareStyles };
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/widgets/Slideshare.module.css	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,2 @@
+/* Slideshare widget */
+
--- a/src/widgets/Social.css	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,78 +0,0 @@
-.Ldt-Social a {
-    display: inline-block; width: 24px; height: 24px; margin: 2px 0 0 2px; background: url(img/socialbuttons.png);
-}
-
-.Ldt-Social-Url-Container {
-    display: inline-block; width: 24px; height: 24px; margin: 2px 0 0 2px; position: relative;
-}
-
-a.Ldt-Social-Url {
-    margin: 0; background-position: -96px 0;
-}
-
-a.Ldt-Social-Url:hover {
-    background-position: -96px -24px;
-}
-
-.Ldt-Social-UrlPop {
-    position: absolute; left: 20px; top: -2px; background: url(img/socialcopy.png);
-    padding: 3px 0 0 12px; width: 218px; height: 27px;
-    display: none;
-}
-
-.Ldt-Social-Input, .Ldt-Social-CopyBtn {
-    font-size: 11px; margin: 1px; border: 1px solid #ccc; height: 16px;
-    padding: 1px; border-radius: 2px; display: inline-block;
-}
-
-.Ldt-Social-Input:hover, .Ldt-Social-CopyBtn.hover {
-    border-color: #8080ff;
-}
-
-.Ldt-Social-Input {
-    width: 200px;
-}
-
-.Ldt-Social-CopyBtn {
-    font-weight: bold; width: 50px; text-align: center; background: #f0f0ff;
-}
-
-.Ldt-Social-CopyBtn.hover {
-    background: #ffe0a0;
-}
-
-.Ldt-Social-CopyBtn.active {
-    background: #ff8000;
-}
-
-a.Ldt-Social-Twitter {
-    background-position: 0 0;
-}
-
-a.Ldt-Social-Twitter:hover {
-    background-position: 0 -24px;
-}
-
-a.Ldt-Social-Fb {
-    background-position: -24px 0;
-}
-
-a.Ldt-Social-Fb:hover {
-    background-position: -24px -24px;
-}
-
-a.Ldt-Social-Gplus {
-    background-position: -48px 0;
-}
-
-a.Ldt-Social-Gplus:hover {
-    background-position: -48px -24px;
-}
-
-a.Ldt-Social-Mail {
-    background-position: -72px 0;
-}
-
-a.Ldt-Social-Mail:hover {
-    background-position: -72px -24px;
-}
\ No newline at end of file
--- a/src/widgets/Social.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/widgets/Social.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,80 +1,106 @@
 // TODO: Open share links in a small window
+import _ from "lodash";
+import jQuery from "jquery";
+
+import socialStyles from "./Social.module.css";
 
-IriSP.Widgets.Social = function(player, config) {
-    IriSP.Widgets.Widget.call(this, player, config);
-};
-
-IriSP.Widgets.Social.prototype = new IriSP.Widgets.Widget();
+const Social = function (ns) {
+  return class extends ns.Widgets.Widget {
+    constructor(player, config) {
+      super(player, config);
+    }
 
-IriSP.Widgets.Social.prototype.defaults = {
-    text: "",
-    url: "",
-    show_url: true,
-    show_twitter: true,
-    show_fb: true,
-    show_gplus: true,
-    show_mail: true
-};
+    static defaults = {
+      text: "",
+      url: "",
+      show_url: true,
+      show_twitter: true,
+      show_fb: true,
+      show_gplus: true,
+      show_mail: true,
+    };
 
-IriSP.Widgets.Social.prototype.template =
-    '<span class="Ldt-Social">{{#show_url}}<div class="Ldt-Social-Url-Container"><a href="#" draggable="true" target="_blank" class="Ldt-Social-Square Ldt-Social-Url Ldt-TraceMe" title="{{l10n.share_link}}">'
-    + '</a><div class="Ldt-Social-UrlPop"><input class="Ldt-Social-Input"/></div></div>{{/show_url}}'
-    + '{{#show_fb}}<a href="#" target="_blank" class="Ldt-Social-Fb Ldt-Social-Ext Ldt-TraceMe" title="{{l10n.share_on}} Facebook"></a>{{/show_fb}}'
-    + '{{#show_twitter}}<a href="#" target="_blank" class="Ldt-Social-Twitter Ldt-Social-Ext Ldt-TraceMe" title="{{l10n.share_on}} Twitter"></a>{{/show_twitter}}'
-    + '{{#show_gplus}}<a href="#" target="_blank" class="Ldt-Social-Gplus Ldt-Social-Ext Ldt-TraceMe" title="{{l10n.share_on}} Google+"></a>{{/show_gplus}}'
-    + '{{#show_mail}}<a href="#" target="_blank" class="Ldt-Social-Mail Ldt-TraceMe" title="{{l10n.share_mail}}"></a>{{/show_mail}}</span>';
+    static template =
+      '<span class="Ldt-Social">{{#show_url}}<div class="Ldt-Social-Url-Container"><a href="#" draggable="true" target="_blank" class="Ldt-Social-Square Ldt-Social-Url Ldt-TraceMe" title="{{l10n.share_link}}">' +
+      '</a><div class="Ldt-Social-UrlPop"><input class="Ldt-Social-Input"/></div></div>{{/show_url}}' +
+      '{{#show_fb}}<a href="#" target="_blank" class="Ldt-Social-Fb Ldt-Social-Ext Ldt-TraceMe" title="{{l10n.share_on}} Facebook"></a>{{/show_fb}}' +
+      '{{#show_twitter}}<a href="#" target="_blank" class="Ldt-Social-Twitter Ldt-Social-Ext Ldt-TraceMe" title="{{l10n.share_on}} Twitter"></a>{{/show_twitter}}' +
+      '{{#show_gplus}}<a href="#" target="_blank" class="Ldt-Social-Gplus Ldt-Social-Ext Ldt-TraceMe" title="{{l10n.share_on}} Google+"></a>{{/show_gplus}}' +
+      '{{#show_mail}}<a href="#" target="_blank" class="Ldt-Social-Mail Ldt-TraceMe" title="{{l10n.share_mail}}"></a>{{/show_mail}}</span>';
 
-IriSP.Widgets.Social.prototype.messages = {
-    "fr": {
+    static messages =  {
+      fr: {
         share_on: "Partager sur",
         share_mail: "Envoyer par courriel",
         share_link: "Partager le lien hypertexte",
-        copy: "Copier"
-    },
-    "en" : {
+        copy: "Copier",
+      },
+      en: {
         share_on: "Share on",
         share_mail: "Share by e-mail",
         share_link: "Share hypertext link",
-        copy: "Copy"
+        copy: "Copy",
+      },
+    };
+
+    draw() {
+      this.renderTemplate();
+      this.clipId = _.uniqueId("Ldt-Social-CopyBtn-");
+      this.$.find(".Ldt-Social-CopyBtn").attr("id", this.clipId);
+      var _this = this;
+      this.$.find(".Ldt-Social-Url")
+        .click(function () {
+          _this.toggleCopy();
+          return false;
+        })
+        .on("dragstart", function (e) {
+          e.originalEvent.dataTransfer.setData("text/x-iri-title", _this.text);
+          e.originalEvent.dataTransfer.setData("text/x-iri-uri", _this.url);
+        });
+      this.$.find(".Ldt-Social-Input").focus(function () {
+        this.select();
+      });
+      this.$.find(".Ldt-Social-Ext").click(function () {
+        window.open(
+          jQuery(this).attr("href"),
+          "_blank",
+          "height=300,width=450,left=100,top=100,toolbar=0,menubar=0,status=0,location=0"
+        );
+        return false;
+      });
+      this.updateUrls(this.url, this.text);
     }
+
+    toggleCopy() {
+      var _pop = this.$.find(".Ldt-Social-UrlPop");
+      _pop.toggle();
+      this.$.find(".Ldt-Social-Input").val(this.url).focus();
+    }
+
+    updateUrls(_url, _text) {
+      this.url = _url;
+      this.text = _text;
+      this.$.find(".Ldt-Social-Fb").attr(
+        "href",
+        "http://www.facebook.com/share.php?" +
+          jQuery.param({ u: _url, t: _text })
+      );
+      this.$.find(".Ldt-Social-Twitter").attr(
+        "href",
+        "https://twitter.com/intent/tweet?" +
+          jQuery.param({ url: _url, text: _text })
+      );
+      this.$.find(".Ldt-Social-Gplus").attr(
+        "href",
+        "https://plus.google.com/share?" +
+          jQuery.param({ url: _url, title: _text })
+      );
+      this.$.find(".Ldt-Social-Mail").attr(
+        "href",
+        "mailto:?" + jQuery.param({ subject: _text, body: _text + ": " + _url })
+      );
+    }
+  };
 };
 
-IriSP.Widgets.Social.prototype.draw = function() {
-    this.renderTemplate();
-    this.clipId = IriSP._.uniqueId("Ldt-Social-CopyBtn-");
-    this.$.find(".Ldt-Social-CopyBtn").attr("id", this.clipId);
-    var _this = this;
-    this.$.find(".Ldt-Social-Url").click(function() {
-        _this.toggleCopy();
-        return false;
-    }).on("dragstart", function(e) {
-    	e.originalEvent.dataTransfer.setData("text/x-iri-title",_this.text);
-    	e.originalEvent.dataTransfer.setData("text/x-iri-uri",_this.url);
-    });
-    this.$.find(".Ldt-Social-Input").focus(function() {
-        this.select();
-    });
-    this.$.find(".Ldt-Social-Ext").click(function() {
-        window.open(
-            IriSP.jQuery(this).attr("href"),
-            "_blank",
-            "height=300,width=450,left=100,top=100,toolbar=0,menubar=0,status=0,location=0");
-        return false;
-    });
-    this.updateUrls(this.url, this.text);
-};
-
-IriSP.Widgets.Social.prototype.toggleCopy = function() {
-    var _pop = this.$.find(".Ldt-Social-UrlPop");
-    _pop.toggle();
-    this.$.find(".Ldt-Social-Input").val(this.url).focus();
-};
-
-IriSP.Widgets.Social.prototype.updateUrls = function(_url, _text) {
-    this.url = _url;
-    this.text = _text;
-    this.$.find(".Ldt-Social-Fb").attr("href", "http://www.facebook.com/share.php?" + IriSP.jQuery.param({ u: _url, t: _text }));
-    this.$.find(".Ldt-Social-Twitter").attr("href", "https://twitter.com/intent/tweet?" + IriSP.jQuery.param({ url: _url, text: _text }));
-    this.$.find(".Ldt-Social-Gplus").attr("href", "https://plus.google.com/share?" + IriSP.jQuery.param({ url: _url, title: _text }));
-    this.$.find(".Ldt-Social-Mail").attr("href", "mailto:?" + IriSP.jQuery.param({ subject: _text, body: _text + ": " + _url }));
-};
+export { Social, socialStyles };
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/widgets/Social.module.css	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,78 @@
+.Ldt-Social a {
+    display: inline-block; width: 24px; height: 24px; margin: 2px 0 0 2px; background: url(img/socialbuttons.png);
+}
+
+.Ldt-Social-Url-Container {
+    display: inline-block; width: 24px; height: 24px; margin: 2px 0 0 2px; position: relative;
+}
+
+a.Ldt-Social-Url {
+    margin: 0; background-position: -96px 0;
+}
+
+a.Ldt-Social-Url:hover {
+    background-position: -96px -24px;
+}
+
+.Ldt-Social-UrlPop {
+    position: absolute; left: 20px; top: -2px; background: url(img/socialcopy.png);
+    padding: 3px 0 0 12px; width: 218px; height: 27px;
+    display: none;
+}
+
+.Ldt-Social-Input, .Ldt-Social-CopyBtn {
+    font-size: 11px; margin: 1px; border: 1px solid #ccc; height: 16px;
+    padding: 1px; border-radius: 2px; display: inline-block;
+}
+
+.Ldt-Social-Input:hover, .Ldt-Social-CopyBtn.hover {
+    border-color: #8080ff;
+}
+
+.Ldt-Social-Input {
+    width: 200px;
+}
+
+.Ldt-Social-CopyBtn {
+    font-weight: bold; width: 50px; text-align: center; background: #f0f0ff;
+}
+
+.Ldt-Social-CopyBtn.hover {
+    background: #ffe0a0;
+}
+
+.Ldt-Social-CopyBtn.active {
+    background: #ff8000;
+}
+
+a.Ldt-Social-Twitter {
+    background-position: 0 0;
+}
+
+a.Ldt-Social-Twitter:hover {
+    background-position: 0 -24px;
+}
+
+a.Ldt-Social-Fb {
+    background-position: -24px 0;
+}
+
+a.Ldt-Social-Fb:hover {
+    background-position: -24px -24px;
+}
+
+a.Ldt-Social-Gplus {
+    background-position: -48px 0;
+}
+
+a.Ldt-Social-Gplus:hover {
+    background-position: -48px -24px;
+}
+
+a.Ldt-Social-Mail {
+    background-position: -72px 0;
+}
+
+a.Ldt-Social-Mail:hover {
+    background-position: -72px -24px;
+}
\ No newline at end of file
--- a/src/widgets/Sparkline.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/widgets/Sparkline.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,91 +1,121 @@
-IriSP.Widgets.Sparkline = function(player, config) {
-    IriSP.Widgets.Widget.call(this, player, config);
-};
+import _ from "lodash";
+import Raphael from "raphael";
 
-IriSP.Widgets.Sparkline.prototype = new IriSP.Widgets.Widget();
+const Sparkline = function (ns) {
+  return class extends ns.Widgets.Widget {
+    constructor(player, config) {
+      super(player, config);
+    }
 
-IriSP.Widgets.Sparkline.prototype.defaults = {
-   lineColor : "#7492b4",
-   fillColor : "#aeaeb8",
-   lineWidth : 2,
-   slice_count : 20,
-   height : 50,
-   margin : 5
-};
+    static defaults = {
+      lineColor: "#7492b4",
+      fillColor: "#aeaeb8",
+      lineWidth: 2,
+      slice_count: 20,
+      height: 50,
+      margin: 5,
+    };
 
-IriSP.Widgets.Sparkline.prototype.draw = function() {
-    var _slices = [],
+    draw() {
+      var _slices = [],
         _duration = this.source.getDuration(),
         _max = 0,
         _list = this.getWidgetAnnotations();
-    for (var _i = 0; _i < this.slice_count; _i++) {
-        var _begin = (_i*_duration/this.slice_count),
-            _end = ((_i+1)*_duration/this.slice_count),
-            _volume = 0;
-            _list.forEach(function(_annotation) {
-                if (_annotation.begin < _end && _annotation.end >= _begin) {
-                    var _d = _annotation.getDuration().milliseconds;
-                    if (!_d) {
-                        _volume += 1;
-                    } else {
-                        _volume += (Math.min(_annotation.end, _end) - Math.max(_annotation.begin, _begin)) / _d;
-                    }
-                }
-            });
-            _max = Math.max(_max, _volume);
+      for (var _i = 0; _i < this.slice_count; _i++) {
+        var _begin = (_i * _duration) / this.slice_count,
+          _end = ((_i + 1) * _duration) / this.slice_count,
+          _volume = 0;
+        _list.forEach(function (_annotation) {
+          if (_annotation.begin < _end && _annotation.end >= _begin) {
+            var _d = _annotation.getDuration().milliseconds;
+            if (!_d) {
+              _volume += 1;
+            } else {
+              _volume +=
+                (Math.min(_annotation.end, _end) -
+                  Math.max(_annotation.begin, _begin)) /
+                _d;
+            }
+          }
+        });
+        _max = Math.max(_max, _volume);
         _slices.push(_volume);
-    }
-    if (!_max) {
+      }
+      if (!_max) {
         return;
-    }
-    this.paper = new Raphael(this.$[0], this.width, this.height);
-    var _scale = (this.height - this.margin) / _max,
+      }
+      this.paper = new Raphael(this.$[0], this.width, this.height);
+      var _scale = (this.height - this.margin) / _max,
         _width = this.width / this.slice_count,
         _this = this,
-        _y = IriSP._(_slices).map(function(_v) {
-            return _this.margin + _this.height - (_scale * _v);
-        }),
-        _d = IriSP._(_y).reduce(function(_memo, _v, _k) {
-               return _memo + ( _k
-                   ? 'C' + (_k * _width) + ' ' + _y[_k - 1] + ' ' + (_k * _width) + ' ' + _v + ' ' + ((_k + .5) * _width) + ' ' + _v
-                   : 'M0 ' + _v + 'L' + (.5*_width) + ' ' + _v );
-            },'') + 'L' + this.width + ' ' + _y[_y.length - 1],
-        _d2 = _d + 'L' + this.width + ' ' + this.height + 'L0 ' + this.height;
-    
-    this.paper.path(_d2).attr({
-        "stroke" : "none",
-        "fill" : this.fillColor
-    });
-         
-    this.paper.path(_d).attr({
-        "fill" : "none",
-        "stroke" : this.lineColor,
-        "stroke-width" : this.lineWidth
-    });
-    
-    this.rectangleProgress = this.paper.rect(0,0,0,this.height)
-        .attr({
-            "stroke" : "none",
-            "fill" : "#808080",
-            "opacity" : .3
-        });
-        
-    this.ligneProgress = this.paper.path("M0 0L0 "+this.height).attr({"stroke":"#ff00ff", "line-width" : 2});
-   
-    this.$.click(function(_e) {
+        _y = _(_slices).map(function (_v) {
+          return _this.margin + _this.height - _scale * _v;
+        }).value(),
+        _d =
+          _(_y).reduce(function (_memo, _v, _k) {
+            return (
+              _memo +
+              (_k
+                ? "C" +
+                  _k * _width +
+                  " " +
+                  _y[_k - 1] +
+                  " " +
+                  _k * _width +
+                  " " +
+                  _v +
+                  " " +
+                  (_k + 0.5) * _width +
+                  " " +
+                  _v
+                : "M0 " + _v + "L" + 0.5 * _width + " " + _v)
+            );
+          }, "") +
+          "L" +
+          this.width +
+          " " +
+          _y[_y.length - 1],
+        _d2 = _d + "L" + this.width + " " + this.height + "L0 " + this.height;
+
+      this.paper.path(_d2).attr({
+        stroke: "none",
+        fill: this.fillColor,
+      });
+
+      this.paper.path(_d).attr({
+        fill: "none",
+        stroke: this.lineColor,
+        "stroke-width": this.lineWidth,
+      });
+
+      this.rectangleProgress = this.paper.rect(0, 0, 0, this.height).attr({
+        stroke: "none",
+        fill: "#808080",
+        opacity: 0.3,
+      });
+
+      this.ligneProgress = this.paper
+        .path("M0 0L0 " + this.height)
+        .attr({ stroke: "#ff00ff", "line-width": 2 });
+
+      this.$.click(function (_e) {
         var _x = _e.pageX - _this.$.offset().left;
-        _this.media.setCurrentTime(_this.media.duration * _x / _this.width);
-    });
-    
-    this.onMediaEvent("timeupdate","onTimeupdate");
+        _this.media.setCurrentTime((_this.media.duration * _x) / _this.width);
+      });
+
+      this.onMediaEvent("timeupdate", "onTimeupdate");
+    }
+
+    onTimeupdate(_time) {
+      var _x = Math.floor((this.width * _time) / this.media.duration);
+      this.rectangleProgress.attr({
+        width: _x,
+      });
+      this.ligneProgress.attr({
+        path: "M" + _x + " 0L" + _x + " " + this.height,
+      });
+    }
+  };
 };
 
-IriSP.Widgets.Sparkline.prototype.onTimeupdate = function(_time) {
-    var _x = Math.floor( this.width * _time / this.media.duration);
-    this.rectangleProgress.attr({
-        "width" : _x
-    });
-    this.ligneProgress.attr({
-        "path" : "M" + _x + " 0L" + _x + " " + this.height
-    });
-};
+export { Sparkline };
--- a/src/widgets/SpelSyncHtml.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/widgets/SpelSyncHtml.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,18 +1,18 @@
-IriSP.Widgets.SpelSyncHtml = function(player, config) {
+const SpelSyncHtml = function(ns) {
+    return class extends ns.Widgets.Widget {
+        constructor(player, config) {
+            super(player, config);
     console.log("Calling IriSP.Widget's constructor from IriSP.HelloWorldWidget");
-    IriSP.Widgets.Widget.call(this, player, config);
 };
 
-IriSP.Widgets.SpelSyncHtml.prototype = new IriSP.Widgets.Widget();
-
-IriSP.Widgets.SpelSyncHtml.prototype.defaults = {
+static defaults = {
     src: "about:blank"
 };
 
-IriSP.Widgets.SpelSyncHtml.prototype.template =
+static template =
     '<div class="Ldt-SpelSyncHtml"><iframe src="{{src}}" {{#width}}width="{{width}}"{{/width}} {{#height}}height="{{height}}"{{/height}}</div>';
 
-IriSP.Widgets.SpelSyncHtml.prototype.draw = function() {
+draw() {
     this.renderTemplate();
     var frame = this.$.find("iframe")[0],
         basesrc = this.src.replace(/#.*$/,'');
@@ -23,4 +23,7 @@
             }
         });
     });
-};
\ No newline at end of file
+};
+    }}
+
+export { SpelSyncHtml };
\ No newline at end of file
--- a/src/widgets/Tagcloud.css	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,31 +0,0 @@
-/*
- * 
- */
-.Ldt-Tagcloud-Container {
-    border: 1px solid #b7b7b7;
-    padding: 1px;
-    margin: 0;
-}
-
-ul.Ldt-Tagcloud-List {
-    background: url(img/pinstripe.png);
-    padding: 5px;
-    margin: 0;
-    list-style: none;
-    text-align: center;
-}
-
-li.Ldt-Tagcloud-item {
-    display: inline-block;
-    margin: 2px;
-    cursor: pointer;
-}
-
-li.Ldt-Tagcloud-item:hover {
-    color: #0099ff;
-}
-
-.Ldt-Tagcloud-active {
-    color: #c000c0;
-    padding: 0; margin: 0;
-}
\ No newline at end of file
--- a/src/widgets/Tagcloud.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/widgets/Tagcloud.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,143 +1,260 @@
-IriSP.Widgets.Tagcloud = function(player, config) {
-    IriSP.Widgets.Widget.call(this, player, config);
-    this.stopwords = IriSP._.uniq([].concat(this.custom_stopwords).concat(this.stopword_lists[this.stopword_language]));
-};
+import Mustache from "mustache";
+import _ from "lodash";
+
+import tagcloudStyles from "./Tagcloud.module.css";
 
-IriSP.Widgets.Tagcloud.prototype = new IriSP.Widgets.Widget();
-
-IriSP.Widgets.Tagcloud.prototype.template =
-    '<div class="Ldt-Tagcloud-Container"><ul class="Ldt-Tagcloud-List">'
-    + '{{#words}}<li class="Ldt-Tagcloud-item Ldt-TraceMe" trace-info="tag:{{word}}" content="{{word}}" style="font-size: {{size}}px">{{word}}</li>{{/words}}'
-    + '</ul></div>';
+const Tagcloud = function (ns) {
+  return class extends ns.Widgets.Widget {
+    constructor(player, config) {
+      super(player, config);
+      this.stopwords = _.uniq(
+        []
+          .concat(this.custom_stopwords)
+          .concat(this.stopword_lists[this.stopword_language])
+      );
+    }
 
-IriSP.Widgets.Tagcloud.prototype.defaults = {
-    include_titles: true,
-    include_descriptions: true,
-    include_tag_texts: true,
-    tag_count: 30,
-    stopword_language: "fr",
-    custom_stopwords: [],
-    exclude_pattern: false,
-    annotation_type: false,
-    segment_annotation_type: false,
-    min_font_size: 10,
-    max_font_size: 26,
-    min_count: 2,
-    remove_zero_duration: false
-};
+    static template =
+      '<div class="Ldt-Tagcloud-Container"><ul class="Ldt-Tagcloud-List">' +
+      '{{#words}}<li class="Ldt-Tagcloud-item Ldt-TraceMe" trace-info="tag:{{word}}" content="{{word}}" style="font-size: {{size}}px">{{word}}</li>{{/words}}' +
+      "</ul></div>";
+
+    static defaults = {
+      include_titles: true,
+      include_descriptions: true,
+      include_tag_texts: true,
+      tag_count: 30,
+      stopword_language: "fr",
+      custom_stopwords: [],
+      exclude_pattern: false,
+      annotation_type: false,
+      segment_annotation_type: false,
+      min_font_size: 10,
+      max_font_size: 26,
+      min_count: 2,
+      remove_zero_duration: false,
+    };
 
-IriSP.Widgets.Tagcloud.prototype.stopword_lists = {
-    "fr" : [
-        'aussi', 'avec', 'aux', 'bien', 'car', 'cette', 'comme', 'dans', 'des', 'donc', 'dont', 'elle', 'encore', 'entre', 'est',
-        'être', 'eux', 'faire', 'fait', 'http', 'ici', 'ils', 'les', 'leur', 'leurs', 'mais', 'mes', 'même', 'mon', 'notre',
-        'non', 'nos', 'nous', 'ont', 'par', 'pas', 'peu', 'peut', 'plus', 'pour', 'quand', 'que', 'qui', 'quoi', 'sans',
-        'ses' ,'son', 'sont', 'sur', 'tes', 'très', 'the', 'ton', 'tous', 'tout', 'une', 'votre', 'vos', 'vous'
-    ],
-    "en" : [
-        'about', 'again', 'are', 'and', 'because', 'being', 'but', 'can', 'done', 'have', 'for', 'from',
-        'get', 'here', 'http', 'like', 'more', 'one', 'our', 'she', 'that', 'the', 'their', 'then', 'there',
-        'they', 'this', 'very', 'what', 'when', 'where', 'who', 'why', 'will', 'with', 'www', 'you', 'your'
-    ]
-};
+    stopword_lists = {
+      fr: [
+        "aussi",
+        "avec",
+        "aux",
+        "bien",
+        "car",
+        "cette",
+        "comme",
+        "dans",
+        "des",
+        "donc",
+        "dont",
+        "elle",
+        "encore",
+        "entre",
+        "est",
+        "être",
+        "eux",
+        "faire",
+        "fait",
+        "http",
+        "ici",
+        "ils",
+        "les",
+        "leur",
+        "leurs",
+        "mais",
+        "mes",
+        "même",
+        "mon",
+        "notre",
+        "non",
+        "nos",
+        "nous",
+        "ont",
+        "par",
+        "pas",
+        "peu",
+        "peut",
+        "plus",
+        "pour",
+        "quand",
+        "que",
+        "qui",
+        "quoi",
+        "sans",
+        "ses",
+        "son",
+        "sont",
+        "sur",
+        "tes",
+        "très",
+        "the",
+        "ton",
+        "tous",
+        "tout",
+        "une",
+        "votre",
+        "vos",
+        "vous",
+      ],
+      en: [
+        "about",
+        "again",
+        "are",
+        "and",
+        "because",
+        "being",
+        "but",
+        "can",
+        "done",
+        "have",
+        "for",
+        "from",
+        "get",
+        "here",
+        "http",
+        "like",
+        "more",
+        "one",
+        "our",
+        "she",
+        "that",
+        "the",
+        "their",
+        "then",
+        "there",
+        "they",
+        "this",
+        "very",
+        "what",
+        "when",
+        "where",
+        "who",
+        "why",
+        "will",
+        "with",
+        "www",
+        "you",
+        "your",
+      ],
+    };
 
-IriSP.Widgets.Tagcloud.prototype.draw = function() {
-    
-    if (this.segment_annotation_type) {
+    draw() {
+      if (this.segment_annotation_type) {
         var _this = this;
-        this.source.getAnnotationsByTypeTitle(this.segment_annotation_type).forEach(function(_a) {
-            _a.on("enter", function() {
-                _this.redraw(_a.begin, _a.end);
+        this.source
+          .getAnnotationsByTypeTitle(this.segment_annotation_type)
+          .forEach(function (_a) {
+            _a.on("enter", function () {
+              _this.redraw(_a.begin, _a.end);
             });
-        });
-    } else {
+          });
+      } else {
         this.redraw();
+      }
     }
-};
 
-IriSP.Widgets.Tagcloud.prototype.redraw = function(_from, _to) {
-    var _urlRegExp = /https?:\/\/[0-9a-zA-Z\.%\/-_]+/g,
+    redraw(_from, _to) {
+      var _urlRegExp = /https?:\/\/[0-9a-zA-Z\.%\/-_]+/g,
         _words = {},
         _this = this,
         _annotations = this.getWidgetAnnotations();
-    
-    if(!this.include_titles && !this.include_descriptions){
-    	var _regexpword = /[^\.&;,'"!\?\d\(\)\+\[\]\\\…\-«»\/]{3,}/g;
-    }
-    else{
-    	var _regexpword = /[^\s\.&;,'"!\?\d\(\)\+\[\]\\\…\-«»:\/]{3,}/g;
-    }
-        
-    if (typeof _from !== "undefined" && typeof _to !== "undefined") {
-        _annotations = _annotations.filter(function(_annotation) {
-            return _annotation.begin >= _from && _annotation.end <= _to;
+
+      if (!this.include_titles && !this.include_descriptions) {
+        var _regexpword = /[^\.&;,'"!\?\d\(\)\+\[\]\\\…\-«»\/]{3,}/g;
+      } else {
+        var _regexpword = /[^\s\.&;,'"!\?\d\(\)\+\[\]\\\…\-«»:\/]{3,}/g;
+      }
+
+      if (typeof _from !== "undefined" && typeof _to !== "undefined") {
+        _annotations = _annotations.filter(function (_annotation) {
+          return _annotation.begin >= _from && _annotation.end <= _to;
+        });
+      }
+
+      if (this.remove_zero_duration) {
+        _annotations = _annotations.filter(function (_annotation) {
+          return _annotation.getDuration() > 0;
         });
-    }
-    
-    if(this.remove_zero_duration){
-    	_annotations = _annotations.filter(function(_annotation) {
-	        return _annotation.getDuration()>0;
-	    });
-    }
-    
-    _annotations.forEach(function(_annotation) {
-       var _txt =
-            (_this.include_titles ? _annotation.title : '')
-            + ' '
-            + (_this.include_descriptions ? _annotation.description : '')
-            + ' '
-            + (_this.include_tag_texts ? _annotation.getTagTexts() : '');
-       IriSP._(_txt.toLowerCase().replace(_urlRegExp, '').match(_regexpword)).each(function(_word) {
-    	   _word = _word.trim();
-           if (IriSP._(_this.stopwords).indexOf(_word) == -1 && (!_this.exclude_pattern || !_this.exclude_pattern.test(_word))) {
-               _words[_word] = 1 + (_words[_word] || 0);
-           }
-       });
-    });
-    _words = IriSP._(_words)
+      }
+
+      _annotations.forEach(function (_annotation) {
+        var _txt =
+          (_this.include_titles ? _annotation.title : "") +
+          " " +
+          (_this.include_descriptions ? _annotation.description : "") +
+          " " +
+          (_this.include_tag_texts ? _annotation.getTagTexts() : "");
+        _(_txt.toLowerCase().replace(_urlRegExp, "").match(_regexpword)).each(
+          function (_word) {
+            _word = _word.trim();
+            if (
+              _(_this.stopwords).indexOf(_word) == -1 &&
+              (!_this.exclude_pattern || !_this.exclude_pattern.test(_word))
+            ) {
+              _words[_word] = 1 + (_words[_word] || 0);
+            }
+          }
+        );
+      });
+      _words = _(_words)
         .chain()
-        .map(function(_v, _k) {
-            return {
-                "word" : _k,
-                "count" : _v
-            };
+        .map(function (_v, _k) {
+          return {
+            word: _k,
+            count: _v,
+          };
         })
-        .filter(function(_v) {
-            return _v.count > _this.min_count;
+        .filter(function (_v) {
+          return _v.count > _this.min_count;
         })
-        .sortBy(function(_v) {
-            return - _v.count;
+        .sortBy(function (_v) {
+          return -_v.count;
         })
         .first(this.tag_count)
         .value();
-    if (_words.length) {
+      if (_words && _words.length) {
         var _max = _words[0].count,
-            _min = Math.min(_words[_words.length - 1].count, _max - 1),
-            _scale = (this.max_font_size - this.min_font_size) / Math.sqrt(_max - _min);
-        IriSP._(_words).each(function(_word) {
-                _word.size = Math.floor( _this.min_font_size + _scale * Math.sqrt(_word.count - _min) );
-            });
+          _min = Math.min(_words[_words.length - 1].count, _max - 1),
+          _scale =
+            (this.max_font_size - this.min_font_size) / Math.sqrt(_max - _min);
+        _(_words).each(function (_word) {
+          _word.size = Math.floor(
+            _this.min_font_size + _scale * Math.sqrt(_word.count - _min)
+          );
+        });
+      }
+      this.$.html(Mustache.render(this.constructor.template, { words: _words }));
+      this.$.find(".Ldt-Tagcloud-item").click(function () {
+        var _txt = jQuery(this).attr("content");
+        _this.source.getAnnotations().searchByTags(_txt);
+      });
+      this.source
+        .getAnnotations()
+        .on("search", this.functionWrapper("onSearch"));
+      this.source
+        .getAnnotations()
+        .on("search-cleared", this.functionWrapper("onSearch"));
     }
-    this.$.html(Mustache.to_html(this.template,  {words: _words }));
-    this.$.find(".Ldt-Tagcloud-item").click(function() {
-        var _txt = IriSP.jQuery(this).attr("content");
-        _this.source.getAnnotations().searchByTags(_txt);
-    });
-    this.source.getAnnotations().on("search", this.functionWrapper("onSearch"));
-    this.source.getAnnotations().on("search-cleared", this.functionWrapper("onSearch"));
+
+    onSearch(searchString) {
+      searchString = typeof searchString !== "undefined" ? searchString : "";
+      if (searchString) {
+        var _rgxp = ns.Model.regexpFromTextOrArray(searchString);
+      }
+      this.$.find(".Ldt-Tagcloud-item").each(function () {
+        var _el = jQuery(this),
+          _txt = _el.attr("content");
+        if (searchString) {
+          _el.html(
+            _txt.replace(_rgxp, '<span class="Ldt-Tagcloud-active">$1</span>')
+          );
+        } else {
+          _el.html(_txt);
+        }
+      });
+    }
+  };
 };
 
-IriSP.Widgets.Tagcloud.prototype.onSearch = function(searchString) {
-    searchString = typeof searchString !== "undefined" ? searchString : '';
-    if (searchString) {
-        var _rgxp = IriSP.Model.regexpFromTextOrArray(searchString);
-    }
-    this.$.find(".Ldt-Tagcloud-item").each(function() {
-        var _el = IriSP.jQuery(this),
-            _txt = _el.attr("content");
-        if (searchString) {
-            _el.html(_txt.replace(_rgxp, '<span class="Ldt-Tagcloud-active">$1</span>'));
-        } else {
-            _el.html(_txt);
-        }
-    });
-};
+export { Tagcloud, tagcloudStyles };
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/widgets/Tagcloud.module.css	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,31 @@
+/*
+ * 
+ */
+.Ldt-Tagcloud-Container {
+    border: 1px solid #b7b7b7;
+    padding: 1px;
+    margin: 0;
+}
+
+ul.Ldt-Tagcloud-List {
+    background: url(img/pinstripe.png);
+    padding: 5px;
+    margin: 0;
+    list-style: none;
+    text-align: center;
+}
+
+li.Ldt-Tagcloud-item {
+    display: inline-block;
+    margin: 2px;
+    cursor: pointer;
+}
+
+li.Ldt-Tagcloud-item:hover {
+    color: #0099ff;
+}
+
+.Ldt-Tagcloud-active {
+    color: #c000c0;
+    padding: 0; margin: 0;
+}
\ No newline at end of file
--- a/src/widgets/Title.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/widgets/Title.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,17 +1,20 @@
-IriSP.Widgets.Title = function(player, config) {
-    IriSP.Widgets.Widget.call(this, player, config);
+const Title = function (ns) {
+  return class extends ns.Widgets.Widget {
+    constructor(player, config) {
+      super(player, config);
+    }
+
+    static defaults = {
+      media_title: false,
+    };
+
+    static template =
+      '<div class="Ldt-TitleWidget"><h2>{{#media_title}}{{media.title}}{{/media_title}}{{^media_title}}{{source.title}}{{/media_title}}</h2></div>';
+
+    draw() {
+      this.renderTemplate();
+    }
+  };
 };
 
-IriSP.Widgets.Title.prototype = new IriSP.Widgets.Widget();
-
-IriSP.Widgets.Title.prototype.defaults = {
-    media_title: false
-};
-
-IriSP.Widgets.Title.prototype.template =
-    '<div class="Ldt-TitleWidget"><h2>{{#media_title}}{{media.title}}{{/media_title}}{{^media_title}}{{source.title}}{{/media_title}}</h2></div>';
-
-
-IriSP.Widgets.Title.prototype.draw = function() {
-    this.renderTemplate();
-};
\ No newline at end of file
+export { Title };
--- a/src/widgets/Tooltip.css	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,123 +0,0 @@
-.Ldt-Tooltip {
-    position: absolute;
-    height: 0; width: 0;
-    z-index: 100000;
-}
-
-.Ldt-Tooltip-Main {
-    position: absolute; bottom: 0; left: -96px;
-}
-
-.Ldt-Tooltip-Corner-NW,
-.Ldt-Tooltip-Corner-NE,
-.Ldt-Tooltip-Corner-SW,
-.Ldt-Tooltip-Corner-SE {
-    position: absolute; width: 6px; height: 6px; background: url(img/tooltip-corners.png);
-}
-
-.Ldt-Tooltip-Corner-NW,
-.Ldt-Tooltip-Corner-SW {
-    left: 0;
-}
-
-.Ldt-Tooltip-Corner-NE,
-.Ldt-Tooltip-Corner-SE {
-    right: 0;
-}
-
-.Ldt-Tooltip-Corner-NW,
-.Ldt-Tooltip-Corner-NE {
-    top: 0;
-}
-
-.Ldt-Tooltip-Corner-SW,
-.Ldt-Tooltip-Corner-SE {
-    bottom: 10px;
-}
-
-.Ldt-Tooltip-Corner-NW {
-    background-position: top left;
-}
-
-.Ldt-Tooltip-Corner-NE {
-    background-position: top right;
-}
-
-.Ldt-Tooltip-Corner-SW {
-    background-position: bottom left;
-}
-
-.Ldt-Tooltip-Corner-SE {
-    background-position: bottom right;
-}
-
-.Ldt-Tooltip-Border-Top,
-.Ldt-Tooltip-Border-SW,
-.Ldt-Tooltip-Border-SE {
-    position: absolute; height: 6px; background: url(img/tooltip-h-borders.png);
-}
-
-.Ldt-Tooltip-Border-Top {
-    left: 6px; right: 6px;
-}
-
-.Ldt-Tooltip-Border-SW,
-.Ldt-Tooltip-Border-SE {
-    bottom: 10px; background-position: bottom;
-}
-
-.Ldt-Tooltip-Border-SW {
-    left: 6px;
-}
-
-.Ldt-Tooltip-Border-SE {
-    right: 6px;
-}
-
-.Ldt-Tooltip-Tip {
-    position: absolute; height: 16px; width: 22px;
-    background: url(img/tooltip-tip.png);
-    bottom: 0;
-}
-
-.Ldt-Tooltip-Border-Left,
-.Ldt-Tooltip-Border-Right {
-    position: absolute; width: 6px; background: url(img/tooltip-v-borders.png);
-    top: 6px; bottom: 16px;
-}
-
-.Ldt-Tooltip-Border-Left {
-    left: 0; background-position: left;
-}
-
-.Ldt-Tooltip-Border-Right {
-    right: 0; background-position: right;
-}
-
-.Ldt-Tooltip-Inner {
-    min-height: 30px;
-    max-height: 140px;
-    width: 180px;
-    overflow: hidden;
-    margin: 6px 6px 16px;
-    background: url(img/tooltip-gradient.png) bottom;
-}
-
-
-.Ldt-Tooltip-Color {
-    float: left; margin: 8px 2px 2px 8px; width: 10px; height: 10px;
-}
-
-.Ldt-Tooltip-AltColor {
-    float: left; margin: 2px 2px 2px 3px; width: 10px; height: 10px;
-}
-
-.Ldt-Tooltip img {
-    max-width: 140px; max-height: 80px; margin: 2px 20px;
-}
-
-.Ldt-Tooltip p {
-    margin: 6px 8px;
-    font-size: 12px;
-    line-height: 14px;
-}
\ No newline at end of file
--- a/src/widgets/Tooltip.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/widgets/Tooltip.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,94 +1,113 @@
 /* this widget displays a small tooltip */
-IriSP.Widgets.Tooltip = function(player, config) {
-    IriSP.Widgets.Widget.call(this, player, config);
-};
+import tooltipStyles from "./Tooltip.module.css";
+
+const Tooltip = function (ns) {
+  return class extends ns.Widgets.Widget {
+    constructor(player, config) {
+      super(player, config);
+    }
+
+    static defaults = {};
+
+    static template =
+      '<div class="Ldt-Tooltip"><div class="Ldt-Tooltip-Main"><div class="Ldt-Tooltip-Corner-NW"></div>' +
+      '<div class="Ldt-Tooltip-Border-Top"></div><div class="Ldt-Tooltip-Corner-NE"></div>' +
+      '<div class="Ldt-Tooltip-Border-Left"></div><div class="Ldt-Tooltip-Border-Right"></div>' +
+      '<div class="Ldt-Tooltip-Corner-SW"></div><div class="Ldt-Tooltip-Border-SW"></div>' +
+      '<div class="Ldt-Tooltip-Tip"></div><div class="Ldt-Tooltip-Border-SE"></div>' +
+      '<div class="Ldt-Tooltip-Corner-SE"></div><div class="Ldt-Tooltip-Inner">' +
+      '<div class="Ldt-Tooltip-Color"></div><p class="Ldt-Tooltip-Text"></p></div></div></div>';
 
-IriSP.Widgets.Tooltip.prototype = new IriSP.Widgets.Widget();
-
-IriSP.Widgets.Tooltip.prototype.defaults = {
-    
-};
+    draw() {
+      const _this = this;
+      this.renderTemplate();
+      this.$.parent().css({
+        position: "relative",
+      });
+      this.$tooltip = this.$.find(".Ldt-Tooltip");
+      this.$tip = this.$.find(".Ldt-Tooltip-Tip");
+      this.$sw = this.$.find(".Ldt-Tooltip-Border-SW");
+      this.$se = this.$.find(".Ldt-Tooltip-Border-SE");
+      this.__halfWidth = Math.floor(
+        (this.$.find(".Ldt-Tooltip-Main").width() || 192) / 2
+      );
+      this.__borderWidth = this.$.find(".Ldt-Tooltip-Border-Left").width();
+      this.__tipDelta = this.__halfWidth - Math.floor(this.$tip.width() / 2);
+      this.__maxShift = this.__tipDelta - this.__borderWidth;
+      this.$.mouseover(function () {
+        _this.$tooltip.hide();
+      });
+      this.hide();
+    }
 
-IriSP.Widgets.Tooltip.prototype.template =
-    '<div class="Ldt-Tooltip"><div class="Ldt-Tooltip-Main"><div class="Ldt-Tooltip-Corner-NW"></div>'
-    + '<div class="Ldt-Tooltip-Border-Top"></div><div class="Ldt-Tooltip-Corner-NE"></div>'
-    + '<div class="Ldt-Tooltip-Border-Left"></div><div class="Ldt-Tooltip-Border-Right"></div>'
-    + '<div class="Ldt-Tooltip-Corner-SW"></div><div class="Ldt-Tooltip-Border-SW"></div>'
-    + '<div class="Ldt-Tooltip-Tip"></div><div class="Ldt-Tooltip-Border-SE"></div>'
-    + '<div class="Ldt-Tooltip-Corner-SE"></div><div class="Ldt-Tooltip-Inner">'
-    + '<div class="Ldt-Tooltip-Color"></div><p class="Ldt-Tooltip-Text"></p></div></div></div>';
+    show(x, y, text, color) {
+      if (typeof color !== "undefined") {
+        // one color or array of colors
+        if (typeof color === "string") {
+          this.$.find(".Ldt-Tooltip-Color").html("");
+          this.$.find(".Ldt-Tooltip-Color")
+            .show()
+            .css("background-color", color);
+          this.$.find(".Ldt-Tooltip-Color").show().css("height", "");
+        } else {
+          var d = this.$.find(".Ldt-Tooltip-Color");
+          d.html("");
+          d.show();
+          for (var i = 0; i < color.length; i++) {
+            d.append(
+              '<div style="float: left; height: 10px; width: 10px; background-color: ' +
+                color[i] +
+                '">'
+            );
+          }
+          this.$.find(".Ldt-Tooltip-Color").css(
+            "height",
+            color.length * 10 + "px"
+          );
+        }
+      } else {
+        this.$.find(".Ldt-Tooltip-Color").hide();
+      }
+
+      this.$.find(".Ldt-Tooltip-Text").html(text);
+
+      this.$tooltip.show();
 
-IriSP.Widgets.Tooltip.prototype.draw = function() {
-    _this = this;
-    this.renderTemplate();
-    this.$.parent().css({
-        "position" : "relative"
-    });
-    this.$tooltip = this.$.find(".Ldt-Tooltip");
-    this.$tip = this.$.find(".Ldt-Tooltip-Tip");
-    this.$sw = this.$.find(".Ldt-Tooltip-Border-SW");
-    this.$se = this.$.find(".Ldt-Tooltip-Border-SE");
-    this.__halfWidth = Math.floor(( this.$.find(".Ldt-Tooltip-Main").width() || 192)/2);
-    this.__borderWidth = this.$.find(".Ldt-Tooltip-Border-Left").width();
-    this.__tipDelta = this.__halfWidth - Math.floor(this.$tip.width()/2);
-    this.__maxShift = this.__tipDelta - this.__borderWidth;
-    this.$.mouseover(function() {
-        _this.$tooltip.hide();
-    });
-    this.hide();
+      var shift = 0;
+
+      if (
+        typeof this.min_x !== "undefined" &&
+        x - this.__halfWidth < this.min_x
+      ) {
+        shift = Math.max(x - this.__halfWidth - this.min_x, -this.__maxShift);
+      }
+
+      if (
+        typeof this.max_x !== "undefined" &&
+        +x + this.__halfWidth > this.max_x
+      ) {
+        shift = Math.min(+x + this.__halfWidth - this.max_x, this.__maxShift);
+      }
+
+      this.$tooltip.css({
+        left: x - shift + "px",
+        top: y + "px",
+      });
+      this.$tip.css({
+        left: this.__tipDelta + shift + "px",
+      });
+      this.$sw.css({
+        width: this.__tipDelta + shift - this.__borderWidth + "px",
+      });
+      this.$se.css({
+        width: this.__tipDelta - shift - this.__borderWidth + "px",
+      });
+    }
+
+    hide() {
+      this.$tooltip.hide();
+    }
+  };
 };
 
-IriSP.Widgets.Tooltip.prototype.show = function(x, y, text, color) {
-    
-    if (typeof color !== "undefined") {
-    	// one color or array of colors
-    	if (typeof color === "string") {
-    		this.$.find(".Ldt-Tooltip-Color").html("");
-    		this.$.find(".Ldt-Tooltip-Color").show().css("background-color", color);
-    		this.$.find(".Ldt-Tooltip-Color").show().css("height", "");
-    	}
-    	else{
-    		var d = this.$.find(".Ldt-Tooltip-Color");
-    		d.html("");
-    		d.show();
-    		for(var i=0; i<color.length; i++){
-    			d.append('<div style="float: left; height: 10px; width: 10px; background-color: ' + color[i] + '">')
-    		}
-    		this.$.find(".Ldt-Tooltip-Color").css("height", (color.length * 10) + "px");
-    	}
-    } else {
-        this.$.find(".Ldt-Tooltip-Color").hide();
-    }
-
-    this.$.find(".Ldt-Tooltip-Text").html(text);
-
-    this.$tooltip.show();
-    
-    var shift = 0;
-    
-    if (typeof this.min_x !== "undefined" && (x - this.__halfWidth < this.min_x)) {
-        shift = Math.max(x - this.__halfWidth - this.min_x, - this.__maxShift);
-    }
-    
-    if (typeof this.max_x !== "undefined" && (+x + this.__halfWidth > this.max_x)) {
-        shift = Math.min(+ x + this.__halfWidth - this.max_x, this.__maxShift);
-    }
-    
-    this.$tooltip.css({
-        "left" : (x - shift) + "px",
-        "top" : y + "px"
-    });
-    this.$tip.css({
-        "left": (this.__tipDelta + shift) + "px"
-    });
-    this.$sw.css({
-        "width": (this.__tipDelta + shift - this.__borderWidth) + "px"
-    });
-    this.$se.css({
-        "width": (this.__tipDelta - shift - this.__borderWidth) + "px"
-    });
-};
-
-IriSP.Widgets.Tooltip.prototype.hide = function() {
-    this.$tooltip.hide();
-};
+export { Tooltip, tooltipStyles };
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/widgets/Tooltip.module.css	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,123 @@
+.Ldt-Tooltip {
+    position: absolute;
+    height: 0; width: 0;
+    z-index: 100000;
+}
+
+.Ldt-Tooltip-Main {
+    position: absolute; bottom: 0; left: -96px;
+}
+
+.Ldt-Tooltip-Corner-NW,
+.Ldt-Tooltip-Corner-NE,
+.Ldt-Tooltip-Corner-SW,
+.Ldt-Tooltip-Corner-SE {
+    position: absolute; width: 6px; height: 6px; background: url(img/tooltip-corners.png);
+}
+
+.Ldt-Tooltip-Corner-NW,
+.Ldt-Tooltip-Corner-SW {
+    left: 0;
+}
+
+.Ldt-Tooltip-Corner-NE,
+.Ldt-Tooltip-Corner-SE {
+    right: 0;
+}
+
+.Ldt-Tooltip-Corner-NW,
+.Ldt-Tooltip-Corner-NE {
+    top: 0;
+}
+
+.Ldt-Tooltip-Corner-SW,
+.Ldt-Tooltip-Corner-SE {
+    bottom: 10px;
+}
+
+.Ldt-Tooltip-Corner-NW {
+    background-position: top left;
+}
+
+.Ldt-Tooltip-Corner-NE {
+    background-position: top right;
+}
+
+.Ldt-Tooltip-Corner-SW {
+    background-position: bottom left;
+}
+
+.Ldt-Tooltip-Corner-SE {
+    background-position: bottom right;
+}
+
+.Ldt-Tooltip-Border-Top,
+.Ldt-Tooltip-Border-SW,
+.Ldt-Tooltip-Border-SE {
+    position: absolute; height: 6px; background: url(img/tooltip-h-borders.png);
+}
+
+.Ldt-Tooltip-Border-Top {
+    left: 6px; right: 6px;
+}
+
+.Ldt-Tooltip-Border-SW,
+.Ldt-Tooltip-Border-SE {
+    bottom: 10px; background-position: bottom;
+}
+
+.Ldt-Tooltip-Border-SW {
+    left: 6px;
+}
+
+.Ldt-Tooltip-Border-SE {
+    right: 6px;
+}
+
+.Ldt-Tooltip-Tip {
+    position: absolute; height: 16px; width: 22px;
+    background: url(img/tooltip-tip.png);
+    bottom: 0;
+}
+
+.Ldt-Tooltip-Border-Left,
+.Ldt-Tooltip-Border-Right {
+    position: absolute; width: 6px; background: url(img/tooltip-v-borders.png);
+    top: 6px; bottom: 16px;
+}
+
+.Ldt-Tooltip-Border-Left {
+    left: 0; background-position: left;
+}
+
+.Ldt-Tooltip-Border-Right {
+    right: 0; background-position: right;
+}
+
+.Ldt-Tooltip-Inner {
+    min-height: 30px;
+    max-height: 140px;
+    width: 180px;
+    overflow: hidden;
+    margin: 6px 6px 16px;
+    background: url(img/tooltip-gradient.png) bottom;
+}
+
+
+.Ldt-Tooltip-Color {
+    float: left; margin: 8px 2px 2px 8px; width: 10px; height: 10px;
+}
+
+.Ldt-Tooltip-AltColor {
+    float: left; margin: 2px 2px 2px 3px; width: 10px; height: 10px;
+}
+
+.Ldt-Tooltip img {
+    max-width: 140px; max-height: 80px; margin: 2px 20px;
+}
+
+.Ldt-Tooltip p {
+    margin: 6px 8px;
+    font-size: 12px;
+    line-height: 14px;
+}
\ No newline at end of file
--- a/src/widgets/Trace.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/widgets/Trace.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,97 +1,121 @@
-IriSP.Widgets.Trace = function(player, config) {
-  IriSP.Widgets.Widget.call(this, player, config);
-    
-};
+import _ from "lodash";
+import jQuery from "jquery";
 
-IriSP.Widgets.Trace.prototype = new IriSP.Widgets.Widget();
+const Trace = function (ns) {
+  return class extends ns.Widgets.Widget {
+    constructor(player, config) {
+      super(player, config);
+    }
 
-IriSP.Widgets.Trace.prototype.defaults = {
-    js_console : false,
-    url: "http://traces.advene.org:5000/",
-    requestmode: 'GET',
-    syncmode: "sync",
-    default_subject: "IRI",
-    tracer: null,
-    extend: false
-};
+    static defaults = {
+      js_console: false,
+      url: "http://traces.advene.org:5000/",
+      requestmode: "GET",
+      syncmode: "sync",
+      default_subject: "IRI",
+      tracer: null,
+      extend: false,
+    };
 
-IriSP.Widgets.Trace.prototype.draw = function() {
-  if (typeof window.tracemanager === "undefined") {
-      console.log("Tracemanager not found");
-      return;
-  }
-  var _this = this,
-    _medialisteners = {
-        "play" : 0,
-        "pause" : 0,
-        "volumechange" : 0,
-        "seeked" : 0,
-        "play" : 0,
-        "pause" : 0,
-        "timeupdate" : 10000
-    },
-    _annlisteners = {
-        search: 0,
-        "search-cleared": 0
-    };
-    IriSP._(_medialisteners).each(function(_ms, _listener) {
-        var _f = function(_arg) {
-            _this.eventHandler(_listener, _arg);
+    draw() {
+      if (typeof window.tracemanager === "undefined") {
+        console.log("Tracemanager not found");
+        return;
+      }
+      var _this = this,
+        _medialisteners = {
+          play: 0,
+          pause: 0,
+          volumechange: 0,
+          seeked: 0,
+          play: 0,
+          pause: 0,
+          timeupdate: 10000,
+        },
+        _annlisteners = {
+          search: 0,
+          "search-cleared": 0,
+        };
+      _(_medialisteners).each(function (_ms, _listener) {
+        var _f = function (_arg) {
+          _this.eventHandler(_listener, _arg);
         };
         if (_ms) {
-            _f = IriSP._.throttle(_f, _ms);
+          _f = _.throttle(_f, _ms);
         }
         _this.media.on(_listener, _f);
-    });
-    var _annotations = this.source.getAnnotations();
-    IriSP._(_annlisteners).each(function(_ms, _listener) {
-        var _f = function(_arg) {
-            _this.eventHandler(_listener, _arg);
+      });
+      var _annotations = this.source.getAnnotations();
+      _(_annlisteners).each(function (_ms, _listener) {
+        var _f = function (_arg) {
+          _this.eventHandler(_listener, _arg);
         };
         if (_ms) {
-            _f = IriSP._.throttle(_f, _ms);
+          _f = _.throttle(_f, _ms);
         }
         _annotations.on(_listener, _f);
-    });
-    
-    if (!this.tracer) {
-    
+      });
+
+      if (!this.tracer) {
         this.tracer = window.tracemanager.init_trace("test", {
-            url: this.url,
-            requestmode: this.requestmode,
-            syncmode: this.syncmode,
-            default_subject: this.default_subject
+          url: this.url,
+          requestmode: this.requestmode,
+          syncmode: this.syncmode,
+          default_subject: this.default_subject,
         });
-    
-    }
-    
-    
-    
-    this.tracer.trace("TraceWidgetInit", {});
+      }
+
+      this.tracer.trace("TraceWidgetInit", {});
 
-    // Configure annotation creation/update/delete/publish tracing
-    _this.player.on("Annotation.create", function (a) {
-        _this.tracer.trace("AnnotationCreated", { id: a.id, annotation_begin: a.begin.milliseconds, annotation_end: a.end.milliseconds, annotation_media: a.media.id, content_length: a.title.length, content_words: a.title.split(/\s+/).length });
-    });
-    _this.player.on("Annotation.delete", function (aid) {
+      // Configure annotation creation/update/delete/publish tracing
+      _this.player.on("Annotation.create", function (a) {
+        _this.tracer.trace("AnnotationCreated", {
+          id: a.id,
+          annotation_begin: a.begin.milliseconds,
+          annotation_end: a.end.milliseconds,
+          annotation_media: a.media.id,
+          content_length: a.title.length,
+          content_words: a.title.split(/\s+/).length,
+        });
+      });
+      _this.player.on("Annotation.delete", function (aid) {
         _this.tracer.trace("AnnotationDeleted", { id: aid });
-    });
-    _this.player.on("Annotation.update", function (a) {
-        _this.tracer.trace("AnnotationUpdated", { id: a.id, annotation_begin: a.begin.milliseconds, annotation_end: a.end.milliseconds, annotation_media: a.media.id, content_length: a.title.length, content_words: a.title.split(/\s+/).length });
-    });
-    _this.player.on("Annotation.publish", function (a) {
-        _this.tracer.trace("AnnotationPublished", { id: a.id, annotation_begin: a.begin.milliseconds, annotation_end: a.end.milliseconds, annotation_media: a.media.id, content_length: a.title.length, content_words: a.title.split(/\s+/).length });
-    });
+      });
+      _this.player.on("Annotation.update", function (a) {
+        _this.tracer.trace("AnnotationUpdated", {
+          id: a.id,
+          annotation_begin: a.begin.milliseconds,
+          annotation_end: a.end.milliseconds,
+          annotation_media: a.media.id,
+          content_length: a.title.length,
+          content_words: a.title.split(/\s+/).length,
+        });
+      });
+      _this.player.on("Annotation.publish", function (a) {
+        _this.tracer.trace("AnnotationPublished", {
+          id: a.id,
+          annotation_begin: a.begin.milliseconds,
+          annotation_end: a.end.milliseconds,
+          annotation_media: a.media.id,
+          content_length: a.title.length,
+          content_words: a.title.split(/\s+/).length,
+        });
+      });
 
-    _this.player.trigger("trace-ready");
-    this.mouseLocation = '';
-    IriSP.jQuery(".Ldt-Widget").on("mousedown mouseenter mouseleave", ".Ldt-TraceMe", function(_e) {
-        var _target = IriSP.jQuery(this);
-        
-        var _widget = _target.attr("widget-type") || _target.parents(".Ldt-Widget").attr("widget-type"),
+      _this.player.trigger("trace-ready");
+      this.mouseLocation = "";
+      jQuery(".Ldt-Widget").on(
+        "mousedown mouseenter mouseleave",
+        ".Ldt-TraceMe",
+        function (_e) {
+          var _target = ns.jQuery(this);
+
+          var _widget =
+              _target.attr("widget-type") ||
+              _target.parents(".Ldt-Widget").attr("widget-type"),
             _data = {
-                "type": _e.type,
-                "widget": _widget
+              type: _e.type,
+              widget: _widget,
             },
             _targetEl = _target[0],
             _class = _targetEl.className,
@@ -99,47 +123,66 @@
             _id = _targetEl.id,
             _value = _target.val(),
             _traceInfo = _target.attr("trace-info");
-        _data.target = _name + (_id && _id.length ? '#' + IriSP.jqEscape(_id) : '') + (_class && _class.length ? ('.' + IriSP.jqEscape(_class).replace(/\s/g,'.')).replace(/\.Ldt-(Widget|TraceMe)/g,'') : '');
-        if (typeof _traceInfo == "string" && _traceInfo) {
+          _data.target =
+            _name +
+            (_id && _id.length ? "#" + ns.jqEscape(_id) : "") +
+            (_class && _class.length
+              ? ("." + ns.jqEscape(_class).replace(/\s/g, ".")).replace(
+                  /\.Ldt-(Widget|TraceMe)/g,
+                  ""
+                )
+              : "");
+          if (typeof _traceInfo == "string" && _traceInfo) {
             _data.traceInfo = _traceInfo;
+          }
+          if (typeof _value == "string" && _value.length) {
+            _data.value = _value;
+          }
+          _this.eventHandler("UIEvent", _data);
         }
-        if (typeof _value == "string" && _value.length) {
-            _data.value = _value;
-        }
-        _this.eventHandler('UIEvent', _data);
-    });
+      );
+    }
+
+    eventHandler(_listener, _arg) {
+      var _traceName = "Mdp_";
+      if (typeof _arg == "string" || typeof _arg == "number") {
+        _arg = { value: _arg };
+      }
+      if (typeof _arg == "undefined") {
+        _arg = {};
+      }
+      switch (_listener) {
+        case "UIEvent":
+          _traceName += _arg.widget + "_" + _arg.type;
+          delete _arg.widget;
+          delete _arg.type;
+          break;
+        case "play":
+        case "pause":
+          _arg.milliseconds = this.media.getCurrentTime().milliseconds;
+        case "timeupdate":
+        case "seeked":
+        case "volumechange":
+          _traceName += "media_" + _listener;
+          break;
+        default:
+          _traceName += _listener.replace(".", "_");
+      }
+      if (typeof this.extend === "object" && this.extend) {
+        _(_arg).extend(this.extend);
+      }
+      this.tracer.trace(_traceName, _arg);
+      if (
+        this.js_console &&
+        typeof window.console !== "undefined" &&
+        typeof console.log !== "undefined"
+      ) {
+        console.log(
+          "tracer.trace('" + _traceName + "', " + JSON.stringify(_arg) + ");"
+        );
+      }
+    }
+  };
 };
 
-IriSP.Widgets.Trace.prototype.eventHandler = function(_listener, _arg) {
-    var _traceName = 'Mdp_';
-    if (typeof _arg == "string" || typeof _arg == "number") {
-        _arg = { "value" : _arg };
-    }
-    if (typeof _arg == "undefined") {
-        _arg = {};
-    }
-    switch(_listener) {
-        case 'UIEvent':
-            _traceName += _arg.widget + '_' + _arg.type;
-            delete _arg.widget;
-            delete _arg.type;
-        break;
-        case 'play':
-        case 'pause':
-            _arg.milliseconds = this.media.getCurrentTime().milliseconds;
-        case 'timeupdate':
-        case 'seeked':
-        case 'volumechange':
-            _traceName += 'media_' + _listener;
-        break;
-        default:
-            _traceName += _listener.replace('.','_');
-    }
-    if (typeof this.extend === "object" && this.extend) {
-        IriSP._(_arg).extend(this.extend);
-    }
-    this.tracer.trace(_traceName, _arg);
-    if (this.js_console && typeof window.console !== "undefined" && typeof console.log !== "undefined") {
-        console.log("tracer.trace('" + _traceName + "', " + JSON.stringify(_arg) + ");");
-    }
-};
+export { Trace };
--- a/src/widgets/Transcript.css	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,9 +0,0 @@
-.Ldt-Transcript-Annotation {
-    margin-right: .5em;
-}
-.Ldt-Transcript-Annotation:hover {
-    background-color: #bbb;
-}
-.Ldt-Transcript-Annotation.active {
-    background-color: #ddd;
-}
--- a/src/widgets/Transcript.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/widgets/Transcript.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,79 +1,100 @@
 /* This widget displays annotations as a transcript */
+import Mustache from "mustache";
+import jQuery from "jquery";
 
-IriSP.Widgets.Transcript = function(player, config) {
-    IriSP.Widgets.Widget.call(this, player, config);
-}
+import transcriptStyles from "./Transcript.module.css";
 
-IriSP.Widgets.Transcript.prototype = new IriSP.Widgets.Widget();
+const Transcript = function (ns) {
+  return class extends ns.Widgets.Widget {
+    constructor(player, config) {
+      super(player, config);
+    }
 
-IriSP.Widgets.Transcript.prototype.defaults = {
-    annotation_type: "Caption",
-    use_vtt_track: false
-}
+    static defaults = {
+      annotation_type: "Caption",
+      use_vtt_track: false,
+    };
 
-IriSP.Widgets.Transcript.prototype.template = '<div class="Ldt-TranscriptWidget"></div>';
+    static template = '<div class="Ldt-TranscriptWidget"></div>';
 
-IriSP.Widgets.Transcript.prototype.annotationTemplate = '<span data-begin="{{ begin }}" data-end="{{ end }}" data-id="{{ id }}" class="Ldt-Transcript-Annotation">{{ content }}</span>  ';
+    static annotationTemplate =
+      '<span data-begin="{{ begin }}" data-end="{{ end }}" data-id="{{ id }}" class="Ldt-Transcript-Annotation">{{ content }}</span>  ';
 
-IriSP.Widgets.Transcript.prototype.draw = function() {
-    var _annotations = this.getWidgetAnnotations();
-    var _this = this;
-    var content;
+    draw() {
+      var _annotations = this.getWidgetAnnotations();
+      var _this = this;
+      var content;
 
-    _this.renderTemplate();
-    content = _this.$.find('.Ldt-TranscriptWidget');
+      _this.renderTemplate();
+      content = _this.$.find(".Ldt-TranscriptWidget");
 
-    if (_this.use_vtt_track) {
+      if (_this.use_vtt_track) {
         // Use webvtt track. It will only work with native video player.
-        var widgets =  _this.player.widgets.filter(function (w) { return w.type == "HtmlPlayer"; });
+        var widgets = _this.player.widgets.filter(function (w) {
+          return w.type == "HtmlPlayer";
+        });
         if (widgets) {
-            var v = widgets[0].$.find("video")[0];
-            // FIXME: allow to specify the used track
-            v.addEventListener("loadedmetadata", function () {
-                var track = v.textTracks[0];
-                var cues = track.cues;
-                var i = 1;
-                Array.prototype.forEach.apply(cues, [ function(_c) {
-                    _c.id = "cue" + i;
-                    var _html = Mustache.to_html(_this.annotationTemplate, {
-                        id : _c.id,
-                        content : _c.text,
-                        begin : 1000 * _c.startTime,
-                        end : 1000 * _c.endTime
-                    });
-                    i += 1;
-                    var _el = IriSP.jQuery(_html);
-                    content.append(_el);
-                } ]);
-                track.addEventListener("cuechange", function () {
-                    var acues = track.activeCues;
-                    if (acues.length > 0) {
-                        // Update attributes for active cues
-                        _this.$.find(".Ldt-Transcript-Annotation.active").removeClass("active");
-                        Array.prototype.forEach.apply(acues, [ function(_c) {
-                            _this.$.find("#" + _c.id).addClass("active");
-                        } ]);
-                    }
-                }, false);
-                content.on("click", ".Ldt-Transcript-Annotation", function () {
-                    _this.media.setCurrentTime(this.dataset.begin);
+          var v = widgets[0].$.find("video")[0];
+          // FIXME: allow to specify the used track
+          v.addEventListener("loadedmetadata", function () {
+            var track = v.textTracks[0];
+            var cues = track.cues;
+            var i = 1;
+            Array.prototype.forEach.apply(cues, [
+              function (_c) {
+                _c.id = "cue" + i;
+                var _html = Mustache.render(_this.annotationTemplate, {
+                  id: _c.id,
+                  content: _c.text,
+                  begin: 1000 * _c.startTime,
+                  end: 1000 * _c.endTime,
                 });
+                i += 1;
+                var _el = jQuery(_html);
+                content.append(_el);
+              },
+            ]);
+            track.addEventListener(
+              "cuechange",
+              function () {
+                var acues = track.activeCues;
+                if (acues.length > 0) {
+                  // Update attributes for active cues
+                  _this.$.find(".Ldt-Transcript-Annotation.active").removeClass(
+                    "active"
+                  );
+                  Array.prototype.forEach.apply(acues, [
+                    function (_c) {
+                      _this.$.find("#" + _c.id).addClass("active");
+                    },
+                  ]);
+                }
+              },
+              false
+            );
+            content.on("click", ".Ldt-Transcript-Annotation", function () {
+              _this.media.setCurrentTime(this.dataset.begin);
             });
+          });
         } else {
-            console.log("cannot find a video object");
+          console.log("cannot find a video object");
         }
-    } else {
+      } else {
         // Populate with annotation data
-        _annotations.forEach(function(_a) {
-            var _data = {
-                id : _a.id,
-                content : IriSP.textFieldHtml(_a.title),
-                begin : _a.begin.toString(),
-                end : _a.end.toString()
-            };
-            var _html = Mustache.to_html(_this.annotationTemplate, _data);
-            var _el = IriSP.jQuery(_html);
-            content.append(_el);
+        _annotations.forEach(function (_a) {
+          var _data = {
+            id: _a.id,
+            content: ns.textFieldHtml(_a.title),
+            begin: _a.begin.toString(),
+            end: _a.end.toString(),
+          };
+          var _html = Mustache.render(_this.annotationTemplate, _data);
+          var _el = jQuery(_html);
+          content.append(_el);
         });
-    };
+      }
+    }
+  };
 };
+
+export { Transcript, transcriptStyles };
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/widgets/Transcript.module.css	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,9 @@
+.Ldt-Transcript-Annotation {
+    margin-right: .5em;
+}
+.Ldt-Transcript-Annotation:hover {
+    background-color: #bbb;
+}
+.Ldt-Transcript-Annotation.active {
+    background-color: #ddd;
+}
--- a/src/widgets/Tweet.css	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,109 +0,0 @@
-.Ldt-Tweet-Widget {
-    border: 1px solid #b7b7b7;
-    padding: 1px;
-    margin: 0;
-}
-
-.Ldt-Tweet-Widget a {
-    color: #0068C4;
-}
-
-.Ldt-Tweet-Widget a:hover {
-    color: #003366;
-}
-
-.Ldt-Tweet-Inner {
-    background: url(img/pinstripe.png);
-    padding: 5px;
-    margin: 0;
-    min-height: 50px;
-}
-
-.Ldt-Tweet-PinClose-Buttons {
-    float: right;
-}
-
-.Ldt-Tweet-PinClose-Buttons a {
-    display: inline-block; width: 17px; height: 17px; margin: 2px;
-    background: url(img/widget-control.png);
-}
-
-a.Ldt-Tweet-Pin {
-    background-position: 0 -17px;
-}
-
-a.Ldt-Tweet-Pin:hover, a.Ldt-Tweet-Pin.active {
-    background-position: -17px -17px;
-}
-
-a.Ldt-Tweet-Pin.active:hover {
-    background-position: 0 -17px;
-}
-
-a.Ldt-Tweet-Close:hover {
-    background-position: -17px 0;
-}
-
-.Ldt-Tweet-AvatarContainer {
-    float: left; width: 48px; height: 48px; margin: 2px 4px 2px 0;
-}
-
-.Ldt-Tweet-Avatar {
-    border: none; width: 48px; height: 48px;
-}
-
-.Ldt-Tweet-Inner h3 {
-    margin: 2px 0 5px 52px;
-    font-size: 14px;
-}
-
-a.Ldt-Tweet-ScreenName {
-    text-decoration: none;
-}
-
-a.Ldt-Tweet-ScreenName:hover {
-    text-decoration: underline;
-}
-
-p.Ldt-Tweet-Contents {
-    margin: 5px 0 5px 52px;
-    font-size: 12px;
-}
-
-.Ldt-Tweet-Bottom {
-    margin: 5px 0 0;
-    font-size: 12px;
-    text-align: right;
-}
-
-.Ldt-Tweet-Time {
-    display: inline-block;
-}
-
-.Ldt-Tweet-Bottom a {
-    display: inline-block;
-    margin-left: 12px;
-    text-decoration: none;
-}
-
-.Ldt-Tweet-Bottom a:hover {
-    text-decoration: underline;
-}
-
-.Ldt-Tweet-Icon {
-    display: inline-block; width: 16px; height: 16px;
-    margin: 0 2px -2px;
-    background: url(img/twitter_sprites.png);
-}
-
-.Ldt-Tweet-Retweet .Ldt-Tweet-Icon {
-    background-position: -80px 0;
-}
-
-.Ldt-Tweet-Retweet:hover .Ldt-Tweet-Icon {
-    background-position: -96px 0;
-}
-
-.Ldt-Tweet-Reply:hover .Ldt-Tweet-Icon {
-    background-position: -16px 0;
-}
\ No newline at end of file
--- a/src/widgets/Tweet.js	Sun Nov 12 22:07:33 2017 +0100
+++ b/src/widgets/Tweet.js	Wed Sep 04 17:32:50 2024 +0200
@@ -1,36 +1,40 @@
-IriSP.Widgets.Tweet = function(player, config) {
-    IriSP.Widgets.Widget.call(this, player, config);
-    this.lastAnnotation = false;
-};
-
-IriSP.Widgets.Tweet.prototype = new IriSP.Widgets.Widget();
+import _ from "lodash";
+import tweetStyles from "./Tweet.module.css";
+import jQuery from "jquery";
 
-IriSP.Widgets.Tweet.prototype.defaults = {
-    hide_timeout: 10000,
-    polemics : [
+const Tweet = function (ns) {
+  return class extends ns.Widgets.Widget {
+    constructor(player, config) {
+      super(player, config);
+      this.lastAnnotation = false;
+    }
+
+    static defaults = {
+      hide_timeout: 10000,
+      polemics: [
         {
-            "keywords" : [ "++" ],
-            "color" : "#30d765"
+          keywords: ["++"],
+          color: "#30d765",
         },
         {
-            "keywords" : [ "--" ],
-            "color" : "#f51123"
+          keywords: ["--"],
+          color: "#f51123",
         },
         {
-            "keywords" : [ "==" ],
-            "color" : "#f1e24a"  
+          keywords: ["=="],
+          color: "#f1e24a",
         },
         {
-            "keywords" : [ "??" ],
-            "color" : "#05aae6"
-        }
-    ],
-    annotation_type: "tweet",
-    pin_at_start: false
-};
+          keywords: ["??"],
+          color: "#05aae6",
+        },
+      ],
+      annotation_type: "tweet",
+      pin_at_start: false,
+    };
 
-IriSP.Widgets.Tweet.prototype.messages = {
-    "fr": {
+    static messages =  {
+      fr: {
         retweet: "Retweeter",
         reply: "Répondre",
         keep_visible: "Empêcher la fermeture automatique",
@@ -38,9 +42,9 @@
         close_widget: "Fermer l'affichage du tweet",
         original_time: "Heure d'envoi\u00a0: ",
         video_time: "Temps de la vidéo\u00a0: ",
-        show_original: "Voir l'original"
-    },
-    "en": {
+        show_original: "Voir l'original",
+      },
+      en: {
         retweet: "Retweet",
         reply: "Reply",
         keep_visible: "Keep visible",
@@ -48,121 +52,169 @@
         close_widget: "Close tweet display",
         original_time: "Tweet sent at: ",
         video_time: "Video time: ",
-        show_original: "Show original"
-    }
-};
+        show_original: "Show original",
+      },
+    };
 
-IriSP.Widgets.Tweet.prototype.template =
-    '<div class="Ldt-Tweet-Widget"><div class="Ldt-Tweet-Inner"><div class="Ldt-Tweet-PinClose-Buttons">'
-    + '<a href="#" class="Ldt-Tweet-Pin Ldt-TraceMe{{#pin_at_start}} active" title="{{l10n.dont_keep_visible}}{{/pin_at_start}}{{^pin_at_start}}" title="{{l10n.keep_visible}}{{/pin_at_start}}"></a>'
-    + '<a href="#" class="Ldt-Tweet-Close Ldt-TraceMe" title="{{l10n.close_widget}}"></a>'
-    + '</div><div class="Ldt-Tweet-AvatarContainer"><a href="#" class="Ldt-Tweet-ProfileLink" target="_blank">'
-    + '<img src="" class="Ldt-Tweet-Avatar"/></a></div><h3><a href="#" class="Ldt-Tweet-ProfileLink Ldt-Tweet-ScreenName" target="_blank">'
-    + '</a> (<span class="Ldt-Tweet-FullName"></span>)</h3><p class="Ldt-Tweet-Contents"></p><div class="Ldt-Tweet-Bottom">'
-    + '<span class="Ldt-Tweet-Time"></span>'
-    + '<a class="Ldt-Tweet-Original" href="" target="_blank">{{l10n.show_original}}</a>'
-    + '<a href="" target="_blank" class="Ldt-Tweet-Retweet"><div class="Ldt-Tweet-Icon"></div>{{l10n.retweet}}</a>'
-    + '<a href="" target="_blank" class="Ldt-Tweet-Reply"><div class="Ldt-Tweet-Icon"></div>{{l10n.reply}}</a></div></div></div>';
-    
+    static template =
+      '<div class="Ldt-Tweet-Widget"><div class="Ldt-Tweet-Inner"><div class="Ldt-Tweet-PinClose-Buttons">' +
+      '<a href="#" class="Ldt-Tweet-Pin Ldt-TraceMe{{#pin_at_start}} active" title="{{l10n.dont_keep_visible}}{{/pin_at_start}}{{^pin_at_start}}" title="{{l10n.keep_visible}}{{/pin_at_start}}"></a>' +
+      '<a href="#" class="Ldt-Tweet-Close Ldt-TraceMe" title="{{l10n.close_widget}}"></a>' +
+      '</div><div class="Ldt-Tweet-AvatarContainer"><a href="#" class="Ldt-Tweet-ProfileLink" target="_blank">' +
+      '<img src="" class="Ldt-Tweet-Avatar"/></a></div><h3><a href="#" class="Ldt-Tweet-ProfileLink Ldt-Tweet-ScreenName" target="_blank">' +
+      '</a> (<span class="Ldt-Tweet-FullName"></span>)</h3><p class="Ldt-Tweet-Contents"></p><div class="Ldt-Tweet-Bottom">' +
+      '<span class="Ldt-Tweet-Time"></span>' +
+      '<a class="Ldt-Tweet-Original" href="" target="_blank">{{l10n.show_original}}</a>' +
+      '<a href="" target="_blank" class="Ldt-Tweet-Retweet"><div class="Ldt-Tweet-Icon"></div>{{l10n.retweet}}</a>' +
+      '<a href="" target="_blank" class="Ldt-Tweet-Reply"><div class="Ldt-Tweet-Icon"></div>{{l10n.reply}}</a></div></div></div>';
 
-IriSP.Widgets.Tweet.prototype.draw = function() {
-    this.renderTemplate();
-    this.pinned = this.pin_at_start;
-    var _this = this;
-    this.$.find(".Ldt-Tweet-Pin").click(function() {
+    draw() {
+      this.renderTemplate();
+      this.pinned = this.pin_at_start;
+      var _this = this;
+      this.$.find(".Ldt-Tweet-Pin").click(function () {
         _this.pinned = !_this.pinned;
-        var _el = IriSP.jQuery(this);
+        var _el = jQuery(this);
         if (_this.pinned) {
-            _el.addClass("active").attr("title",_this.l10n.dont_keep_visible);
-            _this.cancelTimeout();
+          _el.addClass("active").attr("title", _this.l10n.dont_keep_visible);
+          _this.cancelTimeout();
         } else {
-            _el.removeClass("active").attr("title",_this.l10n.keep_visible);
-            _this.hideTimeout();
+          _el.removeClass("active").attr("title", _this.l10n.keep_visible);
+          _this.hideTimeout();
         }
-    });
-    this.$.find(".Ldt-Tweet-Close").click(function() {
+      });
+      this.$.find(".Ldt-Tweet-Close").click(function () {
         _this.hide();
-    });
-    this.$.hide();
-    this.getWidgetAnnotations().forEach(function(_annotation) {
-        _annotation.on("click", function() {
-            _this.show(_annotation);
+      });
+      this.$.hide();
+      this.getWidgetAnnotations().forEach(function (_annotation) {
+        _annotation.on("click", function () {
+          _this.show(_annotation);
         });
-    });
-};
+      });
+    }
 
-IriSP.Widgets.Tweet.prototype.show = function(_tweet) {
-    if (typeof _tweet !== "undefined" && typeof _tweet.source !== "undefined") {
+    show(_tweet) {
+      if (
+        typeof _tweet !== "undefined" &&
+        typeof _tweet.source !== "undefined"
+      ) {
         var extend = [
-            [
-                /#(\w+)/gm,
-                function(matches) {
-                    return '<a href="http://twitter.com/search?q=%23' + matches[1] + '" target="_blank">';
-                },
-                '</a>'
-            ]
+          [
+            /#(\w+)/gm,
+            function (matches) {
+              return (
+                '<a href="http://twitter.com/search?q=%23' +
+                matches[1] +
+                '" target="_blank">'
+              );
+            },
+            "</a>",
+          ],
         ];
-        var _urls = IriSP._(_tweet.source.entities.urls).sortBy(function(_entity) {
-            return _entity.indices[0];
+        var _urls = _(_tweet.source.entities.urls).sortBy(function (_entity) {
+          return _entity.indices[0];
         });
-        
+
         var _currentPos = 0,
-            _txt = '';
-        IriSP._(_urls).each(function(_url) {
-            if (_url.indices[0] >= _currentPos) {
-                _txt += _tweet.source.text.substring(_currentPos, _url.indices[0]);
-                _txt += (typeof _url.expanded_url !== "undefined" && _url.expanded_url !== null ? _url.expanded_url : _url.url);
-                _currentPos = _url.indices[1];
-            }
+          _txt = "";
+        _(_urls).each(function (_url) {
+          if (_url.indices[0] >= _currentPos) {
+            _txt += _tweet.source.text.substring(_currentPos, _url.indices[0]);
+            _txt +=
+              typeof _url.expanded_url !== "undefined" &&
+              _url.expanded_url !== null
+                ? _url.expanded_url
+                : _url.url;
+            _currentPos = _url.indices[1];
+          }
         });
         _txt += _tweet.source.text.substring(_currentPos);
-        
+
         for (var _i = 0; _i < this.polemics.length; _i++) {
-            var rx = IriSP.Model.regexpFromTextOrArray(this.polemics[_i].keywords);
-            extend.push([
-                rx,
-                '<span style="background: ' + this.polemics[_i].color + '">',
-                '</span>'
-            ]);
+          var rx = ns.Model.regexpFromTextOrArray(this.polemics[_i].keywords);
+          extend.push([
+            rx,
+            '<span style="background: ' + this.polemics[_i].color + '">',
+            "</span>",
+          ]);
         }
-        var rx = (_tweet.found ? (_this.source.getAnnotations().regexp || false) : false),
-            profile_url = _tweet.source.user ? _tweet.source.user.profile_image_url : _tweet.source.profile_image_url,
-            screen_name = _tweet.source.user ? _tweet.source.user.screen_name :_tweet.source.from_user,
-            user_name = _tweet.source.user ? _tweet.source.user.name :_tweet.source.from_user_name;
+        var rx = _tweet.found
+            ? _this.source.getAnnotations().regexp || false
+            : false,
+          profile_url = _tweet.source.user
+            ? _tweet.source.user.profile_image_url
+            : _tweet.source.profile_image_url,
+          screen_name = _tweet.source.user
+            ? _tweet.source.user.screen_name
+            : _tweet.source.from_user,
+          user_name = _tweet.source.user
+            ? _tweet.source.user.name
+            : _tweet.source.from_user_name;
         this.$.find(".Ldt-Tweet-Avatar").attr("src", profile_url);
-        this.$.find(".Ldt-Tweet-ScreenName").html('@' + screen_name);
-        this.$.find(".Ldt-Tweet-ProfileLink").attr("href", "https://twitter.com/" + screen_name);
+        this.$.find(".Ldt-Tweet-ScreenName").html("@" + screen_name);
+        this.$.find(".Ldt-Tweet-ProfileLink").attr(
+          "href",
+          "https://twitter.com/" + screen_name
+        );
         this.$.find(".Ldt-Tweet-FullName").html(user_name);
-        this.$.find(".Ldt-Tweet-Contents").html(IriSP.textFieldHtml(_txt, rx, extend));
-        this.$.find(".Ldt-Tweet-Time").html(this.l10n.original_time + new Date(_tweet.source.created_at).toLocaleTimeString() + " / " + this.l10n.video_time + _tweet.begin.toString());
-        this.$.find(".Ldt-Tweet-Retweet").attr("href", "https://twitter.com/intent/retweet?tweet_id=" + _tweet.source.id_str);
-        this.$.find(".Ldt-Tweet-Reply").attr("href", "https://twitter.com/intent/tweet?in_reply_to=" + _tweet.source.id_str);
-        this.$.find(".Ldt-Tweet-Original").attr("href", "https://twitter.com/" + screen_name + "/status/" + _tweet.source.id_str);
+        this.$.find(".Ldt-Tweet-Contents").html(
+          ns.textFieldHtml(_txt, rx, extend)
+        );
+        this.$.find(".Ldt-Tweet-Time").html(
+          this.l10n.original_time +
+            new Date(_tweet.source.created_at).toLocaleTimeString() +
+            " / " +
+            this.l10n.video_time +
+            _tweet.begin.toString()
+        );
+        this.$.find(".Ldt-Tweet-Retweet").attr(
+          "href",
+          "https://twitter.com/intent/retweet?tweet_id=" + _tweet.source.id_str
+        );
+        this.$.find(".Ldt-Tweet-Reply").attr(
+          "href",
+          "https://twitter.com/intent/tweet?in_reply_to=" + _tweet.source.id_str
+        );
+        this.$.find(".Ldt-Tweet-Original").attr(
+          "href",
+          "https://twitter.com/" +
+            screen_name +
+            "/status/" +
+            _tweet.source.id_str
+        );
         this.player.trigger("Annotation.minimize");
         this.$.slideDown();
         this.cancelTimeout();
         if (!this.pinned) {
-            this.hideTimeout();
+          this.hideTimeout();
         }
-    } else {
+      } else {
         this.hide();
+      }
     }
+
+    hide() {
+      this.player.trigger("Annotation.maximize");
+      this.$.slideUp();
+      this.cancelTimeout();
+    }
+
+    cancelTimeout() {
+      if (typeof this.hide_timer !== "undefined") {
+        window.clearTimeout(this.hide_timer);
+        this.hide_timer = undefined;
+      }
+    }
+
+    hideTimeout() {
+      this.cancelTimeout();
+      this.hide_timer = window.setTimeout(
+        this.functionWrapper("hide"),
+        this.hide_timeout
+      );
+    }
+  };
 };
 
-IriSP.Widgets.Tweet.prototype.hide = function() {
-    this.player.trigger("Annotation.maximize");
-    this.$.slideUp();
-    this.cancelTimeout();
-};
-
-IriSP.Widgets.Tweet.prototype.cancelTimeout = function() {
-    if (typeof this.hide_timer !== "undefined") {
-        window.clearTimeout(this.hide_timer);
-        this.hide_timer = undefined;
-    }  
-};
-
-IriSP.Widgets.Tweet.prototype.hideTimeout = function() {
-    this.cancelTimeout();
-    this.hide_timer = window.setTimeout(this.functionWrapper("hide"), this.hide_timeout);
-};
+export { Tweet, tweetStyles };
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/widgets/Tweet.module.css	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,109 @@
+.Ldt-Tweet-Widget {
+    border: 1px solid #b7b7b7;
+    padding: 1px;
+    margin: 0;
+}
+
+.Ldt-Tweet-Widget a {
+    color: #0068C4;
+}
+
+.Ldt-Tweet-Widget a:hover {
+    color: #003366;
+}
+
+.Ldt-Tweet-Inner {
+    background: url(img/pinstripe.png);
+    padding: 5px;
+    margin: 0;
+    min-height: 50px;
+}
+
+.Ldt-Tweet-PinClose-Buttons {
+    float: right;
+}
+
+.Ldt-Tweet-PinClose-Buttons a {
+    display: inline-block; width: 17px; height: 17px; margin: 2px;
+    background: url(img/widget-control.png);
+}
+
+a.Ldt-Tweet-Pin {
+    background-position: 0 -17px;
+}
+
+a.Ldt-Tweet-Pin:hover, a.Ldt-Tweet-Pin.active {
+    background-position: -17px -17px;
+}
+
+a.Ldt-Tweet-Pin.active:hover {
+    background-position: 0 -17px;
+}
+
+a.Ldt-Tweet-Close:hover {
+    background-position: -17px 0;
+}
+
+.Ldt-Tweet-AvatarContainer {
+    float: left; width: 48px; height: 48px; margin: 2px 4px 2px 0;
+}
+
+.Ldt-Tweet-Avatar {
+    border: none; width: 48px; height: 48px;
+}
+
+.Ldt-Tweet-Inner h3 {
+    margin: 2px 0 5px 52px;
+    font-size: 14px;
+}
+
+a.Ldt-Tweet-ScreenName {
+    text-decoration: none;
+}
+
+a.Ldt-Tweet-ScreenName:hover {
+    text-decoration: underline;
+}
+
+p.Ldt-Tweet-Contents {
+    margin: 5px 0 5px 52px;
+    font-size: 12px;
+}
+
+.Ldt-Tweet-Bottom {
+    margin: 5px 0 0;
+    font-size: 12px;
+    text-align: right;
+}
+
+.Ldt-Tweet-Time {
+    display: inline-block;
+}
+
+.Ldt-Tweet-Bottom a {
+    display: inline-block;
+    margin-left: 12px;
+    text-decoration: none;
+}
+
+.Ldt-Tweet-Bottom a:hover {
+    text-decoration: underline;
+}
+
+.Ldt-Tweet-Icon {
+    display: inline-block; width: 16px; height: 16px;
+    margin: 0 2px -2px;
+    background: url(img/twitter_sprites.png);
+}
+
+.Ldt-Tweet-Retweet .Ldt-Tweet-Icon {
+    background-position: -80px 0;
+}
+
+.Ldt-Tweet-Retweet:hover .Ldt-Tweet-Icon {
+    background-position: -96px 0;
+}
+
+.Ldt-Tweet-Reply:hover .Ldt-Tweet-Icon {
+    background-position: -16px 0;
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/widgets/index.js	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,131 @@
+import { AdaptivePlayer } from "./AdaptivePlayer";
+import { HelloWorld, helloWorldStyles } from "./HelloWorld";
+import { Annotation, annotationStyles } from "./Annotation";
+import { AnnotationsController, annotationsControllerStyles } from "./AnnotationsController";
+import { AnnotationsList, annotationsListStyles } from "./AnnotationsList";
+import { Arrow } from "./Arrow";
+import { Controller, controllerStyles } from "./Controller";
+import { CreateAnnotation, createAnnotationStyles } from "./CreateAnnotation";
+import { CurrentSegmentInfobox, currentSegmentInfoboxStyles } from "./CurrentSegmentInfobox";
+import { DailymotionPlayer } from "./DailymotionPlayer";
+import { EnrichedPlan, enrichedPlanStyles } from "./EnrichedPlan";
+import { Highlighter, highlighterStyles } from "./Highlighter";
+import { HtmlMashupPlayer } from "./HtmlMashupPlayer";
+import { HtmlPlayer } from "./HtmlPlayer";
+import { ImageDisplay, imageDisplayStyles } from "./ImageDisplay";
+import { JwpPlayer } from "./JwpPlayer";
+//import { KnowledgeConcierge, knowledgeConciergeStyles } from "./KnowledgeConcierge";
+import { LatestAnnotation, latestAnnotationStyles } from "./LatestAnnotation";
+import { MashupPlayer, mashupPlayerStyles } from "./MashupPlayer";
+import { Mediafragment } from "./Mediafragment";
+import { MediaList, mediaListStyles } from "./MediaList";
+import { NoteTaking, noteTakingStyles } from "./NoteTaking";
+import { PlaceholderPlayer, placeholderPlayerStyles } from "./PlaceholderPlayer";
+import { Polemic, polemicStyles } from "./Polemic";
+import { PopcornPlayer } from "./PopcornPlayer";
+import { Quiz, UniqueChoiceQuestion, MultipleChoiceQuestion, quizStyles } from "./Quiz";
+import { QuizCreator, quizCreatorStyles } from "./QuizCreator";
+// import { Renkan, renkanStyles } from "./Renkan";
+import { Segments, segmentsStyles } from "./Segments";
+import { Shortcuts, shortcutsStyles } from "./Shortcuts";
+import { Slice, sliceStyles } from "./Slice";
+import { SlidePreview, slidePreviewStyles } from "./SlidePreview";
+import { Slider, sliderStyles } from "./Slider";
+// import { Slideshare, slideshareStyles } from "./Slideshare";
+import { SlideVideoPlayer, slideVideoPlayerStyles } from "./SlideVideoPlayer";
+import { Social, socialStyles } from "./Social";
+import { Sparkline } from "./Sparkline";
+import { SpelSyncHtml } from "./SpelSyncHtml";
+import { Tagcloud, tagcloudStyles } from "./Tagcloud";
+import { Title } from "./Title";
+import { Tooltip, tooltipStyles } from "./Tooltip";
+import { Transcript, transcriptStyles } from "./Transcript";
+import { Tweet, tweetStyles } from "./Tweet";
+import { AutoPlayer } from "./AutoPlayer";
+import { MultiSegments } from "./MultiSegments";
+
+export default function (ns) {
+  return {
+    AdaptivePlayer: AdaptivePlayer(ns),
+    AutoPlayer: AutoPlayer(ns),
+    HelloWorld: HelloWorld(ns),
+    Annotation: Annotation(ns),
+    AnnotationsController: AnnotationsController(ns),
+    AnnotationsList: AnnotationsList(ns),
+    Arrow: Arrow(ns),
+    Controller: Controller(ns),
+    CreateAnnotation: CreateAnnotation(ns),
+    CurrentSegmentInfobox: CurrentSegmentInfobox(ns),
+    DailymotionPlayer: DailymotionPlayer(ns),
+    EnrichedPlan: EnrichedPlan(ns),
+    Highlighter: Highlighter(ns),
+    HtmlMashupPlayer: HtmlMashupPlayer(ns),
+    HtmlPlayer: HtmlPlayer(ns),
+    ImageDisplay: ImageDisplay(ns),
+    JwpPlayer: JwpPlayer(ns),
+//    KnowledgeConcierge: KnowledgeConcierge(ns),
+    LatestAnnotation: LatestAnnotation(ns),
+    MashupPlayer: MashupPlayer(ns),
+    Mediafragment: Mediafragment(ns),
+    MediaList: MediaList(ns),
+    MultiSegments: MultiSegments(ns),
+    NoteTaking: NoteTaking(ns),
+    PlaceholderPlayer: PlaceholderPlayer(ns),
+    Polemic: Polemic(ns),
+    PopcornPlayer: PopcornPlayer(ns),
+    Quiz: Quiz(ns),
+    UniqueChoiceQuestion: UniqueChoiceQuestion(ns),
+    MultipleChoiceQuestion: MultipleChoiceQuestion(ns),
+    QuizCreator: QuizCreator(ns),
+//    Renkan: Renkan(ns),
+    Segments: Segments(ns),
+    Shortcuts: Shortcuts(ns),
+    Slice: Slice(ns),
+    SlidePreview: SlidePreview(ns),
+    Slider: Slider(ns),
+//    Slideshare: Slideshare(ns),
+    SlideVideoPlayer: SlideVideoPlayer(ns),
+    Social: Social(ns),
+    Sparkline: Sparkline(ns),
+    SpelSyncHtml: SpelSyncHtml(ns),
+    Tagcloud: Tagcloud(ns),
+    Title: Title(ns),
+    Tooltip: Tooltip(ns),
+    Transcript: Transcript(ns),
+    Tweet: Tweet(ns),
+    styles: {
+      annotationStyles,
+      helloWorldStyles,
+      annotationsControllerStyles,
+      annotationsListStyles,
+      controllerStyles,
+      createAnnotationStyles,
+      currentSegmentInfoboxStyles,
+      enrichedPlanStyles,
+      highlighterStyles,
+      imageDisplayStyles,
+//      knowledgeConciergeStyles,
+      latestAnnotationStyles,
+      mashupPlayerStyles,
+      mediaListStyles,
+      noteTakingStyles,
+      placeholderPlayerStyles,
+      polemicStyles,
+      quizStyles,
+      quizCreatorStyles,
+//      renkanStyles,
+      segmentsStyles,
+      shortcutsStyles,
+      sliceStyles,
+      slidePreviewStyles,
+      sliderStyles,
+//      slideshareStyles,
+      slideVideoPlayerStyles,
+      socialStyles,
+      tagcloudStyles,
+      tooltipStyles,
+      transcriptStyles,
+      tweetStyles,
+    }
+  };
+}
--- a/test/dailymotion.htm	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,51 +0,0 @@
-<!doctype html>
-<html>
-
-    <head>
-        <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
-        <title>Metadataplayer test with Dailymotion</title>
-        <link href='open-sans/css/fonts.css' rel='stylesheet' type='text/css'>
-        <link href='test.css' rel='stylesheet' type='text/css'>
-        <script type="text/javascript" src="metadataplayer/LdtPlayer-core.js" type="text/javascript"></script>
-    </head>
-
-    <body>
-        <h1>Metadataplayer test with Dailymotion</h1>
-        <div id="LdtPlayer"></div>
-        <div id="AnnotationsListContainer"></div>
-        <script type="text/javascript">
-IriSP.libFiles.defaultDir = "libs/";
-IriSP.widgetsDir = "metadataplayer";
-var _metadata = {
-    url: "json/ldt-dailymotion.json",
-    format: 'ldt'
-};
-var _config = {
-    width : 620,
-    container : 'LdtPlayer',
-    default_options: {
-        metadata: _metadata
-    },
-    css : 'metadataplayer/LdtPlayer-core.css',
-    widgets: [
-        { type: "AutoPlayer" },
-        { type: "Sparkline" },
-        { type: "Slider" },
-        { type: "Controller" },
-        { type: "Polemic" },
-        { type: "Segments" },
-        { type: "Annotation" },
-        { type: "CreateAnnotation" },
-        { type: "Tweet" },
-        { type: "Tagcloud" },
-        {
-            type: "AnnotationsList",
-            container: "AnnotationsListContainer"
-        },
-        { type: "Mediafragment"}
-    ]
-};
-_myPlayer = new IriSP.Metadataplayer(_config);
-        </script>
-    </body>
-</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/dailymotion.html	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,51 @@
+<!doctype html>
+<html>
+
+    <head>
+        <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
+        <title>Metadataplayer test with Dailymotion</title>
+        <link href='open-sans/css/fonts.css' rel='stylesheet' type='text/css'>
+        <link href='test.css' rel='stylesheet' type='text/css'>
+        <script type="text/javascript" src="metadataplayer/LdtPlayer-core.js" type="text/javascript"></script>
+    </head>
+
+    <body>
+        <h1>Metadataplayer test with Dailymotion</h1>
+        <div id="LdtPlayer"></div>
+        <div id="AnnotationsListContainer"></div>
+        <script type="text/javascript">
+IriSP.libFiles.defaultDir = "libs/";
+IriSP.widgetsDir = "metadataplayer";
+var _metadata = {
+    url: "json/ldt-dailymotion.json",
+    format: 'ldt'
+};
+var _config = {
+    width : 620,
+    container : 'LdtPlayer',
+    default_options: {
+        metadata: _metadata
+    },
+    css : 'metadataplayer/LdtPlayer-core.css',
+    widgets: [
+        { type: "AutoPlayer" },
+        { type: "Sparkline" },
+        { type: "Slider" },
+        { type: "Controller" },
+        { type: "Polemic" },
+        { type: "Segments" },
+        { type: "Annotation" },
+        { type: "CreateAnnotation" },
+        { type: "Tweet" },
+        { type: "Tagcloud" },
+        {
+            type: "AnnotationsList",
+            container: "AnnotationsListContainer"
+        },
+        { type: "Mediafragment"}
+    ]
+};
+_myPlayer = new IriSP.Metadataplayer(_config);
+        </script>
+    </body>
+</html>
--- a/test/ext-trace.htm	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,90 +0,0 @@
-<!doctype html>
-<html>
-
-    <head>
-        <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
-        <title>Metadataplayer test with JwPlayer</title>
-        <link href='open-sans/css/fonts.css' rel='stylesheet' type='text/css'>
-        <link href='test.css' rel='stylesheet' type='text/css'>
-        <script type="text/javascript" src="metadataplayer/LdtPlayer-core.js" type="text/javascript"></script>
-        <script type="text/javascript" src="libs/jquery.min.js"></script>
-        <script type="text/javascript" src="libs/tracemanager.js" type="text/javascript"></script>
-    </head>
-
-    <body>
-        <h1>Metadataplayer test with JwPlayer</h1>
-        <div id="LdtPlayer"></div>
-        <div id="AnnotationsListContainer"></div>
-        <script type="text/javascript">
-IriSP.libFiles.defaultDir = "libs/";
-IriSP.language = 'fr';
-IriSP.widgetsDir = "metadataplayer";
-var _tracer = tracemanager.init_trace("test", {
-        url: "http://traces.advene.org:5000/",
-        requestmode: "GET",
-        syncmode: "sync",
-        default_subject: "tests-Metadataplayer"
-    });
-_tracer.trace("CallFromOutside");
-var _metadata = {
-    url: 'json/ldt-ogv.json',
-    format: 'ldt'
-};
-var _config = {
-    width : 550,
-    container : 'LdtPlayer',
-    default_options: {
-        metadata: _metadata
-    },
-    css : 'metadataplayer/LdtPlayer-core.css',
-    widgets: [
-        {
-            type: "AutoPlayer",
-            live: true, 
-            height: 350, 
-            width: 550, 
-            provider: "rtmp",
-            autostart: true
-        },
-        { type: "Slider" },
-        { type: "Controller" },
-        { type: "Polemic" },
-        { type: "Segments" },
-        { type: "Slice" },
-        {
-            type: "Arrow",
-            base_height: 4
-        },
-        { type: "Annotation" },
-        {
-            type: "CreateAnnotation",
-            api_endpoint_template: "http://capsicum/pf/ldtplatform/api/ldt/annotations/{{id}}.json",
-            creator_name: "Metadataplayer",
-            creator_avatar: "https://si0.twimg.com/sticky/default_profile_images/default_profile_1_normal.png",
-            tag_titles: ["#amateur", "#digital-humanities"]
-        },
-        { type: "Tweet" },
-        {
-            type: "Tagcloud"
-        },
-        {
-            type: "AnnotationsList",
-            container: "AnnotationsListContainer",
-            default_thumbnail : "http://ldt.iri.centrepompidou.fr/static/site/ldt/css/imgs/video_sequence.png"
-        },
-        {
-            type: "Trace",
-            tracer: _tracer,
-            js_console: true,
-            extend: {
-                test: 42
-            }
-        }
-    ]
-};
-
-var _myPlayer = new IriSP.Metadataplayer(_config);
-    
-        </script>
-    </body>
-</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/ext-trace.html	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,90 @@
+<!doctype html>
+<html>
+
+    <head>
+        <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
+        <title>Metadataplayer test with JwPlayer</title>
+        <link href='open-sans/css/fonts.css' rel='stylesheet' type='text/css'>
+        <link href='test.css' rel='stylesheet' type='text/css'>
+        <script type="text/javascript" src="metadataplayer/LdtPlayer-core.js" type="text/javascript"></script>
+        <script type="text/javascript" src="libs/jquery.min.js"></script>
+        <script type="text/javascript" src="libs/tracemanager.js" type="text/javascript"></script>
+    </head>
+
+    <body>
+        <h1>Metadataplayer test with JwPlayer</h1>
+        <div id="LdtPlayer"></div>
+        <div id="AnnotationsListContainer"></div>
+        <script type="text/javascript">
+IriSP.libFiles.defaultDir = "libs/";
+IriSP.language = 'fr';
+IriSP.widgetsDir = "metadataplayer";
+var _tracer = tracemanager.init_trace("test", {
+        url: "http://traces.advene.org:5000/",
+        requestmode: "GET",
+        syncmode: "sync",
+        default_subject: "tests-Metadataplayer"
+    });
+_tracer.trace("CallFromOutside");
+var _metadata = {
+    url: 'json/ldt-ogv.json',
+    format: 'ldt'
+};
+var _config = {
+    width : 550,
+    container : 'LdtPlayer',
+    default_options: {
+        metadata: _metadata
+    },
+    css : 'metadataplayer/LdtPlayer-core.css',
+    widgets: [
+        {
+            type: "AutoPlayer",
+            live: true, 
+            height: 350, 
+            width: 550, 
+            provider: "rtmp",
+            autostart: true
+        },
+        { type: "Slider" },
+        { type: "Controller" },
+        { type: "Polemic" },
+        { type: "Segments" },
+        { type: "Slice" },
+        {
+            type: "Arrow",
+            base_height: 4
+        },
+        { type: "Annotation" },
+        {
+            type: "CreateAnnotation",
+            api_endpoint_template: "http://capsicum/pf/ldtplatform/api/ldt/annotations/{{id}}.json",
+            creator_name: "Metadataplayer",
+            creator_avatar: "https://si0.twimg.com/sticky/default_profile_images/default_profile_1_normal.png",
+            tag_titles: ["#amateur", "#digital-humanities"]
+        },
+        { type: "Tweet" },
+        {
+            type: "Tagcloud"
+        },
+        {
+            type: "AnnotationsList",
+            container: "AnnotationsListContainer",
+            default_thumbnail : "http://ldt.iri.centrepompidou.fr/static/site/ldt/css/imgs/video_sequence.png"
+        },
+        {
+            type: "Trace",
+            tracer: _tracer,
+            js_console: true,
+            extend: {
+                test: 42
+            }
+        }
+    ]
+};
+
+var _myPlayer = new IriSP.Metadataplayer(_config);
+    
+        </script>
+    </body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hello-world-dist.html	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
+    <title>Metadataplayer test with JwPlayer</title>
+    <!--        <link href='open-sans/css/fonts.css' rel='stylesheet' type='text/css'>
+-->
+    <link href="/dist/LdtPlayer-core.css" rel="stylesheet" type="text/css" />
+  </head>
+
+  <body>
+    <h1>Metadataplayer test with JwPlayer</h1>
+    <div id="LdtPlayer"></div>
+    <div id="AnnotationsListContainer"></div>
+    <script src="/dist/LdtPlayer-core.js" type="text/javascript"></script>
+    <script type="text/javascript">
+      document.addEventListener("DOMContentLoaded", (event) => {
+        const IriSP = window.IriSP;
+        IriSP.language = "fr";
+        IriSP.widgetsDir = "metadataplayer";
+        var _metadata = {
+          //        url: 'json/ldt-jwplayer.json',
+          url: "https://ldt.iri.centrepompidou.fr/ldtplatform/ldt/cljson/id/e2f36e5c-8b26-11e2-a28d-00145ea4a2be",
+          //        url: 'http://capsicum/pf/ldtplatform/ldt/cljson/id/f1a17368-2bc8-11e1-b21a-00145ea49a02',
+          //        url: 'http://ldt.iri.centrepompidou.fr/ldtplatform/ldt/cljson/id/fc0a654e-49ea-11e2-b4ad-00145ea4a2be',
+          // dataType: "json",
+          format: "ldt",
+        };
+        var _config = {
+          width: 550,
+          container: "LdtPlayer",
+          default_options: {
+            metadata: _metadata,
+          },
+          widgets: [
+            {
+              type: "HelloWorld",
+            },
+            //            { type: "Trace",
+            //            js_console: true }
+          ],
+        };
+
+        var _myPlayer = new IriSP.Metadataplayer(_config);
+      });
+    </script>
+  </body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hello-world.html	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
+    <title>Metadataplayer test with JwPlayer</title>
+    <!--        <link href='open-sans/css/fonts.css' rel='stylesheet' type='text/css'>
+-->
+    <link href="/src/main.module.css" rel="stylesheet" type="text/css" />
+  </head>
+
+  <body>
+    <h1>Metadataplayer test with JwPlayer</h1>
+    <div id="LdtPlayer"></div>
+    <div id="AnnotationsListContainer"></div>
+    <script type="module">
+      import LdtPlayerCore from "/src/main.js";
+      document.addEventListener("DOMContentLoaded", (event) => {
+        const IriSP = LdtPlayerCore.IriSP;
+        IriSP.language = "fr";
+        IriSP.widgetsDir = "metadataplayer";
+        var _metadata = {
+          //        url: 'json/ldt-jwplayer.json',
+          url: "https://ldt.iri.centrepompidou.fr/ldtplatform/ldt/cljson/id/e2f36e5c-8b26-11e2-a28d-00145ea4a2be",
+          //        url: 'http://capsicum/pf/ldtplatform/ldt/cljson/id/f1a17368-2bc8-11e1-b21a-00145ea49a02',
+          //        url: 'http://ldt.iri.centrepompidou.fr/ldtplatform/ldt/cljson/id/fc0a654e-49ea-11e2-b4ad-00145ea4a2be',
+          // dataType: "json",
+          format: "ldt",
+        };
+        var _config = {
+          width: 550,
+          container: "LdtPlayer",
+          default_options: {
+            metadata: _metadata,
+          },
+          widgets: [
+            {
+              type: "HelloWorld",
+            },
+            //            { type: "Trace",
+            //            js_console: true }
+          ],
+        };
+
+        var _myPlayer = new IriSP.Metadataplayer(_config);
+      });
+    </script>
+  </body>
+</html>
--- a/test/index.htm	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,23 +0,0 @@
-<!doctype html>
-<html>
-
-    <head>
-        <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
-        <title>Metadataplayer test configurations</title>
-        <link href='open-sans/css/fonts.css' rel='stylesheet' type='text/css'>
-        <link href='test.css' rel='stylesheet' type='text/css'>
-    </head>
-
-    <body>
-        <h1>Metadataplayer test configurations</h1>
-        <ul class="pageindex">
-            <li><h2><a href="placeholderplayer.htm">with Placeholder Player instead of video</a></h2></li>
-            <li><h2><a href="jwplayer.htm">with JwPlayer (default on Ldt Platform, uses custom player functions)</a></h2></li>
-            <li><h2><a href="oggvideo.htm">with HTML5/OGG (compatible with Firefox and Chrome)</a></h2></li>
-            <li><h2><a href="mp4video.htm">with MP4 (HTML5 with compatible browsers, JwPlayer with others)</a></h2></li>
-            <li><h2><a href="youtube.htm">with Youtube (uses Popcorn.js and the Popcorn Youtube plugin/player)</a></h2></li>
-            <li><h2><a href="vimeo.htm">with Vimeo (uses Popcorn.js and the Popcorn Vimeo plugin/player)</a></h2></li>
-            <li><h2><a href="dailymotion.htm">with Dailymotion (uses custom player functions)</a></h2></li>
-        </ul>
-    </body>
-</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/index.html	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,23 @@
+<!doctype html>
+<html>
+
+    <head>
+        <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
+        <title>Metadataplayer test configurations</title>
+        <link href='open-sans/css/fonts.css' rel='stylesheet' type='text/css'>
+        <link href='test.css' rel='stylesheet' type='text/css'>
+    </head>
+
+    <body>
+        <h1>Metadataplayer test configurations</h1>
+        <ul class="pageindex">
+            <li><h2><a href="placeholderplayer.htm">with Placeholder Player instead of video</a></h2></li>
+            <li><h2><a href="jwplayer.htm">with JwPlayer (default on Ldt Platform, uses custom player functions)</a></h2></li>
+            <li><h2><a href="oggvideo.htm">with HTML5/OGG (compatible with Firefox and Chrome)</a></h2></li>
+            <li><h2><a href="mp4video.htm">with MP4 (HTML5 with compatible browsers, JwPlayer with others)</a></h2></li>
+            <li><h2><a href="youtube.htm">with Youtube (uses Popcorn.js and the Popcorn Youtube plugin/player)</a></h2></li>
+            <li><h2><a href="vimeo.htm">with Vimeo (uses Popcorn.js and the Popcorn Vimeo plugin/player)</a></h2></li>
+            <li><h2><a href="dailymotion.htm">with Dailymotion (uses custom player functions)</a></h2></li>
+        </ul>
+    </body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/iri-ressources_embed.html	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,217 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
+    <title>Metadataplayer test with iriressources</title>
+    <!--        <link href='open-sans/css/fonts.css' rel='stylesheet' type='text/css'>
+-->
+    <link href="test.css" rel="stylesheet" type="text/css" />
+    <link href="/src/main.module.css" rel="stylesheet" type="text/css" />
+  </head>
+
+  <body>
+    <h1>Metadataplayer test with iri ressources</h1>
+
+    <div id="ld-video-embed">
+      <div
+        id="player_project_330760fc-a31f-11e5-8011-00145ea4a2be_embed"
+        style="float: left; width: 550; margin-bottom: 20px; margin-top: 20px"
+        class="iri_player_embed"
+      ></div>
+      <script type="module">
+        import LdtPlayerCore from "/src/main.js";
+        if (typeof jQuery == "undefined") {
+          jQuery = IriSP.jQuery;
+        }
+        var metadatas = {
+          metadata: {
+            url: "https://ldt.iri.centrepompidou.fr/ldtplatform/api/ldt/1.0/contents/all/84762f8c-a31e-11e5-8011-00145ea4a2be/",
+          },
+        };
+        var metadata_key = "metadata";
+        IriSP.libFiles.defaultDir =
+          "https://ldt.iri.centrepompidou.fr/static/site/ldt/js/";
+        IriSP.libFiles.locations.jwPlayerSWF =
+          "https://ldt.iri.centrepompidou.fr/static/site/ldt/swf/player.swf";
+        IriSP.libFiles.locations.recordMicSwf =
+          "https://ldt.iri.centrepompidou.fr/static/site/ldt/swf/record_mic.swf";
+        IriSP.libFiles.locations.zeroClipboardSwf =
+          "https://ldt.iri.centrepompidou.fr/static/site/ldt/swf/ZeroClipboard10.swf";
+        IriSP.libFiles.locations.cssjQueryUI =
+          "https://ldt.iri.centrepompidou.fr/static/site/ldt/css/jq-css/themes/base/jquery-ui.css";
+        IriSP.language = "fr-fr";
+
+        IriSP.widgetsDir =
+          "https://ldt.iri.centrepompidou.fr/static/site/ldt/metadataplayer";
+        var _metadata = {
+          url: metadatas[metadata_key].url,
+          format: "ldt",
+        };
+        var _config = {
+          width: "550",
+          container:
+            "player_project_330760fc-a31f-11e5-8011-00145ea4a2be_embed",
+          css: "https://ldt.iri.centrepompidou.fr/static/site/ldt/metadataplayer/LdtPlayer-core.css",
+          default_options: {
+            metadata: _metadata,
+          },
+          widgets: [
+            {
+              type: "AutoPlayer",
+              streamer: function (_url) {
+                var _matches = _url.match(/^[^\/]+\/\/[^\/]+\/[^\/]+\//);
+                if (_matches) {
+                  return _matches[0];
+                } else {
+                  return _url;
+                }
+              },
+              url_transform: function (url) {
+                // Adaptation to jwplayer 6
+                if (url.substr(url.length - 4).toLowerCase() === ".flv") {
+                  return url.replace(
+                    "/ddc_player/video/",
+                    "/ddc_player/flv:video/"
+                  );
+                }
+                return url.replace(
+                  "/ddc_player/video/",
+                  "/ddc_player/mp4:video/"
+                );
+              },
+              height: 300,
+              autostart: true,
+            },
+            {
+              type: "Slider",
+            },
+            {
+              type: "Controller",
+            },
+            {
+              type: "Mediafragment",
+            },
+            {
+              type: "Polemic",
+              annotation_type: ["tweet"],
+              defaultcolor: "#585858",
+              foundcolor: "#fc00ff",
+              default_version: "3",
+              max_elements: "50",
+              polemics: {
+                1: [
+                  { keywords: ["++"], color: "#1D973D", name: "OK" },
+                  { keywords: ["--"], color: "#CE0A15", name: "KO" },
+                  {
+                    keywords: ["==", "http://"],
+                    color: "#C5A62D",
+                    name: "REF",
+                  },
+                  { keywords: ["?"], color: "#036AAE", name: "Q" },
+                ],
+                3: [
+                  { keywords: ["++"], color: "#196be6", name: "OK" },
+                  { keywords: ["??"], color: "#e6b919", name: "KO" },
+                  {
+                    keywords: ["**", "http://", "https://"],
+                    color: "#e619e6",
+                    name: "REF",
+                  },
+                  { keywords: ["=="], color: "#42e619", name: "Q" },
+                ],
+                2: [
+                  { keywords: ["++"], color: "#1D973D", name: "OK" },
+                  { keywords: ["!!"], color: "#CE0A15", name: "KO" },
+                  {
+                    keywords: ["==", "http://"],
+                    color: "#C5A62D",
+                    name: "REF",
+                  },
+                  { keywords: ["?"], color: "#036AAE", name: "Q" },
+                ],
+              },
+            },
+            {
+              type: "Polemic",
+              annotation_type: ["chat"],
+              defaultcolor: "#9b8864",
+              foundcolor: "#fc00ff",
+              default_version: "3",
+              max_elements: "100",
+              polemics: {
+                1: [
+                  { keywords: ["++"], color: "#1D973D", name: "OK" },
+                  { keywords: ["--"], color: "#CE0A15", name: "KO" },
+                  {
+                    keywords: ["==", "http://"],
+                    color: "#C5A62D",
+                    name: "REF",
+                  },
+                  { keywords: ["?"], color: "#036AAE", name: "Q" },
+                ],
+                3: [
+                  { keywords: ["++"], color: "#196be6", name: "OK" },
+                  { keywords: ["??"], color: "#e6b919", name: "KO" },
+                  {
+                    keywords: ["**", "http://", "https://"],
+                    color: "#e619e6",
+                    name: "REF",
+                  },
+                  { keywords: ["=="], color: "#42e619", name: "Q" },
+                ],
+                2: [
+                  { keywords: ["++"], color: "#1D973D", name: "OK" },
+                  { keywords: ["!!"], color: "#CE0A15", name: "KO" },
+                  {
+                    keywords: ["==", "http://"],
+                    color: "#C5A62D",
+                    name: "REF",
+                  },
+                  { keywords: ["?"], color: "#036AAE", name: "Q" },
+                ],
+              },
+            },
+            {
+              type: "Sparkline",
+              lineColor: "#7492b4",
+              fillColor: "#aeaeb8",
+            },
+            {
+              type: "MultiSegments",
+            },
+            {
+              type: "Annotation",
+              start_minimized: true,
+              site_name: "Lignes de Temps",
+              annotation_type: ["chap", "découpage"],
+            },
+            {
+              type: "Tweet",
+              hide_timeout: 5000,
+            },
+            {
+              type: "AnnotationsList",
+              ajax_url:
+                "https://ldt.iri.centrepompidou.fr/ldtplatform/api/ldt/1.0/segments/bytimecode///",
+              container: "AnnotationsList_ext",
+              ajax_granularity: 300000,
+              default_thumbnail:
+                "http://ldt.iri.centrepompidou.fr/static/site/ldt/css/imgs/video_sequence.png",
+              show_audio: true,
+              rtmp_streamer:
+                "rtmp://media.iri.centrepompidou.fr/ddc_micro_record/",
+            },
+          ],
+        };
+
+        const _myPlayer = new IriSP.Metadataplayer(_config);
+      </script>
+      <div
+        id="AnnotationsList_ext"
+        class="ext_widget Ldt-TraceMe Ldt-Widget"
+        style="float: left; width: 400px; margin-bottom: 10px; margin-top: 10px"
+        widget-type="AnnotationsList"
+      ></div>
+    </div>
+  </body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/iri-ressources_embed_dist.html	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,217 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
+    <title>Metadataplayer test with iriressources</title>
+    <!--        <link href='open-sans/css/fonts.css' rel='stylesheet' type='text/css'>
+-->
+    <link href="test.css" rel="stylesheet" type="text/css" />
+    <link href="/dist/LdtPlayer-core.css" rel="stylesheet" type="text/css" />
+  </head>
+
+  <body>
+    <h1>Metadataplayer test with iri ressources</h1>
+
+    <div id="ld-video-embed">
+      <div
+        id="player_project_330760fc-a31f-11e5-8011-00145ea4a2be_embed"
+        style="float: left; width: 550; margin-bottom: 20px; margin-top: 20px"
+        class="iri_player_embed"
+      ></div>
+      <script type="text/javascript" src="/dist/LdtPlayer-core.js"></script>
+      <script type="text/javascript">
+        if (typeof jQuery == "undefined") {
+          jQuery = IriSP.jQuery;
+        }
+        var metadatas = {
+          metadata: {
+            url: "https://ldt.iri.centrepompidou.fr/ldtplatform/api/ldt/1.0/contents/all/84762f8c-a31e-11e5-8011-00145ea4a2be/",
+          },
+        };
+        var metadata_key = "metadata";
+        IriSP.libFiles.defaultDir =
+          "https://ldt.iri.centrepompidou.fr/static/site/ldt/js/";
+        IriSP.libFiles.locations.jwPlayerSWF =
+          "https://ldt.iri.centrepompidou.fr/static/site/ldt/swf/player.swf";
+        IriSP.libFiles.locations.recordMicSwf =
+          "https://ldt.iri.centrepompidou.fr/static/site/ldt/swf/record_mic.swf";
+        IriSP.libFiles.locations.zeroClipboardSwf =
+          "https://ldt.iri.centrepompidou.fr/static/site/ldt/swf/ZeroClipboard10.swf";
+        IriSP.libFiles.locations.cssjQueryUI =
+          "https://ldt.iri.centrepompidou.fr/static/site/ldt/css/jq-css/themes/base/jquery-ui.css";
+        IriSP.language = "fr-fr";
+
+        IriSP.widgetsDir =
+          "https://ldt.iri.centrepompidou.fr/static/site/ldt/metadataplayer";
+        var _metadata = {
+          url: metadatas[metadata_key].url,
+          format: "ldt",
+        };
+        var _config = {
+          width: "550",
+          container:
+            "player_project_330760fc-a31f-11e5-8011-00145ea4a2be_embed",
+          css: "https://ldt.iri.centrepompidou.fr/static/site/ldt/metadataplayer/LdtPlayer-core.css",
+          default_options: {
+            metadata: _metadata,
+          },
+          widgets: [
+            {
+              type: "AutoPlayer",
+              streamer: function (_url) {
+                var _matches = _url.match(/^[^\/]+\/\/[^\/]+\/[^\/]+\//);
+                if (_matches) {
+                  return _matches[0];
+                } else {
+                  return _url;
+                }
+              },
+              url_transform: function (url) {
+                // Adaptation to jwplayer 6
+                if (url.substr(url.length - 4).toLowerCase() === ".flv") {
+                  return url.replace(
+                    "/ddc_player/video/",
+                    "/ddc_player/flv:video/"
+                  );
+                }
+                return url.replace(
+                  "/ddc_player/video/",
+                  "/ddc_player/mp4:video/"
+                );
+              },
+              height: 300,
+              autostart: true,
+            },
+            {
+              type: "Slider",
+            },
+            {
+              type: "Controller",
+            },
+            {
+              type: "Mediafragment",
+            },
+            {
+              type: "Polemic",
+              annotation_type: ["tweet"],
+              defaultcolor: "#585858",
+              foundcolor: "#fc00ff",
+              default_version: "3",
+              max_elements: "50",
+              polemics: {
+                1: [
+                  { keywords: ["++"], color: "#1D973D", name: "OK" },
+                  { keywords: ["--"], color: "#CE0A15", name: "KO" },
+                  {
+                    keywords: ["==", "http://"],
+                    color: "#C5A62D",
+                    name: "REF",
+                  },
+                  { keywords: ["?"], color: "#036AAE", name: "Q" },
+                ],
+                3: [
+                  { keywords: ["++"], color: "#196be6", name: "OK" },
+                  { keywords: ["??"], color: "#e6b919", name: "KO" },
+                  {
+                    keywords: ["**", "http://", "https://"],
+                    color: "#e619e6",
+                    name: "REF",
+                  },
+                  { keywords: ["=="], color: "#42e619", name: "Q" },
+                ],
+                2: [
+                  { keywords: ["++"], color: "#1D973D", name: "OK" },
+                  { keywords: ["!!"], color: "#CE0A15", name: "KO" },
+                  {
+                    keywords: ["==", "http://"],
+                    color: "#C5A62D",
+                    name: "REF",
+                  },
+                  { keywords: ["?"], color: "#036AAE", name: "Q" },
+                ],
+              },
+            },
+            {
+              type: "Polemic",
+              annotation_type: ["chat"],
+              defaultcolor: "#9b8864",
+              foundcolor: "#fc00ff",
+              default_version: "3",
+              max_elements: "100",
+              polemics: {
+                1: [
+                  { keywords: ["++"], color: "#1D973D", name: "OK" },
+                  { keywords: ["--"], color: "#CE0A15", name: "KO" },
+                  {
+                    keywords: ["==", "http://"],
+                    color: "#C5A62D",
+                    name: "REF",
+                  },
+                  { keywords: ["?"], color: "#036AAE", name: "Q" },
+                ],
+                3: [
+                  { keywords: ["++"], color: "#196be6", name: "OK" },
+                  { keywords: ["??"], color: "#e6b919", name: "KO" },
+                  {
+                    keywords: ["**", "http://", "https://"],
+                    color: "#e619e6",
+                    name: "REF",
+                  },
+                  { keywords: ["=="], color: "#42e619", name: "Q" },
+                ],
+                2: [
+                  { keywords: ["++"], color: "#1D973D", name: "OK" },
+                  { keywords: ["!!"], color: "#CE0A15", name: "KO" },
+                  {
+                    keywords: ["==", "http://"],
+                    color: "#C5A62D",
+                    name: "REF",
+                  },
+                  { keywords: ["?"], color: "#036AAE", name: "Q" },
+                ],
+              },
+            },
+            {
+              type: "Sparkline",
+              lineColor: "#7492b4",
+              fillColor: "#aeaeb8",
+            },
+            {
+              type: "MultiSegments",
+            },
+            {
+              type: "Annotation",
+              start_minimized: true,
+              site_name: "Lignes de Temps",
+              annotation_type: ["chap", "découpage"],
+            },
+            {
+              type: "Tweet",
+              hide_timeout: 5000,
+            },
+            {
+              type: "AnnotationsList",
+              ajax_url:
+                "https://ldt.iri.centrepompidou.fr/ldtplatform/api/ldt/1.0/segments/bytimecode///",
+              container: "AnnotationsList_ext",
+              ajax_granularity: 300000,
+              default_thumbnail:
+                "http://ldt.iri.centrepompidou.fr/static/site/ldt/css/imgs/video_sequence.png",
+              show_audio: true,
+              rtmp_streamer:
+                "rtmp://media.iri.centrepompidou.fr/ddc_micro_record/",
+            },
+          ],
+        };
+
+        _myPlayer = new IriSP.Metadataplayer(_config);
+      </script>
+      <div
+        id="AnnotationsList_ext"
+        class="ext_widget Ldt-TraceMe Ldt-Widget"
+        style="float: left; width: 400px; margin-bottom: 10px; margin-top: 10px"
+        widget-type="AnnotationsList"
+      ></div>
+    </div>
+  </body>
+</html>
--- a/test/jwplayer-audio.htm	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,84 +0,0 @@
-<!doctype html>
-<html>
-
-    <head>
-        <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
-        <title>Metadataplayer test with JwPlayer</title>
-        <link href='open-sans/css/fonts.css' rel='stylesheet' type='text/css'>
-        <link href='test.css' rel='stylesheet' type='text/css'>
-        <script type="text/javascript" src="metadataplayer/LdtPlayer-core.js" type="text/javascript"></script>
-    </head>
-
-    <body>
-        <h1>Metadataplayer test with JwPlayer</h1>
-        <div id="LdtPlayer"></div>
-        <div id="AnnotationsListContainer"></div>
-        <script type="text/javascript">
-    IriSP.libFiles.defaultDir = "libs/";
-    IriSP.language = 'fr';
-    IriSP.widgetsDir = "metadataplayer";
-    var _metadata = {
-        url: 'http://exp.iri.centrepompidou.fr/tralalere/tralalere/ldt/cljson/id/42a3fc0a-afee-11e1-82e8-58b035f6b93d?callback=?',
-        format: 'ldt'
-    };
-    var _config = {
-        width : 550,
-        container : 'LdtPlayer',
-        default_options: {
-            metadata: _metadata
-        },
-        css : 'metadataplayer/LdtPlayer-core.css',
-        widgets: [
-            {
-                type: "JwpPlayer",
-                live: true,
-                width: 1,
-                height: 1,
-                provider: "rtmp",
-                streamer: function(_url) {
-                    var _matches = _url.match(/^[^\/]+\/\/[^\/]+\/[^\/]+\//);
-                    if (_matches) {
-                        return _matches[0];
-                    } else {
-                        return _url;
-                    }
-                }
-            },
-            { type: "Slider" },
-            { type: "Controller" },
-            { type: "Polemic" },
-            { type: "Segments" },
-            { type: "Annotation" },
-            {
-                type: "CreateAnnotation",
-                api_endpoint_template: "post-test.php",
-                creator_name: "Metadataplayer",
-                creator_avatar: "https://si0.twimg.com/sticky/default_profile_images/default_profile_1_normal.png",
-                show_mic_record: true
-            },
-            { type: "Tweet" },
-            {
-                type: "Tagger",
-                api_endpoint: "post-test.php"
-            },
-            {
-                type: "Tagcloud"
-            },
-            {
-                type: "AnnotationsList",
-                container: "AnnotationsListContainer",
-                default_thumbnail : "http://ldt.iri.centrepompidou.fr/static/site/ldt/css/imgs/video_sequence.png",
-                show_audio: true,
-                rtmp_streamer: "rtmp://media.iri.centrepompidou.fr/ddc_micro_record/"
-                //ajax_url: "/pf/ldtplatform/api/ldt/segments/{{media}}/{{begin}}/{{end}}",
-                //ajax_granularity : 300000
-            },
-            { type: "Mediafragment"}
-        ]
-    };
-    
-    var _myPlayer = new IriSP.Metadataplayer(_config);
-    
-        </script>
-    </body>
-</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jwplayer-audio.html	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,84 @@
+<!doctype html>
+<html>
+
+    <head>
+        <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
+        <title>Metadataplayer test with JwPlayer</title>
+        <link href='open-sans/css/fonts.css' rel='stylesheet' type='text/css'>
+        <link href='test.css' rel='stylesheet' type='text/css'>
+        <script type="text/javascript" src="metadataplayer/LdtPlayer-core.js" type="text/javascript"></script>
+    </head>
+
+    <body>
+        <h1>Metadataplayer test with JwPlayer</h1>
+        <div id="LdtPlayer"></div>
+        <div id="AnnotationsListContainer"></div>
+        <script type="text/javascript">
+    IriSP.libFiles.defaultDir = "libs/";
+    IriSP.language = 'fr';
+    IriSP.widgetsDir = "metadataplayer";
+    var _metadata = {
+        url: 'http://exp.iri.centrepompidou.fr/tralalere/tralalere/ldt/cljson/id/42a3fc0a-afee-11e1-82e8-58b035f6b93d?callback=?',
+        format: 'ldt'
+    };
+    var _config = {
+        width : 550,
+        container : 'LdtPlayer',
+        default_options: {
+            metadata: _metadata
+        },
+        css : 'metadataplayer/LdtPlayer-core.css',
+        widgets: [
+            {
+                type: "JwpPlayer",
+                live: true,
+                width: 1,
+                height: 1,
+                provider: "rtmp",
+                streamer: function(_url) {
+                    var _matches = _url.match(/^[^\/]+\/\/[^\/]+\/[^\/]+\//);
+                    if (_matches) {
+                        return _matches[0];
+                    } else {
+                        return _url;
+                    }
+                }
+            },
+            { type: "Slider" },
+            { type: "Controller" },
+            { type: "Polemic" },
+            { type: "Segments" },
+            { type: "Annotation" },
+            {
+                type: "CreateAnnotation",
+                api_endpoint_template: "post-test.php",
+                creator_name: "Metadataplayer",
+                creator_avatar: "https://si0.twimg.com/sticky/default_profile_images/default_profile_1_normal.png",
+                show_mic_record: true
+            },
+            { type: "Tweet" },
+            {
+                type: "Tagger",
+                api_endpoint: "post-test.php"
+            },
+            {
+                type: "Tagcloud"
+            },
+            {
+                type: "AnnotationsList",
+                container: "AnnotationsListContainer",
+                default_thumbnail : "http://ldt.iri.centrepompidou.fr/static/site/ldt/css/imgs/video_sequence.png",
+                show_audio: true,
+                rtmp_streamer: "rtmp://media.iri.centrepompidou.fr/ddc_micro_record/"
+                //ajax_url: "/pf/ldtplatform/api/ldt/segments/{{media}}/{{begin}}/{{end}}",
+                //ajax_granularity : 300000
+            },
+            { type: "Mediafragment"}
+        ]
+    };
+    
+    var _myPlayer = new IriSP.Metadataplayer(_config);
+    
+        </script>
+    </body>
+</html>
--- a/test/jwplayer.htm	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,89 +0,0 @@
-<!doctype html>
-<html>
-
-    <head>
-        <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
-        <title>Metadataplayer test with JwPlayer</title>
-<!--        <link href='open-sans/css/fonts.css' rel='stylesheet' type='text/css'>
--->        <link href='test.css' rel='stylesheet' type='text/css'>
-        <script type="text/javascript" src="metadataplayer/LdtPlayer-core.js" type="text/javascript"></script>
-    </head>
-
-    <body>
-        <h1>Metadataplayer test with JwPlayer</h1>
-        <div id="LdtPlayer"></div>
-        <div id="AnnotationsListContainer"></div>
-        <div id="SlideShareContainer"></div>
-        <script type="text/javascript">
-    IriSP.libFiles.defaultDir = "libs/";
-    IriSP.language = 'fr';
-    IriSP.widgetsDir = "metadataplayer";
-    var _metadata = {
-//        url: 'json/ldt-jwplayer.json',
-          url: 'http://ldt.iri.centrepompidou.fr/ldtplatform/ldt/cljson/id/e2f36e5c-8b26-11e2-a28d-00145ea4a2be',
-//        url: 'http://capsicum/pf/ldtplatform/ldt/cljson/id/f1a17368-2bc8-11e1-b21a-00145ea49a02',
-//        url: 'http://ldt.iri.centrepompidou.fr/ldtplatform/ldt/cljson/id/fc0a654e-49ea-11e2-b4ad-00145ea4a2be',
-        format: 'ldt'
-    };
-    var _config = {
-        width : 550,
-        container : 'LdtPlayer',
-        default_options: {
-            metadata: _metadata
-        },
-        css : 'metadataplayer/LdtPlayer-core.css',
-        widgets: [
-            {
-                type: "JwpPlayer",
-                autostart: true,
-                url_transform: function(url) {
-                    return url.replace('/ddc_player/video/','/ddc_player/mp4:video/');
-                }
-            },
-            { type: "Slider" },
-            { type: "Controller" },
-            {
-                type: "Polemic",
-                max_elements: 20,
-                annotation_type: false
-            },
-            { type: "Sparkline" },
-            { type: "MultiSegments" },
-            {
-                type: "CreateAnnotation",
-                api_endpoint_template: "post-test.php",
-                creator_name: "Metadataplayer",
-                creator_avatar: "https://si0.twimg.com/sticky/default_profile_images/default_profile_1_normal.png",
-                tag_titles: ["amateur", "digital-humanities"],
-                //show_title_field: false,
-                //show_creator_field: false,
-                show_slice: false
-            },
-            {
-                type: "Tweet"
-            },
-            {
-                type: "Tagcloud"
-            },
-            {
-                type: "AnnotationsList",
-                container: "AnnotationsListContainer",
-                default_thumbnail : "http://ldt.iri.centrepompidou.fr/static/site/ldt/css/imgs/video_sequence.png",
-                //ajax_url: "/pf/ldtplatform/api/ldt/1.0/segments/bytimecode/{{media}}/{{begin}}/{{end}}",
-                //ajax_granularity : 300000
-            },
-            {
-                type: "Slideshare",
-                container: "SlideShareContainer"
-            },
-            { type: "Mediafragment"},
-//            { type: "Trace",
-//            js_console: true }
-        ]
-    };
-    
-    var _myPlayer = new IriSP.Metadataplayer(_config);
-    
-        </script>
-    </body>
-</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jwplayer.html	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,87 @@
+<!doctype html>
+<html>
+
+    <head>
+        <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
+        <title>Metadataplayer test with JwPlayer</title>
+<!--        <link href='open-sans/css/fonts.css' rel='stylesheet' type='text/css'>
+-->        <link href='test.css' rel='stylesheet' type='text/css'>
+           <link href="/src/main.module.css" rel="stylesheet" type="text/css" />
+    </head>
+
+    <body>
+        <h1>Metadataplayer test with JwPlayer</h1>
+        <div id="LdtPlayer"></div>
+        <div id="AnnotationsListContainer"></div>
+        <div id="SlideShareContainer"></div>
+        <script type="module">
+      import LdtPlayerCore from "/src/main.js";
+    IriSP.language = 'fr';
+    var _metadata = {
+//        url: 'json/ldt-jwplayer.json',
+          url: 'https://ldt.iri.centrepompidou.fr/ldtplatform/ldt/cljson/id/e2f36e5c-8b26-11e2-a28d-00145ea4a2be',
+//        url: 'http://capsicum/pf/ldtplatform/ldt/cljson/id/f1a17368-2bc8-11e1-b21a-00145ea49a02',
+//        url: 'http://ldt.iri.centrepompidou.fr/ldtplatform/ldt/cljson/id/fc0a654e-49ea-11e2-b4ad-00145ea4a2be',
+        format: 'ldt'
+    };
+    var _config = {
+        width : 550,
+        container : 'LdtPlayer',
+        default_options: {
+            metadata: _metadata
+        },
+        widgets: [
+            {
+                type: "HtmlPlayer",
+                autostart: true,
+                url_transform: function(url) {
+                    return url.replace('/ddc_player/video/','/ddc_player/mp4:video/');
+                }
+            },
+            { type: "Slider" },
+            { type: "Controller" },
+            {
+                type: "Polemic",
+                max_elements: 20,
+                annotation_type: false
+            },
+            { type: "Sparkline" },
+            { type: "MultiSegments" },
+            {
+                type: "CreateAnnotation",
+                api_endpoint_template: "post-test.php",
+                creator_name: "Metadataplayer",
+                creator_avatar: "https://pbs.twimg.com/profile_images/2284174872/7df3h38zabcvjylnyfe3_normal.png",
+                tag_titles: ["amateur", "digital-humanities"],
+                //show_title_field: false,
+                //show_creator_field: false,
+                show_slice: false
+            },
+            {
+                type: "Tweet"
+            },
+            {
+                type: "Tagcloud"
+            },
+            {
+                type: "AnnotationsList",
+                container: "AnnotationsListContainer",
+                default_thumbnail : "https://ldt.iri.centrepompidou.fr/static/site/ldt/css/imgs/video_sequence.png",
+                //ajax_url: "/pf/ldtplatform/api/ldt/1.0/segments/bytimecode/{{media}}/{{begin}}/{{end}}",
+                //ajax_granularity : 300000
+            },
+            // {
+            //     type: "Slideshare",
+            //     container: "SlideShareContainer"
+            // },
+            { type: "Mediafragment"},
+//            { type: "Trace",
+//            js_console: true }
+        ]
+    };
+    
+    var _myPlayer = new IriSP.Metadataplayer(_config);
+    
+        </script>
+    </body>
+</html>
--- a/test/mp4video.htm	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,54 +0,0 @@
-<!doctype html>
-<html>
-
-    <head>
-        <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
-        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
-        <title>Metadataplayer test with HTML5 / OGG Video</title>
-        <link href='open-sans/css/fonts.css' rel='stylesheet' type='text/css'>
-        <link href='test.css' rel='stylesheet' type='text/css'>
-        <script type="text/javascript" src="metadataplayer/LdtPlayer-core.js" type="text/javascript"></script>
-    </head>
-
-    <body>
-        <h1>Metadataplayer test with HTML5 / H.264 Video - Uses Popcorn with compatible browsers, JwPlayer with others</h1>
-        <div id="LdtPlayer"></div>
-        <div id="AnnotationsListContainer"></div>
-        <script type="text/javascript">
-IriSP.libFiles.defaultDir = "libs/";
-IriSP.widgetsDir = "metadataplayer";
-var _metadata = {
-    url: "json/ldt-ogv.json",
-    format: 'ldt'
-};
-var _config = {
-    width : 550,
-    container : 'LdtPlayer',
-    default_options: {
-        metadata: _metadata
-    },
-    css : 'metadataplayer/LdtPlayer-core.css',
-    widgets: [
-        {
-            type: "AdaptivePlayer",
-            video: "http://media.iri.centrepompidou.fr/video/mashup/texaverybannedcartoonsuncletomscabana1947.mp4"
-        },
-        { type: "Sparkline" },
-        { type: "Slider" },
-        { type: "Controller" },
-        { type: "Polemic" },
-        { type: "Segments" },
-        { type: "Annotation" },
-        { type: "Tweet" },
-        { type: "Tagcloud" },
-        {
-            type: "AnnotationsList",
-            container: "AnnotationsListContainer"
-        },
-        { type: "Mediafragment"}
-    ]
-};
-_myPlayer = new IriSP.Metadataplayer(_config);
-        </script>
-    </body>
-</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/mp4video.html	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,54 @@
+<!doctype html>
+<html>
+
+    <head>
+        <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
+        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
+        <title>Metadataplayer test with HTML5 / OGG Video</title>
+        <link href='open-sans/css/fonts.css' rel='stylesheet' type='text/css'>
+        <link href='test.css' rel='stylesheet' type='text/css'>
+        <script type="text/javascript" src="metadataplayer/LdtPlayer-core.js" type="text/javascript"></script>
+    </head>
+
+    <body>
+        <h1>Metadataplayer test with HTML5 / H.264 Video - Uses Popcorn with compatible browsers, JwPlayer with others</h1>
+        <div id="LdtPlayer"></div>
+        <div id="AnnotationsListContainer"></div>
+        <script type="text/javascript">
+IriSP.libFiles.defaultDir = "libs/";
+IriSP.widgetsDir = "metadataplayer";
+var _metadata = {
+    url: "json/ldt-ogv.json",
+    format: 'ldt'
+};
+var _config = {
+    width : 550,
+    container : 'LdtPlayer',
+    default_options: {
+        metadata: _metadata
+    },
+    css : 'metadataplayer/LdtPlayer-core.css',
+    widgets: [
+        {
+            type: "AdaptivePlayer",
+            video: "http://media.iri.centrepompidou.fr/video/mashup/texaverybannedcartoonsuncletomscabana1947.mp4"
+        },
+        { type: "Sparkline" },
+        { type: "Slider" },
+        { type: "Controller" },
+        { type: "Polemic" },
+        { type: "Segments" },
+        { type: "Annotation" },
+        { type: "Tweet" },
+        { type: "Tagcloud" },
+        {
+            type: "AnnotationsList",
+            container: "AnnotationsListContainer"
+        },
+        { type: "Mediafragment"}
+    ]
+};
+_myPlayer = new IriSP.Metadataplayer(_config);
+        </script>
+    </body>
+</html>
--- a/test/oggvideo.htm	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,50 +0,0 @@
-<!doctype html>
-<html>
-
-    <head>
-        <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
-        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
-        <title>Metadataplayer test with HTML5 / OGG Video</title>
-        <link href='open-sans/css/fonts.css' rel='stylesheet' type='text/css'>
-        <link href='test.css' rel='stylesheet' type='text/css'>
-        <script type="text/javascript" src="metadataplayer/LdtPlayer-core.js" type="text/javascript"></script>
-    </head>
-
-    <body>
-        <h1>Metadataplayer test with HTML5 / OGG Video - Does not work with IE and Safari</h1>
-        <div id="LdtPlayer"></div>
-        <div id="AnnotationsListContainer"></div>
-        <script type="text/javascript">
-IriSP.libFiles.defaultDir = "libs/";
-IriSP.widgetsDir = "metadataplayer";
-var _metadata = {
-    url: "json/ldt-ogv.json",
-    format: 'ldt'
-};
-var _config = {
-    width : 460,
-    container : 'LdtPlayer',
-    default_options: {
-        metadata: _metadata
-    },
-    css : 'metadataplayer/LdtPlayer-core.css',
-    widgets: [
-        { type: "AutoPlayer" },
-        { type: "Slider" },
-        { type: "Controller" },
-        { type: "Polemic" },
-        { type: "Segments" },
-        { type: "Annotation" },
-        { type: "Tweet" },
-        { type: "Tagcloud" },
-        {
-            type: "AnnotationsList",
-            container: "AnnotationsListContainer"
-        },
-        { type: "Mediafragment"}
-    ]
-};
-_myPlayer = new IriSP.Metadataplayer(_config);
-        </script>
-    </body>
-</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/oggvideo.html	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,50 @@
+<!doctype html>
+<html>
+
+    <head>
+        <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
+        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
+        <title>Metadataplayer test with HTML5 / OGG Video</title>
+        <link href='open-sans/css/fonts.css' rel='stylesheet' type='text/css'>
+        <link href='test.css' rel='stylesheet' type='text/css'>
+        <script type="text/javascript" src="metadataplayer/LdtPlayer-core.js" type="text/javascript"></script>
+    </head>
+
+    <body>
+        <h1>Metadataplayer test with HTML5 / OGG Video - Does not work with IE and Safari</h1>
+        <div id="LdtPlayer"></div>
+        <div id="AnnotationsListContainer"></div>
+        <script type="text/javascript">
+IriSP.libFiles.defaultDir = "libs/";
+IriSP.widgetsDir = "metadataplayer";
+var _metadata = {
+    url: "json/ldt-ogv.json",
+    format: 'ldt'
+};
+var _config = {
+    width : 460,
+    container : 'LdtPlayer',
+    default_options: {
+        metadata: _metadata
+    },
+    css : 'metadataplayer/LdtPlayer-core.css',
+    widgets: [
+        { type: "AutoPlayer" },
+        { type: "Slider" },
+        { type: "Controller" },
+        { type: "Polemic" },
+        { type: "Segments" },
+        { type: "Annotation" },
+        { type: "Tweet" },
+        { type: "Tagcloud" },
+        {
+            type: "AnnotationsList",
+            container: "AnnotationsListContainer"
+        },
+        { type: "Mediafragment"}
+    ]
+};
+_myPlayer = new IriSP.Metadataplayer(_config);
+        </script>
+    </body>
+</html>
--- a/test/onthefly.htm	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,71 +0,0 @@
-<!doctype html>
-<html>
-
-    <head>
-        <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
-        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
-        <title>Metadataplayer test with HTML5 / OGG Video</title>
-        <link href='open-sans/css/fonts.css' rel='stylesheet' type='text/css'>
-        <link href='test.css' rel='stylesheet' type='text/css'>
-        <script type="text/javascript" src="metadataplayer/LdtPlayer-core.js" type="text/javascript"></script>
-        <script type="text/javascript" src="libs/underscore-min.js" type="text/javascript"></script>
-    </head>
-
-    <body>
-        <h1>Metadataplayer test with HTML5 / H.264 Video - Uses Popcorn with compatible browsers, JwPlayer with others</h1>
-        <div id="LdtPlayer"></div>
-        <div id="AnnotationsListContainer"></div>
-        <script type="text/javascript">
-IriSP._ = _;
-IriSP.libFiles.defaultDir = "libs/";
-IriSP.widgetsDir = "metadataplayer";
-var _dir = new IriSP.Model.Directory(),
-    _src = _dir.newLocalSource(),
-    _media = new IriSP.Model.Media(false, _src),
-    _cutt = new IriSP.Model.AnnotationType(false, _src),
-    _ann1 = new IriSP.Model.Annotation(false, _src),
-    _ann2 = new IriSP.Model.Annotation(false, _src);
-_cutt.title = "Chapitrage";
-_ann1.setAnnotationType(_cutt.id);
-_ann2.setAnnotationType(_cutt.id);
-_ann1.setMedia(_media.id);
-_ann2.setMedia(_media.id);
-_ann1.setBegin(0);
-_ann1.setEnd(32000);
-_ann1.title = "Première Annotation";
-_ann2.setBegin(32000);
-_ann2.setEnd(64000);
-_ann2.title = "Deuxième Annotation";
-_media.video = "trailer.mp4";
-_media.setDuration(64000);
-console.log("OK");
-var _config = {
-    width : 620,
-    container : 'LdtPlayer',
-    default_options: {
-        metadata: _src
-    },
-    css : 'metadataplayer/LdtPlayer-core.css',
-    widgets: [
-        {
-            type: "AdaptivePlayer"
-        },
-        { type: "Sparkline" },
-        { type: "Slider" },
-        { type: "Controller" },
-        { type: "Polemic" },
-        { type: "Segments" },
-        { type: "Annotation" },
-        { type: "Tweet" },
-        { type: "Tagcloud" },
-        {
-            type: "AnnotationsList",
-            container: "AnnotationsListContainer"
-        },
-        { type: "Mediafragment"}
-    ]
-};
-_myPlayer = new IriSP.Metadataplayer(_config);
-        </script>
-    </body>
-</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/onthefly.html	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,71 @@
+<!doctype html>
+<html>
+
+    <head>
+        <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
+        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
+        <title>Metadataplayer test with HTML5 / OGG Video</title>
+        <link href='open-sans/css/fonts.css' rel='stylesheet' type='text/css'>
+        <link href='test.css' rel='stylesheet' type='text/css'>
+        <script type="text/javascript" src="metadataplayer/LdtPlayer-core.js" type="text/javascript"></script>
+        <script type="text/javascript" src="libs/underscore-min.js" type="text/javascript"></script>
+    </head>
+
+    <body>
+        <h1>Metadataplayer test with HTML5 / H.264 Video - Uses Popcorn with compatible browsers, JwPlayer with others</h1>
+        <div id="LdtPlayer"></div>
+        <div id="AnnotationsListContainer"></div>
+        <script type="text/javascript">
+IriSP._ = _;
+IriSP.libFiles.defaultDir = "libs/";
+IriSP.widgetsDir = "metadataplayer";
+var _dir = new IriSP.Model.Directory(),
+    _src = _dir.newLocalSource(),
+    _media = new IriSP.Model.Media(false, _src),
+    _cutt = new IriSP.Model.AnnotationType(false, _src),
+    _ann1 = new IriSP.Model.Annotation(false, _src),
+    _ann2 = new IriSP.Model.Annotation(false, _src);
+_cutt.title = "Chapitrage";
+_ann1.setAnnotationType(_cutt.id);
+_ann2.setAnnotationType(_cutt.id);
+_ann1.setMedia(_media.id);
+_ann2.setMedia(_media.id);
+_ann1.setBegin(0);
+_ann1.setEnd(32000);
+_ann1.title = "Première Annotation";
+_ann2.setBegin(32000);
+_ann2.setEnd(64000);
+_ann2.title = "Deuxième Annotation";
+_media.video = "trailer.mp4";
+_media.setDuration(64000);
+console.log("OK");
+var _config = {
+    width : 620,
+    container : 'LdtPlayer',
+    default_options: {
+        metadata: _src
+    },
+    css : 'metadataplayer/LdtPlayer-core.css',
+    widgets: [
+        {
+            type: "AdaptivePlayer"
+        },
+        { type: "Sparkline" },
+        { type: "Slider" },
+        { type: "Controller" },
+        { type: "Polemic" },
+        { type: "Segments" },
+        { type: "Annotation" },
+        { type: "Tweet" },
+        { type: "Tagcloud" },
+        {
+            type: "AnnotationsList",
+            container: "AnnotationsListContainer"
+        },
+        { type: "Mediafragment"}
+    ]
+};
+_myPlayer = new IriSP.Metadataplayer(_config);
+        </script>
+    </body>
+</html>
--- a/test/placeholderplayer.htm	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,61 +0,0 @@
-<!doctype html>
-<html>
-
-    <head>
-        <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
-        <title>Metadataplayer test with Placeholder Player</title>
-<!--        <link href='open-sans/css/fonts.css' rel='stylesheet' type='text/css'>
--->        <link href='test.css' rel='stylesheet' type='text/css'>
-        <script type="text/javascript" src="metadataplayer/LdtPlayer-core.js" type="text/javascript"></script>
-    </head>
-
-    <body>
-        <h1>Metadataplayer test with Placeholder Player</h1>
-        <div id="LdtPlayer"></div>
-        <div id="AnnotationsListContainer"></div>
-        <div id="SlideShareContainer"></div>
-        <script type="text/javascript">
-    IriSP.libFiles.defaultDir = "libs/";
-    IriSP.language = 'fr';
-    IriSP.widgetsDir = "metadataplayer";
-    var _metadata = {
-        url: 'json/ldt-jwplayer.json',
-        format: 'ldt'
-    };
-    var _config = {
-        width : 550,
-        container : 'LdtPlayer',
-        default_options: {
-            metadata: _metadata
-        },
-        css : 'metadataplayer/LdtPlayer-core.css',
-        widgets: [
-            {
-                type: "PlaceholderPlayer"
-            },
-            { type: "Slider" },
-            { type: "Controller" },
-            {
-                type: "Polemic",
-                max_elements: 20
-            },
-            { type: "Sparkline" },
-            { type: "MultiSegments" },
-            { type: "Tweet" },
-            {
-                type: "Tagcloud"
-            },
-            {
-                type: "AnnotationsList",
-                container: "AnnotationsListContainer",
-                default_thumbnail : "http://ldt.iri.centrepompidou.fr/static/site/ldt/css/imgs/video_sequence.png",
-            },
-            { type: "Mediafragment"}
-        ]
-    };
-
-    var _myPlayer = new IriSP.Metadataplayer(_config);
-
-        </script>
-    </body>
-</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/placeholderplayer.html	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,61 @@
+<!doctype html>
+<html>
+
+    <head>
+        <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
+        <title>Metadataplayer test with Placeholder Player</title>
+<!--        <link href='open-sans/css/fonts.css' rel='stylesheet' type='text/css'>
+-->        <link href='test.css' rel='stylesheet' type='text/css'>
+        <script type="text/javascript" src="metadataplayer/LdtPlayer-core.js" type="text/javascript"></script>
+    </head>
+
+    <body>
+        <h1>Metadataplayer test with Placeholder Player</h1>
+        <div id="LdtPlayer"></div>
+        <div id="AnnotationsListContainer"></div>
+        <div id="SlideShareContainer"></div>
+        <script type="text/javascript">
+    IriSP.libFiles.defaultDir = "libs/";
+    IriSP.language = 'fr';
+    IriSP.widgetsDir = "metadataplayer";
+    var _metadata = {
+        url: 'json/ldt-jwplayer.json',
+        format: 'ldt'
+    };
+    var _config = {
+        width : 550,
+        container : 'LdtPlayer',
+        default_options: {
+            metadata: _metadata
+        },
+        css : 'metadataplayer/LdtPlayer-core.css',
+        widgets: [
+            {
+                type: "PlaceholderPlayer"
+            },
+            { type: "Slider" },
+            { type: "Controller" },
+            {
+                type: "Polemic",
+                max_elements: 20
+            },
+            { type: "Sparkline" },
+            { type: "MultiSegments" },
+            { type: "Tweet" },
+            {
+                type: "Tagcloud"
+            },
+            {
+                type: "AnnotationsList",
+                container: "AnnotationsListContainer",
+                default_thumbnail : "http://ldt.iri.centrepompidou.fr/static/site/ldt/css/imgs/video_sequence.png",
+            },
+            { type: "Mediafragment"}
+        ]
+    };
+
+    var _myPlayer = new IriSP.Metadataplayer(_config);
+
+        </script>
+    </body>
+</html>
--- a/test/renkan.htm	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,81 +0,0 @@
-<!doctype html>
-<html>
-
-    <head>
-        <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
-        <title>Metadataplayer test with Renkan</title>
-        <link href='open-sans/css/fonts.css' rel='stylesheet' type='text/css'>
-        <link href='test.css' rel='stylesheet' type='text/css'>
-        <script type="text/javascript" src="metadataplayer/LdtPlayer-core.js" type="text/javascript"></script>
-        <style type="text/css">
-        #MainContainer {
-            width: 1180px;
-            margin: 0 auto;
-        }
-        #RenkanContainer {
-            float: left;
-            width: 600px;
-            height: 500px;
-            margin: 5px;
-        }
-        </style>
-    </head>
-
-    <body>
-        <h1>Metadataplayer test with Renkan</h1>
-        <div id="MainContainer">
-            <div id="LdtPlayer"></div>
-            <div id="RenkanContainer"></div>
-        </div>
-        <script type="text/javascript">
-IriSP.libFiles.defaultDir = "libs/";
-IriSP.language = 'fr';
-IriSP.widgetsDir = "metadataplayer";
-var _metadata = {
-//        url: 'json/ldt-jwplayer.json',
-    url: 'http://ldt.iri.centrepompidou.fr/ldtplatform/ldt/cljson/id/67280b1c-ff30-11e0-a82d-00145ea49a02?callback=?',
-    format: 'ldt'
-};
-var _config = {
-    width : 550,
-    container : 'LdtPlayer',
-    default_options: {
-        metadata: _metadata
-    },
-    css : 'metadataplayer/LdtPlayer-core.css',
-    widgets: [
-        {
-            type: "JwpPlayer",
-            live: true, 
-            height: 350, 
-            width: 550, 
-            provider: "rtmp",
-            streamer: function(_url) {
-                var _matches = _url.match(/^[^\/]+\/\/[^\/]+\/[^\/]+\//);
-                if (_matches) {
-                    return _matches[0];
-                } else {
-                    return _url;
-                }
-            }
-        },
-        { type: "Slider" },
-        { type: "Controller" },
-        { type: "Polemic" },
-        { type: "Segments" },
-        { type: "Annotation" },
-        { type: "Tweet" },
-        {
-            type: "Renkan",
-            container: "RenkanContainer",
-            data: "json/renkan.json"
-        },
-        { type: "Mediafragment"}
-    ]
-};
-
-var _myPlayer = new IriSP.Metadataplayer(_config);
-    
-        </script>
-    </body>
-</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/renkan.html	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,81 @@
+<!doctype html>
+<html>
+
+    <head>
+        <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
+        <title>Metadataplayer test with Renkan</title>
+        <link href='open-sans/css/fonts.css' rel='stylesheet' type='text/css'>
+        <link href='test.css' rel='stylesheet' type='text/css'>
+        <script type="text/javascript" src="metadataplayer/LdtPlayer-core.js" type="text/javascript"></script>
+        <style type="text/css">
+        #MainContainer {
+            width: 1180px;
+            margin: 0 auto;
+        }
+        #RenkanContainer {
+            float: left;
+            width: 600px;
+            height: 500px;
+            margin: 5px;
+        }
+        </style>
+    </head>
+
+    <body>
+        <h1>Metadataplayer test with Renkan</h1>
+        <div id="MainContainer">
+            <div id="LdtPlayer"></div>
+            <div id="RenkanContainer"></div>
+        </div>
+        <script type="text/javascript">
+IriSP.libFiles.defaultDir = "libs/";
+IriSP.language = 'fr';
+IriSP.widgetsDir = "metadataplayer";
+var _metadata = {
+//        url: 'json/ldt-jwplayer.json',
+    url: 'http://ldt.iri.centrepompidou.fr/ldtplatform/ldt/cljson/id/67280b1c-ff30-11e0-a82d-00145ea49a02?callback=?',
+    format: 'ldt'
+};
+var _config = {
+    width : 550,
+    container : 'LdtPlayer',
+    default_options: {
+        metadata: _metadata
+    },
+    css : 'metadataplayer/LdtPlayer-core.css',
+    widgets: [
+        {
+            type: "JwpPlayer",
+            live: true, 
+            height: 350, 
+            width: 550, 
+            provider: "rtmp",
+            streamer: function(_url) {
+                var _matches = _url.match(/^[^\/]+\/\/[^\/]+\/[^\/]+\//);
+                if (_matches) {
+                    return _matches[0];
+                } else {
+                    return _url;
+                }
+            }
+        },
+        { type: "Slider" },
+        { type: "Controller" },
+        { type: "Polemic" },
+        { type: "Segments" },
+        { type: "Annotation" },
+        { type: "Tweet" },
+        {
+            type: "Renkan",
+            container: "RenkanContainer",
+            data: "json/renkan.json"
+        },
+        { type: "Mediafragment"}
+    ]
+};
+
+var _myPlayer = new IriSP.Metadataplayer(_config);
+    
+        </script>
+    </body>
+</html>
--- a/test/slideshare.htm	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,84 +0,0 @@
-<!doctype html>
-<html>
-
-    <head>
-        <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
-        <title>Metadataplayer test with JwPlayer</title>
-        <link href='open-sans/css/fonts.css' rel='stylesheet' type='text/css'>
-        <link href='test.css' rel='stylesheet' type='text/css'>
-        <script type="text/javascript" src="metadataplayer/LdtPlayer-core.js" type="text/javascript"></script>
-        <style type="text/css">
-        #SlideShareContainer {
-            float: left;
-            width: 400px;
-            margin: 10px 0;
-        }
-    </style>
-    </head>
-
-    <body>
-        <h1>Metadataplayer test with JwPlayer</h1>
-        <div id="LdtPlayer"></div>
-        <div id="SlideShareContainer"></div>
-        <div id="AnnotationsListContainer"></div>
-        <script type="text/javascript">
-IriSP.libFiles.defaultDir = "libs/";
-IriSP.language = 'fr';
-IriSP.widgetsDir = "metadataplayer";
-var _metadata = {
-    url: 'http://ldt.iri.centrepompidou.fr/ldtplatform/ldt/cljson/id/8a1a344a-7f34-11e1-9ee2-00145ea4a2be?callback=?',
-    format: 'ldt'
-};
-var _config = {
-    width : 620,
-    container : 'LdtPlayer',
-    default_options: {
-        metadata: _metadata
-    },
-    css : 'metadataplayer/LdtPlayer-core.css',
-    widgets: [
-        {
-            type: "JwpPlayer",
-            live: true,
-            height: 350,
-            provider: "rtmp",
-            autostart: true,
-            streamer: function(_url) {
-                var _matches = _url.match(/^[^\/]+\/\/[^\/]+\/[^\/]+\//);
-                if (_matches) {
-                    return _matches[0];
-                } else {
-                    return _url;
-                }
-            }
-        },
-        { type: "Slider" },
-        { type: "Controller" },
-        { type: "Polemic" },
-        { type: "Segments" },
-        { type: "Annotation" },
-        {
-            type: "Segments",
-            annotation_type: "Slide"
-        },
-        { type: "Tweet" },
-        {
-            type: "Tagcloud"
-        },
-        {
-            type: "AnnotationsList",
-            container: "AnnotationsListContainer"
-        },
-        {
-            type: "Slideshare",
-            container: "SlideShareContainer"
-        },
-        { type: "Mediafragment"}
-    ]
-};
-    
-    var _myPlayer = new IriSP.Metadataplayer(_config);
-    
-        </script>
-    </body>
-</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/slideshare.html	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,84 @@
+<!doctype html>
+<html>
+
+    <head>
+        <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
+        <title>Metadataplayer test with JwPlayer</title>
+        <link href='open-sans/css/fonts.css' rel='stylesheet' type='text/css'>
+        <link href='test.css' rel='stylesheet' type='text/css'>
+        <script type="text/javascript" src="metadataplayer/LdtPlayer-core.js" type="text/javascript"></script>
+        <style type="text/css">
+        #SlideShareContainer {
+            float: left;
+            width: 400px;
+            margin: 10px 0;
+        }
+    </style>
+    </head>
+
+    <body>
+        <h1>Metadataplayer test with JwPlayer</h1>
+        <div id="LdtPlayer"></div>
+        <div id="SlideShareContainer"></div>
+        <div id="AnnotationsListContainer"></div>
+        <script type="text/javascript">
+IriSP.libFiles.defaultDir = "libs/";
+IriSP.language = 'fr';
+IriSP.widgetsDir = "metadataplayer";
+var _metadata = {
+    url: 'http://ldt.iri.centrepompidou.fr/ldtplatform/ldt/cljson/id/8a1a344a-7f34-11e1-9ee2-00145ea4a2be?callback=?',
+    format: 'ldt'
+};
+var _config = {
+    width : 620,
+    container : 'LdtPlayer',
+    default_options: {
+        metadata: _metadata
+    },
+    css : 'metadataplayer/LdtPlayer-core.css',
+    widgets: [
+        {
+            type: "JwpPlayer",
+            live: true,
+            height: 350,
+            provider: "rtmp",
+            autostart: true,
+            streamer: function(_url) {
+                var _matches = _url.match(/^[^\/]+\/\/[^\/]+\/[^\/]+\//);
+                if (_matches) {
+                    return _matches[0];
+                } else {
+                    return _url;
+                }
+            }
+        },
+        { type: "Slider" },
+        { type: "Controller" },
+        { type: "Polemic" },
+        { type: "Segments" },
+        { type: "Annotation" },
+        {
+            type: "Segments",
+            annotation_type: "Slide"
+        },
+        { type: "Tweet" },
+        {
+            type: "Tagcloud"
+        },
+        {
+            type: "AnnotationsList",
+            container: "AnnotationsListContainer"
+        },
+        {
+            type: "Slideshare",
+            container: "SlideShareContainer"
+        },
+        { type: "Mediafragment"}
+    ]
+};
+    
+    var _myPlayer = new IriSP.Metadataplayer(_config);
+    
+        </script>
+    </body>
+</html>
--- a/test/spel-2.htm	Sun Nov 12 22:07:33 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,91 +0,0 @@
-<!doctype html>
-<html>
-
-    <head>
-        <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
-        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
-        <title>Tests Spectacle en ligne(s)</title>
-        <link href='open-sans/css/fonts.css' rel='stylesheet' type='text/css'>
-        <link href='test.css' rel='stylesheet' type='text/css'>
-        <script type="text/javascript" src="metadataplayer/LdtPlayer-core.js"></script>
-        <script type="text/javascript" src="spel-serializer.js"></script>
-    </head>
-
-    <body>
-        <section style="width: 1070px; margin: 0 auto">
-            <h1>Tests Spectacle en ligne(s)</h1>
-            <div id="LdtPlayer"></div>
-            <div id="AnnotationsListContainer"></div>
-        </section>
-        <script type="text/javascript">
-IriSP.libFiles.defaultDir = "libs/";
-IriSP.widgetsDir = "metadataplayer";
-var _metadata = {
-    url: "json/extrait-celestins-paris.json",
-    format: 'spel'
-};
-var _config = {
-    width : 550,
-    container : 'LdtPlayer',
-    default_options: {
-        metadata: _metadata
-    },
-    css : 'metadataplayer/LdtPlayer-core.css',
-    widgets: [
-        {
-            type: "Title"
-        },
-        {
-            type: "JwpPlayer",
-            video: "rtmpt://sln8pxlnphabw.cloudfront.net/cfx/st/mp4:2013-09-11_11-00-57_extrait-celesti_8878b1/original_web_low.mp4",
-            height: 320
-        },
-        { type: "Slider" },
-        { type: "Controller" },
-        {
-            type: "Segments",
-            annotation_type: ["performance","discussion"]
-        },
-        {
-            type: "Annotation",
-            show_social: false,
-            show_annotation_type: true,
-            annotation_type: ["performance","discussion"]
-        },
-        {
-            type: "Polemic",
-            annotation_type: "interpretation",
-            polemics: [
-                {
-                    keywords: [ "performance d'un(e) comédien(ne)" ],
-                    color: "#c00000"
-                },
-                {
-                    keywords: [ "Interpétation alternative de mise en scène" ],
-                    color: "#008000"
-                },
-                {
-                    keywords: [ "Intervention de la technique" ],
-                    color: "#0000f0"
-                },
-            ]
-        },
-        {
-            type: "Annotation",
-            annotation_type: "interpretation",
-            show_social: false,
-            arrow_position: 0
-        },
-        {
-            type: "SpelSyncHtml",
-            container: "AnnotationsListContainer",
-            height: 600,
-            width: 500,
-            src: "ctb.html"
-        }
-    ]
-};
-_myPlayer = new IriSP.Metadataplayer(_config);
-        </script>
-    </body>
-</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/spel-2.html	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,91 @@
+<!doctype html>
+<html>
+
+    <head>
+        <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
+        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
+        <title>Tests Spectacle en ligne(s)</title>
+        <link href='open-sans/css/fonts.css' rel='stylesheet' type='text/css'>
+        <link href='test.css' rel='stylesheet' type='text/css'>
+        <script type="text/javascript" src="metadataplayer/LdtPlayer-core.js"></script>
+        <script type="text/javascript" src="spel-serializer.js"></script>
+    </head>
+
+    <body>
+        <section style="width: 1070px; margin: 0 auto">
+            <h1>Tests Spectacle en ligne(s)</h1>
+            <div id="LdtPlayer"></div>
+            <div id="AnnotationsListContainer"></div>
+        </section>
+        <script type="text/javascript">
+IriSP.libFiles.defaultDir = "libs/";
+IriSP.widgetsDir = "metadataplayer";
+var _metadata = {
+    url: "json/extrait-celestins-paris.json",
+    format: 'spel'
+};
+var _config = {
+    width : 550,
+    container : 'LdtPlayer',
+    default_options: {
+        metadata: _metadata
+    },
+    css : 'metadataplayer/LdtPlayer-core.css',
+    widgets: [
+        {
+            type: "Title"
+        },
+        {
+            type: "JwpPlayer",
+            video: "rtmpt://sln8pxlnphabw.cloudfront.net/cfx/st/mp4:2013-09-11_11-00-57_extrait-celesti_8878b1/original_web_low.mp4",
+            height: 320
+        },
+        { type: "Slider" },
+        { type: "Controller" },
+        {
+            type: "Segments",
+            annotation_type: ["performance","discussion"]
+        },
+        {
+            type: "Annotation",
+            show_social: false,
+            show_annotation_type: true,
+            annotation_type: ["performance","discussion"]
+        },
+        {
+            type: "Polemic",
+            annotation_type: "interpretation",
+            polemics: [
+                {
+                    keywords: [ "performance d'un(e) comédien(ne)" ],
+                    color: "#c00000"
+                },
+                {
+                    keywords: [ "Interpétation alternative de mise en scène" ],
+                    color: "#008000"
+                },
+                {
+                    keywords: [ "Intervention de la technique" ],
+                    color: "#0000f0"
+                },
+            ]
+        },
+        {
+            type: "Annotation",
+            annotation_type: "interpretation",
+            show_social: false,
+            arrow_position: 0
+        },
+        {
+            type: "SpelSyncHtml",
+            container: "AnnotationsListContainer",
+            height: 600,
+            width: 500,
+            src: "ctb.html"
+        }
+    ]
+};
+_myPlayer = new IriSP.Metadataplayer(_config);
+        </script>
+    </body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vite.config.js	Wed Sep 04 17:32:50 2024 +0200
@@ -0,0 +1,81 @@
+import { defineConfig } from "vite";
+import banner from "vite-plugin-banner";
+import pkg from "./package.json";
+import { nodePolyfills } from "vite-plugin-node-polyfills";
+import inject from '@rollup/plugin-inject';
+
+export default defineConfig({
+  build: {
+    lib: {
+      // Could also be a dictionary or array of multiple entry points
+      entry: "./src/main.js",
+      name: "MetadataPlayer",
+      // the proper extensions will be added
+      fileName: (format) => {
+        if(format == "es")
+          return "LdtPlayer-core.lib.js"
+        else
+          return "LdtPlayer-core.js";
+        },
+      type: ["es", "cjs", "umd"],
+    },
+    rollupOptions: {
+      // make sure to externalize deps that shouldn't be bundled
+      // into your library
+      external: [],
+      output: {
+        // Provide global variables to use in the UMD build
+        // for externalized deps
+        globals: {},
+        assetFileNames: "LdtPlayer-core.[ext]",
+      },
+    },
+    define: {
+      __APP_VERSION__: JSON.stringify(process.env.npm_package_version),
+    },
+    copyPublicDir: false,
+    sourcemap: true,
+  },
+  css: {
+    modules: {
+      scopeBehaviour: "global",
+      //      localsConvention: "camelCaseOnly"
+    },
+  },
+  plugins: [
+    {
+      ...inject({
+        $: 'jquery',
+        jQuery: 'jquery',
+      }),
+      enforce:"post",
+    },
+    banner(`
+   *
+    __  __      _            _       _              _                       
+   |  \\/  | ___| |_ __ _  __| | __ _| |_ __ _ _ __ | | __ _ _   _  ___ _ __ 
+   | |\\/| |/ _ \\ __/ _\` |/ _\` |/ _\` | __/ _\` | '_ \\| |/ _\` | | | |/ _ \\ '__|
+   | |  | |  __/ || (_| | (_| | (_| | || (_| | |_) | | (_| | |_| |  __/ |   
+   |_|  |_|\\___|\\__\\__,_|\\__,_|\\__,_|\\__\\__,_| .__/|_|\\__,_|\\__, |\\___|_|   
+                                             |_|            |___/         
+   
+   *  Copyright 2010-2024 Institut de Recherche et d'Innovation 
+   *  contributor(s) : Karim Hamidou, Samuel Huron, Raphael Velt, Thibaut Cavalie, Yves-Marie Haussonne, Nicolas Durand, Olivier Aubert
+   *   
+   *  contact@iri.centrepompidou.fr
+   *  http://www.iri.centrepompidou.fr 
+   *   
+   *  This software is a computer program whose purpose is to show and add annotations on a video .
+   *  This software is governed by the CeCILL-C license under French law and
+   *  abiding by the rules of distribution of free software. You can  use, 
+   *  modify and/ or redistribute the software under the terms of the CeCILL-C
+   *  license as circulated by CEA, CNRS and INRIA at the following URL
+   *  "http://www.cecill.info". 
+   *  
+   *  The fact that you are presently reading this means that you have had
+   *  knowledge of the CeCILL-C license and that you accept its terms.
+   *  ${pkg.name} - version ${pkg.version}
+ `),
+    nodePolyfills(),
+  ],
+});