mediawiki/extensions/RevisionSlider: main (log #963972)

sourcepatches

This run took 66 seconds.

$ date
--- stdout ---
Mon Mar 20 21:01:36 UTC 2023

--- end ---
$ git clone file:///srv/git/mediawiki-extensions-RevisionSlider.git repo --depth=1 -b master
--- stderr ---
Cloning into 'repo'...
--- stdout ---

--- end ---
$ git config user.name libraryupgrader
--- stdout ---

--- end ---
$ git config user.email tools.libraryupgrader@tools.wmflabs.org
--- stdout ---

--- end ---
$ git submodule update --init
--- stdout ---

--- end ---
$ grr init
--- stdout ---
Installed commit-msg hook.

--- end ---
$ git show-ref refs/heads/master
--- stdout ---
1cc4c488d7612868105dca1630b5f1a13ae9ce44 refs/heads/master

--- end ---
$ /usr/bin/npm audit --json --legacy-peer-deps
--- stdout ---
{
  "auditReportVersion": 2,
  "vulnerabilities": {
    "mwbot": {
      "name": "mwbot",
      "severity": "moderate",
      "isDirect": true,
      "via": [
        "request"
      ],
      "effects": [
        "wdio-mediawiki"
      ],
      "range": ">=0.1.6",
      "nodes": [
        "node_modules/mwbot",
        "node_modules/wdio-mediawiki/node_modules/mwbot"
      ],
      "fixAvailable": false
    },
    "request": {
      "name": "request",
      "severity": "moderate",
      "isDirect": false,
      "via": [
        {
          "source": 1091410,
          "name": "request",
          "dependency": "request",
          "title": "Server-Side Request Forgery in Request",
          "url": "https://github.com/advisories/GHSA-p8p7-x288-28g6",
          "severity": "moderate",
          "cwe": [
            "CWE-918"
          ],
          "cvss": {
            "score": 0,
            "vectorString": null
          },
          "range": "<=2.88.2"
        }
      ],
      "effects": [
        "mwbot"
      ],
      "range": "*",
      "nodes": [
        "node_modules/request"
      ],
      "fixAvailable": false
    },
    "wdio-mediawiki": {
      "name": "wdio-mediawiki",
      "severity": "moderate",
      "isDirect": true,
      "via": [
        "mwbot"
      ],
      "effects": [],
      "range": "*",
      "nodes": [
        "node_modules/wdio-mediawiki"
      ],
      "fixAvailable": false
    }
  },
  "metadata": {
    "vulnerabilities": {
      "info": 0,
      "low": 0,
      "moderate": 3,
      "high": 0,
      "critical": 0,
      "total": 3
    },
    "dependencies": {
      "prod": 1,
      "dev": 825,
      "optional": 2,
      "peer": 0,
      "peerOptional": 0,
      "total": 825
    }
  }
}

--- end ---
$ /usr/bin/composer install
--- stderr ---
No lock file found. Updating dependencies instead of installing from lock file. Use composer update over composer install if you do not have a lock file.
Loading composer repositories with package information
Info from https://repo.packagist.org: #StandWithUkraine
Updating dependencies
Lock file operations: 36 installs, 0 updates, 0 removals
  - Locking composer/pcre (3.1.0)
  - Locking composer/semver (3.3.2)
  - Locking composer/spdx-licenses (1.5.7)
  - Locking composer/xdebug-handler (3.0.3)
  - Locking doctrine/deprecations (v1.0.0)
  - Locking felixfbecker/advanced-json-rpc (v3.2.1)
  - Locking mediawiki/mediawiki-codesniffer (v41.0.0)
  - Locking mediawiki/mediawiki-phan-config (0.12.0)
  - Locking mediawiki/minus-x (1.1.1)
  - Locking mediawiki/phan-taint-check-plugin (4.0.0)
  - Locking microsoft/tolerant-php-parser (v0.1.1)
  - Locking netresearch/jsonmapper (v4.1.0)
  - Locking phan/phan (5.4.1)
  - Locking php-parallel-lint/php-console-color (v1.0.1)
  - Locking php-parallel-lint/php-console-highlighter (v1.0.0)
  - Locking php-parallel-lint/php-parallel-lint (v1.3.2)
  - Locking phpdocumentor/reflection-common (2.2.0)
  - Locking phpdocumentor/reflection-docblock (5.3.0)
  - Locking phpdocumentor/type-resolver (1.7.0)
  - Locking phpstan/phpdoc-parser (1.16.1)
  - Locking psr/container (1.1.2)
  - Locking psr/log (1.1.4)
  - Locking sabre/event (5.1.4)
  - Locking squizlabs/php_codesniffer (3.7.2)
  - Locking symfony/console (v5.4.21)
  - Locking symfony/deprecation-contracts (v2.5.2)
  - Locking symfony/polyfill-ctype (v1.27.0)
  - Locking symfony/polyfill-intl-grapheme (v1.27.0)
  - Locking symfony/polyfill-intl-normalizer (v1.27.0)
  - Locking symfony/polyfill-mbstring (v1.27.0)
  - Locking symfony/polyfill-php73 (v1.27.0)
  - Locking symfony/polyfill-php80 (v1.27.0)
  - Locking symfony/service-contracts (v2.5.2)
  - Locking symfony/string (v5.4.21)
  - Locking tysonandre/var_representation_polyfill (0.1.3)
  - Locking webmozart/assert (1.11.0)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 36 installs, 0 updates, 0 removals
    0 [>---------------------------]    0 [->--------------------------]    0 [--->------------------------]  - Installing composer/pcre (3.1.0): Extracting archive
  - Installing symfony/polyfill-php80 (v1.27.0): Extracting archive
  - Installing squizlabs/php_codesniffer (3.7.2): Extracting archive
  - Installing symfony/polyfill-mbstring (v1.27.0): Extracting archive
  - Installing composer/spdx-licenses (1.5.7): Extracting archive
  - Installing composer/semver (3.3.2): Extracting archive
  - Installing mediawiki/mediawiki-codesniffer (v41.0.0): Extracting archive
  - Installing tysonandre/var_representation_polyfill (0.1.3): Extracting archive
  - Installing symfony/polyfill-intl-normalizer (v1.27.0): Extracting archive
  - Installing symfony/polyfill-intl-grapheme (v1.27.0): Extracting archive
  - Installing symfony/polyfill-ctype (v1.27.0): Extracting archive
  - Installing symfony/string (v5.4.21): Extracting archive
  - Installing symfony/deprecation-contracts (v2.5.2): Extracting archive
  - Installing psr/container (1.1.2): Extracting archive
  - Installing symfony/service-contracts (v2.5.2): Extracting archive
  - Installing symfony/polyfill-php73 (v1.27.0): Extracting archive
  - Installing symfony/console (v5.4.21): Extracting archive
  - Installing sabre/event (5.1.4): Extracting archive
  - Installing netresearch/jsonmapper (v4.1.0): Extracting archive
  - Installing microsoft/tolerant-php-parser (v0.1.1): Extracting archive
  - Installing webmozart/assert (1.11.0): Extracting archive
  - Installing phpstan/phpdoc-parser (1.16.1): Extracting archive
  - Installing phpdocumentor/reflection-common (2.2.0): Extracting archive
  - Installing doctrine/deprecations (v1.0.0): Extracting archive
  - Installing phpdocumentor/type-resolver (1.7.0): Extracting archive
  - Installing phpdocumentor/reflection-docblock (5.3.0): Extracting archive
  - Installing felixfbecker/advanced-json-rpc (v3.2.1): Extracting archive
  - Installing psr/log (1.1.4): Extracting archive
  - Installing composer/xdebug-handler (3.0.3): Extracting archive
  - Installing phan/phan (5.4.1): Extracting archive
  - Installing mediawiki/phan-taint-check-plugin (4.0.0): Extracting archive
  - Installing mediawiki/mediawiki-phan-config (0.12.0): Extracting archive
  - Installing mediawiki/minus-x (1.1.1): Extracting archive
  - Installing php-parallel-lint/php-console-color (v1.0.1): Extracting archive
  - Installing php-parallel-lint/php-console-highlighter (v1.0.0): Extracting archive
  - Installing php-parallel-lint/php-parallel-lint (v1.3.2): Extracting archive
  0/27 [>---------------------------]   0%
 10/27 [==========>-----------------]  37%
 20/27 [====================>-------]  74%
 27/27 [============================] 100%4 package suggestions were added by new dependencies, use `composer suggest` to see details.
Generating autoload files
14 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
--- stdout ---

--- end ---
Upgrading n:eslint-config-wikimedia from 0.22.1 -> 0.24.0
Upgrading n:grunt from 1.5.3 -> 1.6.1
Upgrading n:stylelint-config-wikimedia from 0.13.0 -> 0.14.0
$ /usr/bin/npm install
--- stderr ---
npm WARN deprecated har-validator@5.1.5: this library is no longer supported
npm WARN deprecated debug@4.1.1: Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)
npm WARN deprecated uuid@3.4.0: 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.
npm WARN deprecated request@2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142
--- stdout ---

added 828 packages, and audited 829 packages in 10s

98 packages are looking for funding
  run `npm fund` for details

3 moderate severity vulnerabilities

Some issues need review, and may require choosing
a different dependency.

Run `npm audit` for details.

--- end ---
$ package-lock-lint package-lock.json
--- stdout ---
Checking package-lock.json

--- end ---
$ /usr/bin/npm install grunt-eslint@24.0.0 --save-exact
--- stdout ---

up to date, audited 829 packages in 1s

98 packages are looking for funding
  run `npm fund` for details

3 moderate severity vulnerabilities

Some issues need review, and may require choosing
a different dependency.

Run `npm audit` for details.

--- end ---
$ package-lock-lint package-lock.json
--- stdout ---
Checking package-lock.json

--- end ---
$ ./node_modules/.bin/eslint i18n/be.json i18n/fi.json i18n/kk-cyrl.json i18n/qqq.json i18n/zgh.json i18n/nb.json i18n/ig.json tests/selenium/wdio.conf.js modules/ext.RevisionSlider.SliderArrowView.js i18n/et.json composer.json i18n/ckb.json modules/ext.RevisionSlider.util.js i18n/inh.json i18n/gl.json i18n/fa.json modules/ext.RevisionSlider.DiffPage.js tests/selenium/specs/pointers.js i18n/lv.json i18n/zh-hant.json i18n/fr.json i18n/bg.json i18n/mr.json tests/qunit/QUnit.revisionSlider.testOrSkip.js modules/ext.RevisionSlider.Settings.js tests/qunit/RevisionSlider.DiffPage.test.js i18n/ja.json i18n/sr-el.json i18n/kiu.json modules/ext.RevisionSlider.init.js tests/selenium/pageobjects/diff.page.js i18n/mt.json i18n/eu.json tests/selenium/specs/timeline.js i18n/uz.json i18n/uk.json i18n/pl.json i18n/ca.json i18n/vec.json tests/selenium/specs/tooltips.js i18n/cy.json i18n/mwl.json i18n/hu.json i18n/azb.json i18n/as.json i18n/sv.json tests/selenium/specs/help.js i18n/sl.json i18n/km.json i18n/sd.json i18n/ne.json tests/qunit/RevisionSlider.RevisionList.test.js i18n/el.json i18n/nah.json i18n/en.json i18n/nl.json i18n/cs.json i18n/es.json i18n/szy.json i18n/tr.json i18n/de.json i18n/se.json i18n/lt.json i18n/ko.json i18n/hr.json i18n/ilo.json i18n/fit.json i18n/id.json i18n/pnb.json i18n/it.json i18n/sah.json i18n/ba.json i18n/hsb.json Gruntfile.js i18n/th.json i18n/tcy.json i18n/diq.json modules/ext.RevisionSlider.Pointer.js modules/ext.RevisionSlider.RevisionList.js i18n/sk.json i18n/hy.json jsduck.json tests/qunit/RevisionSlider.SliderView.test.js i18n/yua.json i18n/az.json i18n/da.json i18n/yi.json i18n/sms.json tests/selenium/specs/history.js i18n/shn.json i18n/ur.json i18n/he.json i18n/ro.json i18n/zh-hans.json i18n/vi.json i18n/ru.json i18n/my.json i18n/roa-tara.json i18n/ce.json package.json modules/ext.RevisionSlider.PointerView.js i18n/la.json i18n/cnh.json tests/qunit/RevisionSlider.HelpDialog.test.js tests/qunit/RevisionSlider.Slider.test.js i18n/hi.json modules/ext.RevisionSlider.SliderView.js i18n/eo.json i18n/af.json i18n/ast.json modules/ext.RevisionSlider.lazy.js i18n/tt-cyrl.json i18n/ku-latn.json i18n/nds-nl.json modules/ext.RevisionSlider.HelpDialog.js i18n/bgn.json i18n/csb.json i18n/ban.json modules/ext.RevisionSlider.Slider.js modules/ext.RevisionSlider.PointerLine.js tests/qunit/RevisionSlider.PointerView.test.js i18n/atj.json tests/qunit/RevisionSlider.RevisionListView.test.js i18n/ar.json i18n/pt.json modules/ext.RevisionSlider.HelpButtonView.js i18n/ksw.json tests/selenium/specs/autoexpand.js package-lock.json i18n/smn.json i18n/br.json i18n/bs.json i18n/oc.json i18n/ksh.json tests/qunit/RevisionSlider.Revision.test.js i18n/tg-cyrl.json i18n/gom-latn.json i18n/kaa.json i18n/io.json i18n/jv.json i18n/bn.json i18n/sh.json i18n/ml.json i18n/ka.json i18n/ms.json modules/ext.RevisionSlider.Revision.js i18n/scn.json i18n/nn.json i18n/lb.json tests/selenium/specs/filterhighlighting.js modules/ext.RevisionSlider.Api.js i18n/pt-br.json i18n/fy.json modules/ext.RevisionSlider.RevisionListView.js i18n/te.json i18n/mk.json i18n/sr-ec.json tests/qunit/RevisionSlider.Pointer.test.js i18n/ia.json i18n/lmo.json i18n/ps.json extension.json i18n/is.json i18n/be-tarask.json i18n/tay.json tests/selenium/specs/difflinks.js --fix
--- stdout ---

/src/repo/modules/ext.RevisionSlider.SliderView.js
  283:0  warning  Missing JSDoc @param "pos" type  jsdoc/require-param-type
  291:0  warning  Missing JSDoc @param "pos" type  jsdoc/require-param-type

✖ 2 problems (0 errors, 2 warnings)


--- end ---
$ ./node_modules/.bin/eslint i18n/be.json i18n/fi.json i18n/kk-cyrl.json i18n/qqq.json i18n/zgh.json i18n/nb.json i18n/ig.json tests/selenium/wdio.conf.js modules/ext.RevisionSlider.SliderArrowView.js i18n/et.json composer.json i18n/ckb.json modules/ext.RevisionSlider.util.js i18n/inh.json i18n/gl.json i18n/fa.json modules/ext.RevisionSlider.DiffPage.js tests/selenium/specs/pointers.js i18n/lv.json i18n/zh-hant.json i18n/fr.json i18n/bg.json i18n/mr.json tests/qunit/QUnit.revisionSlider.testOrSkip.js modules/ext.RevisionSlider.Settings.js tests/qunit/RevisionSlider.DiffPage.test.js i18n/ja.json i18n/sr-el.json i18n/kiu.json modules/ext.RevisionSlider.init.js tests/selenium/pageobjects/diff.page.js i18n/mt.json i18n/eu.json tests/selenium/specs/timeline.js i18n/uz.json i18n/uk.json i18n/pl.json i18n/ca.json i18n/vec.json tests/selenium/specs/tooltips.js i18n/cy.json i18n/mwl.json i18n/hu.json i18n/azb.json i18n/as.json i18n/sv.json tests/selenium/specs/help.js i18n/sl.json i18n/km.json i18n/sd.json i18n/ne.json tests/qunit/RevisionSlider.RevisionList.test.js i18n/el.json i18n/nah.json i18n/en.json i18n/nl.json i18n/cs.json i18n/es.json i18n/szy.json i18n/tr.json i18n/de.json i18n/se.json i18n/lt.json i18n/ko.json i18n/hr.json i18n/ilo.json i18n/fit.json i18n/id.json i18n/pnb.json i18n/it.json i18n/sah.json i18n/ba.json i18n/hsb.json Gruntfile.js i18n/th.json i18n/tcy.json i18n/diq.json modules/ext.RevisionSlider.Pointer.js modules/ext.RevisionSlider.RevisionList.js i18n/sk.json i18n/hy.json jsduck.json tests/qunit/RevisionSlider.SliderView.test.js i18n/yua.json i18n/az.json i18n/da.json i18n/yi.json i18n/sms.json tests/selenium/specs/history.js i18n/shn.json i18n/ur.json i18n/he.json i18n/ro.json i18n/zh-hans.json i18n/vi.json i18n/ru.json i18n/my.json i18n/roa-tara.json i18n/ce.json package.json modules/ext.RevisionSlider.PointerView.js i18n/la.json i18n/cnh.json tests/qunit/RevisionSlider.HelpDialog.test.js tests/qunit/RevisionSlider.Slider.test.js i18n/hi.json modules/ext.RevisionSlider.SliderView.js i18n/eo.json i18n/af.json i18n/ast.json modules/ext.RevisionSlider.lazy.js i18n/tt-cyrl.json i18n/ku-latn.json i18n/nds-nl.json modules/ext.RevisionSlider.HelpDialog.js i18n/bgn.json i18n/csb.json i18n/ban.json modules/ext.RevisionSlider.Slider.js modules/ext.RevisionSlider.PointerLine.js tests/qunit/RevisionSlider.PointerView.test.js i18n/atj.json tests/qunit/RevisionSlider.RevisionListView.test.js i18n/ar.json i18n/pt.json modules/ext.RevisionSlider.HelpButtonView.js i18n/ksw.json tests/selenium/specs/autoexpand.js package-lock.json i18n/smn.json i18n/br.json i18n/bs.json i18n/oc.json i18n/ksh.json tests/qunit/RevisionSlider.Revision.test.js i18n/tg-cyrl.json i18n/gom-latn.json i18n/kaa.json i18n/io.json i18n/jv.json i18n/bn.json i18n/sh.json i18n/ml.json i18n/ka.json i18n/ms.json modules/ext.RevisionSlider.Revision.js i18n/scn.json i18n/nn.json i18n/lb.json tests/selenium/specs/filterhighlighting.js modules/ext.RevisionSlider.Api.js i18n/pt-br.json i18n/fy.json modules/ext.RevisionSlider.RevisionListView.js i18n/te.json i18n/mk.json i18n/sr-ec.json tests/qunit/RevisionSlider.Pointer.test.js i18n/ia.json i18n/lmo.json i18n/ps.json extension.json i18n/is.json i18n/be-tarask.json i18n/tay.json tests/selenium/specs/difflinks.js -f json
--- stdout ---
[{"filePath":"/src/repo/Gruntfile.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/composer.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/extension.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/af.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/ar.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/as.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/ast.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/atj.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/az.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/azb.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/ba.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/ban.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/be-tarask.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/be.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/bg.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/bgn.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/bn.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/br.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/bs.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/ca.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/ce.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/ckb.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/cnh.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/cs.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/csb.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/cy.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/da.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/de.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/diq.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/el.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/en.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/eo.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/es.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/et.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/eu.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/fa.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/fi.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/fit.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/fr.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/fy.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/gl.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/gom-latn.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/he.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/hi.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/hr.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/hsb.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/hu.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/hy.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/ia.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/id.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/ig.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/ilo.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/inh.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/io.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/is.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/it.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/ja.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/jv.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/ka.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/kaa.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/kiu.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/kk-cyrl.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/km.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/ko.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/ksh.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/ksw.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/ku-latn.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/la.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/lb.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/lmo.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/lt.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/lv.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/mk.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/ml.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/mr.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/ms.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/mt.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/mwl.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/my.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/nah.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/nb.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/nds-nl.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/ne.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/nl.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/nn.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/oc.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/pl.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/pnb.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/ps.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/pt-br.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/pt.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/qqq.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/ro.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/roa-tara.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/ru.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/sah.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/scn.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/sd.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/se.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/sh.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/shn.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/sk.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/sl.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/smn.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/sms.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/sr-ec.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/sr-el.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/sv.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/szy.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/tay.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/tcy.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/te.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/tg-cyrl.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/th.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/tr.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/tt-cyrl.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/uk.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/ur.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/uz.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/vec.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/vi.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/yi.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/yua.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/zgh.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/zh-hans.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/i18n/zh-hant.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/jsduck.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/modules/ext.RevisionSlider.Api.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/modules/ext.RevisionSlider.DiffPage.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/modules/ext.RevisionSlider.HelpButtonView.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/modules/ext.RevisionSlider.HelpDialog.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/modules/ext.RevisionSlider.Pointer.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/modules/ext.RevisionSlider.PointerLine.js","messages":[],"suppressedMessages":[{"ruleId":"mediawiki/class-doc","severity":2,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":161,"column":16,"nodeType":"CallExpression","endLine":162,"endColumn":57,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"mediawiki/class-doc","severity":2,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":165,"column":5,"nodeType":"CallExpression","endLine":165,"endColumn":76,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"mediawiki/class-doc","severity":2,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":167,"column":5,"nodeType":"CallExpression","endLine":167,"endColumn":76,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"mediawiki/class-doc","severity":2,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":169,"column":5,"nodeType":"CallExpression","endLine":169,"endColumn":80,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/modules/ext.RevisionSlider.PointerView.js","messages":[],"suppressedMessages":[{"ruleId":"mediawiki/class-doc","severity":2,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":35,"column":16,"nodeType":"CallExpression","endLine":36,"endColumn":80,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/modules/ext.RevisionSlider.Revision.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/modules/ext.RevisionSlider.RevisionList.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/modules/ext.RevisionSlider.RevisionListView.js","messages":[],"suppressedMessages":[{"ruleId":"mediawiki/class-doc","severity":2,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":285,"column":3,"nodeType":"CallExpression","endLine":285,"endColumn":70,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"mediawiki/class-doc","severity":2,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":661,"column":23,"nodeType":"CallExpression","endLine":662,"endColumn":32,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/modules/ext.RevisionSlider.Settings.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/modules/ext.RevisionSlider.Slider.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/modules/ext.RevisionSlider.SliderArrowView.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/modules/ext.RevisionSlider.SliderView.js","messages":[{"ruleId":"jsdoc/require-param-type","severity":1,"message":"Missing JSDoc @param \"pos\" type.","line":283,"column":null,"nodeType":"Block","endLine":283,"endColumn":null},{"ruleId":"jsdoc/require-param-type","severity":1,"message":"Missing JSDoc @param \"pos\" type.","line":291,"column":null,"nodeType":"Block","endLine":291,"endColumn":null}],"suppressedMessages":[{"ruleId":"no-jquery/no-fade","severity":2,"message":"Prefer CSS transitions to .fadeTo","line":848,"column":3,"nodeType":"CallExpression","endLine":848,"endColumn":53,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-fade","severity":2,"message":"Prefer CSS transitions to .fadeTo","line":857,"column":3,"nodeType":"CallExpression","endLine":857,"endColumn":51,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-animate","severity":2,"message":"Prefer CSS transitions to .animate","line":901,"column":3,"nodeType":"CallExpression","endLine":920,"endColumn":4,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"var DiffPage = require( './ext.RevisionSlider.DiffPage.js' ),\n\tHelpButtonView = require( './ext.RevisionSlider.HelpButtonView.js' ),\n\tmakeRevisions = require( './ext.RevisionSlider.RevisionList.js' ).makeRevisions,\n\tPointer = require( './ext.RevisionSlider.Pointer.js' ),\n\tRevisionListView = require( './ext.RevisionSlider.RevisionListView.js' ),\n\tRevisionSliderApi = require( './ext.RevisionSlider.Api.js' ),\n\tSliderArrowView = require( './ext.RevisionSlider.SliderArrowView.js' ),\n\tutils = require( './ext.RevisionSlider.util.js' );\n\n/**\n * Module handling the view logic of the RevisionSlider slider\n *\n * @class SliderView\n * @param {Slider} slider\n * @constructor\n */\nfunction SliderView( slider ) {\n\tthis.slider = slider;\n\tthis.diffPage = new DiffPage( this.slider.getRevisionList() );\n}\n\n$.extend( SliderView.prototype, {\n\n\trevisionWidth: 16,\n\tcontainerMargin: 140,\n\touterMargin: 20,\n\n\t/** @type {jQuery} */\n\t$element: null,\n\t/** @type {DiffPage} */\n\tdiffPage: null,\n\t/** @type {Slider} */\n\tslider: null,\n\t/** @type {Pointer} */\n\tpointerOlder: null,\n\t/** @type {Pointer} */\n\tpointerNewer: null,\n\t/** @type {OO.ui.ButtonWidget} */\n\tbackwardArrowButton: null,\n\t/** @type {OO.ui.ButtonWidget} */\n\tforwardArrowButton: null,\n\n\t/**\n\t * @type {string}\n\t *\n\t * Value of scrollLeft property when in RTL mode varies between browser. This identifies\n\t * an implementation used by user's browser:\n\t * - 'default': 0 is the left-most position, values increase when scrolling right (same as scrolling from left to right in LTR mode)\n\t * - 'negative': 0 is right-most position, values decrease when scrolling left (ie. all values except 0 are negative)\n\t * - 'reverse': 0 is right-most position, values incrase when scrolling left\n\t */\n\trtlScrollLeftType: 'default',\n\n\t/** @type {boolean} */\n\tnoMoreNewerRevisions: false,\n\t/** @type {boolean} */\n\tnoMoreOlderRevisions: false,\n\t/** @type {string|null} */\n\tdir: null,\n\t/** @type {boolean} */\n\tisDragged: false,\n\t/** @type {boolean} */\n\tescapePressed: false,\n\t/** @type {number|null} */\n\tlastOldPointerPosition: null,\n\t/** @type {number|null} */\n\tlastNewPointerPosition: null,\n\n\trender: function ( $container ) {\n\t\tvar containerWidth = this.calculateSliderContainerWidth(),\n\t\t\t$revisions = this.getRevisionListView().render( this.revisionWidth ),\n\t\t\tsliderArrowView = new SliderArrowView( this );\n\n\t\tthis.dir = $container.css( 'direction' ) || 'ltr';\n\n\t\tif ( this.dir === 'rtl' ) {\n\t\t\tthis.rtlScrollLeftType = utils.determineRtlScrollType();\n\t\t}\n\n\t\tthis.pointerOlder = this.pointerOlder || new Pointer( 'mw-revslider-pointer-older' );\n\t\tthis.pointerNewer = this.pointerNewer || new Pointer( 'mw-revslider-pointer-newer' );\n\n\t\tthis.backwardArrowButton = sliderArrowView.renderBackwardArrow();\n\t\tthis.forwardArrowButton = sliderArrowView.renderForwardArrow();\n\n\t\tthis.$element = $( '<div>' )\n\t\t\t.addClass( 'mw-revslider-revision-slider' )\n\t\t\t.css( {\n\t\t\t\tdirection: $container.css( 'direction' ),\n\t\t\t\twidth: ( containerWidth + this.containerMargin ) + 'px'\n\t\t\t} )\n\t\t\t.append(\n\t\t\t\tthis.backwardArrowButton.$element,\n\t\t\t\tthis.renderRevisionsContainer( containerWidth, $revisions ),\n\t\t\t\tthis.renderPointerContainer( containerWidth ),\n\t\t\t\tthis.forwardArrowButton.$element,\n\t\t\t\t$( '<div>' ).css( { clear: 'both' } ),\n\t\t\t\tthis.pointerOlder.getLine().render(), this.pointerNewer.getLine().render(),\n\t\t\t\tHelpButtonView.render()\n\t\t\t);\n\n\t\tthis.initPointers( $revisions );\n\n\t\tthis.slider.setRevisionsPerWindow( this.$element.find( '.mw-revslider-revisions-container' ).width() / this.revisionWidth );\n\n\t\tthis.initializePointers( this.getOldRevElement( $revisions ), this.getNewRevElement( $revisions ) );\n\t\tthis.resetRevisionStylesBasedOnPointerPosition( $revisions );\n\t\tthis.addClickHandlerToRevisions( $revisions );\n\n\t\t$container.html( this.$element );\n\n\t\tthis.slideView( Math.floor( ( this.getNewerPointerPos() - 1 ) / this.slider.getRevisionsPerWindow() ), 0 );\n\t\tthis.diffPage.addHandlersToCoreLinks( this );\n\t\tthis.diffPage.replaceState( mw.config.get( 'wgDiffNewId' ), mw.config.get( 'wgDiffOldId' ), this );\n\t\tthis.diffPage.initOnPopState( this );\n\t},\n\n\t/**\n\t * Renders the revisions container and adds the revisions to it\n\t *\n\t * @param {number} containerWidth\n\t * @param {jQuery} $revisions\n\t * @return {jQuery} the revisions container\n\t */\n\trenderRevisionsContainer: function ( containerWidth, $revisions ) {\n\t\treturn $( '<div>' )\n\t\t\t.addClass( 'mw-revslider-revisions-container' )\n\t\t\t.css( {\n\t\t\t\twidth: containerWidth + 'px'\n\t\t\t} )\n\t\t\t.append( $revisions );\n\t},\n\n\t/**\n\t * Renders the pointer container and adds the pointers to it\n\t *\n\t * @param {number} containerWidth\n\t * @return {jQuery} the pointer container\n\t */\n\trenderPointerContainer: function ( containerWidth ) {\n\t\tvar pointerContainerPosition = 53,\n\t\t\tpointerContainerWidth = containerWidth + this.revisionWidth - 1,\n\t\t\tpointerContainerStyle, lastMouseMoveRevisionPos,\n\t\t\tself = this;\n\n\t\tpointerContainerStyle = { left: pointerContainerPosition + 'px', width: pointerContainerWidth + 'px' };\n\t\tif ( this.dir === 'rtl' ) {\n\t\t\t// Due to properly limit dragging a pointer on the right side of the screen,\n\t\t\t// there must some extra space added to the right of the revision bar container\n\t\t\t// For this reason right position of the pointer container in the RTL mode is\n\t\t\t// a bit moved off right compared to its left position in the LTR mode\n\t\t\tpointerContainerPosition = pointerContainerPosition - this.revisionWidth + 1;\n\t\t\tpointerContainerStyle = { right: pointerContainerPosition + 'px', width: pointerContainerWidth + 'px' };\n\t\t}\n\n\t\treturn $( '<div>' )\n\t\t\t.addClass( 'mw-revslider-pointer-container' )\n\t\t\t.css( pointerContainerStyle )\n\t\t\t.append( this.renderPointerContainers() )\n\t\t\t.on( 'click', function ( event ) {\n\t\t\t\tself.pointerContainerClickHandler( event );\n\t\t\t} )\n\t\t\t.on( 'mouseout', function () {\n\t\t\t\tif ( !self.isDragged ) {\n\t\t\t\t\tself.getRevisionListView().unsetAllHovered();\n\t\t\t\t}\n\t\t\t} )\n\t\t\t.on( 'mouseover', function ( event ) {\n\t\t\t\tif ( !self.isDragged ) {\n\t\t\t\t\tlastMouseMoveRevisionPos = self.showTooltipsOnMouseMoveHandler(\n\t\t\t\t\t\tevent,\n\t\t\t\t\t\tnull\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} )\n\t\t\t.on( 'mousemove', function ( event ) {\n\t\t\t\tif ( !self.isDragged ) {\n\t\t\t\t\tlastMouseMoveRevisionPos = self.showTooltipsOnMouseMoveHandler(\n\t\t\t\t\t\tevent,\n\t\t\t\t\t\tlastMouseMoveRevisionPos\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} );\n\t},\n\n\trenderPointerContainers: function () {\n\t\treturn [\n\t\t\t$( '<div>' )\n\t\t\t\t.addClass( 'mw-revslider-pointer-container-older' )\n\t\t\t\t.append(\n\t\t\t\t\t$( '<div>' ).addClass( 'mw-revslider-slider-line' ),\n\t\t\t\t\tthis.pointerOlder.getView().render()\n\t\t\t\t),\n\t\t\t$( '<div>' )\n\t\t\t\t.addClass( 'mw-revslider-pointer-container-newer' )\n\t\t\t\t.append(\n\t\t\t\t\t$( '<div>' ).addClass( 'mw-revslider-slider-line' ),\n\t\t\t\t\tthis.pointerNewer.getView().render()\n\t\t\t\t)\n\t\t];\n\t},\n\n\t/**\n\t * Initializes the pointer dragging logic\n\t *\n\t * @param {jQuery} $revisions\n\t */\n\tinitPointers: function ( $revisions ) {\n\t\tvar $pointers = this.$element.find( '.mw-revslider-pointer' ),\n\t\t\t$pointerOlder = this.pointerOlder.getView().getElement(),\n\t\t\t$pointerNewer = this.pointerNewer.getView().getElement(),\n\t\t\tself = this;\n\n\t\t$pointerNewer.attr( 'tabindex', 0 );\n\t\t$pointerOlder.attr( 'tabindex', 0 );\n\n\t\t$( 'body' ).on( 'keydown', function ( e ) {\n\t\t\tif ( e.which === 27 ) {\n\t\t\t\tself.escapePressed = true;\n\t\t\t\t$pointers.trigger( 'mouseup' );\n\t\t\t}\n\t\t} );\n\n\t\t$pointerOlder.on( 'keydown', function ( event ) {\n\t\t\tself.buildTabbingRulesOnKeyDown(\n\t\t\t\t$pointerOlder,\n\t\t\t\tevent,\n\t\t\t\t$revisions\n\t\t\t);\n\t\t} );\n\n\t\t$pointerOlder.on( 'keyup', function ( event ) {\n\t\t\tself.buildTabbingRulesOnKeyUp(\n\t\t\t\t$pointerOlder,\n\t\t\t\tevent,\n\t\t\t\t$revisions\n\t\t\t);\n\t\t} );\n\n\t\t$pointerNewer.on( 'keydown', function ( event ) {\n\t\t\tself.buildTabbingRulesOnKeyDown(\n\t\t\t\t$pointerNewer,\n\t\t\t\tevent,\n\t\t\t\t$revisions\n\t\t\t);\n\t\t} );\n\n\t\t$pointerNewer.on( 'keyup', function ( event ) {\n\t\t\tself.buildTabbingRulesOnKeyUp(\n\t\t\t\t$pointerNewer,\n\t\t\t\tevent,\n\t\t\t\t$revisions\n\t\t\t);\n\t\t} );\n\n\t\t$pointers.on(\n\t\t\t'touchstart touchmove touchend touchcancel touchleave',\n\t\t\tutils.touchEventConverter\n\t\t);\n\n\t\t$pointerOlder.draggable( this.buildDraggableOptions(\n\t\t\t$revisions,\n\t\t\t'.mw-revslider-pointer-container-older'\n\t\t) );\n\n\t\t$pointerNewer.draggable( this.buildDraggableOptions(\n\t\t\t$revisions,\n\t\t\t'.mw-revslider-pointer-container-newer'\n\t\t) );\n\t},\n\n\t/** @return {number} */\n\tgetOlderPointerPos: function () {\n\t\treturn this.pointerOlder.getPosition();\n\t},\n\n\t/** @return {number} */\n\tgetNewerPointerPos: function () {\n\t\treturn this.pointerNewer.getPosition();\n\t},\n\n\t/**\n\t * @param pos\n\t * @return {number}\n\t */\n\tsetOlderPointerPos: function ( pos ) {\n\t\treturn this.pointerOlder.setPosition( pos );\n\t},\n\n\t/**\n\t * @param pos\n\t * @return {number}\n\t */\n\tsetNewerPointerPos: function ( pos ) {\n\t\treturn this.pointerNewer.setPosition( pos );\n\t},\n\n\tshowTooltipsOnMouseMoveHandler: function ( event, lastValidPosition ) {\n\t\tvar pos = this.getRevisionPositionFromLeftOffset( event.pageX );\n\n\t\tif ( pos === lastValidPosition ) {\n\t\t\treturn pos;\n\t\t}\n\n\t\tvar $hoveredRevisionWrapper = this.getRevElementAtPosition( this.getRevisionsElement(), pos ).parent();\n\t\tvar $lastRevisionWrapper = this.getRevElementAtPosition( this.getRevisionsElement(), lastValidPosition ).parent();\n\t\tthis.getRevisionListView().unsetRevisionGhosts( $lastRevisionWrapper );\n\t\tthis.getRevisionListView().setRevisionHovered( $hoveredRevisionWrapper, event );\n\n\t\treturn pos;\n\t},\n\n\t/**\n\t * Handler for click events on the pointer container element. Forwards these events to the generic handler for\n\t * revision clicks.\n\t *\n\t * @param {MouseEvent} event\n\t */\n\tpointerContainerClickHandler: function ( event ) {\n\t\tvar clickedPos = this.getRevisionPositionFromLeftOffset( event.pageX ),\n\t\t\t$revisionWrapper = this.getRevElementAtPosition( this.getRevisionsElement(), clickedPos ).parent(),\n\t\t\thasClickedTop = event.pageY - $revisionWrapper.offset().top < $revisionWrapper.height() / 2;\n\n\t\tthis.handleRevisionClick( $revisionWrapper, clickedPos, hasClickedTop );\n\t},\n\n\t/**\n\t * Handler for click events on a revisionWrapper element. Forwards these events to the generic handler for\n\t * revision clicks.\n\t *\n\t * @param {MouseEvent} event\n\t * @param {jQuery} $revisionWrapper\n\t */\n\trevisionWrapperClickHandler: function ( event, $revisionWrapper ) {\n\t\tvar hasClickedTop = event.pageY - $revisionWrapper.offset().top < $revisionWrapper.height() / 2,\n\t\t\tclickedPos = +$revisionWrapper.find( '.mw-revslider-revision' ).attr( 'data-pos' );\n\n\t\tthis.handleRevisionClick( $revisionWrapper, clickedPos, hasClickedTop );\n\t},\n\n\t/**\n\t * React on clicks on a revision element and move pointers\n\t *\n\t * @param {jQuery} $revisionWrapper\n\t * @param {number} clickedPos\n\t * @param {boolean} hasClickedTop\n\t */\n\thandleRevisionClick: function ( $revisionWrapper, clickedPos, hasClickedTop ) {\n\t\tvar newNewerPointerPos, newOlderPointerPos;\n\n\t\tif ( hasClickedTop &&\n\t\t\t( $revisionWrapper.hasClass( 'mw-revslider-revision-newer' ) ||\n\t\t\t\t$revisionWrapper.hasClass( 'mw-revslider-revision-intermediate' ) )\n\t\t) {\n\t\t\tnewNewerPointerPos = clickedPos;\n\t\t\tnewOlderPointerPos = this.pointerOlder.getPosition();\n\t\t} else if ( !hasClickedTop &&\n\t\t\t( $revisionWrapper.hasClass( 'mw-revslider-revision-older' ) ||\n\t\t\t\t$revisionWrapper.hasClass( 'mw-revslider-revision-intermediate' ) )\n\t\t) {\n\t\t\tnewNewerPointerPos = this.pointerNewer.getPosition();\n\t\t\tnewOlderPointerPos = clickedPos;\n\t\t} else {\n\t\t\tif ( hasClickedTop ) {\n\t\t\t\tnewNewerPointerPos = clickedPos;\n\t\t\t\tnewOlderPointerPos = clickedPos - 1;\n\t\t\t} else {\n\t\t\t\tnewNewerPointerPos = clickedPos + 1;\n\t\t\t\tnewOlderPointerPos = clickedPos;\n\t\t\t}\n\t\t}\n\n\t\tif (\n\t\t\tnewOlderPointerPos === newNewerPointerPos ||\n\t\t\t!this.slider.getRevisionList().isValidPosition( newOlderPointerPos ) ||\n\t\t\t!this.slider.getRevisionList().isValidPosition( newNewerPointerPos )\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.updatePointersAndDiffView( newNewerPointerPos, newOlderPointerPos, true );\n\t},\n\n\t/**\n\t * @param {jQuery} $revisions\n\t */\n\taddClickHandlerToRevisions: function ( $revisions ) {\n\t\tvar self = this;\n\t\t$revisions.find( '.mw-revslider-revision-wrapper' ).on( 'click', function ( event ) {\n\t\t\tself.revisionWrapperClickHandler( event, $( this ) );\n\t\t} );\n\t},\n\n\t/**\n\t * Build rules for tabbing when `keydown` event triggers on pointers\n\t *\n\t * @param {jQuery} $pointer\n\t * @param {KeyboardEvent} event\n\t * @param {jQuery} $revisions\n\t */\n\tbuildTabbingRulesOnKeyDown: function ( $pointer, event, $revisions ) {\n\t\tvar self = this,\n\t\t\toldPos = self.getOlderPointerPos(),\n\t\t\tnewPos = self.getNewerPointerPos(),\n\t\t\tpointer = self.whichPointer( $pointer ),\n\t\t\toffset = 0,\n\t\t\tisNewer = pointer.getView().isNewerPointer();\n\n\t\tif ( event.which === 39 ) {\n\t\t\toffset = 1;\n\n\t\t\tif ( isNewer ) {\n\t\t\t\tif ( newPos === self.slider.getNewestVisibleRevisionIndex() + 1 ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tself.setNewerPointerPos( newPos + 1 );\n\t\t\t} else {\n\t\t\t\tif ( oldPos !== newPos - 1 ) {\n\t\t\t\t\tself.setOlderPointerPos( oldPos + 1 );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( event.which === 37 ) {\n\t\t\toffset = -1;\n\n\t\t\tif ( isNewer ) {\n\t\t\t\tif ( oldPos !== newPos - 1 ) {\n\t\t\t\t\tself.setNewerPointerPos( newPos - 1 );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif ( oldPos === self.slider.getOldestVisibleRevisionIndex() + 1 ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tself.setOlderPointerPos( oldPos - 1 );\n\t\t\t}\n\t\t}\n\n\t\tself.resetRevisionStylesBasedOnPointerPosition( $revisions );\n\t\tself.alignPointersAndLines( 1 );\n\n\t\tvar pos = self.getRevisionPositionFromLeftOffset(\n\t\t\t$pointer.offset().left + self.revisionWidth / 2\n\t\t) + offset;\n\n\t\tvar $hoveredRevisionWrapper = self.getRevElementAtPosition( $revisions, pos ).parent();\n\t\tself.getRevisionListView().showTooltip( $hoveredRevisionWrapper );\n\t},\n\n\t/**\n\t * Build rules for tabbing when `keyup` event triggers on pointers\n\t *\n\t * @param {jQuery} $pointer\n\t * @param {KeyboardEvent} event\n\t * @param {jQuery} $revisions\n\t */\n\tbuildTabbingRulesOnKeyUp: function ( $pointer, event, $revisions ) {\n\t\tvar self = this;\n\n\t\tif ( event.which !== 39 && event.which !== 37 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar diff = self.getRevElementAtPosition(\n\t\t\t$revisions, self.getNewerPointerPos()\n\t\t).data( 'revid' );\n\n\t\tvar oldid = self.getRevElementAtPosition(\n\t\t\t$revisions, self.getOlderPointerPos()\n\t\t).data( 'revid' );\n\n\t\tthis.lastRequest = self.refreshDiffView( diff, oldid, true );\n\n\t\tthis.lastRequest.then( function () {\n\t\t\t$pointer.trigger( 'focus' );\n\t\t} );\n\t},\n\n\t/**\n\t * Build options for the draggable\n\t *\n\t * @param {jQuery} $revisions\n\t * @param {string} containmentClass\n\t * @return {Object}\n\t */\n\tbuildDraggableOptions: function ( $revisions, containmentClass ) {\n\t\tvar lastValidLeftPos,\n\t\t\tself = this;\n\n\t\treturn {\n\t\t\taxis: 'x',\n\t\t\tgrid: [ this.revisionWidth, null ],\n\t\t\tcontainment: containmentClass,\n\t\t\tstart: function () {\n\t\t\t\tif ( self.pointerIsBlockedByOther( this ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tself.isDragged = true;\n\t\t\t\tself.getRevisionListView().disableHover();\n\t\t\t\tself.setPointerDragCursor();\n\t\t\t\tself.fadeOutPointerLines();\n\t\t\t\tself.escapePressed = false;\n\t\t\t\tself.lastOldPointerPosition = self.getOlderPointerPos();\n\t\t\t\tself.lastNewPointerPosition = self.getNewerPointerPos();\n\t\t\t},\n\t\t\tstop: function () {\n\t\t\t\tvar $p = $( this ),\n\t\t\t\t\trelativeIndex = self.getRelativePointerIndex( $p ),\n\t\t\t\t\tpointer = self.whichPointer( $p ),\n\t\t\t\t\tdiff, oldid;\n\n\t\t\t\tself.isDragged = false;\n\t\t\t\tself.getRevisionListView().enableHover();\n\t\t\t\tself.removePointerDragCursor();\n\n\t\t\t\tif ( self.escapePressed ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tmw.track( 'counter.MediaWiki.RevisionSlider.event.pointerMove' );\n\n\t\t\t\tpointer.setPosition( self.slider.getOldestVisibleRevisionIndex() + relativeIndex );\n\n\t\t\t\tdiff = self.getRevElementAtPosition(\n\t\t\t\t\t$revisions, self.getNewerPointerPos()\n\t\t\t\t).data( 'revid' );\n\n\t\t\t\toldid = self.getRevElementAtPosition(\n\t\t\t\t\t$revisions, self.getOlderPointerPos()\n\t\t\t\t).data( 'revid' );\n\n\t\t\t\tif ( self.getNewerPointerPos() === self.lastNewPointerPosition &&\n\t\t\t\t\tself.getOlderPointerPos() === self.lastOldPointerPosition ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tself.refreshDiffView( diff, oldid, true );\n\t\t\t\tself.alignPointersAndLines( 0 );\n\t\t\t\tself.resetRevisionStylesBasedOnPointerPosition( $revisions );\n\t\t\t},\n\t\t\tdrag: function ( event, ui ) {\n\t\t\t\tlastValidLeftPos = self.draggableDragAction(\n\t\t\t\t\tevent,\n\t\t\t\t\tui,\n\t\t\t\t\tthis,\n\t\t\t\t\tlastValidLeftPos\n\t\t\t\t);\n\t\t\t},\n\t\t\trevert: function () {\n\t\t\t\treturn self.escapePressed;\n\t\t\t}\n\t\t};\n\t},\n\n\tpointerIsBlockedByOther: function ( pointerElement ) {\n\t\tvar pointer = this.whichPointer( $( pointerElement ) ),\n\t\t\tisNewer = pointer.getView().isNewerPointer();\n\n\t\treturn ( isNewer && this.getOlderPointerPos() >= this.slider.getNewestVisibleRevisionIndex() + 1 ) ||\n\t\t\t( !isNewer && this.getNewerPointerPos() <= this.slider.getOldestVisibleRevisionIndex() + 1 );\n\t},\n\n\tdraggableDragAction: function ( event, ui, pointer, lastValidLeftPos ) {\n\t\tvar pos = this.getRevisionPositionFromLeftOffset(\n\t\t\t$( pointer ).offset().left + this.revisionWidth / 2\n\t\t);\n\n\t\tif ( pos === lastValidLeftPos ) {\n\t\t\treturn pos;\n\t\t}\n\n\t\tvar $revisions = this.getRevisionsElement();\n\t\tvar $hoveredRevisionWrapper = this.getRevElementAtPosition( $revisions, pos ).parent();\n\t\tthis.getRevisionListView().showTooltip( $hoveredRevisionWrapper );\n\n\t\treturn pos;\n\t},\n\n\tgetRevisionPositionFromLeftOffset: function ( leftOffset ) {\n\t\tvar $revisions = this.getRevisionsElement(),\n\t\t\trevisionsX = utils.correctElementOffsets( $revisions.offset() ).left,\n\t\t\tpos = Math.ceil( Math.abs( leftOffset - revisionsX ) / this.revisionWidth );\n\n\t\tif ( this.dir === 'rtl' ) {\n\t\t\t// pre-loading the revisions on the right side leads to shifted position numbers\n\t\t\tif ( this.slider.isAtStart() ) {\n\t\t\t\tpos = this.slider.getRevisionsPerWindow() - pos + 1;\n\t\t\t} else {\n\t\t\t\tpos += this.slider.getRevisionsPerWindow();\n\t\t\t}\n\t\t}\n\n\t\treturn pos;\n\t},\n\n\tsetPointerDragCursor: function () {\n\t\t$( '.mw-revslider-pointer, ' +\n\t\t\t'.mw-revslider-pointer-container, ' +\n\t\t\t'.mw-revslider-pointer-container-newer, ' +\n\t\t\t'.mw-revslider-pointer-container-older, ' +\n\t\t\t'.mw-revslider-pointer-line, ' +\n\t\t\t'.mw-revslider-revision-wrapper' )\n\t\t\t.addClass( 'mw-revslider-pointer-grabbing' );\n\t},\n\n\tremovePointerDragCursor: function () {\n\t\t$( '.mw-revslider-pointer, ' +\n\t\t\t'.mw-revslider-pointer-container, ' +\n\t\t\t'.mw-revslider-pointer-container-newer, ' +\n\t\t\t'.mw-revslider-pointer-container-older, ' +\n\t\t\t'.mw-revslider-pointer-line, ' +\n\t\t\t'.mw-revslider-revision-wrapper' )\n\t\t\t.removeClass( 'mw-revslider-pointer-grabbing' );\n\t},\n\n\t/**\n\t * Get the relative index for a pointer.\n\t *\n\t * @param {jQuery} $pointer\n\t * @return {number}\n\t */\n\tgetRelativePointerIndex: function ( $pointer ) {\n\t\tvar pos = $pointer.position().left,\n\t\t\tpointer = this.whichPointer( $pointer );\n\n\t\tif ( this.dir === 'rtl' ) {\n\t\t\tpos = pointer.getView().getAdjustedLeftPositionWhenRtl( pos );\n\t\t}\n\t\treturn Math.ceil( ( pos + this.revisionWidth / 2 ) / this.revisionWidth );\n\t},\n\n\t/**\n\t * Loads a new diff and optionally adds a state to the history\n\t *\n\t * @param {number} diff\n\t * @param {number} oldid\n\t * @param {boolean} pushState\n\t * @return {jQuery}\n\t */\n\trefreshDiffView: function ( diff, oldid, pushState ) {\n\t\tthis.diffPage.refresh( diff, oldid, this );\n\t\tif ( pushState ) {\n\t\t\tthis.diffPage.pushState( diff, oldid, this );\n\t\t}\n\t\treturn this.diffPage.lastRequest;\n\t},\n\n\tshowNextDiff: function () {\n\t\tthis.updatePointersAndDiffView(\n\t\t\tthis.getNewerPointerPos() + 1,\n\t\t\tthis.getNewerPointerPos(),\n\t\t\ttrue\n\t\t);\n\t},\n\n\tshowPrevDiff: function () {\n\t\tthis.updatePointersAndDiffView(\n\t\t\tthis.getOlderPointerPos(),\n\t\t\tthis.getOlderPointerPos() - 1,\n\t\t\ttrue\n\t\t);\n\t},\n\n\t/**\n\t * Updates and moves pointers to new positions, resets styles and refreshes diff accordingly\n\t *\n\t * @param {number} newPointerPos\n\t * @param {number} oldPointerPos\n\t * @param {boolean} pushState\n\t */\n\tupdatePointersAndDiffView: function (\n\t\tnewPointerPos,\n\t\toldPointerPos,\n\t\tpushState\n\t) {\n\t\tthis.setNewerPointerPos( newPointerPos );\n\t\tthis.setOlderPointerPos( oldPointerPos );\n\t\tthis.alignPointersAndLines();\n\t\tthis.resetRevisionStylesBasedOnPointerPosition( this.getRevisionsElement() );\n\t\tthis.refreshDiffView(\n\t\t\t+$( '.mw-revslider-revision[data-pos=\"' + newPointerPos + '\"]' ).attr( 'data-revid' ),\n\t\t\t+$( '.mw-revslider-revision[data-pos=\"' + oldPointerPos + '\"]' ).attr( 'data-revid' ),\n\t\t\tpushState\n\t\t);\n\t},\n\n\t/**\n\t * @param {jQuery} $revs\n\t * @param {number} pos\n\t * @return {jQuery}\n\t */\n\tgetRevElementAtPosition: function ( $revs, pos ) {\n\t\treturn $revs.find( 'div.mw-revslider-revision[data-pos=\"' + pos + '\"]' );\n\t},\n\n\t/**\n\t * Gets the jQuery element of the older selected revision\n\t *\n\t * @param {jQuery} $revs\n\t * @return {jQuery}\n\t */\n\tgetOldRevElement: function ( $revs ) {\n\t\treturn $revs.find( 'div.mw-revslider-revision[data-revid=\"' + mw.config.get( 'wgDiffOldId' ) + '\"]' );\n\t},\n\n\t/**\n\t * Gets the jQuery element of the newer selected revision\n\t *\n\t * @param {jQuery} $revs\n\t * @return {jQuery}\n\t */\n\tgetNewRevElement: function ( $revs ) {\n\t\treturn $revs.find( 'div.mw-revslider-revision[data-revid=\"' + mw.config.get( 'wgDiffNewId' ) + '\"]' );\n\t},\n\n\t/**\n\t * Initializes the Pointer objects based on the selected revisions\n\t *\n\t * @param {jQuery} $oldRevElement\n\t * @param {jQuery} $newRevElement\n\t */\n\tinitializePointers: function ( $oldRevElement, $newRevElement ) {\n\t\tif ( this.getOlderPointerPos() !== 0 || this.getNewerPointerPos() !== 0 ) {\n\t\t\treturn;\n\t\t}\n\t\tif ( $oldRevElement.length === 0 && $newRevElement.length === 0 ) {\n\t\t\t// Note: this is currently caught in init.js\n\t\t\tthrow new Error( 'RS-revs-not-specified' );\n\t\t}\n\t\tif ( $oldRevElement.length !== 0 ) {\n\t\t\tthis.setOlderPointerPos( $oldRevElement.data( 'pos' ) );\n\t\t} else {\n\t\t\tthis.setOlderPointerPos( -1 );\n\t\t}\n\t\tthis.setNewerPointerPos( $newRevElement.data( 'pos' ) );\n\t\tthis.resetSliderLines();\n\t},\n\n\t/**\n\t * Resets the slider lines based on the selected revisions\n\t */\n\tresetSliderLines: function () {\n\t\tthis.updateOlderSliderLineCSS();\n\t\tthis.updateNewerSliderLineCSS();\n\t},\n\n\tupdateOlderSliderLineCSS: function () {\n\t\tvar widthToSet = ( this.getOlderDistanceToOldest() + this.getDistanceBetweenPointers() ) *\n\t\t\t\tthis.revisionWidth,\n\t\t\tmarginToSet = -this.revisionWidth / 2;\n\n\t\twidthToSet = Math.min( widthToSet, this.calculateSliderContainerWidth() + this.revisionWidth );\n\n\t\tthis.setSliderLineCSS(\n\t\t\t$( '.mw-revslider-pointer-container-older' ), widthToSet, marginToSet\n\t\t);\n\t},\n\n\tupdateNewerSliderLineCSS: function () {\n\t\tvar widthToSet = ( this.getNewerDistanceToNewest() + this.getDistanceBetweenPointers() + 2 ) *\n\t\t\t\tthis.revisionWidth,\n\t\t\tmarginToSet = ( this.getOlderDistanceToOldest() * this.revisionWidth ) -\n\t\t\t\tthis.revisionWidth / 2;\n\n\t\twidthToSet = Math.min( widthToSet, this.calculateSliderContainerWidth() + this.revisionWidth );\n\t\tmarginToSet = Math.max( marginToSet, -0.5 * this.revisionWidth );\n\n\t\tthis.setSliderLineCSS(\n\t\t\t$( '.mw-revslider-pointer-container-newer' ), widthToSet, marginToSet\n\t\t);\n\t},\n\n\tsetSliderLineCSS: function ( $lineContainer, widthToSet, marginToSet ) {\n\t\tif ( this.dir === 'ltr' ) {\n\t\t\t$lineContainer.css( {\n\t\t\t\twidth: widthToSet,\n\t\t\t\t'margin-left': marginToSet\n\t\t\t} );\n\t\t} else {\n\t\t\t$lineContainer.css( {\n\t\t\t\twidth: widthToSet,\n\t\t\t\t'margin-right': marginToSet + this.revisionWidth\n\t\t\t} );\n\t\t}\n\t},\n\n\tgetOlderDistanceToOldest: function () {\n\t\treturn this.getOlderPointerPos() - this.slider.getOldestVisibleRevisionIndex();\n\t},\n\n\tgetNewerDistanceToNewest: function () {\n\t\treturn this.slider.getNewestVisibleRevisionIndex() - this.getNewerPointerPos();\n\t},\n\n\tgetDistanceBetweenPointers: function () {\n\t\treturn this.getNewerPointerPos() - this.getOlderPointerPos();\n\t},\n\n\t/**\n\t * Highlights revisions between the pointers\n\t *\n\t * @param {jQuery} $revisions\n\t */\n\tresetRevisionStylesBasedOnPointerPosition: function ( $revisions ) {\n\t\tvar olderRevPosition = this.getOlderPointerPos(),\n\t\t\tnewerRevPosition = this.getNewerPointerPos(),\n\t\t\tstartPosition = this.slider.getOldestVisibleRevisionIndex(),\n\t\t\tendPosition = this.slider.getNewestVisibleRevisionIndex(),\n\t\t\tpositionIndex = startPosition;\n\n\t\t$revisions.find( 'div.mw-revslider-revision' )\n\t\t\t.removeClass( 'mw-revslider-revision-old mw-revslider-revision-new' );\n\t\t$revisions.find( 'div.mw-revslider-revision-wrapper' )\n\t\t\t.removeClass( 'mw-revslider-revision-intermediate mw-revslider-revision-older mw-revslider-revision-newer' );\n\n\t\tthis.getRevElementAtPosition( $revisions, olderRevPosition ).addClass( 'mw-revslider-revision-old' );\n\t\tthis.getRevElementAtPosition( $revisions, newerRevPosition ).addClass( 'mw-revslider-revision-new' );\n\n\t\twhile ( positionIndex <= endPosition ) {\n\t\t\tpositionIndex++;\n\t\t\tif ( positionIndex <= olderRevPosition ) {\n\t\t\t\tthis.getRevElementAtPosition( $revisions, positionIndex ).parent().addClass( 'mw-revslider-revision-older' );\n\t\t\t} else if ( positionIndex > olderRevPosition && positionIndex < newerRevPosition ) {\n\t\t\t\tthis.getRevElementAtPosition( $revisions, positionIndex ).parent().addClass( 'mw-revslider-revision-intermediate' );\n\t\t\t} else if ( positionIndex >= newerRevPosition ) {\n\t\t\t\tthis.getRevElementAtPosition( $revisions, positionIndex ).parent().addClass( 'mw-revslider-revision-newer' );\n\t\t\t}\n\t\t}\n\t},\n\n\t/**\n\t * Redraws the lines for the pointers\n\t */\n\tredrawPointerLines: function () {\n\t\tthis.fadeInPointerLines();\n\t\t$( '.mw-revslider-pointer-line-upper, .mw-revslider-pointer-line-lower' )\n\t\t\t.removeClass( 'mw-revslider-bottom-line mw-revslider-left-line mw-revslider-right-line' );\n\t\tthis.pointerOlder.getLine().drawLine();\n\t\tthis.pointerNewer.getLine().drawLine();\n\t},\n\n\t/**\n\t * Fades out the lines for the pointers\n\t */\n\tfadeOutPointerLines: function () {\n\t\t// FIXME: Use CSS transition\n\t\t// eslint-disable-next-line no-jquery/no-fade\n\t\t$( '.mw-revslider-pointer-line' ).fadeTo( 0, 0.3 );\n\t},\n\n\t/**\n\t * Fades in the lines for the pointers\n\t */\n\tfadeInPointerLines: function () {\n\t\t// FIXME: Use CSS transition\n\t\t// eslint-disable-next-line no-jquery/no-fade\n\t\t$( '.mw-revslider-pointer-line' ).fadeTo( 0, 1 );\n\t},\n\n\t/**\n\t * @return {number}\n\t */\n\tcalculateSliderContainerWidth: function () {\n\t\treturn Math.min(\n\t\t\tthis.slider.getRevisionList().getLength(),\n\t\t\tutils.calculateRevisionsPerWindow( this.containerMargin + this.outerMargin, this.revisionWidth )\n\t\t) * this.revisionWidth;\n\t},\n\n\t/**\n\t * Slide the view to the next chunk of older / newer revisions\n\t *\n\t * @param {number} direction - Either -1, 0 or 1\n\t * @param {number|string} [duration]\n\t */\n\tslideView: function ( direction, duration ) {\n\t\tvar $animatedElement = this.$element.find( '.mw-revslider-revisions-container' ),\n\t\t\tself = this;\n\n\t\tthis.slider.slide( direction );\n\t\tthis.pointerOlder.getView().getElement().draggable( 'disable' );\n\t\tthis.pointerNewer.getView().getElement().draggable( 'disable' );\n\n\t\tif ( this.slider.isAtStart() ) {\n\t\t\tthis.backwardArrowButton.setDisabled( true );\n\t\t} else {\n\t\t\tthis.backwardArrowButton.setDisabled( false );\n\t\t}\n\t\tif ( this.slider.isAtEnd() ) {\n\t\t\tthis.forwardArrowButton.setDisabled( true );\n\t\t} else {\n\t\t\tthis.forwardArrowButton.setDisabled( false );\n\t\t}\n\n\t\tvar animateObj = { scrollLeft: this.slider.getOldestVisibleRevisionIndex() * this.revisionWidth };\n\t\tif ( this.dir === 'rtl' ) {\n\t\t\tanimateObj.scrollLeft = this.getRtlScrollLeft( $animatedElement, animateObj.scrollLeft );\n\t\t}\n\n\t\t// eslint-disable-next-line no-jquery/no-animate\n\t\t$animatedElement.animate(\n\t\t\tanimateObj,\n\t\t\tduration,\n\t\t\tnull,\n\t\t\tfunction () {\n\t\t\t\tself.pointerOlder.getView().getElement().draggable( 'enable' );\n\t\t\t\tself.pointerNewer.getView().getElement().draggable( 'enable' );\n\n\t\t\t\tif ( self.slider.isAtStart() && !self.noMoreOlderRevisions ) {\n\t\t\t\t\tself.addOlderRevisionsIfNeeded( $( '.mw-revslider-revision-slider' ) );\n\t\t\t\t}\n\t\t\t\tif ( self.slider.isAtEnd() && !self.noMoreNewerRevisions ) {\n\t\t\t\t\tself.addNewerRevisionsIfNeeded( $( '.mw-revslider-revision-slider' ) );\n\t\t\t\t}\n\n\t\t\t\tself.resetRevisionStylesBasedOnPointerPosition(\n\t\t\t\t\tself.getRevisionsElement()\n\t\t\t\t);\n\t\t\t}\n\t\t);\n\n\t\tthis.alignPointersAndLines( duration );\n\t},\n\n\t/**\n\t * @param {jQuery} $element\n\t * @param {number} scrollLeft\n\t * @return {number}\n\t */\n\tgetRtlScrollLeft: function ( $element, scrollLeft ) {\n\t\tif ( this.rtlScrollLeftType === 'reverse' ) {\n\t\t\treturn scrollLeft;\n\t\t}\n\t\tif ( this.rtlScrollLeftType === 'negative' ) {\n\t\t\treturn -scrollLeft;\n\t\t}\n\t\treturn $element.prop( 'scrollWidth' ) - $element.width() - scrollLeft;\n\t},\n\n\t/**\n\t * Visually move pointers to the positions set and reset pointer- and slider-lines\n\t *\n\t * @param {number|string} [duration]\n\t */\n\talignPointersAndLines: function ( duration ) {\n\t\tvar self = this;\n\n\t\tthis.fadeOutPointerLines();\n\n\t\tthis.pointerOlder.getView()\n\t\t\t.slideToSideOrPosition( this.slider, duration )\n\t\t\t.promise().done( function () {\n\t\t\t\tself.resetSliderLines();\n\t\t\t\tself.redrawPointerLines();\n\t\t\t} );\n\t\tthis.pointerNewer.getView()\n\t\t\t.slideToSideOrPosition( this.slider, duration )\n\t\t\t.promise().done( function () {\n\t\t\t\tself.resetSliderLines();\n\t\t\t\tself.redrawPointerLines();\n\t\t\t} );\n\t},\n\n\t/**\n\t * Returns the Pointer object that belongs to the passed element\n\t *\n\t * @param {jQuery} $e\n\t * @return {Pointer}\n\t */\n\twhichPointer: function ( $e ) {\n\t\treturn $e.hasClass( 'mw-revslider-pointer-older' ) ? this.pointerOlder : this.pointerNewer;\n\t},\n\n\t/**\n\t * @param {jQuery} $slider\n\t */\n\taddNewerRevisionsIfNeeded: function ( $slider ) {\n\t\tvar api = new RevisionSliderApi( mw.util.wikiScript( 'api' ) ),\n\t\t\tself = this,\n\t\t\trevisions = this.slider.getRevisionList().getRevisions(),\n\t\t\trevisionCount = utils.calculateRevisionsPerWindow( this.containerMargin + this.outerMargin, this.revisionWidth );\n\t\tif ( this.noMoreNewerRevisions || !this.slider.isAtEnd() ) {\n\t\t\treturn;\n\t\t}\n\t\tapi.fetchRevisionData( mw.config.get( 'wgPageName' ), {\n\t\t\tstartId: revisions[ revisions.length - 1 ].getId(),\n\t\t\tdir: 'newer',\n\t\t\tlimit: revisionCount + 1,\n\t\t\tknownUserGenders: this.slider.getRevisionList().getUserGenders(),\n\t\t\tchangeTags: this.slider.getRevisionList().getAvailableTags()\n\t\t} ).then( function ( data ) {\n\t\t\tvar revs = data.revisions.slice( 1 );\n\t\t\tif ( revs.length === 0 ) {\n\t\t\t\tself.noMoreNewerRevisions = true;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tself.addRevisionsAtEnd( $slider, revs );\n\n\t\t\tif ( !( 'continue' in data ) ) {\n\t\t\t\tself.noMoreNewerRevisions = true;\n\t\t\t}\n\t\t} );\n\t},\n\n\t/**\n\t * @param {jQuery} $slider\n\t */\n\taddOlderRevisionsIfNeeded: function ( $slider ) {\n\t\tvar api = new RevisionSliderApi( mw.util.wikiScript( 'api' ) ),\n\t\t\tself = this,\n\t\t\trevisions = this.slider.getRevisionList().getRevisions(),\n\t\t\trevisionCount = utils.calculateRevisionsPerWindow( this.containerMargin + this.outerMargin, this.revisionWidth ),\n\t\t\tprecedingRevisionSize = 0;\n\t\tif ( this.noMoreOlderRevisions || !this.slider.isAtStart() ) {\n\t\t\treturn;\n\t\t}\n\t\tapi.fetchRevisionData( mw.config.get( 'wgPageName' ), {\n\t\t\tstartId: revisions[ 0 ].getId(),\n\t\t\tdir: 'older',\n\t\t\t// fetch an extra revision if there are more older revision than the current \"window\",\n\t\t\t// this makes it possible to correctly set a size of the bar related to the oldest revision to add\n\t\t\tlimit: revisionCount + 2,\n\t\t\tknownUserGenders: this.slider.getRevisionList().getUserGenders(),\n\t\t\tchangeTags: this.slider.getRevisionList().getAvailableTags()\n\t\t} ).then( function ( data ) {\n\t\t\tvar revs = data.revisions.slice( 1 ).reverse();\n\t\t\tif ( revs.length === 0 ) {\n\t\t\t\tself.noMoreOlderRevisions = true;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( revs.length === revisionCount + 1 ) {\n\t\t\t\tprecedingRevisionSize = revs[ 0 ].size;\n\t\t\t\trevs = revs.slice( 1 );\n\t\t\t}\n\t\t\tself.addRevisionsAtStart( $slider, revs, precedingRevisionSize );\n\n\t\t\tif ( !( 'continue' in data ) ) {\n\t\t\t\tself.noMoreOlderRevisions = true;\n\t\t\t}\n\t\t} );\n\t},\n\n\t/**\n\t * @param {jQuery} $slider\n\t * @param {Array} revs\n\t */\n\taddRevisionsAtEnd: function ( $slider, revs ) {\n\t\tvar revPositionOffset = this.slider.getRevisionList().getLength(),\n\t\t\t$revisions = $slider.find( '.mw-revslider-revisions-container .mw-revslider-revisions' );\n\n\t\tthis.slider.getRevisionList().push( makeRevisions( revs ) );\n\n\t\t// Pushed revisions have their relative sizes set correctly with regard to the last previously\n\t\t// loaded revision. This should be taken into account when rendering newly loaded revisions (tooltip)\n\t\tvar revisionsToRender = this.slider.getRevisionList().slice( revPositionOffset );\n\n\t\tvar $addedRevisions = new RevisionListView( revisionsToRender, this.dir ).render( this.revisionWidth, revPositionOffset );\n\n\t\t$addedRevisions.find( '.mw-revslider-revision-wrapper' ).each( function () {\n\t\t\t$revisions.append( $( this ) );\n\t\t} );\n\n\t\tthis.addClickHandlerToRevisions( this.getRevisionsElement() );\n\n\t\tif ( this.shouldExpandSlider( $slider ) ) {\n\t\t\tthis.expandSlider( $slider );\n\t\t}\n\n\t\tthis.getRevisionListView().adjustRevisionSizes( $slider );\n\n\t\tif ( !this.slider.isAtEnd() ) {\n\t\t\tthis.forwardArrowButton.setDisabled( false );\n\t\t}\n\t},\n\n\t/**\n\t * @param {jQuery} $slider\n\t * @param {Array} revs\n\t * @param {number} precedingRevisionSize optional size of the revision preceding the first of revs,\n\t *                                        used to correctly determine first revision's relative size\n\t */\n\taddRevisionsAtStart: function ( $slider, revs, precedingRevisionSize ) {\n\t\tvar self = this,\n\t\t\t$revisions = $slider.find( '.mw-revslider-revisions-container .mw-revslider-revisions' ),\n\t\t\t$revisionContainer = $slider.find( '.mw-revslider-revisions-container' ),\n\t\t\trevisionStyleResetRequired = false;\n\n\t\tthis.slider.getRevisionList().unshift( makeRevisions( revs ), precedingRevisionSize );\n\n\t\t$slider.find( '.mw-revslider-revision' ).each( function () {\n\t\t\t$( this ).attr( 'data-pos', parseInt( $( this ).attr( 'data-pos' ), 10 ) + revs.length );\n\t\t} );\n\n\t\t// Pushed (unshifted) revisions have their relative sizes set correctly with regard to the last previously\n\t\t// loaded revision. This should be taken into account when rendering newly loaded revisions (tooltip)\n\t\tvar revisionsToRender = this.slider.getRevisionList().slice( 0, revs.length );\n\n\t\tvar $addedRevisions = new RevisionListView( revisionsToRender, this.dir ).render( this.revisionWidth );\n\n\t\tthis.addClickHandlerToRevisions( this.getRevisionsElement() );\n\n\t\tif ( this.getOlderPointerPos() !== -1 ) {\n\t\t\tthis.setOlderPointerPos( this.getOlderPointerPos() + revisionsToRender.getLength() );\n\t\t} else {\n\t\t\t// Special case: old revision has been previously not loaded, need to initialize correct position\n\t\t\tvar $oldRevElement = this.getOldRevElement( $addedRevisions );\n\t\t\tif ( $oldRevElement.length !== 0 ) {\n\t\t\t\tthis.setOlderPointerPos( $oldRevElement.data( 'pos' ) );\n\t\t\t\trevisionStyleResetRequired = true;\n\t\t\t}\n\n\t\t}\n\t\tthis.setNewerPointerPos( this.getNewerPointerPos() + revisionsToRender.getLength() );\n\n\t\t$( $addedRevisions.find( '.mw-revslider-revision-wrapper' ).get().reverse() ).each( function () { // TODO: this is horrible\n\t\t\t$revisions.prepend( $( this ) );\n\t\t} );\n\n\t\tif ( revisionStyleResetRequired ) {\n\t\t\tthis.resetRevisionStylesBasedOnPointerPosition( $slider );\n\t\t}\n\n\t\tthis.slider.setFirstVisibleRevisionIndex( this.slider.getOldestVisibleRevisionIndex() + revisionsToRender.getLength() );\n\n\t\tvar revIdOld = self.getRevElementAtPosition( $revisions, this.getOlderPointerPos() ).data( 'revid' );\n\t\tvar revIdNew = self.getRevElementAtPosition( $revisions, this.getNewerPointerPos() ).data( 'revid' );\n\t\tthis.diffPage.replaceState( revIdNew, revIdOld, this );\n\n\t\tvar scrollLeft = this.slider.getOldestVisibleRevisionIndex() * this.revisionWidth;\n\t\t$revisionContainer.scrollLeft( scrollLeft );\n\t\tif ( this.dir === 'rtl' ) {\n\t\t\t$revisionContainer.scrollLeft( self.getRtlScrollLeft( $revisionContainer, scrollLeft ) );\n\t\t}\n\n\t\tif ( this.shouldExpandSlider( $slider ) ) {\n\t\t\tthis.expandSlider( $slider );\n\t\t}\n\n\t\tthis.getRevisionListView().adjustRevisionSizes( $slider );\n\n\t\tthis.backwardArrowButton.setDisabled( false );\n\t},\n\n\t/**\n\t * @param {jQuery} $slider\n\t * @return {boolean}\n\t */\n\tshouldExpandSlider: function ( $slider ) {\n\t\tvar sliderWidth = $slider.width(),\n\t\t\tmaxAvailableWidth = this.calculateSliderContainerWidth() + this.containerMargin;\n\n\t\treturn !( this.noMoreNewerRevisions && this.noMoreOlderRevisions ) && sliderWidth < maxAvailableWidth;\n\t},\n\n\t/**\n\t * @param {jQuery} $slider\n\t */\n\texpandSlider: function ( $slider ) {\n\t\tvar containerWidth = this.calculateSliderContainerWidth();\n\n\t\t$slider.css( { width: ( containerWidth + this.containerMargin ) + 'px' } );\n\t\t$slider.find( '.mw-revslider-revisions-container' ).css( { width: containerWidth + 'px' } );\n\t\t$slider.find( '.mw-revslider-pointer-container' ).css( { width: containerWidth + this.revisionWidth - 1 + 'px' } );\n\n\t\tvar expandedRevisionWindowCapacity = $slider.find( '.mw-revslider-revisions-container' ).width() / this.revisionWidth;\n\t\tthis.slider.setRevisionsPerWindow( expandedRevisionWindowCapacity );\n\n\t\tthis.slideView( Math.floor( ( this.getNewerPointerPos() - 1 ) / expandedRevisionWindowCapacity ), 0 );\n\t},\n\n\t/**\n\t * @return {RevisionListView}\n\t */\n\tgetRevisionListView: function () {\n\t\treturn this.slider.getRevisionList().getView();\n\t},\n\n\t/**\n\t * @return {jQuery}\n\t */\n\tgetRevisionsElement: function () {\n\t\treturn this.getRevisionListView().getElement();\n\t}\n} );\n\nmodule.exports = SliderView;\n","usedDeprecatedRules":[]},{"filePath":"/src/repo/modules/ext.RevisionSlider.init.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/modules/ext.RevisionSlider.lazy.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/modules/ext.RevisionSlider.util.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/package-lock.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/package.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/tests/qunit/QUnit.revisionSlider.testOrSkip.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/tests/qunit/RevisionSlider.DiffPage.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/tests/qunit/RevisionSlider.HelpDialog.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/tests/qunit/RevisionSlider.Pointer.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/tests/qunit/RevisionSlider.PointerView.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/tests/qunit/RevisionSlider.Revision.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/tests/qunit/RevisionSlider.RevisionList.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/tests/qunit/RevisionSlider.RevisionListView.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/tests/qunit/RevisionSlider.Slider.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/tests/qunit/RevisionSlider.SliderView.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/tests/selenium/pageobjects/diff.page.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/tests/selenium/specs/autoexpand.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/tests/selenium/specs/difflinks.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/tests/selenium/specs/filterhighlighting.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/tests/selenium/specs/help.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/tests/selenium/specs/history.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/tests/selenium/specs/pointers.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/tests/selenium/specs/timeline.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/tests/selenium/specs/tooltips.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]},{"filePath":"/src/repo/tests/selenium/wdio.conf.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"no-process-exit","replacedBy":[]}]}]

--- end ---
$ ./node_modules/.bin/grunt stylelint
--- stdout ---
Running "stylelint:all" (stylelint) task

modules/ext.RevisionSlider.modern.css
 6:2  ✖  Needless disable for "unit-disallowed-list"  --report-needless-disables

modules/ext.RevisionSlider.monobook.css
 6:2  ✖  Needless disable for "unit-disallowed-list"  --report-needless-disables

modules/ext.RevisionSlider.lazy.less
 52:3  ✖  Expected double colon pseudo-element notation  selector-pseudo-element-colon-notation
 53:3  ✖  Expected double colon pseudo-element notation  selector-pseudo-element-colon-notation
 65:3  ✖  Expected double colon pseudo-element notation  selector-pseudo-element-colon-notation
 70:3  ✖  Expected double colon pseudo-element notation  selector-pseudo-element-colon-notation

6 problems (6 errors, 0 warnings)


⚠ 6 warnings

Warning: Task "stylelint:all" failed. Use --force to continue.

Aborted due to warnings.

--- end ---
$ ./node_modules/.bin/stylelint modules/ext.RevisionSlider.noscript.css modules/ext.RevisionSlider.monobook.css modules/ext.RevisionSlider.modern.css modules/ext.RevisionSlider.less modules/ext.RevisionSlider.lazy.less -f json
--- stdout ---
[{"source":"/src/repo/modules/ext.RevisionSlider.noscript.css","deprecations":[],"invalidOptionWarnings":[],"parseErrors":[],"errored":false,"warnings":[]},{"source":"/src/repo/modules/ext.RevisionSlider.monobook.css","deprecations":[],"invalidOptionWarnings":[],"parseErrors":[],"errored":false,"warnings":[{"text":"Needless disable for \"unit-disallowed-list\"","rule":"--report-needless-disables","line":6,"column":2,"endLine":6,"endColumn":55,"severity":"error"}]},{"source":"/src/repo/modules/ext.RevisionSlider.modern.css","deprecations":[],"invalidOptionWarnings":[],"parseErrors":[],"errored":false,"warnings":[{"text":"Needless disable for \"unit-disallowed-list\"","rule":"--report-needless-disables","line":6,"column":2,"endLine":6,"endColumn":55,"severity":"error"}]},{"source":"/src/repo/modules/ext.RevisionSlider.less","deprecations":[],"invalidOptionWarnings":[],"parseErrors":[],"errored":false,"warnings":[]},{"source":"/src/repo/modules/ext.RevisionSlider.lazy.less","deprecations":[],"invalidOptionWarnings":[],"parseErrors":[],"errored":true,"warnings":[{"line":52,"column":3,"endLine":52,"endColumn":4,"rule":"selector-pseudo-element-colon-notation","severity":"error","text":"Expected double colon pseudo-element notation (selector-pseudo-element-colon-notation)"},{"line":53,"column":3,"endLine":53,"endColumn":4,"rule":"selector-pseudo-element-colon-notation","severity":"error","text":"Expected double colon pseudo-element notation (selector-pseudo-element-colon-notation)"},{"line":65,"column":3,"endLine":65,"endColumn":4,"rule":"selector-pseudo-element-colon-notation","severity":"error","text":"Expected double colon pseudo-element notation (selector-pseudo-element-colon-notation)"},{"line":70,"column":3,"endLine":70,"endColumn":4,"rule":"selector-pseudo-element-colon-notation","severity":"error","text":"Expected double colon pseudo-element notation (selector-pseudo-element-colon-notation)"}]}]
--- end ---
$ /usr/bin/npm ci --legacy-peer-deps
--- stderr ---
npm WARN deprecated har-validator@5.1.5: this library is no longer supported
npm WARN deprecated debug@4.1.1: Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)
npm WARN deprecated uuid@3.4.0: 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.
npm WARN deprecated request@2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142
--- stdout ---

added 828 packages, and audited 829 packages in 10s

98 packages are looking for funding
  run `npm fund` for details

3 moderate severity vulnerabilities

Some issues need review, and may require choosing
a different dependency.

Run `npm audit` for details.

--- end ---
$ /usr/bin/npm test
--- stdout ---

> test
> grunt test

Running "eslint:all" (eslint) task

/src/repo/modules/ext.RevisionSlider.SliderView.js
  283:0  warning  Missing JSDoc @param "pos" type  jsdoc/require-param-type
  291:0  warning  Missing JSDoc @param "pos" type  jsdoc/require-param-type

✖ 2 problems (0 errors, 2 warnings)


Running "stylelint:all" (stylelint) task

modules/ext.RevisionSlider.modern.css
 1:1  ✖  Unknown rule --report-needless-disables      --report-needless-disables
 6:2  ✖  Needless disable for "unit-disallowed-list"  --report-needless-disables

modules/ext.RevisionSlider.monobook.css
 1:1  ✖  Unknown rule --report-needless-disables      --report-needless-disables
 6:2  ✖  Needless disable for "unit-disallowed-list"  --report-needless-disables

modules/ext.RevisionSlider.noscript.css
 1:1  ✖  Unknown rule --report-needless-disables  --report-needless-disables

modules/ext.RevisionSlider.lazy.less
 1:1  ✖  Unknown rule --report-needless-disables  --report-needless-disables

modules/ext.RevisionSlider.less
 1:1  ✖  Unknown rule --report-needless-disables  --report-needless-disables

7 problems (7 errors, 0 warnings)


⚠ 7 warnings

Warning: Task "stylelint:all" failed. Use --force to continue.

Aborted due to warnings.

--- end ---
Traceback (most recent call last):
  File "/venv/lib/python3.9/site-packages/runner-0.1.0-py3.9.egg/runner/__init__.py", line 1400, in main
    libup.run(args.repo, args.output, args.branch)
  File "/venv/lib/python3.9/site-packages/runner-0.1.0-py3.9.egg/runner/__init__.py", line 1338, in run
    self.npm_upgrade(plan)
  File "/venv/lib/python3.9/site-packages/runner-0.1.0-py3.9.egg/runner/__init__.py", line 1049, in npm_upgrade
    self.npm_test()
  File "/venv/lib/python3.9/site-packages/runner-0.1.0-py3.9.egg/runner/__init__.py", line 287, in npm_test
    self.check_call(['npm', 'test'])
  File "/venv/lib/python3.9/site-packages/runner-0.1.0-py3.9.egg/runner/shell2.py", line 54, in check_call
    res.check_returncode()
  File "/usr/lib/python3.9/subprocess.py", line 460, in check_returncode
    raise CalledProcessError(self.returncode, self.args, self.stdout,
subprocess.CalledProcessError: Command '['/usr/bin/npm', 'test']' returned non-zero exit status 3.
Source code is licensed under the AGPL.