Compare commits

...

1345 commits

Author SHA1 Message Date
JonnyWong16
1144bba580
v2.15.3
Some checks failed
Publish Snap / Build Snap Package (armhf) (push) Has been cancelled
Publish Docker / Build Docker Image (push) Has been cancelled
Publish Snap / Build Snap Package (arm64) (push) Has been cancelled
CodeQL / CodeQL Analysis (push) Has been cancelled
Publish Snap / Build Snap Package (amd64) (push) Has been cancelled
Publish Installers / Build MacOS Installer (push) Has been cancelled
Publish Installers / Build Windows Installer (push) Has been cancelled
Publish Snap / Discord Notification (push) Has been cancelled
Publish Docker / Discord Notification (push) Has been cancelled
Publish Installers / Discord Notification (push) Has been cancelled
Publish Installers / VirusTotal Scan (push) Has been cancelled
Publish Installers / Release Installers (push) Has been cancelled
2025-08-03 10:17:15 -07:00
JonnyWong16
443eb8da15
Disable browser autocomplete in notification and newsletter configs
Fixes #2557
2025-08-03 10:10:01 -07:00
Komu Wairagu
5ecd570f95
Allow users to set config values through environment variables. (#2543)
* - Allow users to set config values through environment variables.
- Fixes: https://github.com/Tautulli/Tautulli/issues/2309

* Prefix environment variables with `TAUTULLI_`
For: https://github.com/Tautulli/Tautulli/issues/2309

* Update handling Tautulli environment variables

* Add log message when environment variable not saved to config

---------

Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>
2025-08-03 09:42:58 -07:00
Tom Niget
b8589513c1
Remove duplicate "Total" entry in graph tooltips (#2534) 2025-08-03 09:42:44 -07:00
JonnyWong16
d46710962c
Add ability to return svg files using pms_image_proxy 2025-08-03 09:35:06 -07:00
JonnyWong16
5921a7d83f
Fix rounding of minutes in global stats play duration
Some checks failed
CodeQL / CodeQL Analysis (push) Has been cancelled
Publish Docker / Build Docker Image (push) Has been cancelled
Publish Installers / Build MacOS Installer (push) Has been cancelled
Publish Installers / Build Windows Installer (push) Has been cancelled
Publish Snap / Build Snap Package (amd64) (push) Has been cancelled
Publish Snap / Build Snap Package (arm64) (push) Has been cancelled
Publish Snap / Build Snap Package (armhf) (push) Has been cancelled
Publish Docker / Discord Notification (push) Has been cancelled
Publish Installers / VirusTotal Scan (push) Has been cancelled
Publish Installers / Release Installers (push) Has been cancelled
Publish Installers / Discord Notification (push) Has been cancelled
Publish Snap / Discord Notification (push) Has been cancelled
2025-07-14 19:54:45 -07:00
JonnyWong16
9a6253d775
Enable jquery.scrollbar on macosx and webkit
Fixes #2221

Ref: gromo/jquery.scrollbar#134
2025-05-10 16:30:02 -07:00
JonnyWong16
43fc7eebfe
Update is_hdr helper function 2025-05-10 16:26:12 -07:00
JonnyWong16
c4f8a81190
Add hearingImpaired and visualImparied to exporter fields
* `hearingImpaired` for `SubtitleStreams`
* `visualImpaired` for `AudioStreams`
2025-05-10 16:25:39 -07:00
JonnyWong16
f6bffe1850
Update plexapi==4.17.0 2025-05-10 16:13:23 -07:00
dependabot[bot]
3cb71f94a3
Bump plexapi from 4.16.1 to 4.17.0 (#2538)
Bumps [plexapi](https://github.com/pushingkarmaorg/python-plexapi) from 4.16.1 to 4.17.0.
- [Release notes](https://github.com/pushingkarmaorg/python-plexapi/releases)
- [Commits](https://github.com/pushingkarmaorg/python-plexapi/compare/4.16.1...4.17.0)

---
updated-dependencies:
- dependency-name: plexapi
  dependency-version: 4.17.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2025-05-10 16:10:03 -07:00
JonnyWong16
ff5edc06fe
Update crypto donation 2025-05-10 15:56:52 -07:00
JonnyWong16
cc88cffc1f
Fix retrieving history for collections/playlists with over 1000 items 2025-05-03 16:08:17 -07:00
JonnyWong16
e735294e1c
Uppercase ZIP archive export download tooltip 2025-04-18 18:21:27 -07:00
JonnyWong16
889026b092
Add auto sync winget fork to workflow 2025-04-12 16:56:10 -07:00
JonnyWong16
76f6a2da6b
v2.15.2 2025-04-12 16:02:46 -07:00
Tom Niget
d2a14ea6c0
Add hidden-by-default Total curve to the daily stream graph (#2497)
* Add hidden-by-default Total curve to the daily stream graph

* Update curve color

Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

---------

Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>
2025-04-12 15:58:28 -07:00
JonnyWong16
e6c0a12dd5
Add stream count to tab title on homepage
Closes #2517
2025-03-30 20:30:01 -07:00
JonnyWong16
24dd403a72
Activity card only link to library if section_id available 2025-03-29 20:42:53 -07:00
JonnyWong16
a876e006d6
Fix Trakt URL redirect to media page
Fixes #2513
2025-03-29 20:42:44 -07:00
dependabot[bot]
74786f0ed1
Bump cryptography from 43.0.3 to 44.0.2 (#2519)
Bumps [cryptography](https://github.com/pyca/cryptography) from 43.0.3 to 44.0.2.
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/43.0.3...44.0.2)

---
updated-dependencies:
- dependency-name: cryptography
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-24 14:05:05 -07:00
dependabot[bot]
99e575383c
Bump pyopenssl from 24.2.1 to 25.0.0 (#2482)
Bumps [pyopenssl](https://github.com/pyca/pyopenssl) from 24.2.1 to 25.0.0.
- [Changelog](https://github.com/pyca/pyopenssl/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/pyopenssl/compare/24.2.1...25.0.0)

---
updated-dependencies:
- dependency-name: pyopenssl
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2025-03-24 14:04:46 -07:00
JonnyWong16
3e784c7495
Check stream watched status before stopped status
Fixes #2506
2025-03-23 20:41:30 -07:00
JonnyWong16
68dc095c83
Do not redirect API requests to login page
Fixes #2490
2025-03-23 20:10:43 -07:00
JonnyWong16
ad2ec0e2bf
Fix CherryPy CORS response headers
Fixes #2279
2025-03-23 19:44:10 -07:00
JonnyWong16
09c28e434d
Check Pushover attachment under 5MB limit
Fixes #2396
2025-03-23 18:12:08 -07:00
JonnyWong16
cfc7b817b3
Downgrade pyinstaller to 6.10.0 2025-03-23 16:19:54 -07:00
JonnyWong16
b3aa29c677
Swap source and stream columns in steam info modal 2025-03-23 16:05:01 -07:00
JonnyWong16
e4d181ba5b
Add PATCH method for webhooks 2025-03-16 12:26:34 -07:00
JonnyWong16
53e5f89725
Add audio profile notification parameters 2025-03-16 12:26:33 -07:00
JonnyWong16
0879b848b9
Add link to library page from activity card media type icon 2025-03-16 12:26:32 -07:00
JonnyWong16
c70381c3ff
Fix ntfy notifications not sending if provider link is blank 2025-03-16 12:26:30 -07:00
JonnyWong16
f23d3eb81c
Fix changelog username 2025-03-16 12:26:28 -07:00
luzpaz
2ed603f288
Fix typos (#2520)
Found via codespell
2025-03-16 12:25:29 -07:00
JonnyWong16
a96fd23d72
v2.15.1 2025-01-11 15:27:24 -08:00
JonnyWong16
65dc466c07
Add Github token to release virus scan 2025-01-09 15:13:20 -08:00
JonnyWong16
0a4730625c
Update copyright year 2025-01-09 15:12:49 -08:00
JonnyWong16
67fa4ca645
Add logos to season and episode exports 2025-01-09 10:45:49 -08:00
JonnyWong16
078c293bd7
Update plexapi=4.16.1 2025-01-09 10:45:29 -08:00
JonnyWong16
85e9237608
Update pyjwt==2.10.1 2025-01-09 10:16:47 -08:00
dependabot[bot]
f9b3631745
Bump pyjwt from 2.10.0 to 2.10.1 (#2445)
Bumps [pyjwt](https://github.com/jpadilla/pyjwt) from 2.10.0 to 2.10.1.
- [Release notes](https://github.com/jpadilla/pyjwt/releases)
- [Changelog](https://github.com/jpadilla/pyjwt/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/jpadilla/pyjwt/compare/2.10.0...2.10.1)

---
updated-dependencies:
- dependency-name: pyjwt
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2025-01-09 10:14:37 -08:00
JonnyWong16
8f03e27617
Add VirusTotal scan to installer build CI 2025-01-09 09:57:58 -08:00
JonnyWong16
63fe386057
Disable basic auth for /newsletter and /image endpoints
Fixes #2472
2025-01-09 09:13:57 -08:00
chrisdecker08
b7c4f2eefe
detect HDR transcodes via colorTrc attribute (#2466) 2024-12-14 12:24:08 -08:00
JonnyWong16
37ef098718
Flip docker container healthcheck https first 2024-11-28 16:36:03 -08:00
JonnyWong16
78864d7a97
v2.15.0 2024-11-24 14:57:29 -08:00
JonnyWong16
62a05712f8
Add logos to exporter 2024-11-24 14:55:51 -08:00
JonnyWong16
ca0e1c321d
Convert CustomArrow to string in newsletter raw json 2024-11-24 14:17:35 -08:00
JonnyWong16
b9cb7102c4
Add plex_slug and plex_watch_url to nofication parameters 2024-11-19 10:58:55 -08:00
JonnyWong16
6e6fe1fb65
Add slugs to metadata details 2024-11-19 10:36:34 -08:00
peagravel
9c473c6528
Add friendly name to the top bar of config modals (#2432) 2024-11-19 10:14:45 -08:00
Castle
5c38de0dfb
Allow Telegram blockquote expandable (#2427)
* Allow Telegram blockquote expandable

Blockquote is not yet supported, this feature adds support along with expandable functionality.

* Add support for tg-emoji in Telegram HTML

---------

Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>
2024-11-19 10:12:00 -08:00
JonnyWong16
ea66f6713b
Add hasVoiceActivity to exporter fields 2024-11-19 10:09:02 -08:00
dependabot[bot]
dd9a35df51
Bump pyjwt from 2.9.0 to 2.10.0 (#2441)
* Bump pyjwt from 2.9.0 to 2.10.0

Bumps [pyjwt](https://github.com/jpadilla/pyjwt) from 2.9.0 to 2.10.0.
- [Release notes](https://github.com/jpadilla/pyjwt/releases)
- [Changelog](https://github.com/jpadilla/pyjwt/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/jpadilla/pyjwt/compare/2.9.0...2.10.0)

---
updated-dependencies:
- dependency-name: pyjwt
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update pyjwt==2.10.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-11-19 10:01:27 -08:00
dependabot[bot]
feca713b76
Bump dnspython from 2.6.1 to 2.7.0 (#2440)
* Bump dnspython from 2.6.1 to 2.7.0

Bumps [dnspython](https://github.com/rthalley/dnspython) from 2.6.1 to 2.7.0.
- [Release notes](https://github.com/rthalley/dnspython/releases)
- [Changelog](https://github.com/rthalley/dnspython/blob/main/doc/whatsnew.rst)
- [Commits](https://github.com/rthalley/dnspython/compare/v2.6.1...v2.7.0)

---
updated-dependencies:
- dependency-name: dnspython
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update dnspython==2.7.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-11-19 10:00:50 -08:00
dependabot[bot]
0836fb902c
Bump plexapi from 4.15.16 to 4.16.0 (#2439)
* Bump plexapi from 4.15.16 to 4.16.0

Bumps [plexapi](https://github.com/pkkid/python-plexapi) from 4.15.16 to 4.16.0.
- [Release notes](https://github.com/pkkid/python-plexapi/releases)
- [Commits](https://github.com/pkkid/python-plexapi/compare/4.15.16...4.16.0)

---
updated-dependencies:
- dependency-name: plexapi
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update plexapi==4.16.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-11-19 10:00:37 -08:00
dependabot[bot]
eb2c372d82
Bump bleach from 6.1.0 to 6.2.0 (#2438)
* Bump bleach from 6.1.0 to 6.2.0

Bumps [bleach](https://github.com/mozilla/bleach) from 6.1.0 to 6.2.0.
- [Changelog](https://github.com/mozilla/bleach/blob/main/CHANGES)
- [Commits](https://github.com/mozilla/bleach/compare/v6.1.0...v6.2.0)

---
updated-dependencies:
- dependency-name: bleach
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update bleach==6.2.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-11-19 10:00:24 -08:00
dependabot[bot]
be2e63e7e0
Bump pyparsing from 3.1.4 to 3.2.0 (#2437)
* Bump pyparsing from 3.1.4 to 3.2.0

Bumps [pyparsing](https://github.com/pyparsing/pyparsing) from 3.1.4 to 3.2.0.
- [Release notes](https://github.com/pyparsing/pyparsing/releases)
- [Changelog](https://github.com/pyparsing/pyparsing/blob/master/CHANGES)
- [Commits](https://github.com/pyparsing/pyparsing/compare/3.1.4...3.2.0)

---
updated-dependencies:
- dependency-name: pyparsing
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update pyparsing==3.2.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-11-19 10:00:11 -08:00
dependabot[bot]
2fe3f039cc
Bump tokenize-rt from 6.0.0 to 6.1.0 (#2436)
* Bump tokenize-rt from 6.0.0 to 6.1.0

Bumps [tokenize-rt](https://github.com/asottile/tokenize-rt) from 6.0.0 to 6.1.0.
- [Commits](https://github.com/asottile/tokenize-rt/compare/v6.0.0...v6.1.0)

---
updated-dependencies:
- dependency-name: tokenize-rt
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update tokenize-rt==6.1.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-11-19 09:59:58 -08:00
dependabot[bot]
baf926e5db
Bump markupsafe from 2.1.5 to 3.0.2 (#2435)
Bumps [markupsafe](https://github.com/pallets/markupsafe) from 2.1.5 to 3.0.2.
- [Release notes](https://github.com/pallets/markupsafe/releases)
- [Changelog](https://github.com/pallets/markupsafe/blob/main/CHANGES.rst)
- [Commits](https://github.com/pallets/markupsafe/compare/2.1.5...3.0.2)

---
updated-dependencies:
- dependency-name: markupsafe
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-11-19 09:59:40 -08:00
JonnyWong16
85b63fb61a
Remove backports.zoneinfo 2024-11-19 09:34:49 -08:00
JonnyWong16
afc29604cc
Bump zipp==3.21.0
Closes #2433
2024-11-19 09:34:48 -08:00
JonnyWong16
5b47cebdc7
Bump minimum Python version to 3.9 2024-11-16 15:21:41 -08:00
JonnyWong16
d9f38f9390
Fix artist title for fixing metadata match
Fixes #2429
2024-11-16 15:19:57 -08:00
JonnyWong16
86d775a586
Update OneSignal API calls 2024-11-16 15:19:56 -08:00
dependabot[bot]
ddb4f6131b
Bump pyinstaller from 6.8.0 to 6.11.1 (#2431)
Bumps [pyinstaller](https://github.com/pyinstaller/pyinstaller) from 6.8.0 to 6.11.1.
- [Release notes](https://github.com/pyinstaller/pyinstaller/releases)
- [Changelog](https://github.com/pyinstaller/pyinstaller/blob/develop/doc/CHANGES.rst)
- [Commits](https://github.com/pyinstaller/pyinstaller/compare/v6.8.0...v6.11.1)

---
updated-dependencies:
- dependency-name: pyinstaller
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-16 15:02:52 -08:00
dependabot[bot]
599e52de6a
Bump cryptography from 43.0.0 to 43.0.3 (#2421)
Bumps [cryptography](https://github.com/pyca/cryptography) from 43.0.0 to 43.0.3.
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/43.0.0...43.0.3)

---
updated-dependencies:
- dependency-name: cryptography
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-11-16 14:53:44 -08:00
dependabot[bot]
84be60cb36
Bump pywin32 from 306 to 308 (#2417)
Bumps [pywin32](https://github.com/mhammond/pywin32) from 306 to 308.
- [Release notes](https://github.com/mhammond/pywin32/releases)
- [Changelog](https://github.com/mhammond/pywin32/blob/main/CHANGES.txt)
- [Commits](https://github.com/mhammond/pywin32/commits)

---
updated-dependencies:
- dependency-name: pywin32
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-11-16 14:53:33 -08:00
dependabot[bot]
d9a87f9726
Bump packaging from 24.1 to 24.2 (#2428)
* Bump packaging from 24.1 to 24.2

Bumps [packaging](https://github.com/pypa/packaging) from 24.1 to 24.2.
- [Release notes](https://github.com/pypa/packaging/releases)
- [Changelog](https://github.com/pypa/packaging/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pypa/packaging/compare/24.1...24.2)

---
updated-dependencies:
- dependency-name: packaging
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update packaging==24.2

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-11-16 14:52:11 -08:00
dependabot[bot]
9289ead996
Bump mako from 1.3.5 to 1.3.6 (#2423)
* Bump mako from 1.3.5 to 1.3.6

Bumps [mako](https://github.com/sqlalchemy/mako) from 1.3.5 to 1.3.6.
- [Release notes](https://github.com/sqlalchemy/mako/releases)
- [Changelog](https://github.com/sqlalchemy/mako/blob/main/CHANGES)
- [Commits](https://github.com/sqlalchemy/mako/commits)

---
updated-dependencies:
- dependency-name: mako
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update mako==1.3.6

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-11-16 14:51:58 -08:00
dependabot[bot]
af752e0acc
Bump xmltodict from 0.13.0 to 0.14.2 (#2418)
* Bump xmltodict from 0.13.0 to 0.14.2

Bumps [xmltodict](https://github.com/martinblech/xmltodict) from 0.13.0 to 0.14.2.
- [Changelog](https://github.com/martinblech/xmltodict/blob/master/CHANGELOG.md)
- [Commits](https://github.com/martinblech/xmltodict/compare/v0.13.0...v0.14.2)

---
updated-dependencies:
- dependency-name: xmltodict
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update xmltodict==0.14.2

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-11-16 14:51:45 -08:00
dependabot[bot]
86abd130b0
Bump profilehooks from 1.12.0 to 1.13.0 (#2414)
* Bump profilehooks from 1.12.0 to 1.13.0

Bumps [profilehooks](https://github.com/mgedmin/profilehooks) from 1.12.0 to 1.13.0.
- [Changelog](https://github.com/mgedmin/profilehooks/blob/master/CHANGES.rst)
- [Commits](https://github.com/mgedmin/profilehooks/compare/1.12.0...1.13.0)

---
updated-dependencies:
- dependency-name: profilehooks
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update profilehooks==1.13.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-11-16 14:51:34 -08:00
dependabot[bot]
fc2c7cc871
Bump tzdata from 2024.1 to 2024.2 (#2409)
* Bump tzdata from 2024.1 to 2024.2

Bumps [tzdata](https://github.com/python/tzdata) from 2024.1 to 2024.2.
- [Release notes](https://github.com/python/tzdata/releases)
- [Changelog](https://github.com/python/tzdata/blob/master/NEWS.md)
- [Commits](https://github.com/python/tzdata/compare/2024.1...2024.2)

---
updated-dependencies:
- dependency-name: tzdata
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update tzdata==2024.2

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-11-16 14:51:22 -08:00
dependabot[bot]
025e8bcf58
Bump platformdirs from 4.2.2 to 4.3.6 (#2403)
* Bump platformdirs from 4.2.2 to 4.3.6

Bumps [platformdirs](https://github.com/tox-dev/platformdirs) from 4.2.2 to 4.3.6.
- [Release notes](https://github.com/tox-dev/platformdirs/releases)
- [Changelog](https://github.com/tox-dev/platformdirs/blob/main/CHANGES.rst)
- [Commits](https://github.com/tox-dev/platformdirs/compare/4.2.2...4.3.6)

---
updated-dependencies:
- dependency-name: platformdirs
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update platformdirs==4.3.6

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-11-16 14:51:10 -08:00
dependabot[bot]
bf07912711
Bump idna from 3.7 to 3.10 (#2400)
* Bump idna from 3.7 to 3.10

Bumps [idna](https://github.com/kjd/idna) from 3.7 to 3.10.
- [Release notes](https://github.com/kjd/idna/releases)
- [Changelog](https://github.com/kjd/idna/blob/master/HISTORY.rst)
- [Commits](https://github.com/kjd/idna/compare/v3.7...v3.10)

---
updated-dependencies:
- dependency-name: idna
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update idna==3.10

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-11-16 14:50:57 -08:00
dependabot[bot]
48b1c7b522
Bump pytz from 2024.1 to 2024.2 (#2398)
* Bump pytz from 2024.1 to 2024.2

Bumps [pytz](https://github.com/stub42/pytz) from 2024.1 to 2024.2.
- [Release notes](https://github.com/stub42/pytz/releases)
- [Commits](https://github.com/stub42/pytz/compare/release_2024.1...release_2024.2)

---
updated-dependencies:
- dependency-name: pytz
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update pytz==2024.2

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-11-16 14:49:08 -08:00
dependabot[bot]
e69852fa0e
Bump importlib-metadata from 8.2.0 to 8.5.0 (#2397)
* Bump importlib-metadata from 8.2.0 to 8.5.0

Bumps [importlib-metadata](https://github.com/python/importlib_metadata) from 8.2.0 to 8.5.0.
- [Release notes](https://github.com/python/importlib_metadata/releases)
- [Changelog](https://github.com/python/importlib_metadata/blob/main/NEWS.rst)
- [Commits](https://github.com/python/importlib_metadata/compare/v8.2.0...v8.5.0)

---
updated-dependencies:
- dependency-name: importlib-metadata
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update importlib-metadata==8.5.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-11-16 14:48:53 -08:00
dependabot[bot]
01589cb8b0
Bump importlib-resources from 6.4.0 to 6.4.5 (#2394)
* Bump importlib-resources from 6.4.0 to 6.4.5

Bumps [importlib-resources](https://github.com/python/importlib_resources) from 6.4.0 to 6.4.5.
- [Release notes](https://github.com/python/importlib_resources/releases)
- [Changelog](https://github.com/python/importlib_resources/blob/main/NEWS.rst)
- [Commits](https://github.com/python/importlib_resources/compare/v6.4.0...v6.4.5)

---
updated-dependencies:
- dependency-name: importlib-resources
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update importlib-resources==6.4.5

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-11-16 14:48:10 -08:00
dependabot[bot]
f3a2c02e96
Bump certifi from 2024.7.4 to 2024.8.30 (#2391)
* Bump certifi from 2024.7.4 to 2024.8.30

Bumps [certifi](https://github.com/certifi/python-certifi) from 2024.7.4 to 2024.8.30.
- [Commits](https://github.com/certifi/python-certifi/compare/2024.07.04...2024.08.30)

---
updated-dependencies:
- dependency-name: certifi
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update certifi==2024.8.30

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-11-16 14:47:58 -08:00
dependabot[bot]
d3f7eef84f
Bump pyparsing from 3.1.2 to 3.1.4 (#2388)
* Bump pyparsing from 3.1.2 to 3.1.4

Bumps [pyparsing](https://github.com/pyparsing/pyparsing) from 3.1.2 to 3.1.4.
- [Release notes](https://github.com/pyparsing/pyparsing/releases)
- [Changelog](https://github.com/pyparsing/pyparsing/blob/master/CHANGES)
- [Commits](https://github.com/pyparsing/pyparsing/compare/pyparsing_3.1.2...3.1.4)

---
updated-dependencies:
- dependency-name: pyparsing
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update pyparsing==3.1.4

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-11-16 14:47:48 -08:00
dependabot[bot]
2f3d24a0e7
Bump simplejson from 3.19.2 to 3.19.3 (#2379)
* Bump simplejson from 3.19.2 to 3.19.3

Bumps [simplejson](https://github.com/simplejson/simplejson) from 3.19.2 to 3.19.3.
- [Release notes](https://github.com/simplejson/simplejson/releases)
- [Changelog](https://github.com/simplejson/simplejson/blob/master/CHANGES.txt)
- [Commits](https://github.com/simplejson/simplejson/compare/v3.19.2...v3.19.3)

---
updated-dependencies:
- dependency-name: simplejson
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update simplejson==3.19.3

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-11-16 14:47:38 -08:00
JonnyWong16
2d3271376b
Remove unused cache_image function
Fixes #2426
2024-11-02 11:13:37 -07:00
JonnyWong16
940c2ae6cd
v2.14.6 2024-10-12 16:55:38 -07:00
JonnyWong16
1cdfd5f30a
Refactor scroller code 2024-09-28 14:30:40 -07:00
JonnyWong16
e3f4851883
Make recent rows touch scrollable 2024-09-28 13:17:09 -07:00
JonnyWong16
1353247b55
Allow formatting newsletter date parameters 2024-09-25 15:11:21 -07:00
JonnyWong16
3cf6560de3
Support apscheduler cron expressions 2024-09-25 11:54:55 -07:00
JonnyWong16
9ca8d59372
Fix auto-update not running 2024-09-23 16:52:17 -07:00
JonnyWong16
921a3a0af9
Round human duration to nearest significant base 2024-09-22 18:03:28 -07:00
JonnyWong16
3bb53f480e
Change snap package to cryptography 2024-09-21 14:17:08 -07:00
JonnyWong16
6979a4025f
v2.14.5 2024-09-20 20:29:15 -07:00
dependabot[bot]
cc1a325eac
Bump plexapi from 4.15.15 to 4.15.16 (#2383)
* Bump plexapi from 4.15.15 to 4.15.16

Bumps [plexapi](https://github.com/pkkid/python-plexapi) from 4.15.15 to 4.15.16.
- [Release notes](https://github.com/pkkid/python-plexapi/releases)
- [Commits](https://github.com/pkkid/python-plexapi/compare/4.15.15...4.15.16)

---
updated-dependencies:
- dependency-name: plexapi
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update plexapi==4.15.16

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-09-20 20:24:00 -07:00
JonnyWong16
de697cb2ca
Add 2k resolution override 2024-09-15 14:27:05 -07:00
JonnyWong16
596cf57d61
Do no initialize db connection in ActivityProcessor 2024-09-15 14:26:45 -07:00
JonnyWong16
ac32297160
Close database connection on garbage collection 2024-09-04 13:28:54 -07:00
JonnyWong16
330b8a3a82
Encode ntfy payload 2024-08-31 16:10:00 -07:00
JonnyWong16
5cf39cb097
Add Docker image labels 2024-08-17 11:27:17 -07:00
JonnyWong16
14c9c7a393
Replace PyCryptodome with Cryptography 2024-08-16 20:40:31 -07:00
JonnyWong16
cf8fb2e65d
Catch exception trying to remove PID file 2024-08-16 19:32:53 -07:00
JonnyWong16
623a9f2919
v2.14.4 2024-08-10 19:41:23 -07:00
JonnyWong16
3fb46a9ab7
Update workflow snapcraft actions branch 2024-08-10 19:30:12 -07:00
Teodor-Stelian Baltaretu
cfd81684b7
Removed deprecated getdefaultlocale (#2345) (#2364)
* Removed deprecated getdefaultlocale (#2345)

* Added Special Case For Windows (#2345)

* Refactored the changes into a cleaner code with comments (#2345)

* Changed the encoding method used and the selection of language

* Removed hardcoded encoding in Windows handling
2024-08-10 19:24:06 -07:00
dependabot[bot]
fb4f0046f3
Bump pyopenssl from 24.1.0 to 24.2.1 (#2368)
Bumps [pyopenssl](https://github.com/pyca/pyopenssl) from 24.1.0 to 24.2.1.
- [Changelog](https://github.com/pyca/pyopenssl/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/pyopenssl/compare/24.1.0...24.2.1)

---
updated-dependencies:
- dependency-name: pyopenssl
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-08-10 19:20:21 -07:00
dependabot[bot]
7d4efac75d
Bump tokenize-rt from 5.2.0 to 6.0.0 (#2376)
* Bump tokenize-rt from 5.2.0 to 6.0.0

Bumps [tokenize-rt](https://github.com/asottile/tokenize-rt) from 5.2.0 to 6.0.0.
- [Commits](https://github.com/asottile/tokenize-rt/compare/v5.2.0...v6.0.0)

---
updated-dependencies:
- dependency-name: tokenize-rt
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update tokenize-rt==6.0.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-08-10 19:19:28 -07:00
dependabot[bot]
509d18801b
Bump cloudinary from 1.40.0 to 1.41.0 (#2375)
* Bump cloudinary from 1.40.0 to 1.41.0

Bumps [cloudinary](https://github.com/cloudinary/pycloudinary) from 1.40.0 to 1.41.0.
- [Release notes](https://github.com/cloudinary/pycloudinary/releases)
- [Changelog](https://github.com/cloudinary/pycloudinary/blob/master/CHANGELOG.md)
- [Commits](https://github.com/cloudinary/pycloudinary/compare/1.40.0...1.41.0)

---
updated-dependencies:
- dependency-name: cloudinary
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update cloudinary==1.41.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-08-10 19:18:37 -07:00
dependabot[bot]
da501df846
Bump pyjwt from 2.8.0 to 2.9.0 (#2374)
* Bump pyjwt from 2.8.0 to 2.9.0

Bumps [pyjwt](https://github.com/jpadilla/pyjwt) from 2.8.0 to 2.9.0.
- [Release notes](https://github.com/jpadilla/pyjwt/releases)
- [Changelog](https://github.com/jpadilla/pyjwt/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/jpadilla/pyjwt/compare/2.8.0...2.9.0)

---
updated-dependencies:
- dependency-name: pyjwt
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update pyjwt==2.9.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-08-10 19:18:24 -07:00
dependabot[bot]
43cb027592
Bump tempora from 5.6.0 to 5.7.0 (#2371)
* Bump tempora from 5.6.0 to 5.7.0

Bumps [tempora](https://github.com/jaraco/tempora) from 5.6.0 to 5.7.0.
- [Release notes](https://github.com/jaraco/tempora/releases)
- [Changelog](https://github.com/jaraco/tempora/blob/main/NEWS.rst)
- [Commits](https://github.com/jaraco/tempora/compare/v5.6.0...v5.7.0)

---
updated-dependencies:
- dependency-name: tempora
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update tempora==5.7.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-08-10 19:16:20 -07:00
dependabot[bot]
2e6f541ec2
Bump importlib-metadata from 8.0.0 to 8.2.0 (#2370)
* Bump importlib-metadata from 8.0.0 to 8.2.0

Bumps [importlib-metadata](https://github.com/python/importlib_metadata) from 8.0.0 to 8.2.0.
- [Release notes](https://github.com/python/importlib_metadata/releases)
- [Changelog](https://github.com/python/importlib_metadata/blob/main/NEWS.rst)
- [Commits](https://github.com/python/importlib_metadata/compare/v8.0.0...v8.2.0)

---
updated-dependencies:
- dependency-name: importlib-metadata
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update importlib-metadata==8.2.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-08-10 19:16:03 -07:00
JonnyWong16
822d5a452c
Capitalize macOS platform 2024-08-10 19:13:56 -07:00
dependabot[bot]
7696d031d3
Bump certifi from 2024.6.2 to 2024.7.4 (#2361)
* Bump certifi from 2024.6.2 to 2024.7.4

Bumps [certifi](https://github.com/certifi/python-certifi) from 2024.6.2 to 2024.7.4.
- [Commits](https://github.com/certifi/python-certifi/compare/2024.06.02...2024.07.04)

---
updated-dependencies:
- dependency-name: certifi
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update certifi==2024.7.4

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>
2024-07-06 11:05:03 -07:00
dependabot[bot]
50ced86ba5
Bump importlib-metadata from 7.1.0 to 8.0.0 (#2360)
* Bump importlib-metadata from 7.1.0 to 8.0.0

Bumps [importlib-metadata](https://github.com/python/importlib_metadata) from 7.1.0 to 8.0.0.
- [Release notes](https://github.com/python/importlib_metadata/releases)
- [Changelog](https://github.com/python/importlib_metadata/blob/main/NEWS.rst)
- [Commits](https://github.com/python/importlib_metadata/compare/v7.1.0...v8.0.0)

---
updated-dependencies:
- dependency-name: importlib-metadata
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update importlib-metadata==8.0.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>
2024-07-06 11:04:54 -07:00
JonnyWong16
e934d09eff
Update plexapi==4.15.15 requirements.txt 2024-07-06 11:03:05 -07:00
JonnyWong16
96c5cb216c
Update plexapi==4.15.15 2024-07-06 11:02:21 -07:00
Nate Harris
2ee2ab652c
[FEAT] Add ntfy as a notifier (#2356)
* - Add ntfy as a notifier

* - Fix media poster attachment in ntfy
2024-07-06 10:02:36 -07:00
JonnyWong16
193b82c54a
Update Slack notification attachment 2024-06-30 14:15:11 -07:00
JonnyWong16
7d00383d1c
v2.14.3 2024-06-19 19:14:20 -07:00
dependabot[bot]
6f84ce8048
Bump docker/build-push-action from 5 to 6 (#2354)
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 5 to 6.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](https://github.com/docker/build-push-action/compare/v5...v6)

---
updated-dependencies:
- dependency-name: docker/build-push-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-06-19 00:06:18 -07:00
dependabot[bot]
709db66b10
Bump pyinstaller from 6.6.0 to 6.8.0 (#2346)
Bumps [pyinstaller](https://github.com/pyinstaller/pyinstaller) from 6.6.0 to 6.8.0.
- [Release notes](https://github.com/pyinstaller/pyinstaller/releases)
- [Changelog](https://github.com/pyinstaller/pyinstaller/blob/develop/doc/CHANGES.rst)
- [Commits](https://github.com/pyinstaller/pyinstaller/compare/v6.6.0...v6.8.0)

---
updated-dependencies:
- dependency-name: pyinstaller
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-06-19 00:06:02 -07:00
dependabot[bot]
2f1607b96b
Bump packaging from 24.0 to 24.1 (#2347)
* Bump packaging from 24.0 to 24.1

Bumps [packaging](https://github.com/pypa/packaging) from 24.0 to 24.1.
- [Release notes](https://github.com/pypa/packaging/releases)
- [Changelog](https://github.com/pypa/packaging/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pypa/packaging/compare/24.0...24.1)

---
updated-dependencies:
- dependency-name: packaging
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update packaging==24.1

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-06-19 00:04:34 -07:00
dependabot[bot]
28ad2716ba
Bump pyobjc-framework-cocoa from 10.2 to 10.3.1 (#2348)
Bumps [pyobjc-framework-cocoa](https://github.com/ronaldoussoren/pyobjc) from 10.2 to 10.3.1.
- [Release notes](https://github.com/ronaldoussoren/pyobjc/releases)
- [Changelog](https://github.com/ronaldoussoren/pyobjc/blob/master/docs/changelog.rst)
- [Commits](https://github.com/ronaldoussoren/pyobjc/compare/v10.2...v10.3.1)

---
updated-dependencies:
- dependency-name: pyobjc-framework-cocoa
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-06-19 00:04:15 -07:00
dependabot[bot]
f1a8164b94
Bump pyobjc-core from 10.2 to 10.3.1 (#2349)
Bumps [pyobjc-core](https://github.com/ronaldoussoren/pyobjc) from 10.2 to 10.3.1.
- [Release notes](https://github.com/ronaldoussoren/pyobjc/releases)
- [Changelog](https://github.com/ronaldoussoren/pyobjc/blob/master/docs/changelog.rst)
- [Commits](https://github.com/ronaldoussoren/pyobjc/compare/v10.2...v10.3.1)

---
updated-dependencies:
- dependency-name: pyobjc-core
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-06-19 00:03:23 -07:00
dependabot[bot]
3bc94cad6c
Bump tempora from 5.5.1 to 5.6.0 (#2355)
* Bump tempora from 5.5.1 to 5.6.0

Bumps [tempora](https://github.com/jaraco/tempora) from 5.5.1 to 5.6.0.
- [Release notes](https://github.com/jaraco/tempora/releases)
- [Changelog](https://github.com/jaraco/tempora/blob/main/NEWS.rst)
- [Commits](https://github.com/jaraco/tempora/compare/v5.5.1...v5.6.0)

---
updated-dependencies:
- dependency-name: tempora
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update tempora==5.6.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-06-19 00:02:54 -07:00
dependabot[bot]
a528f052b9
Bump cherrypy from 18.9.0 to 18.10.0 (#2353)
* Bump cherrypy from 18.9.0 to 18.10.0

Bumps [cherrypy](https://github.com/cherrypy/cherrypy) from 18.9.0 to 18.10.0.
- [Changelog](https://github.com/cherrypy/cherrypy/blob/main/CHANGES.rst)
- [Commits](https://github.com/cherrypy/cherrypy/compare/v18.9.0...v18.10.0)

---
updated-dependencies:
- dependency-name: cherrypy
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update cherrypy==18.10.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-06-19 00:02:35 -07:00
dependabot[bot]
5e977c044a
Bump zipp from 3.18.2 to 3.19.2 (#2343)
* Bump zipp from 3.18.2 to 3.19.2

Bumps [zipp](https://github.com/jaraco/zipp) from 3.18.2 to 3.19.2.
- [Release notes](https://github.com/jaraco/zipp/releases)
- [Changelog](https://github.com/jaraco/zipp/blob/main/NEWS.rst)
- [Commits](https://github.com/jaraco/zipp/compare/v3.18.2...v3.19.2)

---
updated-dependencies:
- dependency-name: zipp
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update zipp==3.19.2

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-06-19 00:02:06 -07:00
dependabot[bot]
afa25d45f6
Bump certifi from 2024.2.2 to 2024.6.2 (#2342)
* Bump certifi from 2024.2.2 to 2024.6.2

Bumps [certifi](https://github.com/certifi/python-certifi) from 2024.2.2 to 2024.6.2.
- [Commits](https://github.com/certifi/python-certifi/compare/2024.02.02...2024.06.02)

---
updated-dependencies:
- dependency-name: certifi
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update certifi==2024.6.2

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-06-19 00:01:47 -07:00
dependabot[bot]
43e71d836a
Bump requests from 2.31.0 to 2.32.3 (#2338)
* Bump requests from 2.31.0 to 2.32.3

Bumps [requests](https://github.com/psf/requests) from 2.31.0 to 2.32.3.
- [Release notes](https://github.com/psf/requests/releases)
- [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md)
- [Commits](https://github.com/psf/requests/compare/v2.31.0...v2.32.3)

---
updated-dependencies:
- dependency-name: requests
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update requests==2.32.3

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-06-19 00:01:34 -07:00
JonnyWong16
55573d26ea
Ignore shutdown exception in cheroot 2024-06-18 19:19:18 -07:00
JonnyWong16
f1d44c051d
Fix loading of scheduled tasks when tasks are disabled 2024-06-06 21:39:33 -07:00
JonnyWong16
a3af8ed362
Fix width of use secure connection checkbox in wizard 2024-06-03 23:14:19 -07:00
JonnyWong16
912fd75a2f
Remove pms_is_remote setting
* Automatically determine if a server is local or remote
2024-06-03 23:14:19 -07:00
JonnyWong16
5778672dab
Fix webserver restarting 2024-05-25 18:41:17 -07:00
JonnyWong16
dcdf5a2992
Fix SQLite quotes for history date filters 2024-05-21 10:40:00 -07:00
JonnyWong16
73cfa8e0c0
Add git clean to reset git install 2024-05-18 14:29:53 -07:00
JonnyWong16
795d568df2
v2.14.2 2024-05-18 13:56:06 -07:00
JonnyWong16
8396a04ce8
Update plexapi==4.15.13 2024-05-18 13:52:52 -07:00
JonnyWong16
8419eee4b2
Catch exception when decoding server response message 2024-05-18 13:50:37 -07:00
dependabot[bot]
c505e26656
Bump zipp from 3.18.1 to 3.18.2 (#2326)
* Bump zipp from 3.18.1 to 3.18.2

Bumps [zipp](https://github.com/jaraco/zipp) from 3.18.1 to 3.18.2.
- [Release notes](https://github.com/jaraco/zipp/releases)
- [Changelog](https://github.com/jaraco/zipp/blob/main/NEWS.rst)
- [Commits](https://github.com/jaraco/zipp/compare/v3.18.1...v3.18.2)

---
updated-dependencies:
- dependency-name: zipp
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update zipp==3.18.2

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-05-18 11:17:26 -07:00
dependabot[bot]
37ffe68ce2
Bump mako from 1.3.3 to 1.3.5 (#2325)
* Bump mako from 1.3.3 to 1.3.5

Bumps [mako](https://github.com/sqlalchemy/mako) from 1.3.3 to 1.3.5.
- [Release notes](https://github.com/sqlalchemy/mako/releases)
- [Changelog](https://github.com/sqlalchemy/mako/blob/main/CHANGES)
- [Commits](https://github.com/sqlalchemy/mako/commits)

---
updated-dependencies:
- dependency-name: mako
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update mako==1.3.5

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-05-18 11:17:13 -07:00
dependabot[bot]
dc9e778111
Bump platformdirs from 4.2.1 to 4.2.2 (#2324)
* Bump platformdirs from 4.2.1 to 4.2.2

Bumps [platformdirs](https://github.com/platformdirs/platformdirs) from 4.2.1 to 4.2.2.
- [Release notes](https://github.com/platformdirs/platformdirs/releases)
- [Changelog](https://github.com/platformdirs/platformdirs/blob/main/CHANGES.rst)
- [Commits](https://github.com/platformdirs/platformdirs/compare/4.2.1...4.2.2)

---
updated-dependencies:
- dependency-name: platformdirs
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update platformdirs==4.2.2

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-05-18 11:17:01 -07:00
JonnyWong16
68bf1c70f7
Overwrite image provider export field for uploaded assets 2024-05-13 20:56:40 -07:00
JonnyWong16
ee0b4c0602
Add artProvider and thumbProvider to exporter fields 2024-05-12 22:38:05 -07:00
JonnyWong16
5c115dec68
Fix uploading MacOS installer release asset 2024-05-11 09:51:05 -07:00
JonnyWong16
1d77f32665
v2.14.1-beta 2024-05-11 09:33:49 -07:00
JonnyWong16
af01b8c6cc
Fix appending user ids 2024-05-09 22:43:57 -07:00
JonnyWong16
dd9d3b97a2
Update workflow joncloud/makensis-action@v4.1
[skip ci]
2024-05-09 22:41:07 -07:00
JonnyWong16
96c20ad893
Update cloudinary==1.40.0 2024-05-09 22:31:06 -07:00
dependabot[bot]
5e90f3bb31
Bump paho-mqtt from 2.0.0 to 2.1.0 (#2316)
* Bump paho-mqtt from 2.0.0 to 2.1.0

Bumps [paho-mqtt](https://github.com/eclipse/paho.mqtt.python) from 2.0.0 to 2.1.0.
- [Release notes](https://github.com/eclipse/paho.mqtt.python/releases)
- [Changelog](https://github.com/eclipse/paho.mqtt.python/blob/master/ChangeLog.txt)
- [Commits](https://github.com/eclipse/paho.mqtt.python/compare/v2.0.0...v2.1.0)

---
updated-dependencies:
- dependency-name: paho-mqtt
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update paho-mqtt==2.1.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-05-09 22:28:50 -07:00
dependabot[bot]
dab46249f2
Bump websocket-client from 1.7.0 to 1.8.0 (#2313)
* Bump websocket-client from 1.7.0 to 1.8.0

Bumps [websocket-client](https://github.com/websocket-client/websocket-client) from 1.7.0 to 1.8.0.
- [Release notes](https://github.com/websocket-client/websocket-client/releases)
- [Changelog](https://github.com/websocket-client/websocket-client/blob/master/ChangeLog)
- [Commits](https://github.com/websocket-client/websocket-client/compare/v1.7.0...v1.8.0)

---
updated-dependencies:
- dependency-name: websocket-client
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update websocket-client==1.8.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-05-09 22:28:14 -07:00
dependabot[bot]
5d0ba8b222
Bump platformdirs from 4.2.0 to 4.2.1 (#2312)
* Bump platformdirs from 4.2.0 to 4.2.1

Bumps [platformdirs](https://github.com/platformdirs/platformdirs) from 4.2.0 to 4.2.1.
- [Release notes](https://github.com/platformdirs/platformdirs/releases)
- [Changelog](https://github.com/platformdirs/platformdirs/blob/main/CHANGES.rst)
- [Commits](https://github.com/platformdirs/platformdirs/compare/4.2.0...4.2.1)

---
updated-dependencies:
- dependency-name: platformdirs
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update platformdirs==4.2.1

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-05-09 22:27:59 -07:00
dependabot[bot]
3e8a5663a3
Bump plexapi from 4.15.11 to 4.15.12 (#2311)
* Bump plexapi from 4.15.11 to 4.15.12

Bumps [plexapi](https://github.com/pkkid/python-plexapi) from 4.15.11 to 4.15.12.
- [Release notes](https://github.com/pkkid/python-plexapi/releases)
- [Commits](https://github.com/pkkid/python-plexapi/compare/4.15.11...4.15.12)

---
updated-dependencies:
- dependency-name: plexapi
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update plexapi==4.15.12

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-05-09 22:27:15 -07:00
dependabot[bot]
6414a0ba12
Bump cheroot from 10.0.0 to 10.0.1 (#2310)
* Bump cheroot from 10.0.0 to 10.0.1

Bumps [cheroot](https://github.com/cherrypy/cheroot) from 10.0.0 to 10.0.1.
- [Release notes](https://github.com/cherrypy/cheroot/releases)
- [Changelog](https://github.com/cherrypy/cheroot/blob/main/CHANGES.rst)
- [Commits](https://github.com/cherrypy/cheroot/compare/v10.0.0...v10.0.1)

---
updated-dependencies:
- dependency-name: cheroot
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update cheroot==10.0.1

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-05-09 22:27:04 -07:00
dependabot[bot]
bcac5b7897
Bump cloudinary from 1.39.1 to 1.40.0 (#2308)
Bumps [cloudinary](https://github.com/cloudinary/pycloudinary) from 1.39.1 to 1.40.0.
- [Release notes](https://github.com/cloudinary/pycloudinary/releases)
- [Changelog](https://github.com/cloudinary/pycloudinary/blob/master/CHANGELOG.md)
- [Commits](https://github.com/cloudinary/pycloudinary/compare/1.39.1...1.40.0)

---
updated-dependencies:
- dependency-name: cloudinary
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-05-09 22:20:53 -07:00
Tom Niget
de3393d62b
Remove Python 2 handling code (#2098)
* Remove Python 2 update modal

* Remove Python 2 handling code

* Remove backports dependencies

* Remove uses of future and __future__

* Fix import

* Remove requirements

* Update lib folder

* Clean up imports and blank lines

---------

Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>
2024-05-09 22:18:08 -07:00
JonnyWong16
dcec1f6f5f
Update snapcraft git data folder 2024-05-09 21:55:26 -07:00
JonnyWong16
65905a6647
Fix escaping regex string 2024-05-09 21:52:39 -07:00
JonnyWong16
5de2cf85c3
Workaround users remaining in friends list without shared libraries 2024-05-09 20:49:06 -07:00
JonnyWong16
a7660d5c03
v2.14.0-beta 2024-04-18 22:41:23 -07:00
JonnyWong16
5e02db897f
Remove anonymous redirect 2024-04-18 13:12:56 -07:00
JonnyWong16
52e2950aa9
Add no-referrer policy 2024-04-18 13:12:47 -07:00
dependabot[bot]
acf1b2384a
Bump pyinstaller from 6.5.0 to 6.6.0 (#2307)
Bumps [pyinstaller](https://github.com/pyinstaller/pyinstaller) from 6.5.0 to 6.6.0.
- [Release notes](https://github.com/pyinstaller/pyinstaller/releases)
- [Changelog](https://github.com/pyinstaller/pyinstaller/blob/develop/doc/CHANGES.rst)
- [Commits](https://github.com/pyinstaller/pyinstaller/compare/v6.5.0...v6.6.0)

---
updated-dependencies:
- dependency-name: pyinstaller
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-18 13:03:30 -07:00
dependabot[bot]
07166ae6b2
Bump idna from 3.6 to 3.7 (#2304)
* Bump idna from 3.6 to 3.7

Bumps [idna](https://github.com/kjd/idna) from 3.6 to 3.7.
- [Release notes](https://github.com/kjd/idna/releases)
- [Changelog](https://github.com/kjd/idna/blob/master/HISTORY.rst)
- [Commits](https://github.com/kjd/idna/compare/v3.6...v3.7)

---
updated-dependencies:
- dependency-name: idna
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update idna==3.7

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-04-18 13:01:25 -07:00
dependabot[bot]
80984bd296
Bump mako from 1.3.2 to 1.3.3 (#2303)
* Bump mako from 1.3.2 to 1.3.3

Bumps [mako](https://github.com/sqlalchemy/mako) from 1.3.2 to 1.3.3.
- [Release notes](https://github.com/sqlalchemy/mako/releases)
- [Changelog](https://github.com/sqlalchemy/mako/blob/main/CHANGES)
- [Commits](https://github.com/sqlalchemy/mako/commits)

---
updated-dependencies:
- dependency-name: mako
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update mako==1.3.3

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-04-18 13:01:09 -07:00
JonnyWong16
6a9e532805
Change path join for session metadata cache 2024-04-07 15:58:28 -07:00
JonnyWong16
2258a88168
Use metadata from session for stale live tv sessions 2024-04-07 15:58:01 -07:00
JonnyWong16
282810e9ca
Increase Remote app PBKDF2 iterations to 600,000 and SHA256 hash
OWASP Cheat Sheet recommends 600,000 iterations for SHA256.

https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html#pbkdf2
2024-04-04 22:57:17 -07:00
JonnyWong16
4582ff4a56
Fix grouping live tv history 2024-04-01 21:47:33 -07:00
JonnyWong16
10e62ca42d
Fix stats on live tv info pages 2024-04-01 19:02:52 -07:00
JonnyWong16
e3245bc126
Add live tv channel keys notification parameters 2024-04-01 19:02:52 -07:00
JonnyWong16
3dc6d226f8
Add live tv channel keys to database 2024-04-01 19:02:52 -07:00
JonnyWong16
177962d626
Change live tv text to channel title 2024-04-01 19:02:52 -07:00
JonnyWong16
5e4f656155
Add space to session start live tv log message 2024-04-01 19:02:52 -07:00
JonnyWong16
980fc8a43f
Fix live tv history watched status 2024-04-01 19:02:52 -07:00
JonnyWong16
458e89b8d7
Get live TV metadata from epg 2024-04-01 19:02:52 -07:00
JonnyWong16
b8185afdf9
Temporary fix for live tv session missing duration 2024-03-31 17:09:35 -07:00
JonnyWong16
85519b1b45
Update plexapi==4.15.11 2024-03-31 16:11:00 -07:00
dependabot[bot]
653a6d5c12
Bump pyinstaller from 6.4.0 to 6.5.0 (#2298)
Bumps [pyinstaller](https://github.com/pyinstaller/pyinstaller) from 6.4.0 to 6.5.0.
- [Release notes](https://github.com/pyinstaller/pyinstaller/releases)
- [Changelog](https://github.com/pyinstaller/pyinstaller/blob/develop/doc/CHANGES.rst)
- [Commits](https://github.com/pyinstaller/pyinstaller/compare/v6.4.0...v6.5.0)

---
updated-dependencies:
- dependency-name: pyinstaller
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-30 15:46:44 -07:00
dependabot[bot]
b2a8601c70
Bump pyobjc-framework-cocoa from 10.1 to 10.2 (#2299)
Bumps [pyobjc-framework-cocoa](https://github.com/ronaldoussoren/pyobjc) from 10.1 to 10.2.
- [Release notes](https://github.com/ronaldoussoren/pyobjc/releases)
- [Changelog](https://github.com/ronaldoussoren/pyobjc/blob/master/docs/changelog.rst)
- [Commits](https://github.com/ronaldoussoren/pyobjc/compare/v10.1...v10.2)

---
updated-dependencies:
- dependency-name: pyobjc-framework-cocoa
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-03-30 15:30:09 -07:00
dependabot[bot]
938b48c5aa
Bump pyobjc-core from 10.1 to 10.2 (#2294)
Bumps [pyobjc-core](https://github.com/ronaldoussoren/pyobjc) from 10.1 to 10.2.
- [Release notes](https://github.com/ronaldoussoren/pyobjc/releases)
- [Changelog](https://github.com/ronaldoussoren/pyobjc/blob/master/docs/changelog.rst)
- [Commits](https://github.com/ronaldoussoren/pyobjc/compare/v10.1...v10.2)

---
updated-dependencies:
- dependency-name: pyobjc-core
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-03-30 15:29:37 -07:00
dependabot[bot]
cdfffda877
Bump pyopenssl from 24.0.0 to 24.1.0 (#2290)
Bumps [pyopenssl](https://github.com/pyca/pyopenssl) from 24.0.0 to 24.1.0.
- [Changelog](https://github.com/pyca/pyopenssl/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/pyopenssl/compare/24.0.0...24.1.0)

---
updated-dependencies:
- dependency-name: pyopenssl
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-03-30 15:29:25 -07:00
dependabot[bot]
b6eca379fa
Bump idna from 3.4 to 3.6 (#2300)
* Bump idna from 3.4 to 3.6

Bumps [idna](https://github.com/kjd/idna) from 3.4 to 3.6.
- [Changelog](https://github.com/kjd/idna/blob/master/HISTORY.rst)
- [Commits](https://github.com/kjd/idna/compare/v3.4...v3.6)

---
updated-dependencies:
- dependency-name: idna
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update idna==3.6

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-03-30 15:29:14 -07:00
dependabot[bot]
aa2006c2cc
Bump markupsafe from 2.1.3 to 2.1.5 (#2297)
Bumps [markupsafe](https://github.com/pallets/markupsafe) from 2.1.3 to 2.1.5.
- [Release notes](https://github.com/pallets/markupsafe/releases)
- [Changelog](https://github.com/pallets/markupsafe/blob/main/CHANGES.rst)
- [Commits](https://github.com/pallets/markupsafe/compare/2.1.3...2.1.5)

---
updated-dependencies:
- dependency-name: markupsafe
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-03-30 15:29:02 -07:00
dependabot[bot]
26358427ce
Bump pyparsing from 3.1.1 to 3.1.2 (#2296)
* Bump pyparsing from 3.1.1 to 3.1.2

Bumps [pyparsing](https://github.com/pyparsing/pyparsing) from 3.1.1 to 3.1.2.
- [Release notes](https://github.com/pyparsing/pyparsing/releases)
- [Changelog](https://github.com/pyparsing/pyparsing/blob/master/CHANGES)
- [Commits](https://github.com/pyparsing/pyparsing/compare/3.1.1...pyparsing_3.1.2)

---
updated-dependencies:
- dependency-name: pyparsing
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update pyparsing==3.1.2

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-03-30 15:28:45 -07:00
dependabot[bot]
1d96e0f859
Bump tzdata from 2023.3 to 2024.1 (#2295)
* Bump tzdata from 2023.3 to 2024.1

Bumps [tzdata](https://github.com/python/tzdata) from 2023.3 to 2024.1.
- [Release notes](https://github.com/python/tzdata/releases)
- [Changelog](https://github.com/python/tzdata/blob/master/NEWS.md)
- [Commits](https://github.com/python/tzdata/compare/2023.3...2024.1)

---
updated-dependencies:
- dependency-name: tzdata
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update tzdata==2024.1

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-03-30 15:28:14 -07:00
dependabot[bot]
0d1d2a3e6b
Bump requests-oauthlib from 1.3.1 to 2.0.0 (#2293)
* Bump requests-oauthlib from 1.3.1 to 2.0.0

Bumps [requests-oauthlib](https://github.com/requests/requests-oauthlib) from 1.3.1 to 2.0.0.
- [Release notes](https://github.com/requests/requests-oauthlib/releases)
- [Changelog](https://github.com/requests/requests-oauthlib/blob/master/HISTORY.rst)
- [Commits](https://github.com/requests/requests-oauthlib/compare/v1.3.1...v2.0.0)

---
updated-dependencies:
- dependency-name: requests-oauthlib
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update requests-oauthlib==2.0.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-03-30 15:28:02 -07:00
dependabot[bot]
452a4afdcf
Bump tempora from 5.5.0 to 5.5.1 (#2292)
Bumps [tempora](https://github.com/jaraco/tempora) from 5.5.0 to 5.5.1.
- [Release notes](https://github.com/jaraco/tempora/releases)
- [Changelog](https://github.com/jaraco/tempora/blob/main/NEWS.rst)
- [Commits](https://github.com/jaraco/tempora/compare/v5.5.0...v5.5.1)

---
updated-dependencies:
- dependency-name: tempora
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-03-30 15:27:42 -07:00
dependabot[bot]
bfc4f66739
Bump python-dateutil from 2.8.2 to 2.9.0.post0 (#2291)
Bumps [python-dateutil](https://github.com/dateutil/dateutil) from 2.8.2 to 2.9.0.post0.
- [Release notes](https://github.com/dateutil/dateutil/releases)
- [Changelog](https://github.com/dateutil/dateutil/blob/master/NEWS)
- [Commits](https://github.com/dateutil/dateutil/compare/2.8.2...2.9.0.post0)

---
updated-dependencies:
- dependency-name: python-dateutil
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-03-30 15:27:31 -07:00
dependabot[bot]
f82aecb88c
Bump paho-mqtt from 1.6.1 to 2.0.0 (#2288)
* Bump paho-mqtt from 1.6.1 to 2.0.0

Bumps [paho-mqtt](https://github.com/eclipse/paho.mqtt.python) from 1.6.1 to 2.0.0.
- [Release notes](https://github.com/eclipse/paho.mqtt.python/releases)
- [Changelog](https://github.com/eclipse/paho.mqtt.python/blob/master/ChangeLog.txt)
- [Commits](https://github.com/eclipse/paho.mqtt.python/compare/v1.6.1...v2.0.0)

---
updated-dependencies:
- dependency-name: paho-mqtt
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update paho-mqtt==2.0.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-03-30 15:27:16 -07:00
dependabot[bot]
75a1750a4e
Bump cherrypy from 18.8.0 to 18.9.0 (#2289)
Bumps [cherrypy](https://github.com/cherrypy/cherrypy) from 18.8.0 to 18.9.0.
- [Changelog](https://github.com/cherrypy/cherrypy/blob/main/CHANGES.rst)
- [Commits](https://github.com/cherrypy/cherrypy/compare/v18.8.0...v18.9.0)

---
updated-dependencies:
- dependency-name: cherrypy
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-03-26 15:10:51 -07:00
JonnyWong16
51196a7fb1
Update cherrypy==18.9.0 2024-03-24 17:55:28 -07:00
JonnyWong16
2fc618c01f
Revert "Bump cherrypy from 18.8.0 to 18.9.0 (#2266)"
This reverts commit faef9a94c4.
2024-03-24 17:55:28 -07:00
JonnyWong16
fcd8ef11f4
Add before and after parameters to get_home_stats API
Closes #2231
2024-03-24 17:26:18 -07:00
JonnyWong16
c737161164
Add dovi notification parameters
Closes #2240
2024-03-24 16:37:46 -07:00
JonnyWong16
de3121cba9
Add Dolby Vision info to media info 2024-03-24 16:36:18 -07:00
JonnyWong16
9fe58a6d86
Add lan streams and wan streams notification parameters
Closes #2276
2024-03-24 16:09:41 -07:00
JonnyWong16
cfdb6975f0
Add platform version and product version notification parameters
Closes #2244
2024-03-24 16:09:21 -07:00
JonnyWong16
41693ee5f1
Remove synced items from UI 2024-03-24 15:46:57 -07:00
JonnyWong16
7a11b10947
Fix Cloudinary delete all limit of 1000 2024-03-24 15:44:43 -07:00
JonnyWong16
4430c14374
Fix incorrect reachability websocket event key 2024-03-24 15:31:14 -07:00
dependabot[bot]
e248c13c15
Bump importlib-metadata from 6.8.0 to 7.1.0 (#2286)
* Bump importlib-metadata from 6.8.0 to 7.1.0

Bumps [importlib-metadata](https://github.com/python/importlib_metadata) from 6.8.0 to 7.1.0.
- [Release notes](https://github.com/python/importlib_metadata/releases)
- [Changelog](https://github.com/python/importlib_metadata/blob/main/NEWS.rst)
- [Commits](https://github.com/python/importlib_metadata/compare/v6.8.0...v7.1.0)

---
updated-dependencies:
- dependency-name: importlib-metadata
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update importlib-metadata==7.1.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-03-24 15:29:52 -07:00
dependabot[bot]
b01b21ae05
Bump importlib-resources from 6.0.1 to 6.4.0 (#2285)
* Bump importlib-resources from 6.0.1 to 6.4.0

Bumps [importlib-resources](https://github.com/python/importlib_resources) from 6.0.1 to 6.4.0.
- [Release notes](https://github.com/python/importlib_resources/releases)
- [Changelog](https://github.com/python/importlib_resources/blob/main/NEWS.rst)
- [Commits](https://github.com/python/importlib_resources/compare/v6.0.1...v6.4.0)

---
updated-dependencies:
- dependency-name: importlib-resources
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update importlib-resources==6.4.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-03-24 15:27:55 -07:00
dependabot[bot]
6c6fa34ba4
Bump cloudinary from 1.34.0 to 1.39.1 (#2283)
* Bump cloudinary from 1.34.0 to 1.39.1

Bumps [cloudinary](https://github.com/cloudinary/pycloudinary) from 1.34.0 to 1.39.1.
- [Release notes](https://github.com/cloudinary/pycloudinary/releases)
- [Changelog](https://github.com/cloudinary/pycloudinary/blob/master/CHANGELOG.md)
- [Commits](https://github.com/cloudinary/pycloudinary/compare/1.34.0...1.39.1)

---
updated-dependencies:
- dependency-name: cloudinary
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update cloudinary==1.39.1

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-03-24 15:27:42 -07:00
dependabot[bot]
24fff60ed4
Bump zipp from 3.16.2 to 3.18.1 (#2281)
* Bump zipp from 3.16.2 to 3.18.1

Bumps [zipp](https://github.com/jaraco/zipp) from 3.16.2 to 3.18.1.
- [Release notes](https://github.com/jaraco/zipp/releases)
- [Changelog](https://github.com/jaraco/zipp/blob/main/NEWS.rst)
- [Commits](https://github.com/jaraco/zipp/compare/v3.16.2...v3.18.1)

---
updated-dependencies:
- dependency-name: zipp
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update zipp==3.18.1

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-03-24 15:27:03 -07:00
dependabot[bot]
4398dfa821
Bump packaging from 23.1 to 24.0 (#2274)
* Bump packaging from 23.1 to 24.0

Bumps [packaging](https://github.com/pypa/packaging) from 23.1 to 24.0.
- [Release notes](https://github.com/pypa/packaging/releases)
- [Changelog](https://github.com/pypa/packaging/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pypa/packaging/compare/23.1...24.0)

---
updated-dependencies:
- dependency-name: packaging
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update packaging==24.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-03-24 15:26:46 -07:00
dependabot[bot]
a0170a6f3d
Bump beautifulsoup4 from 4.12.2 to 4.12.3 (#2267)
* Bump beautifulsoup4 from 4.12.2 to 4.12.3

Bumps [beautifulsoup4](https://www.crummy.com/software/BeautifulSoup/bs4/) from 4.12.2 to 4.12.3.

---
updated-dependencies:
- dependency-name: beautifulsoup4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update beautifulsoup4==4.12.3

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-03-24 15:26:22 -07:00
dependabot[bot]
faef9a94c4
Bump cherrypy from 18.8.0 to 18.9.0 (#2266)
* Bump cherrypy from 18.8.0 to 18.9.0

Bumps [cherrypy](https://github.com/cherrypy/cherrypy) from 18.8.0 to 18.9.0.
- [Changelog](https://github.com/cherrypy/cherrypy/blob/main/CHANGES.rst)
- [Commits](https://github.com/cherrypy/cherrypy/compare/v18.8.0...v18.9.0)

---
updated-dependencies:
- dependency-name: cherrypy
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update cherrypy==18.9.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-03-24 15:25:44 -07:00
dependabot[bot]
cfefa928be
Bump dnspython from 2.4.2 to 2.6.1 (#2264)
* Bump dnspython from 2.4.2 to 2.6.1

Bumps [dnspython](https://github.com/rthalley/dnspython) from 2.4.2 to 2.6.1.
- [Release notes](https://github.com/rthalley/dnspython/releases)
- [Changelog](https://github.com/rthalley/dnspython/blob/main/doc/whatsnew.rst)
- [Commits](https://github.com/rthalley/dnspython/compare/v2.4.2...v2.6.1)

---
updated-dependencies:
- dependency-name: dnspython
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update dnspython==2.6.1

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-03-24 15:25:23 -07:00
dependabot[bot]
aca7e72715
Bump distro from 1.8.0 to 1.9.0 (#2262)
* Bump distro from 1.8.0 to 1.9.0

Bumps [distro](https://github.com/python-distro/distro) from 1.8.0 to 1.9.0.
- [Release notes](https://github.com/python-distro/distro/releases)
- [Changelog](https://github.com/python-distro/distro/blob/master/CHANGELOG.md)
- [Commits](https://github.com/python-distro/distro/compare/v1.8.0...v1.9.0)

---
updated-dependencies:
- dependency-name: distro
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update distro==1.9.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-03-24 15:24:31 -07:00
dependabot[bot]
b7836102a9
Bump backports-functools-lru-cache from 1.6.6 to 2.0.0 (#2263)
* Bump backports-functools-lru-cache from 1.6.6 to 2.0.0

Bumps [backports-functools-lru-cache](https://github.com/jaraco/backports.functools_lru_cache) from 1.6.6 to 2.0.0.
- [Release notes](https://github.com/jaraco/backports.functools_lru_cache/releases)
- [Changelog](https://github.com/jaraco/backports.functools_lru_cache/blob/main/NEWS.rst)
- [Commits](https://github.com/jaraco/backports.functools_lru_cache/compare/v1.6.6...v2.0.0)

---
updated-dependencies:
- dependency-name: backports-functools-lru-cache
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update backports-functools-lru-cache==2.0.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-03-24 15:24:05 -07:00
dependabot[bot]
13eb0fd6db
Bump platformdirs from 3.11.0 to 4.2.0 (#2258)
* Bump platformdirs from 3.11.0 to 4.2.0

Bumps [platformdirs](https://github.com/platformdirs/platformdirs) from 3.11.0 to 4.2.0.
- [Release notes](https://github.com/platformdirs/platformdirs/releases)
- [Changelog](https://github.com/platformdirs/platformdirs/blob/main/CHANGES.rst)
- [Commits](https://github.com/platformdirs/platformdirs/compare/3.11.0...4.2.0)

---
updated-dependencies:
- dependency-name: platformdirs
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update platformdirs==4.2.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-03-24 15:23:44 -07:00
dependabot[bot]
a4cfc6323d
Bump certifi from 2023.7.22 to 2024.2.2 (#2257)
* Bump certifi from 2023.7.22 to 2024.2.2

Bumps [certifi](https://github.com/certifi/python-certifi) from 2023.7.22 to 2024.2.2.
- [Commits](https://github.com/certifi/python-certifi/compare/2023.07.22...2024.02.02)

---
updated-dependencies:
- dependency-name: certifi
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update certifi==2024.2.2

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-03-24 15:23:15 -07:00
dependabot[bot]
4468c3e4af
Bump mako from 1.2.4 to 1.3.2 (#2256)
* Bump mako from 1.2.4 to 1.3.2

Bumps [mako](https://github.com/sqlalchemy/mako) from 1.2.4 to 1.3.2.
- [Release notes](https://github.com/sqlalchemy/mako/releases)
- [Changelog](https://github.com/sqlalchemy/mako/blob/main/CHANGES)
- [Commits](https://github.com/sqlalchemy/mako/commits)

---
updated-dependencies:
- dependency-name: mako
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update mako==1.3.2

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-03-24 15:22:16 -07:00
dependabot[bot]
52819f7da6
Bump pytz from 2023.3 to 2024.1 (#2254)
* Bump pytz from 2023.3 to 2024.1

Bumps [pytz](https://github.com/stub42/pytz) from 2023.3 to 2024.1.
- [Release notes](https://github.com/stub42/pytz/releases)
- [Commits](https://github.com/stub42/pytz/compare/release_2023.3...release_2024.1)

---
updated-dependencies:
- dependency-name: pytz
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update pytz==2024.1

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-03-24 15:22:05 -07:00
dependabot[bot]
24b6d37bbe
Bump websocket-client from 1.6.2 to 1.7.0 (#2207)
* Bump websocket-client from 1.6.2 to 1.7.0

Bumps [websocket-client](https://github.com/websocket-client/websocket-client) from 1.6.2 to 1.7.0.
- [Release notes](https://github.com/websocket-client/websocket-client/releases)
- [Changelog](https://github.com/websocket-client/websocket-client/blob/master/ChangeLog)
- [Commits](https://github.com/websocket-client/websocket-client/compare/v1.6.2...v1.7.0)

---
updated-dependencies:
- dependency-name: websocket-client
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update websocket-client==1.7.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-03-24 15:21:51 -07:00
dependabot[bot]
dbffb519f5
Bump bleach from 6.0.0 to 6.1.0 (#2177)
* Bump bleach from 6.0.0 to 6.1.0

Bumps [bleach](https://github.com/mozilla/bleach) from 6.0.0 to 6.1.0.
- [Changelog](https://github.com/mozilla/bleach/blob/main/CHANGES)
- [Commits](https://github.com/mozilla/bleach/compare/v6.0.0...v6.1.0)

---
updated-dependencies:
- dependency-name: bleach
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update bleach==6.1.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-03-24 15:21:33 -07:00
dependabot[bot]
e307796475
Bump simplejson from 3.19.1 to 3.19.2 (#2176)
* Bump simplejson from 3.19.1 to 3.19.2

Bumps [simplejson](https://github.com/simplejson/simplejson) from 3.19.1 to 3.19.2.
- [Release notes](https://github.com/simplejson/simplejson/releases)
- [Changelog](https://github.com/simplejson/simplejson/blob/master/CHANGES.txt)
- [Commits](https://github.com/simplejson/simplejson/compare/v3.19.1...v3.19.2)

---
updated-dependencies:
- dependency-name: simplejson
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update simplejson==3.19.2

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-03-24 15:21:17 -07:00
dependabot[bot]
c1b8be0227
Bump arrow from 1.2.3 to 1.3.0 (#2172)
* Bump arrow from 1.2.3 to 1.3.0

Bumps [arrow](https://github.com/arrow-py/arrow) from 1.2.3 to 1.3.0.
- [Release notes](https://github.com/arrow-py/arrow/releases)
- [Changelog](https://github.com/arrow-py/arrow/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/arrow-py/arrow/compare/1.2.3...1.3.0)

---
updated-dependencies:
- dependency-name: arrow
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update arrow==1.3.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-03-24 15:20:52 -07:00
dependabot[bot]
d3504e8a3c
Bump softprops/action-gh-release from 1 to 2 (#2273)
Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 1 to 2.
- [Release notes](https://github.com/softprops/action-gh-release/releases)
- [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md)
- [Commits](https://github.com/softprops/action-gh-release/compare/v1...v2)

---
updated-dependencies:
- dependency-name: softprops/action-gh-release
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-03-24 14:53:44 -07:00
dependabot[bot]
344f19c9d6
Bump actions/cache from 3 to 4 (#2261)
Bumps [actions/cache](https://github.com/actions/cache) from 3 to 4.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-03-24 14:53:10 -07:00
JonnyWong16
901c484f89
Include deleted usernames in log filter 2024-03-14 12:15:02 -07:00
JonnyWong16
149c7fa7a0
Bump snap to core22 2024-03-02 17:03:56 -08:00
JonnyWong16
b73a2e9acc
Update workflow statuses 2024-03-02 16:29:01 -08:00
JonnyWong16
b48e9f4074
Update installer workflow for universal macOS binary
Bump python to 3.11
2024-03-02 16:29:01 -08:00
dependabot[bot]
36fbff5503
Bump actions/download-artifact from 3 to 4 (#2223)
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 3 to 4.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](https://github.com/actions/download-artifact/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/download-artifact
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-03-02 14:35:56 -08:00
dependabot[bot]
355be99512
Bump actions/upload-artifact from 3 to 4 (#2224)
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 3 to 4.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-03-02 14:35:43 -08:00
dependabot[bot]
a397b90c23
Bump github/codeql-action from 2 to 3 (#2222)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 2 to 3.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/v2...v3)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-03-02 14:35:11 -08:00
dependabot[bot]
6a19beb476
Bump actions/stale from 8 to 9 (#2214)
Bumps [actions/stale](https://github.com/actions/stale) from 8 to 9.
- [Release notes](https://github.com/actions/stale/releases)
- [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/stale/compare/v8...v9)

---
updated-dependencies:
- dependency-name: actions/stale
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-03-02 14:34:58 -08:00
dependabot[bot]
71e6ea00c9
Bump actions/setup-python from 4 to 5 (#2211)
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 4 to 5.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-03-02 14:34:18 -08:00
dependabot[bot]
7e4f7c0c56
Bump dessant/label-actions from 3 to 4 (#2195)
Bumps [dessant/label-actions](https://github.com/dessant/label-actions) from 3 to 4.
- [Release notes](https://github.com/dessant/label-actions/releases)
- [Changelog](https://github.com/dessant/label-actions/blob/main/CHANGELOG.md)
- [Commits](https://github.com/dessant/label-actions/compare/v3...v4)

---
updated-dependencies:
- dependency-name: dessant/label-actions
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-03-02 14:33:52 -08:00
JonnyWong16
36ed4bfa3c
Set pyinstaller --contents-directory
Revert back to old one-dir behaviour

Ref.: pyinstaller/pyinstaller#7713
2024-03-02 14:31:44 -08:00
JonnyWong16
7ee2c59075
Add playlist sourceURI to exporter 2024-03-02 14:10:31 -08:00
JonnyWong16
82089fdb7b
Add track genres to exporter 2024-03-02 14:10:31 -08:00
JonnyWong16
cc070cfc6b
Add slug attribute to exporter 2024-03-02 14:10:31 -08:00
dependabot[bot]
78a7a48587
Bump pyinstaller from 5.13.0 to 6.4.0 (#2253)
Bumps [pyinstaller](https://github.com/pyinstaller/pyinstaller) from 5.13.0 to 6.4.0.
- [Release notes](https://github.com/pyinstaller/pyinstaller/releases)
- [Changelog](https://github.com/pyinstaller/pyinstaller/blob/develop/doc/CHANGES.rst)
- [Commits](https://github.com/pyinstaller/pyinstaller/compare/v5.13.0...v6.4.0)

---
updated-dependencies:
- dependency-name: pyinstaller
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-03-02 14:10:17 -08:00
dependabot[bot]
f403fdcc5b
Bump pyobjc-framework-cocoa from 9.2 to 10.1 (#2218)
Bumps [pyobjc-framework-cocoa](https://github.com/ronaldoussoren/pyobjc) from 9.2 to 10.1.
- [Release notes](https://github.com/ronaldoussoren/pyobjc/releases)
- [Changelog](https://github.com/ronaldoussoren/pyobjc/blob/master/docs/changelog.rst)
- [Commits](https://github.com/ronaldoussoren/pyobjc/compare/v9.2...v10.1)

---
updated-dependencies:
- dependency-name: pyobjc-framework-cocoa
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-03-02 14:10:07 -08:00
dependabot[bot]
50dba6bf19
Bump pyobjc-core from 9.2 to 10.1 (#2219)
Bumps [pyobjc-core](https://github.com/ronaldoussoren/pyobjc) from 9.2 to 10.1.
- [Release notes](https://github.com/ronaldoussoren/pyobjc/releases)
- [Changelog](https://github.com/ronaldoussoren/pyobjc/blob/master/docs/changelog.rst)
- [Commits](https://github.com/ronaldoussoren/pyobjc/compare/v9.2...v10.1)

---
updated-dependencies:
- dependency-name: pyobjc-core
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-03-02 14:08:25 -08:00
dependabot[bot]
23591a0435
Bump pyopenssl from 23.2.0 to 24.0.0 (#2252)
Bumps [pyopenssl](https://github.com/pyca/pyopenssl) from 23.2.0 to 24.0.0.
- [Changelog](https://github.com/pyca/pyopenssl/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/pyopenssl/compare/23.2.0...24.0.0)

---
updated-dependencies:
- dependency-name: pyopenssl
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-03-02 14:07:39 -08:00
dependabot[bot]
60f29b0fa4
Bump pycryptodomex from 3.18.0 to 3.20.0 (#2237)
Bumps [pycryptodomex](https://github.com/Legrandin/pycryptodome) from 3.18.0 to 3.20.0.
- [Release notes](https://github.com/Legrandin/pycryptodome/releases)
- [Changelog](https://github.com/Legrandin/pycryptodome/blob/master/Changelog.rst)
- [Commits](https://github.com/Legrandin/pycryptodome/compare/v3.18.0...v3.20.0)

---
updated-dependencies:
- dependency-name: pycryptodomex
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-03-02 14:02:24 -08:00
dependabot[bot]
b1c0972077
Bump plexapi from 4.15.4 to 4.15.10 (#2251)
* Bump plexapi from 4.15.4 to 4.15.10

Bumps [plexapi](https://github.com/pkkid/python-plexapi) from 4.15.4 to 4.15.10.
- [Release notes](https://github.com/pkkid/python-plexapi/releases)
- [Commits](https://github.com/pkkid/python-plexapi/compare/4.15.4...4.15.10)

---
updated-dependencies:
- dependency-name: plexapi
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update plexapi==4.15.10

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-03-02 13:52:45 -08:00
JonnyWong16
040972bcba
Increase PBKDF2 iterations to 600,000
OWASP Cheat Sheet recommends 600,000 iterations.

https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html#pbkdf2
2024-02-19 17:31:28 -08:00
JonnyWong16
c172965ec8
Don't need to refresh Pushover config after entering token 2024-02-17 15:23:14 -08:00
JonnyWong16
d0c07326ab
Change cookie expires to max-age 2023-12-07 23:05:34 -08:00
JonnyWong16
d019efcf91
v2.13.4 2023-12-06 23:18:16 -08:00
JonnyWong16
fe7a59c7f9
Fix use UTC for JWT expiry and max-age for cookie 2023-12-06 23:09:32 -08:00
JonnyWong16
e3113ebd30
Fix configuration table None system language 2023-12-06 13:20:33 -08:00
JonnyWong16
5525b9851c
Fix issue number in changelog 2023-12-03 14:02:51 -08:00
JonnyWong16
8cb74f7480
v2.13.3 2023-12-03 13:49:55 -08:00
JonnyWong16
98ceb0a81d
Add time formats to order of notification text modifiers 2023-12-03 13:45:13 -08:00
JonnyWong16
325271a88e
Update the stream duration on activity cards
* Fixes #2206

Some clients like Plexamp use the same sessionKey when the track changes.
2023-12-03 13:33:37 -08:00
JonnyWong16
ddc8a08fc7
Replace usage of utcnow()
`datetime.utcnow()` deprecated in Python 3.12
2023-11-21 11:36:08 -08:00
JonnyWong16
d0c1e467bd
Add support for thetvdb_url for movies 2023-11-19 13:46:57 -08:00
JonnyWong16
380cbd232c
Add file_size_bytes notification parameter
* Change type of file_size parameter and update description to indicate it is in human readable format.
2023-11-19 13:05:16 -08:00
JonnyWong16
98c363f559
Update Notification Text Modifiers modal with Time Formats 2023-11-13 11:28:53 -08:00
JonnyWong16
5abdfd7377
Make datestamp and timestamp formattable 2023-11-13 11:25:39 -08:00
JonnyWong16
8fd62e30b3
Fix duration_time typo 2023-11-09 17:17:24 -08:00
JonnyWong16
89aad6952b
Fix activity card overflow due to screen scaling
* Fixes #2033
2023-11-09 16:43:41 -08:00
JonnyWong16
2da3714dd1
Add CustomArrow date/time formatter 2023-11-07 17:18:48 -08:00
JonnyWong16
ab5836a65b
Add duration_time notification parameter 2023-11-07 17:12:19 -08:00
JonnyWong16
ae17d2dde0
Switch actions/create-release to softprops/action-gh-release
* actions/create-release deprecated
2023-11-04 13:44:49 -07:00
JonnyWong16
f1c12c0bbe
Switch appdirs to platformdirs 2023-11-04 13:29:40 -07:00
JonnyWong16
32cf26884b
Add system language and sqlite version to configuration table 2023-10-26 11:05:51 -07:00
JonnyWong16
dd380b583f
Add system language to startup logs 2023-10-26 11:05:34 -07:00
JonnyWong16
c215afbf84
v2.13.2 2023-10-26 09:27:31 -07:00
JonnyWong16
d63c0cb469
Guard against None transcode_key 2023-10-26 09:24:48 -07:00
JonnyWong16
98583d139a
Add config override for PMS_LANGUAGE 2023-10-26 09:05:47 -07:00
JonnyWong16
ab16adcffc
Add link from concurrent stream stats card to graphs page 2023-10-23 16:04:29 -07:00
herby2212
a31dcb5508
Quater values for History Watch Status (#2179)
* initial release

* change fillup orientation to clockwise

* fix indentation for css

* fix 50 percent circle orientation

* optimize colors and padding
2023-10-23 15:51:35 -07:00
JonnyWong16
1e4fc05ecf
Add ping method to refresh token 2023-10-17 11:23:04 -07:00
JonnyWong16
efdd4156d8
Update IP helper function 2023-10-16 15:04:19 -07:00
JonnyWong16
7245e97726
Fix concurrent streams graph query 2023-10-10 21:27:13 -07:00
JonnyWong16
d8d1f75605
Use group_by_keys helper for library stats 2023-10-10 19:32:30 -07:00
JonnyWong16
b32183b7b6
Speed up graphs data lookup 2023-10-10 19:18:47 -07:00
JonnyWong16
a59e07c07d
Add metadataDirectory to exporter fields 2023-10-10 14:23:26 -07:00
dependabot[bot]
aa4d98ee34
Bump plexapi from 4.15.0 to 4.15.4 (#2175)
* Bump plexapi from 4.15.0 to 4.15.4

Bumps [plexapi](https://github.com/pkkid/python-plexapi) from 4.15.0 to 4.15.4.
- [Release notes](https://github.com/pkkid/python-plexapi/releases)
- [Commits](https://github.com/pkkid/python-plexapi/compare/4.15.0...4.15.4)

---
updated-dependencies:
- dependency-name: plexapi
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update plexapi==4.15.4

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-10-10 14:22:10 -07:00
JonnyWong16
fdc1dd3525
Add trigger time to notification and newsletter tables 2023-10-09 11:37:56 -07:00
JonnyWong16
62be48df9c
Change colour of max. concurrent stream series 2023-10-09 11:33:40 -07:00
JonnyWong16
982c893c49
Use helper function to cast play duration to int 2023-10-09 11:27:46 -07:00
JonnyWong16
0fa7553d97
Fix right float cog icon on mobile devices table 2023-10-09 11:27:46 -07:00
JonnyWong16
b18c31f431
Update table right flow overflow 2023-10-09 11:27:46 -07:00
JonnyWong16
a668932ea8
Remove banners from exports 2023-10-09 11:27:46 -07:00
herby2212
59fe34982e
Concurrent Streams per Day Graph (#2046)
* initial commit

* fix grouping in webserve

* remove event handler and adapt cursor

* optimize most concurrent calculation

* update branch from nightly and user filter

* max concurrent streams in graph

* made several changes mentioned in review
2023-10-07 13:45:11 -07:00
dependabot[bot]
4938954c61
Bump docker/setup-buildx-action from 2 to 3 (#2152)
Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 2 to 3.
- [Release notes](https://github.com/docker/setup-buildx-action/releases)
- [Commits](https://github.com/docker/setup-buildx-action/compare/v2...v3)

---
updated-dependencies:
- dependency-name: docker/setup-buildx-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2023-09-18 12:59:23 -07:00
dependabot[bot]
76f1335a55
Bump docker/build-push-action from 4 to 5 (#2151)
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 4 to 5.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](https://github.com/docker/build-push-action/compare/v4...v5)

---
updated-dependencies:
- dependency-name: docker/build-push-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2023-09-18 12:57:59 -07:00
dependabot[bot]
5e75d0ce73
Bump docker/setup-qemu-action from 2 to 3 (#2150)
Bumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 2 to 3.
- [Release notes](https://github.com/docker/setup-qemu-action/releases)
- [Commits](https://github.com/docker/setup-qemu-action/compare/v2...v3)

---
updated-dependencies:
- dependency-name: docker/setup-qemu-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2023-09-18 12:57:43 -07:00
dependabot[bot]
26419f4610
Bump docker/login-action from 2 to 3 (#2149)
Bumps [docker/login-action](https://github.com/docker/login-action) from 2 to 3.
- [Release notes](https://github.com/docker/login-action/releases)
- [Commits](https://github.com/docker/login-action/compare/v2...v3)

---
updated-dependencies:
- dependency-name: docker/login-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2023-09-18 12:57:32 -07:00
dependabot[bot]
aaea924aaa
Bump actions/checkout from 3 to 4 (#2145)
Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2023-09-18 12:57:18 -07:00
JonnyWong16
6d858367a4
v2.13.1 2023-08-25 11:49:55 -07:00
JonnyWong16
85bc9c39ae
Update tzlocal==5.0.1 2023-08-25 11:33:56 -07:00
dependabot[bot]
80e6131a0d
Revert "Bump apscheduler from 3.10.1 to 3.10.4 (#2133)"
This reverts commit 2c42150799.
2023-08-25 11:23:49 -07:00
JonnyWong16
1b26775ec6
Revert "Remove importlib-metadata and importlib-resources"
This reverts commit 38435ae81c.
2023-08-25 11:05:53 -07:00
JonnyWong16
fa510792f1
Revert "Remove importlib-metadata and importlib-resources"
This reverts commit 47b2f55c97.
2023-08-25 11:05:46 -07:00
JonnyWong16
289a8a2334
v2.13.0 2023-08-25 09:11:08 -07:00
JonnyWong16
47b2f55c97
Remove importlib-metadata and importlib-resources 2023-08-24 14:18:46 -07:00
JonnyWong16
38435ae81c
Remove importlib-metadata and importlib-resources 2023-08-24 13:49:16 -07:00
JonnyWong16
b133904b48
Drop support for Python 3.7 2023-08-24 12:20:50 -07:00
JonnyWong16
67842cfa02
Add subtitleStream exporter fields for on-demand subtitles 2023-08-24 12:17:53 -07:00
JonnyWong16
24fbc9a17a
Add track chapter exporter fields 2023-08-24 12:17:21 -07:00
dependabot[bot]
b2c16eba07
Bump plexapi from 4.13.4 to 4.15.0 (#2132)
* Bump plexapi from 4.13.4 to 4.15.0

Bumps [plexapi](https://github.com/pkkid/python-plexapi) from 4.13.4 to 4.15.0.
- [Release notes](https://github.com/pkkid/python-plexapi/releases)
- [Commits](https://github.com/pkkid/python-plexapi/compare/4.13.4...4.15.0)

---
updated-dependencies:
- dependency-name: plexapi
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update plexapi==4.15.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-08-24 12:10:56 -07:00
dependabot[bot]
2c42150799
Bump apscheduler from 3.10.1 to 3.10.4 (#2133)
* Bump apscheduler from 3.10.1 to 3.10.4

Bumps [apscheduler](https://github.com/agronholm/apscheduler) from 3.10.1 to 3.10.4.
- [Changelog](https://github.com/agronholm/apscheduler/blob/3.10.4/docs/versionhistory.rst)
- [Commits](https://github.com/agronholm/apscheduler/compare/3.10.1...3.10.4)

---
updated-dependencies:
- dependency-name: apscheduler
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update apscheduler==3.10.4

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-08-24 12:10:08 -07:00
dependabot[bot]
3debeada2a
Bump pyparsing from 3.0.9 to 3.1.1 (#2131)
* Bump pyparsing from 3.0.9 to 3.1.1

Bumps [pyparsing](https://github.com/pyparsing/pyparsing) from 3.0.9 to 3.1.1.
- [Release notes](https://github.com/pyparsing/pyparsing/releases)
- [Changelog](https://github.com/pyparsing/pyparsing/blob/master/CHANGES)
- [Commits](https://github.com/pyparsing/pyparsing/compare/pyparsing_3.0.9...3.1.1)

---
updated-dependencies:
- dependency-name: pyparsing
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update pyparsing==3.1.1

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-08-24 12:09:51 -07:00
dependabot[bot]
d0c7f25a3f
Bump markupsafe from 2.1.2 to 2.1.3 (#2130)
* Bump markupsafe from 2.1.2 to 2.1.3

Bumps [markupsafe](https://github.com/pallets/markupsafe) from 2.1.2 to 2.1.3.
- [Release notes](https://github.com/pallets/markupsafe/releases)
- [Changelog](https://github.com/pallets/markupsafe/blob/main/CHANGES.rst)
- [Commits](https://github.com/pallets/markupsafe/compare/2.1.2...2.1.3)

---
updated-dependencies:
- dependency-name: markupsafe
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update markupsave==2.1.3

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-08-24 12:09:39 -07:00
dependabot[bot]
371d35433c
Bump tokenize-rt from 5.0.0 to 5.2.0 (#2129)
* Bump tokenize-rt from 5.0.0 to 5.2.0

Bumps [tokenize-rt](https://github.com/asottile/tokenize-rt) from 5.0.0 to 5.2.0.
- [Commits](https://github.com/asottile/tokenize-rt/compare/v5.0.0...v5.2.0)

---
updated-dependencies:
- dependency-name: tokenize-rt
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update tokenize-rt==5.2.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-08-24 12:09:28 -07:00
dependabot[bot]
4033114175
Bump cheroot from 9.0.0 to 10.0.0 (#2128)
* Bump cheroot from 9.0.0 to 10.0.0

Bumps [cheroot](https://github.com/cherrypy/cheroot) from 9.0.0 to 10.0.0.
- [Release notes](https://github.com/cherrypy/cheroot/releases)
- [Changelog](https://github.com/cherrypy/cheroot/blob/main/CHANGES.rst)
- [Commits](https://github.com/cherrypy/cheroot/compare/v9.0.0...v10.0.0)

---
updated-dependencies:
- dependency-name: cheroot
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update cheroot==10.0.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-08-24 12:09:15 -07:00
dependabot[bot]
9423f65a90
Bump backports-functools-lru-cache from 1.6.4 to 1.6.6 (#2127)
* Bump backports-functools-lru-cache from 1.6.4 to 1.6.6

Bumps [backports-functools-lru-cache](https://github.com/jaraco/backports.functools_lru_cache) from 1.6.4 to 1.6.6.
- [Release notes](https://github.com/jaraco/backports.functools_lru_cache/releases)
- [Changelog](https://github.com/jaraco/backports.functools_lru_cache/blob/main/NEWS.rst)
- [Commits](https://github.com/jaraco/backports.functools_lru_cache/compare/v1.6.4...v1.6.6)

---
updated-dependencies:
- dependency-name: backports-functools-lru-cache
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update backports-functools-lru-cache==1.6.6

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-08-24 12:06:08 -07:00
dependabot[bot]
72f1ce7865
Bump importlib-resources from 5.12.0 to 6.0.1 (#2126)
* Bump importlib-resources from 5.12.0 to 6.0.1

Bumps [importlib-resources](https://github.com/python/importlib_resources) from 5.12.0 to 6.0.1.
- [Release notes](https://github.com/python/importlib_resources/releases)
- [Changelog](https://github.com/python/importlib_resources/blob/main/NEWS.rst)
- [Commits](https://github.com/python/importlib_resources/compare/v5.12.0...v6.0.1)

---
updated-dependencies:
- dependency-name: importlib-resources
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update importlib-resources==6.0.1

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-08-24 12:05:53 -07:00
dependabot[bot]
9383d5120c
Bump portend from 3.1.0 to 3.2.0 (#2125)
Bumps [portend](https://github.com/jaraco/portend) from 3.1.0 to 3.2.0.
- [Release notes](https://github.com/jaraco/portend/releases)
- [Changelog](https://github.com/jaraco/portend/blob/main/NEWS.rst)
- [Commits](https://github.com/jaraco/portend/compare/v3.1.0...v3.2.0)

---
updated-dependencies:
- dependency-name: portend
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2023-08-24 12:05:41 -07:00
dependabot[bot]
69d052f758
Bump zipp from 3.15.0 to 3.16.2 (#2124)
* Bump zipp from 3.15.0 to 3.16.2

Bumps [zipp](https://github.com/jaraco/zipp) from 3.15.0 to 3.16.2.
- [Release notes](https://github.com/jaraco/zipp/releases)
- [Changelog](https://github.com/jaraco/zipp/blob/main/NEWS.rst)
- [Commits](https://github.com/jaraco/zipp/compare/v3.15.0...v3.16.2)

---
updated-dependencies:
- dependency-name: zipp
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update zipp==3.16.2

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-08-24 12:05:25 -07:00
dependabot[bot]
c0aa4e4996
Bump dnspython from 2.3.0 to 2.4.2 (#2123)
* Bump dnspython from 2.3.0 to 2.4.2

Bumps [dnspython](https://github.com/rthalley/dnspython) from 2.3.0 to 2.4.2.
- [Release notes](https://github.com/rthalley/dnspython/releases)
- [Changelog](https://github.com/rthalley/dnspython/blob/master/doc/whatsnew.rst)
- [Commits](https://github.com/rthalley/dnspython/compare/v2.3.0...v2.4.2)

---
updated-dependencies:
- dependency-name: dnspython
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update dnspython==2.4.2

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-08-24 12:05:11 -07:00
JonnyWong16
9f00f5dafa
Fix watched notification trigger description
Fixes #2104
2023-08-23 22:04:27 -07:00
dependabot[bot]
7266a60343
Bump cloudinary from 1.32.0 to 1.34.0 (#2109)
* Bump cloudinary from 1.32.0 to 1.34.0

Bumps [cloudinary](https://github.com/cloudinary/pycloudinary) from 1.32.0 to 1.34.0.
- [Release notes](https://github.com/cloudinary/pycloudinary/releases)
- [Changelog](https://github.com/cloudinary/pycloudinary/blob/master/CHANGELOG.md)
- [Commits](https://github.com/cloudinary/pycloudinary/compare/1.32.0...1.34.0)

---
updated-dependencies:
- dependency-name: cloudinary
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update cloudinary==1.34.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-08-23 21:56:41 -07:00
JonnyWong16
edd8c5fdc3
Pin urllib3<2 in requirements.txt
[skip ci]
2023-08-23 21:54:59 -07:00
JonnyWong16
d6b3ed178e
Downgraade urllib3==1.26.16 2023-08-23 21:52:33 -07:00
dependabot[bot]
eac78a3047
Bump websocket-client from 1.5.1 to 1.6.2 (#2122)
* Bump websocket-client from 1.5.1 to 1.6.2

Bumps [websocket-client](https://github.com/websocket-client/websocket-client) from 1.5.1 to 1.6.2.
- [Release notes](https://github.com/websocket-client/websocket-client/releases)
- [Changelog](https://github.com/websocket-client/websocket-client/blob/master/ChangeLog)
- [Commits](https://github.com/websocket-client/websocket-client/compare/v1.5.1...v1.6.2)

---
updated-dependencies:
- dependency-name: websocket-client
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update websocket-client==1.6.2

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-08-23 21:45:28 -07:00
dependabot[bot]
c93f470371
Bump pyjwt from 2.6.0 to 2.8.0 (#2115)
* Bump pyjwt from 2.6.0 to 2.8.0

Bumps [pyjwt](https://github.com/jpadilla/pyjwt) from 2.6.0 to 2.8.0.
- [Release notes](https://github.com/jpadilla/pyjwt/releases)
- [Changelog](https://github.com/jpadilla/pyjwt/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/jpadilla/pyjwt/compare/2.6.0...2.8.0)

---
updated-dependencies:
- dependency-name: pyjwt
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update pyjwt==2.8.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-08-23 21:45:15 -07:00
dependabot[bot]
77f38bbf93 Bump urllib3 from 1.26.15 to 2.0.4 (#2113)
* Bump urllib3 from 1.26.15 to 2.0.4

Bumps [urllib3](https://github.com/urllib3/urllib3) from 1.26.15 to 2.0.4.
- [Release notes](https://github.com/urllib3/urllib3/releases)
- [Changelog](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst)
- [Commits](https://github.com/urllib3/urllib3/compare/1.26.15...2.0.4)

---
updated-dependencies:
- dependency-name: urllib3
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update urllib3==2.0.4

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-08-23 21:44:36 -07:00
dependabot[bot]
1e903b164b
Bump tempora from 5.2.1 to 5.5.0 (#2111)
* Bump tempora from 5.2.1 to 5.5.0

Bumps [tempora](https://github.com/jaraco/tempora) from 5.2.1 to 5.5.0.
- [Release notes](https://github.com/jaraco/tempora/releases)
- [Changelog](https://github.com/jaraco/tempora/blob/main/NEWS.rst)
- [Commits](https://github.com/jaraco/tempora/compare/v5.2.1...v5.5.0)

---
updated-dependencies:
- dependency-name: tempora
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update tempora==5.5.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-08-23 21:43:27 -07:00
dependabot[bot]
9a196f3dca
Bump certifi from 2022.12.7 to 2023.7.22 (#2110)
* Bump certifi from 2022.12.7 to 2023.7.22

Bumps [certifi](https://github.com/certifi/python-certifi) from 2022.12.7 to 2023.7.22.
- [Commits](https://github.com/certifi/python-certifi/compare/2022.12.07...2023.07.22)

---
updated-dependencies:
- dependency-name: certifi
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update certifi==2023.7.22

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-08-23 21:42:53 -07:00
dependabot[bot]
6b6d43ef43
Bump requests from 2.28.2 to 2.31.0 (#2078)
* Bump requests from 2.28.2 to 2.31.0

Bumps [requests](https://github.com/psf/requests) from 2.28.2 to 2.31.0.
- [Release notes](https://github.com/psf/requests/releases)
- [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md)
- [Commits](https://github.com/psf/requests/compare/v2.28.2...v2.31.0)

---
updated-dependencies:
- dependency-name: requests
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update requests==2.31.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-08-23 21:40:02 -07:00
dependabot[bot]
478d9e6aa5
Bump soupsieve from 2.4 to 2.4.1 (#2051)
* Bump soupsieve from 2.4 to 2.4.1

Bumps [soupsieve](https://github.com/facelessuser/soupsieve) from 2.4 to 2.4.1.
- [Release notes](https://github.com/facelessuser/soupsieve/releases)
- [Commits](https://github.com/facelessuser/soupsieve/compare/2.4...2.4.1)

---
updated-dependencies:
- dependency-name: soupsieve
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Remove soupsieve

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-08-23 21:39:21 -07:00
dependabot[bot]
c5bbaaf39c
Bump packaging from 23.0 to 23.1 (#2043)
* Bump packaging from 23.0 to 23.1

Bumps [packaging](https://github.com/pypa/packaging) from 23.0 to 23.1.
- [Release notes](https://github.com/pypa/packaging/releases)
- [Changelog](https://github.com/pypa/packaging/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pypa/packaging/compare/23.0...23.1)

---
updated-dependencies:
- dependency-name: packaging
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update packaging==23.1

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-08-23 21:38:59 -07:00
dependabot[bot]
e70e08c3f5
Bump beautifulsoup4 from 4.11.2 to 4.12.2 (#2037)
* Bump beautifulsoup4 from 4.11.2 to 4.12.2

Bumps [beautifulsoup4](https://www.crummy.com/software/BeautifulSoup/bs4/) from 4.11.2 to 4.12.2.

---
updated-dependencies:
- dependency-name: beautifulsoup4
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update beautifulsoup4==4.12.2

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-08-23 21:38:49 -07:00
dependabot[bot]
1798594569
Bump simplejson from 3.18.3 to 3.19.1 (#2036)
* Bump simplejson from 3.18.3 to 3.19.1

Bumps [simplejson](https://github.com/simplejson/simplejson) from 3.18.3 to 3.19.1.
- [Release notes](https://github.com/simplejson/simplejson/releases)
- [Changelog](https://github.com/simplejson/simplejson/blob/master/CHANGES.txt)
- [Commits](https://github.com/simplejson/simplejson/compare/v3.18.3...v3.19.1)

---
updated-dependencies:
- dependency-name: simplejson
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update simplejson==3.19.1

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-08-23 21:38:39 -07:00
dependabot[bot]
70fb00280b
Bump tzdata from 2022.7 to 2023.3 (#2032)
* Bump tzdata from 2022.7 to 2023.3

Bumps [tzdata](https://github.com/python/tzdata) from 2022.7 to 2023.3.
- [Release notes](https://github.com/python/tzdata/releases)
- [Changelog](https://github.com/python/tzdata/blob/master/NEWS.md)
- [Commits](https://github.com/python/tzdata/compare/2022.7...2023.3)

---
updated-dependencies:
- dependency-name: tzdata
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update tzdata==2023.3

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-08-23 21:38:28 -07:00
dependabot[bot]
835ea34bea
Bump pytz from 2022.7.1 to 2023.3 (#2031)
* Bump pytz from 2022.7.1 to 2023.3

Bumps [pytz](https://github.com/stub42/pytz) from 2022.7.1 to 2023.3.
- [Release notes](https://github.com/stub42/pytz/releases)
- [Commits](https://github.com/stub42/pytz/compare/release_2022.7.1...release_2023.3)

---
updated-dependencies:
- dependency-name: pytz
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update pytz==2023.3

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-08-23 21:38:17 -07:00
dependabot[bot]
a21fffd227
Bump pyinstaller from 5.8.0 to 5.13.0 (#2114)
Bumps [pyinstaller](https://github.com/pyinstaller/pyinstaller) from 5.8.0 to 5.13.0.
- [Release notes](https://github.com/pyinstaller/pyinstaller/releases)
- [Changelog](https://github.com/pyinstaller/pyinstaller/blob/develop/doc/CHANGES.rst)
- [Commits](https://github.com/pyinstaller/pyinstaller/compare/v5.8.0...v5.13.0)

---
updated-dependencies:
- dependency-name: pyinstaller
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-08-23 21:23:35 -07:00
dependabot[bot]
f80cd73982
Bump importlib-metadata from 6.0.0 to 6.8.0 (#2112)
Bumps [importlib-metadata](https://github.com/python/importlib_metadata) from 6.0.0 to 6.8.0.
- [Release notes](https://github.com/python/importlib_metadata/releases)
- [Changelog](https://github.com/python/importlib_metadata/blob/main/NEWS.rst)
- [Commits](https://github.com/python/importlib_metadata/compare/v6.0.0...v6.8.0)

---
updated-dependencies:
- dependency-name: importlib-metadata
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2023-08-23 21:22:24 -07:00
dependabot[bot]
e11a4c50ba
Bump pyobjc-framework-cocoa from 9.0.1 to 9.2 (#2083)
Bumps [pyobjc-framework-cocoa](https://github.com/ronaldoussoren/pyobjc) from 9.0.1 to 9.2.
- [Release notes](https://github.com/ronaldoussoren/pyobjc/releases)
- [Changelog](https://github.com/ronaldoussoren/pyobjc/blob/master/docs/changelog.rst)
- [Commits](https://github.com/ronaldoussoren/pyobjc/compare/v9.0.1...v9.2)

---
updated-dependencies:
- dependency-name: pyobjc-framework-cocoa
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-08-23 21:21:55 -07:00
dependabot[bot]
a84b5b51ed
Bump pyobjc-core from 9.0.1 to 9.2 (#2082)
Bumps [pyobjc-core](https://github.com/ronaldoussoren/pyobjc) from 9.0.1 to 9.2.
- [Release notes](https://github.com/ronaldoussoren/pyobjc/releases)
- [Changelog](https://github.com/ronaldoussoren/pyobjc/blob/master/docs/changelog.rst)
- [Commits](https://github.com/ronaldoussoren/pyobjc/compare/v9.0.1...v9.2)

---
updated-dependencies:
- dependency-name: pyobjc-core
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2023-08-23 21:21:16 -07:00
dependabot[bot]
b7c0b104e9
Bump pycryptodomex from 3.17 to 3.18.0 (#2076)
Bumps [pycryptodomex](https://github.com/Legrandin/pycryptodome) from 3.17 to 3.18.0.
- [Release notes](https://github.com/Legrandin/pycryptodome/releases)
- [Changelog](https://github.com/Legrandin/pycryptodome/blob/master/Changelog.rst)
- [Commits](https://github.com/Legrandin/pycryptodome/compare/v3.17.0...v3.18.0)

---
updated-dependencies:
- dependency-name: pycryptodomex
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-08-23 21:20:54 -07:00
dependabot[bot]
6fa8bb3768
Bump pyopenssl from 23.0.0 to 23.2.0 (#2081)
Bumps [pyopenssl](https://github.com/pyca/pyopenssl) from 23.0.0 to 23.2.0.
- [Changelog](https://github.com/pyca/pyopenssl/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/pyopenssl/compare/23.0.0...23.2.0)

---
updated-dependencies:
- dependency-name: pyopenssl
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2023-08-23 21:20:05 -07:00
dependabot[bot]
31543d267f
Bump pywin32 from 305 to 306 (#2028)
Bumps [pywin32](https://github.com/mhammond/pywin32) from 305 to 306.
- [Release notes](https://github.com/mhammond/pywin32/releases)
- [Changelog](https://github.com/mhammond/pywin32/blob/main/CHANGES.txt)
- [Commits](https://github.com/mhammond/pywin32/commits)

---
updated-dependencies:
- dependency-name: pywin32
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2023-08-23 21:19:39 -07:00
dependabot[bot]
842e36485a
Bump actions/stale from 7 to 8 (#2025)
Bumps [actions/stale](https://github.com/actions/stale) from 7 to 8.
- [Release notes](https://github.com/actions/stale/releases)
- [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/stale/compare/v7...v8)

---
updated-dependencies:
- dependency-name: actions/stale
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2023-08-15 08:42:01 -07:00
JonnyWong16
e2cb15ef49
Add notification image option for iOS Tautulli Remote App 2023-08-02 16:51:20 -07:00
JonnyWong16
b984a99d51
Update workflows action version refs 2023-07-27 20:04:37 -07:00
JonnyWong16
d701d18a81
Update workflows action version refs 2023-07-27 20:04:03 -07:00
JonnyWong16
765804c93b
Don't expose do_state_change 2023-07-20 14:19:05 -07:00
JonnyWong16
b953b951fb
v2.12.6 2023-07-13 15:50:39 -07:00
JonnyWong16
571a6b6d2d
Cast view_offset to int for regrouping history 2023-07-10 08:58:03 -07:00
David Pooley
6010e406c8
Fix simultaneous streams per IP not behaving as expected with IPv6 (#2096)
* Fix IPv6 comparisson for concurrent streams

* Update regex to allow numbers in config variables

* Remove additional logging for local testing

* Update plexpy/notification_handler.py

Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

---------

Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>
2023-07-08 16:32:42 -07:00
JonnyWong16
d91e561a56
Regroup history in separate thread and improve logging 2023-07-07 17:47:38 -07:00
Tom Niget
343a3e9281
Multiselect user filters (#2090)
* Extract user filter generation code into method

* Extend make_user_cond to allow lists of user IDs

* Update documentation for stats APIs to indicate handling of ID lists

* Use multiselect dropdown for user filter on graphs page

Use standard concatenation

Fix select style

Move settings to JS constructor

Change text for no users checked

Don't call selectAll on page init

Add it back

Remove attributes

Fix emptiness check

Allow deselect all

Only refresh if user id changed

* Show "N users" starting at 2 users

Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

* Use helper function split_strip

Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

* Move make_user_cond at bottom and make private

* Add new user picker to history page

* Fix copy-paste error

* Again

* Add CSS for bootstrap-select

---------

Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>
2023-07-07 17:15:16 -07:00
JonnyWong16
b144e6527f
Add button to regroup play history 2023-07-07 14:36:44 -07:00
JonnyWong16
1fe6d1505f
Add method to regroup history 2023-07-07 14:36:44 -07:00
JonnyWong16
085cfa4bef
Fix history grouping incorrect for watched content 2023-07-07 14:36:44 -07:00
JonnyWong16
c761e6e8d0
Fix template_name argument for login page 2023-06-29 00:07:43 -07:00
JonnyWong16
7ff3abe8b7
Rename template_name argument 2023-06-27 17:20:21 -07:00
JonnyWong16
d9b3b311b9
Only initialize mako TemplateLookup once
* Ref: sqlalchemy/mako#378
2023-06-27 14:23:09 -07:00
JonnyWong16
2a48e3375a
Add d3d11va hardware decoder 2023-06-25 17:35:16 -07:00
JonnyWong16
ea6c6078df
v2.12.4 2023-05-23 10:03:36 -07:00
JonnyWong16
f39b9f9087
Fix SQLite Double-Quoted Strings (#2057)
* Fix __init__.py

* Fix activity_pinger.py

* Fix activity_processor.py

* Fix database.py

* Fix datafactory.py

* Fix exporter.py

* Fix graphs.py

* Fix libraries.py

* Fix mobile_app.py

* Fix newsletter_handler.py

* Fix newsletters.py

* Fix notification_handler.py

* Fix notifiers.py

* Fix plexivity_import.py

* Fix plexwatch_import.py

* Fix users.py

* Fix webauth.py
2023-05-15 11:03:26 -07:00
JonnyWong16
3a1d6322ae
Add return ID for async API calls
* export_id, notification_id, and newsletter_notification_d
2023-05-05 15:57:33 -07:00
JonnyWong16
fe4fba353e
Catch KeyError on import db version 2023-04-20 08:50:41 -07:00
JonnyWong16
3b3c59c4bb
Set view offset equal to duration if stopped within the last 10 sec
* Plex reports the view offset every 10 seconds, so the view offset at the end of stream can be short by up to 10 seconds.
2023-04-17 12:50:52 -07:00
JonnyWong16
e9b1db139e
v2.12.3 2023-04-14 11:50:55 -07:00
JonnyWong16
99afb7392b
Use separate log file for script PlexAPI 2023-04-14 11:29:53 -07:00
JonnyWong16
14648a4604
Fix live tv thumb hover on top libraries statistics card 2023-04-13 21:48:31 -07:00
JonnyWong16
07715c6a49
Rename API get_history response duration to play_duration 2023-04-13 15:17:41 -07:00
JonnyWong16
b0921b5f4a
Fix history table sorting by play duration 2023-04-13 15:17:22 -07:00
JonnyWong16
2921c1fc30
Fix live tv thumb and art for top libraries statistics card 2023-04-13 14:48:19 -07:00
JonnyWong16
fa8b51bfd9
Add .vscode to .gitignore 2023-04-13 14:46:30 -07:00
JonnyWong16
eb7a4fb4bf
Fix calculating media info file sizes 2023-03-22 16:48:42 -07:00
JonnyWong16
18110206d6
Fallback subtitle decision if transcoding subtitles 2023-03-16 22:02:44 -07:00
JonnyWong16
7836dc8403
v2.12.2 2023-03-16 18:29:42 -07:00
JonnyWong16
ab7e559f39
Limit platform version to 100 characters 2023-03-15 17:14:53 -07:00
JonnyWong16
710dd7955f
v2.12.1 2023-03-14 13:05:49 -07:00
JonnyWong16
93081e3f6d
Trim analytic event platform version for macOS 2023-03-14 13:02:49 -07:00
JonnyWong16
8664570a78
Don't show audio language for music on activity card 2023-03-14 12:21:45 -07:00
JonnyWong16
e5f55d7fe7
Remove checking for synced items for sessions 2023-03-14 11:19:50 -07:00
JonnyWong16
41f935e1ed
v2.12.0 2023-03-13 12:16:44 -07:00
JonnyWong16
ea5b43419d
Add last_refreshed to get_library_media_info doc string 2023-03-13 12:16:44 -07:00
JonnyWong16
2dd9272f56
Remove extra space in doc strings 2023-03-13 12:05:40 -07:00
dependabot[bot]
705fd2d3e8
Bump urllib3 from 1.26.14 to 1.26.15 (#2017)
* Bump urllib3 from 1.26.14 to 1.26.15

Bumps [urllib3](https://github.com/urllib3/urllib3) from 1.26.14 to 1.26.15.
- [Release notes](https://github.com/urllib3/urllib3/releases)
- [Changelog](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst)
- [Commits](https://github.com/urllib3/urllib3/compare/1.26.14...1.26.15)

---
updated-dependencies:
- dependency-name: urllib3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update urllib3==1.26.15

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-03-13 11:53:56 -07:00
JonnyWong16
93d1f10ad3
Add credits markers and audio/subtitle settings to exporter fields 2023-03-10 11:06:44 -08:00
JonnyWong16
eb7495e930
Update plexapi==4.13.4 2023-03-10 11:06:44 -08:00
JonnyWong16
b7da2dedf3
Add hidden setting to override server name 2023-03-07 20:25:49 -08:00
JonnyWong16
000656be00
Add last_refreshed time to get_library_media_info response 2023-03-07 20:16:08 -08:00
JonnyWong16
c90469b0b7
URI encode download logfile parameter 2023-03-03 22:37:57 -08:00
JonnyWong16
3d2959ee51
Use .setAttribute() for QR code address parser 2023-03-03 22:25:01 -08:00
JonnyWong16
4274a29bd6
Use .text() instead of .html() to set graph range values 2023-03-03 22:22:29 -08:00
JonnyWong16
22c5e59ee9
Only run CodeQL on nightly branch 2023-03-03 11:20:29 -08:00
JonnyWong16
39047ea7c3
Add codeql config file
[skip ci]
2023-03-03 11:17:59 -08:00
JonnyWong16
0925234f06
Create .github/workflows/codeql.yml 2023-03-03 11:07:45 -08:00
JonnyWong16
d240984c27
Fix multiline changelog in publish installer workflow
* Ref: https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#multiline-strings

[skip ci]
2023-03-03 10:59:43 -08:00
JonnyWong16
8f06b39a07
Fix submit winget workflow
[skip ci]
2023-03-03 10:59:22 -08:00
JonnyWong16
aa7606d576
v2.12.0-beta 2023-03-03 10:26:31 -08:00
JonnyWong16
78a3d15039
Add history table to collection and playlist info pages 2023-03-03 10:22:02 -08:00
dependabot[bot]
ec323abb92
Bump apscheduler from 3.10.0 to 3.10.1 (#2013)
* Bump apscheduler from 3.10.0 to 3.10.1

Bumps [apscheduler](https://github.com/agronholm/apscheduler) from 3.10.0 to 3.10.1.
- [Release notes](https://github.com/agronholm/apscheduler/releases)
- [Changelog](https://github.com/agronholm/apscheduler/blob/3.10.1/docs/versionhistory.rst)
- [Commits](https://github.com/agronholm/apscheduler/compare/3.10.0...3.10.1)

---
updated-dependencies:
- dependency-name: apscheduler
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update apscheduler==3.10.1

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-03-03 10:21:48 -08:00
dependabot[bot]
69e1b43aa1
Bump soupsieve from 2.3.2.post1 to 2.4 (#2014)
Bumps [soupsieve](https://github.com/facelessuser/soupsieve) from 2.3.2.post1 to 2.4.
- [Release notes](https://github.com/facelessuser/soupsieve/releases)
- [Commits](https://github.com/facelessuser/soupsieve/compare/2.3.2.post1...2.4)

---
updated-dependencies:
- dependency-name: soupsieve
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2023-03-03 10:21:35 -08:00
JonnyWong16
dffa353966
Don't submit to winget for pre-release (beta)
[skip ci]
2023-03-02 22:59:58 -08:00
dependabot[bot]
a241de6dc2
Bump pyinstaller from 5.7.0 to 5.8.0 (#1998)
Bumps [pyinstaller](https://github.com/pyinstaller/pyinstaller) from 5.7.0 to 5.8.0.
- [Release notes](https://github.com/pyinstaller/pyinstaller/releases)
- [Changelog](https://github.com/pyinstaller/pyinstaller/blob/develop/doc/CHANGES.rst)
- [Commits](https://github.com/pyinstaller/pyinstaller/compare/v5.7.0...v5.8.0)

---
updated-dependencies:
- dependency-name: pyinstaller
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-03-02 21:10:48 -08:00
dependabot[bot]
3ba3ea9b7e
Bump pycryptodomex from 3.16.0 to 3.17 (#1983)
Bumps [pycryptodomex](https://github.com/Legrandin/pycryptodome) from 3.16.0 to 3.17.
- [Release notes](https://github.com/Legrandin/pycryptodome/releases)
- [Changelog](https://github.com/Legrandin/pycryptodome/blob/master/Changelog.rst)
- [Commits](https://github.com/Legrandin/pycryptodome/compare/v3.16.0...v3.17.0)

---
updated-dependencies:
- dependency-name: pycryptodomex
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2023-03-02 21:04:49 -08:00
dependabot[bot]
33f9c70181
Bump urllib3 from 1.26.13 to 1.26.14 (#1965)
* Bump urllib3 from 1.26.13 to 1.26.14

Bumps [urllib3](https://github.com/urllib3/urllib3) from 1.26.13 to 1.26.14.
- [Release notes](https://github.com/urllib3/urllib3/releases)
- [Changelog](https://github.com/urllib3/urllib3/blob/1.26.14/CHANGES.rst)
- [Commits](https://github.com/urllib3/urllib3/compare/1.26.13...1.26.14)

---
updated-dependencies:
- dependency-name: urllib3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update urllib3==1.26.14

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-03-02 20:58:20 -08:00
dependabot[bot]
eb9c9ffd4e
Bump pyopenssl from 22.1.0 to 23.0.0 (#1955)
Bumps [pyopenssl](https://github.com/pyca/pyopenssl) from 22.1.0 to 23.0.0.
- [Release notes](https://github.com/pyca/pyopenssl/releases)
- [Changelog](https://github.com/pyca/pyopenssl/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/pyopenssl/compare/22.1.0...23.0.0)

---
updated-dependencies:
- dependency-name: pyopenssl
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2023-03-02 20:57:58 -08:00
dependabot[bot]
133c8a3363
Bump cloudinary from 1.30.0 to 1.32.0 (#1996)
* Bump cloudinary from 1.30.0 to 1.32.0

Bumps [cloudinary](https://github.com/cloudinary/pycloudinary) from 1.30.0 to 1.32.0.
- [Release notes](https://github.com/cloudinary/pycloudinary/releases)
- [Changelog](https://github.com/cloudinary/pycloudinary/blob/master/CHANGELOG.md)
- [Commits](https://github.com/cloudinary/pycloudinary/compare/1.30.0...1.32.0)

---
updated-dependencies:
- dependency-name: cloudinary
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update cloudinary==1.32.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-03-02 20:57:02 -08:00
dependabot[bot]
66fa93cfaf
Bump websocket-client from 1.4.2 to 1.5.1 (#1993)
* Bump websocket-client from 1.4.2 to 1.5.1

Bumps [websocket-client](https://github.com/websocket-client/websocket-client) from 1.4.2 to 1.5.1.
- [Release notes](https://github.com/websocket-client/websocket-client/releases)
- [Changelog](https://github.com/websocket-client/websocket-client/blob/master/ChangeLog)
- [Commits](https://github.com/websocket-client/websocket-client/compare/v1.4.2...v1.5.1)

---
updated-dependencies:
- dependency-name: websocket-client
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update websocket-client==1.5.1

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-03-02 20:56:49 -08:00
dependabot[bot]
d0f3f96709
Bump simplejson from 3.18.0 to 3.18.3 (#1992)
* Bump simplejson from 3.18.0 to 3.18.3

Bumps [simplejson](https://github.com/simplejson/simplejson) from 3.18.0 to 3.18.3.
- [Release notes](https://github.com/simplejson/simplejson/releases)
- [Changelog](https://github.com/simplejson/simplejson/blob/master/CHANGES.txt)
- [Commits](https://github.com/simplejson/simplejson/compare/v3.18.0...v3.18.3)

---
updated-dependencies:
- dependency-name: simplejson
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update simplejson==3.18.3

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-03-02 20:56:39 -08:00
dependabot[bot]
8e42757b2d
Bump beautifulsoup4 from 4.11.1 to 4.11.2 (#1987)
* Bump beautifulsoup4 from 4.11.1 to 4.11.2

Bumps [beautifulsoup4](https://www.crummy.com/software/BeautifulSoup/bs4/) from 4.11.1 to 4.11.2.

---
updated-dependencies:
- dependency-name: beautifulsoup4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update beautifulsoup4==4.11.2

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-03-02 20:56:24 -08:00
dependabot[bot]
ded93ef2f5
Bump apscheduler from 3.9.1.post1 to 3.10.0 (#1986)
* Bump apscheduler from 3.9.1.post1 to 3.10.0

Bumps [apscheduler](https://github.com/agronholm/apscheduler) from 3.9.1.post1 to 3.10.0.
- [Release notes](https://github.com/agronholm/apscheduler/releases)
- [Changelog](https://github.com/agronholm/apscheduler/blob/3.10.0/docs/versionhistory.rst)
- [Commits](https://github.com/agronholm/apscheduler/compare/3.9.1.post1...3.10.0)

---
updated-dependencies:
- dependency-name: apscheduler
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update apscheduler==3.10.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-03-02 20:55:46 -08:00
dependabot[bot]
1466a391d1
Bump bleach from 5.0.1 to 6.0.0 (#1979)
* Bump bleach from 5.0.1 to 6.0.0

Bumps [bleach](https://github.com/mozilla/bleach) from 5.0.1 to 6.0.0.
- [Release notes](https://github.com/mozilla/bleach/releases)
- [Changelog](https://github.com/mozilla/bleach/blob/main/CHANGES)
- [Commits](https://github.com/mozilla/bleach/compare/v5.0.1...v6.0.0)

---
updated-dependencies:
- dependency-name: bleach
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update bleach==6.0.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-03-02 20:55:01 -08:00
dependabot[bot]
6b1b6d0f32
Bump tempora from 5.1.0 to 5.2.1 (#1977)
* Bump tempora from 5.1.0 to 5.2.1

Bumps [tempora](https://github.com/jaraco/tempora) from 5.1.0 to 5.2.1.
- [Release notes](https://github.com/jaraco/tempora/releases)
- [Changelog](https://github.com/jaraco/tempora/blob/main/CHANGES.rst)
- [Commits](https://github.com/jaraco/tempora/compare/v5.1.0...v5.2.1)

---
updated-dependencies:
- dependency-name: tempora
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update tempora==5.2.1

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-03-02 20:54:54 -08:00
dependabot[bot]
2fda916331
Bump markupsafe from 2.1.1 to 2.1.2 (#1976)
* Bump markupsafe from 2.1.1 to 2.1.2

Bumps [markupsafe](https://github.com/pallets/markupsafe) from 2.1.1 to 2.1.2.
- [Release notes](https://github.com/pallets/markupsafe/releases)
- [Changelog](https://github.com/pallets/markupsafe/blob/main/CHANGES.rst)
- [Commits](https://github.com/pallets/markupsafe/compare/2.1.1...2.1.2)

---
updated-dependencies:
- dependency-name: markupsafe
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update markupsafe==2.1.2

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-03-02 20:54:41 -08:00
dependabot[bot]
32c06a8b72
Bump dnspython from 2.2.1 to 2.3.0 (#1975)
* Bump dnspython from 2.2.1 to 2.3.0

Bumps [dnspython](https://github.com/rthalley/dnspython) from 2.2.1 to 2.3.0.
- [Release notes](https://github.com/rthalley/dnspython/releases)
- [Changelog](https://github.com/rthalley/dnspython/blob/master/doc/whatsnew.rst)
- [Commits](https://github.com/rthalley/dnspython/compare/v2.2.1...v2.3.0)

---
updated-dependencies:
- dependency-name: dnspython
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update dnspython==2.3.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-03-02 20:54:32 -08:00
dependabot[bot]
6910079330
Bump pytz from 2022.7 to 2022.7.1 (#1974)
* Bump pytz from 2022.7 to 2022.7.1

Bumps [pytz](https://github.com/stub42/pytz) from 2022.7 to 2022.7.1.
- [Release notes](https://github.com/stub42/pytz/releases)
- [Commits](https://github.com/stub42/pytz/compare/release_2022.7...release_2022.7.1)

---
updated-dependencies:
- dependency-name: pytz
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update pytz==2022.7.1

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-03-02 20:54:08 -08:00
dependabot[bot]
9f727d0086
Bump future from 0.18.2 to 0.18.3 (#1970)
* Bump future from 0.18.2 to 0.18.3

Bumps [future](https://github.com/PythonCharmers/python-future) from 0.18.2 to 0.18.3.
- [Release notes](https://github.com/PythonCharmers/python-future/releases)
- [Changelog](https://github.com/PythonCharmers/python-future/blob/master/docs/changelog.rst)
- [Commits](https://github.com/PythonCharmers/python-future/compare/v0.18.2...v0.18.3)

---
updated-dependencies:
- dependency-name: future
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update future==0.18.3

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-03-02 20:53:26 -08:00
dependabot[bot]
cc78f17be5
Bump requests from 2.28.1 to 2.28.2 (#1968)
* Bump requests from 2.28.1 to 2.28.2

Bumps [requests](https://github.com/psf/requests) from 2.28.1 to 2.28.2.
- [Release notes](https://github.com/psf/requests/releases)
- [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md)
- [Commits](https://github.com/psf/requests/compare/v2.28.1...v2.28.2)

---
updated-dependencies:
- dependency-name: requests
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update requests==2.28.2

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-03-02 20:53:15 -08:00
dependabot[bot]
70e09582da
Bump packaging from 22.0 to 23.0 (#1964)
* Bump packaging from 22.0 to 23.0

Bumps [packaging](https://github.com/pypa/packaging) from 22.0 to 23.0.
- [Release notes](https://github.com/pypa/packaging/releases)
- [Changelog](https://github.com/pypa/packaging/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pypa/packaging/compare/22.0...23.0)

---
updated-dependencies:
- dependency-name: packaging
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update packaging==23.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-03-02 20:53:00 -08:00
dependabot[bot]
1f59171dcb
Bump zipp from 3.11.0 to 3.15.0 (#2011)
* Bump zipp from 3.11.0 to 3.15.0

Bumps [zipp](https://github.com/jaraco/zipp) from 3.11.0 to 3.15.0.
- [Release notes](https://github.com/jaraco/zipp/releases)
- [Changelog](https://github.com/jaraco/zipp/blob/main/CHANGES.rst)
- [Commits](https://github.com/jaraco/zipp/compare/v3.11.0...v3.15.0)

---
updated-dependencies:
- dependency-name: zipp
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update zipp==3.15.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-03-02 20:50:33 -08:00
dependabot[bot]
c8f43825f9
Bump importlib-resources from 5.10.1 to 5.12.0 (#2004)
* Bump importlib-resources from 5.10.1 to 5.12.0

Bumps [importlib-resources](https://github.com/python/importlib_resources) from 5.10.1 to 5.12.0.
- [Release notes](https://github.com/python/importlib_resources/releases)
- [Changelog](https://github.com/python/importlib_resources/blob/main/CHANGES.rst)
- [Commits](https://github.com/python/importlib_resources/compare/v5.10.1...v5.12.0)

---
updated-dependencies:
- dependency-name: importlib-resources
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update importlib-resources==5.12.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-03-02 20:50:15 -08:00
dependabot[bot]
eaa294b2a2
Bump importlib-metadata from 5.2.0 to 6.0.0 (#1954)
* Bump importlib-metadata from 5.2.0 to 6.0.0

Bumps [importlib-metadata](https://github.com/python/importlib_metadata) from 5.2.0 to 6.0.0.
- [Release notes](https://github.com/python/importlib_metadata/releases)
- [Changelog](https://github.com/python/importlib_metadata/blob/main/CHANGES.rst)
- [Commits](https://github.com/python/importlib_metadata/compare/v5.2.0...v6.0.0)

---
updated-dependencies:
- dependency-name: importlib-metadata
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update importlib-metadata==6.0.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-03-02 20:49:14 -08:00
dependabot[bot]
5c43daf067
Bump docker/build-push-action from 3 to 4 (#1985)
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 3 to 4.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](https://github.com/docker/build-push-action/compare/v3...v4)

---
updated-dependencies:
- dependency-name: docker/build-push-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2023-03-02 20:01:45 -08:00
herby2212
0522253194
Add watch time & user stats for playlists (#2012) 2023-02-28 17:33:13 -08:00
herby2212
ae3d75bbe3
watch time & user stats for collections (#1982)
* user_stats for collection

* watch_time_stats for collection

* check for media_type to be compatible with API

* update API and datafactory optimizations

* beautify webserve class

* fix sql query build

* filter on suitable collections

* stats for collections of sub media type

* optimize array creation
2023-02-26 17:32:50 -08:00
JonnyWong16
993909fa08
Use private shared-memory for Snap 2023-02-26 16:17:58 -08:00
JonnyWong16
ce45321e3f
Revert "Add multiprocessing semaphore prefix"
This reverts commit 731d5c9baf.
2023-02-26 16:13:25 -08:00
JonnyWong16
cd3ff6eed7
Remove extra pass 2023-02-26 16:06:44 -08:00
JonnyWong16
731d5c9baf
Add multiprocessing semaphore prefix
* Fixes #2007
2023-02-26 15:17:04 -08:00
JonnyWong16
af3e5574f5
Migrate to Google Analytics 4 2023-02-26 15:09:51 -08:00
JonnyWong16
42eeb90532
Add ga4mp library
* Remove UniversalAnalytics
2023-02-26 15:09:12 -08:00
JonnyWong16
ecb6d8b743
Move track artist to details tag on info page 2023-02-25 16:43:14 -08:00
JonnyWong16
e6d1712afd
Fix styling on collection info pages 2023-02-25 16:35:48 -08:00
JonnyWong16
ebe570d42f
Allow setting a custom Pushover sound
* Closes #2005
2023-02-21 11:12:56 -08:00
JonnyWong16
2a1bf7847b
Last watched statistics card based on credits markers 2023-02-20 18:36:15 -08:00
JonnyWong16
928e1d4b5e
History table watched status based on credits markers 2023-02-20 18:36:15 -08:00
JonnyWong16
c5005c1ea9
Group watched history sessions based on credits markers 2023-02-20 18:36:15 -08:00
JonnyWong16
b2b12044e3
Trigger on_watched based on credits markers 2023-02-20 18:36:15 -08:00
JonnyWong16
b1dd28e39b
Add setting to change video watched completion behaviour 2023-02-20 16:33:19 -08:00
JonnyWong16
c2abfce8e1
Save credits markers offsets to session history 2023-02-19 17:41:48 -08:00
JonnyWong16
6807cebe51
Strip whitespace from condition values 2023-02-17 18:55:28 -08:00
JonnyWong16
87d3c0ae81
Fix missing on_commercial columns in database 2023-02-17 18:54:52 -08:00
JonnyWong16
6b0b3a476f
Add support for commercial marker triggers 2023-02-17 10:01:57 -08:00
JonnyWong16
32bb98e8c1
Update get_metadata_details docs 2023-02-17 09:29:08 -08:00
JonnyWong16
9c6b8f1af5
Simplify metadata credits marker first flag 2023-02-17 09:28:44 -08:00
JonnyWong16
7cc78d448d
Simplify set marker in database 2023-02-16 17:06:46 -08:00
JonnyWong16
599c54c9e1
Refactor activity handler 2023-02-16 17:02:30 -08:00
JonnyWong16
9be3bbbf0f
Update marker notification parameters 2023-02-16 16:20:25 -08:00
JonnyWong16
97af214ac1
Handle seeking through intro/credits markers 2023-02-16 16:19:29 -08:00
JonnyWong16
71bc063155
Add notification triggers for intro/credit markers 2023-02-16 11:31:35 -08:00
JonnyWong16
9a152932ee
Monitor stream intro/credits marker activity 2023-02-16 11:30:33 -08:00
JonnyWong16
a8539b2927
Retrieve intro/credits markers for metadata details 2023-02-16 11:30:33 -08:00
JonnyWong16
0db9548995
Revert "Add prvenance: false to docker/build-push-action"
This reverts commit 548264d51a.
2023-02-14 18:26:50 -08:00
JonnyWong16
e263f0b8a3
Refactor notification image upload code 2023-02-14 18:21:19 -08:00
JonnyWong16
5ab9315f16
Upload notification images directly to Discord 2023-02-14 18:19:35 -08:00
JonnyWong16
b6ff45138f
Add section_id and user_id parameters to get_home_stats API command
* Closes #1944
2023-01-28 14:10:47 -08:00
JonnyWong16
b0a55df862
Add anidb_id and anidb_url notification parameters
* Closes #1973
2023-01-28 14:10:47 -08:00
JonnyWong16
c51ee673e8
Add support for Telegram group topics
* Closes #1980
2023-01-28 14:10:47 -08:00
herby2212
0959f28e95
Add edition detail field for movie info (#1957)
* edition addition for movie info

* swap position to match plex order
2023-01-28 14:09:11 -08:00
JonnyWong16
1e02c26a9a
Relax workflow action versions 2023-01-20 17:09:20 -08:00
JonnyWong16
548264d51a
Add prvenance: false to docker/build-push-action
Ref: docker/buildx#1533
2023-01-20 17:09:20 -08:00
JonnyWong16
460a463be1
Update notification parameter description for Plex API image paths 2023-01-19 13:54:55 -08:00
JonnyWong16
2f6869ed2a
Update CI badges in README
* Ref: badges/shields#8671

[skip ci]
2022-12-23 11:11:04 -08:00
JonnyWong16
3c996f01a9
v2.11.1 2022-12-22 17:58:38 -08:00
JonnyWong16
d9343730da
Downgrade snap to core20 2022-12-22 17:50:24 -08:00
JonnyWong16
7386ca1c42
Add backports.cached-property==1.0.2 2022-12-22 17:28:28 -08:00
James Tufarelli
2a0e07aca5
Fix update check failing when git is not found (#1943)
* Update versioncheck to cast commit_hash to string

After the most recent v2.11.0 update, Tautulli would not start until I made this change to the codebase.

* Update plexpy/versioncheck.py

Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>
2022-12-22 17:28:09 -08:00
JonnyWong16
1e58847bcd
Update snap to core22
* Fixes #1941
2022-12-22 16:24:51 -08:00
JonnyWong16
b0ba73cf46
Fix no started parameter for recently added notifications
* Fixes #1940
2022-12-22 13:52:11 -08:00
JonnyWong16
6181aa178d
Fix publish installer changelog sed command 2022-12-22 12:01:52 -08:00
JonnyWong16
680c8f1ee3
Update publish installer workflow token 2022-12-22 11:44:48 -08:00
JonnyWong16
e8af221e99
Rename submit winget job name 2022-12-22 11:44:30 -08:00
JonnyWong16
808ca348e8
Use source language instead of stream language on activity cards 2022-12-22 11:24:41 -08:00
JonnyWong16
f6dd38ad12
v2.11.0 2022-12-22 11:15:59 -08:00
dependabot[bot]
4064ac083e
Bump actions/setup-python from 4.3.1 to 4.4.0 (#1938)
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 4.3.1 to 4.4.0.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v4.3.1...v4.4.0)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-12-22 10:45:05 -08:00
dependabot[bot]
31f6b02149
Bump plexapi from 4.13.1 to 4.13.2 (#1939)
* Bump plexapi from 4.13.1 to 4.13.2

Bumps [plexapi](https://github.com/pkkid/python-plexapi) from 4.13.1 to 4.13.2.
- [Release notes](https://github.com/pkkid/python-plexapi/releases)
- [Commits](https://github.com/pkkid/python-plexapi/compare/4.13.1...4.13.2)

---
updated-dependencies:
- dependency-name: plexapi
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update plexapi==4.13.2

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-12-22 10:44:51 -08:00
JonnyWong16
8cd5b0b775
Use system language for requests 2022-12-21 17:25:40 -08:00
JonnyWong16
d426c3e12e
Don't capitalize language and display "Unknown" on activity cards 2022-12-21 17:25:18 -08:00
JonnyWong16
8eed162367
Override direct play subtitle decision in stream data modal 2022-12-21 17:24:41 -08:00
JonnyWong16
fe1d850e1c
Display "Unknown" language in stream data modal 2022-12-21 17:24:14 -08:00
JonnyWong16
bcb9a9d6c6
Display subtitle forced in stream data modal 2022-12-21 17:02:10 -08:00
JonnyWong16
5a9ace0b19
Log subtitle forced 2022-12-21 17:01:50 -08:00
JonnyWong16
185a5cb0ea
Add subtitle_forced to database 2022-12-21 17:01:24 -08:00
JonnyWong16
44419fb0bf
Display subtitle language in stream data modal 2022-12-21 16:35:15 -08:00
JonnyWong16
c00dfca2f0
Log subtitle language 2022-12-21 16:35:15 -08:00
JonnyWong16
023fde7a84
Add subtitle_language to database 2022-12-21 16:35:15 -08:00
JonnyWong16
7c030ef362
Link watch statistics to info page using history metadata
* Closes #1882
2022-12-21 16:35:15 -08:00
FSCorrupt
8664b95ca1
Adding stream audio/sub language to activity card. (#1900)
* Update current_activity_instance.html

* Update index.html

* Make sure language is capitalized on activity card

Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>
2022-12-21 16:26:32 -08:00
Jagandeep Brar
74d8bc15ca
Add session_key to LunaSea notifier payload (#1929) 2022-12-21 16:08:14 -08:00
dependabot[bot]
cbe33e93c9
Bump pyinstaller from 5.6.2 to 5.7.0 (#1917)
Bumps [pyinstaller](https://github.com/pyinstaller/pyinstaller) from 5.6.2 to 5.7.0.
- [Release notes](https://github.com/pyinstaller/pyinstaller/releases)
- [Changelog](https://github.com/pyinstaller/pyinstaller/blob/develop/doc/CHANGES.rst)
- [Commits](https://github.com/pyinstaller/pyinstaller/compare/v5.6.2...v5.7.0)

---
updated-dependencies:
- dependency-name: pyinstaller
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-12-21 16:06:32 -08:00
Eric Nemchik
8cf12a2ab5
backports.zoneinfo environment marker (#1926)
https://github.com/pganssle/zoneinfo#installation-and-depending-on-this-library notes:
> Support for `backports.zoneinfo` in Python 3.9+ is currently minimal, since it is expected that you would use the standard library `zoneinfo` module instead.
2022-12-21 16:05:55 -08:00
dependabot[bot]
497ceb8cbb
Bump pyobjc-core from 9.0 to 9.0.1 (#1935)
Bumps [pyobjc-core](https://github.com/ronaldoussoren/pyobjc) from 9.0 to 9.0.1.
- [Release notes](https://github.com/ronaldoussoren/pyobjc/releases)
- [Changelog](https://github.com/ronaldoussoren/pyobjc/blob/master/docs/changelog.rst)
- [Commits](https://github.com/ronaldoussoren/pyobjc/commits)

---
updated-dependencies:
- dependency-name: pyobjc-core
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-12-21 16:05:11 -08:00
dependabot[bot]
18a5962026
Bump pyobjc-framework-cocoa from 9.0 to 9.0.1 (#1933)
Bumps [pyobjc-framework-cocoa](https://github.com/ronaldoussoren/pyobjc) from 9.0 to 9.0.1.
- [Release notes](https://github.com/ronaldoussoren/pyobjc/releases)
- [Changelog](https://github.com/ronaldoussoren/pyobjc/blob/master/docs/changelog.rst)
- [Commits](https://github.com/ronaldoussoren/pyobjc/commits)

---
updated-dependencies:
- dependency-name: pyobjc-framework-cocoa
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-12-21 16:03:50 -08:00
dependabot[bot]
d8150813f1
Bump pycryptodomex from 3.15.0 to 3.16.0 (#1911)
Bumps [pycryptodomex](https://github.com/Legrandin/pycryptodome) from 3.15.0 to 3.16.0.
- [Release notes](https://github.com/Legrandin/pycryptodome/releases)
- [Changelog](https://github.com/Legrandin/pycryptodome/blob/master/Changelog.rst)
- [Commits](https://github.com/Legrandin/pycryptodome/compare/v3.15.0...v3.16.0)

---
updated-dependencies:
- dependency-name: pycryptodomex
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-12-21 16:03:24 -08:00
dependabot[bot]
4398ece2da
Bump pytz from 2022.6 to 2022.7 (#1934)
* Bump pytz from 2022.6 to 2022.7

Bumps [pytz](https://github.com/stub42/pytz) from 2022.6 to 2022.7.
- [Release notes](https://github.com/stub42/pytz/releases)
- [Commits](https://github.com/stub42/pytz/compare/release_2022.6...release_2022.7)

---
updated-dependencies:
- dependency-name: pytz
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update pytz==2022.7

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-12-21 16:02:40 -08:00
dependabot[bot]
8159bf456c
Bump importlib-metadata from 5.0.0 to 5.2.0 (#1932)
* Bump importlib-metadata from 5.0.0 to 5.2.0

Bumps [importlib-metadata](https://github.com/python/importlib_metadata) from 5.0.0 to 5.2.0.
- [Release notes](https://github.com/python/importlib_metadata/releases)
- [Changelog](https://github.com/python/importlib_metadata/blob/main/CHANGES.rst)
- [Commits](https://github.com/python/importlib_metadata/compare/v5.0.0...v5.2.0)

---
updated-dependencies:
- dependency-name: importlib-metadata
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update importlib-metadata==5.2.0

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-12-21 16:02:25 -08:00
dependabot[bot]
56780677fb
Bump packaging from 21.3 to 22.0 (#1922)
* Bump packaging from 21.3 to 22.0

Bumps [packaging](https://github.com/pypa/packaging) from 21.3 to 22.0.
- [Release notes](https://github.com/pypa/packaging/releases)
- [Changelog](https://github.com/pypa/packaging/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pypa/packaging/compare/21.3...22.0)

---
updated-dependencies:
- dependency-name: packaging
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update packaging==22.0

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-12-21 16:01:24 -08:00
dependabot[bot]
dbe0018e24
Bump certifi from 2022.9.24 to 2022.12.7 (#1920)
* Bump certifi from 2022.9.24 to 2022.12.7

Bumps [certifi](https://github.com/certifi/python-certifi) from 2022.9.24 to 2022.12.7.
- [Release notes](https://github.com/certifi/python-certifi/releases)
- [Commits](https://github.com/certifi/python-certifi/compare/2022.09.24...2022.12.07)

---
updated-dependencies:
- dependency-name: certifi
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update certifi==2022.12.7

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-12-21 16:00:56 -08:00
dependabot[bot]
483245506b
Bump importlib-resources from 5.10.0 to 5.10.1 (#1918)
* Bump importlib-resources from 5.10.0 to 5.10.1

Bumps [importlib-resources](https://github.com/python/importlib_resources) from 5.10.0 to 5.10.1.
- [Release notes](https://github.com/python/importlib_resources/releases)
- [Changelog](https://github.com/python/importlib_resources/blob/main/CHANGES.rst)
- [Commits](https://github.com/python/importlib_resources/compare/v5.10.0...v5.10.1)

---
updated-dependencies:
- dependency-name: importlib-resources
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update importlib-resources==5.10.1

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-12-21 16:00:12 -08:00
dependabot[bot]
c61f854318
Bump tzdata from 2022.6 to 2022.7 (#1915)
* Bump tzdata from 2022.6 to 2022.7

Bumps [tzdata](https://github.com/python/tzdata) from 2022.6 to 2022.7.
- [Release notes](https://github.com/python/tzdata/releases)
- [Changelog](https://github.com/python/tzdata/blob/master/NEWS.md)
- [Commits](https://github.com/python/tzdata/compare/2022.6...2022.7)

---
updated-dependencies:
- dependency-name: tzdata
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update tzdata==2022.7

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-12-21 15:59:53 -08:00
dependabot[bot]
e646c0e6eb
Bump zipp from 3.10.0 to 3.11.0 (#1912)
* Bump zipp from 3.10.0 to 3.11.0

Bumps [zipp](https://github.com/jaraco/zipp) from 3.10.0 to 3.11.0.
- [Release notes](https://github.com/jaraco/zipp/releases)
- [Changelog](https://github.com/jaraco/zipp/blob/main/CHANGES.rst)
- [Commits](https://github.com/jaraco/zipp/compare/v3.10.0...v3.11.0)

---
updated-dependencies:
- dependency-name: zipp
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update zipp==3.11.0

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-12-21 15:59:38 -08:00
dependabot[bot]
d596b86c8d
Bump urllib3 from 1.26.12 to 1.26.13 (#1908)
* Bump urllib3 from 1.26.12 to 1.26.13

Bumps [urllib3](https://github.com/urllib3/urllib3) from 1.26.12 to 1.26.13.
- [Release notes](https://github.com/urllib3/urllib3/releases)
- [Changelog](https://github.com/urllib3/urllib3/blob/1.26.13/CHANGES.rst)
- [Commits](https://github.com/urllib3/urllib3/compare/1.26.12...1.26.13)

---
updated-dependencies:
- dependency-name: urllib3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update urllib3==1.26.13

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-12-21 15:59:10 -08:00
dependabot[bot]
3d378eb583
Bump cheroot from 8.6.0 to 9.0.0 (#1903)
* Bump cheroot from 8.6.0 to 9.0.0

Bumps [cheroot](https://github.com/cherrypy/cheroot) from 8.6.0 to 9.0.0.
- [Release notes](https://github.com/cherrypy/cheroot/releases)
- [Changelog](https://github.com/cherrypy/cheroot/blob/main/CHANGES.rst)
- [Commits](https://github.com/cherrypy/cheroot/compare/v8.6.0...v9.0.0)

---
updated-dependencies:
- dependency-name: cheroot
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update cheroot==9.0.0

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-12-21 15:58:54 -08:00
dependabot[bot]
0a5edebea3
Bump tempora from 5.0.2 to 5.1.0 (#1902)
* Bump tempora from 5.0.2 to 5.1.0

Bumps [tempora](https://github.com/jaraco/tempora) from 5.0.2 to 5.1.0.
- [Release notes](https://github.com/jaraco/tempora/releases)
- [Changelog](https://github.com/jaraco/tempora/blob/main/CHANGES.rst)
- [Commits](https://github.com/jaraco/tempora/compare/v5.0.2...v5.1.0)

---
updated-dependencies:
- dependency-name: tempora
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update tempora==5.1.0

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-12-21 15:58:39 -08:00
dependabot[bot]
d736fab432
Bump actions/stale from 6 to 7 (#1937)
Bumps [actions/stale](https://github.com/actions/stale) from 6 to 7.
- [Release notes](https://github.com/actions/stale/releases)
- [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/stale/compare/v6...v7)

---
updated-dependencies:
- dependency-name: actions/stale
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-12-21 15:42:30 -08:00
dependabot[bot]
ff81b08491
Bump actions/cache from 3.0.11 to 3.2.0 (#1936)
Bumps [actions/cache](https://github.com/actions/cache) from 3.0.11 to 3.2.0.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/v3.0.11...v3.2.0)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-12-21 15:42:02 -08:00
dependabot[bot]
d00916331d
Bump actions/checkout from 3.1.0 to 3.2.0 (#1924)
Bumps [actions/checkout](https://github.com/actions/checkout) from 3.1.0 to 3.2.0.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v3.1.0...v3.2.0)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-12-21 15:41:48 -08:00
dependabot[bot]
ec08c887f4
Bump actions/setup-python from 4.3.0 to 4.3.1 (#1921)
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 4.3.0 to 4.3.1.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v4.3.0...v4.3.1)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-12-21 15:41:32 -08:00
dependabot[bot]
d7aa1ced53
Bump dessant/label-actions from 2 to 3 (#1916)
Bumps [dessant/label-actions](https://github.com/dessant/label-actions) from 2 to 3.
- [Release notes](https://github.com/dessant/label-actions/releases)
- [Changelog](https://github.com/dessant/label-actions/blob/master/CHANGELOG.md)
- [Commits](https://github.com/dessant/label-actions/compare/v2...v3)

---
updated-dependencies:
- dependency-name: dessant/label-actions
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-12-21 15:41:04 -08:00
JonnyWong16
8a1cd2841b
Revert "Pin diddlesnaps/snapcraft-multiarch-action@v1.5.0"
This reverts commit 6156edf5fe.
2022-12-21 15:14:22 -08:00
JonnyWong16
5f8fbe1230
Add meta color-scheme to newsletter template
* Allows CSS to support light and dark themes
2022-12-21 15:13:14 -08:00
JonnyWong16
8cfe60b485
Add started and stopped notification parameters
* Closes #1931
2022-12-21 14:55:33 -08:00
JonnyWong16
6156edf5fe
Pin diddlesnaps/snapcraft-multiarch-action@v1.5.0 2022-11-29 20:55:14 -08:00
JonnyWong16
e2326cd06a
Mask more user and metadata fields for guest access
Fixes #1913
2022-11-29 14:04:24 -08:00
JonnyWong16
94eb5cdef3
Add movie editionTitle to exporter 2022-11-24 09:15:07 -08:00
JonnyWong16
8c552d3086
Only validate condition operator if parameter is present 2022-11-21 20:48:47 -08:00
JonnyWong16
5a8797a6dd
Shorten TLS log message 2022-11-15 15:56:11 -08:00
dependabot[bot]
192dd64dbe
Bump mako from 1.2.3 to 1.2.4 (#1899)
* Bump mako from 1.2.3 to 1.2.4

Bumps [mako](https://github.com/sqlalchemy/mako) from 1.2.3 to 1.2.4.
- [Release notes](https://github.com/sqlalchemy/mako/releases)
- [Changelog](https://github.com/sqlalchemy/mako/blob/main/CHANGES)
- [Commits](https://github.com/sqlalchemy/mako/commits)

---
updated-dependencies:
- dependency-name: mako
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update mako==1.2.4

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-11-15 15:56:03 -08:00
dependabot[bot]
259a96995a
Bump simplejson from 3.17.6 to 3.18.0 (#1898)
* Bump simplejson from 3.17.6 to 3.18.0

Bumps [simplejson](https://github.com/simplejson/simplejson) from 3.17.6 to 3.18.0.
- [Release notes](https://github.com/simplejson/simplejson/releases)
- [Changelog](https://github.com/simplejson/simplejson/blob/master/CHANGES.txt)
- [Commits](https://github.com/simplejson/simplejson/compare/v3.17.6...v3.18.0)

---
updated-dependencies:
- dependency-name: simplejson
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update simplejson==3.18.0

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-11-15 15:55:50 -08:00
dependabot[bot]
60da559332
Bump pyjwt from 2.4.0 to 2.6.0 (#1897)
* Bump pyjwt from 2.4.0 to 2.6.0

Bumps [pyjwt](https://github.com/jpadilla/pyjwt) from 2.4.0 to 2.6.0.
- [Release notes](https://github.com/jpadilla/pyjwt/releases)
- [Changelog](https://github.com/jpadilla/pyjwt/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/jpadilla/pyjwt/compare/2.4.0...2.6.0)

---
updated-dependencies:
- dependency-name: pyjwt
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update pyjwt==2.6.0

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-11-14 11:27:25 -08:00
dependabot[bot]
79cf61c53e
Bump rumps from 0.3.0 to 0.4.0 (#1896)
* Bump rumps from 0.3.0 to 0.4.0

Bumps [rumps](https://github.com/jaredks/rumps) from 0.3.0 to 0.4.0.
- [Release notes](https://github.com/jaredks/rumps/releases)
- [Changelog](https://github.com/jaredks/rumps/blob/master/CHANGES.rst)
- [Commits](https://github.com/jaredks/rumps/commits)

---
updated-dependencies:
- dependency-name: rumps
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update rumps==0.4.0

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-11-14 11:27:16 -08:00
dependabot[bot]
b31d75aeee
Bump distro from 1.7.0 to 1.8.0 (#1895)
* Bump distro from 1.7.0 to 1.8.0

Bumps [distro](https://github.com/python-distro/distro) from 1.7.0 to 1.8.0.
- [Release notes](https://github.com/python-distro/distro/releases)
- [Changelog](https://github.com/python-distro/distro/blob/master/CHANGELOG.md)
- [Commits](https://github.com/python-distro/distro/compare/v1.7.0...v1.8.0)

---
updated-dependencies:
- dependency-name: distro
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update distro==1.8.0

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-11-14 11:27:01 -08:00
dependabot[bot]
6b835226cd
Bump cloudinary from 1.29.0 to 1.30.0 (#1890)
* Bump cloudinary from 1.29.0 to 1.30.0

Bumps [cloudinary](https://github.com/cloudinary/pycloudinary) from 1.29.0 to 1.30.0.
- [Release notes](https://github.com/cloudinary/pycloudinary/releases)
- [Changelog](https://github.com/cloudinary/pycloudinary/blob/master/CHANGELOG.md)
- [Commits](https://github.com/cloudinary/pycloudinary/compare/1.29.0...1.30.0)

---
updated-dependencies:
- dependency-name: cloudinary
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update cloudinary==1.30.0

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-11-14 11:26:24 -08:00
dependabot[bot]
7f132439be
Bump tokenize-rt from 4.2.1 to 5.0.0 (#1889)
* Bump tokenize-rt from 4.2.1 to 5.0.0

Bumps [tokenize-rt](https://github.com/asottile/tokenize-rt) from 4.2.1 to 5.0.0.
- [Release notes](https://github.com/asottile/tokenize-rt/releases)
- [Commits](https://github.com/asottile/tokenize-rt/compare/v4.2.1...v5.0.0)

---
updated-dependencies:
- dependency-name: tokenize-rt
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update tokenize-rt==5.0.0

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-11-14 11:26:09 -08:00
dependabot[bot]
6365327595
Bump pyopenssl from 22.0.0 to 22.1.0 (#1893)
Bumps [pyopenssl](https://github.com/pyca/pyopenssl) from 22.0.0 to 22.1.0.
- [Release notes](https://github.com/pyca/pyopenssl/releases)
- [Changelog](https://github.com/pyca/pyopenssl/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/pyopenssl/compare/22.0.0...22.1.0)

---
updated-dependencies:
- dependency-name: pyopenssl
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-11-14 11:25:40 -08:00
dependabot[bot]
8d40224d61
Bump pywin32 from 304 to 305 (#1894)
Bumps [pywin32](https://github.com/mhammond/pywin32) from 304 to 305.
- [Release notes](https://github.com/mhammond/pywin32/releases)
- [Changelog](https://github.com/mhammond/pywin32/blob/main/CHANGES.txt)
- [Commits](https://github.com/mhammond/pywin32/commits)

---
updated-dependencies:
- dependency-name: pywin32
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-11-14 11:24:36 -08:00
dependabot[bot]
b3091d7366
Bump pyobjc-framework-cocoa from 8.5 to 9.0 (#1891)
Bumps [pyobjc-framework-cocoa](https://github.com/ronaldoussoren/pyobjc) from 8.5 to 9.0.
- [Release notes](https://github.com/ronaldoussoren/pyobjc/releases)
- [Changelog](https://github.com/ronaldoussoren/pyobjc/blob/master/docs/changelog.rst)
- [Commits](https://github.com/ronaldoussoren/pyobjc/compare/v8.5...v9.0)

---
updated-dependencies:
- dependency-name: pyobjc-framework-cocoa
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-11-14 11:24:22 -08:00
dependabot[bot]
fb21815ca0
Bump apscheduler from 3.9.1 to 3.9.1.post1 (#1892)
Bumps [apscheduler](https://github.com/agronholm/apscheduler) from 3.9.1 to 3.9.1.post1.
- [Release notes](https://github.com/agronholm/apscheduler/releases)
- [Changelog](https://github.com/agronholm/apscheduler/blob/master/docs/versionhistory.rst)
- [Commits](https://github.com/agronholm/apscheduler/compare/3.9.1...3.9.1.post1)

---
updated-dependencies:
- dependency-name: apscheduler
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-11-14 11:24:06 -08:00
JonnyWong16
0f39171f93
Make webserver TLS version advanced config
Ref: #1870
2022-11-14 11:09:22 -08:00
JonnyWong16
100fdd1df1
Change export m3u8 to m3u extension
* m3u files are still encoded using UTF-8
2022-11-13 19:09:58 -08:00
JonnyWong16
1cdb55a6a9
Set SSLContext.minimum_version to TLSv1.2
`ssl.OP_NO_TLSv1` and `ssl.OP_NO_TLSv1_1` deprecated since Python 3.7 and OpenSSL 1.1.0.

Ref: #1870
2022-11-13 01:03:36 -08:00
JonnyWong16
977eec8a66
Disable TLS 1.0 and TLS 1.1 in webserver
Fixes #1870
2022-11-13 00:19:02 -08:00
JonnyWong16
05739ea959
pyOpenSSL only required for generating self-signed certificates 2022-11-13 00:17:28 -08:00
JonnyWong16
ed735e5fa3
Shorten winget workflow name 2022-11-12 17:57:44 -08:00
dependabot[bot]
76cc56a215
Bump cherrypy from 18.6.1 to 18.8.0 (#1796)
* Bump cherrypy from 18.6.1 to 18.8.0

Bumps [cherrypy](https://github.com/cherrypy/cherrypy) from 18.6.1 to 18.8.0.
- [Release notes](https://github.com/cherrypy/cherrypy/releases)
- [Changelog](https://github.com/cherrypy/cherrypy/blob/main/CHANGES.rst)
- [Commits](https://github.com/cherrypy/cherrypy/compare/v18.6.1...v18.8.0)

---
updated-dependencies:
- dependency-name: cherrypy
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update cherrypy==18.8.0

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>
2022-11-12 17:53:03 -08:00
dependabot[bot]
e79da07973
Bump plexapi from 4.12.1 to 4.13.1 (#1888)
Bumps [plexapi](https://github.com/pkkid/python-plexapi) from 4.12.1 to 4.13.1.
- [Release notes](https://github.com/pkkid/python-plexapi/releases)
- [Commits](https://github.com/pkkid/python-plexapi/compare/4.12.1...4.13.1)

---
updated-dependencies:
- dependency-name: plexapi
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-11-12 17:29:35 -08:00
dependabot[bot]
3af08f0d07
Bump websocket-client from 1.3.2 to 1.4.2 (#1886)
* Bump websocket-client from 1.3.2 to 1.4.2

Bumps [websocket-client](https://github.com/websocket-client/websocket-client) from 1.3.2 to 1.4.2.
- [Release notes](https://github.com/websocket-client/websocket-client/releases)
- [Changelog](https://github.com/websocket-client/websocket-client/blob/master/ChangeLog)
- [Commits](https://github.com/websocket-client/websocket-client/compare/v1.3.2...v1.4.2)

---
updated-dependencies:
- dependency-name: websocket-client
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update websocket-client==1.4.2

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-11-12 17:29:02 -08:00
dependabot[bot]
a5ccc9a1a3
Bump pytz from 2022.1 to 2022.6 (#1880)
* Bump pytz from 2022.1 to 2022.6

Bumps [pytz](https://github.com/stub42/pytz) from 2022.1 to 2022.6.
- [Release notes](https://github.com/stub42/pytz/releases)
- [Commits](https://github.com/stub42/pytz/compare/release_2022.1...release_2022.6)

---
updated-dependencies:
- dependency-name: pytz
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update pytz==2022.6

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-11-12 17:26:45 -08:00
dependabot[bot]
8a4cb13b18
Bump tzdata from 2022.1 to 2022.6 (#1878)
* Bump tzdata from 2022.1 to 2022.6

Bumps [tzdata](https://github.com/python/tzdata) from 2022.1 to 2022.6.
- [Release notes](https://github.com/python/tzdata/releases)
- [Changelog](https://github.com/python/tzdata/blob/master/NEWS.md)
- [Commits](https://github.com/python/tzdata/compare/2022.1...2022.6)

---
updated-dependencies:
- dependency-name: tzdata
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update tzdata==2022.6

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-11-12 17:25:54 -08:00
dependabot[bot]
c2f47a52b4
Bump httpagentparser from 1.9.2 to 1.9.5 (#1869)
* Bump httpagentparser from 1.9.2 to 1.9.5

Bumps [httpagentparser](https://github.com/shon/httpagentparser) from 1.9.2 to 1.9.5.
- [Release notes](https://github.com/shon/httpagentparser/releases)
- [Commits](https://github.com/shon/httpagentparser/commits)

---
updated-dependencies:
- dependency-name: httpagentparser
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update httpagentparser==1.9.5

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-11-12 17:23:34 -08:00
dependabot[bot]
d26ce224ce
Bump mako from 1.2.0 to 1.2.3 (#1845)
* Bump mako from 1.2.0 to 1.2.3

Bumps [mako](https://github.com/sqlalchemy/mako) from 1.2.0 to 1.2.3.
- [Release notes](https://github.com/sqlalchemy/mako/releases)
- [Changelog](https://github.com/sqlalchemy/mako/blob/main/CHANGES)
- [Commits](https://github.com/sqlalchemy/mako/commits)

---
updated-dependencies:
- dependency-name: mako
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update mako==1.2.3

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-11-12 17:19:17 -08:00
dependabot[bot]
58aab24c28
Bump arrow from 1.2.2 to 1.2.3 (#1829)
* Bump arrow from 1.2.2 to 1.2.3

Bumps [arrow](https://github.com/arrow-py/arrow) from 1.2.2 to 1.2.3.
- [Release notes](https://github.com/arrow-py/arrow/releases)
- [Changelog](https://github.com/arrow-py/arrow/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/arrow-py/arrow/compare/1.2.2...1.2.3)

---
updated-dependencies:
- dependency-name: arrow
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update arrow==1.2.3

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-11-12 17:18:11 -08:00
dependabot[bot]
76649be6e4
Bump tempora from 5.0.1 to 5.0.2 (#1795)
Bumps [tempora](https://github.com/jaraco/tempora) from 5.0.1 to 5.0.2.
- [Release notes](https://github.com/jaraco/tempora/releases)
- [Changelog](https://github.com/jaraco/tempora/blob/main/CHANGES.rst)
- [Commits](https://github.com/jaraco/tempora/compare/v5.0.1...v5.0.2)

---
updated-dependencies:
- dependency-name: tempora
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-11-12 17:14:13 -08:00
dependabot[bot]
af1aed0b6b
Bump requests from 2.27.1 to 2.28.1 (#1781)
* Bump requests from 2.27.1 to 2.28.1

Bumps [requests](https://github.com/psf/requests) from 2.27.1 to 2.28.1.
- [Release notes](https://github.com/psf/requests/releases)
- [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md)
- [Commits](https://github.com/psf/requests/compare/v2.27.1...v2.28.1)

---
updated-dependencies:
- dependency-name: requests
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update requests==2.28.1

* Update urllib3==1.26.12

* Update certifi==2022.9.24

* Update idna==3.4

* Update charset-normalizer==2.1.1

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-11-12 17:12:19 -08:00
dependabot[bot]
baa0e08c2a
Bump zipp from 3.8.0 to 3.10.0 (#1872)
* Bump zipp from 3.8.0 to 3.10.0

Bumps [zipp](https://github.com/jaraco/zipp) from 3.8.0 to 3.10.0.
- [Release notes](https://github.com/jaraco/zipp/releases)
- [Changelog](https://github.com/jaraco/zipp/blob/main/CHANGES.rst)
- [Commits](https://github.com/jaraco/zipp/compare/v3.8.0...v3.10.0)

---
updated-dependencies:
- dependency-name: zipp
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update zipp==3.10.0

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-11-12 17:12:06 -08:00
dependabot[bot]
d889e810f4
Bump bleach from 5.0.0 to 5.0.1 (#1777)
* Bump bleach from 5.0.0 to 5.0.1

Bumps [bleach](https://github.com/mozilla/bleach) from 5.0.0 to 5.0.1.
- [Release notes](https://github.com/mozilla/bleach/releases)
- [Changelog](https://github.com/mozilla/bleach/blob/main/CHANGES)
- [Commits](https://github.com/mozilla/bleach/commits)

---
updated-dependencies:
- dependency-name: bleach
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update bleach==5.0.1

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-11-12 17:11:49 -08:00
dependabot[bot]
21f5fee403
Bump idna from 3.3 to 3.4 (#1835)
Bumps [idna](https://github.com/kjd/idna) from 3.3 to 3.4.
- [Release notes](https://github.com/kjd/idna/releases)
- [Changelog](https://github.com/kjd/idna/blob/master/HISTORY.rst)
- [Commits](https://github.com/kjd/idna/compare/v3.3...v3.4)

---
updated-dependencies:
- dependency-name: idna
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-11-12 17:11:08 -08:00
dependabot[bot]
fbb016a7fd
Bump certifi from 2022.5.18.1 to 2022.9.24 (#1849)
Bumps [certifi](https://github.com/certifi/python-certifi) from 2022.5.18.1 to 2022.9.24.
- [Release notes](https://github.com/certifi/python-certifi/releases)
- [Commits](https://github.com/certifi/python-certifi/compare/2022.05.18.1...2022.09.24)

---
updated-dependencies:
- dependency-name: certifi
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-11-12 17:10:37 -08:00
dependabot[bot]
cc0c4b638d
Bump urllib3 from 1.26.9 to 1.26.12 (#1823)
Bumps [urllib3](https://github.com/urllib3/urllib3) from 1.26.9 to 1.26.12.
- [Release notes](https://github.com/urllib3/urllib3/releases)
- [Changelog](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst)
- [Commits](https://github.com/urllib3/urllib3/compare/1.26.9...1.26.12)

---
updated-dependencies:
- dependency-name: urllib3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-11-12 17:10:26 -08:00
JonnyWong16
c73450c0db
Update importlib-resources==5.10.0
[skip ci]
2022-11-12 17:05:05 -08:00
JonnyWong16
5bb9dbd0f6
Update importlib-metadata==5.0.0
[skip ci]
2022-11-12 17:04:54 -08:00
dependabot[bot]
20be945e8c
Bump mshick/add-pr-comment from 1 to 2 (#1885)
Bumps [mshick/add-pr-comment](https://github.com/mshick/add-pr-comment) from 1 to 2.
- [Release notes](https://github.com/mshick/add-pr-comment/releases)
- [Commits](https://github.com/mshick/add-pr-comment/compare/v1...v2)

---
updated-dependencies:
- dependency-name: mshick/add-pr-comment
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-11-12 17:03:24 -08:00
dependabot[bot]
b11b7e62e9
Bump pyinstaller from 5.1 to 5.6.2 (#1879)
Bumps [pyinstaller](https://github.com/pyinstaller/pyinstaller) from 5.1 to 5.6.2.
- [Release notes](https://github.com/pyinstaller/pyinstaller/releases)
- [Changelog](https://github.com/pyinstaller/pyinstaller/blob/develop/doc/CHANGES.rst)
- [Commits](https://github.com/pyinstaller/pyinstaller/compare/v5.1...v5.6.2)

---
updated-dependencies:
- dependency-name: pyinstaller
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>
2022-11-12 17:00:58 -08:00
dependabot[bot]
76a3b3d2a5
Bump importlib-resources from 5.7.1 to 5.10.0 (#1862)
Bumps [importlib-resources](https://github.com/python/importlib_resources) from 5.7.1 to 5.10.0.
- [Release notes](https://github.com/python/importlib_resources/releases)
- [Changelog](https://github.com/python/importlib_resources/blob/main/CHANGES.rst)
- [Commits](https://github.com/python/importlib_resources/compare/v5.7.1...v5.10.0)

---
updated-dependencies:
- dependency-name: importlib-resources
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-11-12 17:00:33 -08:00
dependabot[bot]
65452f08ce
Bump importlib-metadata from 4.11.4 to 5.0.0 (#1856)
Bumps [importlib-metadata](https://github.com/python/importlib_metadata) from 4.11.4 to 5.0.0.
- [Release notes](https://github.com/python/importlib_metadata/releases)
- [Changelog](https://github.com/python/importlib_metadata/blob/main/CHANGES.rst)
- [Commits](https://github.com/python/importlib_metadata/compare/v4.11.4...v5.0.0)

---
updated-dependencies:
- dependency-name: importlib-metadata
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-11-12 16:52:22 -08:00
dependabot[bot]
75e492556b
Bump pyobjc-core from 8.5 to 9.0 (#1887)
Bumps [pyobjc-core](https://github.com/ronaldoussoren/pyobjc) from 8.5 to 9.0.
- [Release notes](https://github.com/ronaldoussoren/pyobjc/releases)
- [Changelog](https://github.com/ronaldoussoren/pyobjc/blob/master/docs/changelog.rst)
- [Commits](https://github.com/ronaldoussoren/pyobjc/compare/v8.5...v9.0)

---
updated-dependencies:
- dependency-name: pyobjc-core
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-11-12 16:52:16 -08:00
dependabot[bot]
a58a4ed632
Bump pycryptodomex from 3.14.1 to 3.15.0 (#1773)
Bumps [pycryptodomex](https://github.com/Legrandin/pycryptodome) from 3.14.1 to 3.15.0.
- [Release notes](https://github.com/Legrandin/pycryptodome/releases)
- [Changelog](https://github.com/Legrandin/pycryptodome/blob/master/Changelog.rst)
- [Commits](https://github.com/Legrandin/pycryptodome/compare/v3.14.1...v3.15.0)

---
updated-dependencies:
- dependency-name: pycryptodomex
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-11-12 16:51:59 -08:00
Paarth Shah
2ea85f31e7
Bump minimum python version in CONTRIBUTING.md. (#1854)
* Bump minimum python version in CONTRIBUTING.md.

* Fix random typo.

* More touch-ups.

[skip ci]
2022-11-12 16:48:40 -08:00
JonnyWong16
38cc3bc7f2
Update winget workflow token
[skip ci]
2022-11-07 13:34:25 -08:00
JonnyWong16
04d6bfbd78
Fix publish installer changelog 2022-11-07 13:22:37 -08:00
JonnyWong16
d7f6a1b186
v2.10.5 2022-11-07 13:14:21 -08:00
JonnyWong16
b1e2a30dc1
Fix publish installer workflow 2022-11-07 12:31:17 -08:00
JonnyWong16
defbbbff92
Patch set-output to environment files in GitHub workflow
* https://github.blog/changelog/2022-10-11-github-actions-deprecating-save-state-and-set-output-commands/
2022-11-07 12:22:30 -08:00
JonnyWong16
7c8cea74e4
Fix padding on condition operator dropdown on small screens 2022-11-07 12:05:04 -08:00
JonnyWong16
a3ad40122d
Add months timeframe for newsletters
* Closes #1876
2022-11-07 11:26:13 -08:00
JonnyWong16
b74a1a3c32
Separate stdout and stderr console logging
* Closes #1874
2022-11-07 10:41:49 -08:00
JonnyWong16
894eaf0365
Check IPv6 HTTP host when retrieving app URL 2022-11-07 10:41:49 -08:00
JonnyWong16
ed53d66aa7
Launch browser with IPv6 http_host 2022-11-07 10:41:49 -08:00
dependabot[bot]
c53566225c
Bump actions/cache from 3.0.8 to 3.0.11 (#1864)
Bumps [actions/cache](https://github.com/actions/cache) from 3.0.8 to 3.0.11.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/v3.0.8...v3.0.11)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-11-07 09:30:51 -08:00
dependabot[bot]
a1b6c35bd2
Bump actions/setup-python from 4.2.0 to 4.3.0 (#1859)
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 4.2.0 to 4.3.0.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v4.2.0...v4.3.0)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-11-07 09:30:40 -08:00
dependabot[bot]
1977ca7db2
Bump actions/checkout from 3.0.2 to 3.1.0 (#1858)
Bumps [actions/checkout](https://github.com/actions/checkout) from 3.0.2 to 3.1.0.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v3.0.2...v3.1.0)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-11-07 09:30:30 -08:00
dependabot[bot]
4b97382b7c
Bump actions/stale from 5 to 6 (#1844)
Bumps [actions/stale](https://github.com/actions/stale) from 5 to 6.
- [Release notes](https://github.com/actions/stale/releases)
- [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/stale/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/stale
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-11-07 09:30:19 -08:00
JonnyWong16
5975b59c93
Add user_thumb to get_history response 2022-11-05 20:03:48 +00:00
JonnyWong16
571bbb2db1
Fallback season thumb to show thumb in get_metadata 2022-11-01 16:37:36 +00:00
JonnyWong16
08bc365a7c
Add collections to get_children_metadata API data 2022-10-25 16:11:37 +00:00
JonnyWong16
e6829310ad
Validate notifier custom conditions before saving
* Fixes #1846
2022-10-10 19:05:13 +00:00
JonnyWong16
a9949a07da
Update filterer
* Clear condition operator if type changes
2022-10-10 18:05:14 +00:00
JonnyWong16
5faeafedd5
Fix API 400 response code 2022-10-01 19:24:57 +00:00
JonnyWong16
0f872ab440
Fix broken link on library stats cards 2022-09-27 23:41:27 +00:00
JonnyWong16
15afbe3001
Add edition_title notification parameter 2022-09-27 23:28:48 +00:00
JonnyWong16
a8be53e0dc
Add edition_title to metadata details 2022-09-27 21:18:52 +00:00
JonnyWong16
90cf863305
Update pip cache in publish-installers workflow 2022-09-15 10:05:57 -07:00
JonnyWong16
5ace9e163d
Set default library count to 0 2022-09-12 16:47:06 -07:00
JonnyWong16
54af528f6c
Add submit-winget.yml workflow 2022-09-10 09:17:01 -07:00
JonnyWong16
0a6b12329c
Link to MusicBrainz track for notifications 2022-09-09 16:14:31 -07:00
JonnyWong16
41b796e007
v2.10.4 2022-09-05 11:07:25 -07:00
dependabot[bot]
925efe0db7
Bump actions/cache from 3.0.6 to 3.0.8 (#1822)
Bumps [actions/cache](https://github.com/actions/cache) from 3.0.6 to 3.0.8.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/v3.0.6...v3.0.8)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-08-26 09:17:13 -07:00
JonnyWong16
806c8814b6
Unpin QEMU in snap workflow 2022-08-23 11:22:54 -07:00
JonnyWong16
70256dd0b9
Update snap login in workflow 2022-08-23 10:48:01 -07:00
JonnyWong16
ac520d656b
Add "does not begin with" and "does not end with" condition operators 2022-08-19 10:41:02 -07:00
JonnyWong16
3c40f83738
Update filterer.jquery.js 2022-08-19 10:36:10 -07:00
JonnyWong16
b2777e30f2
Add git safe directory to snapcraft.yml 2022-08-18 16:40:38 -07:00
JonnyWong16
84fb1a2dc2
Add quality profile tooltip 2022-08-18 16:35:06 -07:00
JonnyWong16
b73f8cc30e
Remove unused architectures in snap workflow 2022-08-18 10:14:14 -07:00
JonnyWong16
c3572f3212
Add workflow dispatch to workflows
[skip ci]
2022-08-18 10:11:47 -07:00
JonnyWong16
85dda97e52
Fix library stats not shown for libraries without history
* Fixes #1818
2022-08-18 10:02:32 -07:00
JonnyWong16
8114079eac
Fix album count showing 0 2022-08-11 09:46:15 -07:00
JonnyWong16
444b138e97
Update v2.10.3 changelog 2022-08-09 17:22:49 -07:00
JonnyWong16
24f05a03c0
v2.10.3 2022-08-09 17:20:12 -07:00
JonnyWong16
b83e9e3257
Fix channel identifier overflow on activity card
* Fixes #1802
2022-08-09 17:16:07 -07:00
JonnyWong16
2a83502ca1
Username log filter longer than 3 characters 2022-08-09 17:02:47 -07:00
JonnyWong16
0bf1329d03
Add guides to Artist, Album, and Track export attributes 2022-08-09 17:02:47 -07:00
JonnyWong16
c1f433ab60
Add languageTag to export attribute 2022-08-09 16:44:41 -07:00
dependabot[bot]
23c881f4d1
Bump plexapi from 4.11.2 to 4.12.1 (#1811)
Bumps [plexapi](https://github.com/pkkid/python-plexapi) from 4.11.2 to 4.12.1.
- [Release notes](https://github.com/pkkid/python-plexapi/releases)
- [Commits](https://github.com/pkkid/python-plexapi/compare/4.11.2...4.12.1)

---
updated-dependencies:
- dependency-name: plexapi
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-08-09 16:38:19 -07:00
dependabot[bot]
e85834706a
Bump actions/cache from 3.0.5 to 3.0.6 (#1808)
Bumps [actions/cache](https://github.com/actions/cache) from 3.0.5 to 3.0.6.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/v3.0.5...v3.0.6)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-08-09 16:36:16 -07:00
dependabot[bot]
8327c48111
Bump actions/setup-python from 4.1.0 to 4.2.0 (#1805)
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 4.1.0 to 4.2.0.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v4.1.0...v4.2.0)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-08-09 16:36:03 -07:00
JonnyWong16
e7b96ed9ae
Only filter usernames >= 3 characters
* Fixes #1806
2022-08-03 10:52:58 -07:00
JonnyWong16
3ab0c8fe22
Use last played artwork on library stats cards 2022-08-01 15:02:51 -07:00
JonnyWong16
4ae1f6cef9
Allow fallback to another pms image 2022-08-01 14:48:35 -07:00
JonnyWong16
3631e723bc
Add last played metadata to library stats 2022-08-01 14:47:16 -07:00
JonnyWong16
ddcf350353
Add last played metadata to home stats top_libraries and top_users 2022-08-01 14:46:32 -07:00
JonnyWong16
2b339f60bc
Update PayPal URL 2022-07-29 20:04:08 -07:00
JonnyWong16
52e399144a
Add Stripe donation 2022-07-29 19:40:50 -07:00
JonnyWong16
c45ded5a98
Implement X-Plex-Container-Size for retrieving library items
PMS 1.28 log warning
```
Missing X-Plex-Container-Size header. This will fail with status code 400 in the future.
```
2022-07-24 14:13:22 -07:00
JonnyWong16
85eaed57e0
Clean up lookup table unique constraints on start up 2022-07-18 15:33:37 -07:00
JonnyWong16
6e6de11aaa
Cache usernames for log filter
* Fixes #1705
2022-07-18 15:31:23 -07:00
JonnyWong16
9f1b7de623
Add show_year notification parameter 2022-07-14 18:45:00 -07:00
JonnyWong16
aeb572f211
Add parent_year and grandparent_year to get_metadata_details 2022-07-14 18:39:59 -07:00
JonnyWong16
b598e9fc0c
Make sure token is saved before populating server dropdown list 2022-07-14 16:14:10 -07:00
JonnyWong16
b6cb946ae2
Add json support for MQTT notifications 2022-07-14 12:29:12 -07:00
dependabot[bot]
39afabf1b7
Bump actions/cache from 3.0.4 to 3.0.5 (#1792)
Bumps [actions/cache](https://github.com/actions/cache) from 3.0.4 to 3.0.5.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/v3.0.4...v3.0.5)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-07-14 12:14:34 -07:00
dependabot[bot]
8cbf93fda4
Bump actions/setup-python from 4.0.0 to 4.1.0 (#1788)
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 4.0.0 to 4.1.0.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v4.0.0...v4.1.0)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-07-14 12:14:16 -07:00
dependabot[bot]
03938ebf2c
Bump actions/setup-python from 3.1.2 to 4.0.0 (#1760)
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 3.1.2 to 4.0.0.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v3.1.2...v4.0.0)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-07-03 15:41:07 -07:00
dependabot[bot]
167a914e20
Bump joncloud/makensis-action from 3.6 to 3.7 (#1775)
Bumps [joncloud/makensis-action](https://github.com/joncloud/makensis-action) from 3.6 to 3.7.
- [Release notes](https://github.com/joncloud/makensis-action/releases)
- [Commits](https://github.com/joncloud/makensis-action/compare/v3.6...v3.7)

---
updated-dependencies:
- dependency-name: joncloud/makensis-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-07-03 15:40:56 -07:00
dependabot[bot]
7f15c00f7e
Bump actions/cache from 3.0.3 to 3.0.4 (#1759)
Bumps [actions/cache](https://github.com/actions/cache) from 3.0.3 to 3.0.4.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/v3.0.3...v3.0.4)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-07-03 15:40:36 -07:00
dependabot[bot]
22070ea549
Bump technote-space/workflow-conclusion-action from 2.2 to 3.0 (#1758)
Bumps [technote-space/workflow-conclusion-action](https://github.com/technote-space/workflow-conclusion-action) from 2.2 to 3.0.
- [Release notes](https://github.com/technote-space/workflow-conclusion-action/releases)
- [Changelog](https://github.com/technote-space/workflow-conclusion-action/blob/main/.releasegarc)
- [Commits](https://github.com/technote-space/workflow-conclusion-action/compare/v2.2...v3.0)

---
updated-dependencies:
- dependency-name: technote-space/workflow-conclusion-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-07-03 15:40:24 -07:00
JonnyWong16
746d44922e
v2.10.2 2022-07-03 15:32:18 -07:00
JonnyWong16
ec99a2f3d9
Fix updating cron default value in newsletter table 2022-07-03 15:22:25 -07:00
JonnyWong16
d482177342
Update Python version in readme 2022-07-03 15:22:25 -07:00
JonnyWong16
285fa3a0f5
Clear user friendly name if equal to username 2022-07-03 15:22:25 -07:00
JonnyWong16
98433a7c54
Fix username not showing on home stats cards 2022-07-03 15:22:25 -07:00
JonnyWong16
d4def8e5ae
Fix cover size on info page 2022-07-03 15:22:25 -07:00
TheMeanCanEHdian
ed103bc5de
Update library icons to latest Plex style. (#1779)
* Update library icons to latest Plex style.

* Add back mistakenly removed live icons.

* Update live icon to match new style.

* Adjust icon size.

* Better center icon.
2022-07-03 13:31:33 -07:00
JonnyWong16
15fb052716
Fix stream audio info when playing a secondary track 2022-06-04 17:57:57 -07:00
JonnyWong16
ebbd66d056
Fix empty recently added error message 2022-06-03 09:41:36 -07:00
JonnyWong16
a2c589fca4
v2.10.1 2022-06-01 10:18:41 -07:00
JonnyWong16
1bd5168156
Fix OneSignal device validation
* OneSignal changed to only accept `app_id` as a query parameter instead of in the payload
2022-06-01 09:42:47 -07:00
JonnyWong16
0576920b89
Add support for mbid:// guids in notification parameters
* Requires PMS 1.27.0.5849
2022-05-31 10:57:44 -07:00
JonnyWong16
ca3c2b09cf
Add grandparent_guids and parent_guids to get_metadata_details 2022-05-31 10:57:44 -07:00
dependabot[bot]
695a00350b
Bump actions/cache from 3.0.2 to 3.0.3 (#1755)
Bumps [actions/cache](https://github.com/actions/cache) from 3.0.2 to 3.0.3.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/v3.0.2...v3.0.3)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-05-31 10:52:15 -07:00
dependabot[bot]
b7ca9c3502
Bump plexapi from 4.11.1 to 4.11.2 (#1753)
* Bump plexapi from 4.11.1 to 4.11.2

Bumps [plexapi](https://github.com/pkkid/python-plexapi) from 4.11.1 to 4.11.2.
- [Release notes](https://github.com/pkkid/python-plexapi/releases)
- [Commits](https://github.com/pkkid/python-plexapi/compare/4.11.1...4.11.2)

---
updated-dependencies:
- dependency-name: plexapi
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update plexapi==4.11.2

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-05-31 10:51:53 -07:00
JonnyWong16
fffd936b0f
Change shared_libraries to list for get_user 2022-05-28 15:03:52 -07:00
JonnyWong16
bd83c8d55c
Remove server_token from get_users 2022-05-28 15:03:24 -07:00
JonnyWong16
b905e0139c
Add continent to geoip lookup 2022-05-28 08:51:10 -07:00
JonnyWong16
b9b844dd38
Check for a blank user_id when retrieving user details 2022-05-25 11:37:32 -07:00
JonnyWong16
e9d370a4b4
v2.10.0 2022-05-23 10:57:21 -07:00
dependabot[bot]
248fb6724a
Bump importlib-metadata from 4.11.3 to 4.11.4 (#1750)
* Bump importlib-metadata from 4.11.3 to 4.11.4

Bumps [importlib-metadata](https://github.com/python/importlib_metadata) from 4.11.3 to 4.11.4.
- [Release notes](https://github.com/python/importlib_metadata/releases)
- [Changelog](https://github.com/python/importlib_metadata/blob/main/CHANGES.rst)
- [Commits](https://github.com/python/importlib_metadata/compare/v4.11.3...v4.11.4)

---
updated-dependencies:
- dependency-name: importlib-metadata
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update importlib-metadata==4.11.4

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-05-23 10:45:11 -07:00
JonnyWong16
bb01141cfc
Fix parsing Windows path on Linux for notification filename parameter 2022-05-20 10:57:58 -07:00
dependabot[bot]
775375b8b4
Bump plexapi from 4.11.0 to 4.11.1 (#1749)
* Bump plexapi from 4.11.0 to 4.11.1

Bumps [plexapi](https://github.com/pkkid/python-plexapi) from 4.11.0 to 4.11.1.
- [Release notes](https://github.com/pkkid/python-plexapi/releases)
- [Commits](https://github.com/pkkid/python-plexapi/compare/4.11.0...4.11.1)

---
updated-dependencies:
- dependency-name: plexapi
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update plexapi==4.11.1

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-05-20 10:57:35 -07:00
dependabot[bot]
010377870d
Bump certifi from 2021.10.8 to 2022.5.18.1 (#1748)
* Bump certifi from 2021.10.8 to 2022.5.18.1

Bumps [certifi](https://github.com/certifi/python-certifi) from 2021.10.8 to 2022.5.18.1.
- [Release notes](https://github.com/certifi/python-certifi/releases)
- [Commits](https://github.com/certifi/python-certifi/compare/2021.10.08...2022.05.18.1)

---
updated-dependencies:
- dependency-name: certifi
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update certifi==2022.5.18.1

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-05-20 10:57:24 -07:00
JonnyWong16
9967786997
Add new exporter fields for PlexAPI 4.11.0 2022-05-18 11:25:25 -07:00
JonnyWong16
07eba40096
Update default user thumb image 2022-05-18 11:24:41 -07:00
dependabot[bot]
399fd6ff91
Bump plexapi from 4.9.2 to 4.11.0 (#1690)
* Bump plexapi from 4.9.2 to 4.10.1

Bumps [plexapi](https://github.com/pkkid/python-plexapi) from 4.9.2 to 4.10.1.
- [Release notes](https://github.com/pkkid/python-plexapi/releases)
- [Commits](https://github.com/pkkid/python-plexapi/compare/4.9.2...4.10.1)

---
updated-dependencies:
- dependency-name: plexapi
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update plexapi==4.11.0

* Update requirements.txt

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-05-18 11:24:15 -07:00
dependabot[bot]
f1b95f5837
Bump pyinstaller from 5.0.1 to 5.1 (#1746)
Bumps [pyinstaller](https://github.com/pyinstaller/pyinstaller) from 5.0.1 to 5.1.
- [Release notes](https://github.com/pyinstaller/pyinstaller/releases)
- [Changelog](https://github.com/pyinstaller/pyinstaller/blob/develop/doc/CHANGES.rst)
- [Commits](https://github.com/pyinstaller/pyinstaller/compare/v5.0.1...v5.1)

---
updated-dependencies:
- dependency-name: pyinstaller
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-05-18 10:54:11 -07:00
dependabot[bot]
abc01bb64d
Bump actions/cache from 3.0.1 to 3.0.2 (#1745)
Bumps [actions/cache](https://github.com/actions/cache) from 3.0.1 to 3.0.2.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/v3.0.1...v3.0.2)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-05-18 10:45:00 -07:00
dependabot[bot]
bdc907ee67
Bump actions/setup-python from 3.1.1 to 3.1.2 (#1744)
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 3.1.1 to 3.1.2.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v3.1.1...v3.1.2)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-05-18 10:44:47 -07:00
JonnyWong16
1e99d51fe2
Add importlib-metadata to requirements-package.txt 2022-05-16 22:37:28 -07:00
JonnyWong16
27b72663d4
Fix platform in get_home_stats and get_user_player_stats API docs 2022-05-16 21:25:18 -07:00
dependabot[bot]
bff4a3f6ba
Bump pyinstaller from 4.9 to 5.0.1 (#1730)
Bumps [pyinstaller](https://github.com/pyinstaller/pyinstaller) from 4.9 to 5.0.1.
- [Release notes](https://github.com/pyinstaller/pyinstaller/releases)
- [Changelog](https://github.com/pyinstaller/pyinstaller/blob/develop/doc/CHANGES.rst)
- [Commits](https://github.com/pyinstaller/pyinstaller/compare/v4.9...v5.0.1)

---
updated-dependencies:
- dependency-name: pyinstaller
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-05-16 21:24:56 -07:00
dependabot[bot]
ba3275fed7
Bump pywin32 from 303 to 304 (#1732)
Bumps [pywin32](https://github.com/mhammond/pywin32) from 303 to 304.
- [Release notes](https://github.com/mhammond/pywin32/releases)
- [Changelog](https://github.com/mhammond/pywin32/blob/main/CHANGES.txt)
- [Commits](https://github.com/mhammond/pywin32/commits)

---
updated-dependencies:
- dependency-name: pywin32
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-05-16 21:23:40 -07:00
dependabot[bot]
df58950585
Bump pyobjc-core from 8.2 to 8.5 (#1725)
Bumps [pyobjc-core](https://github.com/ronaldoussoren/pyobjc) from 8.2 to 8.5.
- [Release notes](https://github.com/ronaldoussoren/pyobjc/releases)
- [Changelog](https://github.com/ronaldoussoren/pyobjc/blob/master/docs/changelog.rst)
- [Commits](https://github.com/ronaldoussoren/pyobjc/compare/v8.2...v8.5)

---
updated-dependencies:
- dependency-name: pyobjc-core
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-05-16 21:23:21 -07:00
dependabot[bot]
fbf22b5ea2
Bump pyobjc-framework-cocoa from 8.2 to 8.5 (#1724)
Bumps [pyobjc-framework-cocoa](https://github.com/ronaldoussoren/pyobjc) from 8.2 to 8.5.
- [Release notes](https://github.com/ronaldoussoren/pyobjc/releases)
- [Changelog](https://github.com/ronaldoussoren/pyobjc/blob/master/docs/changelog.rst)
- [Commits](https://github.com/ronaldoussoren/pyobjc/compare/v8.2...v8.5)

---
updated-dependencies:
- dependency-name: pyobjc-framework-cocoa
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-05-16 21:21:44 -07:00
dependabot[bot]
1af3c43320
Bump docker/login-action from 1 to 2 (#1738)
Bumps [docker/login-action](https://github.com/docker/login-action) from 1 to 2.
- [Release notes](https://github.com/docker/login-action/releases)
- [Commits](https://github.com/docker/login-action/compare/v1...v2)

---
updated-dependencies:
- dependency-name: docker/login-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-05-16 21:21:18 -07:00
dependabot[bot]
228101fd48
Bump docker/setup-buildx-action from 1 to 2 (#1737)
Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 1 to 2.
- [Release notes](https://github.com/docker/setup-buildx-action/releases)
- [Commits](https://github.com/docker/setup-buildx-action/compare/v1...v2)

---
updated-dependencies:
- dependency-name: docker/setup-buildx-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-05-16 21:21:09 -07:00
dependabot[bot]
54a878f7b1
Bump docker/setup-qemu-action from 1 to 2 (#1736)
Bumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 1 to 2.
- [Release notes](https://github.com/docker/setup-qemu-action/releases)
- [Commits](https://github.com/docker/setup-qemu-action/compare/v1...v2)

---
updated-dependencies:
- dependency-name: docker/setup-qemu-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-05-16 21:21:01 -07:00
dependabot[bot]
9df184d7f4
Bump docker/build-push-action from 2 to 3 (#1735)
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 2 to 3.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Upgrade guide](https://github.com/docker/build-push-action/blob/master/UPGRADE.md)
- [Commits](https://github.com/docker/build-push-action/compare/v2...v3)

---
updated-dependencies:
- dependency-name: docker/build-push-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-05-16 21:20:50 -07:00
dependabot[bot]
86dd3f0db7
Bump actions/checkout from 2 to 3.0.2 (#1726)
Bumps [actions/checkout](https://github.com/actions/checkout) from 2 to 3.0.2.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v2...v3.0.2)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-05-16 21:20:39 -07:00
dependabot[bot]
89d9fcac66
Bump actions/stale from 4 to 5 (#1714)
Bumps [actions/stale](https://github.com/actions/stale) from 4 to 5.
- [Release notes](https://github.com/actions/stale/releases)
- [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/stale/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/stale
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-05-16 21:20:19 -07:00
dependabot[bot]
f6214c9a98
Bump actions/upload-artifact from 2 to 3 (#1712)
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 2 to 3.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v2...v3)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-05-16 21:20:05 -07:00
dependabot[bot]
988c6750aa
Bump actions/download-artifact from 2 to 3 (#1711)
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 2 to 3.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](https://github.com/actions/download-artifact/compare/v2...v3)

---
updated-dependencies:
- dependency-name: actions/download-artifact
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-05-16 21:19:54 -07:00
dependabot[bot]
04b745b584
Bump actions/setup-python from 2 to 3.1.1 (#1709)
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 2 to 3.1.1.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v2...v3.1.1)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-05-16 21:19:14 -07:00
dependabot[bot]
f068bcca01
Bump actions/cache from 2 to 3.0.1 (#1701)
Bumps [actions/cache](https://github.com/actions/cache) from 2 to 3.0.1.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/v2...v3.0.1)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-05-16 21:17:59 -07:00
dependabot[bot]
b3aeaafd00
Bump pyjwt from 2.3.0 to 2.4.0 (#1743)
* Bump pyjwt from 2.3.0 to 2.4.0

Bumps [pyjwt](https://github.com/jpadilla/pyjwt) from 2.3.0 to 2.4.0.
- [Release notes](https://github.com/jpadilla/pyjwt/releases)
- [Changelog](https://github.com/jpadilla/pyjwt/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/jpadilla/pyjwt/compare/2.3.0...2.4.0)

---
updated-dependencies:
- dependency-name: pyjwt
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update pyjwt==2.4.0

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-05-16 20:56:13 -07:00
dependabot[bot]
d17015de44
Bump pyparsing from 3.0.7 to 3.0.9 (#1741)
* Bump pyparsing from 3.0.7 to 3.0.9

Bumps [pyparsing](https://github.com/pyparsing/pyparsing) from 3.0.7 to 3.0.9.
- [Release notes](https://github.com/pyparsing/pyparsing/releases)
- [Changelog](https://github.com/pyparsing/pyparsing/blob/master/CHANGES)
- [Commits](https://github.com/pyparsing/pyparsing/compare/pyparsing_3.0.7...pyparsing_3.0.9)

---
updated-dependencies:
- dependency-name: pyparsing
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update pyparsing==3.0.9

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-05-16 20:55:40 -07:00
dependabot[bot]
93b6370759
Bump xmltodict from 0.12.0 to 0.13.0 (#1739)
* Bump xmltodict from 0.12.0 to 0.13.0

Bumps [xmltodict](https://github.com/martinblech/xmltodict) from 0.12.0 to 0.13.0.
- [Release notes](https://github.com/martinblech/xmltodict/releases)
- [Changelog](https://github.com/martinblech/xmltodict/blob/master/CHANGELOG.md)
- [Commits](https://github.com/martinblech/xmltodict/compare/v0.12.0...v0.13.0)

---
updated-dependencies:
- dependency-name: xmltodict
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update xmltodict==0.13.0

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-05-16 20:55:30 -07:00
dependabot[bot]
55812ce2f0
Bump importlib-resources from 5.6.0 to 5.7.1 (#1723)
* Bump importlib-resources from 5.6.0 to 5.7.1

Bumps [importlib-resources](https://github.com/python/importlib_resources) from 5.6.0 to 5.7.1.
- [Release notes](https://github.com/python/importlib_resources/releases)
- [Changelog](https://github.com/python/importlib_resources/blob/main/CHANGES.rst)
- [Commits](https://github.com/python/importlib_resources/compare/v5.6.0...v5.7.1)

---
updated-dependencies:
- dependency-name: importlib-resources
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update importlib-resources==5.7.1

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-05-16 20:48:17 -07:00
dependabot[bot]
467ae352f5
Bump beautifulsoup4 from 4.10.0 to 4.11.1 (#1717)
* Bump beautifulsoup4 from 4.10.0 to 4.11.1

Bumps [beautifulsoup4](https://www.crummy.com/software/BeautifulSoup/bs4/) from 4.10.0 to 4.11.1.

---
updated-dependencies:
- dependency-name: beautifulsoup4
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update beautifulsoup4==4.11.1

* Update soupsieve==2.3.2.post1

* Update requirements.txt

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-05-16 20:46:21 -07:00
dependabot[bot]
a1fe0b04d7
Bump bleach from 4.1.0 to 5.0.0 (#1708)
* Bump bleach from 4.1.0 to 5.0.0

Bumps [bleach](https://github.com/mozilla/bleach) from 4.1.0 to 5.0.0.
- [Release notes](https://github.com/mozilla/bleach/releases)
- [Changelog](https://github.com/mozilla/bleach/blob/main/CHANGES)
- [Commits](https://github.com/mozilla/bleach/compare/v4.1.0...v5.0.0)

---
updated-dependencies:
- dependency-name: bleach
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update bleach==5.0.0

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-05-16 20:41:47 -07:00
dependabot[bot]
d510e0f600
Bump websocket-client from 1.2.3 to 1.3.2 (#1700)
* Bump websocket-client from 1.2.3 to 1.3.2

Bumps [websocket-client](https://github.com/websocket-client/websocket-client) from 1.2.3 to 1.3.2.
- [Release notes](https://github.com/websocket-client/websocket-client/releases)
- [Changelog](https://github.com/websocket-client/websocket-client/blob/master/ChangeLog)
- [Commits](https://github.com/websocket-client/websocket-client/compare/v1.2.3...v1.3.2)

---
updated-dependencies:
- dependency-name: websocket-client
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update websocket-client==1.3.2

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-05-16 20:40:13 -07:00
dependabot[bot]
67baf9a260
Bump urllib3 from 1.26.8 to 1.26.9 (#1688)
* Bump urllib3 from 1.26.8 to 1.26.9

Bumps [urllib3](https://github.com/urllib3/urllib3) from 1.26.8 to 1.26.9.
- [Release notes](https://github.com/urllib3/urllib3/releases)
- [Changelog](https://github.com/urllib3/urllib3/blob/1.26.9/CHANGES.rst)
- [Commits](https://github.com/urllib3/urllib3/compare/1.26.8...1.26.9)

---
updated-dependencies:
- dependency-name: urllib3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update urllib3==1.26.9

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-05-16 20:35:58 -07:00
dependabot[bot]
238afb4794
Bump mako from 1.1.6 to 1.2.0 (#1684)
* Bump mako from 1.1.6 to 1.2.0

Bumps [mako](https://github.com/sqlalchemy/mako) from 1.1.6 to 1.2.0.
- [Release notes](https://github.com/sqlalchemy/mako/releases)
- [Changelog](https://github.com/sqlalchemy/mako/blob/main/CHANGES)
- [Commits](https://github.com/sqlalchemy/mako/commits)

---
updated-dependencies:
- dependency-name: mako
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update mako==1.2.0

* Update MarkupSafe==2.1.1

* Add importlib-metadata==4.11.3

* Update requirements.txt

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-05-16 20:33:50 -07:00
dependabot[bot]
aa0c58ef0e
Bump dnspython from 2.2.0 to 2.2.1 (#1679)
* Bump dnspython from 2.2.0 to 2.2.1

Bumps [dnspython](https://github.com/rthalley/dnspython) from 2.2.0 to 2.2.1.
- [Release notes](https://github.com/rthalley/dnspython/releases)
- [Changelog](https://github.com/rthalley/dnspython/blob/master/doc/whatsnew.rst)
- [Commits](https://github.com/rthalley/dnspython/compare/v2.2.0...v2.2.1)

---
updated-dependencies:
- dependency-name: dnspython
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update dnspython==2.2.1

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-05-16 20:33:29 -07:00
dependabot[bot]
54c9214b03
Bump apscheduler from 3.8.0 to 3.9.1 (#1675)
* Bump apscheduler from 3.8.0 to 3.9.1

Bumps [apscheduler](https://github.com/agronholm/apscheduler) from 3.8.0 to 3.9.1.
- [Release notes](https://github.com/agronholm/apscheduler/releases)
- [Changelog](https://github.com/agronholm/apscheduler/blob/3.9.1/docs/versionhistory.rst)
- [Commits](https://github.com/agronholm/apscheduler/compare/3.8.0...3.9.1)

---
updated-dependencies:
- dependency-name: apscheduler
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update apscheduler==3.9.1

* Update pytz==2022.1

* Add pytz-deprecation-shim==0.1.0.post0

* Update tzdata==2022.1

* Update tzlocal==4.2

* Update requirements.txt

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-05-16 20:32:37 -07:00
dependabot[bot]
942e09e59e
Bump distro from 1.6.0 to 1.7.0 (#1658)
* Bump distro from 1.6.0 to 1.7.0

Bumps [distro](https://github.com/python-distro/distro) from 1.6.0 to 1.7.0.
- [Release notes](https://github.com/python-distro/distro/releases)
- [Changelog](https://github.com/python-distro/distro/blob/master/CHANGELOG.md)
- [Commits](https://github.com/python-distro/distro/compare/v1.6.0...v1.7.0)

---
updated-dependencies:
- dependency-name: distro
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update distro==1.7.0

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-05-16 20:32:27 -07:00
JonnyWong16
f08687b960
Fix Dolby Vision detection
* Plex renamed "Dolby Vision" to "DoVi" in the display title.
2022-05-12 13:11:14 -07:00
JonnyWong16
1f7ddd4d01
Disable PlexAPI auto-reloading when fetching collections/playlists 2022-05-12 13:11:14 -07:00
JonnyWong16
df54df5e65
Set PlexAPI log level to debug 2022-04-26 11:02:07 -07:00
JonnyWong16
1371cfa889
Trigger on_stop notification after successful db write
* Prevent race condition from querying the db using the notification trigger
2022-04-14 20:54:07 -07:00
dependabot[bot]
dd59a79005
Bump zipp from 3.7.0 to 3.8.0 (#1706)
* Bump zipp from 3.7.0 to 3.8.0

Bumps [zipp](https://github.com/jaraco/zipp) from 3.7.0 to 3.8.0.
- [Release notes](https://github.com/jaraco/zipp/releases)
- [Changelog](https://github.com/jaraco/zipp/blob/main/CHANGES.rst)
- [Commits](https://github.com/jaraco/zipp/compare/v3.7.0...v3.8.0)

---
updated-dependencies:
- dependency-name: zipp
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update zipp==3.8.0

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-04-12 18:42:59 -07:00
dependabot[bot]
fa52d99691
Bump importlib-resources from 5.4.0 to 5.6.0 (#1699)
* Bump importlib-resources from 5.4.0 to 5.6.0

Bumps [importlib-resources](https://github.com/python/importlib_resources) from 5.4.0 to 5.6.0.
- [Release notes](https://github.com/python/importlib_resources/releases)
- [Changelog](https://github.com/python/importlib_resources/blob/main/CHANGES.rst)
- [Commits](https://github.com/python/importlib_resources/compare/v5.4.0...v5.6.0)

---
updated-dependencies:
- dependency-name: importlib-resources
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update importlib-resources==5.6.0

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-04-12 18:42:48 -07:00
JonnyWong16
c54c811eec
Update jaraco.text==3.7.0
[skip ci]
2022-04-12 18:41:08 -07:00
JonnyWong16
d5afac4104
Add jaraco.context==4.1.1
[skip ci]
2022-04-12 18:40:59 -07:00
JonnyWong16
3e8ef3c1b4
Update jaraco.collections==3.5.1
[skip ci]
2022-04-12 18:40:47 -07:00
JonnyWong16
addf9ea324
Update jaraco.classes==3.2.1
[skip ci]
2022-04-12 18:40:33 -07:00
JonnyWong16
ab24116b1b
Fix get_users_table API docs 2022-04-12 13:28:13 -07:00
JonnyWong16
d4002b2e2b
Change values to int instead of "Checked" in users and libraries table
* get_users_table: allow_guest, do_notify, keep_history
* get_libraries_table: do_notify, do_notify_created, keep_history
2022-04-12 12:43:12 -07:00
JonnyWong16
b0950abdd9
v2.9.7 2022-04-11 15:26:25 -07:00
JonnyWong16
a9860fe62a
Fix managed users no username 2022-04-11 15:10:53 -07:00
JonnyWong16
dd389b0f94
v2.9.6 2022-04-10 15:48:32 -07:00
JonnyWong16
1ce292a0b6
Only build snap on amd64, arm64, armhf 2022-04-10 15:40:57 -07:00
JonnyWong16
a2fac2b11c
Improve display of dynamic range on activity cards
* Ref #1654. Thanks @herby2212.
2022-04-09 17:52:17 -07:00
JonnyWong16
4862aee9a1
Add hidden user title (Full Name) column to users table 2022-04-08 20:03:05 -07:00
JonnyWong16
aa6592eec7
Fix importing Plex usernames
* Fixes #1710
* Also import the user title (Full Name)
2022-04-08 20:03:05 -07:00
JonnyWong16
e996c4b375
Change default update check interval to hours instead of minutes 2022-04-04 21:06:25 -07:00
JonnyWong16
73b94782f9
Add hidden username and email columns to users table 2022-04-01 21:31:06 -07:00
JonnyWong16
b737ab96b4
Change include summary option for Discord and Slack for all media types 2022-04-01 21:08:10 -07:00
JonnyWong16
5c06accca0
Mask emails and longer usernames first 2022-04-01 10:19:41 -07:00
JonnyWong16
3cd98457c2
Apply PMS_TIMEOUT setting to websocket connection 2022-03-26 15:47:53 -07:00
JonnyWong16
944a231e5b
Change websocket header to a dict 2022-03-26 15:47:17 -07:00
JonnyWong16
5d84587ee2
Fix validating Plex login in setup wizard
* Fixes #1697
2022-03-26 15:40:28 -07:00
JonnyWong16
9a4ca69590
v2.9.5 2022-03-26 15:11:20 -07:00
JonnyWong16
9c8e8b4351
Simplify default settings in setup wizard 2022-03-26 14:57:44 -07:00
JonnyWong16
87389320fb
Fix live tv filter in history query
* Fixes #1691
2022-03-18 15:50:01 -07:00
JonnyWong16
eb1d724417
Add Tautulli to X-Plex-Device-Name header 2022-03-16 16:59:58 -07:00
JonnyWong16
50d90d16bf
Update App Store link to specify iphone 2022-03-11 20:18:10 -08:00
JonnyWong16
35aca11feb
Escape characters in username log filter
* Remove filter for friendly names
2022-02-27 17:03:11 -08:00
JonnyWong16
84a14c0f25
Colour active filter buttons 2022-02-27 16:50:29 -08:00
JonnyWong16
bd9fe54fd7
Enable dynamic anonymous redirect by default in setup wizard 2022-02-24 19:11:30 -08:00
JonnyWong16
74cd494162
Pass media_type when retrieving show and artist children for newsletter
* Fix different album types not shown on newsletter. (#1559)
2022-02-21 12:14:14 -08:00
JonnyWong16
297620f4a9
Reorder db migrations 2022-02-21 09:42:50 -08:00
JonnyWong16
d657a609ff
Reschedule tasks after changing backup interval
* Fixes #1662
2022-02-19 16:37:03 -08:00
JonnyWong16
3c48ea49f3
Retrieve season summary and fallback to show summary
* Fixes #1657
2022-02-18 23:27:02 -08:00
JonnyWong16
ec363b2ef3
Add transcode offset keys to get_activity API docs 2022-02-13 12:17:57 -08:00
JonnyWong16
6d84d1b4c9
Improve calculation for transcode progress bar 2022-02-13 11:59:06 -08:00
JonnyWong16
cfd1bf445f
v2.9.4 2022-02-12 19:17:01 -08:00
JonnyWong16
b4600c8306
Bump config version to set first_run_complete flag 2022-02-12 18:56:08 -08:00
JonnyWong16
636806ae17
Fix Tautulli starting multiple instances on Windows 2022-02-12 18:05:17 -08:00
JonnyWong16
40dc6e08ef
Fix first_run_complete config flag 2022-02-12 17:59:14 -08:00
JonnyWong16
ee43f001e4
v2.9.3 2022-02-09 09:30:19 -08:00
JonnyWong16
3eef2b7f21
Fix missing first run complete flag causing setup wizard loop 2022-02-09 09:22:50 -08:00
JonnyWong16
51d701521a
Fix username logger blacklist preventing Tautulli from starting 2022-02-09 09:22:13 -08:00
JonnyWong16
b73aa888c2
v2.9.2 2022-02-08 10:35:23 -08:00
JonnyWong16
6d092b4984
Add additional Telegram HTML tags 2022-02-08 10:29:22 -08:00
JonnyWong16
32ef43fe6e
Revert "Default Telegram to MarkdownV2 when HTML disabled"
This reverts commit b9f04ac71a.

Ref #1635
2022-02-08 10:29:22 -08:00
JonnyWong16
088bbd3bb6
Skip Local user when masking logs 2022-02-07 23:36:03 -08:00
JonnyWong16
e970a260a1
v2.9.1 2022-02-07 23:18:18 -08:00
JonnyWong16
17800df0aa
v2.9.0 2022-02-07 22:59:20 -08:00
JonnyWong16
31aa9965d1
Fix screen rotation in PWA
* Fixes #1633
2022-02-07 22:46:52 -08:00
dependabot[bot]
97ef7c4981
Bump pyinstaller from 4.8 to 4.9 (#1644)
Bumps [pyinstaller](https://github.com/pyinstaller/pyinstaller) from 4.8 to 4.9.
- [Release notes](https://github.com/pyinstaller/pyinstaller/releases)
- [Changelog](https://github.com/pyinstaller/pyinstaller/blob/v4.9/doc/CHANGES.rst)
- [Commits](https://github.com/pyinstaller/pyinstaller/compare/v4.8...v4.9)

---
updated-dependencies:
- dependency-name: pyinstaller
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-02-07 22:23:02 -08:00
dependabot[bot]
922ab07ff1
Bump pycryptodomex from 3.13.0 to 3.14.1 (#1646)
Bumps [pycryptodomex](https://github.com/Legrandin/pycryptodome) from 3.13.0 to 3.14.1.
- [Release notes](https://github.com/Legrandin/pycryptodome/releases)
- [Changelog](https://github.com/Legrandin/pycryptodome/blob/master/Changelog.rst)
- [Commits](https://github.com/Legrandin/pycryptodome/compare/v3.13.0...v3.14.1)

---
updated-dependencies:
- dependency-name: pycryptodomex
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-02-07 22:22:00 -08:00
dependabot[bot]
8170244812
Bump pyopenssl from 21.0.0 to 22.0.0 (#1638)
Bumps [pyopenssl](https://github.com/pyca/pyopenssl) from 21.0.0 to 22.0.0.
- [Release notes](https://github.com/pyca/pyopenssl/releases)
- [Changelog](https://github.com/pyca/pyopenssl/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/pyopenssl/compare/21.0.0...22.0.0)

---
updated-dependencies:
- dependency-name: pyopenssl
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-02-07 22:21:23 -08:00
dependabot[bot]
9a9c98d0a0
Bump plexapi from 4.9.1 to 4.9.2 (#1647)
* Bump plexapi from 4.9.1 to 4.9.2

Bumps [plexapi](https://github.com/pkkid/python-plexapi) from 4.9.1 to 4.9.2.
- [Release notes](https://github.com/pkkid/python-plexapi/releases)
- [Commits](https://github.com/pkkid/python-plexapi/compare/4.9.1...4.9.2)

---
updated-dependencies:
- dependency-name: plexapi
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update plexapi==4.9.2

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>
2022-02-07 21:58:50 -08:00
dependabot[bot]
44e65952f9
Bump cloudinary from 1.28.1 to 1.29.0 (#1643)
* Bump cloudinary from 1.28.1 to 1.29.0

Bumps [cloudinary](https://github.com/cloudinary/pycloudinary) from 1.28.1 to 1.29.0.
- [Release notes](https://github.com/cloudinary/pycloudinary/releases)
- [Changelog](https://github.com/cloudinary/pycloudinary/blob/master/CHANGELOG.md)
- [Commits](https://github.com/cloudinary/pycloudinary/compare/1.28.1...1.29.0)

---
updated-dependencies:
- dependency-name: cloudinary
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update cloudinary==1.29.0

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-02-07 21:58:28 -08:00
dependabot[bot]
9c3d700584
Bump tempora from 5.0.0 to 5.0.1 (#1642)
Bumps [tempora](https://github.com/jaraco/tempora) from 5.0.0 to 5.0.1.
- [Release notes](https://github.com/jaraco/tempora/releases)
- [Changelog](https://github.com/jaraco/tempora/blob/main/CHANGES.rst)
- [Commits](https://github.com/jaraco/tempora/compare/v5.0.0...v5.0.1)

---
updated-dependencies:
- dependency-name: tempora
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-02-07 21:58:10 -08:00
dependabot[bot]
61960aa744
Bump requests-oauthlib from 1.3.0 to 1.3.1 (#1636)
* Bump requests-oauthlib from 1.3.0 to 1.3.1

Bumps [requests-oauthlib](https://github.com/requests/requests-oauthlib) from 1.3.0 to 1.3.1.
- [Release notes](https://github.com/requests/requests-oauthlib/releases)
- [Changelog](https://github.com/requests/requests-oauthlib/blob/master/HISTORY.rst)
- [Commits](https://github.com/requests/requests-oauthlib/compare/v1.3.0...v1.3.1)

---
updated-dependencies:
- dependency-name: requests-oauthlib
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update requests-oauthlib==1.3.1

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-02-07 21:57:50 -08:00
dependabot[bot]
5523d4ba88
Bump httpagentparser from 1.9.1 to 1.9.2 (#1631)
* Bump httpagentparser from 1.9.1 to 1.9.2

Bumps [httpagentparser](https://github.com/shon/httpagentparser) from 1.9.1 to 1.9.2.
- [Release notes](https://github.com/shon/httpagentparser/releases)
- [Commits](https://github.com/shon/httpagentparser/commits)

---
updated-dependencies:
- dependency-name: httpagentparser
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update httpagentparser==1.9.2

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-02-07 21:57:29 -08:00
dependabot[bot]
2d9e109f97
Bump arrow from 1.2.1 to 1.2.2 (#1630)
* Bump arrow from 1.2.1 to 1.2.2

Bumps [arrow](https://github.com/arrow-py/arrow) from 1.2.1 to 1.2.2.
- [Release notes](https://github.com/arrow-py/arrow/releases)
- [Changelog](https://github.com/arrow-py/arrow/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/arrow-py/arrow/compare/1.2.1...1.2.2)

---
updated-dependencies:
- dependency-name: arrow
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update arrow==1.2.2

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-02-07 21:57:11 -08:00
JonnyWong16
8e6f8d7735
Remove unnecessary insert statement 2022-02-07 09:12:07 -08:00
JonnyWong16
c3d09d34f8
Prevent rating_key collisions when updating metadata 2022-02-06 23:18:53 -08:00
JonnyWong16
cba746920a
Add Telegram channel ID to config label and description 2022-02-03 12:22:23 -08:00
JonnyWong16
e33767de9b
Fix updating section_id when updating metadata 2022-02-01 22:06:53 -08:00
JonnyWong16
636d2fe43e
Add disc number notification parameter 2022-01-31 15:04:41 -08:00
JonnyWong16
fe388e903d
Fix export download not including images 2022-01-30 17:26:08 -08:00
JonnyWong16
b9f04ac71a
Default Telegram to MarkdownV2 when HTML disabled 2022-01-30 16:50:23 -08:00
JonnyWong16
96025c839d
Separate out plex.direct IP address log filter 2022-01-27 10:52:07 -08:00
JonnyWong16
2145f1e272
Check for local IPv6 addresses 2022-01-26 22:26:25 -08:00
JonnyWong16
f2a664953c
Assume IPv6 is public address
* Fixes #1629
2022-01-26 21:33:27 -08:00
JonnyWong16
994ebfc680
v2.9.0-beta 2022-01-26 14:49:48 -08:00
JonnyWong16
e7a4cb9233
Add connection details to IP address modal 2022-01-25 16:06:52 -08:00
JonnyWong16
12dddc2d89
Add location, relayed, and secure to get_history response 2022-01-25 14:08:55 -08:00
dependabot[bot]
484c7ed4a2
Bump pyinstaller from 4.7 to 4.8 (#1614)
Bumps [pyinstaller](https://github.com/pyinstaller/pyinstaller) from 4.7 to 4.8.
- [Release notes](https://github.com/pyinstaller/pyinstaller/releases)
- [Changelog](https://github.com/pyinstaller/pyinstaller/blob/develop/doc/CHANGES-3.rst)
- [Commits](https://github.com/pyinstaller/pyinstaller/compare/v4.7...v4.8)

---
updated-dependencies:
- dependency-name: pyinstaller
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-25 12:57:59 -08:00
dependabot[bot]
f3638909cd
Bump pyobjc-framework-cocoa from 8.1 to 8.2 (#1624)
Bumps [pyobjc-framework-cocoa](https://github.com/ronaldoussoren/pyobjc) from 8.1 to 8.2.
- [Release notes](https://github.com/ronaldoussoren/pyobjc/releases)
- [Changelog](https://github.com/ronaldoussoren/pyobjc/blob/master/docs/changelog.rst)
- [Commits](https://github.com/ronaldoussoren/pyobjc/commits/v8.2)

---
updated-dependencies:
- dependency-name: pyobjc-framework-cocoa
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-01-25 12:50:22 -08:00
dependabot[bot]
4323a77d12
Bump pyobjc-core from 8.1 to 8.2 (#1626)
Bumps [pyobjc-core](https://github.com/ronaldoussoren/pyobjc) from 8.1 to 8.2.
- [Release notes](https://github.com/ronaldoussoren/pyobjc/releases)
- [Changelog](https://github.com/ronaldoussoren/pyobjc/blob/master/docs/changelog.rst)
- [Commits](https://github.com/ronaldoussoren/pyobjc/commits/v8.2)

---
updated-dependencies:
- dependency-name: pyobjc-core
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-01-25 12:49:08 -08:00
dependabot[bot]
32951488e0
Bump pycryptodomex from 3.12.0 to 3.13.0 (#1623)
Bumps [pycryptodomex](https://github.com/Legrandin/pycryptodome) from 3.12.0 to 3.13.0.
- [Release notes](https://github.com/Legrandin/pycryptodome/releases)
- [Changelog](https://github.com/Legrandin/pycryptodome/blob/master/Changelog.rst)
- [Commits](https://github.com/Legrandin/pycryptodome/compare/v3.12.0...v3.13.0)

---
updated-dependencies:
- dependency-name: pycryptodomex
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-01-25 12:47:16 -08:00
JonnyWong16
113043d9bc
Add setting to mask usernames in logs 2022-01-25 12:44:49 -08:00
JonnyWong16
2331c76326
Add fee note to donation methods 2022-01-25 12:03:47 -08:00
dependabot[bot]
7f0abe0fe6
Bump plexapi from 4.8.0 to 4.9.1 (#1627)
* Bump plexapi from 4.8.0 to 4.9.1

Bumps [plexapi](https://github.com/pkkid/python-plexapi) from 4.8.0 to 4.9.1.
- [Release notes](https://github.com/pkkid/python-plexapi/releases)
- [Commits](https://github.com/pkkid/python-plexapi/compare/4.8.0...4.9.1)

---
updated-dependencies:
- dependency-name: plexapi
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update plexapi==4.9.1

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>
2022-01-25 11:08:49 -08:00
dependabot[bot]
a4ab5ab9be
Bump pyparsing from 3.0.6 to 3.0.7 (#1620)
* Bump pyparsing from 3.0.6 to 3.0.7

Bumps [pyparsing](https://github.com/pyparsing/pyparsing) from 3.0.6 to 3.0.7.
- [Release notes](https://github.com/pyparsing/pyparsing/releases)
- [Changelog](https://github.com/pyparsing/pyparsing/blob/master/CHANGES)
- [Commits](https://github.com/pyparsing/pyparsing/compare/pyparsing_3.0.6...pyparsing_3.0.7)

---
updated-dependencies:
- dependency-name: pyparsing
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update pyparsing==3.0.7

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-01-25 11:08:37 -08:00
dependabot[bot]
3c93b5600f
Bump dnspython from 2.0.0 to 2.2.0 (#1618)
* Bump dnspython from 2.0.0 to 2.2.0

Bumps [dnspython]() from 2.0.0 to 2.2.0.

---
updated-dependencies:
- dependency-name: dnspython
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update dnspython==2.2.0

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-01-25 11:08:24 -08:00
dependabot[bot]
515a5d42d3
Bump cloudinary from 1.28.0 to 1.28.1 (#1615)
* Bump cloudinary from 1.28.0 to 1.28.1

Bumps [cloudinary](https://github.com/cloudinary/pycloudinary) from 1.28.0 to 1.28.1.
- [Release notes](https://github.com/cloudinary/pycloudinary/releases)
- [Changelog](https://github.com/cloudinary/pycloudinary/blob/master/CHANGELOG.md)
- [Commits](https://github.com/cloudinary/pycloudinary/compare/1.28.0...1.28.1)

---
updated-dependencies:
- dependency-name: cloudinary
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update cloudinary==1.28.1

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-01-25 11:08:12 -08:00
dependabot[bot]
2829041dc3
Bump tempora from 4.1.2 to 5.0.0 (#1609)
* Bump tempora from 4.1.2 to 5.0.0

Bumps [tempora](https://github.com/jaraco/tempora) from 4.1.2 to 5.0.0.
- [Release notes](https://github.com/jaraco/tempora/releases)
- [Changelog](https://github.com/jaraco/tempora/blob/main/CHANGES.rst)
- [Commits](https://github.com/jaraco/tempora/compare/v4.1.2...v5.0.0)

---
updated-dependencies:
- dependency-name: tempora
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update tempora==5.0.0

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-01-25 11:07:56 -08:00
dependabot[bot]
c03edf6893
Bump urllib3 from 1.26.7 to 1.26.8 (#1607)
* Bump urllib3 from 1.26.7 to 1.26.8

Bumps [urllib3](https://github.com/urllib3/urllib3) from 1.26.7 to 1.26.8.
- [Release notes](https://github.com/urllib3/urllib3/releases)
- [Changelog](https://github.com/urllib3/urllib3/blob/1.26.8/CHANGES.rst)
- [Commits](https://github.com/urllib3/urllib3/compare/1.26.7...1.26.8)

---
updated-dependencies:
- dependency-name: urllib3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update urllib3==1.26.8

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-01-25 11:07:41 -08:00
dependabot[bot]
fe32b31d7a
Bump requests from 2.27.0 to 2.27.1 (#1605)
* Bump requests from 2.27.0 to 2.27.1

Bumps [requests](https://github.com/psf/requests) from 2.27.0 to 2.27.1.
- [Release notes](https://github.com/psf/requests/releases)
- [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md)
- [Commits](https://github.com/psf/requests/compare/v2.27.0...v2.27.1)

---
updated-dependencies:
- dependency-name: requests
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update requests==2.27.1

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-01-25 11:07:16 -08:00
JonnyWong16
3f3c3aab11
Update ipwhois==1.2.0 fork
* ipwhois fork with support for dnspython 2.2.0 and namedtuple patch
2022-01-22 21:12:16 -08:00
JonnyWong16
8bb83cff64
Save client id with token 2022-01-20 23:11:21 -08:00
JonnyWong16
654ff7bdb6
Improve logger regex 2022-01-20 13:46:32 -08:00
JonnyWong16
1eb58ba864
Add get_tautulli_info API command 2022-01-20 10:17:51 -08:00
JonnyWong16
de8fa32557
Add feedback message for saving new Plex token 2022-01-20 10:11:06 -08:00
JonnyWong16
1be7375a49
Add favicons to newsletter auth page 2022-01-16 12:21:04 -08:00
JonnyWong16
66e6b9499a
Add intermediary login page to view Plex XML 2022-01-16 12:20:48 -08:00
JonnyWong16
86cf872595
Clean up getattr and setattr for configs 2022-01-16 11:23:10 -08:00
JonnyWong16
c78bef851e
Null do not download keys for get_settings API command 2022-01-16 11:22:40 -08:00
JonnyWong16
71d64a4b3f
Add do not download keys to config 2022-01-16 11:22:07 -08:00
JonnyWong16
81dc790a0c
Revert "Remove get_settings API command"
This reverts commit c39f89356c.
2022-01-15 16:16:24 -08:00
JonnyWong16
c35cbb06e2
Remove tokens from downloaded config 2022-01-15 16:14:20 -08:00
JonnyWong16
ce0cdf9ce6
Remove tokens from downloaded database 2022-01-15 16:13:53 -08:00
JonnyWong16
6742ce613a
Do not import pms_token or jwt_secret 2022-01-15 16:12:14 -08:00
JonnyWong16
3de0a84882
Increase verify server timeout 2022-01-12 09:59:08 -08:00
JonnyWong16
a6e568ea5d
Fix Crypto donation referrer link 2022-01-09 16:53:02 -08:00
JonnyWong16
206a175839
Add logger warning message when authentication is disabled 2022-01-05 15:56:23 -08:00
JonnyWong16
16f20c941c
Add advanced config setting to enable Plex XML shortcuts 2022-01-05 15:56:01 -08:00
JonnyWong16
f8048a01a6
Validate settings when saving config 2022-01-05 15:52:09 -08:00
JonnyWong16
3c3d72850f
Remove PMS token from UI 2022-01-05 14:04:33 -08:00
JonnyWong16
b7937b8740
Proxy PMS downloads json through server 2022-01-05 14:04:33 -08:00
JonnyWong16
d943877e76
Proxy token check through server 2022-01-05 11:17:35 -08:00
JonnyWong16
c39f89356c
Remove get_settings API command 2022-01-05 10:53:25 -08:00
JonnyWong16
2410eb3380
v2.8.1 2022-01-04 13:43:43 -08:00
dependabot[bot]
754f93816c
Bump zipp from 3.6.0 to 3.7.0 (#1601)
Bumps [zipp](https://github.com/jaraco/zipp) from 3.6.0 to 3.7.0.
- [Release notes](https://github.com/jaraco/zipp/releases)
- [Changelog](https://github.com/jaraco/zipp/blob/main/CHANGES.rst)
- [Commits](https://github.com/jaraco/zipp/compare/v3.6.0...v3.7.0)

---
updated-dependencies:
- dependency-name: zipp
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-04 13:31:34 -08:00
dependabot[bot]
3689834051
Bump cheroot from 8.5.2 to 8.6.0 (#1603)
* Bump cheroot from 8.5.2 to 8.6.0

Bumps [cheroot](https://github.com/cherrypy/cheroot) from 8.5.2 to 8.6.0.
- [Release notes](https://github.com/cherrypy/cheroot/releases)
- [Changelog](https://github.com/cherrypy/cheroot/blob/master/CHANGES.rst)
- [Commits](https://github.com/cherrypy/cheroot/compare/v8.5.2...v8.6.0)

---
updated-dependencies:
- dependency-name: cheroot
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update cheroot==8.6.0

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>
2022-01-04 13:20:50 -08:00
dependabot[bot]
bb5ebe0fa5
Bump requests from 2.26.0 to 2.27.0 (#1602)
* Bump requests from 2.26.0 to 2.27.0

Bumps [requests](https://github.com/psf/requests) from 2.26.0 to 2.27.0.
- [Release notes](https://github.com/psf/requests/releases)
- [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md)
- [Commits](https://github.com/psf/requests/compare/v2.26.0...v2.27.0)

---
updated-dependencies:
- dependency-name: requests
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update requests==2.27.0

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>
2022-01-04 13:20:40 -08:00
dependabot[bot]
2c7a3934cb
Bump websocket-client from 1.2.1 to 1.2.3 (#1587)
* Bump websocket-client from 1.2.1 to 1.2.3

Bumps [websocket-client](https://github.com/websocket-client/websocket-client) from 1.2.1 to 1.2.3.
- [Release notes](https://github.com/websocket-client/websocket-client/releases)
- [Changelog](https://github.com/websocket-client/websocket-client/blob/master/ChangeLog)
- [Commits](https://github.com/websocket-client/websocket-client/compare/v1.2.1...v1.2.3)

---
updated-dependencies:
- dependency-name: websocket-client
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update websocket-client==1.2.3

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>
2022-01-04 13:20:22 -08:00
dependabot[bot]
d652067ca5
Bump pywin32 from 302 to 303 (#1599)
Bumps [pywin32](https://github.com/mhammond/pywin32) from 302 to 303.
- [Release notes](https://github.com/mhammond/pywin32/releases)
- [Changelog](https://github.com/mhammond/pywin32/blob/main/CHANGES.txt)
- [Commits](https://github.com/mhammond/pywin32/commits)

---
updated-dependencies:
- dependency-name: pywin32
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-04 12:39:58 -08:00
dependabot[bot]
2198d819c1
Bump pyobjc-framework-cocoa from 8.0 to 8.1 (#1580)
Bumps [pyobjc-framework-cocoa](https://github.com/ronaldoussoren/pyobjc) from 8.0 to 8.1.
- [Release notes](https://github.com/ronaldoussoren/pyobjc/releases)
- [Changelog](https://github.com/ronaldoussoren/pyobjc/blob/master/docs/changelog.rst)
- [Commits](https://github.com/ronaldoussoren/pyobjc/commits)

---
updated-dependencies:
- dependency-name: pyobjc-framework-cocoa
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-04 12:38:28 -08:00
dependabot[bot]
e5e643a0c6
Bump pyobjc-core from 8.0 to 8.1 (#1579)
Bumps [pyobjc-core](https://github.com/ronaldoussoren/pyobjc) from 8.0 to 8.1.
- [Release notes](https://github.com/ronaldoussoren/pyobjc/releases)
- [Changelog](https://github.com/ronaldoussoren/pyobjc/blob/master/docs/changelog.rst)
- [Commits](https://github.com/ronaldoussoren/pyobjc/commits)

---
updated-dependencies:
- dependency-name: pyobjc-core
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-04 12:36:41 -08:00
dependabot[bot]
6df1b7dc87
Bump pycryptodomex from 3.11.0 to 3.12.0 (#1585)
Bumps [pycryptodomex](https://github.com/Legrandin/pycryptodome) from 3.11.0 to 3.12.0.
- [Release notes](https://github.com/Legrandin/pycryptodome/releases)
- [Changelog](https://github.com/Legrandin/pycryptodome/blob/master/Changelog.rst)
- [Commits](https://github.com/Legrandin/pycryptodome/compare/v3.11.0...v3.12.0)

---
updated-dependencies:
- dependency-name: pycryptodomex
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-04 12:33:41 -08:00
JonnyWong16
925a16e66d
Add total time result to user player stats 2022-01-03 12:55:42 -08:00
JonnyWong16
cd59e1d4c4
Remove media_type argument from item stats API call 2022-01-03 12:53:21 -08:00
JonnyWong16
3fc2368078
Add total time result to library user stats 2022-01-03 12:45:25 -08:00
JonnyWong16
094b2211c3
Add grouping and query_days parameters for item stats API 2022-01-03 12:45:25 -08:00
JonnyWong16
93940b710b
Add removable media plug to snap 2021-12-26 11:50:47 -08:00
JonnyWong16
1e61f1332e
Clean __pycache__ and .pyc after update 2021-12-16 11:07:35 -08:00
JonnyWong16
8d832730f2
Update exporter docs collection/playlist note 2021-12-16 10:13:04 -08:00
JonnyWong16
7b061f49c5
Make clean_pyc scripts executable 2021-12-15 20:25:14 -08:00
JonnyWong16
a944f5ae06
v2.8.0 2021-12-15 20:16:36 -08:00
JonnyWong16
9432fee1ba
Fix get_history when media_type == 'all' 2021-12-04 13:06:53 -08:00
JonnyWong16
d5d3766f90
Improve Plex log reader 2021-11-29 21:25:48 -08:00
JonnyWong16
eee5402c80
Add before and after parameter to get_history API command 2021-11-29 20:00:31 -08:00
JonnyWong16
98fe7d7a0f
Pin apscheduler==3.8.0 requirement 2021-11-29 10:19:19 -08:00
JonnyWong16
0a570e7772
Update tzdata==2021.5 2021-11-29 10:14:40 -08:00
JonnyWong16
c0fb1dbbdc
Revert "Update apscheduler==3.8.1"
This reverts commit 973cad264f.
2021-11-29 10:11:05 -08:00
JonnyWong16
045bfb9502
v2.8.0-beta 2021-11-28 14:32:14 -08:00
JonnyWong16
ae3135e66e
Update dependabot pull request limit 2021-11-28 14:24:52 -08:00
JonnyWong16
3a50981976
Update plexapi==4.8.0 2021-11-28 14:23:21 -08:00
JonnyWong16
36b55398a8
Update soupsieve==2.3.1 2021-11-28 14:23:21 -08:00
JonnyWong16
dcfd8abddd
Update cloudinary==1.28.0 2021-11-28 14:23:21 -08:00
JonnyWong16
0325e9327f
Update portend==3.1.0 2021-11-28 14:23:21 -08:00
JonnyWong16
5f43c4c890
Update mako==1.1.6 2021-11-28 14:14:57 -08:00
JonnyWong16
5dbc15ce4b
Update simplejson==3.17.6 2021-11-28 14:14:57 -08:00
JonnyWong16
f52d985f8c
Update packaging==21.3 2021-11-28 14:14:57 -08:00
JonnyWong16
0ec2d70e4b
Update pyparsing==3.0.6 2021-11-28 14:14:57 -08:00
JonnyWong16
563f697563
Update importlib-resources==5.4.0 2021-11-28 14:14:57 -08:00
JonnyWong16
c79c48fcca
Update arrow==1.2.1 2021-11-28 14:14:57 -08:00
JonnyWong16
03012cd2b2
Update tokenize-rt==4.2.1 2021-11-28 14:14:57 -08:00
JonnyWong16
966a6696d1
Update paho-mqtt==1.6.1 2021-11-28 14:14:57 -08:00
JonnyWong16
d981f6e51f
Update pyjwt==2.3.0 2021-11-28 14:14:57 -08:00
JonnyWong16
973cad264f
Update apscheduler==3.8.1 2021-11-28 14:14:57 -08:00
dependabot[bot]
a6c933cfce
Bump plexapi from 4.7.2 to 4.8.0 (#1573)
Bumps [plexapi](https://github.com/pkkid/python-plexapi) from 4.7.2 to 4.8.0.
- [Release notes](https://github.com/pkkid/python-plexapi/releases)
- [Commits](https://github.com/pkkid/python-plexapi/compare/4.7.2...4.8.0)

---
updated-dependencies:
- dependency-name: plexapi
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2021-11-28 14:14:35 -08:00
dependabot[bot]
dc45e503a6
Bump soupsieve from 2.2.1 to 2.3.1 (#1575)
Bumps [soupsieve](https://github.com/facelessuser/soupsieve) from 2.2.1 to 2.3.1.
- [Release notes](https://github.com/facelessuser/soupsieve/releases)
- [Commits](https://github.com/facelessuser/soupsieve/compare/2.2.1...2.3.1)

---
updated-dependencies:
- dependency-name: soupsieve
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2021-11-28 14:13:13 -08:00
dependabot[bot]
75dc12ff03
Bump cloudinary from 1.26.0 to 1.28.0 (#1568)
Bumps [cloudinary](https://github.com/cloudinary/pycloudinary) from 1.26.0 to 1.28.0.
- [Release notes](https://github.com/cloudinary/pycloudinary/releases)
- [Changelog](https://github.com/cloudinary/pycloudinary/blob/master/CHANGELOG.md)
- [Commits](https://github.com/cloudinary/pycloudinary/compare/1.26.0...1.28.0)

---
updated-dependencies:
- dependency-name: cloudinary
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2021-11-28 14:12:08 -08:00
dependabot[bot]
66008ca533
Bump tzdata from 2021.2.post0 to 2021.5 (#1542)
Bumps [tzdata](https://github.com/python/tzdata) from 2021.2.post0 to 2021.5.
- [Release notes](https://github.com/python/tzdata/releases)
- [Changelog](https://github.com/python/tzdata/blob/master/NEWS.md)
- [Commits](https://github.com/python/tzdata/compare/2021.2.post0...2021.5)

---
updated-dependencies:
- dependency-name: tzdata
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2021-11-28 14:11:40 -08:00
dependabot[bot]
423b76686d
Bump pyobjc-framework-cocoa from 7.3 to 8.0 (#1576)
Bumps [pyobjc-framework-cocoa](https://github.com/ronaldoussoren/pyobjc) from 7.3 to 8.0.
- [Release notes](https://github.com/ronaldoussoren/pyobjc/releases)
- [Changelog](https://github.com/ronaldoussoren/pyobjc/blob/master/docs/changelog.rst)
- [Commits](https://github.com/ronaldoussoren/pyobjc/compare/v7.3...v8.0)

---
updated-dependencies:
- dependency-name: pyobjc-framework-cocoa
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2021-11-28 14:10:35 -08:00
dependabot[bot]
d3fdee4dca
Bump pyobjc-core from 7.3 to 8.0 (#1574)
Bumps [pyobjc-core](https://github.com/ronaldoussoren/pyobjc) from 7.3 to 8.0.
- [Release notes](https://github.com/ronaldoussoren/pyobjc/releases)
- [Changelog](https://github.com/ronaldoussoren/pyobjc/blob/master/docs/changelog.rst)
- [Commits](https://github.com/ronaldoussoren/pyobjc/compare/v7.3...v8.0)

---
updated-dependencies:
- dependency-name: pyobjc-core
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2021-11-28 14:08:19 -08:00
dependabot[bot]
2f7fb821c2
Bump pyinstaller from 4.5.1 to 4.7 (#1570)
Bumps [pyinstaller](https://github.com/pyinstaller/pyinstaller) from 4.5.1 to 4.7.
- [Release notes](https://github.com/pyinstaller/pyinstaller/releases)
- [Changelog](https://github.com/pyinstaller/pyinstaller/blob/v4.7/doc/CHANGES.rst)
- [Commits](https://github.com/pyinstaller/pyinstaller/compare/v4.5.1...v4.7)

---
updated-dependencies:
- dependency-name: pyinstaller
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2021-11-28 14:07:28 -08:00
dependabot[bot]
e8e147c063
Bump mako from 1.1.5 to 1.1.6 (#1577)
Bumps [mako](https://github.com/sqlalchemy/mako) from 1.1.5 to 1.1.6.
- [Release notes](https://github.com/sqlalchemy/mako/releases)
- [Changelog](https://github.com/sqlalchemy/mako/blob/main/CHANGES)
- [Commits](https://github.com/sqlalchemy/mako/commits)

---
updated-dependencies:
- dependency-name: mako
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2021-11-28 14:02:21 -08:00
dependabot[bot]
8f2cf8fe10
Bump portend from 3.0.0 to 3.1.0 (#1572)
Bumps [portend](https://github.com/jaraco/portend) from 3.0.0 to 3.1.0.
- [Release notes](https://github.com/jaraco/portend/releases)
- [Changelog](https://github.com/jaraco/portend/blob/main/CHANGES.rst)
- [Commits](https://github.com/jaraco/portend/compare/v3.0.0...v3.1.0)

---
updated-dependencies:
- dependency-name: portend
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2021-11-28 14:01:04 -08:00
dependabot[bot]
55a51f79d5
Bump simplejson from 3.17.5 to 3.17.6 (#1569)
Bumps [simplejson](https://github.com/simplejson/simplejson) from 3.17.5 to 3.17.6.
- [Release notes](https://github.com/simplejson/simplejson/releases)
- [Changelog](https://github.com/simplejson/simplejson/blob/master/CHANGES.txt)
- [Commits](https://github.com/simplejson/simplejson/compare/v3.17.5...v3.17.6)

---
updated-dependencies:
- dependency-name: simplejson
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2021-11-28 13:59:54 -08:00
dependabot[bot]
3ce250b909
Bump packaging from 21.0 to 21.3 (#1565)
Bumps [packaging](https://github.com/pypa/packaging) from 21.0 to 21.3.
- [Release notes](https://github.com/pypa/packaging/releases)
- [Changelog](https://github.com/pypa/packaging/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pypa/packaging/compare/21.0...21.3)

---
updated-dependencies:
- dependency-name: packaging
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2021-11-28 13:58:05 -08:00
dependabot[bot]
e40234b599
Bump pyparsing from 2.4.7 to 3.0.6 (#1564)
Bumps [pyparsing](https://github.com/pyparsing/pyparsing) from 2.4.7 to 3.0.6.
- [Release notes](https://github.com/pyparsing/pyparsing/releases)
- [Changelog](https://github.com/pyparsing/pyparsing/blob/master/CHANGES)
- [Commits](https://github.com/pyparsing/pyparsing/compare/pyparsing_2.4.7...pyparsing_3.0.6)

---
updated-dependencies:
- dependency-name: pyparsing
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2021-11-28 13:55:05 -08:00
dependabot[bot]
b7489302fd
Bump importlib-resources from 5.2.2 to 5.4.0 (#1554)
Bumps [importlib-resources](https://github.com/python/importlib_resources) from 5.2.2 to 5.4.0.
- [Release notes](https://github.com/python/importlib_resources/releases)
- [Changelog](https://github.com/python/importlib_resources/blob/main/CHANGES.rst)
- [Commits](https://github.com/python/importlib_resources/compare/v5.2.2...v5.4.0)

---
updated-dependencies:
- dependency-name: importlib-resources
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2021-11-28 13:53:54 -08:00
dependabot[bot]
1fe1fd6595
Bump arrow from 1.2.0 to 1.2.1 (#1543)
Bumps [arrow](https://github.com/arrow-py/arrow) from 1.2.0 to 1.2.1.
- [Release notes](https://github.com/arrow-py/arrow/releases)
- [Changelog](https://github.com/arrow-py/arrow/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/arrow-py/arrow/compare/1.2.0...1.2.1)

---
updated-dependencies:
- dependency-name: arrow
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2021-11-28 13:52:26 -08:00
dependabot[bot]
89a265d226
Bump tokenize-rt from 4.1.0 to 4.2.1 (#1539)
Bumps [tokenize-rt](https://github.com/asottile/tokenize-rt) from 4.1.0 to 4.2.1.
- [Release notes](https://github.com/asottile/tokenize-rt/releases)
- [Commits](https://github.com/asottile/tokenize-rt/compare/v4.1.0...v4.2.1)

---
updated-dependencies:
- dependency-name: tokenize-rt
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2021-11-28 13:50:04 -08:00
dependabot[bot]
efb1a7e3b7
Bump paho-mqtt from 1.5.1 to 1.6.1 (#1538)
Bumps [paho-mqtt](https://github.com/eclipse/paho.mqtt.python) from 1.5.1 to 1.6.1.
- [Release notes](https://github.com/eclipse/paho.mqtt.python/releases)
- [Changelog](https://github.com/eclipse/paho.mqtt.python/blob/master/ChangeLog.txt)
- [Commits](https://github.com/eclipse/paho.mqtt.python/compare/v1.5.1...v1.6.1)

---
updated-dependencies:
- dependency-name: paho-mqtt
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2021-11-28 13:49:05 -08:00
JonnyWong16
ebd09e9d3b
Update requirements.txt
[skip ci]
2021-11-28 13:42:07 -08:00
JonnyWong16
bf8aca21e4
Add upload database max file size note 2021-11-28 13:29:18 -08:00
JonnyWong16
d8e581f263
Adjust info page summary margin 2021-11-28 13:29:18 -08:00
dependabot[bot]
4604140ef6
Bump apscheduler from 3.8.0 to 3.8.1 (#1545)
Bumps [apscheduler](https://github.com/agronholm/apscheduler) from 3.8.0 to 3.8.1.
- [Release notes](https://github.com/agronholm/apscheduler/releases)
- [Changelog](https://github.com/agronholm/apscheduler/blob/master/docs/versionhistory.rst)
- [Commits](https://github.com/agronholm/apscheduler/compare/3.8.0...3.8.1)

---
updated-dependencies:
- dependency-name: apscheduler
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-11-28 13:29:00 -08:00
dependabot[bot]
36a7bee9f0
Bump pyjwt from 2.2.0 to 2.3.0 (#1528)
Bumps [pyjwt](https://github.com/jpadilla/pyjwt) from 2.2.0 to 2.3.0.
- [Release notes](https://github.com/jpadilla/pyjwt/releases)
- [Changelog](https://github.com/jpadilla/pyjwt/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/jpadilla/pyjwt/compare/2.2.0...2.3.0)

---
updated-dependencies:
- dependency-name: pyjwt
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-11-28 13:25:00 -08:00
JonnyWong16
776efbb6a3
Add note passwords not copied when duplicating notifier or newsletters 2021-11-13 22:24:54 -08:00
JonnyWong16
e9762cdef6
Fix confirm modal click handler triggering multiple times 2021-11-13 22:24:12 -08:00
JonnyWong16
876741b40b
Add description toggle to info page
* Fixes #1546
2021-11-13 21:53:32 -08:00
JonnyWong16
98d02d0b89
Add missing column to sessions table 2021-11-13 21:03:34 -08:00
JonnyWong16
0a2cc953c6
Update added issues label action message
[skip ci]
2021-11-13 21:03:34 -08:00
Niccolò Maggioni
90f3e9ac85
Make all calls honor VERIFY_SSL_CERT setting (#1541)
* Make PmsConnect honor VERIFY_SSL_CERT setting

* Make all websockets and WebUI tests honor VERIFY_SSL_CERT setting

Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>
2021-11-13 21:03:12 -08:00
JonnyWong16
93cb067454
Update get_metadata_childern to include all artist album types
* Fixes #1559
2021-11-06 21:44:55 -08:00
JonnyWong16
cd85269fe5
Add Gotify notification agent 2021-11-06 20:48:52 -08:00
JonnyWong16
274801ee0b
Add note for music provider 3rd party API 2021-11-06 19:53:29 -08:00
JonnyWong16
ef60ce5bb0
Add Microsoft Teams webhook notification agent
* Closes #1514
2021-11-06 19:53:29 -08:00
JonnyWong16
3fffbcbe36
Fix expanding child DataTables 2021-10-25 17:23:29 -07:00
JonnyWong16
ecb66f39c9
Add dynamic anonymous redirect service setting 2021-10-24 21:27:27 -07:00
JonnyWong16
c13b1a67f2
Don't save table search or page state
* Fixes #1532
2021-10-24 20:42:37 -07:00
JonnyWong16
acef75f10a
Fix arrow.timestamp() method 2021-10-22 11:07:05 -07:00
JonnyWong16
5a5e6b2f4e
Only set z-index for docker mount warning on welcome page 2021-10-21 19:59:29 -07:00
herby2212
c6ff8940b4
Add watch time and user stats to info pages (#1471)
* watch time stats for show

* watch time stats for movie

* User Stats for movies and shows

* implementation for missing media types

* cleanup

* no data + rescrict guest access implementation

Co-authored-by: herby2212 <jannes.nagel@gmx.de>
2021-10-21 17:33:29 -07:00
reloxx13
22f4b33087
Add clean_pyc.bat (#1527)
* Create clean_pyc.bat

Add pyc cleaner script for windows to clear all pyc cache files.
https://github.com/Tautulli/Tautulli/issues/1523#issuecomment-944938745

* Update clean_pyc.bat

fix comment

* Remove __pycache__ folders in clean_pyc scripts

Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>
2021-10-21 17:30:17 -07:00
JonnyWong16
14d1ff65f4
Fix history Direct Stream filter button not selected on reloading page 2021-10-19 17:55:09 -07:00
JonnyWong16
b9d4f57a4e
Fix history Live TV filter when combined with other filters 2021-10-19 17:54:28 -07:00
JonnyWong16
d041c8a03b
Fix dataTables css capitalization 2021-10-19 11:59:42 -07:00
JonnyWong16
f4e1b762e9
Update all css and js references 2021-10-17 11:33:51 -07:00
JonnyWong16
73a4bb7640
Update Highcharts-9.2.2 2021-10-17 11:33:15 -07:00
JonnyWong16
a888b1818f
Update DataTables-1.11.3 2021-10-17 11:27:00 -07:00
JonnyWong16
3112f3dcad
Update jquery-3.6.0 2021-10-17 11:25:18 -07:00
JonnyWong16
5fd17040be
Fix total plays graph
* arrow.timestamp() function instead of attribute
2021-10-16 11:30:03 -07:00
JonnyWong16
2916749360
Revert "Remove MarkupSafe-2.0.1"
This reverts commit 5eb5fe8fba.
2021-10-16 09:55:35 -07:00
JonnyWong16
eb18b24bd6
Remove sgmllib3 2021-10-15 18:56:55 -07:00
JonnyWong16
bb45062fde
Fix Windows systray import 2021-10-15 18:56:43 -07:00
JonnyWong16
0888e58e5f
Update requirements.txt
* infi.systray from fork
2021-10-15 18:56:27 -07:00
JonnyWong16
c01b4da33d
Update infi.systray fork
From https://github.com/JonnyWong16/infi.systray.git@develop
2021-10-15 18:55:53 -07:00
JonnyWong16
94ef9b30c7
Add album and track exporter fields
* album.formats and album.subformats
* album.hasSonicAnalysis and track.hasSonicAnalysis
2021-10-15 18:14:36 -07:00
JonnyWong16
91e0d4b403
Revert "Restrict plexapi to Python>=3.7"
This reverts commit fdde2c6143.
2021-10-15 18:01:23 -07:00
JonnyWong16
c9675b2fde
Update package installers to Python 3.9 2021-10-15 17:33:34 -07:00
JonnyWong16
81d8d5e1ae
Combine package requirements into single file 2021-10-15 17:24:07 -07:00
JonnyWong16
60920101bf
Add importlib-resources==5.2.2 to package requirements 2021-10-15 17:22:57 -07:00
JonnyWong16
5eb5fe8fba
Remove MarkupSafe-2.0.1 2021-10-15 09:17:52 -07:00
JonnyWong16
ea398827cb
Downgrade tzlocal-2.1 2021-10-15 09:17:52 -07:00
JonnyWong16
5d46655507
Merge pull request #1521 from Tautulli/dependabot/pip/nightly/pywin32-302
Bump pywin32 from 301 to 302
2021-10-15 02:16:28 -07:00
dependabot[bot]
90f79fc4f9
Bump pywin32 from 301 to 302
Bumps [pywin32](https://github.com/mhammond/pywin32) from 301 to 302.
- [Release notes](https://github.com/mhammond/pywin32/releases)
- [Changelog](https://github.com/mhammond/pywin32/blob/main/CHANGES.txt)
- [Commits](https://github.com/mhammond/pywin32/commits)

---
updated-dependencies:
- dependency-name: pywin32
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-10-15 09:11:47 +00:00
JonnyWong16
85e082b48b
Merge pull request #1519 from Tautulli/dependabot/pip/nightly/pycryptodomex-3.11.0
Bump pycryptodomex from 3.10.1 to 3.11.0
2021-10-15 02:10:57 -07:00
dependabot[bot]
df3882817a
Bump pycryptodomex from 3.10.1 to 3.11.0
Bumps [pycryptodomex](https://github.com/Legrandin/pycryptodome) from 3.10.1 to 3.11.0.
- [Release notes](https://github.com/Legrandin/pycryptodome/releases)
- [Changelog](https://github.com/Legrandin/pycryptodome/blob/master/Changelog.rst)
- [Commits](https://github.com/Legrandin/pycryptodome/compare/v3.10.1...v3.11.0)

---
updated-dependencies:
- dependency-name: pycryptodomex
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-10-15 09:06:40 +00:00
JonnyWong16
274677a182
Merge pull request #1515 from Tautulli/dependabot/pip/nightly/pyopenssl-21.0.0
Bump pyopenssl from 20.0.1 to 21.0.0
2021-10-15 02:06:11 -07:00
JonnyWong16
0f07d42426
Merge pull request #1510 from Tautulli/dependabot/pip/nightly/apscheduler-3.8.0
Bump apscheduler from 3.7.0 to 3.8.0
2021-10-15 02:06:02 -07:00
JonnyWong16
6831174e62
Merge pull request #1502 from Tautulli/dependabot/github_actions/nightly/technote-space/workflow-conclusion-action-2.2
Bump technote-space/workflow-conclusion-action from 2.1.7 to 2.2
2021-10-15 02:05:54 -07:00
JonnyWong16
fc8448629e
Merge branch 'feature/requirements' into nightly 2021-10-15 02:03:47 -07:00
JonnyWong16
fdde2c6143
Restrict plexapi to Python>=3.7 2021-10-15 02:00:35 -07:00
JonnyWong16
1a70729243
Update MQTT notification agent 2021-10-15 02:00:35 -07:00
JonnyWong16
50aa8faa8d
Fix arrow get timestamp from integer 2021-10-15 02:00:35 -07:00
JonnyWong16
d2e84886f6
Fix jwt encoding 2021-10-15 02:00:35 -07:00
JonnyWong16
6d0fcf0970
Remove unused logger functions 2021-10-15 02:00:35 -07:00
JonnyWong16
5e6126ecbd
Fix system timezone string 2021-10-15 02:00:35 -07:00
JonnyWong16
04c54296fc
Update .gitignore 2021-10-15 02:00:35 -07:00
JonnyWong16
8cb8614911
Add requirements.txt 2021-10-15 02:00:35 -07:00
JonnyWong16
f0b700233f
Remove unused Python 2 libraries 2021-10-15 02:00:35 -07:00
JonnyWong16
53369cd8a6
Remove unnecessary lib files 2021-10-15 01:56:57 -07:00
JonnyWong16
afbfebbe59
Remove contextlib2 2021-10-15 01:56:57 -07:00
JonnyWong16
08faff47ce
Add MarkupSafe-2.0.1 2021-10-15 01:56:57 -07:00
JonnyWong16
7d74869316
Add zipp-3.6.0 2021-10-15 01:56:57 -07:00
JonnyWong16
f238343aa2
Add importlib-resources-5.2.2 2021-10-15 01:56:57 -07:00
JonnyWong16
b09faab852
Add tzdata-2021.2.post0 2021-10-15 01:56:57 -07:00
JonnyWong16
607b6fa250
Update tzlocal windows mappings 2021-10-15 01:56:57 -07:00
JonnyWong16
912912dbf9
Update tokenize-rt-4.1.0 2021-10-15 01:56:57 -07:00
JonnyWong16
41ef595edc
Update xmltodict-0.12.0 2021-10-15 01:56:57 -07:00
JonnyWong16
7dd3963bf2
Update facebook-sdk-3.1.0 2021-10-15 01:56:57 -07:00
JonnyWong16
586f033347
Update python-twitter-3.5 2021-10-15 01:56:57 -07:00
JonnyWong16
cdeff390d9
Update simplejson-3.17.5 2021-10-15 01:56:57 -07:00
JonnyWong16
f165d2d080
Update requests-oauthlib-1.3.0 2021-10-15 01:56:57 -07:00
JonnyWong16
e55576fd80
Update gntp-1.0.3 2021-10-15 01:56:57 -07:00
JonnyWong16
624ae06b35
Add backports.zoneinfo-0.2.1 2021-10-15 01:56:57 -07:00
JonnyWong16
9ba5656ad8
Update backports.functools-lru-cache-1.6.4 2021-10-15 01:56:57 -07:00
JonnyWong16
0770a301c7
Update python-plexapi-4.7.2 2021-10-14 23:18:51 -07:00
JonnyWong16
c8b02b06d6
Update six-1.16.0 2021-10-14 23:18:51 -07:00
JonnyWong16
db79e050c2
Update IPy-1.01 2021-10-14 23:18:51 -07:00
JonnyWong16
f6f6421154
Update distro-1.6.0 2021-10-14 23:18:51 -07:00
JonnyWong16
eca3fac3ea
Update contextlib2-21.6.0 2021-10-14 23:18:51 -07:00
JonnyWong16
aa127ecbda
Update websocket-client-1.2.1 2021-10-14 23:18:51 -07:00
JonnyWong16
c67f18d65c
Update tzlocal-3.0 2021-10-14 23:18:51 -07:00
JonnyWong16
9d78e6ae4c
Update pytz-2021.3 2021-10-14 23:18:51 -07:00
JonnyWong16
d76838a607
Update oauthlib-3.1.1 2021-10-14 23:18:51 -07:00
JonnyWong16
e58aa40099
Update httpagentparser-1.9.1 2021-10-14 23:18:51 -07:00
JonnyWong16
586fd15464
Update html5lib-1.1 2021-10-14 23:18:51 -07:00
JonnyWong16
3a116486e7
Update phao-mqtt-1.5.1 2021-10-14 23:18:51 -07:00
JonnyWong16
d2c14f11ae
Update musicbrainzngs-0.7.1 2021-10-14 23:18:51 -07:00
JonnyWong16
668f6bfbb8
Update Mako-1.1.5 2021-10-14 23:18:51 -07:00
JonnyWong16
4eb0fea423
Update PyJWT-2.2.0 2021-10-14 23:18:51 -07:00
JonnyWong16
b55b053b1e
Patch ipwhois host lookup
* Args need to be unpacked into the namedtuple
2021-10-14 23:18:51 -07:00
JonnyWong16
2c4cc34b2b
Update ipwhois-1.2.0 2021-10-14 23:18:51 -07:00
JonnyWong16
4d62245cf5
Update dnspython-2.2.0 2021-10-14 23:18:51 -07:00
JonnyWong16
4b28040d59
Update cloudinary-1.26.0 2021-10-14 23:18:51 -07:00
JonnyWong16
ebffd124f6
Update cherrypy-18.6.1 2021-10-14 23:18:51 -07:00
JonnyWong16
b3ae6bd695
Update jaraco.functools-3.3.0 2021-10-14 23:18:51 -07:00
JonnyWong16
979c70f129
Add jaraco.collections-3.4.0 2021-10-14 23:18:51 -07:00
JonnyWong16
ff764e1065
Add jaraco.text-3.5.1 2021-10-14 23:18:51 -07:00
JonnyWong16
fed42da9bb
Add jaraco.classes-3.2.1 2021-10-14 23:18:51 -07:00
JonnyWong16
182e5f553e
Update cheroot-8.5.2 2021-10-14 23:18:51 -07:00
JonnyWong16
4ac151d7de
Update more-itertools-8.10.0 2021-10-14 23:18:51 -07:00
JonnyWong16
a94edb4644
Update tempora-4.1.2 2021-10-14 23:18:51 -07:00
JonnyWong16
edd2f21ce1
Update portend-3.0.0 2021-10-14 23:18:51 -07:00
JonnyWong16
f3f4f9edf6
Update requests-2.26.0 2021-10-14 23:18:51 -07:00
JonnyWong16
b6595232d2
Update urllib3-1.26.7 2021-10-14 23:18:51 -07:00
JonnyWong16
a3bfabb5f6
Update idna-3.3 2021-10-14 23:18:51 -07:00
JonnyWong16
2f1a08009f
Add charset_normalizer-2.0.7 2021-10-14 23:18:51 -07:00
JonnyWong16
4c25cc3cc2
Remove chardet-3.0.4 2021-10-14 23:18:51 -07:00
JonnyWong16
41df696772
Update certifi-2021.10.8 2021-10-14 23:18:51 -07:00
JonnyWong16
a4130d6c56
Update bleach-4.1.0 2021-10-14 23:18:51 -07:00
JonnyWong16
4086529906
Add packaging-21.0 2021-10-14 23:18:51 -07:00
JonnyWong16
d6f94aaa8b
Add webencodings-0.5.1 2021-10-14 23:18:51 -07:00
JonnyWong16
82ed09cac9
Add pyparsing-2.4.7 2021-10-14 23:18:51 -07:00
JonnyWong16
ab8fa4d5b3
Update beautifulsoup4-4.10.0 2021-10-14 23:18:51 -07:00
JonnyWong16
b581460b51
Update soupsieve-2.2.1 2021-10-14 23:18:51 -07:00
JonnyWong16
9a54fb9a44
Update arrow-1.2.0 2021-10-14 23:18:51 -07:00
JonnyWong16
3b645cf6c3
Update datutil-2.8.2 2021-10-14 23:18:51 -07:00
JonnyWong16
439ca8ebb8
Add typing-extensions-3.10.0.2 2021-10-14 23:18:51 -07:00
JonnyWong16
dd32f1e5b4
Update apshceduler-3.8.0 2021-10-14 23:18:51 -07:00
JonnyWong16
ec3702c358
Update appdirs-1.4.4 2021-10-14 23:18:51 -07:00
JonnyWong16
5f22ad26ad
v2.7.7 2021-10-14 23:15:26 -07:00
JonnyWong16
9850025eef
Uncenter manual recently added notification agent selection dropdown 2021-10-14 22:52:43 -07:00
JonnyWong16
e34e775f41
Set different client ID when fetching a new Plex token 2021-10-11 21:24:58 -07:00
JonnyWong16
ef8557b50a
Keep docker mount log message when check is disabled 2021-10-09 16:51:18 -07:00
JonnyWong16
a49175b3b1
Add advanced setting to disable docker mount check 2021-10-09 16:42:35 -07:00
JonnyWong16
f4073c30ac
Move docker mount log message 2021-10-09 16:35:10 -07:00
JonnyWong16
9d4d740e8a
Add docker mount warning log message on startup 2021-10-09 16:15:38 -07:00
JonnyWong16
8f3a108f3b
Add docker mount warning message 2021-10-09 16:11:21 -07:00
JonnyWong16
92440224de
Add Android and Apple icon to Tautulli Remote App settings tab 2021-10-04 18:31:01 -07:00
dependabot[bot]
1eeddc876c
Bump pyopenssl from 20.0.1 to 21.0.0
Bumps [pyopenssl](https://github.com/pyca/pyopenssl) from 20.0.1 to 21.0.0.
- [Release notes](https://github.com/pyca/pyopenssl/releases)
- [Changelog](https://github.com/pyca/pyopenssl/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/pyopenssl/compare/20.0.1...21.0.0)

---
updated-dependencies:
- dependency-name: pyopenssl
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-09-29 17:12:18 +00:00
JonnyWong16
6ba550531e
Fix star rating on newsletter template
* Plex change from critic rating to audience rating
* Fixes #1511
2021-09-27 10:01:05 -07:00
JonnyWong16
9fddcf3057
Fix replacement of colon and exclamation outside of eval expression 2021-09-27 00:50:25 -07:00
dependabot[bot]
9cb904419f
Bump apscheduler from 3.7.0 to 3.8.0
Bumps [apscheduler](https://github.com/agronholm/apscheduler) from 3.7.0 to 3.8.0.
- [Release notes](https://github.com/agronholm/apscheduler/releases)
- [Changelog](https://github.com/agronholm/apscheduler/blob/3.8.0/docs/versionhistory.rst)
- [Commits](https://github.com/agronholm/apscheduler/compare/v3.7.0...3.8.0)

---
updated-dependencies:
- dependency-name: apscheduler
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-09-24 17:16:26 +00:00
JonnyWong16
830ef460af
Add LunaSea notification agent 2021-09-19 20:22:29 -07:00
JonnyWong16
3a5bf646ec
Fix dropdown text left aligned 2021-09-14 17:51:54 -07:00
JonnyWong16
11a5075574
Dockerfile make config folder first 2021-09-13 16:59:39 -07:00
JonnyWong16
6a1225925e
Add docker config file to detect bind mount 2021-09-13 16:10:07 -07:00
JonnyWong16
c8d8075830
Change docker base image to ghcr.io 2021-09-13 16:09:32 -07:00
JonnyWong16
8d70c4b9da
Fix return value of get_recently_added_details when exception 2021-09-13 16:05:49 -07:00
JonnyWong16
0fe422b71d
Fix sorting of mobile devices table 2021-09-10 10:05:02 -07:00
dependabot[bot]
b82b1cdfd5
Bump technote-space/workflow-conclusion-action from 2.1.7 to 2.2
Bumps [technote-space/workflow-conclusion-action](https://github.com/technote-space/workflow-conclusion-action) from 2.1.7 to 2.2.
- [Release notes](https://github.com/technote-space/workflow-conclusion-action/releases)
- [Changelog](https://github.com/technote-space/workflow-conclusion-action/blob/main/.releasegarc)
- [Commits](https://github.com/technote-space/workflow-conclusion-action/compare/v2.1.7...v2.2)

---
updated-dependencies:
- dependency-name: technote-space/workflow-conclusion-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-09-06 17:12:43 +00:00
JonnyWong16
db90b8ad18
v2.7.6 2021-08-31 13:46:21 -07:00
JonnyWong16
1a18d63ea5
Update Tautulli Remote App Store link 2021-08-31 09:32:26 -07:00
JonnyWong16
09eba5d8b5
Add startup error alert message 2021-08-27 14:17:16 -07:00
JonnyWong16
0fbb28eca2
Don't stale PRs in review
[skip ci]
2021-08-27 12:49:51 -07:00
JonnyWong16
fd2c23a016
Speed up docker startup
* Only chown files with incorrect permissions
2021-08-25 17:34:33 -07:00
JonnyWong16
9bfcde3abb
Change QR background to "not-white" 2021-08-19 11:35:25 -07:00
JonnyWong16
fee25a6aea
Update QR code generation with kjua 2021-08-19 09:51:26 -07:00
JonnyWong16
27cacb7a8f
Add kjua for QR code 2021-08-19 09:50:04 -07:00
JonnyWong16
c1cf18ad24
Remove jquery.qrcode 2021-08-19 09:49:54 -07:00
JonnyWong16
3a68080a26
Remove x264 from HW encoders 2021-08-19 09:19:04 -07:00
JonnyWong16
a1a340f4e8
Merge pull request #1463 from Tautulli/dependabot/pip/nightly/pyobjc-framework-cocoa-7.3
Bump pyobjc-framework-cocoa from 6.2.2 to 7.3
2021-08-15 18:12:56 -07:00
dependabot[bot]
b5de25f8a4
Bump pyobjc-framework-cocoa from 6.2.2 to 7.3
Bumps [pyobjc-framework-cocoa](https://github.com/ronaldoussoren/pyobjc) from 6.2.2 to 7.3.
- [Release notes](https://github.com/ronaldoussoren/pyobjc/releases)
- [Changelog](https://github.com/ronaldoussoren/pyobjc/blob/master/docs/changelog.rst)
- [Commits](https://github.com/ronaldoussoren/pyobjc/compare/v6.2.2...v7.3)

---
updated-dependencies:
- dependency-name: pyobjc-framework-cocoa
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-08-16 01:06:29 +00:00
JonnyWong16
6b27b673cb
Merge pull request #1458 from Tautulli/dependabot/pip/nightly/pyobjc-core-7.3
Bump pyobjc-core from 6.2.2 to 7.3
2021-08-15 17:16:04 -07:00
JonnyWong16
36bab1785f
Merge pull request #1485 from Tautulli/dependabot/pip/nightly/pyinstaller-4.5.1
Bump pyinstaller from 4.2 to 4.5.1
2021-08-15 17:11:24 -07:00
dependabot[bot]
855bf2334e
Bump pyinstaller from 4.2 to 4.5.1
Bumps [pyinstaller](https://github.com/pyinstaller/pyinstaller) from 4.2 to 4.5.1.
- [Release notes](https://github.com/pyinstaller/pyinstaller/releases)
- [Changelog](https://github.com/pyinstaller/pyinstaller/blob/v4.5.1/doc/CHANGES.rst)
- [Commits](https://github.com/pyinstaller/pyinstaller/compare/v4.2...v4.5.1)

---
updated-dependencies:
- dependency-name: pyinstaller
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-08-16 00:09:36 +00:00
JonnyWong16
998630d40c
Merge pull request #1466 from Tautulli/dependabot/pip/nightly/apscheduler-3.7.0
Bump apscheduler from 3.6.3 to 3.7.0
2021-08-15 17:00:27 -07:00
dependabot[bot]
70d7a307d6
Bump pyobjc-core from 6.2.2 to 7.3
Bumps [pyobjc-core](https://github.com/ronaldoussoren/pyobjc) from 6.2.2 to 7.3.
- [Release notes](https://github.com/ronaldoussoren/pyobjc/releases)
- [Changelog](https://github.com/ronaldoussoren/pyobjc/blob/master/docs/changelog.rst)
- [Commits](https://github.com/ronaldoussoren/pyobjc/compare/v6.2.2...v7.3)

---
updated-dependencies:
- dependency-name: pyobjc-core
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-08-15 23:57:44 +00:00
dependabot[bot]
e44d69316f
Bump apscheduler from 3.6.3 to 3.7.0
Bumps [apscheduler](https://github.com/agronholm/apscheduler) from 3.6.3 to 3.7.0.
- [Release notes](https://github.com/agronholm/apscheduler/releases)
- [Changelog](https://github.com/agronholm/apscheduler/blob/master/docs/versionhistory.rst)
- [Commits](https://github.com/agronholm/apscheduler/compare/v3.6.3...v3.7.0)

---
updated-dependencies:
- dependency-name: apscheduler
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-08-15 23:57:44 +00:00
JonnyWong16
474b4f3cfe
Merge pull request #1464 from Tautulli/dependabot/pip/nightly/pycryptodomex-3.10.1
Bump pycryptodomex from 3.9.9 to 3.10.1
2021-08-15 16:57:07 -07:00
JonnyWong16
f92587c4f9
Merge pull request #1465 from Tautulli/dependabot/github_actions/nightly/actions/stale-4
Bump actions/stale from 3 to 4
2021-08-15 16:55:21 -07:00
JonnyWong16
ebb82eaecc
Merge branch 'nightly' into dependabot/github_actions/nightly/actions/stale-4 2021-08-15 16:54:27 -07:00
JonnyWong16
d17432460d
Remove skip-stale-issue-message and skip-stale-pr-message 2021-08-15 16:53:43 -07:00
JonnyWong16
4e0bb34d6c
Merge pull request #1462 from Tautulli/dependabot/github_actions/nightly/technote-space/workflow-conclusion-action-2.1.7
Bump technote-space/workflow-conclusion-action from 1 to 2.1.7
2021-08-15 16:50:19 -07:00
JonnyWong16
9410f46446
Merge pull request #1460 from Tautulli/dependabot/github_actions/nightly/joncloud/makensis-action-3.6
Bump joncloud/makensis-action from 3.4 to 3.6
2021-08-15 16:46:36 -07:00
dependabot[bot]
f02820a2c1
Bump pycryptodomex from 3.9.9 to 3.10.1
Bumps [pycryptodomex](https://github.com/Legrandin/pycryptodome) from 3.9.9 to 3.10.1.
- [Release notes](https://github.com/Legrandin/pycryptodome/releases)
- [Changelog](https://github.com/Legrandin/pycryptodome/blob/master/Changelog.rst)
- [Commits](https://github.com/Legrandin/pycryptodome/compare/v3.9.9...v3.10.1)

---
updated-dependencies:
- dependency-name: pycryptodomex
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-08-15 23:40:29 +00:00
JonnyWong16
cafce3afe1
Merge pull request #1486 from Tautulli/dependabot/pip/package/pywin32-301
Bump pywin32 from 300 to 301 in /package
2021-08-15 16:39:46 -07:00
JonnyWong16
4d230e3a6b
Merge pull request #1483 from TheMeanCanEHdian/nightly
Convert issue templates to forms.
[skip ci]
2021-08-15 16:39:18 -07:00
JonnyWong16
5d05f6826a
Add new episode exporter fields 2021-08-15 15:28:01 -07:00
JonnyWong16
3fe77932a0
Update PlexAPI to 4.6.3 2021-08-15 15:23:53 -07:00
JonnyWong16
4ec8ef3ab3
Fix exporting collections and playlists
Fixes #1484
2021-08-15 15:17:20 -07:00
JonnyWong16
fd9ed1291d
Ignore dependencies for stale workflow
[skip ci]
2021-08-15 15:10:01 -07:00
dependabot[bot]
d5ea507bac
Bump pywin32 from 300 to 301 in /package
Bumps [pywin32](https://github.com/mhammond/pywin32) from 300 to 301.
- [Release notes](https://github.com/mhammond/pywin32/releases)
- [Changelog](https://github.com/mhammond/pywin32/blob/master/CHANGES.txt)
- [Commits](https://github.com/mhammond/pywin32/commits)

---
updated-dependencies:
- dependency-name: pywin32
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-08-09 20:57:11 +00:00
TheMeanCanEHdian
f28a4e92b4 Update various formatting items.
- Change `ex.` to `eg.`
- Move non-example placeholders to descriptions
- Add description to Steps to Reproduce & Relevant Settings
2021-08-07 11:17:23 -05:00
TheMeanCanEHdian
2aaa15793a Fix formatting of placeholders and use descriptions. 2021-08-07 10:25:14 -05:00
TheMeanCanEHdian
c06c046c48 Convert issue templates to forms. 2021-08-07 10:12:30 -05:00
JonnyWong16
670d2b31f7
Replace colon and exclamation in notification eval expression 2021-07-28 18:15:51 -07:00
JonnyWong16
05a00e9872
Fix colon in notification text eval being parsed as format specifier 2021-07-28 17:43:21 -07:00
JonnyWong16
3c1417108d
Use hmac compare_digest to check password 2021-07-22 17:47:27 -07:00
JonnyWong16
81ff471149
Fix typo in newsletter config 2021-07-22 17:46:52 -07:00
JonnyWong16
e0077f9386
Fix changelog headers 2021-07-15 13:33:24 -07:00
dependabot[bot]
608232a195
Bump actions/stale from 3 to 4
Bumps [actions/stale](https://github.com/actions/stale) from 3 to 4.
- [Release notes](https://github.com/actions/stale/releases)
- [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/stale/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/stale
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-07-15 20:24:13 +00:00
dependabot[bot]
150aa7b2e7
Bump technote-space/workflow-conclusion-action from 1 to 2.1.7
Bumps [technote-space/workflow-conclusion-action](https://github.com/technote-space/workflow-conclusion-action) from 1 to 2.1.7.
- [Release notes](https://github.com/technote-space/workflow-conclusion-action/releases)
- [Changelog](https://github.com/technote-space/workflow-conclusion-action/blob/master/.releasegarc)
- [Commits](https://github.com/technote-space/workflow-conclusion-action/compare/v1...v2.1.7)

---
updated-dependencies:
- dependency-name: technote-space/workflow-conclusion-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-07-15 20:24:08 +00:00
dependabot[bot]
6a408ea12a
Bump joncloud/makensis-action from 3.4 to 3.6
Bumps [joncloud/makensis-action](https://github.com/joncloud/makensis-action) from 3.4 to 3.6.
- [Release notes](https://github.com/joncloud/makensis-action/releases)
- [Commits](https://github.com/joncloud/makensis-action/compare/v3.4...v3.6)

---
updated-dependencies:
- dependency-name: joncloud/makensis-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-07-15 20:24:03 +00:00
JonnyWong16
5fbe9d476b
v2.7.5 2021-07-15 13:22:54 -07:00
JonnyWong16
73001a4427
Check for HTTP Basic Auth in AuthController 2021-07-15 13:21:09 -07:00
JonnyWong16
cc1092a8a2
Add Tautulli Remote iOS TestFlight badge 2021-07-15 13:05:17 -07:00
JonnyWong16
9f3ece4279
Add dependabot
[skip ci]
2021-07-08 20:48:21 -07:00
JonnyWong16
2ea4b6b63d
Remove basic auth setting 2021-07-08 20:22:02 -07:00
JonnyWong16
fe765f7827
Update fixed label comment action
[skip ci]
2021-07-03 18:48:23 -07:00
JonnyWong16
5c885a7e57
Remove clear logs button from settings 2021-07-02 15:14:31 -07:00
JonnyWong16
3422a99fc5
Remove duplicates from Imgur and Cloudinary lookup tables 2021-07-01 16:58:18 -07:00
JonnyWong16
c6548c80b3
Fix deleted libraries adding to watch statistics
* Fixes #1456
2021-07-01 16:31:50 -07:00
JonnyWong16
f7fc16a1d8
Don't hash a blank password when removing authentication
* Fixes #1455
2021-07-01 10:52:22 -07:00
JonnyWong16
5a4ee2179a
Fix guest session user ID in history query
* Fixes #1454
2021-07-01 10:41:33 -07:00
JonnyWong16
1f87799e57
Improve token security for Python 3 2021-07-01 09:21:46 -07:00
JonnyWong16
b4598dca20
Update remote app notification agent platform specific settings 2021-06-30 18:01:39 -07:00
JonnyWong16
15c7212031
Add option group type to notifier and newsletter config modal 2021-06-30 17:43:48 -07:00
JonnyWong16
741f3d836a
Rename Tautulli android app to remote app 2021-06-27 12:45:32 -07:00
JonnyWong16
bde2372d90
Add platform and version to mobile devices 2021-06-27 11:46:47 -07:00
JonnyWong16
c0837defed
Fix padding on newsletter config modal 2021-06-27 10:51:04 -07:00
JonnyWong16
9476897527
v2.7.4 2021-06-19 11:45:57 -07:00
JonnyWong16
eb46ff41fc
Show search bar in collapsed navbar
* Fixes #1446
2021-06-18 11:05:10 -07:00
JonnyWong16
fe034d97b1
Fix blank columns not added to csv / json export 2021-06-18 10:01:06 -07:00
JonnyWong16
e99063d6c0
Test data folder writable with file
* Fixes #1441
2021-06-18 09:40:17 -07:00
JonnyWong16
394a411167
Don't hash a blank password 2021-06-17 09:29:02 -07:00
JonnyWong16
6085eec8c2
Update exporter fields 2021-06-15 22:25:59 -07:00
JonnyWong16
fec17a7344
Update PlexAPI to 4.6.1 2021-06-15 22:12:59 -07:00
JonnyWong16
b0a395ad0b
Always hash http password 2021-06-15 21:09:37 -07:00
JonnyWong16
dff9a56950
Add len function to notification expressions 2021-06-09 15:40:35 -07:00
JonnyWong16
9ca5d81b60
Update graphs SQL queries to match homepage 2021-06-05 12:25:12 -07:00
JonnyWong16
98b4fa41a7
Don't show seconds in users / libraries total duration 2021-06-05 10:29:09 -07:00
JonnyWong16
fcc70a9b74
Fix rounding of seconds in user / library watch time stats 2021-06-05 10:28:45 -07:00
JonnyWong16
b9c1dccf48
Fix rounding of seconds on home stats 2021-06-05 09:48:39 -07:00
JonnyWong16
092d858b12
Update library and user watch time query to match homepage 2021-06-05 08:54:13 -07:00
JonnyWong16
895d67fad3
Patch ipwhois host lookup
* Args need to be unpacked into the namedtuple
2021-06-02 11:31:14 -07:00
JonnyWong16
1d0ece57c9
Fix notification agent help text tab links 2021-06-02 11:30:30 -07:00
JonnyWong16
41dfd27ff7
Add reveal button to setup wizard password field 2021-05-28 18:21:06 -07:00
JonnyWong16
80a836e3e0
Don't append notification children if failed to retrieve metadata 2021-05-26 17:54:49 -07:00
JonnyWong16
45879d0049
Add documentation for notification text expressions 2021-05-25 12:22:48 -07:00
JonnyWong16
93ed5c5eb8
Helper round ndigits is optional 2021-05-25 11:54:17 -07:00
JonnyWong16
843f7bcabe
Fix article typo in condition tilde help text 2021-05-25 11:28:06 -07:00
JonnyWong16
4fa0aafcc1 Fix limit quality profile to source bitrate 2021-05-25 11:25:18 -07:00
JonnyWong16
70e88a9013 Add tilde for blank condition values 2021-05-25 11:25:18 -07:00
JonnyWong16
a2b2d1d227 Replace eval functions with helpers to catch exceptions 2021-05-25 11:25:18 -07:00
JonnyWong16
3510224cde
Fix notification param prefix/suffix without literal text 2021-05-24 16:52:33 -07:00
JonnyWong16
006cfd1ffa
Allow < and > in string eval 2021-05-24 13:22:19 -07:00
JonnyWong16
d9f702e7f2
Add ability to evaluate math in notification text 2021-05-24 12:53:41 -07:00
JonnyWong16
be86ddbec0
v2.7.3 2021-05-22 21:16:41 -07:00
JonnyWong16
fc2ab8be25
Set themoviedb lookup rating key 2021-05-19 21:43:32 -07:00
JonnyWong16
2ea8ac133a Fix hidden and advanced settings css 2021-05-16 16:32:13 -07:00
JonnyWong16
cf0cc36b15 Expose Tautulli update check interval setting 2021-05-16 16:32:13 -07:00
JonnyWong16
28439b5042 Change check GitHub interval to hours 2021-05-16 16:32:13 -07:00
JonnyWong16
b8d0bbe930 Add settings to toggle repeat update notifications 2021-05-16 16:32:13 -07:00
JonnyWong16
0659e60720 Check for existing notify tag for PMS and Tautulli update notifications 2021-05-16 16:32:13 -07:00
JonnyWong16
e0a85e2391 Add tag to notify_log database table 2021-05-16 16:32:13 -07:00
JonnyWong16
2bc25c459f Fix incorrect quality profile when transcoding increases bitrate 2021-05-16 16:32:13 -07:00
JonnyWong16
e5da3423e9
Add duration in seconds to notification parameters
Fixes #1434
2021-05-14 16:23:13 -07:00
JonnyWong16
35b69b8cfc
Update label workflows
[skip ci]
2021-05-14 16:00:02 -07:00
JonnyWong16
40b1aa0737
Update pull request template
[skip ci]
2021-05-14 14:43:20 -07:00
JonnyWong16
f6083b12ba
Redirect to logout when clearing login logs 2021-05-14 14:10:28 -07:00
JonnyWong16
add1b4ec54 Add expiry and sign out button to login logs 2021-05-14 14:03:05 -07:00
JonnyWong16
8db75cf718 Add method to logout user sessions 2021-05-14 14:03:05 -07:00
JonnyWong16
da1c342971 Store JWT token in database 2021-05-14 14:03:05 -07:00
JonnyWong16
6c34e2cb22
Update doc strings for edit_user and edit_library for required params
* Fixes #1432
2021-05-06 18:46:32 -07:00
JonnyWong16
897f415695
Restore title argument to recently added queue jobs
* Fixes #1429
2021-05-06 18:43:22 -07:00
JonnyWong16
29637fe5cc
Add do not upload attachments to issues template
[skip ci]
2021-05-06 13:26:47 -07:00
JonnyWong16
5f8b99e7ef
Merge pull request #1425 from psaab/thread_pool
Add config for CheryPy Thread Pool Size
2021-05-03 10:20:56 -07:00
Paul Saab
5becbd91d4 Config for CheryPy Thread Pool Size
In some instances, a static thread pool size of 10 is too small.
Provide a way to modify this via the config.
2021-05-03 10:17:03 -07:00
JonnyWong16
bb44341535
Quote strings in stale issues workflow
[skip ci]
2021-05-01 23:00:11 -07:00
JonnyWong16
bc921e6f34
Add stale issues workflow
[skip ci]
2021-05-01 22:54:20 -07:00
JonnyWong16
18b4084ae1
Remove stale issues bot
[skip ci]
2021-05-01 22:54:07 -07:00
JonnyWong16
b87bd1dab2
Add stale issues bot
[skip ci]
2021-04-29 12:00:34 -07:00
JonnyWong16
fc3a81a622
Prevent closing modals when mouse drags outside 2021-04-29 10:01:54 -07:00
JonnyWong16
6a575824ef
Show collections tab for music libraries
* Hide collections tab for photo libraries
* Fixes #1421
2021-04-28 12:38:42 -07:00
JonnyWong16
613f70886e
Change date calculation for watch statistics 2021-04-28 12:24:02 -07:00
JonnyWong16
23e177d1d3
Update graph headers 2021-04-25 14:09:58 -07:00
JonnyWong16
1a48829d23
Add check for release commit hash 2021-04-24 08:56:18 -07:00
JonnyWong16
39ad3f9047
v2.7.2 2021-04-24 08:24:02 -07:00
JonnyWong16
7b08e3a2a7
Update info pages for smart collections 2021-04-23 14:56:59 -07:00
JonnyWong16
cc18b1b177
Display smart collection cog icon in collections table 2021-04-23 14:56:42 -07:00
JonnyWong16
feb8d355c7
Patch PlexAPI for displaying smart collections 2021-04-23 14:55:44 -07:00
JonnyWong16
0f9fb9deb7
Retrieve collection thumb instead of composite 2021-04-23 14:29:07 -07:00
JonnyWong16
bd53c19bf3
v2.7.1 2021-04-22 18:13:58 -07:00
JonnyWong16
b692389736
Cast rating keys to int for recently added queue
Fixes #1420
2021-04-22 18:01:21 -07:00
JonnyWong16
07ccd2af96
Ignore items with future added at dates in newsletter 2021-04-22 17:40:59 -07:00
JonnyWong16
abdde65c2e
Remove clear logs button from UI 2021-04-22 15:55:09 -07:00
JonnyWong16
b6ccce89bc
Fix graph tabs button css on mobile layout 2021-04-22 15:53:49 -07:00
JonnyWong16
f5fc07f192
Rename graph tabs and headers 2021-04-22 15:53:49 -07:00
JonnyWong16
653be526de
Update issues label action 2021-04-11 17:03:58 -07:00
JonnyWong16
c88083aef2
Rename PlexServer attribute 2021-04-11 12:58:37 -07:00
JonnyWong16
dae6c075d1
Remove all unused Plex token functions 2021-04-10 18:50:27 -07:00
JonnyWong16
4ed22d96d0
Add Issue ref # to changelog 2021-04-10 11:41:21 -07:00
JonnyWong16
c780f1fd6c
v2.7.0 2021-04-10 10:44:17 -07:00
JonnyWong16
40e0db4f70
Reveal token input fields if blank 2021-04-10 10:35:58 -07:00
JonnyWong16
74b4e45915
Update PlexAPI to 4.5.2 2021-04-05 13:57:16 -07:00
JonnyWong16
f6ca1dfa28
Add reveal button to GitHub API Token setting 2021-04-05 13:55:22 -07:00
JonnyWong16
e6c193772c
Fix sorting episodes in newsletter with missing season number 2021-04-05 12:19:21 -07:00
JonnyWong16
5cd0d31b00
Fix activity card progress bar width
* Fixes #1404
2021-04-04 19:37:32 -07:00
JonnyWong16
1eaf7ca151
v2.7.0-beta 2021-04-03 11:41:56 -07:00
JonnyWong16
7045597c61
Add Plex server down notification threshold setting 2021-04-03 11:34:53 -07:00
JonnyWong16
802dfe10be
Change all delete/edit warnings to tooltips 2021-04-02 20:55:12 -07:00
JonnyWong16
dfb2853dc5
Adjust button bar on mobile layout 2021-04-02 20:21:28 -07:00
JonnyWong16
76e8523ae4
Make history filter multi-select on other pages 2021-04-02 16:25:26 -07:00
JonnyWong16
73496c5075
Change history filters to multi-select 2021-04-02 12:35:24 -07:00
JonnyWong16
57d3be6f69
Allow comma separated parameters for get_history 2021-04-02 12:02:00 -07:00
JonnyWong16
1311f688f2
Add split strip helper function 2021-04-02 12:02:00 -07:00
JonnyWong16
5197418cb8
Use datatables helper for total_duration query 2021-04-02 11:43:23 -07:00
JonnyWong16
9b4f4b8ae4
Refactor datatables static methods 2021-04-02 11:42:48 -07:00
JonnyWong16
b32b1bae7c
Fix direct stream filter on history tables 2021-04-02 10:51:28 -07:00
JonnyWong16
1615a73da9
Don't retrieve metadata for recently added before it is available
* Fixes #1392
2021-04-02 10:33:37 -07:00
JonnyWong16
0ff2fd91d5
Update Microsoft Edge platform icon 2021-04-01 16:43:18 -07:00
JonnyWong16
5e03d6b922
Add Alexa rgba colour 2021-04-01 16:31:11 -07:00
JonnyWong16
25db370f9d
Add Amazon Alexa platform icon 2021-04-01 15:32:55 -07:00
JonnyWong16
63b363dfe4
Make update metadata music match case insensitive 2021-04-01 15:31:38 -07:00
JonnyWong16
7d509b2e8e
Add logging for update metadata 2021-04-01 10:36:18 -07:00
JonnyWong16
a3ff434f2d
Move section_id in update_metadata_details 2021-03-31 19:55:17 -07:00
JonnyWong16
323a13ae17
Add Plex token check and error message to settings page 2021-03-29 16:15:40 -07:00
JonnyWong16
bb1d324ac2
Add all raw unexposed notification parameters 2021-03-29 15:21:21 -07:00
JonnyWong16
5d09a5352d
Rename use ssl to use secure connection 2021-03-29 15:00:43 -07:00
JonnyWong16
c74b380f99
Add transcode decision selection to history tables 2021-03-29 13:22:43 -07:00
JonnyWong16
0b1c4691dc
Trim trailing slash on base url setting 2021-03-29 11:23:44 -07:00
JonnyWong16
bd6dd74518
Add guid notification parameter 2021-03-29 10:59:11 -07:00
JonnyWong16
98ad8693b0
Skip importing version_info table 2021-03-29 00:22:53 -07:00
JonnyWong16
5ca5f24a66
Copy database path to cache and delete after importing 2021-03-29 00:20:55 -07:00
JonnyWong16
0f2dbf2c94
Migrate database on import 2021-03-29 00:20:55 -07:00
JonnyWong16
b3a7850b55
Add version info to database 2021-03-29 00:20:55 -07:00
JonnyWong16
01c4f45b77
Exclude activity from history table modal 2021-03-28 19:07:25 -07:00
JonnyWong16
8928a3c901
Fix history table modal loading 2021-03-28 18:52:41 -07:00
JonnyWong16
31144c1ed4
Patch bootstrap tooltips
* https://github.com/twbs/bootstrap/issues/21830#issuecomment-298294889
2021-03-28 17:45:51 -07:00
JonnyWong16
9b519ac884
Update most active libraries query 2021-03-27 22:33:59 -07:00
JonnyWong16
62fe591d19
Update session_history table indices stopped asc 2021-03-27 21:54:08 -07:00
JonnyWong16
3136e0c82f
Add more database indices 2021-03-27 21:37:05 -07:00
JonnyWong16
6086e84630
Migrate section_id to session_history table 2021-03-27 21:35:05 -07:00
JonnyWong16
6d13051b1e
Optimize library watch time query 2021-03-27 19:54:21 -07:00
JonnyWong16
7442e53c6c
Optimize user watch time query 2021-03-27 19:54:12 -07:00
JonnyWong16
dca5a534fd
Optimize home stats queries 2021-03-27 19:49:44 -07:00
JonnyWong16
6b9cbc0a7a
Create session_history database indices 2021-03-27 19:49:03 -07:00
JonnyWong16
3db0a07fd2
Add optional include_last_accessed parameter to get_library 2021-03-27 18:03:36 -07:00
JonnyWong16
88cae2b0dc
Add optional include_last_seen parameter to get_user 2021-03-27 18:03:07 -07:00
JonnyWong16
c3f9072e21
Update readme header 2021-03-26 12:08:38 -07:00
JonnyWong16
adc11bc232
Fix get_library when last_accessed is null 2021-03-26 08:41:09 -07:00
JonnyWong16
52fad05feb
Fix get_user when last_seen is null 2021-03-26 08:40:57 -07:00
JonnyWong16
1413733271
Remove unused jquery cachedScript 2021-03-25 23:48:04 -07:00
JonnyWong16
4530e816b0
Add last_accessed to get_library response 2021-03-25 19:21:58 -07:00
JonnyWong16
b6f4c2e945
Add last_seen to get_user response 2021-03-25 19:07:46 -07:00
JonnyWong16
d46d0900cb
Update all user thumbs to pms_image_proxy 2021-03-25 18:14:26 -07:00
JonnyWong16
8ade73fa35
Fix refreshing images in browser 2021-03-25 18:13:01 -07:00
JonnyWong16
3a520405c4
Add image type option to remote app notifications 2021-03-25 16:39:52 -07:00
JonnyWong16
7ebed4ffd7
Reorganize get user/library details 2021-03-22 10:29:35 -07:00
JonnyWong16
1ff6a54d70
Also check for linkLocal IP addresses 2021-03-22 10:27:25 -07:00
JonnyWong16
bc47f9abd7
Update pms_image_proxy docs with user fallback 2021-03-22 10:05:38 -07:00
JonnyWong16
db1ba94578
Simplify isPrivateIP check 2021-03-22 10:05:14 -07:00
JonnyWong16
12350d6b54
Update ipaddr.js 2021-03-22 10:04:36 -07:00
JonnyWong16
ace9f7c294
Fix spacing of rating images on media page 2021-03-21 17:50:45 -07:00
JonnyWong16
cba4c00ca0
Add valid OneSignal ID note in Android App notification settings 2021-03-20 13:15:21 -07:00
JonnyWong16
5f2e3f58e7
Accept disabled OneSignal id 2021-03-20 12:38:01 -07:00
JonnyWong16
f31f1f1a17
Fix default cron value in database newsletters table 2021-03-19 21:02:55 -07:00
JonnyWong16
407af0450f
Cache GitHub data with release version 2021-03-19 18:11:10 -07:00
JonnyWong16
74d6b18b47
Add blurhash user background for Most Active Users card 2021-03-19 11:10:30 -07:00
JonnyWong16
b19b9a70be
Add pms_image_proxy fallback for user thumb 2021-03-19 11:10:01 -07:00
JonnyWong16
58606885aa
Add blurhash js 2021-03-19 11:08:18 -07:00
JonnyWong16
d93d9b7d4f
Add SSL/TLS support for email 2021-03-18 18:11:35 -07:00
JonnyWong16
53121adfee
v2.6.10 2021-03-17 12:13:48 -07:00
JonnyWong16
e7e5d205a4
Fix upgrading config with top_libraries if the top_users card is missing 2021-03-17 12:10:27 -07:00
JonnyWong16
59b41e862b
v2.6.9 2021-03-17 08:55:54 -07:00
JonnyWong16
0c59592c0f
Merge branch 'master' into nightly 2021-03-17 08:55:41 -07:00
JonnyWong16
6b5b09e723
Merge branch 'beta' into nightly 2021-03-17 08:55:35 -07:00
jonny
387e52becd
Revert "GitBook: [master] 11 pages modified"
This reverts commit 276e41adfd.
2021-03-16 15:17:42 -07:00
jonny
238590f6d0
Revert "GitBook: [beta] 11 pages modified"
This reverts commit ae088a170b.
2021-03-16 15:17:13 -07:00
jonny
490b15b9a3
Revert "GitBook: [nightly] 11 pages modified"
This reverts commit 2acb220f3e.
2021-03-16 15:14:46 -07:00
JonnyWong16
036c574600
Hide sensitive notification agent text fields 2021-03-16 15:11:17 -07:00
JonnyWong16
fab279e3ad
Hide mobile device token text field 2021-03-16 15:11:17 -07:00
JonnyWong16
22d312758d
Hide sensitive setting text fields with button to reveal 2021-03-16 15:11:17 -07:00
JonnyWong16
f3bd1bb80d
Keep invalid device tokens in logger blacklist 2021-03-16 15:11:17 -07:00
JonnyWong16
d20d2b5155
Fix remove newsletter calendar days note 2021-03-16 15:11:17 -07:00
jonny
2acb220f3e
GitBook: [nightly] 11 pages modified 2021-03-16 22:06:28 +00:00
jonny
ae088a170b
GitBook: [beta] 11 pages modified 2021-03-16 22:06:27 +00:00
jonny
276e41adfd
GitBook: [master] 11 pages modified 2021-03-16 22:04:01 +00:00
JonnyWong16
d965d3c36e
Reorganize home stats order 2021-03-15 17:16:17 -07:00
JonnyWong16
a5491eb58e
Use grandparent_rating_key for home stats images, fallback to rating_key 2021-03-15 17:13:32 -07:00
JonnyWong16
c5aba43b68
Add grandparent_rating_key to home stats 2021-03-15 17:12:57 -07:00
JonnyWong16
db6d5da414
Remove HTTP Host setting from UI 2021-03-15 15:49:17 -07:00
JonnyWong16
c0f7f1a409
Update get_home_stats API docs 2021-03-15 14:06:17 -07:00
JonnyWong16
7b920208a4
Add limit 1 when retrieving library last play 2021-03-15 14:01:23 -07:00
JonnyWong16
1e3905f47f
Fix top libraries stats using API commands 2021-03-15 13:58:09 -07:00
JonnyWong16
a1e0b2483d
Add blank keys to top_libraries stats 2021-03-15 13:30:35 -07:00
JonnyWong16
e4bf0fb1c1
Make sure query days is a string before splitting 2021-03-15 13:14:53 -07:00
JonnyWong16
5cc510616f
Fix popovers with images
Fixes #1391
2021-03-15 12:04:45 -07:00
JonnyWong16
b7d0a466e7
Add tautulli_update_exe and tautulli_update_pkg notification parameters 2021-03-15 12:04:45 -07:00
JonnyWong16
5b38b919c4
Update count notification parameter descriptions 2021-03-15 12:04:45 -07:00
JonnyWong16
3dd9dfa48b
Merge pull request #1389 from herby2212/nightly
Add most active libraries card and total plays to home stats
2021-03-15 12:03:55 -07:00
JonnyWong16
5609960d6a
Formatting cleanup 2021-03-15 12:01:49 -07:00
JonnyWong16
e25c18bb20
Fix if library watch time stats are blocked for guest access 2021-03-15 12:01:41 -07:00
herby2212
2949fd4079 add row limit 2021-03-15 19:29:04 +01:00
herby2212
bd65e75cf4 fix music library fallback and update code style 2021-03-14 23:59:03 +01:00
JonnyWong16
4c47501687
Fix pms_image_proxy with http images 2021-03-14 14:27:33 -07:00
JonnyWong16
a2f661df0d
Update exporter fields for new Plex TV agent 2021-03-11 17:17:48 -08:00
JonnyWong16
32ca522c32
Update PlexAPI to 4.4.1 2021-03-11 17:17:33 -08:00
JonnyWong16
9d94b137ce
Add logging for OneSignal validation 2021-03-11 13:53:56 -08:00
JonnyWong16
c59a052b48
Add flag for OneSignal validation failed 2021-03-11 13:53:56 -08:00
JonnyWong16
23b70bb24e
Async validation of OneSignal ID when registering a device 2021-03-11 13:53:56 -08:00
herby2212
bd2517e190 include dynamic library background and thumbnail 2021-03-10 19:55:55 +01:00
JonnyWong16
15f90ea433
Improve temporary device token flow 2021-03-09 23:09:57 -08:00
JonnyWong16
f7e1dc97d8
v2.6.8 2021-03-08 10:59:45 -08:00
JonnyWong16
06a9bb10cc
Fix API return error for HTTP status 500 2021-03-08 10:55:31 -08:00
JonnyWong16
4585057a9e
Catch exception validating OneSignal ID 2021-03-08 10:41:04 -08:00
JonnyWong16
5adb6ca19a
Update wiki links 2021-03-07 14:53:06 -08:00
JonnyWong16
2204da6d9f
v2.6.7 2021-03-07 14:24:11 -08:00
JonnyWong16
133a7896c8
Add originalTitle and bannerFile to show export fields 2021-03-07 12:23:51 -08:00
JonnyWong16
6fb4b35076
Update PlexAPI to 4.4.0 2021-03-07 12:06:56 -08:00
JonnyWong16
0e4de17853
Fix popover poster in tables 2021-03-07 12:04:48 -08:00
JonnyWong16
5454a27ec0
Update bootstrap to 3.4.1 2021-03-07 12:04:17 -08:00
herby2212
a772fc0bcf naming, values, config und library link update 2021-03-07 02:54:28 +01:00
JonnyWong16
a87e14f132
Update remote app Google Play link 2021-03-06 15:22:54 -08:00
JonnyWong16
6089d44ed0
Update pull_request_template.md
[skip ci]
2021-03-06 12:19:51 -08:00
JonnyWong16
02986e946f
Fix exception handling in http_handler 2021-03-05 19:41:59 -08:00
JonnyWong16
8549306a7b
Stop showing entire changelog on new install
[skip ci]
2021-03-05 19:33:01 -08:00
JonnyWong16
41ee863d2a
Don't include skip ci commits for Docker/Snap update check 2021-03-05 19:19:12 -08:00
JonnyWong16
834ce9448d
Fix typos in readme
[skip ci]
2021-03-05 18:41:30 -08:00
JonnyWong16
6b6ed3417f
Update newsletters to support season titles 2021-03-05 17:01:56 -08:00
JonnyWong16
1bb4b4a08d
Update workflows 2021-03-05 10:55:13 -08:00
JonnyWong16
eb728a0d54
Update tables to support season titles 2021-03-04 18:30:16 -08:00
JonnyWong16
f92ba453c8
Update UI to support season titles 2021-03-04 18:19:51 -08:00
JonnyWong16
84448600d2
Add helper function for short season number 2021-03-04 18:00:25 -08:00
JonnyWong16
390391c750
Add season_name notification parameter 2021-03-04 17:26:48 -08:00
JonnyWong16
b45de48019
Add TVDB rating image to info page 2021-03-04 17:12:01 -08:00
JonnyWong16
9847360dc6
Update issues and wiki links 2021-03-04 16:54:46 -08:00
JonnyWong16
a22078eb95
Update Python version in CONTRIBUTING.md
[skip ci]
2021-03-04 16:53:22 -08:00
JonnyWong16
097b4a9e78
Add feature request template
[skip ci]
2021-03-02 19:20:54 -08:00
JonnyWong16
fa850aa4c3
Update readme
[skip ci]
2021-03-02 19:13:15 -08:00
JonnyWong16
5491b96491
Update readme
[skip ci]
2021-03-02 19:10:32 -08:00
JonnyWong16
f75012b640
Update readme
[skip ci]
2021-03-02 18:46:40 -08:00
JonnyWong16
83ba14cbd3
Revert "Move pull request template"
This reverts commit c1d77c21eb.
[skip ci]
2021-03-02 17:40:37 -08:00
JonnyWong16
c1d77c21eb
Move pull request template
[skip ci]
2021-03-02 17:35:03 -08:00
JonnyWong16
ba20f950cd
Add issues workflow
[skip ci]
2021-03-02 17:28:27 -08:00
JonnyWong16
b481d6d119
Add issues template
[skip ci]
2021-03-02 17:19:37 -08:00
JonnyWong16
d297e77d31
Manually trigger lock issues workflow
[skip ci]
2021-03-02 16:44:35 -08:00
JonnyWong16
f11200af72
Lock all issues
[skip ci]
2021-03-02 16:11:15 -08:00
JonnyWong16
ffabd79479
Add [skip ci] to workflows 2021-03-02 16:07:40 -08:00
herby2212
9fa72c64b8 remove total plays from library statistics 2021-03-02 01:37:20 +01:00
herby2212
4e959be84d add most active libraries and total plays to home 2021-03-01 21:54:14 +01:00
JonnyWong16
6ee9e99c23
Bit of cleanup 2021-02-28 15:24:34 -08:00
JonnyWong16
63866e8b52
Merge pull request #1388 from herby2212/master
add audio language to stream data
2021-02-28 15:23:11 -08:00
JonnyWong16
9adb2ef7b1
Update workflows 2021-02-28 15:07:34 -08:00
herby2212
d854ea0d13 fix syntax 2021-02-28 21:52:44 +01:00
herby2212
bb767deb7d add audio language code and format code 2021-02-28 21:46:01 +01:00
JonnyWong16
8b9dee1984
Update workflows 2021-02-28 09:53:00 -08:00
herby2212
d4986a5018 add audio language to stream data 2021-02-28 17:48:25 +01:00
JonnyWong16
3b5801a2cd
Add function to initialize plexapi 2021-02-27 19:17:33 -08:00
JonnyWong16
af8a5342fb
Return error result for terminate_session 2021-02-27 13:21:12 -08:00
JonnyWong16
0868fa749d
Return error result for delete_synced_item 2021-02-27 13:11:02 -08:00
JonnyWong16
775616b52d
Add option to return response from http_handler 2021-02-27 13:10:11 -08:00
JonnyWong16
166d30b3ee
Revert QEMU image for snap builds 2021-02-22 19:50:47 -08:00
JonnyWong16
18dd4951f7
Update pms_image_proxy for playlist images 2021-02-22 18:13:21 -08:00
JonnyWong16
358d44f1af
Disable sync table links if multiple rating keys 2021-02-22 17:35:22 -08:00
JonnyWong16
e9e8fd31a4
Reload plexapi module after changing environment variables 2021-02-22 17:34:29 -08:00
JonnyWong16
dda9d76843
String synced playlist rating key 2021-02-22 17:06:14 -08:00
JonnyWong16
676a797f21
Bump snap package to python3.8 2021-02-20 13:54:46 -08:00
JonnyWong16
947892c93f
Return a sync_media_type for synced collections/playlists 2021-02-20 13:42:39 -08:00
JonnyWong16
ea199178b2
get_synced_items API machine_id is optional 2021-02-20 13:34:17 -08:00
JonnyWong16
c6e663b542
Fix synced items rating key for collections/playlists 2021-02-20 13:32:17 -08:00
JonnyWong16
dd64a4a3d7
Set default url and token in Plex object 2021-02-20 13:28:31 -08:00
JonnyWong16
1cc98e7f7d
Remove plexapi warnings 2021-02-15 16:45:38 -08:00
JonnyWong16
ab74a0da9b
Update spec files 2021-02-12 19:13:52 -08:00
JonnyWong16
6e160bb8f8
Remove Windows exe auto updater 2021-02-12 19:11:46 -08:00
JonnyWong16
2cc5bf812f
v2.6.6 2021-02-06 12:32:25 -08:00
JonnyWong16
3a71b10c6a
Update pyinstaller to 4.2 2021-02-05 10:14:23 -08:00
JonnyWong16
46c1a1be93
Add more metadata to get_home_stats API command 2021-02-04 17:22:40 -08:00
JonnyWong16
8c96a09bc6
Fix plexapi config path 2021-02-03 15:42:18 -08:00
JonnyWong16
553b615481
Set plexapi config path to Tautulli data dir 2021-02-03 15:33:16 -08:00
JonnyWong16
5c63308441
Update plexapi to 4.3.1 2021-02-03 15:31:34 -08:00
JonnyWong16
270af26b82
Add get_children_metadata API command 2021-02-02 13:39:14 -08:00
JonnyWong16
5b5ccee23b
Strip HTTP root on login redirect 2021-01-29 10:32:44 -08:00
JonnyWong16
6a534ade9f
Redirect internally after login instead of client side
* Fixes Tautulli/Tautulli-Issues#300
2021-01-29 10:04:34 -08:00
JonnyWong16
674966510d
Return empty list for datatable errors 2021-01-27 11:51:27 -08:00
JonnyWong16
5ca8184948
Create DummyObject to not crash when starting with Python 2
* This disables the collections, playlists, and exporter features
2021-01-25 18:30:47 -08:00
JonnyWong16
4a463f04f1
Add thumbUrl and artUrl to plexapi Collections
* pkkid/python-plexapi#651
2021-01-25 09:23:08 -08:00
JonnyWong16
d5fd5778dd
Fix plexapi Photoalbum key
* pkkid/python-plexapi#650
2021-01-24 21:34:09 -08:00
JonnyWong16
08e08293fe
Update requests to 2.25.1 2021-01-24 21:16:27 -08:00
JonnyWong16
140a725950
Update library collections and playlist methods 2021-01-24 21:14:45 -08:00
JonnyWong16
d8196bf63c
Fix exporter docs for collection items 2021-01-24 21:14:30 -08:00
JonnyWong16
f8e94224cf
Update export fields 2021-01-24 21:10:29 -08:00
JonnyWong16
f497c11d73
Update plexapi to 4.3.0 2021-01-24 19:53:39 -08:00
JonnyWong16
6b013da697
Fix trailing slash in public domain suffix 2021-01-21 17:50:12 -08:00
JonnyWong16
eb0e3f5afe
Rename fix metadata to fix match 2021-01-20 22:18:14 -08:00
JonnyWong16
ce7d7169f9
Update pull request workflow 2021-01-18 08:50:03 -08:00
JonnyWong16
22dadfd845
Fix Plex API media audioProfile 2021-01-18 08:47:49 -08:00
JonnyWong16
97f80adf0b
v2.6.5 2021-01-09 14:24:27 -08:00
JonnyWong16
2fc7b08909
Add misfire grace time to scheduled tasks 2021-01-09 14:15:32 -08:00
JonnyWong16
defceed696
Fix homepage server status when sections are disabled 2021-01-06 17:24:53 -08:00
JonnyWong16
249533ac51
Migrate snap user data 2021-01-05 17:56:53 -08:00
JonnyWong16
12aee8762e
Allow snap package to access home directory 2021-01-05 10:19:41 -08:00
JonnyWong16
d9325b7adf
Add Crypto link to funding 2020-12-28 14:16:16 -08:00
JonnyWong16
4975cad4fa
Keep news open for longer 2020-12-27 14:53:33 -08:00
JonnyWong16
33fc079318
More logger blacklist improvements 2020-12-27 14:52:18 -08:00
JonnyWong16
b3b2752554
Fix regex masking in logger args 2020-12-27 13:15:06 -08:00
JonnyWong16
505cf25ca3
Add back crypto donation 2020-12-25 14:01:04 -08:00
JonnyWong16
9747e3ba98
Add pull request workflow 2020-12-24 18:23:06 -08:00
JonnyWong16
729191722a
Fix typo 2020-12-24 17:00:39 -08:00
JonnyWong16
ff2cf73f23
Update .gitignore 2020-12-24 16:43:00 -08:00
JonnyWong16
9c4d97c0f8
Update installer workflow 2020-12-24 16:43:00 -08:00
JonnyWong16
be911e7700
Move nsis plugin folder 2020-12-24 16:42:37 -08:00
JonnyWong16
00629c0983
Use updater to modify Task Scheduler XML 2020-12-24 16:41:28 -08:00
JonnyWong16
52ebc9a908
Move Tautulli to Program Files x64 2020-12-24 16:41:21 -08:00
JonnyWong16
a029d6a931
Restart Tautulli process if Windows installer failed 2020-12-22 19:26:53 -08:00
JonnyWong16
7641e3b081
Add logger function to Windows updater 2020-12-22 19:18:45 -08:00
JonnyWong16
b54210480f
Don't shutdown for Windows installer update 2020-12-22 19:09:27 -08:00
JonnyWong16
0d9c1c640e
Update Windows updater 2020-12-22 19:09:06 -08:00
JonnyWong16
7f84353c69
Disable console window when running task scheduler 2020-12-22 16:24:21 -08:00
JonnyWong16
c319a4a5cc
Don't auto restart when updating Windows install 2020-12-22 16:22:45 -08:00
JonnyWong16
60f13df992
Add auto update for Windows exe install 2020-12-22 15:59:19 -08:00
JonnyWong16
dea51e32a5
Strip branch and version when reading text file in Windows updater 2020-12-22 15:46:11 -08:00
JonnyWong16
7019f5618b
Update Windows powershell command to move updater 2020-12-22 15:36:21 -08:00
JonnyWong16
9106c068ac
Update Windows installer workflow 2020-12-22 15:26:37 -08:00
JonnyWong16
0b845294fb
Add Tautulli Windows exe updater 2020-12-22 15:21:06 -08:00
JonnyWong16
7e850dd88d
Fix typo in apscheduler in package requirements file 2020-12-22 12:33:52 -08:00
JonnyWong16
877bf7060e
Missing = sign in package requirements file 2020-12-22 12:31:22 -08:00
JonnyWong16
9326d03a57
Update PyInstaller to 4.1
* APScheduler needs to be installed from PyPI due to the way it retrieves it's own version number using pkg_resources.get_distribution
2020-12-22 12:29:43 -08:00
JonnyWong16
4787f42d2e
Add args to Windows and MacOS auto startup 2020-12-21 13:39:53 -08:00
JonnyWong16
56a9ccd818
Make Windows registry key unique to allow more than one instance 2020-12-21 13:39:29 -08:00
JonnyWong16
1019fecc9e
v2.6.4 2020-12-20 08:59:41 -08:00
JonnyWong16
1855f93c1c
Revert Snap data folder
* Fixes Tautulli/Tautulli-Issues#294
2020-12-20 08:58:02 -08:00
JonnyWong16
52e6a44aa4
Put Discord notification after release 2020-12-19 16:18:29 -08:00
JonnyWong16
0b77808af6
Fix release changelog 2020-12-19 16:18:13 -08:00
JonnyWong16
9233ed5c53
Revert "Also publish snap to beta for full release"
This reverts commit 366823cee9.
2020-12-19 15:56:09 -08:00
JonnyWong16
ee68c0f622
Fix release installer path 2020-12-19 15:42:23 -08:00
2543 changed files with 255237 additions and 109372 deletions

2
.github/FUNDING.yml vendored
View file

@ -1,3 +1,3 @@
github: JonnyWong16
patreon: Tautulli
custom: ["https://bit.ly/2InPp15"]
custom: ["https://bit.ly/2InPp15", "https://bit.ly/2WTq83m"]

103
.github/ISSUE_TEMPLATE/BUG-REPORT.yml vendored Normal file
View file

@ -0,0 +1,103 @@
name: Bug Report
description: Please do not use bug reports for support issues.
labels: ['status:awaiting-triage', 'type:bug']
body:
- type: markdown
attributes:
value: |
**THIS IS NOT THE PLACE TO ASK FOR SUPPORT!** Please use [Discord](https://tautulli.com/discord) for support issues.
- type: textarea
id: description
attributes:
label: Describe the Bug
description: A clear and concise description of the bug.
validations:
required: true
- type: textarea
id: steps
attributes:
label: Steps to Reproduce
description: List each action required in order to reproduce the issue.
placeholder: |
1. Go to '...'
2. Click on '...'
3. Scroll down to '...'
4. See error
- type: textarea
id: expected
attributes:
label: Expected Behavior
description: A clear and concise description of what you expected to happen.
- type: textarea
id: screenshots
attributes:
label: Screenshots
description: Provide screenshots to help explain your problem.
- type: textarea
id: relevant
attributes:
label: Relevant Settings
description: Include all settings/configuration that are relevant to your issue. For example, Plex Media Server, newsletter, or notification settings.
placeholder: |
- eg. Plex Media Server IP address/port/checkboxes/proxy/etc.
- eg. Notification agent configuration/triggers/conditions/text/delay/grouping/etc.
- eg. Newsletter agent configuration/checkboxes/template/etc.
- Other settings
- type: input
id: version
attributes:
label: Tautulli Version
description: Check Tautulli Settings > Help & Info page.
placeholder: eg. v2.7.5
validations:
required: true
- type: input
id: branch
attributes:
label: Git Branch
description: Check Tautulli Settings > Help & Info page.
placeholder: eg. master
validations:
required: true
- type: input
id: hash
attributes:
label: Git Commit Hash
description: Check Tautulli Settings > Help & Info page.
placeholder: eg. 2cc5bf812fe05e0666aeaeb37ed550c59816fb4c
validations:
required: true
- type: input
id: platform
attributes:
label: Platform and Version
description: Check Tautulli Settings > Help & Info page.
placeholder: eg. Windows 10
validations:
required: true
- type: input
id: python
attributes:
label: Python Version
description: Check Tautulli Settings > Help & Info page.
placeholder: eg. 3.8.10
validations:
required: true
- type: input
id: browser
attributes:
label: Browser and Version
placeholder: eg. Chrome 88
validations:
required: true
- type: input
id: logs
attributes:
label: Link to Logs
description: Include a link to your **FULL** logs (not just a few lines) on [Gist](http://gist.github.com).
validations:
required: true
- type: markdown
attributes:
value: |
Make sure to close your issue when it's solved! If you found the solution yourself please comment so that others benefit from it.

View file

@ -0,0 +1,31 @@
name: Feature Request
description: Suggest a new feature for Tautulli.
labels: ['status:awaiting-triage', 'type:enhancement']
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to help improve Tautulli!
- type: textarea
id: problem
attributes:
label: Is your feature request related to a problem?
description: If so, please provide clear and concise description of the problem.
placeholder: eg. I'm always frustrated when '...'
- type: textarea
id: feature
attributes:
label: What is your feature request?
description: A clear and concise description of the feature.
validations:
required: true
- type: textarea
id: workaround
attributes:
label: Are there any workarounds?
description: A clear and concise description of any alternative solutions or features you've considered.
- type: textarea
id: additional
attributes:
label: Additional Context
description: Add any other context or screenshots about the feature request here.

8
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View file

@ -0,0 +1,8 @@
blank_issues_enabled: false
contact_links:
- name: Tautulli Wiki
url: https://github.com/Tautulli/Tautulli/wiki
about: Please check the wiki to see if your question has already been answered.
- name: Discord
url: https://tautulli.com/discord
about: Please use Discord to ask for support.

4
.github/codeql-config.yml vendored Normal file
View file

@ -0,0 +1,4 @@
name: CodeQL Config
paths-ignore:
- lib

15
.github/dependabot.yml vendored Normal file
View file

@ -0,0 +1,15 @@
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "daily"
target-branch: "nightly"
open-pull-requests-limit: 20
- package-ecosystem: "pip"
directory: "/"
schedule:
interval: "daily"
target-branch: "nightly"
open-pull-requests-limit: 20

48
.github/label-actions.yml vendored Normal file
View file

@ -0,0 +1,48 @@
# Configuration for Label Actions - https://github.com/dessant/label-actions
added:
comment: >
This feature has been added and will be available in the next release of Tautulli.
This issue will be automatically closed once the update is available.
fixed:
comment: >
This bug has been fixed and will be available in the next release of Tautulli.
This issue will be automatically closed once the update is available.
invalid:duplicate:
comment: >
:wave: @{issue-author}, this appears to be a duplicate of a pre-existing issue.
close: true
lock: true
unlabel: 'status:awaiting-triage'
-invalid:duplicate:
reopen: true
unlock: true
invalid:support:
comment: >
:wave: @{issue-author}, we use the issue tracker exclusively for bug reports.
However, this issue appears to be a support request. Please use our
[Discord Server](https://tautulli.com/discord) to get help with Tautulli. Thanks.
close: true
lock: true
lock-reason: 'off-topic'
unlabel: 'status:awaiting-triage'
-invalid:support:
reopen: true
unlock: true
invalid:template-incomplete:
issues:
comment: >
:wave: @{issue-author}, please edit your issue to complete the template with
all the required info. Your issue will be automatically closed in 5 days if
the template is not completed. Thanks.
prs:
comment: >
:wave: @{issue-author}, please edit your PR to complete the template with
all the required info. Your PR will be automatically closed in 5 days if
the template is not completed. Thanks.

View file

@ -1,10 +1,16 @@
## Description
Please include a summary of the change and which issue is fixed.
Please include a summary of the changes.
Fixes Tautulli/Tautulli-Issues#(issue)
### Screenshot
## Type of change
Include screenshots if the changes are UI-related.
### Issues Fixed or Closed
- Fixes #(issue)
## Type of Change
Please delete options that are not relevant.
@ -12,7 +18,7 @@ Please delete options that are not relevant.
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
## Checklist:
## Checklist
- [ ] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my own code

38
.github/workflows/codeql.yml vendored Normal file
View file

@ -0,0 +1,38 @@
name: CodeQL
on:
push:
branches: [nightly]
pull_request:
branches: [nightly]
schedule:
- cron: '05 10 * * 1'
jobs:
codeql-analysis:
name: CodeQL Analysis
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: ['javascript', 'python']
steps:
- name: Checkout Code
uses: actions/checkout@v4
- name: Initialize CodeQL
uses: github/codeql-action/init@v3
with:
config-file: ./.github/codeql-config.yml
languages: ${{ matrix.language }}
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3
with:
category: "/language:${{matrix.language}}"

48
.github/workflows/issues-stale.yml vendored Normal file
View file

@ -0,0 +1,48 @@
name: Stale Issues / PRs
on:
schedule:
- cron: '00 19 * * *'
jobs:
stale:
name: Check Issues / PRs
runs-on: ubuntu-latest
steps:
- name: Stale
uses: actions/stale@v9
with:
stale-issue-message: >
This issue is stale because it has been open for 30 days with no activity.
Remove the stale label or comment, otherwise this will be closed in 5 days.
close-issue-message: >
This issue was closed because it has been stalled for 5 days with no activity.
stale-issue-label: 'stale'
exempt-issue-labels: 'added,fixed,type:enhancement,status:awaiting-triage,status:in-progress'
stale-pr-message: >
This PR is stale because it has been open for 30 days with no activity.
Remove the stale label or comment, otherwise this will be closed in 5 days.
close-pr-message: >
This PR was closed because it has been stalled for 5 days with no activity.
stale-pr-label: 'stale'
exempt-pr-labels: 'status:in-progress,status:in-review,dependencies'
days-before-stale: 30
days-before-close: 5
- name: Invalid Template
uses: actions/stale@v9
with:
stale-issue-message: >
Invalid issues template.
close-issue-message: >
This issue was closed because the the template was not completed after 5 days.
stale-issue-label: 'invalid:template-incomplete'
stale-pr-message: >
Invalid PR template.
close-pr-message: >
This PR was closed because the the template was not completed after 5 days.
stale-pr-label: 'invalid:template-incomplete'
exempt-pr-labels: 'status:in-progress,status:in-review,dependencies'
only-labels: 'invalid:template-incomplete'
days-before-stale: 0
days-before-close: 5

15
.github/workflows/issues.yml vendored Normal file
View file

@ -0,0 +1,15 @@
name: Issues
on:
issues:
types: [labeled, unlabeled]
jobs:
label:
name: Label Issues
runs-on: ubuntu-latest
steps:
- name: Label Issues
uses: dessant/label-actions@v4
with:
github-token: ${{ github.token }}

View file

@ -1,52 +1,52 @@
name: Publish Docker
on:
workflow_dispatch: ~
push:
branches: [master, beta, nightly]
tags: [v*]
pull_request: ~
jobs:
build-docker:
name: Build Docker Image
runs-on: ubuntu-latest
if: ${{ !contains(github.event.head_commit.message, '[skip ci]') }}
steps:
- name: Checkout Code
uses: actions/checkout@v2
uses: actions/checkout@v4
- name: Prepare
id: prepare
run: |
if [[ $GITHUB_REF == refs/tags/* ]]; then
echo ::set-output name=tag::${GITHUB_REF#refs/tags/}
echo "tag=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT
elif [[ $GITHUB_REF == refs/heads/master ]]; then
echo ::set-output name=tag::latest
echo "tag=latest" >> $GITHUB_OUTPUT
else
echo ::set-output name=tag::${GITHUB_REF#refs/heads/}
echo "tag=${GITHUB_REF#refs/heads/}" >> $GITHUB_OUTPUT
fi
if [[ $GITHUB_REF == refs/tags/*-beta ]]; then
echo ::set-output name=branch::beta
echo "branch=beta" >> $GITHUB_OUTPUT
elif [[ $GITHUB_REF == refs/tags/* ]]; then
echo ::set-output name=branch::master
echo "branch=master" >> $GITHUB_OUTPUT
else
echo ::set-output name=branch::${GITHUB_REF#refs/heads/}
echo "branch=${GITHUB_REF#refs/heads/}" >> $GITHUB_OUTPUT
fi
echo ::set-output name=commit::${GITHUB_SHA}
echo ::set-output name=build_date::$(date -u +'%Y-%m-%dT%H:%M:%SZ')
echo ::set-output name=docker_platforms::linux/amd64,linux/arm64/v8,linux/arm/v7,linux/arm/v6
echo ::set-output name=docker_image::${{ secrets.DOCKER_REPO }}/tautulli
echo "commit=${GITHUB_SHA}" >> $GITHUB_OUTPUT
echo "docker_platforms=linux/amd64,linux/arm64/v8,linux/arm/v7,linux/arm/v6" >> $GITHUB_OUTPUT
echo "docker_image=${{ secrets.DOCKER_REPO }}/tautulli" >> $GITHUB_OUTPUT
- name: Set Up QEMU
uses: docker/setup-qemu-action@v1
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
uses: docker/setup-buildx-action@v3
id: buildx
with:
version: latest
- name: Cache Docker Layers
uses: actions/cache@v2
uses: actions/cache@v4
with:
path: /tmp/.buildx-cache
key: ${{ runner.os }}-buildx-${{ github.sha }}
@ -54,62 +54,55 @@ jobs:
${{ runner.os }}-buildx-
- name: Login to DockerHub
uses: docker/login-action@v1
if: success() && github.event_name != 'pull_request'
uses: docker/login-action@v3
if: success()
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
password: ${{ secrets.DOCKER_TOKEN }}
- name: Login to GitHub Container Registry
uses: docker/login-action@v1
if: success() && github.event_name != 'pull_request'
uses: docker/login-action@v3
if: success()
with:
registry: ghcr.io
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.GHCR_TOKEN }}
- name: Extract Docker Metadata
id: metadata
uses: docker/metadata-action@v5
with:
images: ${{ steps.prepare.outputs.docker_image }}
- name: Docker Build and Push
uses: docker/build-push-action@v2
uses: docker/build-push-action@v6
if: success()
with:
context: .
file: ./Dockerfile
push: ${{ github.event_name != 'pull_request' }}
push: true
platforms: ${{ steps.prepare.outputs.docker_platforms }}
build-args: |
TAG=${{ steps.prepare.outputs.tag }}
BRANCH=${{ steps.prepare.outputs.branch }}
COMMIT=${{ steps.prepare.outputs.commit }}
BUILD_DATE=${{ steps.prepare.outputs.build_date }}
tags: |
${{ steps.prepare.outputs.docker_image }}:${{ steps.prepare.outputs.tag }}
ghcr.io/${{ steps.prepare.outputs.docker_image }}:${{ steps.prepare.outputs.tag }}
labels: ${{ steps.metadata.outputs.labels }}
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,dest=/tmp/.buildx-cache
discord:
name: Discord Notification
needs: build-docker
if: always() && github.event_name != 'pull_request'
if: always() && !contains(github.event.head_commit.message, '[skip ci]')
runs-on: ubuntu-latest
steps:
- name: Get Build Job Status
uses: technote-space/workflow-conclusion-action@v1
- name: Combine Job Status
id: status
run: |
failures=(neutral, skipped, timed_out, action_required)
if [[ ${array[@]} =~ $WORKFLOW_CONCLUSION ]]; then
echo ::set-output name=status::failure
else
echo ::set-output name=status::$WORKFLOW_CONCLUSION
fi
- name: Post Status to Discord
uses: sarisia/actions-status-discord@v1
with:
webhook: ${{ secrets.DISCORD_WEBHOOK }}
status: ${{ steps.status.outputs.status }}
status: ${{ needs.build-docker.result == 'success' && 'success' || contains(needs.*.result, 'failure') && 'failure' || 'cancelled' }}
title: ${{ github.workflow }}
nofail: true

View file

@ -1,29 +1,37 @@
name: Publish Installers
on:
workflow_dispatch: ~
push:
branches: [master, beta, nightly]
tags: [v*]
pull_request: ~
env:
PYTHON_VERSION: '3.11'
jobs:
build-installer:
name: Build ${{ matrix.os_upper }} Installer
runs-on: ${{ matrix.os }}-latest
runs-on: ${{ matrix.os }}-${{ matrix.os_version }}
if: ${{ !contains(github.event.head_commit.message, '[skip ci]') }}
strategy:
fail-fast: false
matrix:
include:
- os: 'windows'
os_upper: 'Windows'
os_version: 'latest'
arch: 'x64'
ext: 'exe'
- os: 'macos'
os_upper: 'MacOS'
os_version: '14'
arch: 'universal'
ext: 'pkg'
steps:
- name: Checkout Code
uses: actions/checkout@v2
uses: actions/checkout@v4
- name: Set Release Version
id: get_version
@ -32,48 +40,49 @@ jobs:
if [[ $GITHUB_REF == refs/tags/* ]]; then
echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_ENV
VERSION_NSIS=${GITHUB_REF#refs/tags/v}.1
echo ::set-output name=VERSION_NSIS::${VERSION_NSIS/%-beta.1/.0}
echo ::set-output name=VERSION::${GITHUB_REF#refs/tags/v}
echo ::set-output name=RELEASE_VERSION::${GITHUB_REF#refs/tags/}
echo "VERSION_NSIS=${VERSION_NSIS/%-beta.1/.0}" >> $GITHUB_OUTPUT
echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT
echo "RELEASE_VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT
else
echo "VERSION=0.0.0" >> $GITHUB_ENV
echo ::set-output name=VERSION_NSIS::0.0.0.0
echo ::set-output name=VERSION::0.0.0
echo ::set-output name=RELEASE_VERSION::${GITHUB_SHA::7}
echo "VERSION_NSIS=0.0.0.0" >> $GITHUB_OUTPUT
echo "VERSION=0.0.0" >> $GITHUB_OUTPUT
echo "RELEASE_VERSION=${GITHUB_SHA::7}" >> $GITHUB_OUTPUT
fi
if [[ $GITHUB_REF == refs/tags/*-beta ]]; then
echo "beta" > branch.txt
elif [[ $GITHUB_REF == refs/tags/* ]]; then
echo "master" > branch.txt
else
echo ${GITHUB_REF#refs/heads/} > branch.txt
fi
echo $GITHUB_SHA > version.txt
- name: Set Up Python
uses: actions/setup-python@v2
uses: actions/setup-python@v5
with:
python-version: 3.8
- name: Cache Dependencies
uses: actions/cache@v2
with:
path: ~\AppData\Local\pip\Cache
key: ${{ runner.os }}-pip-${{ hashFiles(format('package/requirements-{0}.txt', matrix.os)) }}
restore-keys: ${{ runner.os }}-pip-
python-version: ${{ env.PYTHON_VERSION }}
cache: pip
cache-dependency-path: '**/requirements*.txt'
- name: Install Dependencies
run: |
python -m pip install --upgrade pip
pip install -r package/requirements-${{ matrix.os }}.txt
pip install -r package/requirements-package.txt --no-binary cffi
- name: Build Package
run: |
pyinstaller -y ./package/Tautulli-${{ matrix.os }}.spec
- name: Create Windows Installer
uses: joncloud/makensis-action@v1.2
uses: joncloud/makensis-action@v4.1
if: matrix.os == 'windows'
with:
script-file: ./package/Tautulli.nsi
arguments: >
/DVERSION=${{ steps.get_version.outputs.VERSION_NSIS }}
/DINSTALLER_NAME=..\Tautulli-windows-${{ steps.get_version.outputs.RELEASE_VERSION }}-x64.exe
include-more-plugins: true
include-custom-plugins-path: package/nsis-plugins
/DINSTALLER_NAME=..\Tautulli-${{ matrix.os }}-${{ steps.get_version.outputs.RELEASE_VERSION }}-${{ matrix.arch }}.${{ matrix.ext }}
additional-plugin-paths: package/nsis-plugins
- name: Create MacOS Installer
if: matrix.os == 'macos'
@ -83,102 +92,87 @@ jobs:
--version ${{ steps.get_version.outputs.VERSION }} \
--component ./dist/Tautulli.app \
--scripts ./package/macos-scripts \
Tautulli-macos-${{ steps.get_version.outputs.RELEASE_VERSION }}-x64.pkg
Tautulli-${{ matrix.os }}-${{ steps.get_version.outputs.RELEASE_VERSION }}-${{ matrix.arch }}.${{ matrix.ext }}
- name: Upload Installer
uses: actions/upload-artifact@v2
uses: actions/upload-artifact@v4
with:
name: Tautulli-${{ matrix.os }}-installer
path: Tautulli-${{ matrix.os }}-${{ steps.get_version.outputs.RELEASE_VERSION }}-x64.${{ matrix.ext }}
path: Tautulli-${{ matrix.os }}-${{ steps.get_version.outputs.RELEASE_VERSION }}-${{ matrix.arch }}.${{ matrix.ext }}
discord:
name: Discord Notification
virus-total:
name: VirusTotal Scan
needs: build-installer
if: always() && github.event_name != 'pull_request'
if: needs.build-installer.result == 'success' && !contains(github.event.head_commit.message, '[skip ci]')
runs-on: ubuntu-latest
steps:
- name: Get Build Job Status
uses: technote-space/workflow-conclusion-action@v1
- name: Download Installers
if: needs.build-installer.result == 'success'
uses: actions/download-artifact@v4
- name: Combine Job Status
id: status
run: |
failures=(neutral, skipped, timed_out, action_required)
if [[ ${array[@]} =~ $WORKFLOW_CONCLUSION ]]; then
echo ::set-output name=status::failure
else
echo ::set-output name=status::$WORKFLOW_CONCLUSION
fi
- name: Post Status to Discord
uses: sarisia/actions-status-discord@v1
- name: Upload to VirusTotal
uses: crazy-max/ghaction-virustotal@v4
with:
webhook: ${{ secrets.DISCORD_WEBHOOK }}
status: ${{ steps.status.outputs.status }}
title: ${{ github.workflow }}
nofail: true
vt_api_key: ${{ secrets.VT_API_KEY }}
files: |
Tautulli-windows-installer/Tautulli-windows-*-x64.exe
Tautulli-macos-installer/Tautulli-macos-*-universal.pkg
release:
name: Release Installers
needs: build-installer
if: always() && startsWith(github.ref, 'refs/tags/') && github.event_name != 'pull_request'
if: always() && startsWith(github.ref, 'refs/tags/') && !contains(github.event.head_commit.message, '[skip ci]')
runs-on: ubuntu-latest
steps:
- name: Get Build Job Status
uses: technote-space/workflow-conclusion-action@v1
- name: Checkout Code
uses: actions/checkout@v2
uses: actions/checkout@v4
- name: Set Release Version
id: get_version
run: |
echo ::set-output name=RELEASE_VERSION::${GITHUB_REF#refs/tags/}
echo "RELEASE_VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT
- name: Download Installers
if: env.WORKFLOW_CONCLUSION == 'success'
uses: actions/download-artifact@v2
if: needs.build-installer.result == 'success'
uses: actions/download-artifact@v4
- name: Get Changelog
id: get_changelog
run: |
changelog=$( sed -n '/^## /{p; :loop n; p; /^## /q; b loop}' CHANGELOG.md \
| sed '$d' | sed '$d' | sed '$d' | sed ':a;N;$!ba;s/\n/%0A/g' )
echo ::set-output name=CHANGELOG::$changelog
CHANGELOG="$( sed -n '/^## /{p; :loop n; p; /^## /q; b loop}' CHANGELOG.md \
| sed '$d' | sed '$d' | sed '$d' )"
EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64)
echo "CHANGELOG<<$EOF" >> $GITHUB_OUTPUT
echo "$CHANGELOG" >> $GITHUB_OUTPUT
echo "$EOF" >> $GITHUB_OUTPUT
- name: Create Release
uses: actions/create-release@v1
uses: softprops/action-gh-release@v2
id: create_release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_TOKEN: ${{ secrets.GHACTIONS_TOKEN }}
with:
tag_name: ${{ steps.get_version.outputs.RELEASE_VERSION }}
release_name: Tautulli ${{ steps.get_version.outputs.RELEASE_VERSION }}
name: Tautulli ${{ steps.get_version.outputs.RELEASE_VERSION }}
body: |
## Changelog
##${{ steps.get_changelog.outputs.CHANGELOG }}
draft: false
prerelease: ${{ endsWith(steps.get_version.outputs.RELEASE_VERSION, '-beta') }}
files: |
Tautulli-windows-installer/Tautulli-windows-${{ steps.get_version.outputs.RELEASE_VERSION }}-x64.exe
Tautulli-macos-installer/Tautulli-macos-${{ steps.get_version.outputs.RELEASE_VERSION }}-universal.pkg
- name: Upload Windows Installer
uses: actions/upload-release-asset@v1
if: env.WORKFLOW_CONCLUSION == 'success'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
discord:
name: Discord Notification
needs: [build-installer, release]
if: always() && !contains(github.event.head_commit.message, '[skip ci]')
runs-on: ubuntu-latest
steps:
- name: Post Status to Discord
uses: sarisia/actions-status-discord@v1
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: ./Tautulli-windows-${{ steps.get_version.outputs.RELEASE_VERSION }}-x64.exe
asset_name: Tautulli-windows-${{ steps.get_version.outputs.RELEASE_VERSION }}-x64.exe
asset_content_type: application/vnd.microsoft.portable-executable
- name: Upload MacOS Installer
uses: actions/upload-release-asset@v1
if: env.WORKFLOW_CONCLUSION == 'success'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: ./Tautulli-macos-${{ steps.get_version.outputs.RELEASE_VERSION }}-x64.pkg
asset_name: Tautulli-macos-${{ steps.get_version.outputs.RELEASE_VERSION }}-x64.pkg
asset_content_type: application/vnd.apple.installer+xml
webhook: ${{ secrets.DISCORD_WEBHOOK }}
status: ${{ needs.build-installer.result == 'success' && 'success' || contains(needs.*.result, 'failure') && 'failure' || 'cancelled' }}
title: ${{ github.workflow }}
nofail: true

View file

@ -1,104 +1,78 @@
name: Publish Snap
on:
workflow_dispatch: ~
push:
branches: [master, beta, nightly]
tags: [v*]
pull_request: ~
jobs:
build-snap:
name: Build Snap Package (${{ matrix.architecture }})
runs-on: ubuntu-latest
if: ${{ !contains(github.event.head_commit.message, '[skip ci]') }}
strategy:
fail-fast: false
matrix:
architecture:
- i386
- amd64
- arm64
- armhf
- ppc64el
#- s390x # broken at the moment
steps:
- name: Checkout Code
uses: actions/checkout@v2
uses: actions/checkout@v4
- name: Prepare
id: prepare
run: |
git fetch --prune --unshallow --tags
if [[ $GITHUB_REF == refs/tags/*-beta || $GITHUB_REF == refs/heads/beta ]]; then
echo ::set-output name=RELEASE::beta
echo "RELEASE=beta" >> $GITHUB_OUTPUT
elif [[ $GITHUB_REF == refs/tags/* || $GITHUB_REF == refs/heads/master ]]; then
echo ::set-output name=RELEASE::stable
echo "RELEASE=stable" >> $GITHUB_OUTPUT
else
echo ::set-output name=RELEASE::edge
echo "RELEASE=edge" >> $GITHUB_OUTPUT
fi
- name: Set Up QEMU
uses: docker/setup-qemu-action@v1
uses: docker/setup-qemu-action@v3
- name: Build Snap Package
uses: diddlesnaps/snapcraft-multiarch-action@v1
uses: diddlesnaps/snapcraft-multiarch-action@master
id: build
with:
architecture: ${{ matrix.architecture }}
- name: Upload Snap Package
uses: actions/upload-artifact@v2
uses: actions/upload-artifact@v4
with:
name: Tautulli-snap-package-${{ matrix.architecture }}
path: ${{ steps.build.outputs.snap }}
- name: Review Snap Package
uses: diddlesnaps/snapcraft-review-tools-action@v1
uses: diddlesnaps/snapcraft-review-tools-action@master
with:
snap: ${{ steps.build.outputs.snap }}
- name: Publish Snap Package
uses: snapcore/action-publish@v1
if: >
github.event_name != 'pull_request' &&
(startsWith(github.ref, 'refs/tags/') || github.ref == 'refs/heads/nightly')
if: startsWith(github.ref, 'refs/tags/') || github.ref == 'refs/heads/nightly'
env:
SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAP_LOGIN }}
with:
store_login: ${{ secrets.SNAP_LOGIN }}
snap: ${{ steps.build.outputs.snap }}
release: ${{ steps.prepare.outputs.RELEASE }}
- name: Publish Snap Package (beta)
uses: snapcore/action-publish@v1
if: >
github.event_name != 'pull_request' &&
startsWith(github.ref, 'refs/tags/') && !endsWith(github.ref, '-beta')
with:
store_login: ${{ secrets.SNAP_LOGIN }}
snap: ${{ steps.build.outputs.snap }}
release: beta
discord:
name: Discord Notification
needs: build-snap
if: always() && github.event_name != 'pull_request'
if: always() && !contains(github.event.head_commit.message, '[skip ci]')
runs-on: ubuntu-latest
steps:
- name: Get Build Job Status
uses: technote-space/workflow-conclusion-action@v1
- name: Combine Job Status
id: status
run: |
failures=(neutral, skipped, timed_out, action_required)
if [[ ${array[@]} =~ $WORKFLOW_CONCLUSION ]]; then
echo ::set-output name=status::failure
else
echo ::set-output name=status::$WORKFLOW_CONCLUSION
fi
- name: Post Status to Discord
uses: sarisia/actions-status-discord@v1
with:
webhook: ${{ secrets.DISCORD_WEBHOOK }}
status: ${{ steps.status.outputs.status }}
status: ${{ needs.build-snap.result == 'success' && 'success' || contains(needs.*.result, 'failure') && 'failure' || 'cancelled' }}
title: ${{ github.workflow }}
nofail: true

27
.github/workflows/pull-requests.yml vendored Normal file
View file

@ -0,0 +1,27 @@
name: Pull Requests
on:
pull_request_target:
types: [opened, synchronize, edited, reopened]
jobs:
check-branch:
name: Check Pull Request
runs-on: ubuntu-latest
steps:
- name: Checkout Code
uses: actions/checkout@v4
- name: Comment on Pull Request
uses: mshick/add-pr-comment@v2
if: github.base_ref != 'nightly'
with:
message: Pull requests must be made to the `nightly` branch. Thanks.
repo-token: ${{ secrets.GITHUB_TOKEN }}
- name: Fail Workflow
if: github.base_ref != 'nightly'
run: |
echo Base: "$GITHUB_BASE_REF"
echo Head: "$GITHUB_HEAD_REF"
exit 1

44
.github/workflows/submit-winget.yml vendored Normal file
View file

@ -0,0 +1,44 @@
name: Submit winget
on:
workflow_dispatch: ~
release:
types: [published]
jobs:
winget:
name: Submit Winget Package
runs-on: windows-latest
if: ${{ !github.event.release.prerelease }}
steps:
- name: Sync Winget Fork
run: gh repo sync ${{ secrets.WINGET_USERNAME }}/winget-pkgs -b master
env:
GH_TOKEN: ${{ secrets.WINGET_TOKEN }}
- name: Submit package to Windows Package Manager Community Repository
run: |
$wingetPackage = "Tautulli.Tautulli"
$gitToken = "${{ secrets.WINGET_TOKEN }}"
$github = Invoke-RestMethod -uri "https://api.github.com/repos/Tautulli/Tautulli/releases/latest"
$installerUrl = $github | Select -ExpandProperty assets -First 1 | Where-Object -Property name -match "Tautulli-windows-.*-x64.exe" | Select -ExpandProperty browser_download_url
$version = "$($github.tag_name.Trim('v')).1"
# getting latest wingetcreate file
iwr https://aka.ms/wingetcreate/latest -OutFile wingetcreate.exe
.\wingetcreate.exe update $wingetPackage -s -v $version -u $installerUrl -t $gitToken
virus-total:
name: VirusTotal Scan
runs-on: ubuntu-latest
steps:
- name: Upload to VirusTotal
uses: crazy-max/ghaction-virustotal@v4
with:
vt_api_key: ${{ secrets.VT_API_KEY }}
github_token: ${{ secrets.GHACTIONS_TOKEN }}
update_release_body: true
files: |
.exe$
.pkg$

17
.gitignore vendored
View file

@ -1,6 +1,7 @@
# Compiled source #
###################
__pycache__
*.pyc
*.py~
*.pyproj
@ -14,6 +15,13 @@
*.ini
release.lock
version.lock
lib/*.dist-info
lib/*.egg-info
lib/*.pth
lib/*/*.pyd
lib/_distutils_hack
lib/pkg_resources
lib/setuptools
logs/*
backups/*
cache/*
@ -22,6 +30,7 @@ newsletters/*
*.mmdb
version.txt
branch.txt
.TEST
# HTTPS Cert/Key #
##################
@ -44,6 +53,9 @@ Thumbs.db
#Ignore files generated by PyCharm
*.idea/*
#Ignore files generated by VSCode
*.vscode/*
#Ignore files generated by vi
*.swp
@ -64,7 +76,6 @@ Thumbs.db
*.bak
*.cache
*.ilk
*.log
[Bb]in
[Dd]ebug*/
*.lib
@ -86,11 +97,7 @@ _ReSharper*/
/parts/
/stage/
/prime/
*.snap
.snapcraft
__pycache__
*.pyc
*_source.tar.bz2
snap/.snapcraft

2
API.md
View file

@ -1,3 +1,3 @@
# API Reference
Tautulli API documentation has been moved to the [wiki page](https://github.com/Tautulli/Tautulli-Wiki/wiki/Tautulli-API-Reference).
Tautulli API documentation has been moved to the [wiki page](https://github.com/Tautulli/Tautulli/wiki/Tautulli-API-Reference).

View file

@ -1,5 +1,821 @@
# Changelog
## v2.15.3 (2025-08-03)
* Exporter:
* New: Added hearingImpaired for subtitles and visualImpaired for audio attributes to exporter fields.
* Graphs:
* Fix: Remove duplicate "Total" entry in graph tooltips. (Thanks @zdimension) (#2534)
* UI:
* Fix: Failing to retrieve collections / playlists with over 1000 items.
* Fix: Scrollbar not showing on macosx and webkit browsers. (#2221)
* Fix: Incorrect rounding of minutes in global stats play duration.
* Fix: Disable browser autocomplete for notification agent and newsletter agent configurations. (#2557)
* API:
* New: Added ability to return svg files using pms_image_proxy API command.
* Other:
* New: Added ability to set config values using environment variables. (Thanks @komuw) (#2309, #2543)
## v2.15.2 (2025-04-12)
* Activity:
* New: Added link to library by clicking media type icon.
* New: Added stream count to tab title on homepage. (#2517)
* History:
* Fix: Check stream watched status before stream stopped status. (#2506)
* Notifications:
* Fix: ntfy notifications failing to send if provider link is blank.
* Fix: Check Pushover notification attachment is under 5MB limit. (#2396)
* Fix: Track URLs redirecting to the correct media page. (#2513)
* New: Added audio profile notification parameters.
* New: Added PATCH method for Webhook notifications.
* Graphs:
* New: Added Total line to daily streams graph. (Thanks @zdimension) (#2497)
* UI:
* Fix: Do not redirect API requests to the login page. (#2490)
* Change: Swap source and stream columns in stream info modal.
* Other:
* Fix: Various typos. (Thanks @luzpaz) (#2520)
* Fix: CherryPy CORS response header not being set correctly. (#2279)
## v2.15.1 (2025-01-11)
* Activity:
* Fix: Detection of HDR transcodes. (Thanks @cdecker08) (#2412, #2466)
* Newsletters:
* Fix: Disable basic authentication for /newsletter and /image endpoints. (#2472)
* Exporter:
* New: Added logos to season and episode exports.
* Other:
* Fix: Docker container https health check.
## v2.15.0 (2024-11-24)
* Notes:
* Support for Python 3.8 has been dropped. The minimum Python version is now 3.9.
* Notifications:
* New: Allow Telegram blockquote and tg-emoji HTML tags. (Thanks @MythodeaLoL) (#2427)
* New: Added Plex slug and Plex Watch URL notification parameters. (#2420)
* Change: Update OneSignal API calls to use the new API endpoint for Tautulli Remote App notifications.
* Newsletters:
* Fix: Dumping custom dates in raw newsletter json.
* History:
* Fix: Unable to fix match for artists. (#2429)
* Exporter:
* New: Added movie and episode hasVoiceActivity attribute to exporter fields.
* New: Added subtitle canAutoSync attribute to exporter fields.
* New: Added logos to the exporter fields.
* UI:
* New: Add friendly name to the top bar of config modals. (Thanks @peagravel) (#2432)
* API:
* New: Added plex slugs to metadata in the get_metadata API command.
* Other:
* Fix: Tautulli failing to start with Python 3.13. (#2426)
## v2.14.6 (2024-10-12)
* Newsletters:
* Fix: Allow formatting newsletter date parameters.
* Change: Support apscheduler compatible cron expressions.
* UI:
* Fix: Round runtime before converting to human duration.
* Fix: Make recently added/watched rows touch scrollable.
* Other:
* Fix: Auto-updater not running.
## v2.14.5 (2024-09-20)
* Activity:
* Fix: Display of 2k resolution on activity card.
* Notifications:
* Fix: ntfy notifications with special characters failing to send.
* Other:
* Fix: Memory leak with database closing. (#2404)
## v2.14.4 (2024-08-10)
* Notifications:
* Fix: Update Slack notification info card.
* New: Added ntfy notification agent. (Thanks @nwithan8) (#2356, #2000)
* UI:
* Fix: macOS platform capitalization.
* Other:
* Fix: Remove deprecated getdefaultlocale. (Thanks @teodorstelian) (#2364, #2345)
## v2.14.3 (2024-06-19)
* Graphs:
* Fix: History table not loading when clicking on the graphs in some instances.
* UI:
* Fix: Scheduled tasks table not loading when certain tasks are disabled.
* Removed: Unnecessary Remote Server checkbox from the settings page.
* Other:
* Fix: Webserver not restarting after the setup wizard.
* Fix: Workaround webserver crashing in some instances.
## v2.14.2 (2024-05-18)
* History:
* Fix: Live TV activity not logging to history.
* Fix: Incorrect grouping of live TV history.
* Notifications:
* Fix: Pushover configuration settings refreshing after entering a token.
* Fix: Plex remote access down notifications not triggering.
* Fix: Deleting all images from Cloudinary only deleting 1000 images.
* New: Added platform version and product version notification parameters. (#2244)
* New: Added LAN streams and WAN streams notification parameters. (#2276)
* New: Added Dolby Vision notification parameters. (#2240)
* New: Added live TV channel notification parameters.
* Change: Improved Tautulli Remote App notification encryption method.
* Note: Requires Tautulli Remote App version 3.2.4.
* Exporter:
* New: Added slug attribute to exporter fields.
* New: Added track genres to exporter fields.
* New: Added playlist source URI to exporter fields.
* New: Added artProvider and thumbProvider to exporter fields.
* UI:
* Fix: Mask deleted usernames in the logs.
* Fix: Live TV watch stats not showing on the media info page.
* Fix: Users without access to Plex server not showing as inactive.
* Removed: Deprecated synced item pages.
* Removed: Anonymous redirect settings. Links now use browser no-referrer policy instead.
* API:
* New: Added Dolby Vision info to the get_metadata API command.
* New: Added before and after parameters to the get_home_stats API command. (#2231)
* Packages:
* New: Universal binary for macOS for Apple silicon.
* New: Bump Snap package to core22.
* Other:
* Change: Login cookie expires changed to max-age.
* Change: Improved key generation for login password. It is recommended to reenter your HTTP Password in the settings after upgrading.
* Removed: Python 2 compatibility code. (#2098, #2226) (Thanks @zdimension)
## v2.13.4 (2023-12-07)
* UI:
* Fix: Tautulli configuration settings page not loading when system language is None.
* Fix: Login cookie expiring too quickly.
## v2.13.3 (2023-12-03)
* Notifications:
* New: Added duration_time notification parameter.
* New: Added file_size_bytes notification parameter.
* New: Added time formats notification text modifiers.
* New: Added support for thetvdb_url for movies.
* UI:
* Fix: Activity card overflowing due to screen scaling. (#2033)
* Fix: Stream duration on activity card not being updated on track changes in some cases. (#2206)
## v2.13.2 (2023-10-26)
* History:
* New: Added quarter values icons for history watch status. (#2179, #2156) (Thanks @herby2212)
* Graphs:
* New: Added concurrent streams per day graph. (#2046) (Thanks @herby2212)
* Exporter:
* New: Added metadata directory to exporter fields.
* Removed: Banner exporter fields for tv shows.
* UI:
* New: Added last triggered time to notification agents and newsletter agent lists.
* Other:
* New: Added X-Plex-Language header override to config file.
## v2.13.1 (2023-08-25)
* Notes:
* Support for Python 3.7 has been dropped. The minimum Python version is now 3.8.
* Other:
* Fix: Tautulli failing to start on some systems.
## v2.13.0 (2023-08-25)
* Notes:
* Support for Python 3.7 has been dropped. The minimum Python version is now 3.8.
* Notifications:
* Fix: Improved watched notification trigger description. (#2104)
* New: Added notification image option for iOS Tautulli Remote app.
* Exporter:
* New: Added track chapter export fields.
* New: Added on-demand subtitle export fields.
## v2.12.5 (2023-07-13)
* Activity:
* New: Added d3d11va to list of hardware decoders.
* History:
* Fix: Incorrect grouping of play history.
* New: Added button in settings to regroup play history.
* Notifications:
* Fix: Incorrect concurrent streams notifications by IP addresss for IPv6 addresses (#2096) (Thanks @pooley182)
* UI:
* Fix: Occasional UI crashing on Python 3.11.
* New: Added multiselect user filters to History and Graphs pages. (#2090) (Thanks @zdimension)
* API:
* New: Added regroup_history API command.
* Change: Updated graph API commands to accept a comma separated list of user IDs.
## v2.12.4 (2023-05-23)
* History:
* Fix: Set view offset equal to duration if a stream is stopped within the last 10 sec.
* Other:
* Fix: Database import may fail for some older databases.
* Fix: Double-quoted strings for newer versions of SQLite. (#2015, #2057)
* API:
* Change: Return the ID for async API calls (export_metadata, notify, notify_newsletter).
## v2.12.3 (2023-04-14)
* Activity:
* Fix: Incorrect subtitle decision shown when subtitles are transcoded.
* History:
* Fix: Incorrect order when sorting by the duration column in the history tables.
* Notifications:
* Fix: Logging error when running scripts that use PlexAPI.
* UI:
* Fix: Calculate file sizes setting causing the media info table to fail to load.
* Fix: Incorrect artwork and thumbnail shown for Live TV on the Most Active Libraries statistics card.
* API:
* Change: Renamed duration to play_duration in the get_history API response. (Note: duration kept for backwards compatibility.)
## v2.12.2 (2023-03-16)
* Other:
* Fix: Tautulli not starting on FreeBSD jails.
## v2.12.1 (2023-03-14)
* Activity:
* Fix: Stop checking for deprecated sync items sessions.
* Change: Do not show audio language on activity cards for music.
* Other:
* Fix: Tautulli not starting on macOS.
## v2.12.0 (2023-03-13)
* Notifications:
* New: Added support for Telegram group topics. (#1980)
* New: Added anidb_id and anidb_url notification parameters. (#1973)
* New: Added notification triggers for Intro Marker, Commercial Marker, and Credits Marker.
* New: Added various intro, commercial, and credits marker notification parameters.
* New: Allow setting a custom Pushover notification sound. (#2005)
* Change: Notification images are now uploaded directly to Discord without the need for a 3rd party image hosting service.
* Change: Automatically strip whitespace from notification condition values.
* Change: Trigger watched notifications based on the video watched completion behaviour setting.
* Exporter:
* Fix: Unable to run exporter when using the Snap package. (#2007)
* New: Added credits marker, and audio/subtitle settings to export fields.
* UI:
* Fix: Incorrect styling and missing content for collection media info pages.
* New: Added edition details field on movie media info pages. (#1957) (Thanks @herby2212)
* New: Added setting to change the video watched completion behaviour.
* New: Added watch time and user statistics to collection and playlist media info pages. (#1982, #2012) (Thanks @herby2212)
* New: Added history table to collection and playlist media info pages.
* New: Dynamically change watched status in the UI based on video watched completion behaviour setting.
* New: Added hidden setting to override server name.
* Change: Move track artist to a details field instead of in the title on track media info pages.
* API:
* New: Added section_id and user_id parameters to get_home_stats API command. (#1944)
* New: Added marker info to get_metadata API command results.
* New: Added media_type parameter to get_item_watch_time_stats and get_item_user_stats API commands. (#1982) (Thanks @herby2212)
* New: Added last_refreshed timestamp to get_library_media_info API command response.
* Other:
* Change: Migrate analytics to Google Analytics 4.
## v2.11.1 (2022-12-22)
* Activity:
* Fix: Use source language instead of stream language on activity cards.
* Notifications:
* Fix: Blank start time notification parameters causing recently added notifications to fail. (#1940)
* Other:
* Fix: Tautulli failing to start when using python 3.7.
* Fix: Snap install failing to start. (#1941)
* Fix: Update check crashing when git is missing. (#1943) (Thanks @Minituff)
## v2.11.0 (2022-12-22)
* Activity:
* New: Added audio and subtitle language to activity cards. (#1831, #1900) (Thanks @fscorrupt)
* History:
* New: Log subtitle language and subtitle forced to database. (#1826)
* Notifications:
* Fix: Validating condition operators would fail with a blank parameter.
* New: Added start time and stop time notification parameters. (#1931)
* New: Added session_key to LunaSea notification payload. (#1929) (Thanks @JagandeepBrar)
* Newsletters:
* Fix: Allow CSS to support light and dark themes.
* Exporter:
* New: Added editionTitle to movie exporter fields.
* Change: m3u8 export changed to .m3u file extension. File is still encoded using UTF-8.
* UI:
* Fix: Link watch statistics to media page using metadata from history. (#1882)
* New: Show subtitle language and subtitle forced flag in stream data modal.
* Other:
* Fix: Mask more user and metadata fields for guest access. (#1913)
* Change: Disable TLS 1.0 and 1.1 for the webserver. Minimum TLS version is 1.2. (#1870)
* Change: Use system language for requests to Plex Media Server.
## v2.10.5 (2022-11-07)
* Notifications:
* New: Added edition_title notification parameter. (#1838)
* Change: Track notifications link to MusicBrainz track instead of album.
* Newsletters:
* New: Added months time frame for newsletters. (#1876)
* UI:
* Fix: Broken link on library statistic cards. (#1852)
* Fix: Check for IPv6 host when generating QR code for app registration.
* Fix: Missing padding on condition operator dropdown on small screens.
* Other:
* Fix: Launching browser when webserver is bound to IPv6.
* New: Tautulli can be installed via the Windows Package Manager (winget).
* Change: Separate stdout and stderr console logging. (#1874)
* API:
* Fix: API not returning 400 response code.
* New: Added edition_title to get_metadata API response.
* New: Added collections to get_children_metadata API response.
* New: Added user_thumb to get_history API response.
* New: Validate custom notification conditions before saving notification agents. (#1846)
* Change: Fallback to parent_thumb for seasons in get_metadata API response.
## v2.10.4 (2022-09-05)
* Activity:
* New: Added tooltip for quality profile on activity cards.
* Notifications:
* New: Added "does not begin with" and "does not end with" condition operators.
* UI:
* Fix: Album count showing 0 on library statistics.
* Fix: Library statistics not showing up for libraries without any history.
## v2.10.3 (2022-08-09)
* Notifications:
* New: Added JSON support for MQTT notifications. (#1763)
* New: Added show year notification parameter.
* Exporter:
* New: Added guids to artist, album, and track metadata export fields.
* New: Added languageTag to stream media info export fields.
* UI:
* Fix: Long channel identifier overflowing activity card. (#1802)
* Change: Use the last played item's artwork for library statistics cards.
* Other:
* Fix: Username log filter causing database to lock up. (#1705)
* Change: Username log filter only applies to usernames longer than 3 characters. (#1806)
* API:
* New: Added parent_year and grandparent_year to get_metadata_details API command.
* New: Added last played metadata to top_libraries and top_users in get_home_stats API command.
* New: Allow fallback to another PMS image in pms_image_proxy API command.
## v2.10.2 (2022-07-03)
* Activity:
* Fix: Incorrect audio stream info shown on the activity card when playing a secondary audio track.
* UI:
* Fix: Usernames not showing on the home statistics cards.
* Fix: Do not save a user's friendly name if it is the same as the username.
* Change: Update library icons to the latest Plex style.
## v2.10.1 (2022-06-01)
* Notifications:
* New: Added support for MusicBrainz (mbid://) guids in notification parameters without MusicBrainz lookup enabled. Requires Plex Media Server 1.27.0 or newer with refreshed Plex Music agent metadata.
* Mobile App:
* Fix: OneSignal validation failing when registering a device.
* API:
* New: Added grandparent_guids and parent_guids to get_metadata API command.
* Change: Updated continent in get_geoip_lookup API command.
* Change: Removed server_token from from get_users API command.
* Change: shared_libraries changed to a list instead of a string for get_users API command.
## v2.10.0 (2022-05-23)
* Activity:
* Fix: Detection of Dolby Vision missing for PMS 1.26.1.
* Notifications:
* Fix: Parsing of filename notification parameter incorrect for Windows PMS.
* Exporter:
* New: Added additional theme and label export fields.
* UI:
* Fix: Slow loading of collections and playlists tables.
* Change: Update default user thumbnail image to match Plex Web.
* API:
* Change: Values for get_users_table and get_libraries_table return an integer instead of "Checked".
## v2.9.7 (2022-04-11)
* UI:
* Fix: Managed user missing the username in the Users table.
## v2.9.6 (2022-04-10)
* Activity:
* New: Improved display of dynamic range on the activity cards. (Thanks @herby2212)
* Notifications:
* Change: Make include summary option apply to all media types for Discord and Slack notifications.
* UI:
* Fix: Validating Plex login in the setup wizard. (#1697)
* New: Added hidden username, email, and full name columns to users table.
* Other:
* Fix: Apply pms_timeout setting to websocket connection.
* Fix: Importing of Plex username instead of the full name. (#1710)
## v2.9.5 (2022-03-26)
* Note:
* Updated Snap packages are currently unavailable due to an upstream issue.
* Activity:
* Change: Improve calculation for transcode progress bar percentage on the activity cards.
* History:
* Fix: Live TV history filter not working. (#1691)
* Newsletter:
* Fix: Newsletter not showing different album types. (#1559)
* UI:
* Fix: Display season summary on the media info page if available with a fallback to show summary. (#1657)
* Change: Colour active filter buttons to improve contrast. (#1663)
* API:
* New: Added transcode offset keys to get_activity command.
* Other:
* Fix: Reschedule backup task after changing backup interval. (#1662)
* Fix: Dynamic anonymous redirect setting not being enabled by default after the setup wizard.
* Fix: Usernames with special characters not being filtered in the logs.
## v2.9.4 (2022-02-12)
* UI:
* Fix: Setup wizard appearing when restarting after saving settings.
* Other:
* Fix: Stop Tautulli from starting multiple instances on Windows after a clean reinstall. Check the startup items in Windows Task Manager if it is still occurring.
## v2.9.3 (2022-02-09)
* UI:
* Fix: Setup wizard looping.
* Other:
* Fix: Logger username masking preventing Tautulli from starting on new installs.
## v2.9.2 (2022-02-08)
* Notification:
* New: Added support for additional Telegram HTML tags.
* Removed: Revert Telegram defaulting to MarkdownV2 and only support HTML. (#1635)
* Other:
* Fix: The Local user being masked in the logs.
## v2.9.1 (2022-02-07)
* Other:
* Fix: Incorrect changelog version number and date.
## v2.9.0 (2022-02-07)
* Notification:
* New: Added track disc number notification parameter.
* Change: Default Telegram messages to MarkdownV2 when HTML is disabled. (#1635)
* Exporter:
* Fix: Images not being included in export zip file download.
* UI:
* Fix: Favicon missing from the newsletter authentication page.
* Fix: IPv6 details not being shown in IP address modal. (#1629)
* Fix: PWA not respecting device rotation settings. (#1633)
* New: Added intermediary login page to the Plex XML shortcuts.
* New: Added setting to mask usernames in logs (enabled by default).
* New: Added location, secure connection, and Plex Relay details to IP address modal.
* Change: Remove Plex token from the settings page.
* Change: Increase verifying server timeout to 30 seconds.
* API:
* New: Added get_tautulli_info API command.
* New: Added location, secure, and relayed to get_history API response.
* Change: Null pms_token and jwt_token in the response of the get_settings API command. (#1616)
* Other:
* Fix: Better validation of config when saving settings.
* Fix: Correct section_id and prevent rating_key collisions when updating metadata. (#1640)
* Change: Proxy Plex token check and Plex downloads json through the Tautulli server.
* Change: Remove tokens from downloaded database and config files.
* Change: Do not import pms_token or jwt_secret when importing a config file.
## v2.8.1 (2022-01-04)
* API:
* New: Added grouping and query_days parameters to the get_item_watch_time_stats API command.
* New: Added grouping parameter to the get_item_user_stats API command.
* New: Added total_time to the get_library_user_stats, get_user_player_stats, and get_item_user_stats API command responses.
* Removed: media_type parameter no longer required for the get_item_watch_time_stats, and get_item_user_stats API commands. The media type is determined automatically.
* Other:
* Fix: Clean .pyc files automatically after updating.
* New: Allow Snap package to access /media and /mnt locations. Refer to the FAQ for instructions on how to enable access.
## v2.8.0 (2021-12-15)
* History:
* Fix: Live TV history filter not working correctly when combined with other filters.
* Fix: Direct Stream history filter not remembering the state when reloading the page.
* Fix: History table not loading when no filters are selected.
* New: Added watch time and user stats to media info pages. (Thanks @herby2212) (#1417, #1471)
* Notifications:
* New: Added Microsoft Teams notification agent. (#1514)
* New: Added Gotify notification agent. (#1584)
* New: Add warning message that passwords are not copied when duplicating a notification or newsletter agent. (#1540)
* Newsletters:
* Fix: Different album types not shown on newsletter. (#1559)
* Exporter:
* New: Added album formats, subformats, and sonic analysis export fields.
* UI:
* Fix: Docker config volume message overlapping modal windows. (#1567)
* Fix: Different album types not shown on artist media info page.
* New: Added show more/less toggle for summaries on media info pages. (#1546)
* Change: Do not save datatable page or search states when reloading the page. (#1532)
* Change: Improve the Plex log reader.
* API:
* New: Added before and after parameters to the get_history API command.
* Other:
* Fix: Updated Python dependencies. (#1499)
* Fix: Some websocket connections not respecting the verify SSL setting. (Thanks @nmaggioni) (#1541)
* New: Support for Python 3.10. (#1522)
* New: Added dynamic anonymous redirect service setting. (#1526)
## v2.7.7 (2021-10-14)
* Notifications:
* Fix: Colons and exclamation marks being replaced outside of expressions.
* New: Added LunaSea notification agent. Note: Requires a future LunaSea app update to function.
* Newsletters:
* Fix: Star rating not showing on newsletter with the new Plex metadata agents. (#1511)
* UI:
* Fix: Sorting of mobile devices table with uppercase and lowercase device names.
* Fix: Various dropdown menus with centered text to left-aligned text.
* Other:
* Fix: Plex.tv account token not changing when fetching a new token.
* New: Added check and warning message for missing Docker container volume mount.
## v2.7.6 (2021-08-31)
* Notifications:
* Fix: Unable to parse colons (:) and exclamation marks (!) in notification text eval strings.
* Exporter:
* Fix: Unable to export playlists and collections from a library. (#1484)
* New: Added new episode export fields.
* Mobile App:
* Fix: Unable to scan QR code with dark mode enabled.
* New: Tautulli Remote App is out of beta for iOS and can be downloaded in the App Store.
* Other:
* New: Update PlexAPI to 4.6.3.
* New: Added popup alert message for Windows and macOS when Tautulli fails to start.
## v2.7.5 (2021-07-15)
* History:
* Fix: Guest users were unable to view history.
* Fix: Most Active Library statistics was counting deleted libraries.
* Newsletters:
* Fix: Incorrect padding on the newsletter configuration modal.
* Mobile App:
* New: Tautulli Remote App is out of beta on Android. The iOS app is available for beta testing on TestFlight.
* API:
* New: Added mobile device platform and version to device registration.
* Other:
* Fix: Unable to remove authentication.
* Change: Improve API key and device token security on Python 3.
* Remove: Basic Authentication setting.
## v2.7.4 (2021-06-19)
* Activity:
* Fix: Incorrect quality profile shown on the activity card.
* Notifications:
* New: Added ability to evaluate Python expressions in notification parameters.
* New: Added tilde (~) to represent blank notification condition values.
* Exporter:
* Fix: Blank fields missing from csv and json exports.
* New: Added some new exporter fields.
* Graphs:
* Fix: Play counts and durations not matching the homepage statistics.
* UI:
* New: Show search bar in the collapsed menu on the mobile layout. (#1446)
* Change: Do not show seconds for total played duration on Users and Libraries tables.
* Other:
* Fix: Check the Tautulli data folder is writable on startup. (#1441)
* New: Update PlexAPI to 4.6.1.
* Change: Always hash HTTP password in config file.
## v2.7.3 (2021-05-22)
* Activity:
* Fix: Incorrect quality profile being shown when transcoding to a higher bitrate.
* Notifications:
* New: Added notification parameters for duration values in seconds. (#1434)
* New: Added setting to allow repeat Tautulli update notifications. By default the Tautulli update notification will only notify once.
* New: Added setting to allow repeat Plex Media Server update notifications. By default the Plex Media Server update notification will only notify once.
* New: Added setting to configure the Tautulli update check interval.
* UI:
* Fix: Prevent accidentally closing modals when dragging the mouse outside the window.
* Fix: Recently added queue modal not loading. (#1429)
* New: Show collections tab in music libraries. (#1421)
* New: Added method to logout of active Tautulli sessions from the login logs.
* API:
* Fix: Update edit_user and edit_library doc strings for required parameters. (#1432)
* Other:
* New: Added advanced hidden setting for CherryPy thread pool size. (Thanks @psaab #1425)
## v2.7.2 (2021-04-24)
* UI:
* New: Show smart collections in the library collections tab.
## v2.7.1 (2021-04-22)
* Notifications:
* Fix: Recently added single episode being sent as a show notification. (#1420)
* Newsletters:
* Change: Ignore items with incorrect added at dates in the future.
* Exporter:
* Fix: Exporting not working for libraries, collections, and playlists. (#1408)
* UI:
* Fix: Collections and playlist tabs not loading on library and user pages. (#1408)
* Fix: Header overlapping graphs tabs on mobile layout.
* Change: Rename "Plays by Period" graph tab to "Media Type".
* Removed: Clear logs button removed from main Tautulli logs.
## v2.7.0 (2021-04-10)
* History:
* New: Added transcode decision filter added to history tables.
* New: History table filters changed to allow multiple selections.
* Notifications:
* Fix: Recently added notifications failing due to metadata not being available yet on the Plex server. (#1392)
* New: Added separate SSL/TLS support for Email notifications.
* New: Added notification image type setting for Tautulli Remote App notifications.
* New: Added guid notification parameter.
* New: Added a Plex server down notification threshold setting.
* Newsletters:
* Fix: Newsletters would fail if an episode was missing a season number.
* UI:
* Fix: Fixed spacing of rating images on the media info pages.
* Fix: Fixed refreshing cached image in the browser.
* Fix: Bootstrap tooltips logging javascript errors in some instances.
* Fix: Activity card progress bar not filling at 100%. (#1404)
* New: Added blurred background to the Most Active Users statistics card.
* New: Added transcode decision filter for all history tables.
* New: Added an error popup message if the Plex.tv token is no longer valid when visiting the settings page.
* New: Added Amazon Alexa platform logo.
* Change: Improved loading times for the homepage watch statistics.
* Change: Improved loading times for user and library watch time statistics.
* Change: Improved loading of the graph's history modal popup.
* Change: Automatically trim trailing slashes from the Tautulli Public Domain setting.
* Change: Renamed the Plex Media Server "Use SSL" setting to "Use Secure Connection".
* Change: Update Microsoft Edge platform logo.
* Change: Consider link local IP addresses as local addresses.
* Change: Reveal token fields if they are blank to make it easier to input new values.
* Mobile App:
* New: Accept disabled OneSignal ID during device registration.
* API:
* New: Added user fallback image option to the pms_image_proxy command.
* New: Added optional include_last_seen parameter to the get_user command.
* New: Added optional include_last_accessed parameter to the get_library command.
* New: Allow comma separated filter values for the get_history command.
* Other:
* Fix: Importing the newsletter table would fail when manually repairing a corrupted database.
* Fix: Make fix match in Tautulli for music case-insensitive.
* New: Update PlexAPI to 4.5.2.
* Change: Migrate section_id from the session_history_metadata database table to session_history.
* Change: Copy the database file to the cache folder when importing a database using the browse option.
* Change: Delete the cached database file after successfully importing.
## v2.6.10 (2021-03-17)
* Other:
* Fix: Configuration upgrade would fail if the Most Active User card was disabled. (#1395)
## v2.6.9 (2021-03-17)
* Notifications:
* New: Added tautulli_update_exe and tautulli_update_exe notification parameters for Tautulli update notifications.
* Exporter:
* New: Added new TV show export fields for the beta Plex TV agent.
* UI:
* Fix: Some popover images not showing up on hover. (#1391)
* Remove: HTTP Host setting removed from the UI. This setting may still be changed in the config file.
* New: Added a Most Active Libraries statistics card to the homepage. (Thanks @herby2212)
* New: Mask sensitive text fields in the settings. Settings can be revealed by clicking on the eye icon.
* Mobile App:
* Change: Make OneSignal validation asynchronous to help timeout issues when registering a device.
* API:
* Added top_libraries stat_id option to get_home_stats API commaand.
* Ohter:
* New: Updated PlexAPI to 4.4.1.
## v2.6.8 (2021-03-08)
* Mobile App:
* New: An all new Tautulli Remote App 2.0. Go to the Google Play link in the settings to download the new version.
* Fix: Registering the new app would fail if OneSignal is blocked.
## v2.6.7 (2021-03-07)
* History:
* New: Added audio language to detailed stream info. (Thanks @herby2212)
* Notifications:
* New: Added season_name notification parameter.
* New: Update notifications to support custom season titles.
* Newsletters:
* New: Update recently added newsletter template to support custom season titles.
* Exporter:
* New: Added originalTitle and bannerFile to TV show export fields.
* UI:
* New: Added TVDB rating image to info page for the new Plex TV agent.
* New: Update the UI to support custom season titles.
* API:
* Fix: Return rating key for collections/playlists in get_synced_items.
* Fix: Return error when delete_synced_item fails.
* New: Return sync_media_type for collections/playlist in get_synced_items.
* New: Update pms_image_proxy to support playlist composite images.
* Other:
* Remove: Auto-updater for the Windows exe installer due to it being flagged by antivirus software.
* New: Updated PlexAPI to 4.4.0.
## v2.6.6 (2021-02-06)
* Exporter:
* Fix: Exporting failed with long file paths on Windows.
* New: Updated various exporter fields.
* Change: Renamed collection children to collection items.
* UI:
* Fix: Client side login redirect changed to server side.
* Change: Renamed "Fix Metadata" button to "Fix Match".
* API:
* New: Added get_children_metadata API command.
* New: Return more metadata from the get_home_stats API command.
* Other:
* New: Updated PlexAPI to 4.3.1.
## v2.6.5 (2021-01-09)
* Other:
* Fix: Some IP addresses not being masked in the logs.
* New: Auto-updater for Windows exe installer.
* Change: Allow Snap package to access the user home directory.
* Change: Migrate Snap user data to a persistent location that is retained if Tautulli is reinstalled.
## v2.6.4 (2020-12-20)
* Other:
* Fix: Restore Snap data folder from previous installs.
## v2.6.3 (2020-12-19)
* Announcements:

View file

@ -9,12 +9,12 @@ All pull requests should be based on the `nightly` branch, to minimize cross mer
### Python Code
#### Compatibility
The code should work with Python 2.7.17 or Python 3.6+. Note that Tautulli runs on many different platforms.
The code should work with Python 3.8+. Note that Tautulli runs on many different platforms.
Re-use existing code. Do not hesitate to add logging in your code. You can the logger module `plexpy.logger.*` for this. Web requests are invoked via `plexpy.request.*` and derived ones. Use these methods to automatically add proper and meaningful error handling.
#### Code conventions
Although Tautulli did not adapt a code convention in the past, we try to follow the [PEP8](http://legacy.python.org/dev/peps/pep-0008/) conventions for future code. A short summary to remind you (copied from http://wiki.ros.org/PyStyleGuide):
Although Tautulli did not adopt a code convention in the past, we try to follow [PEP8](http://legacy.python.org/dev/peps/pep-0008/) conventions for future code. A short summary to remind you (copied from http://wiki.ros.org/PyStyleGuide):
* 4 space indentation
* 80 characters per line

View file

@ -1,4 +1,4 @@
FROM tautulli/tautulli-baseimage:python3
FROM ghcr.io/tautulli/tautulli-baseimage:python3
LABEL maintainer="Tautulli"
@ -9,18 +9,20 @@ ENV TAUTULLI_DOCKER=True
ENV TZ=UTC
WORKDIR /app
COPY . /app
RUN \
groupadd -g 1000 tautulli && \
useradd -u 1000 -g 1000 tautulli && \
echo ${BRANCH} > /app/branch.txt && \
echo ${COMMIT} > /app/version.txt
COPY . /app
RUN \
mkdir /config && \
touch /config/DOCKER
VOLUME /config
CMD [ "python", "Tautulli.py", "--datadir", "/config" ]
ENTRYPOINT [ "./start.sh" ]
VOLUME /config
EXPOSE 8181
HEALTHCHECK --start-period=90s CMD curl -ILfSs http://localhost:8181/status > /dev/null || curl -ILfkSs https://localhost:8181/status > /dev/null || exit 1
HEALTHCHECK --start-period=90s CMD curl -ILfks https://localhost:8181/status > /dev/null || curl -ILfs http://localhost:8181/status > /dev/null || exit 1

177
README.md
View file

@ -1,66 +1,163 @@
# Tautulli
A python based web application for monitoring, analytics and notifications for [Plex Media Server](https://plex.tv).
A python based web application for monitoring, analytics and notifications for
[Plex Media Server](https://plex.tv).
This project is based on code from [Headphones](https://github.com/rembo10/headphones) and [PlexWatchWeb](https://github.com/ecleese/plexWatchWeb).
This project is based on code from [Headphones](https://github.com/rembo10/headphones)
and [PlexWatchWeb](https://github.com/ecleese/plexWatchWeb).
## Features
* Responsive web design viewable on desktop, tablet and mobile web browsers.
* Themed to complement Plex/Web.
* Easy configuration setup (no separate web server required).
* Monitor current Plex Media Server activity.
* Fully customizable notifications for stream activity and recently added media.
* Top statistics on home page with configurable duration and measurement metric.
* Global watching history with search/filtering & dynamic column sorting.
* Full user list with general information and comparison stats.
* Individual user information including devices IP addresses.
* Complete library statistics and media file information.
* Rich analytics presented using Highcharts graphing.
* Beautiful content information pages.
* Full sync list data on all users syncing items from your library.
* And many more!!
- Responsive web design viewable on desktop, tablet and mobile web browsers.
- Themed to complement Plex/Web.
- Easy configuration setup (no separate web server required).
- Monitor current Plex Media Server activity.
- Fully customizable notifications for stream activity and recently added media.
- Top statistics on home page with configurable duration and measurement metric.
- Global watching history with search/filtering & dynamic column sorting.
- Full user list with general information and comparison stats.
- Individual user information including devices IP addresses.
- Complete library statistics and media file information.
- Rich analytics presented using Highcharts graphing.
- Beautiful content information pages.
- Full sync list data on all users syncing items from your library.
- And many more!!
## Preview
* [Full preview gallery available on our website](https://tautulli.com)
[Full preview gallery available on our website][Tautulli]
![Tautulli Homepage](https://tautulli.com/images/screenshots/activity-compressed.jpg?v=2)
## Installation & Support
## Installation
[![Python](https://img.shields.io/badge/python-2.7.17,%203.6,%203.7,%203.8-blue?style=flat-square)](https://python.org/downloads)
[![Docker Pulls](https://img.shields.io/docker/pulls/tautulli/tautulli?style=flat-square)](https://hub.docker.com/r/tautulli/tautulli)
[![Docker Stars](https://img.shields.io/docker/stars/tautulli/tautulli?style=flat-square)](https://hub.docker.com/r/tautulli/tautulli)
[![Downloads](https://img.shields.io/github/downloads/Tautulli/Tautulli/total?style=flat-square)](https://github.com/Tautulli/Tautulli/releases/latest)
[![Python][badge-python]][Python]
[![Docker Pulls][badge-docker-pulls]][DockerHub]
[![Docker Stars][badge-docker-stars]][DockerHub]
[![Downloads][badge-downloads]][Releases Latest]
[badge-python]: https://img.shields.io/badge/python->=3.9-blue?style=flat-square
[badge-docker-pulls]: https://img.shields.io/docker/pulls/tautulli/tautulli?style=flat-square
[badge-docker-stars]: https://img.shields.io/docker/stars/tautulli/tautulli?style=flat-square
[badge-downloads]: https://img.shields.io/github/downloads/Tautulli/Tautulli/total?style=flat-square
| Status | Branch: `master` | Branch: `beta` | Branch: `nightly` |
| --- | --- | --- | --- |
| Release | [![Release@master](https://img.shields.io/github/v/release/Tautulli/Tautulli?style=flat-square)](https://github.com/Tautulli/Tautulli/releases/latest) <br> [![Release Date@master](https://img.shields.io/github/release-date/Tautulli/Tautulli?style=flat-square&color=blue)](https://github.com/Tautulli/Tautulli/releases/latest) | [![Release@beta](https://img.shields.io/github/v/release/Tautulli/Tautulli?include_prereleases&style=flat-square)](https://github.com/Tautulli/Tautulli/releases) <br> [![Commits@beta](https://img.shields.io/github/commits-since/Tautulli/Tautulli/latest/beta?style=flat-square&color=blue)](https://github.com/Tautulli/Tautulli/commits/beta) | [![Last Commits@nightly](https://img.shields.io/github/last-commit/Tautulli/Tautulli/nightly?style=flat-square&color=blue)](https://github.com/Tautulli/Tautulli/commits/nightly) <br> [![Commits@nightly](https://img.shields.io/github/commits-since/Tautulli/Tautulli/latest/nightly?style=flat-square&color=blue)](https://github.com/Tautulli/Tautulli/commits/nightly) |
| Docker | [![Docker@master](https://img.shields.io/badge/docker-latest-blue?style=flat-square)](https://hub.docker.com/r/tautulli/tautulli) <br> [![Docker Build@master](https://img.shields.io/github/workflow/status/Tautulli/Tautulli/Publish%20Docker/master?style=flat-square)](https://github.com/Tautulli/Tautulli/actions?query=workflow%3A"Publish+Docker"+branch%3Amaster) | [![Docker@beta](https://img.shields.io/badge/docker-beta-blue?style=flat-square)](https://hub.docker.com/r/tautulli/tautulli) <br> [![Docker Build@beta](https://img.shields.io/github/workflow/status/Tautulli/Tautulli/Publish%20Docker/beta?style=flat-square)](https://github.com/Tautulli/Tautulli/actions?query=workflow%3A"Publish+Docker"+branch%3Abeta) | [![Docker@nightly](https://img.shields.io/badge/docker-nightly-blue?style=flat-square)](https://hub.docker.com/r/tautulli/tautulli) <br> [![Docker Build@nightly](https://img.shields.io/github/workflow/status/Tautulli/Tautulli/Publish%20Docker/nightly?style=flat-square)](https://github.com/Tautulli/Tautulli/actions?query=workflow%3A"Publish+Docker"+branch%3Anightly) |
| Snap | [![Snap@master](https://img.shields.io/badge/snap-stable-blue?style=flat-square)](https://snapcraft.io/tautulli) <br> [![Snap Build@master](https://img.shields.io/github/workflow/status/Tautulli/Tautulli/Publish%20Snap/master?style=flat-square)](https://github.com/Tautulli/Tautulli/actions?query=workflow%3A"Publish+Snap"+branch%3Amaster) | [![Snap@beta](https://img.shields.io/badge/snap-beta-blue?style=flat-square)](https://snapcraft.io/tautulli) <br> [![Snap Build@beta](https://img.shields.io/github/workflow/status/Tautulli/Tautulli/Publish%20Snap/beta?style=flat-square)](https://github.com/Tautulli/Tautulli/actions?query=workflow%3A"Publish+Snap"+branch%3Abeta) | [![Snap@nightly](https://img.shields.io/badge/snap-edge-blue?style=flat-square)](https://snapcraft.io/tautulli) <br> [![Snap Build@nightly](https://img.shields.io/github/workflow/status/Tautulli/Tautulli/Publish%20Snap/nightly?style=flat-square)](https://github.com/Tautulli/Tautulli/actions?query=workflow%3A"Publish+Snap"+branch%3Anightly) |
| Installer | [![Windows@master](https://img.shields.io/github/v/release/Tautulli/Tautulli?label=windows&style=flat-square)](https://github.com/Tautulli/Tautulli/releases/latest) <br> [![MacOS@master](https://img.shields.io/github/v/release/Tautulli/Tautulli?label=macos&style=flat-square)](https://github.com/Tautulli/Tautulli/releases/latest) <br> [![Installer Build@master](https://img.shields.io/github/workflow/status/Tautulli/Tautulli/Publish%20Installers/master?style=flat-square)](https://github.com/Tautulli/Tautulli/actions?query=workflow%3A"Publish+Installers"+branch%3Amaster) | [![Windows@beta](https://img.shields.io/github/v/release/Tautulli/Tautulli?label=windows&include_prereleases&style=flat-square)](https://github.com/Tautulli/Tautulli/releases) <br> [![MacOS@beta](https://img.shields.io/github/v/release/Tautulli/Tautulli?label=macos&include_prereleases&style=flat-square)](https://github.com/Tautulli/Tautulli/releases) <br> [![Installer Build@beta](https://img.shields.io/github/workflow/status/Tautulli/Tautulli/Publish%20Installers/beta?style=flat-square)](https://github.com/Tautulli/Tautulli/actions?query=workflow%3A"Publish+Installers"+branch%3Abeta) | [![Installer Build@nightly](https://img.shields.io/github/workflow/status/Tautulli/Tautulli/Publish%20Installers/nightly?style=flat-square)](https://github.com/Tautulli/Tautulli/actions?query=workflow%3A"Publish+Installers"+branch%3Anightly) |
| Release | [![Release@master][badge-release-master]][Releases Latest] <br> [![Release Date@master][badge-release-master-date]][Releases Latest] | [![Release@beta][badge-release-beta]][Releases] <br> [![Commits@beta][badge-release-beta-commits]][Commits Beta] | [![Last Commits@nightly][badge-release-nightly-last-commit]][commits Nightly] <br> [![Commits@nightly][badge-release-nightly-commits]][Commits Nightly] |
| Docker | [![Docker@master][badge-docker-master]][DockerHub] <br> [![Docker Build@master][badge-docker-master-ci]][Publish Docker Master] | [![Docker@beta][badge-docker-beta]][DockerHub] <br> [![Docker Build@beta][badge-docker-beta-ci]][Publish Docker Beta] | [![Docker@nightly][badge-docker-nightly]][DockerHub] <br> [![Docker Build@nightly][badge-docker-nightly-ci]][Publish Docker Nightly] |
| Snap | [![Snap@master][badge-snap-master]][Snapcraft] <br> [![Snap Build@master][badge-snap-master-ci]][Publish Snap Master] | [![Snap@beta][badge-snap-beta]][Snapcraft] <br> [![Snap Build@beta][badge-snap-beta-ci]][Publish Snap Beta] | [![Snap@nightly][badge-snap-nightly]][Snapcraft] <br> [![Snap Build@nightly][badge-snap-nightly-ci]][Publish Snap Nightly] |
| Installer | [![Windows@master][badge-installer-master-win]][Releases Latest] <br> [![MacOS@master][badge-installer-master-macos]][Releases Latest] <br> [![Installer Build@master][badge-installer-master-ci]][Publish Installer Master] | [![Windows@beta][badge-installer-beta-win]][Releases] <br> [![MacOS@beta][badge-installer-beta-macos]][Releases] <br> [![Installer Build@beta][badge-installer-beta-ci]][Publish Installer Beta] | [![Installer Build@nightly][badge-installer-nightly-ci]][Publish Installer Nightly] |
[![Wiki](https://img.shields.io/badge/github-wiki-black?style=flat-square)](https://github.com/Tautulli/Tautulli-Wiki/wiki)
[![Discord](https://img.shields.io/discord/183396325142822912?label=discord&style=flat-square&color=7289DA)](https://tautulli.com/discord)
[![Reddit](https://img.shields.io/reddit/subreddit-subscribers/tautulli?label=reddit&style=flat-square&color=FF5700)](https://www.reddit.com/r/Tautulli/)
[![Plex Forums](https://img.shields.io/badge/plex%20forums-discussion-E5A00D?style=flat-square)](https://forums.plex.tv/t/tautulli-monitor-your-plex-media-server/225242)
Read the [Installation Guides][Installation] for instructions on how to install Tautulli.
* Read the [Installation Guides](https://github.com/Tautulli/Tautulli-Wiki/wiki/Installation) for instructions to install Tautulli.
* The [Frequently Asked Questions](https://github.com/Tautulli/Tautulli-Wiki/wiki/Frequently-Asked-Questions) in the wiki can help you with common problems.
* Support is available on [Discord](https://tautulli.com/discord), [Reddit](https://www.reddit.com/r/Tautulli), or the [Plex Forums](https://forums.plex.tv/t/tautulli-monitor-your-plex-media-server/225242).
[badge-release-master]: https://img.shields.io/github/v/release/Tautulli/Tautulli?style=flat-square
[badge-release-master-date]: https://img.shields.io/github/release-date/Tautulli/Tautulli?style=flat-square&color=blue
[badge-release-beta]: https://img.shields.io/github/v/release/Tautulli/Tautulli?include_prereleases&style=flat-square
[badge-release-beta-commits]: https://img.shields.io/github/commits-since/Tautulli/Tautulli/latest/beta?style=flat-square&color=blue
[badge-release-nightly-last-commit]: https://img.shields.io/github/last-commit/Tautulli/Tautulli/nightly?style=flat-square&color=blue
[badge-release-nightly-commits]: https://img.shields.io/github/commits-since/Tautulli/Tautulli/latest/nightly?style=flat-square&color=blue
[badge-docker-master]: https://img.shields.io/badge/docker-latest-blue?style=flat-square
[badge-docker-master-ci]: https://img.shields.io/github/actions/workflow/status/Tautulli/Tautulli/.github/workflows/publish-docker.yml?style=flat-square&branch=master
[badge-docker-beta]: https://img.shields.io/badge/docker-beta-blue?style=flat-square
[badge-docker-beta-ci]: https://img.shields.io/github/actions/workflow/status/Tautulli/Tautulli/.github/workflows/publish-docker.yml?style=flat-square&branch=beta
[badge-docker-nightly]: https://img.shields.io/badge/docker-nightly-blue?style=flat-square
[badge-docker-nightly-ci]: https://img.shields.io/github/actions/workflow/status/Tautulli/Tautulli/.github/workflows/publish-docker.yml?style=flat-square&branch=nightly
[badge-snap-master]: https://img.shields.io/badge/snap-stable-blue?style=flat-square
[badge-snap-master-ci]: https://img.shields.io/github/actions/workflow/status/Tautulli/Tautulli/.github/workflows/publish-snap.yml?style=flat-square&branch=master
[badge-snap-beta]: https://img.shields.io/badge/snap-beta-blue?style=flat-square
[badge-snap-beta-ci]: https://img.shields.io/github/actions/workflow/status/Tautulli/Tautulli/.github/workflows/publish-snap.yml?style=flat-square&branch=beta
[badge-snap-nightly]: https://img.shields.io/badge/snap-edge-blue?style=flat-square
[badge-snap-nightly-ci]: https://img.shields.io/github/actions/workflow/status/Tautulli/Tautulli/.github/workflows/publish-snap.yml?style=flat-square&branch=nightly
[badge-installer-master-win]: https://img.shields.io/github/v/release/Tautulli/Tautulli?label=windows&style=flat-square
[badge-installer-master-macos]: https://img.shields.io/github/v/release/Tautulli/Tautulli?label=macos&style=flat-square
[badge-installer-master-ci]: https://img.shields.io/github/actions/workflow/status/Tautulli/Tautulli/.github/workflows/publish-installers.yml?style=flat-square&branch=master
[badge-installer-beta-win]: https://img.shields.io/github/v/release/Tautulli/Tautulli?label=windows&include_prereleases&style=flat-square
[badge-installer-beta-macos]: https://img.shields.io/github/v/release/Tautulli/Tautulli?label=macos&include_prereleases&style=flat-square
[badge-installer-beta-ci]: https://img.shields.io/github/actions/workflow/status/Tautulli/Tautulli/.github/workflows/publish-installers.yml?style=flat-square&branch=beta
[badge-installer-nightly-ci]: https://img.shields.io/github/actions/workflow/status/Tautulli/Tautulli/.github/workflows/publish-installers.yml?style=flat-square&branch=nightly
## Issues & Feature Requests
## Support
[![Issues](https://img.shields.io/badge/github-issues-red?style=flat-square)](https://github.com/Tautulli/Tautulli-Issues)
[![Feathub](https://img.shields.io/badge/feathub-requests-lightgrey?style=flat-square)](https://feathub.com/Tautulli/Tautulli)
[![Wiki][badge-wiki]][Wiki]
[![Discord][badge-discord]][Discord]
[![Reddit][badge-reddit]][Reddit]
[![Plex Forums][badge-forums]][Plex Forums]
[![Issues][badge-issues]][Issues]
* Please see the [Issues Repository](https://github.com/Tautulli/Tautulli-Issues).
[badge-wiki]: https://img.shields.io/badge/github-wiki-black?style=flat-square
[badge-discord]: https://img.shields.io/discord/183396325142822912?label=discord&style=flat-square&color=7289DA
[badge-reddit]: https://img.shields.io/reddit/subreddit-subscribers/tautulli?label=reddit&style=flat-square&color=FF5700
[badge-forums]: https://img.shields.io/badge/plex%20forums-discussion-E5A00D?style=flat-square
[badge-issues]: https://img.shields.io/badge/github-issues-black?style=flat-square
If you think you've found a bug in Tautulli make sure you have read the [FAQ][]
first to make sure it hasn't been covered by one of the questions there. If your
problem isn't answered in the FAQ try the following first:
- Update to the latest version of Tautulli.
- Turning your device off and on again.
- Analyzing your logs, you just might find the solution yourself!
- Using the **search** function to see if this issue has already been reported/solved.
- Checking the [Wiki][] for [Installation][] instructions and reading the [FAQs][FAQ].
- For basic questions try asking on [Discord][], [Reddit][],
or the [Plex Forums][] first before opening an issue.
**If nothing has worked:**
1. Please check the [issues tracker][Issues] to see if someone else has already reported the bug.
2. If this is a new bug, open a [bug report][Issue New] on the issues tracker.
3. Provide a clear title to easily help identify your problem.
4. Use proper [Markdown syntax][] to structure your post (i.e. code/log in code blocks).
5. Make sure to fill out the required information on the issue template.
6. Close your issue when it's solved! If you found the solution yourself please
comment so that others benefit from it.
## Feature Requests
1. Pleases check the [issues tracker][Issues] to see if someone else has already requested the feature.
If a similar idea has already been requested, _give it a thumbs up_. **Do not comment
with `+1` or something similar as it creates unnecessary spam.**
2. If this is a new feature request, open a [feature request][Issue New] on the issues tracker.
## License
[![License](https://img.shields.io/github/license/Tautulli/Tautulli?style=flat-square)](https://github.com/Tautulli/Tautulli/blob/master/LICENSE)
[![License][badge-license]][License]
This is free software under the GPL v3 open source license. Feel free to do with it what you wish, but any modification must be open sourced. A copy of the license is included.
[badge-license]: https://img.shields.io/github/license/Tautulli/Tautulli?style=flat-square
This software includes Highsoft software libraries which you may freely distribute for non-commercial use. Commerical users must licence this software, for more information visit https://shop.highsoft.com/faq/non-commercial#non-commercial-redistribution.
This is free software under the GPL v3 open source license. Feel free to do with it what you wish,
but any modification must be open sourced. A copy of the license is included.
This software includes Highsoft software libraries which you may freely distribute for
non-commercial use. Commercial users must licence this software, for more information visit
https://shop.highsoft.com/faq/non-commercial#non-commercial-redistribution.
[Python]: https://python.org/downloads
[DockerHub]: https://hub.docker.com/r/tautulli/tautulli
[Releases]: https://github.com/Tautulli/Tautulli/releases
[Releases Latest]: https://github.com/Tautulli/Tautulli/releases/latest
[License]: https://github.com/Tautulli/Tautulli/blob/master/LICENSE
[FAQ]: https://github.com/Tautulli/Tautulli/wiki/Frequently-Asked-Questions
[Installation]: https://github.com/Tautulli/Tautulli/wiki/Installation
[Issues]: https://github.com/Tautulli/Tautulli/issues
[Issue New]: https://github.com/Tautulli/Tautulli/issues/new/choose
[Markdown syntax]: https://help.github.com/articles/github-flavored-markdown
[Tautulli]: http://tautulli.com
[Wiki]: https://github.com/Tautulli/Tautulli/wiki
[Discord]: https://tautulli.com/discord
[Reddit]: https://reddit.com/r/Tautulli
[Plex Forums]: https://forums.plex.tv/t/tautulli-monitor-your-plex-media-server/225242
[Snapcraft]: https://snapcraft.io/tautulli
[Commits Beta]: https://github.com/Tautulli/Tautulli/commits/beta
[Commits Nightly]: https://github.com/Tautulli/Tautulli/commits/nightly
[Publish Docker Master]: https://github.com/Tautulli/Tautulli/actions?query=workflow%3A"Publish+Docker"+branch%3Amaster
[Publish Docker Beta]: https://github.com/Tautulli/Tautulli/actions?query=workflow%3A"Publish+Docker"+branch%3Abeta
[Publish Docker Nightly]: https://github.com/Tautulli/Tautulli/actions?query=workflow%3A"Publish+Docker"+branch%3Anightly
[Publish Snap Master]: https://github.com/Tautulli/Tautulli/actions?query=workflow%3A"Publish+Snap"+branch%3Amaster
[Publish Snap Beta]: https://github.com/Tautulli/Tautulli/actions?query=workflow%3A"Publish+Snap"+branch%3Abeta
[Publish Snap Nightly]: https://github.com/Tautulli/Tautulli/actions?query=workflow%3A"Publish+Snap"+branch%3Anightly
[Publish Installer Master]: https://github.com/Tautulli/Tautulli/actions?query=workflow%3A"Publish+Installers"+branch%3Amaster
[Publish Installer Beta]: https://github.com/Tautulli/Tautulli/actions?query=workflow%3A"Publish+Installers"+branch%3Abeta
[Publish Installer Nightly]: https://github.com/Tautulli/Tautulli/actions?query=workflow%3A"Publish+Installers"+branch%3Anightly

View file

@ -23,17 +23,18 @@ import sys
# Ensure lib added to path, before any other imports
sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), 'lib'))
from future.builtins import str
import appdirs
import argparse
import datetime
import locale
import platformdirs
import pytz
import signal
import shutil
import time
import threading
import tzlocal
import ctypes
import plexpy
from plexpy import common, config, database, helpers, logger, webstart
@ -69,8 +70,26 @@ def main():
plexpy.SYS_ENCODING = None
try:
locale.setlocale(locale.LC_ALL, "")
plexpy.SYS_LANGUAGE, plexpy.SYS_ENCODING = locale.getdefaultlocale()
# Attempt to get the system's locale settings
language_code, encoding = locale.getlocale()
# Special handling for Windows platform
if sys.platform == 'win32':
# Get the user's current language settings on Windows
windll = ctypes.windll.kernel32
lang_id = windll.GetUserDefaultLCID()
# Map Windows language ID to locale identifier
language_code = locale.windows_locale.get(lang_id, '')
# Get the preferred encoding
encoding = locale.getpreferredencoding()
# Assign values to application-specific variable
plexpy.SYS_LANGUAGE = language_code
plexpy.SYS_ENCODING = encoding
except (locale.Error, IOError):
pass
@ -110,7 +129,7 @@ def main():
if args.quiet:
plexpy.QUIET = True
# Do an intial setup of the logger.
# Do an initial setup of the logger.
# Require verbose for pre-initilization to see critical errors
logger.initLogger(console=not plexpy.QUIET, log_dir=False, verbose=True)
@ -124,6 +143,7 @@ def main():
if helpers.bool_true(os.getenv('TAUTULLI_DOCKER', False)):
plexpy.DOCKER = True
plexpy.DOCKER_MOUNT = not os.path.isfile('/config/DOCKER')
if helpers.bool_true(os.getenv('TAUTULLI_SNAP', False)):
plexpy.SNAP = True
@ -184,10 +204,19 @@ def main():
if args.datadir:
plexpy.DATA_DIR = args.datadir
elif plexpy.FROZEN:
plexpy.DATA_DIR = appdirs.user_data_dir("Tautulli", False)
plexpy.DATA_DIR = platformdirs.user_data_dir("Tautulli", False)
else:
plexpy.DATA_DIR = plexpy.PROG_DIR
# Migrate Snap data dir
if plexpy.SNAP:
snap_common = os.environ['SNAP_COMMON']
old_data_dir = os.path.join(snap_common, 'Tautulli')
if os.path.exists(old_data_dir) and os.listdir(old_data_dir):
plexpy.SNAP_MIGRATE = True
logger.info("Migrating Snap user data.")
shutil.move(old_data_dir, plexpy.DATA_DIR)
if args.config:
config_file = args.config
else:
@ -202,9 +231,18 @@ def main():
'Could not create data directory: ' + plexpy.DATA_DIR + '. Exiting....')
# Make sure the DATA_DIR is writeable
if not os.access(plexpy.DATA_DIR, os.W_OK):
test_file = os.path.join(plexpy.DATA_DIR, '.TEST')
try:
with open(test_file, 'w'):
pass
except IOError:
raise SystemExit(
'Cannot write to the data directory: ' + plexpy.DATA_DIR + '. Exiting...')
finally:
try:
os.remove(test_file)
except OSError:
pass
# Put the database in the DATA_DIR
plexpy.DB_FILE = os.path.join(plexpy.DATA_DIR, database.FILENAME)
@ -226,23 +264,13 @@ def main():
# Start the background threads
plexpy.start()
# Force the http port if neccessary
# Force the http port if necessary
if args.port:
plexpy.HTTP_PORT = args.port
logger.info('Using forced web server port: %i', plexpy.HTTP_PORT)
else:
plexpy.HTTP_PORT = int(plexpy.CONFIG.HTTP_PORT)
# Check if pyOpenSSL is installed. It is required for certificate generation
# and for CherryPy.
if plexpy.CONFIG.ENABLE_HTTPS:
try:
import OpenSSL
except ImportError:
logger.warn("The pyOpenSSL module is missing. Install this "
"module to enable HTTPS. HTTPS will be disabled.")
plexpy.CONFIG.ENABLE_HTTPS = False
# Try to start the server. Will exit here is address is already in use.
webstart.start()

11
contrib/clean_pyc.bat Executable file
View file

@ -0,0 +1,11 @@
@echo off
:: Display information
echo This script will remove *.pyc files. These files are generated by Python, but they can cause conflicts after an upgrade. It's safe to remove them, because they will be regenerated.
echo Press enter to continue, or CTRL + C to quit.
pause
cd ..\
:: Remove *.pyc files
del /S *.pyc
:: Remove __pycache__ folders
for /d /r . %%d in (__pycache__) do @if exist "%%d" rd /s /q "%%d"

View file

@ -5,5 +5,7 @@ echo "This script will remove *.pyc files. These files are generated by Python,
echo "Press enter to continue, or CTRL + C to quit."
read
# Remove the *.pyc
find "`dirname $0`/.." -type f -name "*.pyc" -exec rm -rf {} \;
# Remove *.pyc files
find "`dirname $0`/.." -type f -name "*.pyc" -exec rm -rf {} \;
# Remove __pycache__ folders
find "`dirname $0`/.." -type d -name "__pycache__" -exec rm -rf {} \;

View file

@ -32,7 +32,7 @@
</div>
</div>
</div>
<p class="help-block">Upload the ${app} database file you wish to import.</p>
<p class="help-block">Upload the ${app} database file you wish to import (max file size is 1GB).</p>
</div>
<div class="form-group">
<label for="import_database_path">Option 2: Browse for a Database File</label>

View file

@ -13,6 +13,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="">
<meta name="author" content="">
<meta name="referrer" content="no-referrer">
<link href="${http_root}css/bootstrap3/bootstrap.min.css" rel="stylesheet">
<link href="${http_root}css/pnotify.custom.min.css" rel="stylesheet" />
<link href="${http_root}css/selectize.bootstrap3.css" rel="stylesheet" />
@ -30,7 +31,7 @@
<!-- ICONS -->
<!-- Android -->
<link rel="manifest" href="${http_root}images/favicon/manifest.json?v=2.6.0" crossorigin="use-credentials">
<link rel="manifest" href="${http_root}images/favicon/manifest.json?v=2.9.0" crossorigin="use-credentials">
<meta name="theme-color" content="#282a2d">
<!-- Apple -->
<link rel="apple-touch-icon" sizes="180x180" href="${http_root}images/favicon/apple-touch-icon.png?v=2.6.0">
@ -86,7 +87,7 @@
</div>
<div class="collapse navbar-collapse navbar-right" id="navbar-collapse-1">
<ul class="nav navbar-nav">
<li class="hidden-sm hidden-xs">
<li>
<form action="search" method="post" class="form" id="search_form">
<div class="input-group">
<span class="input-textbox">
@ -123,11 +124,6 @@
% else:
<li><a href="graphs">Graphs</a></li>
% endif
% if title == "Synced Items":
<li class="active"><a href="sync">Synced Items</a></li>
% else:
<li><a href="sync">Synced Items</a></li>
% endif
% if title == "Settings":
<li class="dropdown active">
% else:
@ -140,7 +136,7 @@
<li><a href="settings"><i class="fa fa-fw fa-cogs"></i> Settings</a></li>
<li role="separator" class="divider"></li>
<li><a href="logs"><i class="fa fa-fw fa-list-alt"></i> View Logs</a></li>
<li><a href="${anon_url('https://github.com/%s/%s-Wiki/wiki/Frequently-Asked-Questions' % (plexpy.CONFIG.GIT_USER, plexpy.CONFIG.GIT_REPO))}" target="_blank" rel="noreferrer"><i class="fa fa-fw fa-question-circle"></i> FAQ</a></li>
<li><a href="${anon_url('https://github.com/%s/%s/wiki/Frequently-Asked-Questions' % (plexpy.CONFIG.GIT_USER, plexpy.CONFIG.GIT_REPO))}" target="_blank" rel="noreferrer"><i class="fa fa-fw fa-question-circle"></i> FAQ</a></li>
<li><a href="support"><i class="fa fa-fw fa-comment"></i> Support</a></li>
<li role="separator" class="divider"></li>
<li><a href="#" data-target="#donate-modal" data-toggle="modal"><i class="fa fa-fw fa-heart"></i> Donate</a></li>
@ -236,31 +232,70 @@ ${next.modalIncludes()}
<ul id="donation_type" class="nav nav-pills" role="tablist" style="display: flex; justify-content: center; margin: 10px 0;">
<li class="active"><a href="#github-donation" role="tab" data-toggle="tab">GitHub</a></li>
<li><a href="#patreon-donation" role="tab" data-toggle="tab">Patreon</a></li>
<li><a href="#stripe-donation" role="tab" data-toggle="tab">Stripe</a></li>
<li><a href="#paypal-donation" role="tab" data-toggle="tab">PayPal</a></li>
<li><a href="#crypto-donation" role="tab" data-toggle="tab" id="crypto-donation-tab">Crypto</a></li>
</ul>
<div class="tab-content">
<div role="tabpanel" class="tab-pane active" id="github-donation" style="text-align: center">
<p>
Click the button below to continue to GitHub.
</p>
<a href="${anon_url('https://github.com/sponsors/JonnyWong16')}" target="_blank" rel="noreferrer" class="btn btn-sm btn-default" style="font-weight: 600;">
<i class="fa fa-heart fa-sm" style="color: #ea4aaa;"></i>&nbsp; Sponsor
</a>
<p>
<a href="${anon_url('https://github.com/sponsors/JonnyWong16')}" target="_blank" rel="noreferrer" class="btn btn-sm btn-default" style="font-weight: 600;">
<i class="fa fa-heart fa-sm" style="color: #ea4aaa;"></i>&nbsp; Sponsor
</a>
</p>
<p class="small-muted">(GitHub does not have a fee)</p>
</div>
<div role="tabpanel" class="tab-pane" id="patreon-donation" style="text-align: center">
<p>
Click the button below to continue to Patreon.
</p>
<a href="${anon_url('https://www.patreon.com/join/tautulli')}" target="_blank" rel="noreferrer">
<img src="images/become_a_patron_button.png" alt="Become a Patron" width="170" height="40">
</a>
<p>
<a href="${anon_url('https://www.patreon.com/join/tautulli')}" target="_blank" rel="noreferrer">
<img src="images/become_a_patron_button.png" alt="Become a Patron" width="170" height="40">
</a>
</p>
<p class="small-muted">(Patreon has a fee)</p>
</div>
<div role="tabpanel" class="tab-pane" id="stripe-donation" style="text-align: center">
<p>
Click the button below to continue to Stripe.
</p>
<p>
<a href="${anon_url('https://donate.stripe.com/5kA7vnb7dczVbxC9AA')}" target="_blank" rel="noreferrer">
<img src="images/Stripe_wordmark_-_white_small_28px.png" alt="Stripe" style="background-color: #7068fe; border-radius: 3px; padding: 3px;">
</a>
</p>
<p class="small-muted">(Stripe has a fee)</p>
</div>
<div role="tabpanel" class="tab-pane" id="paypal-donation" style="text-align: center">
<p>
Click the button below to continue to PayPal.
</p>
<a href="${anon_url('https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=6XPPKTDSX9QFL&lc=US&item_name=Tautulli&currency_code=USD&bn=PP%2dDonationsBF%3abtn_donate_LG%2egif%3aNonHosted')}" target="_blank" rel="noreferrer">
<img src="images/gold-rect-paypal-34px.png" alt="PayPal">
<p>
<a href="${anon_url('https://www.paypal.com/donate/?hosted_button_id=CUHSQ99KAKC5Q')}" target="_blank" rel="noreferrer">
<img src="images/gold-rect-paypal-34px.png" alt="PayPal">
</a>
</p>
<p class="small-muted">(PayPal has a fee)</p>
</div>
<div role="tabpanel" class="tab-pane" id="crypto-donation" style="text-align: center">
<p>
Select a cryptocurrency.
</p>
<select class="form-control" id="crypto-select"></select>
<div id="crypto-qrcode"></div>
<div id="crypto-address" class="form-group">
<label>Address:</label>
<span class="inline-pre" id="crypto-address-value"></span>
</div>
<p>
Or click the button below to continue to Coinbase.
</p>
<a href="${anon_url('https://commerce.coinbase.com/checkout/8a9fa08c-8a38-409e-9220-868124c4ba0c')}" target="_blank" rel="noreferrer" class="donate-with-crypto">
<span>Donate with Crypto</span>
</a>
</div>
</div>
@ -292,7 +327,7 @@ ${next.modalIncludes()}
</div>
</div>
<script src="${http_root}js/jquery-3.5.1.min.js"></script>
<script src="${http_root}js/jquery-3.6.0.min.js"></script>
<script src="${http_root}js/bootstrap.min.js"></script>
<script src="${http_root}js/bootstrap-hover-dropdown.min.js"></script>
<script src="${http_root}js/moment-with-locales.min.js"></script>
@ -302,8 +337,10 @@ ${next.modalIncludes()}
<script src="${http_root}js/ipaddr.min.js"></script>
<script src="${http_root}js/selectize.min.js"></script>
<script src="${http_root}js/jquery.tripleclick.min.js"></script>
<script src="${http_root}js/blurhash_pure_js_port.min.js"></script>
<script src="${http_root}js/script.js${cache_param}"></script>
<script src="${http_root}js/ajaxNotifications.js"></script>
<script src="${http_root}js/kjua.min.js"></script>
<script>
% if _session['user_group'] == 'admin':
$('body').on('click', '#updateDismiss', function() {
@ -377,6 +414,42 @@ ${next.modalIncludes()}
checkUpdate(function () { $('#nav-update').html('<i class="fa fa-fw fa-arrow-alt-circle-up"></i> Check for Updates'); });
});
$('#crypto-donation-tab').one('shown.bs.tab', function (e) {
$.ajax({
url: 'https://tautulli.com/donate/crypto-addresses.json',
type: 'GET',
dataType: 'json',
cache: false,
async: true,
success: function (data) {
$('#crypto-select').empty().append('<option selected disabled>Select Cryptocurrency</option>');
$.each(data, function (index, crypto) {
$('<option/>', {
text: crypto.name + ' (' + crypto.symbol + ')',
value: crypto.address
}).appendTo('#crypto-select');
});
},
error: function () {
$('#crypto-select').empty().append('<option selected disabled>Error: Unable to load addresses</option>');
}
});
});
$('#crypto-select').change(function() {
var address = $(this).val();
$('#crypto-qrcode').empty().kjua({
text: address,
render: 'canvas',
ecLevel: 'H',
size: 256,
fill: '#000',
back: '#eee'
}).show();
$('#crypto-address-value').text(address);
$('#crypto-address').show();
})
% endif
$('.dropdown-toggle').click(function (e) {
@ -385,8 +458,22 @@ ${next.modalIncludes()}
}
});
function displaySearch() {
if ($(this).width() < 768) {
$('#search_button').removeClass('btn-inactive');
$('#query').css({ right: 0, width: '100%' })
} else if ($('#query').val().trim() == '') {
$('#search_button').addClass('btn-inactive');
$('#query').css({ right: '-200px', width: '0' })
}
}
displaySearch();
$(window).resize(function() {
displaySearch();
});
$('#search_form').submit(function (e) {
if ($('#query').hasClass('active') && $('#query').val().trim() != '') {
if ($('#query').val().trim() != '') {
$.ajax({
type: 'post',
url: 'search',
@ -394,14 +481,16 @@ ${next.modalIncludes()}
})
} else {
e.preventDefault();
$('#search_button').removeClass('btn-inactive');
$('#query').clearQueue().val('').animate({ right: '0', width: '200px' }).addClass('active').focus();
if ($(window).width() >= 768) {
$('#search_button').removeClass('btn-inactive');
$('#query').clearQueue().val('').animate({ right: '0', width: '200px' }).addClass('active').focus();
}
}
})
$('#query').on('blur', function (e) {
if ($(this).val().trim() == '') {
if ($(this).val().trim() == '' && $(window).width() >= 768) {
$(this).delay(200).animate({ right: '-200px', width: '0' }, function () {
$('#search_button').addClass('btn-inactive');
displaySearch();
}).removeClass('active');
}
});

View file

@ -11,6 +11,7 @@ DOCUMENTATION :: END
<%!
import os
import sqlite3
import sys
import plexpy
from plexpy import common, logger
@ -69,20 +70,28 @@ DOCUMENTATION :: END
</tr>
<tr>
<td>System Timezone:</td>
<td>${plexpy.SYS_TIMEZONE.zone} (${'UTC{}'.format(plexpy.SYS_UTC_OFFSET)})
<td>${str(plexpy.SYS_TIMEZONE)} (${'UTC{}'.format(plexpy.SYS_UTC_OFFSET)})
</tr>
<tr>
<td>System Language:</td>
<td>${plexpy.SYS_LANGUAGE}${' (override {})'.format(plexpy.CONFIG.PMS_LANGUAGE) if plexpy.CONFIG.PMS_LANGUAGE else ''}</td>
</tr>
<tr>
<td>Python Version:</td>
<td>${sys.version}</td>
</tr>
<tr>
<td>SQLite Version:</td>
<td>${sqlite3.sqlite_version}</td>
</tr>
<tr>
<td class="top-line">Resources:</td>
<td class="top-line">
<a class="no-highlight" href="${anon_url('https://tautulli.com')}" target="_blank" rel="noreferrer">Tautulli Website</a> |
<a class="no-highlight" href="${anon_url('https://github.com/%s/%s' % (plexpy.CONFIG.GIT_USER, plexpy.CONFIG.GIT_REPO))}" target="_blank" rel="noreferrer">GitHub Source</a> |
<a class="no-highlight guidelines-modal-link" href="${anon_url('https://github.com/%s/%s-Issues' % (plexpy.CONFIG.GIT_USER, plexpy.CONFIG.GIT_REPO))}" rel="noreferrer" data-id="issue">GitHub Issues</a> |
<a class="no-highlight" href="${anon_url('https://github.com/%s/%s-Wiki' % (plexpy.CONFIG.GIT_USER, plexpy.CONFIG.GIT_REPO))}" target="_blank" rel="noreferrer">GitHub Wiki</a> |
<a class="no-highlight guidelines-modal-link" href="${anon_url('http://feathub.com/%s/%s' % (plexpy.CONFIG.GIT_USER, plexpy.CONFIG.GIT_REPO))}" rel="noreferrer" data-id="feature request">FeatHub Feature Requests</a>
<a class="no-highlight" href="${anon_url('https://github.com/%s/%s' % (plexpy.CONFIG.GIT_USER, plexpy.CONFIG.GIT_REPO))}" target="_blank" rel="noreferrer">Source</a> |
<a class="no-highlight" href="${anon_url('https://github.com/%s/%s/wiki' % (plexpy.CONFIG.GIT_USER, plexpy.CONFIG.GIT_REPO))}" target="_blank" rel="noreferrer">Wiki</a> |
<a class="no-highlight guidelines-modal-link" href="${anon_url('https://github.com/%s/%s/issues' % (plexpy.CONFIG.GIT_USER, plexpy.CONFIG.GIT_REPO))}" rel="noreferrer" data-id="issue">Bug Reports</a> |
<a class="no-highlight guidelines-modal-link" href="${anon_url('https://github.com/%s/%s/issues' % (plexpy.CONFIG.GIT_USER, plexpy.CONFIG.GIT_REPO))}" rel="noreferrer" data-id="feature request">Feature Requests</a>
</td>
</tr>
<tr>

File diff suppressed because one or more lines are too long

View file

@ -1,371 +0,0 @@
div.dataTables_length label {
font-weight: normal;
text-align: left;
white-space: nowrap;
}
div.dataTables_length select {
width: 75px;
display: inline-block;
}
div.dataTables_filter {
text-align: right;
}
div.dataTables_filter label {
font-weight: normal;
white-space: nowrap;
text-align: left;
}
div.dataTables_filter input {
margin-left: 0.5em;
display: inline-block;
width: auto;
}
div.dataTables_info {
padding-top: 8px;
white-space: nowrap;
}
div.dataTables_paginate {
margin: 0;
white-space: nowrap;
text-align: right;
}
div.dataTables_paginate ul.pagination {
margin: 2px 0;
white-space: nowrap;
}
@media screen and (max-width: 767px) {
div.dataTables_wrapper > div.row > div,
div.dataTables_length,
div.dataTables_filter,
div.dataTables_info,
div.dataTables_paginate {
text-align: center;
}
div.DTTT {
margin-bottom: 0.5em;
}
}
table.dataTable td,
table.dataTable th {
-webkit-box-sizing: content-box;
-moz-box-sizing: content-box;
box-sizing: content-box;
}
table.dataTable {
clear: both;
margin-top: 6px !important;
margin-bottom: 6px !important;
max-width: none !important;
}
table.dataTable thead .sorting,
table.dataTable thead .sorting_asc,
table.dataTable thead .sorting_desc,
table.dataTable thead .sorting_asc_disabled,
table.dataTable thead .sorting_desc_disabled {
cursor: pointer;
position: relative;
}
table.dataTable thead .sorting:after,
table.dataTable thead .sorting_asc:after,
table.dataTable thead .sorting_desc:after {
position: absolute;
top: 8px;
right: 8px;
display: block;
font-family: 'Glyphicons Halflings';
opacity: 0.5;
}
table.dataTable thead .sorting:after {
opacity: 0.2;
content: "\e150"; /* sort */
}
table.dataTable thead .sorting_asc:after {
content: "\e155"; /* sort-by-attributes */
}
table.dataTable thead .sorting_desc:after {
content: "\e156"; /* sort-by-attributes-alt */
}
div.dataTables_scrollBody table.dataTable thead .sorting:after,
div.dataTables_scrollBody table.dataTable thead .sorting_asc:after,
div.dataTables_scrollBody table.dataTable thead .sorting_desc:after {
display: none;
}
table.dataTable thead .sorting_asc_disabled:after,
table.dataTable thead .sorting_desc_disabled:after {
color: #eee;
}
table.dataTable thead > tr > th {
padding-right: 30px;
}
table.dataTable th:active {
outline: none;
}
/* Condensed */
table.dataTable.table-condensed thead > tr > th {
padding-right: 20px;
}
table.dataTable.table-condensed thead .sorting:after,
table.dataTable.table-condensed thead .sorting_asc:after,
table.dataTable.table-condensed thead .sorting_desc:after {
top: 6px;
right: 6px;
}
/* Scrolling */
div.dataTables_scrollHead table {
margin-bottom: 0 !important;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
}
div.dataTables_scrollHead table thead tr:last-child th:first-child,
div.dataTables_scrollHead table thead tr:last-child td:first-child {
border-bottom-left-radius: 0 !important;
border-bottom-right-radius: 0 !important;
}
div.dataTables_scrollBody table {
border-top: none;
margin-top: 0 !important;
margin-bottom: 0 !important;
}
div.dataTables_scrollBody tbody tr:first-child th,
div.dataTables_scrollBody tbody tr:first-child td {
border-top: none;
}
div.dataTables_scrollFoot table {
margin-top: 0 !important;
border-top: none;
}
/* Frustratingly the border-collapse:collapse used by Bootstrap makes the column
width calculations when using scrolling impossible to align columns. We have
to use separate
*/
table.table-bordered.dataTable {
border-collapse: separate !important;
}
table.table-bordered thead th,
table.table-bordered thead td {
border-left-width: 0;
border-top-width: 0;
}
table.table-bordered tbody th,
table.table-bordered tbody td {
border-left-width: 0;
border-bottom-width: 0;
}
table.table-bordered tfoot th,
table.table-bordered tfoot td {
border-left-width: 0;
border-bottom-width: 0;
}
table.table-bordered th:last-child,
table.table-bordered td:last-child {
border-right-width: 0;
}
div.dataTables_scrollHead table.table-bordered {
border-bottom-width: 0;
}
/*
* TableTools styles
*/
.table.dataTable tbody tr.active td,
.table.dataTable tbody tr.active th {
background-color: #08C;
color: white;
}
.table.dataTable tbody tr.active:hover td,
.table.dataTable tbody tr.active:hover th {
background-color: #0075b0 !important;
}
.table.dataTable tbody tr.active th > a,
.table.dataTable tbody tr.active td > a {
color: white;
}
.table-striped.dataTable tbody tr.active:nth-child(odd) td,
.table-striped.dataTable tbody tr.active:nth-child(odd) th {
background-color: #017ebc;
}
table.DTTT_selectable tbody tr {
cursor: pointer;
}
div.DTTT .btn:hover {
text-decoration: none !important;
}
ul.DTTT_dropdown.dropdown-menu {
z-index: 2003;
}
ul.DTTT_dropdown.dropdown-menu a {
color: #333 !important; /* needed only when demo_page.css is included */
}
ul.DTTT_dropdown.dropdown-menu li {
position: relative;
}
ul.DTTT_dropdown.dropdown-menu li:hover a {
background-color: #0088cc;
color: white !important;
}
div.DTTT_collection_background {
z-index: 2002;
}
/* TableTools information display */
div.DTTT_print_info {
position: fixed;
top: 50%;
left: 50%;
width: 400px;
height: 150px;
margin-left: -200px;
margin-top: -75px;
text-align: center;
color: #333;
padding: 10px 30px;
opacity: 0.95;
background-color: white;
border: 1px solid rgba(0, 0, 0, 0.2);
border-radius: 6px;
-webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.5);
box-shadow: 0 3px 7px rgba(0, 0, 0, 0.5);
}
div.DTTT_print_info h6 {
font-weight: normal;
font-size: 28px;
line-height: 28px;
margin: 1em;
}
div.DTTT_print_info p {
font-size: 14px;
line-height: 20px;
}
div.dataTables_processing {
position: absolute;
top: 50%;
left: 50%;
width: 100%;
height: 60px;
margin-left: -50%;
margin-top: -25px;
padding-top: 20px;
padding-bottom: 20px;
text-align: center;
font-size: 1.2em;
background-color: white;
background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255,255,255,0)), color-stop(25%, rgba(255,255,255,0.9)), color-stop(75%, rgba(255,255,255,0.9)), color-stop(100%, rgba(255,255,255,0)));
background: -webkit-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);
background: -moz-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);
background: -ms-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);
background: -o-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);
background: linear-gradient(to right, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);
}
/*
* FixedColumns styles
*/
div.DTFC_LeftHeadWrapper table,
div.DTFC_LeftFootWrapper table,
div.DTFC_RightHeadWrapper table,
div.DTFC_RightFootWrapper table,
table.DTFC_Cloned tr.even {
background-color: white;
margin-bottom: 0;
}
div.DTFC_RightHeadWrapper table ,
div.DTFC_LeftHeadWrapper table {
border-bottom: none !important;
margin-bottom: 0 !important;
border-top-right-radius: 0 !important;
border-bottom-left-radius: 0 !important;
border-bottom-right-radius: 0 !important;
}
div.DTFC_RightHeadWrapper table thead tr:last-child th:first-child,
div.DTFC_RightHeadWrapper table thead tr:last-child td:first-child,
div.DTFC_LeftHeadWrapper table thead tr:last-child th:first-child,
div.DTFC_LeftHeadWrapper table thead tr:last-child td:first-child {
border-bottom-left-radius: 0 !important;
border-bottom-right-radius: 0 !important;
}
div.DTFC_RightBodyWrapper table,
div.DTFC_LeftBodyWrapper table {
border-top: none;
margin: 0 !important;
}
div.DTFC_RightBodyWrapper tbody tr:first-child th,
div.DTFC_RightBodyWrapper tbody tr:first-child td,
div.DTFC_LeftBodyWrapper tbody tr:first-child th,
div.DTFC_LeftBodyWrapper tbody tr:first-child td {
border-top: none;
}
div.DTFC_RightFootWrapper table,
div.DTFC_LeftFootWrapper table {
border-top: none;
margin-top: 0 !important;
}
div.DTFC_LeftBodyWrapper table.dataTable thead .sorting:after,
div.DTFC_LeftBodyWrapper table.dataTable thead .sorting_asc:after,
div.DTFC_LeftBodyWrapper table.dataTable thead .sorting_desc:after,
div.DTFC_RightBodyWrapper table.dataTable thead .sorting:after,
div.DTFC_RightBodyWrapper table.dataTable thead .sorting_asc:after,
div.DTFC_RightBodyWrapper table.dataTable thead .sorting_desc:after {
display: none;
}
/*
* FixedHeader styles
*/
div.FixedHeader_Cloned table {
margin: 0 !important
}

File diff suppressed because one or more lines are too long

View file

@ -79,7 +79,6 @@ select.form-control {
color: #eee !important;
border: 0px solid #444 !important;
background: #555 !important;
padding: 1px 2px;
transition: background-color .3s;
}
.selectize-control.form-control .selectize-input {
@ -87,7 +86,6 @@ select.form-control {
align-items: center;
flex-wrap: wrap;
margin-bottom: 4px;
padding-left: 5px;
}
.selectize-control.form-control.selectize-pms-ip .selectize-input {
padding-left: 12px !important;
@ -122,6 +120,16 @@ select.form-control {
#condition-widget .fa-minus {
cursor: pointer;
}
#condition-widget .condition-operator-col {
padding-left: 0;
padding-right: 0;
}
@media (max-width: 767px) {
#condition-widget .condition-operator-col {
padding-left: 15px;
padding-right: 15px;
}
}
.react-selectize.root-node .react-selectize-control .react-selectize-placeholder {
color: #eee !important;
}
@ -225,6 +233,9 @@ select.form-control option {
color: #555;
background-color: #eee;
}
select.btn {
text-align: left;
}
img {
-webkit-box-sizing: content-box;
-moz-box-sizing: content-box;
@ -327,20 +338,20 @@ object {
}
.btn-dark:focus,
.btn-dark.focus {
color: #d7d7d7;
background-color: #3B3B3B;
color: #d7d7d7;
background-color: #3B3B3B;
}
.btn-dark:hover {
color: #eee;
background-color: #333;
border-color: #444;
color: #eee;
background-color: #333;
border-color: #444;
}
.btn-dark:active,
.btn-dark.active,
.open > .dropdown-toggle.btn-dark {
color: #eee;
background-color: #333;
border-color: #444;
color: #eee;
background-color: #333;
border-color: #444;
}
.btn-dark:active:hover,
.btn-dark.active:hover,
@ -351,13 +362,13 @@ object {
.btn-dark:active.focus,
.btn-dark.active.focus,
.open > .dropdown-toggle.btn-dark.focus {
color: #eee;
background-color: #333;
color: #eee;
background-color: #333;
}
.btn-dark:active,
.btn-dark.active,
.open > .dropdown-toggle.btn-dark {
background-image: none;
background-image: none;
}
.btn-dark.disabled,
.btn-dark[disabled],
@ -377,8 +388,8 @@ fieldset[disabled] .btn-dark:active,
.btn-dark.disabled.active,
.btn-dark[disabled].active,
fieldset[disabled] .btn-dark.active {
background-color: #333;
color: #aaa;
background-color: #333;
color: #aaa;
}
.btn-dark.inactive:hover {
color: #d7d7d7;
@ -387,30 +398,30 @@ fieldset[disabled] .btn-dark.active {
cursor: default;
}
.btn-dark .badge {
color: #e5e5e5;
background-color: #3B3B3B;
color: #e5e5e5;
background-color: #3B3B3B;
}
.btn-bright {
color: #eee;
background-color: #cc7b19;
box-shadow: inset 0 1px 0 #e7993b;
color: #eee;
background-color: #cc7b19;
box-shadow: inset 0 1px 0 #e7993b;
}
.btn-bright:focus,
.btn-bright.focus {
color: #eee;
background-color: #eb8600;
color: #eee;
background-color: #eb8600;
}
.btn-bright:hover {
color: #eee;
background-color: #e59029;
box-shadow: inset 0 1px 0 #ebac60;
color: #eee;
background-color: #e59029;
box-shadow: inset 0 1px 0 #ebac60;
}
.btn-bright:active,
.btn-bright.active,
.open > .dropdown-toggle.btn-bright {
color: #eee;
background-color: #cc7b19;
box-shadow: inset 0 1px 0 #e7993b;
color: #eee;
background-color: #cc7b19;
box-shadow: inset 0 1px 0 #e7993b;
}
.btn-bright:active:hover,
.btn-bright.active:hover,
@ -421,14 +432,14 @@ fieldset[disabled] .btn-dark.active {
.btn-bright:active.focus,
.btn-bright.active.focus,
.open > .dropdown-toggle.btn-bright.focus {
color: #eee;
background-color: #cc7b19;
box-shadow: inset 0 1px 0 #e7993b;
color: #eee;
background-color: #cc7b19;
box-shadow: inset 0 1px 0 #e7993b;
}
.btn-bright:active,
.btn-bright.active,
.open > .dropdown-toggle.btn-bright {
background-image: none;
background-image: none;
}
.btn-bright.disabled,
.btn-bright[disabled],
@ -448,13 +459,13 @@ fieldset[disabled] .btn-bright:active,
.btn-bright.disabled.active,
.btn-bright[disabled].active,
fieldset[disabled] .btn-bright.active {
background-color: #cc7b19;
border-color: #b56d16;
background-color: #cc7b19;
border-color: #b56d16;
}
.btn-bright .badge {
color: #eee;
background-color: #cc7b19;
box-shadow: inset 0 1px 0 #e7993b;
color: #eee;
background-color: #cc7b19;
box-shadow: inset 0 1px 0 #e7993b;
}
.btn-danger.btn-edit {
color: #d7d7d7;
@ -468,14 +479,14 @@ fieldset[disabled] .btn-bright.active {
border-color: #ac2925;
}
.btn-danger.btn-edit.active {
color: #eee;
background-color: #c9302c;
border-color: #ac2925;
color: #eee;
background-color: #c9302c;
border-color: #ac2925;
}
.btn-danger.btn-edit.active:hover {
color: #eee;
background-color: #ac2925;
border-color: #761c19;
color: #eee;
background-color: #ac2925;
border-color: #761c19;
}
.btn-group select {
margin-top: 0;
@ -656,12 +667,12 @@ textarea.form-control:focus {
white-space: nowrap;
vertical-align: middle;
-ms-touch-action: manipulation;
touch-action: manipulation;
touch-action: manipulation;
cursor: pointer;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
background-image: none;
background-color: #3B3B3B;
color: #e5e5e5;
@ -677,6 +688,13 @@ textarea.form-control:focus {
.btn-form:focus {
color: #eee;
}
.btn-filter.active,
.btn-filter.active.focus {
background-color: #b7800a !important;
}
.btn-filter.active:hover {
background-color: #896007 !important;
}
.form-control-feedback {
color: #E5A00D;
margin: 5px 40px 5px 0;
@ -947,7 +965,7 @@ a .users-poster-face:hover {
font-size: 10px;
text-align: right;
text-transform: uppercase;
line-height: 14px;
line-height: 10px;
-webkit-flex-shrink: 0;
flex-shrink: 0;
}
@ -987,6 +1005,12 @@ a .users-poster-face:hover {
font-size: 10px;
z-index: 2;
}
.dashboard-activity-info-channel {
display: inline-block;
max-width: 75px;
text-overflow: ellipsis;
overflow: hidden;
}
.dashboard-activity-progress {
width: 100%;
height: 5px;
@ -1257,7 +1281,7 @@ a .dashboard-activity-metadata-user-thumb:hover {
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
z-index: 1;
-webkit-border-radius: 50%;
-webkit-border-radius: 50%;
-moz-border-radius: 50%;
border-radius: 350%;
overflow: hidden;
@ -1454,7 +1478,8 @@ a:hover .dashboard-stats-square {
text-align: center;
position: relative;
z-index: 0;
overflow: hidden;
overflow: auto;
scrollbar-width: none;
}
.dashboard-recent-media {
width: 100%;
@ -1827,15 +1852,32 @@ a:hover .summary-poster-face-track .summary-poster-face-overlay span {
max-height: 15px;
margin: 0 5px;
}
.summary-content-summary {
.summary-content-text {
overflow: hidden;
color: #eee;
float: left;
position: relative;
clear: both;
height: auto;
max-height: 160px;
padding-bottom: 0px;
padding-bottom: 0;
}
.summary-content-tagline {
font-weight: bold;
}
.summary-content-summary {
height: 60px;
}
.summary-content-summary p {
margin-bottom: 0;
}
.summary-toggle {
display: none;
margin-top: 10px;
font-size: 12px;
font-weight: bold;
text-transform: uppercase;
}
.summary-toggle a {
color: #999;
}
.summary-content-people-wrapper {
margin-right: 20px;
@ -1923,7 +1965,7 @@ a:hover .summary-poster-face-track .summary-poster-face-overlay span {
color: #999;
}
.critic-rating {
display: inline-block;
display: flex;
font-size: 14px;
overflow: hidden;
white-space: nowrap;
@ -2162,15 +2204,28 @@ span.settings-warning {
padding-left: 10px;
}
#menu_link_show_advanced_settings.active {
color: #eee;
background-color: #cc7b19;
color: #eee;
background-color: #cc7b19;
}
#configUpdate .form-group,
#configUpdate .checkbox{
padding-left: 10px;
margin-left: -10px;
}
.hidden-settings {
overflow: hidden;
padding-left: 10px;
margin-left: -10px;
}
#newsletter_agent_options.hidden-settings {
padding-left: 15px;
margin-left: 0;
}
.advanced-setting {
display: none;
}
div.advanced-setting {
border-left: 1px solid #cc7b19;
padding-left: 10px;
}
li.advanced-setting {
border-left: 1px solid #cc7b19;
@ -2800,6 +2855,34 @@ a .home-platforms-list-cover-face:hover
overflow: hidden;
max-width: 350px;
}
.circle {
width: 1.55rem;
height: 1.55rem;
border-radius: 50%;
border: 0.2rem solid #eeeeee;
}
.circle-quarter {
background-image:
linear-gradient(00deg, #2b2b2b 50%, transparent 50%),
linear-gradient(270deg, #eeeeee 50%, transparent 50%);
}
.circle-half {
background-image:
linear-gradient(90deg, #2b2b2b 50%, transparent 50%),
linear-gradient(-90deg, #eeeeee 50%, transparent 50%);
}
.circle-three-quarter {
background-image:
linear-gradient(180deg, transparent 50%, #eeeeee 50%),
linear-gradient(-90deg, #eeeeee 50%, transparent 50%);
}
.circle-full {
background: #eeeeee;
}
#graph-tabs {
padding-bottom: 10px;
float: none;
}
.graphs-instance {
height: 330px;
padding: 20px;
@ -2856,7 +2939,7 @@ a .home-platforms-list-cover-face:hover
margin-bottom: -20px;
width: 100%;
max-width: 1750px;
overflow: hidden;
display: flow-root;
}
.table-card-back td {
font-size: 12px;
@ -2926,14 +3009,15 @@ a .home-platforms-list-cover-face:hover
max-width: 900px;
}
.stacked-configs > li > span {
display: block;
display: inline-block;
width: inherit;
padding: 8px 20px 8px 15px;
color: #eee;
border-left: 2px solid #444;
border-top: 1px solid #2d2d2d;
-webkit-transition: all 0.3s ease;
-o-transition: all 0.3s ease;
transition: all 0.3s ease;
-o-transition: all 0.3s ease;
transition: all 0.3s ease;
}
.stacked-configs > li > span:hover,
.stacked-configs > li > span:focus {
@ -3132,6 +3216,10 @@ div.dataTables_info {
bottom: 0;
text-shadow: 0 0 2px rgba(0,0,0,.5);
}
.sign-out-tooltip:hover {
color: #E5A00D;
cursor: pointer;
}
.history-thumbnail-popover {
z-index: 2000;
padding: 0;
@ -3223,7 +3311,7 @@ div.dataTables_info {
#libraries-to-purge > li {
color: #e9a049;
}
#updatebar {
#updatebar, #token_error_bar {
background-color: #444;
opacity: 0.95;
color: #999999;
@ -3238,32 +3326,35 @@ div.dataTables_info {
z-index: 9999;
display: block;
}
#updatebar .msg {
#updatebar .msg, #token_error_bar .msg {
line-height: normal;
padding-left: 20px;
}
#updatebar .loader {
#updatebar .loader, #token_error_bar .loader {
position: relative;
top: 2px;
}
#updatebar.success {
#updatebar.success, #token_error_bar.success {
padding: 15px 10px;
text-align: left;
}
#updatebar.error {
#updatebar.error, #token_error_bar.error {
padding: 15px 10px;
text-align: left;
}
#updatebar .ui-icon {
#updatebar .ui-icon, #token_error_bar .ui-icon {
display: inline-block;
margin-left: -20px;
top: 2px;
position: relative;
margin-right: 3px;
}
#updatebar a:hover {
#updatebar a:hover, #token_error_bar a:hover {
color: #e9a049;
}
#token_error_bar {
background-color: rgba(255,0,0,0.5) !important;
}
.body-container {
position: absolute;
top: 50px;
@ -3329,29 +3420,45 @@ pre::-webkit-scrollbar-thumb {
.button-bar {
float: left !important;
clear: both;
margin-top: 15px;
margin-top: 5px;
}
.button-bar > div,
.button-bar > button,
.button-bar > span {
float: left !important;
clear: both !important;
margin-bottom: 10px;
margin-top: 10px;
}
.button-bar > div > button.btn {
float: left !important;
clear: both !important;
}
.home-padded-header .button-bar {
margin-top: 10px;
margin-top: 0;
margin-bottom: 15px;
}
}
@media only screen
and (min-width: 740px)
and (max-width: 1024px) {
and (max-width: 1280px) {
.header-bar {
display: block;
float: none !important;
}
.button-bar {
float: right !important;
float: left !important;
clear: both;
margin-top: 5px;
}
.button-bar .btn-group,
.button-bar > button.btn {
margin-right: 3px;
}
.button-bar > div,
.button-bar > button,
.button-bar > span {
float: left !important;
margin-top: 10px;
}
.button-bar > div > button.btn {
float: left !important;
@ -3359,6 +3466,8 @@ pre::-webkit-scrollbar-thumb {
}
.home-padded-header .button-bar {
float: left !important;
margin-top: 0;
margin-bottom: 15px;
}
}
#search_form {
@ -3394,6 +3503,22 @@ pre::-webkit-scrollbar-thumb {
-o-transition: background 0.3s;
transition: background 0.3s;
}
@media (max-width: 767px) {
#search_form {
width: 100%;
}
#search_form span.input-textbox {
width: 100%;
}
#search_form #query {
width: 100%;
right: 0;
}
#search_form #query.active {
width: 100%;
right: 0px;
}
}
#update_search_form div.input-group {
display: inline-table;
vertical-align: middle;
@ -3602,10 +3727,6 @@ a.no-highlight:hover {
.login-container .form-group {
margin-bottom: 20px;
}
.login-container .form-group label {
font-weight: 400;
color: #999;
}
.login-container .form-control {
height: 38px;
line-height: 1.5em;
@ -3721,6 +3842,7 @@ a:hover .overlay-refresh-image {
a:hover .overlay-refresh-image:hover {
opacity: .9;
}
.smart-collection-image,
.smart-playlist-image {
float: left;
position: absolute;
@ -3829,16 +3951,15 @@ a:hover .overlay-refresh-image:hover {
#changelog-modal ul {
padding-left: 20px;
}
.google-play-badge {
display:inline-block;
height:45px;
margin-top: 10px;
.app-badge {
float: left;
display: inline-block;
height: 46px;
margin-right: 10px;
margin-bottom: 5px;
}
.google-play-badge img {
border: 1px solid #3B3B3B;
border-radius: 6px;
box-sizing: border-box;
height: 45px;
.app-badge img {
height: 46px;
vertical-align: middle;
}
@ -3848,6 +3969,10 @@ a:hover .overlay-refresh-image:hover {
background-repeat: no-repeat !important;
background-position: center !important;
}
.platform-alexa {
background-color: #00caff;
background-image: url(../images/platforms/alexa.svg);
}
.platform-android {
background-color: #3ddc84;
background-image: url(../images/platforms/android.svg);
@ -3964,6 +4089,9 @@ a:hover .overlay-refresh-image:hover {
background-color: #107c10;
background-image: url(../images/platforms/xbox.svg);
}
.platform-alexa-rgba {
background-color: rgba(0, 202, 255, 0.40);
}
.platform-android-rgba {
background-color: rgba(61, 220, 132, 0.40);
}
@ -4073,36 +4201,48 @@ a:hover .overlay-refresh-image:hover {
background-image: url(../images/icons/most-concurrent-streams.svg);
}
.rating-image {
width: 51px;
height: 20px;
margin-left: 10px;
margin-right: 5px;
display: inline-block;
background-origin: content-box !important;
background-size: contain !important;
background-repeat: no-repeat !important;
background-position: left !important;
text-align: right;
}
.rating-imdb {
width: 62px !important;
width: 36px;
background-image: url(../images/rating/imdb.svg);
background-size: auto 20px;
}
.rating-themoviedb {
width: 72px !important;
width: 38px;
background-image: url(../images/rating/themoviedb.svg);
background-size: auto 16px !important;
background-size: auto 16px;
}
.rating-thetvdb {
width: 36px;
background-image: url(../images/rating/thetvdb.svg);
background-size: auto 36px;
}
.rating-rottentomatos-ripe {
width: 17px;
background-image: url(../images/rating/tomato-ripe.svg);
background-size: auto 20px;
}
.rating-rottentomatos-rotten {
width: 17px;
background-image: url(../images/rating/tomato-rotten.svg);
background-size: auto 20px;
}
.rating-rottentomatos-upright {
width: 16px;
background-image: url(../images/rating/popcorn-upright.svg);
background-size: auto 20px;
}
.rating-rottentomatos-spilled {
width: 19px;
background-image: url(../images/rating/popcorn-spilled.svg);
background-size: auto 20px;
}
.transparent {
background-color: transparent !important;
@ -4185,6 +4325,10 @@ a:hover .overlay-refresh-image:hover {
.stream-info tr:nth-child(even) td {
background-color: rgba(255,255,255,0.010);
}
.stream-info td:nth-child(3),
.stream-info th:nth-child(3) {
width: 25px;
}
.number-input {
margin: 0 !important;
width: 55px !important;
@ -4368,3 +4512,102 @@ a[data-tab-destination] {
.news-body a:hover {
color: #f9be03;
}
a.donate-with-crypto,
a.donate-with-crypto > span {
background: none;
border: none;
border-radius: 0;
box-sizing: border-box;
clear: none;
clip: auto;
cursor: default;
display: block;
float: none;
height: auto;
margin: 0;
max-height: none;
min-height: none;
padding: 0;
opacity: 1;
text-shadow: none;
vertical-align: baseline;
visibility: visible;
width: auto;
}
a.donate-with-crypto {
user-select: none;
user-drag: none;
-webkit-user-drag: none;
text-decoration: none;
background: #1652f0 linear-gradient(#1652f0, #0655ab);
cursor: pointer;
transition: background 0.2s ease-in-out, padding 0.2s;
border-radius: 6px;
display: inline-block;
height: 40px;
padding: 9px 15px 11px 15px;
position: relative;
min-width: 160px;
}
a.donate-with-crypto:hover {
background: #1652f0;
}
a.donate-with-crypto > span {
color: white;
font: normal 500 14px/20px -apple-system, BlinkMacSystemFont, '.SFNSText-Regular', 'San Francisco', 'Roboto', 'Segoe UI', 'Helvetica Neue', 'Lucida Grande', sans-serif;
letter-spacing: 0;
overflow: hidden;
text-align: center;
text-overflow: ellipsis;
text-shadow: 0 1px 0 rgba(0, 0, 0, 0.15);
white-space: nowrap;
}
a.donate-with-crypto::after {
border-radius: 6px;
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.2);
content: '';
display: block;
width: 100%;
height: 100%;
position: absolute;
opacity: 1;
top: 0;
left: 0;
}
#crypto-select {
width: 280px;
margin: 15px auto;
}
#crypto-qrcode {
width: 258px;
padding: 0;
margin: 15px auto;
line-height: 0;
text-align: center;
background-color: #eee;
border: 1px solid #ccc;
border-radius: 4px;
display: none;
}
#crypto-address {
margin: 15px auto;
text-align: center;
display: none;
}
#api_qr_code {
width: 100%;
padding: 0;
margin: 0 0 10px;
line-height: 0;
text-align: center;
background-color: #eee;
border: 1px solid #ccc;
border-radius: 4px;
}
.docker-mount {
margin: 20px auto 0 auto;
position: relative;
}

View file

@ -62,7 +62,7 @@ DOCUMENTATION :: END
% if session is not None:
<%
from collections import defaultdict
from plexpy.helpers import cast_to_int, page
from plexpy.helpers import cast_to_int, get_percent, page, short_season
from plexpy.common import VIDEO_RESOLUTION_OVERRIDES, AUDIO_CODEC_OVERRIDES, EXTRA_TYPES
import plexpy
%>
@ -74,6 +74,8 @@ DOCUMENTATION :: END
parent_href = page('info', data['parent_rating_key'])
grandparent_href = page('info', data['grandparent_rating_key'])
user_href = page('user', data['user_id']) if data['user_id'] else '#'
library_href = page('library', data['section_id']) if data['section_id'] else '#'
season = short_season(data['parent_title'])
%>
<div class="dashboard-activity-instance" id="activity-instance-${sk}" data-key="${sk}" data-id="${data['session_id']}"
data-rating_key="${data['rating_key']}" data-parent_rating_key="${data['parent_rating_key']}" data-grandparent_rating_key="${data['grandparent_rating_key']}"
@ -159,7 +161,8 @@ DOCUMENTATION :: END
</li>
<li class="dashboard-activity-info-item">
<div class="sub-heading">Quality</div>
<div class="sub-value platform-right" id="stream_quality-${sk}">
<div class="sub-value platform-right">
<span id="stream_quality-${sk}">
% if data['media_type'] != 'photo' and data['quality_profile'] != 'Unknown':
<%
br = cast_to_int(data['stream_bitrate']) or ''
@ -173,6 +176,8 @@ DOCUMENTATION :: END
% else:
${data['quality_profile']}
% endif
</span>
<span data-toggle="tooltip" title="Quality profile is only an estimate based on bitrate and may be incorrect"><i class="fa fa-exclamation-circle"></i></span>
</div>
</li>
% if data['optimized_version'] == 1:
@ -230,11 +235,14 @@ DOCUMENTATION :: END
<div class="sub-value" id="video_decision-${sk}">
% if data['media_type'] in ('movie', 'episode', 'clip') and data['stream_video_decision']:
<%
if data['video_dynamic_range'] == 'HDR':
if data['video_dynamic_range'] != 'SDR':
video_dynamic_range = ' ' + data['video_dynamic_range']
else:
video_dynamic_range = ''
if data['stream_video_dynamic_range'] != 'SDR' or video_dynamic_range:
stream_video_dynamic_range = ' ' + data['stream_video_dynamic_range']
else:
video_dynamic_range = stream_video_dynamic_range = ''
stream_video_dynamic_range = ''
%>
% if data['stream_video_decision'] == 'transcode':
<%
@ -258,12 +266,15 @@ DOCUMENTATION :: END
<div class="sub-heading">Audio</div>
<div class="sub-value" id="audio_decision-${sk}">
% if data['stream_audio_decision']:
<%
audio_language = (data['audio_language'] or 'Unknown') + ' - ' if data['media_type'] != 'track' else ''
%>
% if data['stream_audio_decision'] == 'transcode':
Transcode (${AUDIO_CODEC_OVERRIDES.get(data['audio_codec'], data['audio_codec'].upper())} ${data['audio_channel_layout'].split('(')[0].capitalize()} <i class="fa fa-long-arrow-right"></i> ${AUDIO_CODEC_OVERRIDES.get(data['stream_audio_codec'], data['stream_audio_codec'].upper())} ${data['stream_audio_channel_layout'].split('(')[0].capitalize()})
Transcode (${audio_language}${AUDIO_CODEC_OVERRIDES.get(data['audio_codec'], data['audio_codec'].upper())} ${data['audio_channel_layout'].split('(')[0].capitalize()} <i class="fa fa-long-arrow-right"></i> ${AUDIO_CODEC_OVERRIDES.get(data['stream_audio_codec'], data['stream_audio_codec'].upper())} ${data['stream_audio_channel_layout'].split('(')[0].capitalize()})
% elif data['stream_audio_decision'] == 'copy':
Direct Stream (${AUDIO_CODEC_OVERRIDES.get(data['stream_audio_codec'], data['stream_audio_codec'].upper())} ${data['stream_audio_channel_layout'].split('(')[0].capitalize()})
Direct Stream (${audio_language}${AUDIO_CODEC_OVERRIDES.get(data['stream_audio_codec'], data['stream_audio_codec'].upper())} ${data['stream_audio_channel_layout'].split('(')[0].capitalize()})
% else:
Direct Play (${AUDIO_CODEC_OVERRIDES.get(data['stream_audio_codec'], data['stream_audio_codec'].upper())} ${data['stream_audio_channel_layout'].split('(')[0].capitalize()})
Direct Play (${audio_language}${AUDIO_CODEC_OVERRIDES.get(data['stream_audio_codec'], data['stream_audio_codec'].upper())} ${data['stream_audio_channel_layout'].split('(')[0].capitalize()})
% endif
% endif
</div>
@ -278,13 +289,13 @@ DOCUMENTATION :: END
subtitle_codec = 'None' if data['stream_subtitle_codec'] and data['stream_subtitle_transient'] else data['subtitle_codec'].upper()
%>
% if data['stream_subtitle_decision'] == 'transcode':
Transcode (${subtitle_codec} <i class="fa fa-long-arrow-right"></i> ${data['stream_subtitle_codec'].upper()})
Transcode (${data['subtitle_language'] or 'Unknown'} - ${subtitle_codec} <i class="fa fa-long-arrow-right"></i> ${data['stream_subtitle_codec'].upper()})
% elif data['stream_subtitle_decision'] == 'copy':
Direct Stream (${subtitle_codec})
Direct Stream (${data['subtitle_language'] or 'Unknown'} - ${subtitle_codec})
% elif data['stream_subtitle_decision'] == 'burn':
Burn (${subtitle_codec})
Burn (${data['subtitle_language'] or 'Unknown'} - ${subtitle_codec})
% else:
Direct Play (${subtitle_codec if data['synced_version'] else data['stream_subtitle_codec'].upper()})
Direct Play (${data['subtitle_language'] or 'Unknown'} - ${subtitle_codec if data['synced_version'] else data['stream_subtitle_codec'].upper()})
% endif
% else:
None
@ -314,7 +325,8 @@ DOCUMENTATION :: END
% if data['relayed']:
<span data-toggle="tooltip" title="Plex Relay"><i class="fa fa-exclamation-circle"></i></span>
% else:
<a href="#" class="external_ip-modal" data-toggle="modal" data-target="#ip-info-modal" data-ip="${data['ip_address']}">
<a href="#" class="external_ip-modal" data-toggle="modal" data-target="#ip-info-modal"
data-ip="${data['ip_address']}" data-location="${data['location']}" data-secure="${data['secure']}" data-relayed="${data['relayed']}">
<span id="external_ip-${sk}" class="external-ip-tooltip" data-toggle="tooltip" title="Lookup External IP" style="display: none;"><i class="fa fa-map-marker"></i></span>
</a>
<script>
@ -358,7 +370,7 @@ DOCUMENTATION :: END
% if data['media_type'] != 'photo':
<div class="dashboard-activity-info-time">
% if data['live']:
<br /><span class="thumb-tooltip" data-toggle="popover" data-img="${data['channel_thumb']}" data-height="40" data-width="40">${data['channel_call_sign']} ${data['channel_identifier']}</span>
<br /><span class="thumb-tooltip dashboard-activity-info-channel" data-toggle="popover" data-img="${data['channel_thumb']}" data-height="40" data-width="40">${data['channel_title'] or (data['channel_vcn'] + ' ' + data['channel_call_sign'])}</span>
% elif data['view_offset']:
ETA:
<span id="stream-eta-${sk}">
@ -390,7 +402,8 @@ DOCUMENTATION :: END
% if data['live']:
<div id="progress-bar-${sk}" class="progress-bar" style="width: 100%" data-state="live" data-toggle="tooltip" title="Stream Progress Live">Live</div>
% else:
<div id="buffer-bar-${sk}" class="buffer-bar" style="width: ${data['transcode_progress']}%" data-toggle="tooltip" title="Transcoder Progress ${data['transcode_progress']}%">${data['transcode_progress']}%</div>
<% transcode_progress = get_percent(data['transcode_max_offset_available'] * 1000, data['duration']) or data['transcode_progress'] %>
<div id="buffer-bar-${sk}" class="buffer-bar" style="width: ${transcode_progress}%" data-toggle="tooltip" title="Transcoder Progress ${transcode_progress}%">${transcode_progress}%</div>
<div id="progress-bar-${sk}" class="progress-bar" style="width: ${data['progress_percent']}%" data-last_view_offset="${data['view_offset']}" data-view_offset="${data['view_offset']}" data-stream_duration="${data['stream_duration']}" data-state="${data['state']}" data-toggle="tooltip" title="Stream Progress ${data['progress_percent']}%">${data['progress_percent']}%</div>
% endif
</div>
@ -398,7 +411,7 @@ DOCUMENTATION :: END
</div>
<div class="dashboard-activity-metadata-wrapper">
<a href="${user_href}" title="${data['username']}">
<div class="dashboard-activity-metadata-user-thumb" style="background-image: url(${data['user_thumb']});"></div>
<div class="dashboard-activity-metadata-user-thumb" style="background-image: url(${page('pms_image_proxy', data['user_thumb'], None, 80, 80, fallback='user')});"></div>
</a>
<div class="dashboard-activity-metadata-title-container">
<div id="play-state-${sk}" class="dashboard-activity-metadata-play_state-icon" title="${data['state'].capitalize()}">
@ -451,21 +464,27 @@ DOCUMENTATION :: END
<div class="dashboard-activity-metadata-subtitle-container">
% if data['live']:
<div id="media-type-${sk}" class="dashboard-activity-metadata-media_type-icon" title="Live TV">
<i class="fa fa-fw fa-broadcast-tower"></i>&nbsp;
<a href="${library_href}">
<i class="fa fa-fw fa-broadcast-tower"></i>
</a>&nbsp;
</div>
% elif data['channel_stream'] == 0:
<div id="media-type-${sk}" class="dashboard-activity-metadata-media_type-icon" title="${data['media_type'].capitalize()}">
% if data['media_type'] == 'movie':
<i class="fa fa-fw fa-film"></i>&nbsp;
% elif data['media_type'] == 'episode':
<i class="fa fa-fw fa-television"></i>&nbsp;
% elif data['media_type'] == 'track':
<i class="fa fa-fw fa-music"></i>&nbsp;
% elif data['media_type'] == 'photo':
<i class="fa fa-fw fa-picture-o"></i>&nbsp;
% elif data['media_type'] == 'clip':
<i class="fa fa-fw fa-video-camera"></i>&nbsp;
% endif
<a href="${library_href}">
% if data['media_type'] == 'movie':
<i class="fa fa-fw fa-film"></i>
% elif data['media_type'] == 'episode':
<i class="fa fa-fw fa-television"></i>
% elif data['media_type'] == 'track':
<i class="fa fa-fw fa-music"></i>
% elif data['media_type'] == 'photo':
<i class="fa fa-fw fa-picture-o"></i>
% elif data['media_type'] == 'clip':
<i class="fa fa-fw fa-video-camera"></i>
% else:
<i class="fa fa-fw fa-question-circle"></i>
% endif
</a>&nbsp;
</div>
% else:
<div id="media-type-${sk}" class="dashboard-activity-metadata-media_type-icon" title="Channel">
@ -478,7 +497,7 @@ DOCUMENTATION :: END
<span title="${data['year']}" class="sub-heading">${data['year']}</span>
% elif data['media_type'] == 'episode':
% if data['media_index']:
<a href="${href}" title="Season ${data['parent_media_index']}" class="sub-heading">S${data['parent_media_index']}</a>
<a href="${href}" title="${data['parent_title']}" class="sub-heading">${season}</a>
&middot; <a href="${href}" title="Episode ${data['media_index']}" class="sub-heading">E${data['media_index']}</a>
% else:
<a href="${href}" title="${data['originally_available_at']}" class="sub-heading">${data['originally_available_at']}</a>
@ -490,7 +509,7 @@ DOCUMENTATION :: END
% if data['media_type'] == 'movie':
<span title="${data['year']}" class="sub-heading">${data['year']}</span>
% elif data['media_type'] == 'episode':
<a href="${parent_href}" title="Season ${data['parent_media_index']}" class="sub-heading">S${data['parent_media_index']}</a>
<a href="${parent_href}" title="${data['parent_title']}" class="sub-heading">${season}</a>
&middot; <a href="${href}" title="Episode ${data['media_index']}" class="sub-heading">E${data['media_index']}</a>
% elif data['media_type'] == 'track':
<a id="metadata-parent_title-${sk}" href="${parent_href}" title="${data['parent_title']}" class="sub-heading">${data['parent_title']}</a>
@ -507,7 +526,7 @@ DOCUMENTATION :: END
% elif data['channel_title']:
<span title="${data['channel_title']}" class="sub-heading">${data['channel_title']}</span>
% if data['media_type'] == 'episode' and data['parent_media_index'] and data['media_index']:
(<span title="Season ${data['parent_media_index']}" class="sub-heading">S${data['parent_media_index']}</span>
(<span title="${data['parent_title']}" class="sub-heading">${season}</span>
&middot; <span title="Episode ${data['media_index']}" class="sub-heading">E${data['media_index']}</span>)
% elif data['media_type'] == 'episode' and data['originally_available_at']:
(<span title="${data['originally_available_at']}" class="sub-heading">${data['originally_available_at']}</span>)
@ -515,7 +534,7 @@ DOCUMENTATION :: END
% else:
<span title="Channel" class="sub-heading">Channel</span>
% if data['media_type'] == 'episode' and data['parent_media_index'] and data['media_index']:
(<span title="Season ${data['parent_media_index']}" class="sub-heading">S${data['parent_media_index']}</span>
(<span title="${data['parent_title']}" class="sub-heading">${season}</span>
&middot; <span title="Episode ${data['media_index']}" class="sub-heading">E${data['media_index']}</span>)
% elif data['media_type'] == 'episode' and data['originally_available_at']:
(<span title="${data['originally_available_at']}" class="sub-heading">${data['originally_available_at']}</span>)
@ -528,4 +547,4 @@ DOCUMENTATION :: END
</div>
</div>
</div>
% endif
% endif

View file

@ -20,6 +20,7 @@ DOCUMENTATION :: END
export = exporter.Export()
thumb_media_types = ', '.join([export.PLURAL_MEDIA_TYPES[k] for k, v in export.MEDIA_TYPES.items() if v[0]])
art_media_types = ', '.join([export.PLURAL_MEDIA_TYPES[k] for k, v in export.MEDIA_TYPES.items() if v[1]])
logo_media_types = ', '.join([export.PLURAL_MEDIA_TYPES[k] for k, v in export.MEDIA_TYPES.items() if v[2]])
%>
<div class="modal-dialog" role="document">
<div class="modal-content">
@ -40,7 +41,7 @@ DOCUMENTATION :: END
<div class="form-group">
<label>Instructions</label>
<p class="help-block">
Please see the <a href="${anon_url('https://github.com/%s/%s-Wiki/wiki/Exporter-Guide' % (plexpy.CONFIG.GIT_USER, plexpy.CONFIG.GIT_REPO))}" target="_blank" rel="noreferrer">Exporter Guide</a> for more details about each option.
Please see the <a href="${anon_url('https://github.com/%s/%s/wiki/Exporter-Guide' % (plexpy.CONFIG.GIT_USER, plexpy.CONFIG.GIT_REPO))}" target="_blank" rel="noreferrer">Exporter Guide</a> for more details about each option.
</p>
</div>
<div class="form-group">
@ -144,6 +145,22 @@ DOCUMENTATION :: END
Select the level to export background artwork image files.<br>Note: Only applies to ${art_media_types}.
</p>
</div>
<div class="form-group">
<label for="export_logo_level">Logo Image Export Level</label>
<div class="row">
<div class="col-md-12">
<select class="form-control" id="export_logo_level" name="export_logo_level">
<option value="0" selected>Level 0 - None / Custom</option>
<option value="1">Level 1 - Uploaded and Selected Logos Only</option>
<option value="2">Level 2 - Selected and Locked Logos Only</option>
<option value="9">Level 9 - All Selected Logos</option>
</select>
</div>
</div>
<p class="help-block">
Select the level to export logo image files.<br>Note: Only applies to ${logo_media_types}.
</p>
</div>
<p class="help-block">
Warning: Exporting images may take a long time! Images will be saved to a folder alongside the data file.
</p>
@ -226,11 +243,12 @@ DOCUMENTATION :: END
getExportFields();
$('#export_file_format').on('change', function() {
if ($(this).val() === 'm3u8') {
if ($(this).val() === 'm3u') {
$('#export_metadata_level').prop('disabled', true);
$('#export_media_info_level').prop('disabled', true);
$("#export_thumb_level").prop('disabled', true);
$("#export_art_level").prop('disabled', true);
$("#export_logo_level").prop('disabled', true);
export_custom_metadata_fields.disable();
export_custom_media_info_fields.disable();
} else {
@ -238,6 +256,7 @@ DOCUMENTATION :: END
$('#export_media_info_level').prop('disabled', false);
$("#export_thumb_level").prop('disabled', false);
$("#export_art_level").prop('disabled', false);
$("#export_logo_level").prop('disabled', false);
export_custom_metadata_fields.enable();
export_custom_media_info_fields.enable();
}
@ -252,6 +271,7 @@ DOCUMENTATION :: END
var file_format = $('#export_file_format option:selected').val();
var thumb_level = $("#export_thumb_level option:selected").val();
var art_level = $("#export_art_level option:selected").val();
var logo_level = $("#export_logo_level option:selected").val();
var custom_fields = [
$('#export_custom_metadata_fields').val(),
$('#export_custom_media_info_fields').val()
@ -270,6 +290,7 @@ DOCUMENTATION :: END
file_format: file_format,
thumb_level: thumb_level,
art_level: art_level,
logo_level: logo_level,
custom_fields: custom_fields,
export_type: export_type,
individual_files: individual_files

View file

@ -1,7 +1,8 @@
<%inherit file="base.html"/>
<%def name="headIncludes()">
<link rel="stylesheet" href="${http_root}css/dataTables.bootstrap.css">
<link rel="stylesheet" href="${http_root}css/bootstrap-select.min.css">
<link rel="stylesheet" href="${http_root}css/dataTables.bootstrap.min.css">
<link rel="stylesheet" href="${http_root}css/tautulli-dataTables.css">
</%def>
@ -14,17 +15,15 @@
<div class="button-bar">
<div class="btn-group" id="user-selection">
<label>
<select name="graph-user" id="graph-user" class="btn" style="color: inherit;">
<option value="">All Users</option>
<option disabled>&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;</option>
<select name="graph-user" id="graph-user" multiple>
</select>
</label>
</div>
<div class="btn-group" style="margin-right: 2px;" data-toggle="buttons" id="yaxis-selection">
<label class="btn btn-dark">
<label class="btn btn-dark btn-filter">
<input type="radio" name="yaxis-options" id="yaxis-plays" value="plays" autocomplete="off"> Play Count
</label>
<label class="btn btn-dark">
<label class="btn btn-dark btn-filter">
<input type="radio" name="yaxis-options" id="yaxis-duration" value="duration" autocomplete="off"> Play Duration
</label>
</div>
@ -42,15 +41,15 @@
</div>
<div class="table-card-back">
<ul class="nav nav-list nav-pills" role="tablist" id="graph-tabs">
<li role="presentation"><a id="nav-tabs-plays" href="#tabs-plays" aria-controls="tabs-plays" data-toggle="tab" role="tab">Plays by Period</a></li>
<li role="presentation"><a id="nav-tabs-stream" href="#tabs-stream" aria-controls="tabs-stream" data-toggle="tab" role="tab">Stream Info</a></li>
<li role="presentation"><a id="nav-tabs-plays" href="#tabs-plays" aria-controls="tabs-plays" data-toggle="tab" role="tab">Media Type</a></li>
<li role="presentation"><a id="nav-tabs-stream" href="#tabs-stream" aria-controls="tabs-stream" data-toggle="tab" role="tab">Stream Type</a></li>
<li role="presentation"><a id="nav-tabs-total" href="#tabs-total" aria-controls="tabs-total" data-toggle="tab" role="tab">Play Totals</a></li>
</ul>
<div class="tab-content">
<div role="tabpanel" class="tab-pane" id="tabs-plays">
<div class="row">
<div class="col-md-12">
<h4><i class="fa fa-history"></i> Daily <span class="yaxis-text">Play count</span> <small>Last <span class="days">30</span> days</small></h4>
<h4><i class="fa fa-history"></i> Daily <span class="yaxis-text" style="text-transform: lowercase;">play count</span> by media type <small>Last <span class="days">30</span> days</small></h4>
<p class="help-block">
The total play count or duration of tv, movies, and music played per day. Click a graph point to open up a list of items played for that specific date.
</p>
@ -126,7 +125,7 @@
<div role="tabpanel" class="tab-pane" id="tabs-stream">
<div class="row">
<div class="col-md-12">
<h4><i class="fa fa-video-camera"></i> Daily Stream type breakdown <small>Last <span class="days">30</span> days</small></h4>
<h4><i class="fa fa-video-camera"></i> Daily <span class="yaxis-text" style="text-transform: lowercase;">play count</span> by stream type <small>Last <span class="days">30</span> days</small></h4>
<p class="help-block">
The total play count or duration of tv, movies, and music by the transcode decision. Click a graph point to open up a list of items played for that specific date.
</p>
@ -138,6 +137,20 @@
</div>
</div>
</div>
<div class="row" id="concurrent-graph">
<div class="col-md-12">
<h4><i class="fa fa-video-camera"></i> Daily concurrent stream count</span> by stream type <small>Last <span class="days">30</span> days</small></h4>
<p class="help-block">
The total count of concurrent streams of tv, movies, and music by the transcode decision.
</p>
<div class="graphs-instance">
<div class="watch-chart" id="graph_concurrent_streams_by_stream_type">
<div class="graphs-load"><i class="fa fa-refresh fa-spin"></i> Loading chart...</div>
<br>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-6">
<h4><i class="fa fa-expand-arrows-alt"></i> <span class="yaxis-text">Play count</span> by source resolution <small>Last <span class="days">30</span> days</small></h4>
@ -198,7 +211,7 @@
<div role="tabpanel" class="tab-pane" id="tabs-total">
<div class="row">
<div class="col-md-12">
<h4><i class="fa fa-calendar"></i> Plays by month <small>Last <span class="months">12</span> months</small></h4>
<h4><i class="fa fa-calendar"></i> Total <span class="yaxis-text" style="text-transform: lowercase;">play count</span> by month <small>Last <span class="months">12</span> months</small></h4>
<p class="help-block">
The combined total of tv, movies, and music by month.
</p>
@ -225,7 +238,8 @@
</%def>
<%def name="javascriptIncludes()">
<script src="${http_root}js/highcharts/js/highcharts.js"></script>
<script src="${http_root}js/bootstrap-select.min.js"></script>
<script src="${http_root}js/highcharts.min.js"></script>
<script src="${http_root}js/jquery.dataTables.min.js"></script>
<script src="${http_root}js/dataTables.bootstrap.min.js"></script>
<script src="${http_root}js/dataTables.bootstrap.pagination.js"></script>
@ -287,6 +301,10 @@
return obj;
}, {});
if (!("Total" in chart_visibility)) {
chart_visibility["Total"] = false;
}
return data_series.map(function(s) {
var obj = Object.assign({}, s);
obj.visible = (chart_visibility[s.name] !== false);
@ -312,7 +330,9 @@
'Live TV': '#19A0D7',
'Direct Play': '#E5A00D',
'Direct Stream': '#FFFFFF',
'Transcode': '#F06464'
'Transcode': '#F06464',
'Max. Concurrent Streams': '#96C83C',
'Total': '#96C83C'
};
var series_colors = [];
$.each(data_series, function(index, series) {
@ -327,6 +347,7 @@
<script src="${http_root}js/graphs/plays_by_platform.js${cache_param}"></script>
<script src="${http_root}js/graphs/plays_by_user.js${cache_param}"></script>
<script src="${http_root}js/graphs/plays_by_stream_type.js${cache_param}"></script>
<script src="${http_root}js/graphs/concurrent_streams_by_stream_type.js${cache_param}"></script>
<script src="${http_root}js/graphs/plays_by_source_resolution.js${cache_param}"></script>
<script src="${http_root}js/graphs/plays_by_stream_resolution.js${cache_param}"></script>
<script src="${http_root}js/graphs/plays_by_platform_by_stream_type.js${cache_param}"></script>
@ -356,6 +377,10 @@
break
}
if (window.location.hash === '#concurrent-graph') {
current_tab = '#tabs-stream';
}
$('#yaxis-' + yaxis).prop('checked', true);
$('#yaxis-' + yaxis).closest('label').addClass('active');
$('#graph-days').val(current_day_range);
@ -364,8 +389,8 @@
//$(current_tab).addClass('active');
$('.days').html(current_day_range);
$('.months').html(current_month_range);
$('.days').text(current_day_range);
$('.months').text(current_month_range);
// Load user ids and names (for the selector)
$.ajax({
@ -373,14 +398,35 @@
type: 'get',
dataType: "json",
success: function (data) {
var select = $('#graph-user');
let select = $('#graph-user');
let by_id = {};
data.sort(function(a, b) {
return a.friendly_name.localeCompare(b.friendly_name);
});
data.forEach(function(item) {
select.append('<option value="' + item.user_id + '">' +
item.friendly_name + '</option>');
by_id[item.user_id] = item.friendly_name;
});
select.selectpicker({
countSelectedText: function(sel, total) {
if (sel === 0 || sel === total) {
return 'All users';
} else if (sel > 1) {
return sel + ' users';
} else {
return select.val().map(function(id) {
return by_id[id];
}).join(', ');
}
},
style: 'btn-dark',
actionsBox: true,
selectedTextFormat: 'count',
noneSelectedText: 'All users'
});
select.selectpicker('render');
select.selectpicker('selectAll');
}
});
@ -519,6 +565,33 @@
}
});
$.ajax({
url: "get_concurrent_streams_by_stream_type",
type: 'get',
data: { time_range: time_range, user_id: selected_user_id },
dataType: "json",
success: function(data) {
var dateArray = [];
$.each(data.categories, function (i, day) {
dateArray.push(moment(day, 'YYYY-MM-DD').valueOf());
// Highlight the weekend
if ((moment(day, 'YYYY-MM-DD').format('ddd') == 'Sat') ||
(moment(day, 'YYYY-MM-DD').format('ddd') == 'Sun')) {
hc_plays_by_day_options.xAxis.plotBands.push({
from: i-0.5,
to: i+0.5,
color: 'rgba(80,80,80,0.3)'
});
}
});
hc_concurrent_streams_by_stream_type_options.yAxis.min = 0;
hc_concurrent_streams_by_stream_type_options.xAxis.categories = dateArray;
hc_concurrent_streams_by_stream_type_options.series = getGraphVisibility(hc_concurrent_streams_by_stream_type_options.chart.renderTo, data.series);
hc_concurrent_streams_by_stream_type_options.colors = getGraphColors(data.series);
var hc_plays_by_stream_type = new Highcharts.Chart(hc_concurrent_streams_by_stream_type_options);
}
});
$.ajax({
url: "get_plays_by_source_resolution",
type: 'get',
@ -575,7 +648,7 @@
}
});
$('#nav-tabs-2').tab('show');
$('#nav-tabs-stream').tab('show');
}
function loadGraphsTab3(time_range, yaxis) {
@ -602,11 +675,6 @@
$('#nav-tabs-total').tab('show');
}
// Set initial state
if (current_tab === '#tabs-plays') { loadGraphsTab1(current_day_range, yaxis); }
if (current_tab === '#tabs-stream') { loadGraphsTab2(current_day_range, yaxis); }
if (current_tab === '#tabs-total') { loadGraphsTab3(current_month_range, yaxis); }
// Tab1 opened
$('#nav-tabs-plays').on('shown.bs.tab', function (e) {
e.preventDefault();
@ -639,7 +707,7 @@
setLocalStorage('graph_days', current_day_range);
if (current_tab === '#tabs-plays') { loadGraphsTab1(current_day_range, yaxis); }
if (current_tab === '#tabs-stream') { loadGraphsTab2(current_day_range, yaxis); }
$('.days').html(current_day_range);
$('.days').text(current_day_range);
});
// Month range changed
@ -649,12 +717,23 @@
current_month_range = $(this).val();
setLocalStorage('graph_months', current_month_range);
if (current_tab === '#tabs-total') { loadGraphsTab3(current_month_range, yaxis); }
$('.months').html(current_month_range);
$('.months').text(current_month_range);
});
let graph_user_last_id = undefined;
// User changed
$('#graph-user').on('change', function() {
selected_user_id = $(this).val() || null;
let val = $(this).val();
if (val.length === 0 || val.length === $(this).children().length) {
selected_user_id = null; // if all users are selected, just send an empty list
} else {
selected_user_id = val.join(",");
}
if (selected_user_id === graph_user_last_id) {
return;
}
graph_user_last_id = selected_user_id;
if (current_tab === '#tabs-plays') { loadGraphsTab1(current_day_range, yaxis); }
if (current_tab === '#tabs-stream') { loadGraphsTab2(current_day_range, yaxis); }
if (current_tab === '#tabs-total') { loadGraphsTab3(current_month_range, yaxis); }
@ -681,6 +760,7 @@
if (this.points.length > 1) {
var total = 0;
$.each(this.points, function(i, point) {
if (point.series.name === 'Total') return;
s += '<br/>'+point.series.name+': '+point.y;
total += point.y;
});
@ -707,6 +787,7 @@
if (this.points.length > 1) {
var total = 0;
$.each(this.points, function(i, point) {
if (point.series.name === 'Total') return;
s += '<br/>'+point.series.name+': '+moment.duration(point.y, 'hours').format('D [days] H [hrs] m [mins]');
total += point.y;
});
@ -727,6 +808,7 @@
hc_plays_by_day_options.xAxis.plotBands = [];
hc_plays_by_stream_type_options.xAxis.plotBands = [];
hc_concurrent_streams_by_stream_type_options.xAxis.plotBands = [];
hc_plays_by_day_options.yAxis.labels.formatter = yaxis_format;
hc_plays_by_dayofweek_options.yAxis.labels.formatter = yaxis_format;

View file

@ -1,7 +1,8 @@
<%inherit file="base.html"/>
<%def name="headIncludes()">
<link rel="stylesheet" href="${http_root}css/dataTables.bootstrap.css">
<link rel="stylesheet" href="${http_root}css/bootstrap-select.min.css">
<link rel="stylesheet" href="${http_root}css/dataTables.bootstrap.min.css">
<link rel="stylesheet" href="${http_root}css/dataTables.colVis.css">
<link rel="stylesheet" href="${http_root}css/tautulli-dataTables.css">
</%def>
@ -21,38 +22,44 @@
</div>
<div class="button-bar">
% if _session['user_group'] == 'admin':
<div class="alert alert-danger alert-edit" role="alert" id="row-edit-mode-alert"><i class="fa fa-exclamation-triangle"></i>&nbspSelect rows to delete. Data is deleted upon exiting delete mode.</div>
<div class="alert alert-danger alert-edit" role="alert" id="row-edit-mode-alert"><i class="fa fa-exclamation-triangle"></i>&nbsp</div>
<div class="btn-group">
<button class="btn btn-danger btn-edit" data-toggle="button" aria-pressed="false" autocomplete="off" id="row-edit-mode">
<i class="fa fa-trash-o"></i> Delete mode
</button>&nbsp
</button>
</div>
% endif
% if _session['user_group'] == 'admin':
<div class="btn-group" id="user-selection">
<label>
<select name="history-user" id="history-user" class="btn" style="color: inherit;">
<option value="">All Users</option>
<option disabled>&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;</option>
<select name="history-user" id="history-user" multiple>
</select>
</label>
</div>
% endif
<div class="btn-group" data-toggle="buttons" id="media_type-selection">
<label class="btn btn-dark">
<input type="radio" name="media_type-filter" id="history-all" value="all" autocomplete="off"> All
<label class="btn btn-dark btn-filter">
<input type="checkbox" name="media_type-filter" id="history-media_type-movie" value="movie" autocomplete="off"><i class="fa fa-film"></i> Movies
</label>
<label class="btn btn-dark">
<input type="radio" name="media_type-filter" id="history-movie" value="movie" autocomplete="off"> Movies
<label class="btn btn-dark btn-filter">
<input type="checkbox" name="media_type-filter" id="history-media_type-episode" value="episode" autocomplete="off"><i class="fa fa-television"></i> TV Shows
</label>
<label class="btn btn-dark">
<input type="radio" name="media_type-filter" id="history-episode" value="episode" autocomplete="off"> TV Shows
<label class="btn btn-dark btn-filter">
<input type="checkbox" name="media_type-filter" id="history-media_type-track" value="track" autocomplete="off"><i class="fa fa-music"></i> Music
</label>
<label class="btn btn-dark">
<input type="radio" name="media_type-filter" id="history-track" value="track" autocomplete="off"> Music
<label class="btn btn-dark btn-filter">
<input type="checkbox" name="media_type-filter" id="history-media_type-live" value="live" autocomplete="off"><i class="fa fa-broadcast-tower"></i> Live TV
</label>
<label class="btn btn-dark">
<input type="radio" name="media_type-filter" id="history-live" value="live" autocomplete="off"> Live TV
</div>
<div class="btn-group" data-toggle="buttons" id="transcode_decision-selection">
<label class="btn btn-dark btn-filter">
<input type="checkbox" name="transcode_decision-filter" id="history-transcode_decision-direct_play" value="direct play" autocomplete="off"><i class="fa fa-play-circle"></i> Direct Play
</label>
<label class="btn btn-dark btn-filter">
<input type="checkbox" name="transcode_decision-filter" id="history-transcode_decision-copy" value="copy" autocomplete="off"><i class="fa fa-stream"></i> Direct Stream
</label>
<label class="btn btn-dark btn-filter">
<input type="checkbox" name="transcode_decision-filter" id="history-transcode_decision-transcode" value="transcode" autocomplete="off"><i class="fa fa-server"></i> Transcode
</label>
</div>
<div class="btn-group">
@ -76,7 +83,7 @@
<th align="left" id="started">Started</th>
<th align="left" id="paused_counter">Paused</th>
<th align="left" id="stopped">Stopped</th>
<th align="left" id="duration">Duration</th>
<th align="left" id="play_duration">Duration</th>
<th align="left" id="percent_complete"></th>
</tr>
</thead>
@ -113,6 +120,7 @@
</%def>
<%def name="javascriptIncludes()">
<script src="${http_root}js/bootstrap-select.min.js"></script>
<script src="${http_root}js/jquery.dataTables.min.js"></script>
<script src="${http_root}js/dataTables.colVis.js"></script>
<script src="${http_root}js/dataTables.bootstrap.min.js"></script>
@ -126,18 +134,41 @@
type: 'GET',
dataType: 'json',
success: function (data) {
var select = $('#history-user');
let select = $('#history-user');
let by_id = {};
data.sort(function (a, b) {
return a.friendly_name.localeCompare(b.friendly_name);
});
data.forEach(function (item) {
select.append('<option value="' + item.user_id + '">' +
item.friendly_name + '</option>');
by_id[item.user_id] = item.friendly_name;
});
select.selectpicker({
countSelectedText: function(sel, total) {
if (sel === 0 || sel === total) {
return 'All users';
} else if (sel > 1) {
return sel + ' users';
} else {
return select.val().map(function(id) {
return by_id[id];
}).join(', ');
}
},
style: 'btn-dark',
actionsBox: true,
selectedTextFormat: 'count',
noneSelectedText: 'All users'
});
select.selectpicker('render');
select.selectpicker('selectAll');
}
});
function loadHistoryTable(media_type, selected_user_id) {
let history_user_last_id = undefined;
function loadHistoryTable(media_type, transcode_decision, selected_user_id) {
history_table_options.ajax = {
url: 'get_history',
type: 'POST',
@ -145,6 +176,7 @@
return {
json_data: JSON.stringify(d),
media_type: media_type,
transcode_decision: transcode_decision,
user_id: selected_user_id
};
}
@ -161,32 +193,60 @@
$('#media_type-selection').on('change', function () {
$('#media_type-selection > label').removeClass('active');
selected_filter = $('input[name=media_type-filter]:checked', '#media_type-selection');
var selected_filter = $('input[name=media_type-filter]:checked', '#media_type-selection');
$(selected_filter).closest('label').addClass('active');
media_type = $(selected_filter).val();
media_type = $(selected_filter).map(function () { return $(this).val(); }).get().join(',');
setLocalStorage('history_media_type', media_type);
history_table.draw();
});
$('#transcode_decision-selection').on('change', function () {
$('#transcode_decision-selection > label').removeClass('active');
var selected_filter = $('input[name=transcode_decision-filter]:checked', '#transcode_decision-selection');
$(selected_filter).closest('label').addClass('active');
transcode_decision = $(selected_filter).map(function () { return $(this).val(); }).get().join(',');
setLocalStorage('history_transcode_decision', transcode_decision);
history_table.draw();
});
$('#history-user').on('change', function () {
selected_user_id = $(this).val() || null;
let val = $(this).val();
if (val.length === 0 || val.length === $(this).children().length) {
selected_user_id = null; // if all users are selected, just send an empty list
} else {
selected_user_id = val.join(",");
}
if (selected_user_id === history_user_last_id) {
return;
}
history_user_last_id = selected_user_id;
history_table.draw();
});
}
var media_type = getLocalStorage('history_media_type', 'all');
var selected_user_id = "${_session['user_group']}" == "admin" ? null : "${_session['user_id']}";
$('#history-' + media_type).prop('checked', true);
$('#history-' + media_type).closest('label').addClass('active');
var media_type = getLocalStorage('history_media_type', 'all');
$.each(media_type.split(','), function (i, item) {
var history_media_type = $('#history-media_type-' + item);
history_media_type.prop('checked', true);
history_media_type.closest('label').addClass('active');
});
loadHistoryTable(media_type, selected_user_id);
var transcode_decision = getLocalStorage('history_transcode_decision', 'all');
$.each(transcode_decision.split(','), function (i, item) {
var history_transcode_decision = $('#history-transcode_decision-' + item.replace(' ', '_'));
history_transcode_decision.prop('checked', true);
history_transcode_decision.closest('label').addClass('active');
});
loadHistoryTable(media_type, transcode_decision, selected_user_id);
% if _session['user_group'] == 'admin':
$('#row-edit-mode').on('click', function() {
$('#row-edit-mode-alert').fadeIn(200);
if ($(this).hasClass('active')) {
$(this).tooltip('destroy');
if (history_to_delete.length > 0) {
$('#deleteCount').text(history_to_delete.length);
$('#confirm-modal-delete').modal();
@ -211,6 +271,13 @@
});
} else {
$(this).tooltip({
container: '.body-container',
placement: 'bottom',
title: 'Select rows to delete. Data is deleted upon exiting delete mode.',
trigger: 'manual'
}).tooltip('show');
history_to_delete = [];
$('.delete-control').each(function() {
$(this).find('button.btn-danger').toggleClass('btn-warning').toggleClass('btn-danger');

View file

@ -32,7 +32,7 @@
<th align="left" id="started">Started</th>
<th align="left" id="paused_counter">Paused</th>
<th align="left" id="stopped">Stopped</th>
<th align="left" id="duration">Duration</th>
<th align="left" id="play_duration">Duration</th>
<th align="left" id="percent_complete"></th>
</tr>
</thead>
@ -46,8 +46,9 @@
<script src="${http_root}js/tables/history_table.js${cache_param}"></script>
<script>
$(document).ready(function() {
$('#date-header').html(moment('${data["start_date"]}','YYYY-MM-DD').format('ddd MMM Do YYYY'));
$('#date-header').html(moment('${data["start_date"]}','YYYY-MM-DD').format('ddd MMM Do YYYY'));
$('#history-modal').off('shown.bs.modal').on('shown.bs.modal', function() {
history_table_options.ajax = {
url: 'get_history',
data: function ( d ) {
@ -56,7 +57,8 @@
user_id: "${data['user_id']}",
start_date: "${data['start_date']}",
media_type: "${data.get('media_type') or 'all'}",
transcode_decision: "${data.get('transcode_decision')}"
transcode_decision: "${data.get('transcode_decision')}",
include_activity: false
};
}
};
@ -65,10 +67,6 @@
history_table.columns([0, 3, 4, 5, 9, 11, 12]).visible(false);
clearSearchButton('history_table_modal', history_table);
$('#history-modal').on('shown.bs.modal', function() {
history_table.columns.adjust().draw();
});
});
</script>
% else:

View file

@ -25,7 +25,7 @@ grandparent_thumb Returns location of the item's thumbnail. Use with pms_i
rating_key Returns the unique identifier for the media item.
title Returns the title for the associated stat.
== Only if 'stat_id' is 'top_tv' or 'top_movies' or 'top_music' or 'top_user' or 'top_platform' ==
== Only if 'stat_id' is 'top_tv' or 'top_movies' or 'top_music' or 'top_user' or 'top_platform' or 'top_libraries' ==
total_plays Returns the count for the associated stat.
total_duration Returns the total duration for the associated stat.
@ -58,6 +58,8 @@ DOCUMENTATION :: END
# Human readable duration
def hd(seconds):
m, s = divmod(cast_to_int(seconds), 60)
if s > 30:
m += 1
h, m = divmod(m, 60)
return str(h).zfill(1) + ':' + str(m).zfill(2)
%>
@ -74,6 +76,11 @@ DOCUMENTATION :: END
% if stat_id in ('top_movies', 'popular_movies', 'top_tv', 'popular_tv', 'top_music', 'popular_music', 'last_watched'):
<% fallback = 'art-live' if row0['live'] else 'art' %>
<div id="stats-background-${stat_id}" class="dashboard-stats-background" style="background-image: url(${page('pms_image_proxy', row0['art'], row0['rating_key'], 500, 280, 40, '282828', 3, fallback=fallback)});">
% elif stat_id == 'top_libraries':
<% fallback = 'art-live' if row0['live'] else row0['library_art'] %>
<div id="stats-background-${stat_id}" class="dashboard-stats-background" style="background-image: url(${page('pms_image_proxy', row0['art'] or row0['library_art'], None, 500, 280, 40, '282828', 3, fallback=fallback)});" data-library_art="${row0['library_art']}">
% elif stat_id == 'top_users':
<div id="stats-background-${stat_id}" class="dashboard-stats-background" data-blurhash="${page('pms_image_proxy', row0['user_thumb'] or 'interfaces/default/images/gravatar-default.png', None, 100, 100, 40, '282828', 0, fallback='user')}">
% elif stat_id == 'top_platforms':
<div id="stats-background-${stat_id}" class="dashboard-stats-background platform-${row0['platform_name']}-rgba no-image">
% else:
@ -96,16 +103,22 @@ DOCUMENTATION :: END
if row0['live']:
href = page('info', row0['rating_key'], row0['guid'], history=True, live=row0['live'])
else:
href = page('info', row0['rating_key'])
href = page('info', row0['rating_key'], history=True)
%>
<a id="stats-thumb-url-${stat_id}" href="${href}" title="${row0['title']}">
<div id="stats-thumb-${stat_id}" class="dashboard-stats-${fallback.split('-')[0]}" style="background-image: url(${page('pms_image_proxy', row0['thumb'], row0['rating_key'], 300, height, fallback=fallback)});"></div>
<div id="stats-thumb-${stat_id}" class="dashboard-stats-${fallback.split('-')[0]}" style="background-image: url(${page('pms_image_proxy', row0['thumb'], row0['grandparent_rating_key'] or row0['rating_key'], 300, height, fallback=fallback)});"></div>
</a>
</div>
% elif stat_id == 'top_libraries':
% if row0['library_thumb'].startswith('http'):
<div id="stats-thumb-${stat_id}" class="dashboard-stats-flat hidden-xs" style="background-image: url(${page('pms_image_proxy', row0['library_thumb'], None, 100, 100, fallback='cover')});"></div>
% else:
<div id="stats-thumb-${stat_id}" class="dashboard-stats-flat svg-icon library-${row0['section_type']} hidden-xs"></div>
% endif
% elif stat_id == 'top_users':
<% user_href = page('user', row0['user_id']) if row0['user_id'] else '#' %>
<a id="stats-thumb-url-${stat_id}" href="${user_href}" title="${row0['user']}" class="hidden-xs">
<div id="stats-thumb-${stat_id}" class="dashboard-stats-circle" style="background-image: url(${row0['user_thumb'] or 'images/gravatar-default.png'})"></div>
<div id="stats-thumb-${stat_id}" class="dashboard-stats-circle" style="background-image: url(${page('pms_image_proxy', row0['user_thumb'] or 'interfaces/default/images/gravatar-default.png', None, 100, 100, fallback='user')})"></div>
</a>
% elif stat_id == 'top_platforms':
<div id="stats-thumb-${stat_id}" class="dashboard-stats-flat svg-icon platform-${row0['platform_name']} transparent hidden-xs"></div>
@ -132,10 +145,11 @@ DOCUMENTATION :: END
<ul class="list-unstyled dashboard-stats-info-list">
% for row in top_stat['rows']:
<li class="dashboard-stats-info-item ${'expanded' if loop.index == 0 else ''}" data-stat_id="${stat_id}"
data-rating_key="${row.get('rating_key')}" data-guid="${row.get('guid')}" data-title="${row.get('title')}"
data-art="${row.get('art')}" data-thumb="${row.get('thumb')}" data-platform="${row.get('platform_name')}"
data-rating_key="${row.get('rating_key')}" data-grandparent_rating_key="${row.get('grandparent_rating_key')}" data-guid="${row.get('guid')}" data-title="${row.get('title')}"
data-art="${row.get('art')}" data-thumb="${row.get('thumb')}" data-platform="${row.get('platform_name')}" data-library-type="${row.get('section_type')}"
data-user_id="${row.get('user_id')}" data-user="${row.get('user')}" data-friendly_name="${row.get('friendly_name')}" data-user_thumb="${row.get('user_thumb')}"
data-last_watch="${row.get('last_watch')}" data-started="${row.get('started')}" data-live="${row.get('live')}">
data-last_watch="${row.get('last_watch')}" data-started="${row.get('started')}" data-live="${row.get('live')}"
data-library_art="${row.get('library_art', '')}" data-library_thumb="${row.get('library_thumb', '')}">
<div class="sub-list">${loop.index + 1}</div>
<div class="sub-value">
% if stat_id in ('top_movies', 'popular_movies', 'top_tv', 'popular_tv', 'top_music', 'popular_music', 'last_watched'):
@ -145,11 +159,16 @@ DOCUMENTATION :: END
if row['live']:
href = page('info', row['rating_key'], row['guid'], history=True, live=row['live'])
else:
href = page('info', row['rating_key'])
href = page('info', row['rating_key'], history=True)
%>
<a href="${href}" title="${row['title']}">
${row['title']}
</a>
% elif stat_id == 'top_libraries':
<% library_href = page('library', row['section_id']) %>
<a href="${library_href}" title="${row['section_name']}">
${row['section_name']}
</a>
% elif stat_id == 'top_users':
<% user_href = page('user', row['user_id']) if row['user_id'] else '#' %>
<a href="${user_href}" title="${row['user']}">
@ -158,7 +177,9 @@ DOCUMENTATION :: END
% elif stat_id == 'top_platforms':
${row['platform']}
% elif stat_id == 'most_concurrent':
${row['title']}
<a href="graphs#concurrent-graph" title="${row['title']}">
${row['title']}
</a>
% endif
</div>
<div class="sub-count">

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -0,0 +1,46 @@
<svg id="livetype" xmlns="http://www.w3.org/2000/svg" width="119.66407" height="40" viewBox="0 0 119.66407 40">
<title>Download_on_the_App_Store_Badge_US-UK_RGB_blk_4SVG_092917</title>
<g>
<g>
<g>
<path d="M110.13477,0H9.53468c-.3667,0-.729,0-1.09473.002-.30615.002-.60986.00781-.91895.0127A13.21476,13.21476,0,0,0,5.5171.19141a6.66509,6.66509,0,0,0-1.90088.627A6.43779,6.43779,0,0,0,1.99757,1.99707,6.25844,6.25844,0,0,0,.81935,3.61816a6.60119,6.60119,0,0,0-.625,1.90332,12.993,12.993,0,0,0-.1792,2.002C.00587,7.83008.00489,8.1377,0,8.44434V31.5586c.00489.3105.00587.6113.01515.9219a12.99232,12.99232,0,0,0,.1792,2.0019,6.58756,6.58756,0,0,0,.625,1.9043A6.20778,6.20778,0,0,0,1.99757,38.001a6.27445,6.27445,0,0,0,1.61865,1.1787,6.70082,6.70082,0,0,0,1.90088.6308,13.45514,13.45514,0,0,0,2.0039.1768c.30909.0068.6128.0107.91895.0107C8.80567,40,9.168,40,9.53468,40H110.13477c.3594,0,.7246,0,1.084-.002.3047,0,.6172-.0039.9219-.0107a13.279,13.279,0,0,0,2-.1768,6.80432,6.80432,0,0,0,1.9082-.6308,6.27742,6.27742,0,0,0,1.6172-1.1787,6.39482,6.39482,0,0,0,1.1816-1.6143,6.60413,6.60413,0,0,0,.6191-1.9043,13.50643,13.50643,0,0,0,.1856-2.0019c.0039-.3106.0039-.6114.0039-.9219.0078-.3633.0078-.7246.0078-1.0938V9.53613c0-.36621,0-.72949-.0078-1.09179,0-.30664,0-.61426-.0039-.9209a13.5071,13.5071,0,0,0-.1856-2.002,6.6177,6.6177,0,0,0-.6191-1.90332,6.46619,6.46619,0,0,0-2.7988-2.7998,6.76754,6.76754,0,0,0-1.9082-.627,13.04394,13.04394,0,0,0-2-.17676c-.3047-.00488-.6172-.01074-.9219-.01269-.3594-.002-.7246-.002-1.084-.002Z" style="fill: #a6a6a6"/>
<path d="M8.44483,39.125c-.30468,0-.602-.0039-.90429-.0107a12.68714,12.68714,0,0,1-1.86914-.1631,5.88381,5.88381,0,0,1-1.65674-.5479,5.40573,5.40573,0,0,1-1.397-1.0166,5.32082,5.32082,0,0,1-1.02051-1.3965,5.72186,5.72186,0,0,1-.543-1.6572,12.41351,12.41351,0,0,1-.1665-1.875c-.00634-.2109-.01464-.9131-.01464-.9131V8.44434S.88185,7.75293.8877,7.5498a12.37039,12.37039,0,0,1,.16553-1.87207,5.7555,5.7555,0,0,1,.54346-1.6621A5.37349,5.37349,0,0,1,2.61183,2.61768,5.56543,5.56543,0,0,1,4.01417,1.59521a5.82309,5.82309,0,0,1,1.65332-.54394A12.58589,12.58589,0,0,1,7.543.88721L8.44532.875H111.21387l.9131.0127a12.38493,12.38493,0,0,1,1.8584.16259,5.93833,5.93833,0,0,1,1.6709.54785,5.59374,5.59374,0,0,1,2.415,2.41993,5.76267,5.76267,0,0,1,.5352,1.64892,12.995,12.995,0,0,1,.1738,1.88721c.0029.2832.0029.5874.0029.89014.0079.375.0079.73193.0079,1.09179V30.4648c0,.3633,0,.7178-.0079,1.0752,0,.3252,0,.6231-.0039.9297a12.73126,12.73126,0,0,1-.1709,1.8535,5.739,5.739,0,0,1-.54,1.67,5.48029,5.48029,0,0,1-1.0156,1.3857,5.4129,5.4129,0,0,1-1.3994,1.0225,5.86168,5.86168,0,0,1-1.668.5498,12.54218,12.54218,0,0,1-1.8692.1631c-.2929.0068-.5996.0107-.8974.0107l-1.084.002Z"/>
</g>
<g id="_Group_" data-name="&lt;Group&gt;">
<g id="_Group_2" data-name="&lt;Group&gt;">
<g id="_Group_3" data-name="&lt;Group&gt;">
<path id="_Path_" data-name="&lt;Path&gt;" d="M24.76888,20.30068a4.94881,4.94881,0,0,1,2.35656-4.15206,5.06566,5.06566,0,0,0-3.99116-2.15768c-1.67924-.17626-3.30719,1.00483-4.1629,1.00483-.87227,0-2.18977-.98733-3.6085-.95814a5.31529,5.31529,0,0,0-4.47292,2.72787c-1.934,3.34842-.49141,8.26947,1.3612,10.97608.9269,1.32535,2.01018,2.8058,3.42763,2.7533,1.38706-.05753,1.9051-.88448,3.5794-.88448,1.65876,0,2.14479.88448,3.591.8511,1.48838-.02416,2.42613-1.33124,3.32051-2.66914a10.962,10.962,0,0,0,1.51842-3.09251A4.78205,4.78205,0,0,1,24.76888,20.30068Z" style="fill: #fff"/>
<path id="_Path_2" data-name="&lt;Path&gt;" d="M22.03725,12.21089a4.87248,4.87248,0,0,0,1.11452-3.49062,4.95746,4.95746,0,0,0-3.20758,1.65961,4.63634,4.63634,0,0,0-1.14371,3.36139A4.09905,4.09905,0,0,0,22.03725,12.21089Z" style="fill: #fff"/>
</g>
</g>
<g>
<path d="M42.30227,27.13965h-4.7334l-1.13672,3.35645H34.42727l4.4834-12.418h2.083l4.4834,12.418H43.438ZM38.0591,25.59082h3.752l-1.84961-5.44727h-.05176Z" style="fill: #fff"/>
<path d="M55.15969,25.96973c0,2.81348-1.50586,4.62109-3.77832,4.62109a3.0693,3.0693,0,0,1-2.84863-1.584h-.043v4.48438h-1.8584V21.44238H48.4302v1.50586h.03418a3.21162,3.21162,0,0,1,2.88281-1.60059C53.645,21.34766,55.15969,23.16406,55.15969,25.96973Zm-1.91016,0c0-1.833-.94727-3.03809-2.39258-3.03809-1.41992,0-2.375,1.23047-2.375,3.03809,0,1.82422.95508,3.0459,2.375,3.0459C52.30227,29.01563,53.24953,27.81934,53.24953,25.96973Z" style="fill: #fff"/>
<path d="M65.12453,25.96973c0,2.81348-1.50586,4.62109-3.77832,4.62109a3.0693,3.0693,0,0,1-2.84863-1.584h-.043v4.48438h-1.8584V21.44238H58.395v1.50586h.03418A3.21162,3.21162,0,0,1,61.312,21.34766C63.60988,21.34766,65.12453,23.16406,65.12453,25.96973Zm-1.91016,0c0-1.833-.94727-3.03809-2.39258-3.03809-1.41992,0-2.375,1.23047-2.375,3.03809,0,1.82422.95508,3.0459,2.375,3.0459C62.26711,29.01563,63.21438,27.81934,63.21438,25.96973Z" style="fill: #fff"/>
<path d="M71.71047,27.03613c.1377,1.23145,1.334,2.04,2.96875,2.04,1.56641,0,2.69336-.80859,2.69336-1.91895,0-.96387-.67969-1.541-2.28906-1.93652l-1.60937-.3877c-2.28027-.55078-3.33887-1.61719-3.33887-3.34766,0-2.14258,1.86719-3.61426,4.51855-3.61426,2.624,0,4.42285,1.47168,4.4834,3.61426h-1.876c-.1123-1.23926-1.13672-1.9873-2.63379-1.9873s-2.52148.75684-2.52148,1.8584c0,.87793.6543,1.39453,2.25488,1.79l1.36816.33594c2.54785.60254,3.60645,1.626,3.60645,3.44238,0,2.32324-1.85059,3.77832-4.79395,3.77832-2.75391,0-4.61328-1.4209-4.7334-3.667Z" style="fill: #fff"/>
<path d="M83.34621,19.2998v2.14258h1.72168v1.47168H83.34621v4.99121c0,.77539.34473,1.13672,1.10156,1.13672a5.80752,5.80752,0,0,0,.61133-.043v1.46289a5.10351,5.10351,0,0,1-1.03223.08594c-1.833,0-2.54785-.68848-2.54785-2.44434V22.91406H80.16262V21.44238H81.479V19.2998Z" style="fill: #fff"/>
<path d="M86.065,25.96973c0-2.84863,1.67773-4.63867,4.29395-4.63867,2.625,0,4.29492,1.79,4.29492,4.63867,0,2.85645-1.66113,4.63867-4.29492,4.63867C87.72609,30.6084,86.065,28.82617,86.065,25.96973Zm6.69531,0c0-1.9541-.89551-3.10742-2.40137-3.10742s-2.40039,1.16211-2.40039,3.10742c0,1.96191.89453,3.10645,2.40039,3.10645S92.76027,27.93164,92.76027,25.96973Z" style="fill: #fff"/>
<path d="M96.18606,21.44238h1.77246v1.541h.043a2.1594,2.1594,0,0,1,2.17773-1.63574,2.86616,2.86616,0,0,1,.63672.06934v1.73828a2.59794,2.59794,0,0,0-.835-.1123,1.87264,1.87264,0,0,0-1.93652,2.083v5.37012h-1.8584Z" style="fill: #fff"/>
<path d="M109.3843,27.83691c-.25,1.64355-1.85059,2.77148-3.89844,2.77148-2.63379,0-4.26855-1.76465-4.26855-4.5957,0-2.83984,1.64355-4.68164,4.19043-4.68164,2.50488,0,4.08008,1.7207,4.08008,4.46582v.63672h-6.39453v.1123a2.358,2.358,0,0,0,2.43555,2.56445,2.04834,2.04834,0,0,0,2.09082-1.27344Zm-6.28223-2.70215h4.52637a2.1773,2.1773,0,0,0-2.2207-2.29785A2.292,2.292,0,0,0,103.10207,25.13477Z" style="fill: #fff"/>
</g>
</g>
</g>
<g id="_Group_4" data-name="&lt;Group&gt;">
<g>
<path d="M37.82619,8.731a2.63964,2.63964,0,0,1,2.80762,2.96484c0,1.90625-1.03027,3.002-2.80762,3.002H35.67092V8.731Zm-1.22852,5.123h1.125a1.87588,1.87588,0,0,0,1.96777-2.146,1.881,1.881,0,0,0-1.96777-2.13379h-1.125Z" style="fill: #fff"/>
<path d="M41.68068,12.44434a2.13323,2.13323,0,1,1,4.24707,0,2.13358,2.13358,0,1,1-4.24707,0Zm3.333,0c0-.97607-.43848-1.54687-1.208-1.54687-.77246,0-1.207.5708-1.207,1.54688,0,.98389.43457,1.55029,1.207,1.55029C44.57522,13.99463,45.01369,13.42432,45.01369,12.44434Z" style="fill: #fff"/>
<path d="M51.57326,14.69775h-.92187l-.93066-3.31641h-.07031l-.92676,3.31641h-.91309l-1.24121-4.50293h.90137l.80664,3.436h.06641l.92578-3.436h.85254l.92578,3.436h.07031l.80273-3.436h.88867Z" style="fill: #fff"/>
<path d="M53.85354,10.19482H54.709v.71533h.06641a1.348,1.348,0,0,1,1.34375-.80225,1.46456,1.46456,0,0,1,1.55859,1.6748v2.915h-.88867V12.00586c0-.72363-.31445-1.0835-.97168-1.0835a1.03294,1.03294,0,0,0-1.0752,1.14111v2.63428h-.88867Z" style="fill: #fff"/>
<path d="M59.09377,8.437h.88867v6.26074h-.88867Z" style="fill: #fff"/>
<path d="M61.21779,12.44434a2.13346,2.13346,0,1,1,4.24756,0,2.1338,2.1338,0,1,1-4.24756,0Zm3.333,0c0-.97607-.43848-1.54687-1.208-1.54687-.77246,0-1.207.5708-1.207,1.54688,0,.98389.43457,1.55029,1.207,1.55029C64.11232,13.99463,64.5508,13.42432,64.5508,12.44434Z" style="fill: #fff"/>
<path d="M66.4009,13.42432c0-.81055.60352-1.27783,1.6748-1.34424l1.21973-.07031v-.38867c0-.47559-.31445-.74414-.92187-.74414-.49609,0-.83984.18213-.93848.50049h-.86035c.09082-.77344.81836-1.26953,1.83984-1.26953,1.12891,0,1.76563.562,1.76563,1.51318v3.07666h-.85547v-.63281h-.07031a1.515,1.515,0,0,1-1.35254.707A1.36026,1.36026,0,0,1,66.4009,13.42432Zm2.89453-.38477v-.37646l-1.09961.07031c-.62012.0415-.90137.25244-.90137.64941,0,.40527.35156.64111.835.64111A1.0615,1.0615,0,0,0,69.29543,13.03955Z" style="fill: #fff"/>
<path d="M71.34816,12.44434c0-1.42285.73145-2.32422,1.86914-2.32422a1.484,1.484,0,0,1,1.38086.79h.06641V8.437h.88867v6.26074h-.85156v-.71143h-.07031a1.56284,1.56284,0,0,1-1.41406.78564C72.0718,14.772,71.34816,13.87061,71.34816,12.44434Zm.918,0c0,.95508.4502,1.52979,1.20313,1.52979.749,0,1.21191-.583,1.21191-1.52588,0-.93848-.46777-1.52979-1.21191-1.52979C72.72121,10.91846,72.26613,11.49707,72.26613,12.44434Z" style="fill: #fff"/>
<path d="M79.23,12.44434a2.13323,2.13323,0,1,1,4.24707,0,2.13358,2.13358,0,1,1-4.24707,0Zm3.333,0c0-.97607-.43848-1.54687-1.208-1.54687-.77246,0-1.207.5708-1.207,1.54688,0,.98389.43457,1.55029,1.207,1.55029C82.12453,13.99463,82.563,13.42432,82.563,12.44434Z" style="fill: #fff"/>
<path d="M84.66945,10.19482h.85547v.71533h.06641a1.348,1.348,0,0,1,1.34375-.80225,1.46456,1.46456,0,0,1,1.55859,1.6748v2.915H87.605V12.00586c0-.72363-.31445-1.0835-.97168-1.0835a1.03294,1.03294,0,0,0-1.0752,1.14111v2.63428h-.88867Z" style="fill: #fff"/>
<path d="M93.51516,9.07373v1.1416h.97559v.74854h-.97559V13.2793c0,.47168.19434.67822.63672.67822a2.96657,2.96657,0,0,0,.33887-.02051v.74023a2.9155,2.9155,0,0,1-.4834.04541c-.98828,0-1.38184-.34766-1.38184-1.21582v-2.543h-.71484v-.74854h.71484V9.07373Z" style="fill: #fff"/>
<path d="M95.70461,8.437h.88086v2.48145h.07031a1.3856,1.3856,0,0,1,1.373-.80664,1.48339,1.48339,0,0,1,1.55078,1.67871v2.90723H98.69v-2.688c0-.71924-.335-1.0835-.96289-1.0835a1.05194,1.05194,0,0,0-1.13379,1.1416v2.62988h-.88867Z" style="fill: #fff"/>
<path d="M104.76125,13.48193a1.828,1.828,0,0,1-1.95117,1.30273A2.04531,2.04531,0,0,1,100.73,12.46045a2.07685,2.07685,0,0,1,2.07617-2.35254c1.25293,0,2.00879.856,2.00879,2.27V12.688h-3.17969v.0498a1.1902,1.1902,0,0,0,1.19922,1.29,1.07934,1.07934,0,0,0,1.07129-.5459Zm-3.126-1.45117h2.27441a1.08647,1.08647,0,0,0-1.1084-1.1665A1.15162,1.15162,0,0,0,101.63527,12.03076Z" style="fill: #fff"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

View file

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="120px" height="120px" viewBox="0 0 120 120" enable-background="new 0 0 120 120" xml:space="preserve">
<g>
<path fill="#BEBEBE" d="M31.161,105.119c4.747-3.413,10.392-5.561,16.939-6.444c2.645,1.983,6.611,2.976,11.9,2.976
c5.288,0,9.255-0.992,11.9-2.976c6.546,0.884,12.192,3.031,16.938,6.444c-8.325,5.336-18.223,8.431-28.838,8.431
C49.385,113.55,39.487,110.455,31.161,105.119z"/>
<path fill="#D6D6D6" d="M48.1,98.675l2.737-8.553C42.241,84.96,36.2,72.758,36.2,58.526c0-7.478,1.669-14.397,4.498-20.029
c3.436,1.059,7.504,1.669,11.864,1.669c10.86,0,19.907-3.795,21.903-8.822c5.676,6.256,9.334,16.104,9.334,27.182
c0,14.232-6.041,26.434-14.637,31.596l2.737,8.553c-2.646,1.983-6.612,2.976-11.9,2.976c-5.248,0-9.194-0.977-11.838-2.929
L48.1,98.675z"/>
<path fill="#A6A6A6" d="M38.763,73.994C33.496,68.09,30.25,60,30.25,51.075C30.25,33.002,43.57,18.35,60,18.35
c16.431,0,29.75,14.65,29.75,32.724c0,8.925-3.247,17.016-8.514,22.92c1.64-4.647,2.563-9.901,2.563-15.468
c0-11.078-3.658-20.925-9.334-27.182c-1.996,5.027-11.043,8.822-21.903,8.822c-4.36,0-8.428-0.611-11.864-1.669
C37.868,44.128,36.2,51.048,36.2,58.526C36.2,64.093,37.124,69.348,38.763,73.994z"/>
<path fill="#D6D6D6" d="M60,113.55c29.575,0,53.55-23.974,53.55-53.55c0-29.575-23.975-53.55-53.55-53.55
C30.425,6.45,6.45,30.425,6.45,60C6.45,89.576,30.425,113.55,60,113.55z M60,119.5C27.138,119.5,0.5,92.86,0.5,60
S27.138,0.5,60,0.5c32.86,0,59.5,26.64,59.5,59.499C119.5,92.86,92.86,119.5,60,119.5z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

View file

@ -18,6 +18,5 @@
],
"theme_color": "#282a2d",
"background_color": "#282a2d",
"display": "standalone",
"orientation": "any"
"display": "standalone"
}

View file

@ -0,0 +1,113 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 23.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
<!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
<!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
<!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
<!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
<!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
<!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
<!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
<!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
]>
<svg version="1.1" id="Livello_1" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 5435.8 1604"
style="enable-background:new 0 0 5435.8 1604;" xml:space="preserve">
<style type="text/css">
.st0{fill-rule:evenodd;clip-rule:evenodd;}
.st1{fill-rule:evenodd;clip-rule:evenodd;fill:#A6A6A6;}
.st2{fill:#FFFFFF;}
.st3{fill-rule:evenodd;clip-rule:evenodd;fill:#FFFFFF;}
.st4{fill-rule:evenodd;clip-rule:evenodd;fill:url(#SVGID_1_);}
.st5{fill-rule:evenodd;clip-rule:evenodd;fill:url(#SVGID_2_);}
.st6{fill-rule:evenodd;clip-rule:evenodd;fill:url(#SVGID_3_);}
.st7{fill-rule:evenodd;clip-rule:evenodd;fill:url(#SVGID_4_);}
.st8{opacity:0.2;fill-rule:evenodd;clip-rule:evenodd;enable-background:new ;}
.st9{opacity:0.12;fill-rule:evenodd;clip-rule:evenodd;enable-background:new ;}
.st10{opacity:0.25;fill-rule:evenodd;clip-rule:evenodd;fill:#FFFFFF;enable-background:new ;}
</style>
<metadata>
<sfw xmlns="&ns_sfw;">
<slices></slices>
<sliceSourceBounds bottomLeftOrigin="true" height="1604" width="5435.8" x="-2656.9" y="-784"></sliceSourceBounds>
</sfw>
</metadata>
<path class="st0" d="M5234.4,1604h-5033C90.4,1604,0,1513.6,0,1403.5v-1203C0,90,90.4,0,201.4,0h5033c110.9,0,201.4,90,201.4,200.5
v1203C5435.8,1513.6,5345.3,1604,5234.4,1604z"/>
<path class="st1" d="M5234.4,32.1c93.1,0,169.3,75.7,169.3,168.4v1203c0,92.7-75.7,168.4-169.3,168.4h-5033
c-93.1,0-169.3-75.7-169.3-168.4v-1203c0-92.7,75.7-168.4,169.3-168.4C201.4,32.1,5234.4,32.1,5234.4,32.1z M5234.4,0h-5033
C90.4,0,0,90.4,0,200.5v1203C0,1514,90.4,1604,201.4,1604h5033c110.9,0,201.4-90,201.4-200.5v-1203C5435.8,90.4,5345.3,0,5234.4,0z"
/>
<path class="st2" d="M2863.6,530.6c-36.3,0-66.9-12.7-91.1-37.7c-24-24.3-37.4-57.8-36.8-92c0-36.5,12.4-67.4,36.8-91.9
c24.1-25,54.7-37.7,91-37.7c35.9,0,66.5,12.7,91.1,37.7c24.4,25.3,36.8,56.2,36.8,91.9c-0.4,36.6-12.8,67.5-36.8,91.9
C2930.5,518,2899.9,530.6,2863.6,530.6z M1783.5,530.6c-35.5,0-66.3-12.5-91.5-37.2c-25-24.6-37.7-55.7-37.7-92.4
s12.7-67.8,37.7-92.4c24.7-24.7,55.5-37.2,91.5-37.2c17.6,0,34.7,3.5,51.1,10.6c16.1,6.9,29.2,16.3,38.9,27.8l2.4,2.9l-27.1,26.6
l-2.8-3.3c-15.3-18.2-35.8-27.1-62.9-27.1c-24.2,0-45.3,8.6-62.7,25.6c-17.5,17.1-26.4,39.5-26.4,66.6s8.9,49.5,26.4,66.6
c17.4,17,38.5,25.6,62.7,25.6c25.8,0,47.5-8.6,64.4-25.6c10-10,16.2-24,18.4-41.7h-86.9v-37.4h124.2l0.5,3.4
c0.9,6.3,1.8,12.8,1.8,18.8c0,34.5-10.4,62.4-31,83C1851.1,518.2,1820.5,530.6,1783.5,530.6z M3219.6,525.3h-38.3L3064,337.6l1,33.8
v153.8h-38.3V276.7h43.7l1.2,1.9l110.3,176.8l-1-33.7V276.7h38.7V525.3z M2575.8,525.3H2537V314.1h-67.3v-37.4H2643v37.4h-67.3
V525.3z M2438.1,525.3h-38.7V276.7h38.7V525.3z M2220.6,525.3h-38.7V314.1h-67.3v-37.4h173.3v37.4h-67.3V525.3z M2090.1,524.9
h-148.4V276.7h148.4v37.4h-109.6v68.2h98.9v37h-98.9v68.2h109.6V524.9z M2800.9,467.2c17.3,17.3,38.3,26,62.7,26
c25.1,0,45.6-8.5,62.7-26c17-17,25.6-39.3,25.6-66.2s-8.6-49.3-25.5-66.2c-17.3-17.3-38.4-26-62.7-26c-25.1,0-45.6,8.5-62.6,26
c-17,17-25.6,39.3-25.6,66.2S2784,450.3,2800.9,467.2L2800.9,467.2z"/>
<path class="st3" d="M2732.1,872.4c-94.5,0-171.1,71.7-171.1,170.6c0,98,77.1,170.6,171.1,170.6c94.5,0,171.1-72.2,171.1-170.6
C2903.2,944.1,2826.6,872.4,2732.1,872.4z M2732.1,1146c-51.7,0-96.2-42.8-96.2-103.4c0-61.5,44.6-103.4,96.2-103.4
c51.7,0,96.2,41.9,96.2,103.4C2828.4,1103.6,2783.8,1146,2732.1,1146z M2358.8,872.4c-94.5,0-171.1,71.7-171.1,170.6
c0,98,77.1,170.6,171.1,170.6c94.5,0,171.1-72.2,171.1-170.6C2529.9,944.1,2453.2,872.4,2358.8,872.4z M2358.8,1146
c-51.7,0-96.2-42.8-96.2-103.4c0-61.5,44.6-103.4,96.2-103.4c51.7,0,96.2,41.9,96.2,103.4C2455,1103.6,2410.5,1146,2358.8,1146z
M1914.6,924.5v72.2h173.3c-5.3,40.5-18.7,70.4-39.2,90.9c-25.4,25.4-64.6,53-133.7,53c-106.5,0-189.8-86-189.8-192.5
s83.3-192.5,189.8-192.5c57.5,0,99.4,22.7,130.5,51.7l51.2-51.2c-43.2-41.4-100.7-73.1-181.3-73.1c-146.1,0-268.7,119-268.7,264.7
c0,146.1,122.5,264.7,268.7,264.7c78.9,0,138.1-25.8,184.9-74.4c47.7-47.7,62.8-115,62.8-169.3c0-16.9-1.3-32.1-4-45h-244.6
C1914.6,923.6,1914.6,924.5,1914.6,924.5z M3731.5,980.7c-14.3-38.3-57.5-108.7-146.1-108.7c-87.8,0-160.8,69.1-160.8,170.6
c0,95.8,72.2,170.6,169.3,170.6c78,0,123.4-47.7,142.1-75.7l-57.9-38.8c-19.2,28.5-45.9,47.2-83.8,47.2c-38.3,0-65.1-17.4-82.9-51.7
l228.1-94.5C3739.5,999.8,3731.5,980.7,3731.5,980.7z M3498.9,1037.7c-1.8-65.9,51.2-99.4,89.1-99.4c29.9,0,54.8,14.7,63.3,36.1
L3498.9,1037.7z M3313.6,1203h74.9V701.8h-74.9V1203z M3190.6,910.3h-2.7c-16.9-20.1-49-38.3-90-38.3
c-85.1,0-163.5,74.9-163.5,171.1c0,95.8,78,169.8,163.5,169.8c40.5,0,73.1-18.3,90-38.8h2.7v24.5c0,65.1-34.8,100.2-90.9,100.2
c-45.9,0-74.4-33-86-60.6l-65.1,27.2c18.7,45,68.6,100.7,151,100.7c87.8,0,162.2-51.7,162.2-177.8V882.2h-70.8v28.1
C3191.1,910.3,3190.6,910.3,3190.6,910.3z M3104.6,1146c-51.7,0-94.9-43.2-94.9-102.9c0-60.2,43.2-103.8,94.9-103.8
c51.2,0,90.9,44.1,90.9,103.8C3196,1102.8,3155.9,1146,3104.6,1146z M4082.2,701.8h-179.1V1203h74.9v-189.8h104.3
c82.9,0,164.4-60.1,164.4-155.5S4165.5,701.8,4082.2,701.8z M4084.4,943.2h-106.5v-172h106.5c56.1,0,87.8,46.3,87.8,86
C4172.2,896.5,4140.1,943.2,4084.4,943.2z M4546.9,871.5c-54.4,0-110.5,24.1-133.7,76.6l66.4,27.6c14.3-27.6,40.5-37,68.2-37
c38.8,0,78,23.2,78.9,64.6v5.3c-13.4-7.6-42.8-19.2-78-19.2c-71.7,0-144.4,39.2-144.4,112.7c0,67.3,58.8,110.5,124.3,110.5
c50.3,0,78-22.7,95.3-49h2.7v38.8h72.2v-192C4698.8,921,4632.4,871.5,4546.9,871.5z M4537.5,1146c-24.5,0-58.8-12-58.8-42.8
c0-38.8,42.8-53.5,79.3-53.5c33,0,48.6,7.1,68.2,16.9C4620.8,1111.6,4582.8,1145.6,4537.5,1146z M4962.2,882.2l-86,217.4h-2.7
l-89.1-217.4h-80.6l133.7,303.9l-76.2,168.9h78L5045,882.2C5045,882.2,4962.2,882.2,4962.2,882.2z M4288,1203h74.9V701.8H4288V1203z
"/>
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="1682.1077" y1="1339.4783" x2="1624.2924" y2="1309.6345" gradientTransform="matrix(11.64 0 0 -22.55 -18705.5957 30554.3691)">
<stop offset="0" style="stop-color:#00A0FF"/>
<stop offset="6.569999e-03" style="stop-color:#00A1FF"/>
<stop offset="0.2601" style="stop-color:#00BEFF"/>
<stop offset="0.5122" style="stop-color:#00D2FF"/>
<stop offset="0.7604" style="stop-color:#00DFFF"/>
<stop offset="1" style="stop-color:#00E3FF"/>
</linearGradient>
<path class="st4" d="M418.4,302.1c-11.6,12.5-18.3,31.6-18.3,56.6v886.7c0,25,6.7,44.1,18.7,56.1l3.1,2.7l496.8-496.8v-11.1
L421.5,299.4C421.5,299.4,418.4,302.1,418.4,302.1z"/>
<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="1712.6624" y1="1274.8376" x2="1606.5613" y2="1274.8376" gradientTransform="matrix(9.145 0 0 -7.7 -14305.5381 10618.251)">
<stop offset="0" style="stop-color:#FFE000"/>
<stop offset="0.4087" style="stop-color:#FFBD00"/>
<stop offset="0.7754" style="stop-color:#FFA500"/>
<stop offset="1" style="stop-color:#FF9C00"/>
</linearGradient>
<path class="st5" d="M1084,973.5L918.3,807.8v-11.6L1084,630.5l3.6,2.2l196,111.4c56.1,31.6,56.1,83.8,0,115.8l-196,111.4
C1087.6,971.3,1084,973.5,1084,973.5z"/>
<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="1707.4414" y1="1290.0475" x2="1646.682" y2="1211.2225" gradientTransform="matrix(15.02 0 0 -11.5775 -24650.2285 15829.6484)">
<stop offset="0" style="stop-color:#FF3A44"/>
<stop offset="1" style="stop-color:#C31162"/>
</linearGradient>
<path class="st6" d="M1087.6,971.3L918.3,802l-499.9,499.9c18.3,19.6,49,21.8,83.3,2.7L1087.6,971.3"/>
<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="1660.6357" y1="1365.6676" x2="1687.767" y2="1330.4501" gradientTransform="matrix(15.02 0 0 -11.5715 -24650.2285 15809.9922)">
<stop offset="0" style="stop-color:#32A071"/>
<stop offset="6.850000e-02" style="stop-color:#2DA771"/>
<stop offset="0.4762" style="stop-color:#15CF74"/>
<stop offset="0.8009" style="stop-color:#06E775"/>
<stop offset="1" style="stop-color:#00F076"/>
</linearGradient>
<path class="st7" d="M1087.6,632.7L501.7,299.9c-34.3-19.6-65.1-16.9-83.3,2.7L918.3,802L1087.6,632.7z"/>
<path class="st8" d="M1084,967.7l-581.9,330.6c-32.5,18.7-61.5,17.4-80.2,0.4l-3.1,3.1l3.1,2.7c18.7,16.9,47.7,18.3,80.2-0.4
L1088,971.3C1088,971.3,1084,967.7,1084,967.7z"/>
<path class="st9" d="M1283.6,854.1l-200.1,113.6l3.6,3.6l196-111.4c28.1-16,41.9-37,41.9-57.9C1323.3,821.2,1309,839.4,1283.6,854.1
z"/>
<path class="st10" d="M501.7,305.7l781.9,444.2c25.4,14.3,39.7,33,41.9,52.1c0-20.9-13.8-41.9-41.9-57.9L501.7,299.9
c-56.1-32.1-101.6-5.3-101.6,58.8v5.8C400.1,300.3,445.6,274,501.7,305.7z"/>
</svg>

After

Width:  |  Height:  |  Size: 9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Before After
Before After

View file

@ -1,5 +1,11 @@
<!-- Generated by IcoMoon.io -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="32px" height="32px" viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
<title>artist</title>
<path fill="#fff" d="M9.201 24.681c0-6.699 0-13.358 0-20.035 7.594-1.505 15.157-3.004 22.768-4.513 0 0.172 0 0.319 0 0.465 0 7.067-0.026 14.135 0.021 21.202 0.010 1.498-0.59 2.57-1.716 3.423-1.999 1.512-4.26 2.145-6.751 1.88-0.504-0.054-1.020-0.205-1.481-0.418-1.502-0.695-1.856-2.122-0.908-3.48 0.826-1.184 1.99-1.924 3.302-2.433 1.362-0.528 2.774-0.843 4.252-0.719 0.324 0.027 0.646 0.084 0.994 0.13 0-4.345 0-8.679 0-13.050-6.062 1.204-12.099 2.404-18.16 3.608 0 0.196 0 0.345 0 0.495 0 5.174-0.006 10.349 0.004 15.523 0.003 1.409-0.802 2.302-1.854 3.056-0.889 0.637-1.859 1.114-2.906 1.426-1.524 0.453-3.067 0.627-4.619 0.169-0.952-0.281-1.789-0.736-2.010-1.83-0.136-0.673 0.098-1.269 0.459-1.822 0.772-1.183 1.947-1.853 3.193-2.388 1.662-0.714 3.394-1.043 5.207-0.698 0.048 0.009 0.099 0.005 0.206 0.010z"></path>
<path fill="#FFFFFF" d="M29.369,0.72H10.271C8.864,0.722,7.726,1.861,7.724,3.267v18.534c-0.771-0.459-1.649-0.703-2.546-0.709
c-2.813,0-5.094,2.281-5.094,5.094s2.281,5.094,5.094,5.094s5.093-2.281,5.093-5.094V10.907h19.099v10.894
c-0.771-0.459-1.649-0.703-2.546-0.709c-2.813,0-5.094,2.281-5.094,5.094s2.281,5.094,5.094,5.094s5.093-2.281,5.093-5.094V3.267
C31.914,1.861,30.775,0.722,29.369,0.72z M10.271,3.267h19.099V8.36H10.271V3.267z"/>
</svg>

Before

Width:  |  Height:  |  Size: 979 B

After

Width:  |  Height:  |  Size: 931 B

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 6.4 KiB

Before After
Before After

View file

@ -1,9 +1,36 @@
<!-- Generated by IcoMoon.io -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
<title>live</title>
<path fill="#fff" d="M9.636 10.115c-0.829 0.544-1.243 0.816-2.072 1.361-2.331-3.547-2.331-6.195 0-9.749 0.829 0.546 1.244 0.819 2.072 1.361-1.68 2.557-1.68 4.464 0 7.027z"></path>
<path fill="#fff" d="M4.374 11.662c-0.828 0.542-1.243 0.815-2.072 1.359-3.069-4.676-3.069-8.159 0-12.838 0.829 0.546 1.244 0.817 2.072 1.362-2.418 3.684-2.418 6.426 0 10.117z"></path>
<path fill="#fff" d="M22.365 10.115c0.826 0.544 1.242 0.816 2.070 1.361 2.334-3.547 2.334-6.195 0-9.749-0.828 0.546-1.244 0.819-2.070 1.361 1.677 2.557 1.677 4.464 0 7.027z"></path>
<path fill="#fff" d="M27.627 11.662c0.827 0.542 1.243 0.815 2.070 1.359 3.070-4.676 3.070-8.159 0-12.838-0.827 0.546-1.243 0.817-2.070 1.362 2.419 3.684 2.419 6.426 0 10.117z"></path>
<path fill="#fff" d="M25.211 31.982l2.611-0.95-8.172-22.45c0.32-0.589 0.502-1.263 0.502-1.979 0-2.293-1.859-4.152-4.152-4.152s-4.151 1.858-4.151 4.152c0 0.672 0.16 1.305 0.443 1.868l-8.212 22.561 2.612 0.95 1.952-5.362h14.616l1.951 5.362zM17.396 10.513l3.945 10.834-7.903-7.9 1.080-2.966c0.46 0.176 0.96 0.272 1.481 0.272 0.49 0.001 0.961-0.084 1.397-0.24zM12.39 16.329l7.51 7.512h-10.245l2.735-7.512z"></path>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_2" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="32px" height="32px" viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
<g>
<polygon fill="none" points="12.252,15.364 9.287,23.717 20.6,23.709 "/>
<path fill="none" d="M13.122,12.92l8.846,8.846l-4.158-11.71c-0.558,0.271-1.175,0.437-1.839,0.437
c-0.66,0-1.276-0.164-1.833-0.434L13.122,12.92z"/>
<path fill="#FFFFFF" d="M19.663,8.28c0.33-0.601,0.529-1.277,0.529-2.008c0-2.333-1.892-4.223-4.222-4.223s-4.222,1.89-4.222,4.223
c0,0.733,0.203,1.412,0.532,2.013l-7.56,21.292c-0.248,0.697,0.047,1.434,0.656,1.654c0.608,0.215,1.305-0.177,1.549-0.865
l1.53-4.309l15.034-0.007l1.532,4.315c0.247,0.688,0.941,1.08,1.549,0.865c0.61-0.221,0.904-0.957,0.658-1.654L19.663,8.28z
M17.81,10.057l4.158,11.71l-8.846-8.846l1.016-2.861c0.557,0.27,1.173,0.434,1.833,0.434
C16.635,10.493,17.252,10.328,17.81,10.057z M12.252,15.364l8.347,8.345L9.287,23.717L12.252,15.364z"/>
<g>
<path fill="#FFFFFF" d="M3.638,1.458C3.189,0.996,2.563,0.875,2.279,1.211c-3.043,3.578-3.045,8.859-0.002,12.44
c0.284,0.335,0.913,0.214,1.362-0.25c0.452-0.462,0.628-1.022,0.424-1.264C1.76,9.428,1.762,5.433,4.064,2.726
C4.267,2.484,4.089,1.924,3.638,1.458z"/>
</g>
<g>
<path fill="#FFFFFF" d="M28.303,1.46c-0.45,0.464-0.626,1.021-0.421,1.261c2.303,2.71,2.3,6.707-0.003,9.412
c-0.205,0.24-0.025,0.802,0.424,1.266c0.448,0.466,1.075,0.586,1.361,0.25c3.044-3.578,3.046-8.86,0.003-12.441
C29.38,0.873,28.753,0.996,28.303,1.46z"/>
</g>
<g>
<path fill="#FFFFFF" d="M8.847,11.926c0.453-0.465,0.687-0.966,0.546-1.132C7.78,8.897,7.781,6.1,9.392,4.205
c0.141-0.167-0.094-0.672-0.545-1.138c-0.448-0.463-1.019-0.639-1.24-0.376c-2.351,2.766-2.353,6.848,0,9.616
C7.826,12.569,8.398,12.39,8.847,11.926z"/>
</g>
<g>
<path fill="#FFFFFF" d="M23.182,11.858c0.45,0.466,1.017,0.642,1.24,0.379c2.353-2.766,2.354-6.849,0.001-9.617
C24.199,2.362,23.63,2.54,23.18,3.004c-0.449,0.464-0.685,0.967-0.542,1.132c1.611,1.896,1.61,4.692-0.001,6.587
C22.495,10.888,22.73,11.393,23.182,11.858z"/>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Before After
Before After

View file

@ -1,5 +1,17 @@
<!-- Generated by IcoMoon.io -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
<title>movie</title>
<path fill="#fff" d="M0 1.416c10.695 0 21.315 0 32 0 0 9.719 0 19.417 0 29.168-10.635 0-21.293 0-32 0 0-9.699 0-19.399 0-29.168zM9.202 15.129c4.535 0 9.065 0 13.609 0 0-3.798 0-7.579 0-11.355-4.563 0-9.075 0-13.609 0 0 3.801 0 7.551 0 11.355zM9.215 28.909c4.581 0 9.093 0 13.61 0 0-3.818 0-7.585 0-11.382-4.549 0-9.062 0-13.61 0 0 3.803 0 7.57 0 11.382zM6.813 5.983c0-0.753 0-1.467 0-2.209-1.138 0-2.235 0-3.33 0 0 0.766 0 1.48 0 2.209 1.131 0 2.21 0 3.33 0zM25.231 3.754c0 0.783 0 1.494 0 2.219 1.141 0 2.235 0 3.33 0 0-0.763 0-1.476 0-2.219-1.12 0-2.198 0-3.33 0zM25.233 12.938c0 0.777 0 1.492 0 2.19 1.149 0 2.248 0 3.335 0 0-0.754 0-1.452 0-2.19-1.116 0-2.197 0-3.335 0zM25.227 22.074c0 0.783 0 1.496 0 2.218 1.139 0 2.235 0 3.335 0 0-0.758 0-1.471 0-2.218-1.119 0-2.196 0-3.335 0zM3.472 26.689c0 0.768 0 1.481 0 2.221 1.133 0 2.226 0 3.34 0 0-0.763 0-1.475 0-2.221-1.119 0-2.197 0-3.34 0zM28.579 26.711c-1.112 0-2.225 0-3.353 0 0 0.749 0 1.462 0 2.202 1.137 0 2.233 0 3.353 0 0-0.748 0-1.447 0-2.202zM6.817 15.155c0-0.774 0-1.468 0-2.21-1.133 0-2.229 0-3.338 0 0 0.761 0 1.473 0 2.21 1.127 0 2.207 0 3.338 0zM3.463 19.73c1.165 0 2.242 0 3.346 0 0-0.759 0-1.469 0-2.189-1.143 0-2.239 0-3.346 0 0 0.748 0 1.446 0 2.189zM28.559 19.733c0-0.764 0-1.479 0-2.188-1.144 0-2.241 0-3.34 0 0 0.752 0 1.448 0 2.188 1.114 0 2.195 0 3.34 0zM6.791 24.304c0-0.798 0-1.511 0-2.215-1.145 0-2.225 0-3.312 0 0 0.766 0 1.481 0 2.215 1.129 0 2.211 0 3.312 0zM3.489 8.378c0 0.771 0 1.464 0 2.145 1.138 0 2.219 0 3.319 0 0-0.74 0-1.431 0-2.145-1.129 0-2.211 0-3.319 0zM28.554 10.538c0-0.775 0-1.464 0-2.137-1.146 0-2.242 0-3.319 0 0 0.747 0 1.438 0 2.137 1.131 0 2.21 0 3.319 0z"></path>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="32px"
height="32px" viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
<g id="Layer_1">
<title>artist</title>
</g>
<g id="Layer_2">
<path fill="#FFFFFF" d="M29.508,0.241H2.492c-1.242,0-2.251,1.008-2.251,2.251v27.015c0,1.242,1.009,2.252,2.251,2.252h27.016
c1.242,0,2.251-1.01,2.251-2.252V2.493C31.759,1.25,30.75,0.241,29.508,0.241z M4.744,29.508H2.492v-3.002h2.252V29.508z
M4.744,24.255H2.492v-3.753h2.252V24.255z M4.744,18.252H2.492V14.5h2.252V18.252z M4.744,12.248H2.492V8.496h2.252V12.248z
M4.744,6.245H2.492V2.493h2.252V6.245z M25.005,29.508H6.995V16.75h18.01V29.508z M25.005,14.5H6.995V2.493h18.01V14.5z
M29.508,29.508h-2.252v-3.002h2.252V29.508z M29.508,24.255h-2.252v-3.753h2.252V24.255z M29.508,18.252h-2.252V14.5h2.252V18.252
z M29.508,12.248h-2.252V8.496h2.252V12.248z M29.508,6.245h-2.252V2.493h2.252V6.245z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

Before After
Before After

View file

@ -1,6 +1,25 @@
<!-- Generated by IcoMoon.io -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
<title>photo</title>
<path fill="#fff" d="M25.208 2.266c0 1.514 0 2.976 0 4.513 2.281 0 4.505 0 6.792 0 0 7.681 0 15.287 0 22.955-10.643 0-21.3 0-32 0 0-7.626 0-15.236 0-22.913 2.258 0 4.486 0 6.792 0 0-1.546 0-3.029 0-4.555 6.152 0 12.226 0 18.415 0zM16.008 9.209c-5.026-0.004-9.12 4.079-9.123 9.099-0.004 4.961 4.099 9.069 9.074 9.085 5.022 0.016 9.124-4.047 9.159-9.070 0.035-4.985-4.087-9.109-9.109-9.114z"></path>
<path fill="#fff" d="M20.601 18.292c0.003 2.551-2.070 4.626-4.61 4.613-2.558-0.013-4.595-2.069-4.591-4.634 0.003-2.524 2.038-4.557 4.577-4.572 2.562-0.015 4.621 2.030 4.624 4.593z"></path>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="32px"
height="32px" viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
<g id="Layer_2">
</g>
<g id="Layer_3">
<g>
<path fill="#FFFFFF" d="M30.807,8.975c-0.587-0.596-1.388-0.933-2.224-0.934h-5.158l-0.855-2.599
c-0.207-0.633-0.607-1.184-1.145-1.577c-0.536-0.389-1.18-0.6-1.84-0.6h-7.171c-0.661,0-1.306,0.211-1.84,0.602
C10.037,4.259,9.637,4.811,9.43,5.442L8.573,8.041H3.416C2.579,8.042,1.779,8.379,1.192,8.975c-0.591,0.6-0.923,1.408-0.923,2.25
V25.55c0,0.843,0.332,1.65,0.923,2.25c0.587,0.596,1.387,0.932,2.224,0.934h25.167c0.836-0.002,1.637-0.338,2.224-0.934
c0.591-0.6,0.923-1.407,0.923-2.25V11.225C31.729,10.383,31.397,9.574,30.807,8.975z M29.482,25.55
c0,0.258-0.103,0.497-0.273,0.672c-0.165,0.168-0.391,0.265-0.627,0.266H3.418c-0.237-0.001-0.462-0.098-0.628-0.266
c-0.176-0.181-0.274-0.422-0.273-0.674v-14.32c0-0.258,0.103-0.499,0.273-0.673c0.172-0.173,0.396-0.266,0.627-0.267h6.782
l1.365-4.144c0.063-0.189,0.181-0.351,0.334-0.463c0.152-0.11,0.332-0.169,0.514-0.169h7.175c0.182,0,0.361,0.059,0.514,0.169
c0.153,0.112,0.271,0.273,0.335,0.463l1.363,4.144h6.783c0.23,0,0.456,0.094,0.627,0.267c0.171,0.174,0.272,0.413,0.273,0.671
V25.55z"/>
<path fill="#FFFFFF" d="M16,10.7c-3.764,0-6.813,3.049-6.813,6.812c0,3.765,3.05,6.815,6.813,6.815
c3.763,0,6.813-3.051,6.813-6.815C22.813,13.749,19.763,10.7,16,10.7z M15.999,22.082c-2.523,0-4.568-2.045-4.568-4.568
s2.045-4.569,4.568-4.569c2.524,0,4.569,2.046,4.569,4.569S18.523,22.082,15.999,22.082z"/>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 746 B

After

Width:  |  Height:  |  Size: 1.8 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 875 B

Before After
Before After

View file

@ -1,12 +1,9 @@
<!-- Generated by IcoMoon.io -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
<title>playlist</title>
<path fill="#fff" d="M9.167 10.268c7.653 0 15.208 0 22.82 0 0 1.147 0 2.268 0 3.451-7.583 0-15.172 0-22.82 0 0-1.134 0-2.274 0-3.451z"></path>
<path fill="#fff" d="M9.14 21.73c0-1.152 0-2.257 0-3.424 7.609 0 15.212 0 22.86 0 0 1.132 0 2.252 0 3.424-7.607 0-15.191 0-22.86 0z"></path>
<path fill="#fff" d="M9.217 5.679c0-1.145 0-2.23 0-3.363 7.562 0 15.101 0 22.683 0 0 1.113 0 2.213 0 3.363-7.539 0-15.080 0-22.683 0z"></path>
<path fill="#fff" d="M9.225 29.708c0-1.132 0-2.214 0-3.336 7.558 0 15.086 0 22.668 0 0 1.086 0 2.186 0 3.336-7.526 0-15.071 0-22.668 0z"></path>
<path fill="#fff" d="M0.007 10.279c1.58 0 3.043 0 4.551 0 0 1.153 0 2.272 0 3.444-1.511 0-3.011 0-4.551 0 0-1.157 0-2.292 0-3.444z"></path>
<path fill="#fff" d="M4.527 2.292c0 1.183 0 2.284 0 3.424-1.496 0-2.957 0-4.479 0 0-1.142 0-2.276 0-3.424 1.51 0 2.971 0 4.479 0z"></path>
<path fill="#fff" d="M4.571 18.3c0 1.151 0 2.254 0 3.416-1.515 0-3.019 0-4.571 0 0-1.127 0-2.247 0-3.416 1.513 0 3.001 0 4.571 0z"></path>
<path fill="#fff" d="M4.54 26.352c0 1.137 0 2.218 0 3.354-1.494 0-2.975 0-4.506 0 0-1.094 0-2.192 0-3.354 1.489 0 2.965 0 4.506 0z"></path>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_4" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="32px" height="32px" viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
<path fill="#FFFFFF" d="M0.27,2.892h2.621v2.622H0.27V2.892z M31.729,2.892H8.135v2.622h23.595V2.892z M31.729,10.757H8.135v2.622
h23.595V10.757z M8.135,18.622h23.595v2.621H8.135V18.622z M31.729,26.487H8.135v2.621h23.595V26.487z M2.891,10.757H0.27v2.622
h2.621V10.757z M0.27,18.622h2.621v2.621H0.27V18.622z M2.891,26.487H0.27v2.621h2.621V26.487z"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 819 B

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Before After
Before After

View file

@ -1,6 +1,12 @@
<!-- Generated by IcoMoon.io -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
<title>show</title>
<path fill="#fff" d="M0 26.565c0-8.38 0-16.706 0-25.089 10.661 0 21.307 0 32 0 0 8.343 0 16.686 0 25.089-10.637 0-21.283 0-32 0zM3.514 4.937c0 5.355 0 10.634 0 15.901 8.375 0 16.691 0 24.994 0 0-5.331 0-10.612 0-15.901-8.356 0-16.656 0-24.994 0z"></path>
<path fill="#fff" d="M6.874 30.524c0-0.553 0-1.056 0-1.602 6.084 0 12.136 0 18.25 0 0 0.509 0 1.029 0 1.602-6.050 0-12.12 0-18.25 0z"></path>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="32px" height="32px" viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
<title>artist</title>
<g>
<path fill="#FFFFFF" d="M2.359,1.602h27.281c1.255,0,2.273,1.018,2.273,2.273v19.703c0,1.256-1.019,2.273-2.273,2.273H2.359
c-1.255,0-2.273-1.018-2.273-2.273V3.875C0.086,2.62,1.104,1.602,2.359,1.602z M2.359,23.578h27.281V3.875H2.359V23.578z"/>
<path fill="#FFFFFF" d="M25.094,30.398v-2.273H6.906v2.273H25.094z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 555 B

After

Width:  |  Height:  |  Size: 816 B

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Before After
Before After

View file

@ -1,5 +1,13 @@
<!-- Generated by IcoMoon.io -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
<title>video</title>
<path fill="#fff" d="M20.662 27.439c-6.971 0-13.797 0-20.662 0 0-7.639 0-15.235 0-22.878 6.846 0 13.672 0 20.588 0 0 2.962 0 5.932 0 9.091 3.87-2.316 7.591-4.542 11.412-6.828 0 6.153 0 12.176 0 18.33-3.769-2.257-7.494-4.488-11.338-6.789 0 3.070 0 6.035 0 9.075z"></path>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="32px" height="32px" viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
<title>artist</title>
<path fill="#FFFFFF" d="M21.619,27.237H2.515c-1.241,0-2.247-1.006-2.247-2.247V7.011c0-1.242,1.006-2.248,2.247-2.248h19.104
c1.24,0,2.247,1.006,2.247,2.248v4.562l6.091-4.349c0.506-0.36,1.207-0.242,1.568,0.263c0.134,0.19,0.206,0.415,0.207,0.647v15.732
c-0.002,0.621-0.509,1.123-1.128,1.119c-0.232-0.001-0.458-0.075-0.647-0.209l-6.091-4.349v4.563
C23.866,26.231,22.859,27.237,21.619,27.237z M2.515,7.011V24.99h19.104v-6.742c0.003-0.621,0.509-1.122,1.129-1.118
c0.231,0,0.457,0.074,0.646,0.208l6.091,4.349V10.314l-6.091,4.349c-0.506,0.36-1.207,0.242-1.568-0.263
c-0.133-0.189-0.206-0.415-0.207-0.647V7.011H2.515z"/>
</svg>

Before

Width:  |  Height:  |  Size: 430 B

After

Width:  |  Height:  |  Size: 1.1 KiB

Before After
Before After

View file

@ -0,0 +1,5 @@
<!-- Generated by IcoMoon.io -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 63 64">
<title>alexa</title>
<path fill="#fff" d="M31.554 1.104c-17.063 0-30.896 13.832-30.896 30.896s13.832 30.896 30.896 30.896 30.896-13.833 30.896-30.896c0-17.063-13.833-30.896-30.896-30.896zM27.506 62.329c0-0.037 0-0.072 0-0.107 0-1.945 0.006-3.89-0.002-5.835-0.006-1.199-0.443-2.224-1.318-3.051-0.459-0.435-1.009-0.711-1.604-0.917-2.669-0.926-5.071-2.316-7.189-4.188-3.006-2.658-5.122-5.897-6.335-9.723-0.313-0.989-0.542-1.997-0.711-3.022-0.185-1.121-0.27-2.25-0.271-3.384-0.001-0.766 0.037-1.532 0.115-2.297 0.283-2.765 1.070-5.374 2.361-7.833 0.836-1.592 1.861-3.053 3.069-4.386 1.705-1.883 3.682-3.414 5.929-4.597 1.777-0.935 3.651-1.605 5.617-2.009 0.649-0.133 1.305-0.237 1.962-0.317 0.94-0.114 1.886-0.13 2.834-0.124 0.691 0.004 1.381 0.042 2.066 0.123 3.624 0.428 6.949 1.663 9.929 3.778 3.997 2.836 6.73 6.604 8.208 11.276 0.313 0.988 0.539 1.999 0.691 3.026 0.092 0.623 0.184 1.247 0.2 1.877 0.021 0.801 0.060 1.603 0.035 2.403-0.021 0.671-0.111 1.34-0.191 2.007-0.148 1.243-0.435 2.456-0.804 3.652-0.745 2.415-1.861 4.653-3.247 6.76-0.863 1.312-1.823 2.551-2.855 3.735-1.409 1.618-2.945 3.108-4.572 4.503-2.165 1.857-4.47 3.523-6.883 5.042-2.011 1.266-4.080 2.43-6.226 3.452-0.143 0.068-0.288 0.135-0.441 0.206-0.123-0.015-0.246-0.031-0.369-0.048z"></path>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View file

@ -1,5 +1,7 @@
<!-- Generated by IcoMoon.io -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 64 64">
<title>msedge</title>
<path fill="#fff" d="M21.073 38.209c-0.063 2.074 0.41 3.878 1.361 5.565 1.431 2.539 3.621 4.206 6.229 5.371 3.352 1.497 6.879 2.013 10.532 1.868 4.829-0.191 9.256-1.752 13.531-3.861 0.668-0.33 1.331-0.671 1.997-1.004 0.184-0.092 0.374-0.172 0.644-0.295 0 0.318 0 0.548 0 0.778 0 3.985-0.008 7.969 0.011 11.954 0.002 0.47-0.132 0.709-0.566 0.911-5.329 2.487-10.902 3.954-16.794 4.255-4.831 0.247-9.489-0.409-13.88-2.461-6.848-3.201-11.624-8.311-13.585-15.697-2.89-10.885 1.409-23.494 13.815-28.952 0.206-0.091 0.42-0.163 0.673-0.201-2.549 2.79-3.7 6.149-4.253 9.84 7.489 0 14.89 0 22.367 0 0-0.389 0.036-0.749-0.006-1.099-0.178-1.456-0.27-2.934-0.592-4.358-0.931-4.115-3.56-6.582-7.654-7.478-3.562-0.78-7.126-0.593-10.644 0.252-8.642 2.075-15.514 6.803-20.709 13.995-0.258 0.357-0.49 0.731-0.735 1.097-0.047-0.014-0.094-0.028-0.141-0.041 0.121-0.78 0.22-1.564 0.365-2.339 1.101-5.872 3.411-11.181 7.371-15.71 3.93-4.494 8.775-7.555 14.584-8.928 7.073-1.672 13.991-1.091 20.551 2.144 7.579 3.739 12.387 9.819 14.642 17.935 0.768 2.763 1.141 5.587 1.131 8.459-0.008 2.408-0.002 4.816-0.002 7.223 0 0.23 0 0.461 0 0.774-13.427 0-26.797 0-40.242 0z"></path>
<path fill="#fff" d="M27.374 24.467c0.31-0.182 0.635-0.345 0.965-0.487l0.037-0.015c0.001-0 0.002-0.001 0.003-0.001 0.592-0.25 1.213-0.433 1.844-0.543 0.494-0.086 0.996-0.129 1.495-0.129 1.855 0 3.592 0.591 5.017 1.609-0.35-0.579-0.742-1.141-1.175-1.683-1.129-1.413-2.516-2.664-4.12-3.719-1.083-0.712-2.262-1.331-3.504-1.839-2.715-1.114-5.743-1.703-8.759-1.703-3.885 0-7.654 1.106-10.901 3.198-3.086 1.989-5.566 4.773-7.177 8.055-0.245 1.575-0.369 3.188-0.369 4.798 0 8.102 3.099 15.769 8.727 21.59 5.666 5.863 13.196 9.2 21.301 9.464-0.709-0.233-1.407-0.505-2.093-0.816-2.617-1.183-4.931-2.862-6.878-4.99-0.053-0.056-0.109-0.12-0.166-0.183-3.452-3.863-5.354-8.848-5.354-14.035 0-6.244 2.746-12.13 7.533-16.148 1.109-0.929 2.311-1.744 3.576-2.423z"></path>
<path fill="#fff" d="M62.724 28.806c0.085-0.731 0.129-1.499 0.129-2.285 0-0.728-0.048-1.455-0.142-2.162-0.194-1.445-0.74-3.421-1.391-5.034-1.995-4.943-5.351-9.205-9.707-12.326-5.929-4.249-11.855-6.062-19.813-6.062-13.874 0-25.737 8.96-29.688 21.849 1.488-1.908 3.295-3.562 5.352-4.888 3.489-2.248 7.538-3.437 11.711-3.437 3.209 0 6.434 0.628 9.327 1.815 1.33 0.545 2.595 1.209 3.759 1.973 1.736 1.141 3.24 2.499 4.468 4.035 1.923 2.408 3.107 5.161 3.52 8.182 0.091 0.507 0.137 1.025 0.139 1.539v0.028c0 1.95-0.623 3.794-1.801 5.334-0.247 0.323-0.521 0.634-0.814 0.922-0.014 0.051-0.032 0.165-0.032 0.424 0 0.411 0.18 0.794 0.497 1.058 0.131 0.077 0.265 0.151 0.399 0.221l0.024 0.013c0.017 0.010 0.033 0.019 0.050 0.027l0.035 0.017c2.312 1.216 4.927 1.833 7.773 1.833 4.039 0 7.64-1.020 10.414-2.948 3.289-2.287 5.293-5.789 5.793-10.128z"></path>
<path fill="#fff" d="M57.865 48.926l0.112-0.174c0.023-0.036 0.046-0.071 0.069-0.107 0.011-0.033 0.017-0.068 0.017-0.102 0-0.112-0.058-0.213-0.156-0.271-0.065-0.039-0.14-0.052-0.211-0.040-0.066 0.037-0.133 0.074-0.199 0.109l-0.024 0.013c-0.017 0.010-0.034 0.019-0.051 0.028-3.483 1.886-7.44 2.883-11.446 2.883-4.047 0-8.008-0.864-11.454-2.499-3.369-1.598-6.205-3.906-8.2-6.675-2.063-2.862-3.19-6.176-3.261-9.585-0.009-0.153-0.013-0.309-0.013-0.475 0-0.243 0.010-0.482 0.029-0.712l0.002-0.024c0.061-0.736 0.214-1.452 0.449-2.134-3.683 3.663-5.767 8.634-5.767 13.876 0 4.818 1.767 9.449 4.974 13.039 0.050 0.056 0.098 0.11 0.148 0.164 3.675 4.016 8.888 6.334 14.317 6.371 6.007-1.052 11.532-3.838 15.98-8.059 1.778-1.686 3.353-3.579 4.685-5.627z"></path>
</svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Before After
Before After

View file

@ -0,0 +1 @@
<svg width="48" height="48" fill="none" xmlns="http://www.w3.org/2000/svg"><rect y="8" width="48" height="32" rx="2" fill="#333"/><path d="M5.708 12.19c-.375-.065-.75-.128-1.125-.19h-.509s-.269.139-.373.178c-1.334.496-1.835 1.26-1.671 2.693.724 6.411 1.453 12.822 2.201 19.238.214 1.845 1.126 2.564 2.98 2.36a92.817 92.817 0 003.233-.427c.427-.062.853-.123 1.28-.182 2.169-.3 4.337-.603 6.505-.905 2.168-.303 4.336-.605 6.505-.905.917-.13 1.552-.64 1.75-1.503.022-.093.047-.19.072-.287.172-.667.365-1.418-.275-1.919-3.327-2.588-3.332-7.64-.024-10.234.168-.129.347-.382.351-.58.03-.918.04-1.84-.02-2.757-.074-1.12-.743-1.81-1.874-1.964-2.444-.33-4.887-.657-7.331-.983-3.055-.409-6.11-.817-9.165-1.233-.842-.116-1.676-.259-2.51-.4zm17.102 5.026c.73 0 1.334.585 1.344 1.31.01.708-.59 1.333-1.309 1.363a1.341 1.341 0 01-1.363-1.29 1.306 1.306 0 011.328-1.383zM7.628 24.148H6.309v-.997h.258v.705h.268v-.62h.257v.62h.278v-.714h.258v1.006zm-.53.61h.53v-.288H6.309v.288h.52v.535h-.52v.288h1.319v-.288h-.53v-.535zm.53 1.448H6.577v-.402h-.268v1.091h.268v-.402h1.05v-.287z" fill="#227D3A"/><path d="M32.023 20.36v-3.545h2.613v13.298c-.64-.024-1.281-.04-1.92-.055-1.499-.037-2.992-.074-4.476-.213-1.26-.119-2.127-1.016-2.717-2.122-1.156-2.177-.704-5.047 1.175-6.476.664-.5 1.611-.718 2.469-.852.62-.1 1.258-.078 1.931-.056.3.01.608.02.925.02zm-.045 2.087c-.24 0-.473-.003-.7-.006a21.007 21.007 0 00-1.377.011c-1.324.075-2.142.962-2.261 2.395-.13 1.517.58 2.752 1.84 2.985.558.103 1.136.116 1.718.129.26.005.52.011.78.025v-5.539zm13.879 4.012c-.56 2.062-1.87 3.351-4.026 3.495-1.295.086-2.6.065-3.917.044a104.6 104.6 0 00-1.776-.019v-13.14h2.633v3.516l.858-.001a193.42 193.42 0 011.582 0c2.727.026 4.086 1.126 4.705 3.789l.002.005c.016.08.21 1.017-.061 2.31zm-7.026 1.507c.343-.025.693-.016 1.04-.008 1.166.03 2.293.058 2.981-1.207.6-1.1.65-2.355-.084-3.401-.717-1.016-1.725-.969-2.746-.92-.399.018-.8.037-1.186-.008-.005 1.885-.005 3.665-.005 5.544zM12.04 20.522c-.436-.002-.88-.004-1.333-.004 0-1.06-.015-2.94-.015-2.94v-.595s-1.87-.03-2.712-.03v3.417l-1.626.015s-.065 1.551-.065 2.236h1.726v2.25c-.003.894-.005 1.788.015 2.683.024 1.166.738 2.286 1.71 2.455.752.13 1.518.165 2.291.201.344.016.69.032 1.036.057V28.11c-.137 0-.27.001-.398.003-.29.003-.56.005-.831-.008-.556-.025-1.042-.303-1.066-.853a71.029 71.029 0 01-.027-3.284c.003-.45.007-.904.007-1.362.269 0 .53.002.787.004.6.005 1.174.01 1.746-.014.481-.02.704.174.873.61.64 1.666 1.304 3.327 1.983 4.978.072.174.135.363.2.554.187.556.38 1.126.767 1.37.436.272 1.11.192 1.745.117.152-.018.303-.035.447-.048.273-.024.654-.262.758-.5a625.204 625.204 0 003.207-7.381l.468-1.088a2.38 2.38 0 00.128-.43c.019-.08.04-.168.065-.264-.244 0-.478.002-.704.005-.502.006-.965.012-1.423-.015-.476-.025-.719.148-.888.59a178.161 178.161 0 01-1.542 3.872c-.172.43-.358.853-.559 1.312-.105.24-.214.49-.328.756l-.135-.308a9.371 9.371 0 01-.163-.381c-.18-.486-.364-.972-.546-1.458a215.63 215.63 0 01-1.368-3.704c-.178-.5-.426-.694-.971-.68-1.072.029-2.144.024-3.258.02z" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

View file

@ -42,10 +42,10 @@
<h3 class="pull-left">Watch Statistics</h3>
<div class="button-bar">
<div class="btn-group pull-left" data-toggle="buttons" id="watch-stats-toggles" style="margin-right: 3px">
<label class="btn btn-dark">
<label class="btn btn-dark btn-filter">
<input type="radio" class="watched-stats-toggle" name="watched-stats-type" id="watched-stats-plays" value="plays" autocomplete="off"> Play Count
</label>
<label class="btn btn-dark">
<label class="btn btn-dark btn-filter">
<input type="radio" class="watched-stats-toggle" name="watched-stats-type" id="watched-stats-duration" value="duration" autocomplete="off"> Play Duration
</label>
</div>
@ -92,27 +92,27 @@
<h3 class="pull-left"><span id="recently-added-xml">Recently Added</span></h3>
<ul class="nav nav-header nav-dashboard pull-right" style="margin-top: -3px;">
<li>
<a href="#" id="recently-added-page-left" class="paginate btn-gray disabled" data-id="+1"><i class="fa fa-lg fa-chevron-left"></i></a>
<a href="#" id="recently-added-page-left" class="paginate-added btn-gray disabled" data-id="-1"><i class="fa fa-lg fa-chevron-left"></i></a>
</li>
<li>
<a href="#" id="recently-added-page-right" class="paginate btn-gray disabled" data-id="-1"><i class="fa fa-lg fa-chevron-right"></i></a>
<a href="#" id="recently-added-page-right" class="paginate-added btn-gray disabled" data-id="+1"><i class="fa fa-lg fa-chevron-right"></i></a>
</li>
</ul>
<div class="button-bar">
<div class="btn-group pull-left" data-toggle="buttons" id="recently-added-toggles" style="margin-right: 3px">
<label class="btn btn-dark" id="recently-added-label-all">
<label class="btn btn-dark btn-filter" id="recently-added-label-all">
<input type="radio" name="recently-added-toggle" id="recently-added-toggle-all" value="all" autocomplete="off"> All
</label>
<label class="btn btn-dark" id="recently-added-label-movies">
<label class="btn btn-dark btn-filter" id="recently-added-label-movies">
<input type="radio" name="recently-added-toggle" id="recently-added-toggle-movie" value="movie" autocomplete="off"> Movies
</label>
<label class="btn btn-dark" id="recently-added-label-tv">
<label class="btn btn-dark btn-filter" id="recently-added-label-tv">
<input type="radio" name="recently-added-toggle" id="recently-added-toggle-show" value="show" autocomplete="off"> TV Shows
</label>
<label class="btn btn-dark" id="recently-added-label-music">
<label class="btn btn-dark btn-filter" id="recently-added-label-music">
<input type="radio" name="recently-added-toggle" id="recently-added-toggle-artist" value="artist" autocomplete="off"> Music
</label>
<label class="btn btn-dark" id="recently-added-label-other_video">
<label class="btn btn-dark btn-filter" id="recently-added-label-other_video">
<input type="radio" name="recently-added-toggle" id="recently-added-toggle-other_video" value="other_video" autocomplete="off"> Videos
</label>
</div>
@ -212,28 +212,6 @@
</div>
</div>
</div>
<% from plexpy.helpers import anon_url %>
<div id="python2-modal" class="modal fade wide" tabindex="-1" role="dialog" aria-labelledby="python2-modal">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true"><i class="fa fa-remove"></i></button>
<h4 class="modal-title">Unable to Update</h4>
</div>
<div class="modal-body" style="text-align: center;">
<p>Tautulli is still running using Python 2 and cannot be updated past v2.6.3.</p>
<p>Python 3 is required to continue receiving updates.</p>
<p>
<strong>Please see the <a href="${anon_url('https://github.com/Tautulli/Tautulli-Wiki/wiki/Upgrading-to-Python-3-%28Tautulli-v2.5%29')}" target="_blank" rel="noreferrer">wiki</a>
for instructions on how to upgrade to Python 3.</strong>
</p>
</div>
<div class="modal-footer">
<input type="button" class="btn btn-bright" data-dismiss="modal" value="Close">
</div>
</div>
</div>
</div>
% endif
<div class="modal fade" id="ip-info-modal" tabindex="-1" role="dialog" aria-labelledby="ip-info-modal">
@ -280,22 +258,32 @@
var error_msg = 'There was an error communicating with your Plex Server.' + msg_settings;
% if 'current_activity' in config['home_sections'] or 'recently_added' in config['home_sections']:
var server_status;
server_status = setInterval(function() {
$.getJSON('server_status', function (data) {
if (data.connected === true) {
clearInterval(server_status);
% if 'current_activity' in config['home_sections']:
$('#currentActivity').html('<div id="dashboard-checking-activity" class="text-muted"><i class="fa fa-refresh fa-spin"></i>&nbsp; Checking for activity...</div>');
$('#recentlyAdded').html('<div id="dashboard-checking-recently-added" class="text-muted"><i class="fa fa-refresh fa-spin"></i>&nbsp; Looking for new items...</div>');
activityConnected();
% endif
% if 'recently_added' in config['home_sections']:
$('#recentlyAdded').html('<div id="dashboard-checking-recently-added" class="text-muted"><i class="fa fa-refresh fa-spin"></i>&nbsp; Looking for new items...</div>');
recentlyAddedConnected();
% endif
} else if (data.connected === false) {
clearInterval(server_status);
% if 'current_activity' in config['home_sections']:
$('#currentActivity').html('<div id="dashboard-no-activity" class="text-muted">' + error_msg + '</div>');
% endif
% if 'recently_added' in config['home_sections']:
$('#recentlyAdded').html('<div id="dashboard-no-recently-added" class="text-muted">' + error_msg + '</div>');
% endif
}
});
}, 1000);
% endif
</script>
% if 'current_activity' in config['home_sections']:
<script>
@ -310,6 +298,8 @@
$('#currentActivityHeader-bandwidth-tooltip').tooltip({ container: 'body', placement: 'right', delay: 50 });
var title = document.title;
function getCurrentActivity() {
activity_ready = false;
@ -380,6 +370,8 @@
$('#currentActivityHeader').show();
document.title = stream_count + ' stream' + (stream_count > 1 ? 's' : '') + ' | ' + title;
sessions.forEach(function (session) {
var s = (typeof Proxy === "function") ? new Proxy(session, defaultHandler) : session;
var key = s.session_key;
@ -473,8 +465,8 @@
var video_decision = '';
if (['movie', 'episode', 'clip'].indexOf(s.media_type) > -1 && s.stream_video_decision) {
var v_bd = (s.video_dynamic_range === 'HDR') ? ' ' + s.video_dynamic_range : '';
var sv_bd = (s.video_dynamic_range === 'HDR') ? ' ' + s.stream_video_dynamic_range : '';
var v_bd = (s.video_dynamic_range !== 'SDR') ? ' ' + s.video_dynamic_range : '';
var sv_bd = (s.stream_video_dynamic_range !== 'SDR' || v_bd) ? ' ' + s.stream_video_dynamic_range : '';
var v_res= '';
switch (s.video_resolution.toLowerCase()) {
case 'sd':
@ -513,14 +505,15 @@
var audio_decision = '';
if (['movie', 'episode', 'clip', 'track'].indexOf(s.media_type) > -1 && s.stream_audio_decision) {
var audio_language = (s.media_type !== 'track') ? (s.audio_language || 'Unknown') + ' - ' : '';
var a_codec = (s.audio_codec === 'truehd') ? 'TrueHD' : s.audio_codec.toUpperCase();
var sa_codec = (s.stream_audio_codec === 'truehd') ? 'TrueHD' : s.stream_audio_codec.toUpperCase();
if (s.stream_audio_decision === 'transcode') {
audio_decision = 'Transcode (' + a_codec + ' ' + capitalizeFirstLetter(s.audio_channel_layout.split('(')[0]) + ' <i class="fa fa-long-arrow-right"></i> ' + sa_codec + ' ' + capitalizeFirstLetter(s.stream_audio_channel_layout.split('(')[0]) + ')';
audio_decision = 'Transcode (' + audio_language + a_codec + ' ' + capitalizeFirstLetter(s.audio_channel_layout.split('(')[0]) + ' <i class="fa fa-long-arrow-right"></i> ' + sa_codec + ' ' + capitalizeFirstLetter(s.stream_audio_channel_layout.split('(')[0]) + ')';
} else if (s.stream_audio_decision === 'copy') {
audio_decision = 'Direct Stream (' + sa_codec + ' ' + capitalizeFirstLetter(s.stream_audio_channel_layout.split('(')[0]) + ')';
audio_decision = 'Direct Stream (' + audio_language + sa_codec + ' ' + capitalizeFirstLetter(s.stream_audio_channel_layout.split('(')[0]) + ')';
} else {
audio_decision = 'Direct Play (' + sa_codec + ' ' + capitalizeFirstLetter(s.stream_audio_channel_layout.split('(')[0]) + ')';
audio_decision = 'Direct Play (' + audio_language + sa_codec + ' ' + capitalizeFirstLetter(s.stream_audio_channel_layout.split('(')[0]) + ')';
}
}
$('#audio_decision-' + key).html(audio_decision);
@ -529,13 +522,13 @@
if (['movie', 'episode', 'clip'].indexOf(s.media_type) > -1 && s.subtitles === 1) {
var subtitle_codec = (s.stream_subtitle_codec && s.stream_subtitle_transient) ? 'None' : s.subtitle_codec.toUpperCase();
if (s.stream_subtitle_decision === 'transcode') {
subtitle_decision = 'Transcode (' + subtitle_codec + ' <i class="fa fa-long-arrow-right"></i> ' + s.stream_subtitle_codec.toUpperCase() + ')';
subtitle_decision = 'Transcode ('+ (s.subtitle_language || 'Unknown')+ ' - ' + subtitle_codec + ' <i class="fa fa-long-arrow-right"></i> ' + s.stream_subtitle_codec.toUpperCase() + ')';
} else if (s.stream_subtitle_decision === 'copy') {
subtitle_decision = 'Direct Stream (' + subtitle_codec + ')';
subtitle_decision = 'Direct Stream ('+ (s.subtitle_language || 'Unknown')+ ' - ' + subtitle_codec + ')';
} else if (s.stream_subtitle_decision === 'burn') {
subtitle_decision = 'Burn (' + subtitle_codec + ')';
subtitle_decision = 'Burn ('+ (s.subtitle_language || 'Unknown')+ ' - ' + subtitle_codec + ')';
} else {
subtitle_decision = 'Direct Play (' + ((s.synced_version === '1') ? subtitle_codec : s.stream_subtitle_codec.toUpperCase()) + ')';
subtitle_decision = 'Direct Play ('+ (s.subtitle_language || 'Unknown')+ ' - ' + ((s.synced_version === '1') ? subtitle_codec : s.stream_subtitle_codec.toUpperCase()) + ')';
}
}
$('#subtitle_decision-' + key).html(subtitle_decision);
@ -573,15 +566,18 @@
// Update the stream progress times
$('#stream-eta-' + key).html(moment().add(parseInt(s.duration) - parseInt(s.view_offset), 'milliseconds').format(time_format));
$('#stream-duration-' + key).html(millisecondsToMinutes(parseInt(s.stream_duration), false));
var stream_view_offset = $('#stream-view-offset-' + key);
stream_view_offset.data('state', s.state);
if (stream_view_offset.data('last_view_offset') !== s.view_offset) {
stream_view_offset.data('last_view_offset', s.view_offset).data('view_offset', s.view_offset);
}
// Update the progress bars, percent - 3 because of 3px padding-right
$('#buffer-bar-' + key).css({width: parseInt(s.transcode_progress) - 3 + '%'}).html(s.transcode_progress + '%')
.attr('data-original-title', 'Transcoder Progress ' + s.transcode_progress + '%');
// Update the progress bars
var duration = parseInt(s.duration);
var transcode_progress = duration ? Math.round(s.transcode_max_offset_available * 1000 / duration * 100) : s.transcode_progress;
$('#buffer-bar-' + key).css({width: parseInt(transcode_progress) + '%'}).html(transcode_progress + '%')
.attr('data-original-title', 'Transcoder Progress ' + transcode_progress + '%');
if (s.live !== 1) {
var progress_bar = $('#progress-bar-' + key);
progress_bar.data('state', s.state);
@ -608,6 +604,8 @@
} else {
$('#currentActivityHeader').hide();
$('#currentActivity').html('<div id="dashboard-no-activity" class="text-muted">Nothing is currently being played.</div>');
document.title = title;
}
activity_ready = true;
@ -637,6 +635,7 @@
$('#activity-instance-' + session_key + ' [data-toggle=tooltip]').tooltip({ container: 'body', placement: 'right', delay: 50 });
$('#activity-instance-' + session_key + ' [data-toggle=popover]').popover({
html: true,
sanitize: false,
container: 'body',
trigger: 'hover',
placement: 'right',
@ -680,7 +679,7 @@
var stream_duration = parseInt($(this).data('stream_duration'));
var progress_percent = Math.floor(view_offset / stream_duration * 100);
progress_percent = (progress_percent >= 0) ? Math.min(progress_percent, 100) : 100;
$(this).css({width: progress_percent - 3 + '%'}).html(progress_percent + '%')
$(this).css({width: progress_percent + '%'}).html(progress_percent + '%')
.attr('data-original-title', 'Stream Progress ' + progress_percent + '%')
.data('view_offset', Math.min(view_offset + 1000, stream_duration));
}
@ -690,7 +689,10 @@
$('#currentActivity').on('click', '.external_ip-modal', function () {
$.get('get_ip_address_details', {
ip_address: $(this).data('ip')
ip_address: $(this).data('ip'),
location: $(this).data('location'),
secure: $(this).data('secure'),
relayed: $(this).data('relayed')
}).then(function (jqXHR) {
$("#ip-info-modal").html(jqXHR);
});
@ -767,16 +769,21 @@
<script>
function statsCardCallback() {
$('.dashboard-stats-instance .dashboard-stats-info-scroller').scrollbar();
loadAllBlurHash();
function changeImages(elem) {
var stat_id = $(elem).data('stat_id');
var art = $(elem).data('art');
var thumb = $(elem).data('thumb');
var user_id = $(elem).data('user_id');
var library_type = $(elem).data('library-type');
var user_thumb = $(elem).data('user_thumb');
var rating_key = $(elem).data('rating_key');
var grandparent_rating_key = $(elem).data('grandparent_rating_key');
var guid = $(elem).data('guid');
var live = $(elem).data('live');
var library_art = $(elem).data('library_art');
var library_thumb = $(elem).data('library_thumb');
var [height, fallback_poster, fallback_art] = [450, 'poster', 'art'];
if ($.inArray(stat_id, ['top_music', 'popular_music']) > -1) {
[height, fallback_poster, fallback_art] = [300, 'cover', 'art'];
@ -787,8 +794,19 @@
if (stat_id === 'most_concurrent') {
return
} else if (stat_id === 'top_libraries') {
$('#stats-background-' + stat_id).css('background-image', 'url(' + page('pms_image_proxy', art || library_art, null, 500, 280, 40, '282828', 3, fallback_art) + ')');
$('#stats-thumb-' + stat_id).removeClass(function (index, className) {
return (className.match (/(^|\s)svg-icon library-\S+/g) || []).join(' ')});
if (library_thumb.startsWith('http')) {
$('#stats-thumb-' + stat_id).css('background-image', 'url(' + page('pms_image_proxy', library_thumb, null, 100, 100, null, null, null, 'cover') + ')');
} else {
$('#stats-thumb-' + stat_id).css('background-image', '')
.addClass('svg-icon library-' + library_type);
}
} else if (stat_id === 'top_users') {
$('#stats-thumb-' + stat_id).css('background-image', 'url(' + (user_thumb || 'images/gravatar-default.png') + ')');
loadBlurHash($('#stats-background-' + stat_id), page('pms_image_proxy', user_thumb || 'interfaces/default/images/gravatar-default.png', null, 100, 100, 40, '282828', 0, 'user'));
$('#stats-thumb-' + stat_id).css('background-image', 'url(' + page('pms_image_proxy', user_thumb || 'interfaces/default/images/gravatar-default.png', null, 100, 100, null, null, null, 'user') + ')');
if (user_id) {
href = page('user', user_id);
}
@ -808,13 +826,14 @@
href = page('info', rating_key);
}
}
var img_rating_key = grandparent_rating_key || rating_key;
$('#stats-thumb-url-' + stat_id).attr('href', href).prop('title', $(elem).data('title'));
$('#stats-background-' + stat_id).css('background-image', 'url(' + page('pms_image_proxy', art, rating_key, 500, 280, 40, '282828', 3, fallback_art) + ')');
$('#stats-thumb-' + stat_id).css('background-image', 'url(' + page('pms_image_proxy', thumb, rating_key, 300, height, null, null, null, fallback_poster) + ')');
$('#stats-thumb-' + stat_id + '-bg').css('background-image', 'url(' + page('pms_image_proxy', thumb, rating_key, 300, height, 60, '282828', 3, fallback_poster) + ')');
$('#library-stats-background-' + stat_id).css('background-image', 'url(' + page('pms_image_proxy', art, rating_key, 500, 280, 40, '282828', 3, fallback_art) + ')');
$('#stats-background-' + stat_id).css('background-image', 'url(' + page('pms_image_proxy', art, img_rating_key, 500, 280, 40, '282828', 3, fallback_art) + ')');
$('#stats-thumb-' + stat_id).css('background-image', 'url(' + page('pms_image_proxy', thumb, img_rating_key, 300, height, null, null, null, fallback_poster) + ')');
$('#stats-thumb-' + stat_id + '-bg').css('background-image', 'url(' + page('pms_image_proxy', thumb, img_rating_key, 300, height, 60, '282828', 3, fallback_poster) + ')');
$('#library-stats-background-' + stat_id).css('background-image', 'url(' + page('pms_image_proxy', art || library_art, img_rating_key, 500, 280, 40, '282828', 3, library_art || fallback_art) + ')');
if (thumb.startsWith('http')) {
$('#library-stats-thumb-' + stat_id).css('background-image', 'url(' + page('pms_image_proxy', thumb, rating_key, 300, 300, null, null, null, 'cover') + ')')
$('#library-stats-thumb-' + stat_id).css('background-image', 'url(' + page('pms_image_proxy', thumb, img_rating_key, 300, 300, null, null, null, 'cover') + ')')
.removeClass('svg-icon library-' + stat_id);
} else {
$('#library-stats-thumb-' + stat_id).css('background-image', '')
@ -923,10 +942,14 @@
count: recently_added_count,
media_type: recently_added_type
},
beforeSend: function () {
$(".dashboard-recent-media-row").animate({ scrollLeft: 0 }, 1000);
},
complete: function (xhr, status) {
$("#recentlyAdded").html(xhr.responseText);
$('#ajaxMsg').fadeOut();
highlightAddedScrollerButton();
highlightScrollerButton("#recently-added");
paginateScroller("#recently-added", ".paginate-added");
}
});
}
@ -942,57 +965,11 @@
recentlyAdded(recently_added_count, recently_added_type);
}
function highlightAddedScrollerButton() {
var scroller = $("#recently-added-row-scroller");
var numElems = scroller.find("li:visible").length;
scroller.width(numElems * 175);
if (scroller.width() > $("body").find(".container-fluid").width()) {
$("#recently-added-page-right").removeClass("disabled");
} else {
$("#recently-added-page-right").addClass("disabled");
}
}
$(window).resize(function () {
highlightAddedScrollerButton();
});
function resetScroller() {
leftTotal = 0;
$("#recently-added-row-scroller").animate({ left: leftTotal }, 1000);
$("#recently-added-page-left").addClass("disabled").blur();
}
var leftTotal = 0;
$(".paginate").click(function (e) {
e.preventDefault();
var scroller = $("#recently-added-row-scroller");
var containerWidth = $("body").find(".container-fluid").width();
var scrollAmount = $(this).data("id") * parseInt((containerWidth - 15) / 175) * 175;
var leftMax = Math.min(-parseInt(scroller.width()) + Math.abs(scrollAmount), 0);
leftTotal = Math.max(Math.min(leftTotal + scrollAmount, 0), leftMax);
scroller.animate({ left: leftTotal }, 250);
if (leftTotal === 0) {
$("#recently-added-page-left").addClass("disabled").blur();
} else {
$("#recently-added-page-left").removeClass("disabled");
}
if (leftTotal === leftMax) {
$("#recently-added-page-right").addClass("disabled").blur();
} else {
$("#recently-added-page-right").removeClass("disabled");
}
});
$('#recently-added-toggles').on('change', function () {
$('#recently-added-toggles > label').removeClass('active');
selected_filter = $('input[name=recently-added-toggle]:checked', '#recently-added-toggles');
$(selected_filter).closest('label').addClass('active');
recently_added_type = $(selected_filter).val();
resetScroller();
setLocalStorage('home_stats_recently_added_type', recently_added_type);
recentlyAdded(recently_added_count, recently_added_type);
});
@ -1000,7 +977,6 @@
$('#recently-added-count').change(function () {
forceMinMax($(this));
recently_added_count = $(this).val();
resetScroller();
setLocalStorage('home_stats_recently_added_count', recently_added_count);
recentlyAdded(recently_added_count, recently_added_type);
});
@ -1032,16 +1008,4 @@
});
</script>
% endif
% if _session['user_group'] == 'admin':
<script>
const queryString = window.location.search;
const urlParams = new URLSearchParams(queryString);
if (urlParams.get('update') === 'python2') {
$("#python2-modal").modal({
backdrop: 'static',
keyboard: false
});
}
</script>
% endif
</%def>
</%def>

View file

@ -12,8 +12,10 @@ data :: Usable parameters (if not applicable for media type, blank value will be
== Global keys ==
rating_key Returns the unique identifier for the media item.
media_type Returns the type of media. Either 'movie', 'show', 'season', 'episode', 'artist', 'album', or 'track'.
sub_media_type Returns the subtype of media. Either 'movie', 'show', 'season', 'episode', 'artist', 'album', or 'track'.
art Returns the location of the item's artwork
title Returns the name of the movie, show, episode, artist, album, or track.
edition_title Returns the edition title of a movie.
duration Returns the standard runtime of the media.
content_rating Returns the age rating for the media.
summary Returns a brief description of the media plot.
@ -41,7 +43,7 @@ DOCUMENTATION :: END
from plexpy import notifiers
from plexpy.common import MEDIA_TYPE_HEADERS, MEDIA_FLAGS_AUDIO, MEDIA_FLAGS_VIDEO
from plexpy.helpers import page, get_percent, cast_to_int
from plexpy.helpers import page, get_percent, cast_to_int, short_season
# Get audio codec file
def af(codec):
@ -71,7 +73,7 @@ DOCUMENTATION :: END
<%inherit file="base.html"/>
<%def name="headIncludes()">
<link rel="stylesheet" href="${http_root}css/dataTables.bootstrap.css">
<link rel="stylesheet" href="${http_root}css/dataTables.bootstrap.min.css">
<link rel="stylesheet" href="${http_root}css/dataTables.colVis.css">
<link rel="stylesheet" href="${http_root}css/tautulli-dataTables.css">
</%def>
@ -81,6 +83,11 @@ DOCUMENTATION :: END
<%
data = defaultdict(lambda: None, **metadata)
media_info = defaultdict(lambda: None, **(data['media_info'][0] if data['media_info'] else {}))
season = ''
if data['media_type'] == 'episode':
season = short_season(data['parent_title'])
elif data['media_type'] == 'season':
season = short_season(data['title'])
%>
<div class="container-fluid">
<div class="row">
@ -105,7 +112,7 @@ DOCUMENTATION :: END
<li class="hidden-xs hidden-sm">${data['grandparent_title']}</li>
<span class="breadcrumb-arrow"><i class="fa fa-chevron-right"></i></span>
% if data['media_index']:
<li>Season ${data['parent_media_index']}</li>
<li> ${data['parent_title']}</li>
<span class="breadcrumb-arrow"><i class="fa fa-chevron-right"></i></span>
<li class="active metadata-xml">Episode ${data['media_index']} - ${data['title']}</li>
% else:
@ -125,13 +132,13 @@ DOCUMENTATION :: END
<span class="breadcrumb-arrow"><i class="fa fa-chevron-right"></i></span>
<li><a href="${page('info', data['parent_rating_key'])}">${data['parent_title']}</a></li>
<span class="breadcrumb-arrow"><i class="fa fa-chevron-right"></i></span>
<li class="active metadata-xml">Season ${data['media_index']}</li>
<li class="active metadata-xml">${data['title']}</li>
% elif data['media_type'] == 'episode':
<li class="hidden-xs hidden-sm"><a href="${page('library', data['section_id'])}">${data['library_name']}</a></li>
<span class="breadcrumb-arrow"><i class="fa fa-chevron-right"></i></span>
<li class="hidden-xs hidden-sm"><a href="${page('info', data['grandparent_rating_key'])}">${data['grandparent_title']}</a></li>
<span class="breadcrumb-arrow"><i class="fa fa-chevron-right"></i></span>
<li><a href="${page('info', data['parent_rating_key'])}">Season ${data['parent_media_index']}</a></li>
<li><a href="${page('info', data['parent_rating_key'])}">${data['parent_title']}</a></li>
<span class="breadcrumb-arrow"><i class="fa fa-chevron-right"></i></span>
<li class="active metadata-xml">Episode ${data['media_index']} - ${data['title']}</li>
% elif data['media_type'] == 'artist':
@ -207,8 +214,8 @@ DOCUMENTATION :: END
% if _session['user_group'] == 'admin':
<span class="overlay-refresh-image" title="Refresh image"><i class="fa fa-refresh refresh_pms_image"></i></span>
% endif
% elif data['media_type'] in ('artist', 'album', 'track', 'playlist', 'photo_album', 'photo', 'clip'):
<div class="summary-poster-face-track" style="background-image: url(${page('pms_image_proxy', data['thumb'], data['rating_key'], 500, 500, fallback='cover')});">
% elif data['media_type'] in ('artist', 'album', 'track', 'playlist', 'photo_album', 'photo', 'clip') or data['sub_media_type'] in ('artist', 'album', 'track'):
<div class="summary-poster-face-track" style="background-image: url(${page('pms_image_proxy', data['thumb'], data['rating_key'], 300, 300, fallback='cover')});">
<div class="summary-poster-face-overlay">
<span></span>
</div>
@ -224,6 +231,9 @@ DOCUMENTATION :: END
<div class="summary-poster-face-overlay">
<span></span>
</div>
% if data['media_type'] == 'collection' and data['smart']:
<span class="smart-collection-image" title="Smart Collection"><i class="fa fa-cog"></i></span>
% endif
</div>
% if _session['user_group'] == 'admin':
<span class="overlay-refresh-image" title="Refresh image"><i class="fa fa-refresh refresh_pms_image"></i></span>
@ -242,23 +252,23 @@ DOCUMENTATION :: END
<h1>${data['grandparent_title']}</h1>
<h2>${data['title']}</h2>
% if data['media_index']:
<h3 class="hidden-xs">S${data['parent_media_index']} &middot; E${data['media_index']}</h3>
<h3 class="hidden-xs">${season} &middot; E${data['media_index']}</h3>
% endif
% endif
% elif data['media_type'] in ('movie', 'show', 'artist', 'collection', 'playlist', 'photo_album'):
<h1>&nbsp;</h1><h1>${data['title']}</h1>
% elif data['media_type'] == 'season':
<h1>&nbsp;</h1><h1><a href="${page('info', data['parent_rating_key'])}">${data['parent_title']}</a></h1>
<h3 class="hidden-xs">S${data['media_index']}</h3>
<h3 class="hidden-xs">${season}</h3>
% elif data['media_type'] == 'episode':
<h1><a href="${page('info', data['grandparent_rating_key'])}">${data['grandparent_title']}</a></h1>
<h2>${data['title']}</h2>
<h3 class="hidden-xs">S${data['parent_media_index']} &middot; E${data['media_index']}</h3>
<h3 class="hidden-xs">${season} &middot; E${data['media_index']}</h3>
% elif data['media_type'] == 'album':
<h1><a href="${page('info', data['parent_rating_key'])}">${data['parent_title']}</a></h1>
<h2>${data['title']}</h2>
% elif data['media_type'] == 'track':
<h1><a href="${page('info', data['grandparent_rating_key'])}">${data['original_title'] or data['grandparent_title']}</a></h1>
<h1><a href="${page('info', data['grandparent_rating_key'])}">${data['grandparent_title']}</a></h1>
<h2><a href="${page('info', data['parent_rating_key'])}">${data['parent_title']}</a> - ${data['title']}</h2>
<h3 class="hidden-xs">T${data['media_index']}</h3>
% elif data['media_type'] in ('photo', 'clip'):
@ -274,14 +284,14 @@ DOCUMENTATION :: END
padding_height = ''
if data['media_type'] == 'movie' or data['live']:
padding_height = 'height: 305px;'
elif data['media_type'] in ('show', 'season', 'collection'):
padding_height = 'height: 270px;'
elif data['media_type'] == 'episode':
padding_height = 'height: 70px;'
elif data['media_type'] in ('artist', 'album', 'playlist', 'photo_album', 'photo'):
elif data['media_type'] in ('artist', 'album', 'playlist', 'photo_album', 'photo') or data['sub_media_type'] in ('artist', 'album', 'track'):
padding_height = 'height: 150px;'
elif data['media_type'] in ('track', 'clip'):
padding_height = 'height: 180px;'
elif data['media_type'] == 'episode':
padding_height = 'height: 70px;'
elif data['media_type'] in ('show', 'season', 'collection'):
padding_height = 'height: 270px;'
%>
<div class="summary-content-padding hidden-xs hidden-sm" style="${padding_height}">
% if data['media_type'] in ('movie', 'episode', 'track', 'clip'):
@ -308,22 +318,27 @@ DOCUMENTATION :: END
% if data['audience_rating_image']:
% if data['audience_rating_image'].startswith('imdb://'):
<div class="critic-rating hidden-xs hidden-sm" title="${rating}">
<span class="rating-image rating-imdb"><strong>${rating}</strong></span>
<span class="rating-image rating-imdb"></span><strong>${rating}</strong>
</div>
% endif
% if data['audience_rating_image'].startswith('themoviedb://'):
<div class="critic-rating hidden-xs hidden-sm" title="${rating}">
<span class="rating-image rating-themoviedb"><strong>${get_percent(rating, 10)}%</strong></span>
<span class="rating-image rating-themoviedb"></span><strong>${get_percent(rating, 10)}%</strong>
</div>
% endif
% if data['audience_rating_image'].startswith('thetvdb://'):
<div class="critic-rating hidden-xs hidden-sm" title="${rating}">
<span class="rating-image rating-thetvdb"></span><strong>${get_percent(rating, 10)}%</strong>
</div>
% endif
% if data['audience_rating_image'].startswith('rottentomatoes://'):
<div class="critic-rating hidden-xs hidden-sm" title="${data['audience_rating']}">
<span class="rating-image rating-rottentomatos-${data['audience_rating_image'].rsplit('.')[-1]}"><strong>${get_percent(data['audience_rating'], 10)}%</strong></span>
<span class="rating-image rating-rottentomatos-${data['audience_rating_image'].rsplit('.')[-1]}"></span><strong>${get_percent(data['audience_rating'], 10)}%</strong>
</div>
% endif
% if data['rating_image'].startswith('rottentomatoes://'):
<div class="critic-rating hidden-xs hidden-sm" title="${data['rating']}">
<span class="rating-image rating-rottentomatos-${data['rating_image'].rsplit('.')[-1]}"><strong>${get_percent(data['rating'], 10)}%</strong></span>
<span class="rating-image rating-rottentomatos-${data['rating_image'].rsplit('.')[-1]}"></span><strong>${get_percent(data['rating'], 10)}%</strong>
</div>
% endif
% else:
@ -355,6 +370,11 @@ DOCUMENTATION :: END
Studio <strong> ${data['studio']}</strong>
% endif
</div>
<div class="summary-content-details-tag">
% if data['media_type'] == 'track' and data['original_title']:
Track Artists <strong> ${data['original_title']}</strong>
% endif
</div>
<div class="summary-content-details-tag">
% if data['media_type'] == 'movie':
Year <strong> ${data['year']}</strong>
@ -366,7 +386,7 @@ DOCUMENTATION :: END
Released <strong> ${data['year']}</strong>
% elif data['media_type'] in ('photo', 'clip'):
Taken <strong> <span id="airdate">${data['originally_available_at']}</span></strong>
% elif data['media_type'] == 'collection':
% elif data['media_type'] == 'collection' and data['min_year'] and data['max_year']:
Year <strong> ${data['min_year']} - ${data['max_year']}</strong>
% elif data['year']:
Year <strong> ${data['year']}</strong>
@ -377,24 +397,32 @@ DOCUMENTATION :: END
Runtime <strong> <span id="runtime">${data['duration']}</span></strong>
% endif
</div>
% if data['edition_title']:
<div class="summary-content-details-tag">
Edition <strong> ${data['edition_title']} </strong>
</div>
% endif
<div class="summary-content-details-tag">
% if data['content_rating']:
Rated <strong> ${data['content_rating']} </strong>
% endif
</div>
<div class="summary-content-details-tag" id="channel-icon">
% if media_info['channel_identifier']:
Channel <strong> <span class="thumb-tooltip" data-toggle="popover" data-img="${media_info['channel_thumb']}" data-height="40" data-width="40">${media_info['channel_call_sign']} ${media_info['channel_identifier']}</span> </strong>
% if media_info['channel_vcn']:
Channel <strong> <span class="thumb-tooltip" data-toggle="popover" data-img="${media_info['channel_thumb']}" data-height="40" data-width="40">${media_info['channel_title'] or (media_info['channel_vcn'] + ' ' + media_info['channel_call_sign'])}</span> </strong>
% endif
</div>
</div>
% if data['tagline']:
<div class="summary-content-summary">
<p><strong> ${data['tagline']} </strong></p>
<div class="summary-content-text summary-content-tagline">
<p>${data['tagline']}</p>
</div>
% endif
<div class="summary-content-summary">
<p> ${data['summary'] | br, n} </p>
<div class="summary-content-text summary-content-summary">
<p>${data['summary'] | br, n}</p>
</div>
<div class="summary-content-text summary-toggle">
<a href="#" class="show-more">Read more &nbsp;<i class="fa fa-chevron-down"></i></a>
</div>
</div>
</div>
@ -526,8 +554,36 @@ DOCUMENTATION :: END
</div>
</div>
% endif
% if data['media_type'] in ('movie', 'show', 'season', 'episode', 'artist', 'album', 'track', 'collection', 'playlist'):
<div class="col-md-12">
<div class="table-card-header">
<div class="header-bar">
<span><i class="fa fa-line-chart"></i> Global Stats</span>
</div>
</div>
<div class="table-card-back">
<div id="watch-time-stats" class="user-overview-stats-wrapper">
<div class='muted'><i class="fa fa-refresh fa-spin"></i> Loading data...</div>
<br>
</div>
</div>
</div>
<div class="col-md-12">
<div class="table-card-header">
<div class="header-bar">
<span><i class="fa fa-group"></i> User Stats</span>
</div>
</div>
<div class="table-card-back">
<div id="user-stats" class="user-player">
<div class='muted'><i class="fa fa-refresh fa-spin"></i> Loading data...</div>
<br>
</div>
</div>
</div>
% endif
<%
history_type = data['media_type'] in ('movie', 'show', 'season', 'episode', 'artist', 'album', 'track')
history_type = data['media_type'] in ('movie', 'show', 'season', 'episode', 'artist', 'album', 'track', 'collection', 'playlist')
history_active = 'active' if history_type else ''
export_active = 'active' if not history_type else ''
%>
@ -542,7 +598,7 @@ DOCUMENTATION :: END
% if source == 'history':
<div class="btn-group">
<a href="update_metadata?rating_key=${data['rating_key']}&update=True" class="btn btn-danger btn-edit" id="fix-metadata">
<i class="fa fa-wrench"></i> Fix Metadata
<i class="fa fa-wrench"></i> Fix Match
</a>
</div>
% endif
@ -590,7 +646,7 @@ DOCUMENTATION :: END
<div class="col-md-12">
<div class="table-card-header">
<div class="header-bar">
% if data['media_type'] in ('artist', 'album', 'track'):
% if data['media_type'] in ('artist', 'album', 'track', 'playlist'):
<span>Play History for <strong>${data['title']}</strong></span>
% else:
<span>Watch History for <strong>${data['title']}</strong></span>
@ -598,13 +654,23 @@ DOCUMENTATION :: END
</div>
<div class="button-bar">
% if _session['user_group'] == 'admin':
<div class="alert alert-danger alert-edit" role="alert" id="row-edit-mode-alert"><i class="fa fa-exclamation-triangle"></i>&nbspSelect rows to delete. Data is deleted upon exiting delete mode.</div>
<div class="btn-group">
<button class="btn btn-danger btn-edit" data-toggle="button" aria-pressed="false" autocomplete="off" id="row-edit-mode">
<i class="fa fa-trash-o"></i> Delete mode
</button>&nbsp;
</button>
</div>
% endif
<div class="btn-group" data-toggle="buttons" id="transcode_decision-selection">
<label class="btn btn-dark btn-filter">
<input type="checkbox" name="transcode_decision-filter" id="history-transcode_decision-direct_play" value="direct play" autocomplete="off"><i class="fa fa-play-circle"></i> Direct Play
</label>
<label class="btn btn-dark btn-filter">
<input type="checkbox" name="transcode_decision-filter" id="history-transcode_decision-direct_stream" value="copy" autocomplete="off"><i class="fa fa-stream"></i> Direct Stream
</label>
<label class="btn btn-dark btn-filter">
<input type="checkbox" name="transcode_decision-filter" id="history-transcode_decision-transcode" value="transcode" autocomplete="off"><i class="fa fa-server"></i> Transcode
</label>
</div>
<div class="btn-group">
<button class="btn btn-dark refresh-history-button" id="refresh-history-list"><i class="fa fa-refresh"></i> Refresh history</button>
</div>
@ -626,7 +692,7 @@ DOCUMENTATION :: END
<th align="left" id="started">Started</th>
<th align="left" id="paused_counter">Paused</th>
<th align="left" id="stopped">Stopped</th>
<th align="left" id="duration">Duration</th>
<th align="left" id="play_duration">Duration</th>
<th align="left" id="percent_complete"></th>
</tr>
</thead>
@ -700,6 +766,11 @@ DOCUMENTATION :: END
% if metadata:
<%
data = defaultdict(None, **metadata)
season = ''
if data['media_type'] == 'episode':
season = short_season(data['parent_title'])
elif data['media_type'] == 'season':
season = short_season(data['title'])
%>
<div class="modal fade" id="info-modal" tabindex="-1" role="dialog" aria-labelledby="info-modal">
</div>
@ -739,15 +810,15 @@ DOCUMENTATION :: END
% elif data['media_type'] == 'show':
${data['title']}
% elif data['media_type'] == 'season':
${data['parent_title']}<br />S${data['media_index']}
${data['parent_title']}<br />${data['title']}
% elif data['media_type'] == 'episode':
${data['grandparent_title']}<br />${data['title']}<br />S${data['parent_media_index']} &middot; E${data['media_index']}
${data['grandparent_title']}<br />${data['title']}<br />${season} &middot; E${data['media_index']}
% elif data['media_type'] == 'artist':
${data['title']}
% elif data['media_type'] == 'album':
${data['parent_title']}<br />${data['title']}
% elif data['media_type'] == 'track':
${data['original_title'] or data['grandparent_title']}<br />${data['title']}<br />${data['parent_title']}
${data['grandparent_title']}<br />${data['title']}<br />${data['parent_title']}
% endif
</strong>
</p>
@ -755,7 +826,7 @@ DOCUMENTATION :: END
<label for="send-notification-notifier">Select the Notification Agent</label>
<div class="row">
<div class="col-md-8" style="float: none; margin: 0 auto;">
<select class="form-control" id="send-notification-notifier" name="send-notification-notifier" value="" placeholder="The server owner has ended the stream." style="text-align: center;">
<select class="form-control" id="send-notification-notifier" name="send-notification-notifier" value="" placeholder="The server owner has ended the stream.">
<option value="">All Enabled Recently Added Notification Agents</option>
% for notifier in sorted(notifiers.get_notifiers(), key=lambda k: (k['agent_label'], k['friendly_name'], k['id'])):
% if notifier['friendly_name']:
@ -794,84 +865,58 @@ DOCUMENTATION :: END
%>
<script src="${http_root}js/tables/history_table.js${cache_param}"></script>
<script src="${http_root}js/tables/export_table.js${cache_param}"></script>
% if data['live']:
% if data['media_type'] in ('movie', 'show', 'season', 'episode', 'artist', 'album', 'track', 'collection', 'playlist'):
<script>
function get_history() {
function loadHistoryTable(transcode_decision) {
// Build watch history table
history_table_options.ajax = {
url: 'get_history',
type: 'POST',
data: function ( d ) {
data: function (d) {
return {
json_data: JSON.stringify( d ),
guid: "${data['guid']}",
user_id: "${history_user_id}"
json_data: JSON.stringify(d),
transcode_decision: transcode_decision,
user_id: "${history_user_id}",
% if data['live']:
guid: "${data['guid']}"
% elif data['media_type'] in ('show', 'artist'):
grandparent_rating_key: "${data['rating_key']}"
% elif data['media_type'] in ('season', 'album'):
parent_rating_key: "${data['rating_key']}"
% elif data['media_type'] in ('movie', 'episode', 'track'):
rating_key: "${data['rating_key']}"
% elif data['media_type'] in ('collection', 'playlist'):
media_type: "${data['media_type']}",
rating_key: "${data['rating_key']}"
% endif
};
}
}
}
</script>
% elif data['media_type'] in ('show', 'artist'):
<script>
function get_history() {
history_table_options.ajax = {
url: 'get_history',
type: 'POST',
data: function ( d ) {
return {
json_data: JSON.stringify( d ),
grandparent_rating_key: "${data['rating_key']}",
user_id: "${history_user_id}"
};
}
}
}
</script>
% elif data['media_type'] in ('season', 'album'):
<script>
function get_history() {
history_table_options.ajax = {
url: 'get_history',
type: 'POST',
data: function ( d ) {
return {
json_data: JSON.stringify( d ),
parent_rating_key: "${data['rating_key']}",
user_id: "${history_user_id}"
};
}
}
}
</script>
% elif data['media_type'] in ('movie', 'episode', 'track'):
<script>
function get_history() {
history_table_options.ajax = {
url: 'get_history',
type: 'POST',
data: function ( d ) {
return {
json_data: JSON.stringify( d ),
rating_key: "${data['rating_key']}",
user_id: "${history_user_id}"
};
}
}
}
</script>
% endif
% if data['media_type'] in ('movie', 'show', 'season', 'episode', 'artist', 'album', 'track'):
<script>
function loadHistoryTable() {
get_history();
history_table = $('#history_table-RK-${data["rating_key"]}').DataTable(history_table_options);
var colvis = new $.fn.dataTable.ColVis(history_table, { buttonText: '<i class="fa fa-columns"></i> Select columns', buttonClass: 'btn btn-dark', exclude: [0, 12] });
$(colvis.button()).appendTo('#button-bar-history');
clearSearchButton('history_table-RK-${data["rating_key"]}', history_table);
$('#transcode_decision-selection').on('change', function () {
$('#transcode_decision-selection > label').removeClass('active');
var selected_filter = $('input[name=transcode_decision-filter]:checked', '#transcode_decision-selection');
$(selected_filter).closest('label').addClass('active');
transcode_decision = $(selected_filter).map(function () { return $(this).val(); }).get().join(',');
setLocalStorage('info_${data["rating_key"]}_history_transcode_decision', transcode_decision);
history_table.draw();
});
}
var transcode_decision = getLocalStorage('info_${data["rating_key"]}_history_transcode_decision', 'all');
$.each(transcode_decision.split(','), function (i, item) {
var history_transcode_decision = $('#history-transcode_decision-' + item.replace(' ', '_'));
history_transcode_decision.prop('checked', true);
history_transcode_decision.closest('label').addClass('active');
});
$(document).ready(function () {
loadHistoryTable();
loadHistoryTable(transcode_decision);
});
$("#refresh-history-list").click(function () {
@ -895,6 +940,42 @@ DOCUMENTATION :: END
});
</script>
% endif
% if data['media_type'] in ('movie', 'show', 'season', 'episode', 'artist', 'album', 'track', 'collection', 'playlist'):
<script>
// Populate watch time stats
$.ajax({
url: 'item_watch_time_stats',
async: true,
data: {
% if data['live']:
guid: "${data['guid']}"
% else:
rating_key: "${data['rating_key']}",
media_type: "${data['media_type']}"
% endif
},
complete: function(xhr, status) {
$("#watch-time-stats").html(xhr.responseText);
}
});
// Populate user stats
$.ajax({
url: 'item_user_stats',
async: true,
data: {
% if data['live']:
guid: "${data['guid']}"
% else:
rating_key: "${data['rating_key']}",
media_type: "${data['media_type']}"
% endif
},
complete: function(xhr, status) {
$("#user-stats").html(xhr.responseText);
}
});
</script>
% endif
% if data['media_type'] == 'collection':
<script>
$.ajax({
@ -939,6 +1020,7 @@ DOCUMENTATION :: END
$('#channel-icon').popover({
selector: '[data-toggle=popover]',
html: true,
sanitize: false,
container: 'body',
trigger: 'hover',
placement: 'right',
@ -947,6 +1029,21 @@ DOCUMENTATION :: END
return '<div class="channel-thumbnail" style="background-image: url(' + $(this).data('img') + ');" />';
}
});
$('.summary-content-summary').hasScrollBar() ? $('.summary-toggle').show() : $('.summary-toggle').hide();
$('.summary-toggle a').on('click', function() {
var $this = $(this);
var $content = $this.parent().prev('div.summary-content-summary');
if ($this.hasClass('show-more')) {
$this.html('Read less &nbsp;<i class="fa fa-chevron-up"></i>').toggleClass('show-more').toggleClass('show-less');
$content.animate({'height': $content[0].scrollHeight});
} else {
$this.html('Read more &nbsp;<i class="fa fa-chevron-down"></i>').toggleClass('show-more').toggleClass('show-less');
$content.animate({'height': '60px'});
}
});
</script>
% if _session['user_group'] == 'admin':
<script>
@ -1005,9 +1102,9 @@ DOCUMENTATION :: END
});
$('#row-edit-mode').on('click', function() {
$('#row-edit-mode-alert').fadeIn(200);
if ($(this).hasClass('active')) {
$(this).tooltip('destroy');
if (history_to_delete.length > 0) {
$('#deleteCount').text(history_to_delete.length);
$('#confirm-modal-delete').modal();
@ -1032,6 +1129,13 @@ DOCUMENTATION :: END
});
} else {
$(this).tooltip({
container: '.body-container',
placement: 'bottom',
title: 'Select rows to delete. Data is deleted upon exiting delete mode.',
trigger: 'manual'
}).tooltip('show');
history_to_delete = [];
$('.delete-control').each(function() {
$(this).find('button.btn-danger').toggleClass('btn-warning').toggleClass('btn-danger');
@ -1074,6 +1178,7 @@ DOCUMENTATION :: END
$('#hosted-poster').popover({
selector: '[data-toggle=popover]',
html: true,
sanitize: false,
container: 'body',
trigger: 'hover',
placement: 'top',

View file

@ -28,7 +28,7 @@ DOCUMENTATION :: END
% if data != None:
<%
from plexpy.helpers import cast_to_int, page
from plexpy.helpers import cast_to_int, page, short_season
%>
% if data['children_count'] > 0:
<div class="item-children-wrapper">
@ -41,134 +41,7 @@ DOCUMENTATION :: END
% else:
<li>
% endif
% if data['children_type'] == 'movie':
<a href="${page('info', child['rating_key'])}" title="${child['title']}">
<div class="item-children-poster">
<div class="item-children-poster-face poster-item" style="background-image: url(${page('pms_image_proxy', child['thumb'], child['rating_key'], 300, 450, fallback='poster')});"></div>
% if _session['user_group'] == 'admin':
<span class="overlay-refresh-image" title="Refresh image"><i class="fa fa-refresh refresh_pms_image"></i></span>
% endif
</div>
</a>
<div class="item-children-instance-text-wrapper poster-item">
<h3>
<a href="${page('info', child['rating_key'])}" title="${child['title']}">${child['title']}</a>
</h3>
<h3 class="text-muted">${child['year']}</h3>
</div>
% elif data['children_type'] == 'show':
<a href="${page('info', child['rating_key'])}" title="${child['title']}">
<div class="item-children-poster">
<div class="item-children-poster-face poster-item" style="background-image: url(${page('pms_image_proxy', child['thumb'], child['rating_key'], 300, 450, fallback='poster')});"></div>
% if _session['user_group'] == 'admin':
<span class="overlay-refresh-image" title="Refresh image"><i class="fa fa-refresh refresh_pms_image"></i></span>
% endif
</div>
</a>
<div class="item-children-instance-text-wrapper poster-item">
<h3>
<a href="${page('info', child['rating_key'])}" title="${child['title']}">${child['title']}</a>
</h3>
</div>
% elif data['children_type'] == 'season':
<a href="${page('info', child['rating_key'])}" title="Season ${child['media_index']}">
<div class="item-children-poster">
% if child['thumb']:
<div class="item-children-poster-face poster-item" style="background-image: url(${page('pms_image_proxy', child['thumb'], child['rating_key'], 300, 450, fallback='poster')});">
% else:
<div class="item-children-poster-face poster-item" style="background-image: url(${page('pms_image_proxy', child['parent_thumb'], child['parent_rating_key'], 300, 450, fallback='poster')});">
% endif
<div class="item-children-card-overlay">
<div class="item-children-overlay-text">
Season ${child['media_index']}
</div>
</div>
</div>
% if _session['user_group'] == 'admin':
<span class="overlay-refresh-image" title="Refresh image"><i class="fa fa-refresh refresh_pms_image"></i></span>
% endif
</div>
</a>
% elif data['children_type'] == 'episode':
<a href="${page('info', child['rating_key'])}" title="Episode ${child['media_index']}">
<div class="item-children-poster">
<div class="item-children-poster-face episode-item" style="background-image: url(${page('pms_image_proxy', child['thumb'], child['rating_key'], 500, 280, fallback='art')});">
<div class="item-children-card-overlay">
<div class="item-children-overlay-text">
Episode ${child['media_index'] or child['originally_available_at']}
</div>
</div>
</div>
% if _session['user_group'] == 'admin':
<span class="overlay-refresh-image" title="Refresh image"><i class="fa fa-refresh refresh_pms_image"></i></span>
% endif
</div>
</a>
<div class="item-children-instance-text-wrapper episode-item">
<h3>
<a href="${page('info', child['rating_key'])}" title="${child['title']}">${child['title']}</a>
</h3>
</div>
% elif data['children_type'] == 'album':
<a href="${page('info', child['rating_key'])}" title="${child['title']}">
<div class="item-children-poster">
<div class="item-children-poster-face cover-item" style="background-image: url(${page('pms_image_proxy', child['thumb'], child['rating_key'], 300, 300, fallback='cover')});"></div>
% if _session['user_group'] == 'admin':
<span class="overlay-refresh-image" title="Refresh image"><i class="fa fa-refresh refresh_pms_image"></i></span>
% endif
</div>
</a>
<div class="item-children-instance-text-wrapper cover-item">
<h3>
<a href="${page('info', child['rating_key'])}" title="${child['title']}">${child['title']}</a>
</h3>
</div>
% elif data['children_type'] == 'track':
<% e = 'even' if loop.index % 2 == 0 else 'odd' %>
<div class="item-children-list-item-${e}">
<span class="item-children-list-item-index">${child['media_index']}</span>
<span class="item-children-list-item-title">
<span class="media-type-tooltip" data-toggle="tooltip" title="Track"><i class="fa fa-music fa-fw"></i></span>
<a href="${page('info', child['rating_key'])}" title="${child['title']}">
<span class="thumb-tooltip" data-toggle="popover" data-img="${page('pms_image_proxy', child['parent_thumb'], child['parent_rating_key'], 300, 300, fallback='cover')}" data-height="80" data-width="80">
${child['title']}
</span>
</a>
% if child['original_title']:
<span class="text-muted"> - ${child['original_title']}</span>
% endif
</span>
<span class="item-children-list-item-duration" id="item-children-list-item-duration-${loop.index + 1}">
<% f = 'h:mm:ss' if cast_to_int(child['duration']) >= 3600000 else 'm:ss' %>
<script>$('#item-children-list-item-duration-${loop.index + 1}').text(moment.utc(${child['duration']}).format("${f}"));</script>
</span>
</div>
% elif data['children_type'] == 'photo':
<% e = 'even' if loop.index % 2 == 0 else 'odd' %>
<div class="item-children-list-item-${e}">
<span class="item-children-list-item-index">${loop.index + 1}</span>
<span class="item-children-list-item-title">
% if child['media_type'] == 'photo_album':
<span class="media-type-tooltip" data-toggle="tooltip" title="Photo"><i class="fa fa-camera fa-fw"></i></span>
% elif child['media_type'] == 'clip':
<span class="media-type-tooltip" data-toggle="tooltip" title="Photo"><i class="fa fa-video-camera fa-fw"></i></span>
% else:
<span class="media-type-tooltip" data-toggle="tooltip" title="Photo"><i class="fa fa-picture-o fa-fw"></i></span>
% endif
<a href="${page('info', child['rating_key'])}" title="${child['title']}">
<span class="thumb-tooltip" data-toggle="popover" data-img="${page('pms_image_proxy', child['thumb'], child['rating_key'], 300, 300, fallback='cover')}" data-height="80" data-width="80">
${child['title']}
</span>
</a>
</span>
% if child['duration']:
<span class="item-children-list-item-duration" id="item-children-list-item-duration-${loop.index + 1}">
<% f = 'h:mm:ss' if cast_to_int(child['duration']) >= 3600000 else 'm:ss' %>
<script>$('#item-children-list-item-duration-${loop.index + 1}').text(moment.utc(${child['duration']}).format("${f}"));</script>
</span>
% endif
</div>
% elif media_type == 'playlist':
% if media_type == 'playlist':
<% e = 'even' if loop.index % 2 == 0 else 'odd' %>
<div class="item-children-list-item-${e}">
<span class="item-children-list-item-index">${loop.index + 1}</span>
@ -193,7 +66,7 @@ DOCUMENTATION :: END
${child['title']}
</span>
</a>
<span class="text-muted"> (<a class="no-highlight" href="${page('info', child['parent_rating_key'])}" title="${child['parent_title']}">S${child['parent_media_index']}</a> &middot; <a class="no-highlight" href="${page('info', child['rating_key'])}" title="${child['title']}">E${child['media_index']}</a>)</span>
<span class="text-muted"> (<a class="no-highlight" href="${page('info', child['parent_rating_key'])}" title="${child['parent_title']}">${short_season(child['parent_title'])}</a> &middot; <a class="no-highlight" href="${page('info', child['rating_key'])}" title="${child['title']}">E${child['media_index']}</a>)</span>
% elif child['media_type'] == 'track':
<span class="media-type-tooltip" data-toggle="tooltip" title="Track"><i class="fa fa-music fa-fw"></i></span>
<a href="${page('info', child['rating_key'])}" title="${child['title']}">
@ -239,6 +112,179 @@ DOCUMENTATION :: END
</span>
% endif
</div>
% elif child['media_type'] == 'movie':
<a href="${page('info', child['rating_key'])}" title="${child['title']}">
<div class="item-children-poster">
<div class="item-children-poster-face poster-item" style="background-image: url(${page('pms_image_proxy', child['thumb'], child['rating_key'], 300, 450, fallback='poster')});"></div>
% if _session['user_group'] == 'admin':
<span class="overlay-refresh-image" title="Refresh image"><i class="fa fa-refresh refresh_pms_image"></i></span>
% endif
</div>
</a>
<div class="item-children-instance-text-wrapper poster-item">
<h3>
<a href="${page('info', child['rating_key'])}" title="${child['title']}">${child['title']}</a>
</h3>
<h3 class="text-muted">${child['year']}</h3>
</div>
% elif child['media_type'] == 'show':
<a href="${page('info', child['rating_key'])}" title="${child['title']}">
<div class="item-children-poster">
<div class="item-children-poster-face poster-item" style="background-image: url(${page('pms_image_proxy', child['thumb'], child['rating_key'], 300, 450, fallback='poster')});"></div>
% if _session['user_group'] == 'admin':
<span class="overlay-refresh-image" title="Refresh image"><i class="fa fa-refresh refresh_pms_image"></i></span>
% endif
</div>
</a>
<div class="item-children-instance-text-wrapper poster-item">
<h3>
<a href="${page('info', child['rating_key'])}" title="${child['title']}">${child['title']}</a>
</h3>
</div>
% elif child['media_type'] == 'season':
<a href="${page('info', child['rating_key'])}" title="${child['title']}">
<div class="item-children-poster">
% if child['thumb']:
<div class="item-children-poster-face poster-item" style="background-image: url(${page('pms_image_proxy', child['thumb'], child['rating_key'], 300, 450, fallback='poster')});">
% else:
<div class="item-children-poster-face poster-item" style="background-image: url(${page('pms_image_proxy', child['parent_thumb'], child['parent_rating_key'], 300, 450, fallback='poster')});">
% endif
<div class="item-children-card-overlay">
<div class="item-children-overlay-text">
${child['title']}
</div>
</div>
</div>
% if _session['user_group'] == 'admin':
<span class="overlay-refresh-image" title="Refresh image"><i class="fa fa-refresh refresh_pms_image"></i></span>
% endif
</div>
</a>
<div class="item-children-instance-text-wrapper poster-item">
<h3>
<a href="${page('info', child['rating_key'])}" title="${child['title']}">${child['title']}</a>
</h3>
% if media_type == 'collection':
<h3 class="text-muted">
<a class="text-muted" href="${page('info', child['parent_rating_key'])}" title="${child['parent_title']}">${child['parent_title']}</a>
</h3>
% endif
</div>
% elif child['media_type'] == 'episode':
<a href="${page('info', child['rating_key'])}" title="Episode ${child['media_index']}">
<div class="item-children-poster">
<div class="item-children-poster-face episode-item" style="background-image: url(${page('pms_image_proxy', child['thumb'], child['rating_key'], 500, 280, fallback='art')});">
<div class="item-children-card-overlay">
<div class="item-children-overlay-text">
Episode ${child['media_index'] or child['originally_available_at']}
</div>
</div>
</div>
% if _session['user_group'] == 'admin':
<span class="overlay-refresh-image" title="Refresh image"><i class="fa fa-refresh refresh_pms_image"></i></span>
% endif
</div>
</a>
<div class="item-children-instance-text-wrapper episode-item">
<h3>
<a href="${page('info', child['rating_key'])}" title="${child['title']}">${child['title']}</a>
</h3>
% if media_type == 'collection':
<h3 class="text-muted">
<a href="${page('info', child['grandparent_rating_key'])}" title="${child['grandparent_title']}">${child['grandparent_title']}</a>
</h3>
<h3 class="text-muted">
<a href="${page('info', child['parent_rating_key'])}" title="${child['parent_title']}">${short_season(child['parent_title'])}</a>
&middot; <a href="${page('info', child['rating_key'])}" title="Episode ${child['media_index']}">E${child['media_index']}</a>
</h3>
% endif
</div>
% elif child['media_type'] == 'artist':
<a href="${page('info', child['rating_key'])}" title="${child['title']}">
<div class="item-children-poster">
<div class="item-children-poster-face cover-item" style="background-image: url(${page('pms_image_proxy', child['thumb'], child['rating_key'], 300, 300, fallback='cover')});"></div>
% if _session['user_group'] == 'admin':
<span class="overlay-refresh-image" title="Refresh image"><i class="fa fa-refresh refresh_pms_image"></i></span>
% endif
</div>
</a>
<div class="item-children-instance-text-wrapper cover-item">
<h3>
<a href="${page('info', child['rating_key'])}" title="${child['title']}">${child['title']}</a>
</h3>
</div>
% elif child['media_type'] == 'album':
<a href="${page('info', child['rating_key'])}" title="${child['title']}">
<div class="item-children-poster">
<div class="item-children-poster-face cover-item" style="background-image: url(${page('pms_image_proxy', child['thumb'], child['rating_key'], 300, 300, fallback='cover')});"></div>
% if _session['user_group'] == 'admin':
<span class="overlay-refresh-image" title="Refresh image"><i class="fa fa-refresh refresh_pms_image"></i></span>
% endif
</div>
</a>
<div class="item-children-instance-text-wrapper cover-item">
<h3>
<a href="${page('info', child['rating_key'])}" title="${child['title']}">${child['title']}</a>
</h3>
% if media_type == 'collection':
<h3 class="text-muted">
<a class="text-muted" href="${page('info', child['parent_rating_key'])}" title="${child['parent_title']}">${child['parent_title']}</a>
</h3>
% endif
</div>
% elif child['media_type'] == 'track':
<% e = 'even' if loop.index % 2 == 0 else 'odd' %>
<div class="item-children-list-item-${e}">
<span class="item-children-list-item-index">${child['media_index']}</span>
<span class="item-children-list-item-title">
<span class="media-type-tooltip" data-toggle="tooltip" title="Track"><i class="fa fa-music fa-fw"></i></span>
<a href="${page('info', child['rating_key'])}" title="${child['title']}">
<span class="thumb-tooltip" data-toggle="popover" data-img="${page('pms_image_proxy', child['parent_thumb'], child['parent_rating_key'], 300, 300, fallback='cover')}" data-height="80" data-width="80">
${child['title']}
</span>
</a>
% if media_type == 'collection':
-
<a href="${page('info', child['grandparent_rating_key'])}" title="${child['grandparent_title']}">
<span class="thumb-tooltip" data-toggle="popover" data-img="${page('pms_image_proxy', child['grandparent_thumb'], child['grandparent_rating_key'], 300, 300, fallback='cover')}" data-height="80" data-width="80">
${child['grandparent_title']}
</span>
</a>
<span class="text-muted"> (<a class="no-highlight" href="${page('info', child['parent_rating_key'])}" title="${child['parent_title']}">${child['parent_title']}</a>)</span>
% elif child['original_title']:
<span class="text-muted"> - ${child['original_title']}</span>
% endif
</span>
<span class="item-children-list-item-duration" id="item-children-list-item-duration-${loop.index + 1}">
<% f = 'h:mm:ss' if cast_to_int(child['duration']) >= 3600000 else 'm:ss' %>
<script>$('#item-children-list-item-duration-${loop.index + 1}').text(moment.utc(${child['duration']}).format("${f}"));</script>
</span>
</div>
% elif child['media_type'] == 'photo':
<% e = 'even' if loop.index % 2 == 0 else 'odd' %>
<div class="item-children-list-item-${e}">
<span class="item-children-list-item-index">${loop.index + 1}</span>
<span class="item-children-list-item-title">
% if child['media_type'] == 'photo_album':
<span class="media-type-tooltip" data-toggle="tooltip" title="Photo"><i class="fa fa-camera fa-fw"></i></span>
% elif child['media_type'] == 'clip':
<span class="media-type-tooltip" data-toggle="tooltip" title="Photo"><i class="fa fa-video-camera fa-fw"></i></span>
% else:
<span class="media-type-tooltip" data-toggle="tooltip" title="Photo"><i class="fa fa-picture-o fa-fw"></i></span>
% endif
<a href="${page('info', child['rating_key'])}" title="${child['title']}">
<span class="thumb-tooltip" data-toggle="popover" data-img="${page('pms_image_proxy', child['thumb'], child['rating_key'], 300, 300, fallback='cover')}" data-height="80" data-width="80">
${child['title']}
</span>
</a>
</span>
% if child['duration']:
<span class="item-children-list-item-duration" id="item-children-list-item-duration-${loop.index + 1}">
<% f = 'h:mm:ss' if cast_to_int(child['duration']) >= 3600000 else 'm:ss' %>
<script>$('#item-children-list-item-duration-${loop.index + 1}').text(moment.utc(${child['duration']}).format("${f}"));</script>
</span>
% endif
</div>
% endif
</li>
% endif
@ -253,6 +299,7 @@ DOCUMENTATION :: END
$('body').popover({
selector: '[data-toggle="popover"]',
html: true,
sanitize: false,
container: 'body',
trigger: 'hover',
placement: 'right',

View file

@ -54,7 +54,7 @@ DOCUMENTATION :: END
% if data != None:
<%
from plexpy.helpers import page
from plexpy.helpers import page, short_season
%>
% if data['results_count'] > 0:
% if 'collection' in data['results_list'] and data['results_list']['collection']:
@ -149,7 +149,7 @@ DOCUMENTATION :: END
</div>
<div class="item-children-instance-text-wrapper poster-item">
<h3 title="${child['parent_title']}">${child['parent_title']}</h3>
<h3 class="text-muted">S${child['media_index']}</h3>
<h3 class="text-muted">${short_season(child['title'])}</h3>
</div>
</a>
</li>
@ -175,7 +175,7 @@ DOCUMENTATION :: END
<div class="item-children-instance-text-wrapper episode-item">
<h3 title="${child['grandparent_title']}">${child['grandparent_title']}</h3>
<h3 title="${child['title']}">${child['title']}</h3>
<h3 class="text-muted">S${child['parent_media_index']} &middot; E${child['media_index']}</h3>
<h3 class="text-muted">${short_season(child['parent_title'])} &middot; E${child['media_index']}</h3>
</div>
</a>
</li>

View file

@ -13,9 +13,25 @@
</h4>
</div>
<div class="modal-body" id="modal-text">
% if kwargs:
<div class="col-sm-12">
<h4>
<strong>Location Details</strong>
<strong>Connection Details</strong>
</h4>
</div>
<div class="col-sm-12">
<ul class="list-unstyled">
<% icon = {'0': 'times', '1': 'check'} %>
<li>Location: <strong>${(kwargs['location'] or 'unknown').upper()}</strong></li>
<li>Secure Connection: <i class="fa fa-${icon.get(kwargs['secure'], 'question')}"></i></li>
<li>Plex Relay: <i class="fa fa-${icon.get(kwargs['relayed'], 'question')}"></i></li>
</ul>
</div>
% endif
% if public:
<div class="col-sm-12">
<h4>
<strong>Geolocation Lookup</strong>
% if data:
<span id="ip_loading" style="padding-left: 5px;"><i class="fa fa-refresh fa-spin"></i></span>
% endif
@ -24,6 +40,7 @@
<div id="ip_error" class="col-sm-12 text-muted"></div>
<div class="col-sm-6">
<ul class="list-unstyled">
<li>Continent: <strong><span id="continent"></span></strong></li>
<li>Country: <strong><span id="country"></span></strong></li>
<li>Region: <strong><span id="region"></span></strong></li>
<li>City: <strong><span id="city"></span></strong></li>
@ -39,7 +56,7 @@
</div>
<div class="col-sm-12">
<h4>
<strong>Connection Details</strong>
<strong>Whois Lookup</strong>
% if data:
<span id="isp_loading" style="padding-left: 5px;"><i class="fa fa-refresh fa-spin"></i></span>
% endif
@ -57,13 +74,17 @@
<li>Address: <strong><span id="isp_address"></span></strong></li>
</ul>
</div>
% endif
</div>
<div class="modal-footer">
% if data == '127.0.0.1' and kwargs.get('location') == 'wan':
<div style="float: right;"><span class="text-muted" id="rquote">We've traced the call. It's coming from inside the house!</span></div>
% endif
</div>
</div>
</div>
% if data:
% if data and public:
<script>
function getUserLocation(ip_address) {
$.ajax({
@ -83,6 +104,7 @@
$('#ip_error').html('<i class="fa fa-exclamation-circle"></i> ' + result.message).show();
} else {
var data = result.data;
$('#continent').html(data.continent);
$('#country').html(data.country);
$('#region').html(data.region);
$('#city').html(data.city);

View file

@ -0,0 +1 @@
const blurhash=function(t){const e=["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","#","$","%","*","+",",","-",".",":",";","=","?","@","[","]","^","_","{","|","}","~"],a=t=>{let a=0;for(let r=0;r<t.length;r++){const o=t[r];a=83*a+e.indexOf(o)}return a},r=(t,a)=>{var r="";for(let o=1;o<=a;o++){let h=Math.floor(t)/Math.pow(83,a-o)%83;r+=e[Math.floor(h)]}return r},o=t=>{let e=t/255;return e<=.04045?e/12.92:Math.pow((e+.055)/1.055,2.4)},h=t=>{let e=Math.max(0,Math.min(1,t));return e<=.0031308?Math.round(12.92*e*255+.5):Math.round(255*(1.055*Math.pow(e,1/2.4)-.055)+.5)},n=(t,e)=>(t=>t<0?-1:1)(t)*Math.pow(Math.abs(t),e),l=t=>{if(!t||t.length<6)throw new Error("The blurhash string must be at least 6 characters");const e=a(t[0]),r=Math.floor(e/9)+1,o=e%9+1;if(t.length!==4+2*o*r)throw new Error(`blurhash length mismatch: length is ${t.length} but it should be ${4+2*o*r}`)},s=t=>{const e=t>>8&255,a=255&t;return[o(t>>16),o(e),o(a)]},m=(t,e)=>{const a=Math.floor(t/361),r=Math.floor(t/19)%19,o=t%19;return[n((a-9)/9,2)*e,n((r-9)/9,2)*e,n((o-9)/9,2)*e]},c=(t,e,a,r)=>{let h=0,n=0,l=0;const s=4*e;for(let m=0;m<e;m++)for(let e=0;e<a;e++){const a=r(m,e);h+=a*o(t[4*m+0+e*s]),n+=a*o(t[4*m+1+e*s]),l+=a*o(t[4*m+2+e*s])}let m=1/(e*a);return[h*m,n*m,l*m]};return t.decodePromise=((e,a,r,o=1)=>new Promise((h,n)=>{h(t.decode(e,a,r,o))})),t.decode=((t,e,r,o=1)=>{l(t),o|=1;const n=a(t[0]),c=Math.floor(n/9)+1,i=n%9+1,M=(a(t[1])+1)/166,g=new Array(i*c);for(let e=0;e<g.length;e++)if(0===e){const r=a(t.substring(2,6));g[e]=s(r)}else{const r=a(t.substring(4+2*e,6+2*e));g[e]=m(r,M*o)}const f=4*e,d=new Uint8ClampedArray(f*r);for(let t=0;t<r;t++)for(let a=0;a<e;a++){let o=0,n=0,l=0;for(let h=0;h<c;h++)for(let s=0;s<i;s++){const m=Math.cos(Math.PI*a*s/e)*Math.cos(Math.PI*t*h/r);let c=g[s+h*i];o+=c[0]*m,n+=c[1]*m,l+=c[2]*m}let s=h(o),m=h(n),M=h(l);d[4*a+0+t*f]=s,d[4*a+1+t*f]=m,d[4*a+2+t*f]=M,d[4*a+3+t*f]=255}return d}),t.encodePromise=((e,a,r,o,h)=>new Promise((n,l)=>{n(t.encode(e,a,r,o,h))})),t.encode=((t,e,a,o,l)=>{if(o<1||o>9||l<1||l>9)throw new Error("BlurHash must have between 1 and 9 components");if(e*a*4!==t.length)throw new Error("Width and height must match the pixels array");let s=[];for(let r=0;r<l;r++)for(let h=0;h<o;h++){const o=0==h&&0==r?1:2,n=c(t,e,a,(t,n)=>o*Math.cos(Math.PI*h*t/e)*Math.cos(Math.PI*r*n/a));s.push(n)}const m=s[0],i=s.slice(1);let M,g="";if(g+=r(o-1+9*(l-1),1),i.length>0){let t=Math.max(...i.map(t=>Math.max(...t))),e=Math.floor(Math.max(0,Math.min(82,Math.floor(166*t-.5))));M=(e+1)/166,g+=r(e,1)}else M=1,g+=r(0,1);return g+=r((t=>{return(h(t[0])<<16)+(h(t[1])<<8)+h(t[2])})(m),4),i.forEach(t=>{g+=r(((t,e)=>{return 19*Math.floor(Math.max(0,Math.min(18,Math.floor(9*n(t[0]/e,.5)+9.5))))*19+19*Math.floor(Math.max(0,Math.min(18,Math.floor(9*n(t[1]/e,.5)+9.5))))+Math.floor(Math.max(0,Math.min(18,Math.floor(9*n(t[2]/e,.5)+9.5))))})(t,M),2)}),g}),t.getImageData=(t=>{const e=t.width,a=t.height,r=document.createElement("canvas"),o=r.getContext("2d");return r.width=e,r.height=a,o.width=e,o.height=a,o.drawImage(t,0,0),o.getImageData(0,0,e,a).data}),t.drawImageDataOnNewCanvas=((t,e,a)=>{const r=document.createElement("canvas"),o=r.getContext("2d");return r.width=e,r.height=a,o.width=e,o.height=a,o.putImageData(new ImageData(t,e,a),0,0),r}),t.getImageDataAsImageWithOnloadPromise=((e,a,r)=>new Promise((o,h)=>{t.getImageDataAsImage(e,a,r,(t,e)=>{o(e)})})),t.getImageDataAsImage=((e,a,r,o)=>{const h=t.drawImageDataOnNewCanvas(e,a,r).toDataURL(),n=new Image(a,r);return n.onload=(t=>o(t,n)),n.width=a,n.height=r,n.src=h,n}),t}({});

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -2,7 +2,13 @@
DataTables Bootstrap 3 integration
©2011-2015 SpryMedia Ltd - datatables.net/license
*/
(function(b){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(a){return b(a,window,document)}):"object"===typeof exports?module.exports=function(a,d){a||(a=window);if(!d||!d.fn.dataTable)d=require("datatables.net")(a,d).$;return b(d,a,a.document)}:b(jQuery,window,document)})(function(b,a,d){var f=b.fn.dataTable;b.extend(!0,f.defaults,{dom:"<'row'<'col-sm-6'l><'col-sm-6'f>><'row'<'col-sm-12'tr>><'row'<'col-sm-5'i><'col-sm-7'p>>",renderer:"bootstrap"});b.extend(f.ext.classes,
{sWrapper:"dataTables_wrapper form-inline dt-bootstrap",sFilterInput:"form-control input-sm",sLengthSelect:"form-control input-sm",sProcessing:"dataTables_processing panel panel-default"});f.ext.renderer.pageButton.bootstrap=function(a,h,r,m,j,n){var o=new f.Api(a),s=a.oClasses,k=a.oLanguage.oPaginate,t=a.oLanguage.oAria.paginate||{},e,g,p=0,q=function(d,f){var l,h,i,c,m=function(a){a.preventDefault();!b(a.currentTarget).hasClass("disabled")&&o.page()!=a.data.action&&o.page(a.data.action).draw("page")};
l=0;for(h=f.length;l<h;l++)if(c=f[l],b.isArray(c))q(d,c);else{g=e="";switch(c){case "ellipsis":e="&#x2026;";g="disabled";break;case "first":e=k.sFirst;g=c+(0<j?"":" disabled");break;case "previous":e=k.sPrevious;g=c+(0<j?"":" disabled");break;case "next":e=k.sNext;g=c+(j<n-1?"":" disabled");break;case "last":e=k.sLast;g=c+(j<n-1?"":" disabled");break;default:e=c+1,g=j===c?"active":""}e&&(i=b("<li>",{"class":s.sPageButton+" "+g,id:0===r&&"string"===typeof c?a.sTableId+"_"+c:null}).append(b("<a>",{href:"#",
"aria-controls":a.sTableId,"aria-label":t[c],"data-dt-idx":p,tabindex:a.iTabIndex}).html(e)).appendTo(d),a.oApi._fnBindAction(i,{action:c},m),p++)}},i;try{i=b(h).find(d.activeElement).data("dt-idx")}catch(u){}q(b(h).empty().html('<ul class="pagination"/>').children("ul"),m);i&&b(h).find("[data-dt-idx="+i+"]").focus()};return f});
var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.findInternal=function(a,b,c){a instanceof String&&(a=String(a));for(var e=a.length,d=0;d<e;d++){var f=a[d];if(b.call(c,f,d,a))return{i:d,v:f}}return{i:-1,v:void 0}};$jscomp.ASSUME_ES5=!1;$jscomp.ASSUME_NO_NATIVE_MAP=!1;$jscomp.ASSUME_NO_NATIVE_SET=!1;$jscomp.SIMPLE_FROUND_POLYFILL=!1;$jscomp.ISOLATE_POLYFILLS=!1;
$jscomp.defineProperty=$jscomp.ASSUME_ES5||"function"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){if(a==Array.prototype||a==Object.prototype)return a;a[b]=c.value;return a};$jscomp.getGlobal=function(a){a=["object"==typeof globalThis&&globalThis,a,"object"==typeof window&&window,"object"==typeof self&&self,"object"==typeof global&&global];for(var b=0;b<a.length;++b){var c=a[b];if(c&&c.Math==Math)return c}throw Error("Cannot find global object");};$jscomp.global=$jscomp.getGlobal(this);
$jscomp.IS_SYMBOL_NATIVE="function"===typeof Symbol&&"symbol"===typeof Symbol("x");$jscomp.TRUST_ES6_POLYFILLS=!$jscomp.ISOLATE_POLYFILLS||$jscomp.IS_SYMBOL_NATIVE;$jscomp.polyfills={};$jscomp.propertyToPolyfillSymbol={};$jscomp.POLYFILL_PREFIX="$jscp$";var $jscomp$lookupPolyfilledValue=function(a,b){var c=$jscomp.propertyToPolyfillSymbol[b];if(null==c)return a[b];c=a[c];return void 0!==c?c:a[b]};
$jscomp.polyfill=function(a,b,c,e){b&&($jscomp.ISOLATE_POLYFILLS?$jscomp.polyfillIsolated(a,b,c,e):$jscomp.polyfillUnisolated(a,b,c,e))};$jscomp.polyfillUnisolated=function(a,b,c,e){c=$jscomp.global;a=a.split(".");for(e=0;e<a.length-1;e++){var d=a[e];if(!(d in c))return;c=c[d]}a=a[a.length-1];e=c[a];b=b(e);b!=e&&null!=b&&$jscomp.defineProperty(c,a,{configurable:!0,writable:!0,value:b})};
$jscomp.polyfillIsolated=function(a,b,c,e){var d=a.split(".");a=1===d.length;e=d[0];e=!a&&e in $jscomp.polyfills?$jscomp.polyfills:$jscomp.global;for(var f=0;f<d.length-1;f++){var l=d[f];if(!(l in e))return;e=e[l]}d=d[d.length-1];c=$jscomp.IS_SYMBOL_NATIVE&&"es6"===c?e[d]:null;b=b(c);null!=b&&(a?$jscomp.defineProperty($jscomp.polyfills,d,{configurable:!0,writable:!0,value:b}):b!==c&&($jscomp.propertyToPolyfillSymbol[d]=$jscomp.IS_SYMBOL_NATIVE?$jscomp.global.Symbol(d):$jscomp.POLYFILL_PREFIX+d,d=
$jscomp.propertyToPolyfillSymbol[d],$jscomp.defineProperty(e,d,{configurable:!0,writable:!0,value:b})))};$jscomp.polyfill("Array.prototype.find",function(a){return a?a:function(b,c){return $jscomp.findInternal(this,b,c).v}},"es6","es3");
(function(a){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(b){return a(b,window,document)}):"object"===typeof exports?module.exports=function(b,c){b||(b=window);c&&c.fn.dataTable||(c=require("datatables.net")(b,c).$);return a(c,b,b.document)}:a(jQuery,window,document)})(function(a,b,c,e){var d=a.fn.dataTable;a.extend(!0,d.defaults,{dom:"<'row'<'col-sm-6'l><'col-sm-6'f>><'row'<'col-sm-12'tr>><'row'<'col-sm-5'i><'col-sm-7'p>>",renderer:"bootstrap"});a.extend(d.ext.classes,
{sWrapper:"dataTables_wrapper form-inline dt-bootstrap",sFilterInput:"form-control input-sm",sLengthSelect:"form-control input-sm",sProcessing:"dataTables_processing panel panel-default"});d.ext.renderer.pageButton.bootstrap=function(f,l,A,B,m,t){var u=new d.Api(f),C=f.oClasses,n=f.oLanguage.oPaginate,D=f.oLanguage.oAria.paginate||{},h,k,v=0,y=function(q,w){var x,E=function(p){p.preventDefault();a(p.currentTarget).hasClass("disabled")||u.page()==p.data.action||u.page(p.data.action).draw("page")};
var r=0;for(x=w.length;r<x;r++){var g=w[r];if(Array.isArray(g))y(q,g);else{k=h="";switch(g){case "ellipsis":h="&#x2026;";k="disabled";break;case "first":h=n.sFirst;k=g+(0<m?"":" disabled");break;case "previous":h=n.sPrevious;k=g+(0<m?"":" disabled");break;case "next":h=n.sNext;k=g+(m<t-1?"":" disabled");break;case "last":h=n.sLast;k=g+(m<t-1?"":" disabled");break;default:h=g+1,k=m===g?"active":""}if(h){var F=a("<li>",{"class":C.sPageButton+" "+k,id:0===A&&"string"===typeof g?f.sTableId+"_"+g:null}).append(a("<a>",
{href:"#","aria-controls":f.sTableId,"aria-label":D[g],"data-dt-idx":v,tabindex:f.iTabIndex}).html(h)).appendTo(q);f.oApi._fnBindAction(F,{action:g},E);v++}}}};try{var z=a(l).find(c.activeElement).data("dt-idx")}catch(q){}y(a(l).empty().html('<ul class="pagination"/>').children("ul"),B);z!==e&&a(l).find("[data-dt-idx="+z+"]").trigger("focus")};return d});

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,76 @@
var formatter_function = function() {
if (moment(this.x, 'X').isValid() && (this.x > 946684800)) {
var s = '<b>'+ moment(this.x).format('ddd MMM D') +'</b>';
} else {
var s = '<b>'+ this.x +'</b>';
}
$.each(this.points, function(i, point) {
s += '<br/>'+point.series.name+': '+point.y;
});
return s;
};
var hc_concurrent_streams_by_stream_type_options = {
chart: {
type: 'line',
backgroundColor: 'rgba(0,0,0,0)',
renderTo: 'graph_concurrent_streams_by_stream_type'
},
title: {
text: ''
},
legend: {
enabled: true,
itemStyle: {
font: '9pt "Open Sans", sans-serif',
color: '#A0A0A0'
},
itemHoverStyle: {
color: '#FFF'
},
itemHiddenStyle: {
color: '#444'
}
},
credits: {
enabled: false
},
plotOptions: {
series: {
events: {
legendItemClick: function() {
setGraphVisibility(this.chart.renderTo.id, this.chart.series, this.name);
}
}
}
},
xAxis: {
type: 'datetime',
labels: {
formatter: function() {
return moment(this.value).format("MMM D");
},
style: {
color: '#aaa'
}
},
categories: [{}],
plotBands: []
},
yAxis: {
title: {
text: null
},
labels: {
style: {
color: '#aaa'
}
}
},
tooltip: {
shared: true,
crosshairs: true,
formatter: formatter_function
},
series: [{}]
};

View file

@ -0,0 +1,596 @@
/*
Highcharts JS v9.2.2 (2021-08-24)
(c) 2009-2021 Torstein Honsi
License: www.highcharts.com/license
*/
'use strict';(function(aa,M){"object"===typeof module&&module.exports?(M["default"]=M,module.exports=aa.document?M(aa):M):"function"===typeof define&&define.amd?define("highcharts/highcharts",function(){return M(aa)}):(aa.Highcharts&&aa.Highcharts.error(16,!0),aa.Highcharts=M(aa))})("undefined"!==typeof window?window:this,function(aa){function M(r,a,C,E){r.hasOwnProperty(a)||(r[a]=E.apply(null,C))}var a={};M(a,"Core/Globals.js",[],function(){var r="undefined"!==typeof aa?aa:"undefined"!==typeof window?
window:{},a;(function(a){a.SVG_NS="http://www.w3.org/2000/svg";a.product="Highcharts";a.version="9.2.2";a.win=r;a.doc=a.win.document;a.svg=a.doc&&a.doc.createElementNS&&!!a.doc.createElementNS(a.SVG_NS,"svg").createSVGRect;a.userAgent=a.win.navigator&&a.win.navigator.userAgent||"";a.isChrome=-1!==a.userAgent.indexOf("Chrome");a.isFirefox=-1!==a.userAgent.indexOf("Firefox");a.isMS=/(edge|msie|trident)/i.test(a.userAgent)&&!a.win.opera;a.isSafari=!a.isChrome&&-1!==a.userAgent.indexOf("Safari");a.isTouchDevice=
/(Mobile|Android|Windows Phone)/.test(a.userAgent);a.isWebKit=-1!==a.userAgent.indexOf("AppleWebKit");a.deg2rad=2*Math.PI/360;a.hasBidiBug=a.isFirefox&&4>parseInt(a.userAgent.split("Firefox/")[1],10);a.hasTouch=!!a.win.TouchEvent;a.marginNames=["plotTop","marginRight","marginBottom","plotLeft"];a.noop=function(){};a.supportsPassiveEvents=function(){var r=!1;if(!a.isMS){var w=Object.defineProperty({},"passive",{get:function(){r=!0}});a.win.addEventListener&&a.win.removeEventListener&&(a.win.addEventListener("testPassive",
a.noop,w),a.win.removeEventListener("testPassive",a.noop,w))}return r}();a.charts=[];a.dateFormats={};a.seriesTypes={};a.symbolSizes={};a.chartCount=0})(a||(a={}));"";return a});M(a,"Core/Utilities.js",[a["Core/Globals.js"]],function(a){function r(b,d,e,p){var y=d?"Highcharts error":"Highcharts warning";32===b&&(b=y+": Deprecated member");var F=m(b),c=F?y+" #"+b+": www.highcharts.com/errors/"+b+"/":b.toString();if("undefined"!==typeof p){var k="";F&&(c+="?");I(p,function(b,K){k+="\n - "+K+": "+b;
F&&(c+=encodeURI(K)+"="+encodeURI(b))});c+=k}B(a,"displayError",{chart:e,code:b,message:c,params:p},function(){if(d)throw Error(c);h.console&&-1===r.messages.indexOf(c)&&console.warn(c)});r.messages.push(c)}function C(b,d){var y={};I(b,function(h,c){if(J(b[c],!0)&&!b.nodeType&&d[c])h=C(b[c],d[c]),Object.keys(h).length&&(y[c]=h);else if(J(b[c])||b[c]!==d[c])y[c]=b[c]});return y}function E(b,d){return parseInt(b,d||10)}function z(b){return"string"===typeof b}function x(b){b=Object.prototype.toString.call(b);
return"[object Array]"===b||"[object Array Iterator]"===b}function J(b,d){return!!b&&"object"===typeof b&&(!d||!x(b))}function u(b){return J(b)&&"number"===typeof b.nodeType}function n(b){var d=b&&b.constructor;return!(!J(b,!0)||u(b)||!d||!d.name||"Object"===d.name)}function m(b){return"number"===typeof b&&!isNaN(b)&&Infinity>b&&-Infinity<b}function g(b){return"undefined"!==typeof b&&null!==b}function c(b,d,h){var y;z(d)?g(h)?b.setAttribute(d,h):b&&b.getAttribute&&((y=b.getAttribute(d))||"class"!==
d||(y=b.getAttribute(d+"Name"))):I(d,function(d,y){b.setAttribute(y,d)});return y}function e(b,d){var y;b||(b={});for(y in d)b[y]=d[y];return b}function l(){for(var b=arguments,d=b.length,h=0;h<d;h++){var c=b[h];if("undefined"!==typeof c&&null!==c)return c}}function f(b,d){a.isMS&&!a.svg&&d&&"undefined"!==typeof d.opacity&&(d.filter="alpha(opacity="+100*d.opacity+")");e(b.style,d)}function v(b,d,h,c,p){b=t.createElement(b);d&&e(b,d);p&&f(b,{padding:"0",border:"none",margin:"0"});h&&f(b,h);c&&c.appendChild(b);
return b}function q(b,d){return parseFloat(b.toPrecision(d||14))}function k(b,d,c){var y=a.getStyle||k;if("width"===d)return d=Math.min(b.offsetWidth,b.scrollWidth),c=b.getBoundingClientRect&&b.getBoundingClientRect().width,c<d&&c>=d-1&&(d=Math.floor(c)),Math.max(0,d-(y(b,"padding-left",!0)||0)-(y(b,"padding-right",!0)||0));if("height"===d)return Math.max(0,Math.min(b.offsetHeight,b.scrollHeight)-(y(b,"padding-top",!0)||0)-(y(b,"padding-bottom",!0)||0));h.getComputedStyle||r(27,!0);if(b=h.getComputedStyle(b,
void 0)){var e=b.getPropertyValue(d);l(c,"opacity"!==d)&&(e=E(e))}return e}function I(b,d,h){for(var y in b)Object.hasOwnProperty.call(b,y)&&d.call(h||b[y],b[y],y,b)}function D(b,d,h){function y(d,H){var K=b.removeEventListener||a.removeEventListenerPolyfill;K&&K.call(b,d,H,!1)}function c(h){var H;if(b.nodeName){if(d){var K={};K[d]=!0}else K=h;I(K,function(b,d){if(h[d])for(H=h[d].length;H--;)y(d,h[d][H].fn)})}}var e="function"===typeof b&&b.prototype||b;if(Object.hasOwnProperty.call(e,"hcEvents")){var p=
e.hcEvents;d?(e=p[d]||[],h?(p[d]=e.filter(function(b){return h!==b.fn}),y(d,h)):(c(p),p[d]=[])):(c(p),delete e.hcEvents)}}function B(b,d,h,c){h=h||{};if(t.createEvent&&(b.dispatchEvent||b.fireEvent&&b!==a)){var y=t.createEvent("Events");y.initEvent(d,!0,!0);h=e(y,h);b.dispatchEvent?b.dispatchEvent(h):b.fireEvent(d,h)}else if(b.hcEvents){h.target||e(h,{preventDefault:function(){h.defaultPrevented=!0},target:b,type:d});y=[];for(var p=b,k=!1;p.hcEvents;)Object.hasOwnProperty.call(p,"hcEvents")&&p.hcEvents[d]&&
(y.length&&(k=!0),y.unshift.apply(y,p.hcEvents[d])),p=Object.getPrototypeOf(p);k&&y.sort(function(b,d){return b.order-d.order});y.forEach(function(d){!1===d.fn.call(b,h)&&h.preventDefault()})}c&&!h.defaultPrevented&&c.call(b,h)}var O=a.charts,t=a.doc,h=a.win;(r||(r={})).messages=[];var d;Math.easeInOutSine=function(b){return-.5*(Math.cos(Math.PI*b)-1)};var b=Array.prototype.find?function(b,d){return b.find(d)}:function(b,d){var h,y=b.length;for(h=0;h<y;h++)if(d(b[h],h))return b[h]};I({map:"map",each:"forEach",
grep:"filter",reduce:"reduce",some:"some"},function(b,d){a[d]=function(h){var y;r(32,!1,void 0,(y={},y["Highcharts."+d]="use Array."+b,y));return Array.prototype[b].apply(h,[].slice.call(arguments,1))}});var p,G=function(){var b=Math.random().toString(36).substring(2,9)+"-",d=0;return function(){return"highcharts-"+(p?"":b)+d++}}();h.jQuery&&(h.jQuery.fn.highcharts=function(){var b=[].slice.call(arguments);if(this[0])return b[0]?(new (a[z(b[0])?b.shift():"Chart"])(this[0],b[0],b[1]),this):O[c(this[0],
"data-highcharts-chart")]});b={addEvent:function(b,d,h,c){void 0===c&&(c={});var y="function"===typeof b&&b.prototype||b;Object.hasOwnProperty.call(y,"hcEvents")||(y.hcEvents={});y=y.hcEvents;a.Point&&b instanceof a.Point&&b.series&&b.series.chart&&(b.series.chart.runTrackerClick=!0);var p=b.addEventListener||a.addEventListenerPolyfill;p&&p.call(b,d,h,a.supportsPassiveEvents?{passive:void 0===c.passive?-1!==d.indexOf("touch"):c.passive,capture:!1}:!1);y[d]||(y[d]=[]);y[d].push({fn:h,order:"number"===
typeof c.order?c.order:Infinity});y[d].sort(function(b,d){return b.order-d.order});return function(){D(b,d,h)}},arrayMax:function(b){for(var d=b.length,h=b[0];d--;)b[d]>h&&(h=b[d]);return h},arrayMin:function(b){for(var d=b.length,h=b[0];d--;)b[d]<h&&(h=b[d]);return h},attr:c,clamp:function(b,d,h){return b>d?b<h?b:h:d},cleanRecursively:C,clearTimeout:function(b){g(b)&&clearTimeout(b)},correctFloat:q,createElement:v,css:f,defined:g,destroyObjectProperties:function(b,d){I(b,function(h,c){h&&h!==d&&
h.destroy&&h.destroy();delete b[c]})},discardElement:function(b){d||(d=v("div"));b&&d.appendChild(b);d.innerHTML=""},erase:function(b,d){for(var h=b.length;h--;)if(b[h]===d){b.splice(h,1);break}},error:r,extend:e,extendClass:function(b,d){var h=function(){};h.prototype=new b;e(h.prototype,d);return h},find:b,fireEvent:B,getMagnitude:function(b){return Math.pow(10,Math.floor(Math.log(b)/Math.LN10))},getNestedProperty:function(b,d){for(b=b.split(".");b.length&&g(d);){var c=b.shift();if("undefined"===
typeof c||"__proto__"===c)return;d=d[c];if(!g(d)||"function"===typeof d||"number"===typeof d.nodeType||d===h)return}return d},getStyle:k,inArray:function(b,d,h){r(32,!1,void 0,{"Highcharts.inArray":"use Array.indexOf"});return d.indexOf(b,h)},isArray:x,isClass:n,isDOMElement:u,isFunction:function(b){return"function"===typeof b},isNumber:m,isObject:J,isString:z,keys:function(b){r(32,!1,void 0,{"Highcharts.keys":"use Object.keys"});return Object.keys(b)},merge:function(){var b,d=arguments,h={},c=function(b,
d){"object"!==typeof b&&(b={});I(d,function(h,H){"__proto__"!==H&&"constructor"!==H&&(!J(h,!0)||n(h)||u(h)?b[H]=d[H]:b[H]=c(b[H]||{},h))});return b};!0===d[0]&&(h=d[1],d=Array.prototype.slice.call(d,2));var p=d.length;for(b=0;b<p;b++)h=c(h,d[b]);return h},normalizeTickInterval:function(b,d,h,c,p){var e=b;h=l(h,1);var k=b/h;d||(d=p?[1,1.2,1.5,2,2.5,3,4,5,6,8,10]:[1,2,2.5,5,10],!1===c&&(1===h?d=d.filter(function(b){return 0===b%1}):.1>=h&&(d=[1/h])));for(c=0;c<d.length&&!(e=d[c],p&&e*h>=b||!p&&k<=(d[c]+
(d[c+1]||d[c]))/2);c++);return e=q(e*h,-Math.round(Math.log(.001)/Math.LN10))},objectEach:I,offset:function(b){var d=t.documentElement;b=b.parentElement||b.parentNode?b.getBoundingClientRect():{top:0,left:0,width:0,height:0};return{top:b.top+(h.pageYOffset||d.scrollTop)-(d.clientTop||0),left:b.left+(h.pageXOffset||d.scrollLeft)-(d.clientLeft||0),width:b.width,height:b.height}},pad:function(b,d,h){return Array((d||2)+1-String(b).replace("-","").length).join(h||"0")+b},pick:l,pInt:E,relativeLength:function(b,
d,h){return/%$/.test(b)?d*parseFloat(b)/100+(h||0):parseFloat(b)},removeEvent:D,splat:function(b){return x(b)?b:[b]},stableSort:function(b,d){var h=b.length,c,p;for(p=0;p<h;p++)b[p].safeI=p;b.sort(function(b,h){c=d(b,h);return 0===c?b.safeI-h.safeI:c});for(p=0;p<h;p++)delete b[p].safeI},syncTimeout:function(b,d,h){if(0<d)return setTimeout(b,d,h);b.call(0,h);return-1},timeUnits:{millisecond:1,second:1E3,minute:6E4,hour:36E5,day:864E5,week:6048E5,month:24192E5,year:314496E5},uniqueKey:G,useSerialIds:function(b){return p=
l(b,p)},wrap:function(b,d,h){var c=b[d];b[d]=function(){var b=Array.prototype.slice.call(arguments),d=arguments,p=this;p.proceed=function(){c.apply(p,arguments.length?arguments:d)};b.unshift(c);b=h.apply(this,b);p.proceed=null;return b}}};"";return b});M(a,"Core/Color/Palette.js",[],function(){return{colors:"#7cb5ec #434348 #90ed7d #f7a35c #8085e9 #f15c80 #e4d354 #2b908f #f45b5b #91e8e1".split(" "),backgroundColor:"#ffffff",neutralColor100:"#000000",neutralColor80:"#333333",neutralColor60:"#666666",
neutralColor40:"#999999",neutralColor20:"#cccccc",neutralColor10:"#e6e6e6",neutralColor5:"#f2f2f2",neutralColor3:"#f7f7f7",highlightColor100:"#003399",highlightColor80:"#335cad",highlightColor60:"#6685c2",highlightColor20:"#ccd6eb",highlightColor10:"#e6ebf5",positiveColor:"#06b535",negativeColor:"#f21313"}});M(a,"Core/Chart/ChartDefaults.js",[a["Core/Color/Palette.js"]],function(a){return{panning:{enabled:!1,type:"x"},styledMode:!1,borderRadius:0,colorCount:10,defaultSeriesType:"line",ignoreHiddenSeries:!0,
spacing:[10,10,15,10],resetZoomButton:{theme:{zIndex:6},position:{align:"right",x:-10,y:10}},zoomBySingleTouch:!1,width:null,height:null,borderColor:a.highlightColor80,backgroundColor:a.backgroundColor,plotBorderColor:a.neutralColor20}});M(a,"Core/Color/Color.js",[a["Core/Globals.js"],a["Core/Utilities.js"]],function(a,w){var r=w.isNumber,E=w.merge,z=w.pInt;w=function(){function x(r){this.rgba=[NaN,NaN,NaN,NaN];this.input=r;var u=a.Color;if(u&&u!==x)return new u(r);if(!(this instanceof x))return new x(r);
this.init(r)}x.parse=function(a){return a?new x(a):x.None};x.prototype.init=function(a){var u;if("object"===typeof a&&"undefined"!==typeof a.stops)this.stops=a.stops.map(function(c){return new x(c[1])});else if("string"===typeof a){this.input=a=x.names[a.toLowerCase()]||a;if("#"===a.charAt(0)){var n=a.length;var m=parseInt(a.substr(1),16);7===n?u=[(m&16711680)>>16,(m&65280)>>8,m&255,1]:4===n&&(u=[(m&3840)>>4|(m&3840)>>8,(m&240)>>4|m&240,(m&15)<<4|m&15,1])}if(!u)for(m=x.parsers.length;m--&&!u;){var g=
x.parsers[m];(n=g.regex.exec(a))&&(u=g.parse(n))}}u&&(this.rgba=u)};x.prototype.get=function(a){var u=this.input,n=this.rgba;if("object"===typeof u&&"undefined"!==typeof this.stops){var m=E(u);m.stops=[].slice.call(m.stops);this.stops.forEach(function(g,c){m.stops[c]=[m.stops[c][0],g.get(a)]});return m}return n&&r(n[0])?"rgb"===a||!a&&1===n[3]?"rgb("+n[0]+","+n[1]+","+n[2]+")":"a"===a?""+n[3]:"rgba("+n.join(",")+")":u};x.prototype.brighten=function(a){var u=this.rgba;if(this.stops)this.stops.forEach(function(m){m.brighten(a)});
else if(r(a)&&0!==a)for(var n=0;3>n;n++)u[n]+=z(255*a),0>u[n]&&(u[n]=0),255<u[n]&&(u[n]=255);return this};x.prototype.setOpacity=function(a){this.rgba[3]=a;return this};x.prototype.tweenTo=function(a,u){var n=this.rgba,m=a.rgba;if(!r(n[0])||!r(m[0]))return a.input||"none";a=1!==m[3]||1!==n[3];return(a?"rgba(":"rgb(")+Math.round(m[0]+(n[0]-m[0])*(1-u))+","+Math.round(m[1]+(n[1]-m[1])*(1-u))+","+Math.round(m[2]+(n[2]-m[2])*(1-u))+(a?","+(m[3]+(n[3]-m[3])*(1-u)):"")+")"};x.names={white:"#ffffff",black:"#000000"};
x.parsers=[{regex:/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]?(?:\.[0-9]+)?)\s*\)/,parse:function(a){return[z(a[1]),z(a[2]),z(a[3]),parseFloat(a[4],10)]}},{regex:/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/,parse:function(a){return[z(a[1]),z(a[2]),z(a[3]),1]}}];x.None=new x("");return x}();"";return w});M(a,"Core/Time.js",[a["Core/Globals.js"],a["Core/Utilities.js"]],function(a,w){var r=a.win,E=w.defined,z=w.error,x=w.extend,J=w.isObject,u=w.merge,
n=w.objectEach,m=w.pad,g=w.pick,c=w.splat,e=w.timeUnits,l=a.isSafari&&r.Intl&&r.Intl.DateTimeFormat.prototype.formatRange,f=a.isSafari&&r.Intl&&!r.Intl.DateTimeFormat.prototype.formatRange;w=function(){function v(c){this.options={};this.variableTimezone=this.useUTC=!1;this.Date=r.Date;this.getTimezoneOffset=this.timezoneOffsetFunction();this.update(c)}v.prototype.get=function(c,e){if(this.variableTimezone||this.timezoneOffset){var k=e.getTime(),f=k-this.getTimezoneOffset(e);e.setTime(f);c=e["getUTC"+
c]();e.setTime(k);return c}return this.useUTC?e["getUTC"+c]():e["get"+c]()};v.prototype.set=function(c,e,f){if(this.variableTimezone||this.timezoneOffset){if("Milliseconds"===c||"Seconds"===c||"Minutes"===c&&0===this.getTimezoneOffset(e)%36E5)return e["setUTC"+c](f);var k=this.getTimezoneOffset(e);k=e.getTime()-k;e.setTime(k);e["setUTC"+c](f);c=this.getTimezoneOffset(e);k=e.getTime()+c;return e.setTime(k)}return this.useUTC||l&&"FullYear"===c?e["setUTC"+c](f):e["set"+c](f)};v.prototype.update=function(c){var e=
g(c&&c.useUTC,!0);this.options=c=u(!0,this.options||{},c);this.Date=c.Date||r.Date||Date;this.timezoneOffset=(this.useUTC=e)&&c.timezoneOffset;this.getTimezoneOffset=this.timezoneOffsetFunction();this.variableTimezone=e&&!(!c.getTimezoneOffset&&!c.timezone)};v.prototype.makeTime=function(c,e,l,v,B,a){if(this.useUTC){var k=this.Date.UTC.apply(0,arguments);var h=this.getTimezoneOffset(k);k+=h;var d=this.getTimezoneOffset(k);h!==d?k+=d-h:h-36E5!==this.getTimezoneOffset(k-36E5)||f||(k-=36E5)}else k=(new this.Date(c,
e,g(l,1),g(v,0),g(B,0),g(a,0))).getTime();return k};v.prototype.timezoneOffsetFunction=function(){var c=this,e=this.options,f=e.moment||r.moment;if(!this.useUTC)return function(c){return 6E4*(new Date(c.toString())).getTimezoneOffset()};if(e.timezone){if(f)return function(c){return 6E4*-f.tz(c,e.timezone).utcOffset()};z(25)}return this.useUTC&&e.getTimezoneOffset?function(c){return 6E4*e.getTimezoneOffset(c.valueOf())}:function(){return 6E4*(c.timezoneOffset||0)}};v.prototype.dateFormat=function(c,
e,f){if(!E(e)||isNaN(e))return a.defaultOptions.lang&&a.defaultOptions.lang.invalidDate||"";c=g(c,"%Y-%m-%d %H:%M:%S");var k=this,l=new this.Date(e),q=this.get("Hours",l),t=this.get("Day",l),h=this.get("Date",l),d=this.get("Month",l),b=this.get("FullYear",l),p=a.defaultOptions.lang,G=p&&p.weekdays,y=p&&p.shortWeekdays;l=x({a:y?y[t]:G[t].substr(0,3),A:G[t],d:m(h),e:m(h,2," "),w:t,b:p.shortMonths[d],B:p.months[d],m:m(d+1),o:d+1,y:b.toString().substr(2,2),Y:b,H:m(q),k:q,I:m(q%12||12),l:q%12||12,M:m(this.get("Minutes",
l)),p:12>q?"AM":"PM",P:12>q?"am":"pm",S:m(l.getSeconds()),L:m(Math.floor(e%1E3),3)},a.dateFormats);n(l,function(b,d){for(;-1!==c.indexOf("%"+d);)c=c.replace("%"+d,"function"===typeof b?b.call(k,e):b)});return f?c.substr(0,1).toUpperCase()+c.substr(1):c};v.prototype.resolveDTLFormat=function(e){return J(e,!0)?e:(e=c(e),{main:e[0],from:e[1],to:e[2]})};v.prototype.getTimeTicks=function(c,k,f,l){var q=this,v=[],t={},h=new q.Date(k),d=c.unitRange,b=c.count||1,p;l=g(l,1);if(E(k)){q.set("Milliseconds",h,
d>=e.second?0:b*Math.floor(q.get("Milliseconds",h)/b));d>=e.second&&q.set("Seconds",h,d>=e.minute?0:b*Math.floor(q.get("Seconds",h)/b));d>=e.minute&&q.set("Minutes",h,d>=e.hour?0:b*Math.floor(q.get("Minutes",h)/b));d>=e.hour&&q.set("Hours",h,d>=e.day?0:b*Math.floor(q.get("Hours",h)/b));d>=e.day&&q.set("Date",h,d>=e.month?1:Math.max(1,b*Math.floor(q.get("Date",h)/b)));if(d>=e.month){q.set("Month",h,d>=e.year?0:b*Math.floor(q.get("Month",h)/b));var G=q.get("FullYear",h)}d>=e.year&&q.set("FullYear",
h,G-G%b);d===e.week&&(G=q.get("Day",h),q.set("Date",h,q.get("Date",h)-G+l+(G<l?-7:0)));G=q.get("FullYear",h);l=q.get("Month",h);var y=q.get("Date",h),a=q.get("Hours",h);k=h.getTime();!q.variableTimezone&&q.useUTC||!E(f)||(p=f-k>4*e.month||q.getTimezoneOffset(k)!==q.getTimezoneOffset(f));k=h.getTime();for(h=1;k<f;)v.push(k),k=d===e.year?q.makeTime(G+h*b,0):d===e.month?q.makeTime(G,l+h*b):!p||d!==e.day&&d!==e.week?p&&d===e.hour&&1<b?q.makeTime(G,l,y,a+h*b):k+d*b:q.makeTime(G,l,y+h*b*(d===e.day?1:7)),
h++;v.push(k);d<=e.hour&&1E4>v.length&&v.forEach(function(b){0===b%18E5&&"000000000"===q.dateFormat("%H%M%S%L",b)&&(t[b]="day")})}v.info=x(c,{higherRanks:t,totalRange:d*b});return v};v.prototype.getDateFormat=function(c,k,f,g){var l=this.dateFormat("%m-%d %H:%M:%S.%L",k),q={millisecond:15,second:12,minute:9,hour:6,day:3},t="millisecond";for(h in e){if(c===e.week&&+this.dateFormat("%w",k)===f&&"00:00:00.000"===l.substr(6)){var h="week";break}if(e[h]>c){h=t;break}if(q[h]&&l.substr(q[h])!=="01-01 00:00:00.000".substr(q[h]))break;
"week"!==h&&(t=h)}if(h)var d=this.resolveDTLFormat(g[h]).main;return d};return v}();"";return w});M(a,"Core/DefaultOptions.js",[a["Core/Chart/ChartDefaults.js"],a["Core/Color/Color.js"],a["Core/Globals.js"],a["Core/Color/Palette.js"],a["Core/Time.js"],a["Core/Utilities.js"]],function(a,w,C,E,z,x){w=w.parse;var r=x.merge,u={colors:E.colors,symbols:["circle","diamond","square","triangle","triangle-down"],lang:{loading:"Loading...",months:"January February March April May June July August September October November December".split(" "),
shortMonths:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),weekdays:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),decimalPoint:".",numericSymbols:"kMGTPE".split(""),resetZoom:"Reset zoom",resetZoomTitle:"Reset zoom level 1:1",thousandsSep:" "},global:{},time:{Date:void 0,getTimezoneOffset:void 0,timezone:void 0,timezoneOffset:0,useUTC:!0},chart:a,title:{text:"Chart title",align:"center",margin:15,widthAdjust:-44},subtitle:{text:"",align:"center",widthAdjust:-44},
caption:{margin:15,text:"",align:"left",verticalAlign:"bottom"},plotOptions:{},labels:{style:{position:"absolute",color:E.neutralColor80}},legend:{enabled:!0,align:"center",alignColumns:!0,className:"highcharts-no-tooltip",layout:"horizontal",labelFormatter:function(){return this.name},borderColor:E.neutralColor40,borderRadius:0,navigation:{activeColor:E.highlightColor100,inactiveColor:E.neutralColor20},itemStyle:{color:E.neutralColor80,cursor:"pointer",fontSize:"12px",fontWeight:"bold",textOverflow:"ellipsis"},
itemHoverStyle:{color:E.neutralColor100},itemHiddenStyle:{color:E.neutralColor20},shadow:!1,itemCheckboxStyle:{position:"absolute",width:"13px",height:"13px"},squareSymbol:!0,symbolPadding:5,verticalAlign:"bottom",x:0,y:0,title:{style:{fontWeight:"bold"}}},loading:{labelStyle:{fontWeight:"bold",position:"relative",top:"45%"},style:{position:"absolute",backgroundColor:E.backgroundColor,opacity:.5,textAlign:"center"}},tooltip:{enabled:!0,animation:C.svg,borderRadius:3,dateTimeLabelFormats:{millisecond:"%A, %b %e, %H:%M:%S.%L",
second:"%A, %b %e, %H:%M:%S",minute:"%A, %b %e, %H:%M",hour:"%A, %b %e, %H:%M",day:"%A, %b %e, %Y",week:"Week from %A, %b %e, %Y",month:"%B %Y",year:"%Y"},footerFormat:"",headerShape:"callout",hideDelay:500,padding:8,shape:"callout",shared:!1,snap:C.isTouchDevice?25:10,headerFormat:'<span style="font-size: 10px">{point.key}</span><br/>',pointFormat:'<span style="color:{point.color}">\u25cf</span> {series.name}: <b>{point.y}</b><br/>',backgroundColor:w(E.neutralColor3).setOpacity(.85).get(),borderWidth:1,
shadow:!0,stickOnContact:!1,style:{color:E.neutralColor80,cursor:"default",fontSize:"12px",whiteSpace:"nowrap"},useHTML:!1},credits:{enabled:!0,href:"https://www.highcharts.com?credits",position:{align:"right",x:-10,verticalAlign:"bottom",y:-5},style:{cursor:"pointer",color:E.neutralColor40,fontSize:"9px"},text:"Highcharts.com"}};u.chart.styledMode=!1;"";var n=new z(r(u.global,u.time));a={defaultOptions:u,defaultTime:n,getOptions:function(){return u},setOptions:function(a){r(!0,u,a);if(a.time||a.global)C.time?
C.time.update(r(u.global,u.time,a.global,a.time)):C.time=n;return u}};"";return a});M(a,"Core/Animation/Fx.js",[a["Core/Color/Color.js"],a["Core/Globals.js"],a["Core/Utilities.js"]],function(a,w,C){var r=a.parse,z=w.win,x=C.isNumber,J=C.objectEach;return function(){function a(a,m,g){this.pos=NaN;this.options=m;this.elem=a;this.prop=g}a.prototype.dSetter=function(){var a=this.paths,m=a&&a[0];a=a&&a[1];var g=this.now||0,c=[];if(1!==g&&m&&a)if(m.length===a.length&&1>g)for(var e=0;e<a.length;e++){for(var l=
m[e],f=a[e],v=[],q=0;q<f.length;q++){var k=l[q],I=f[q];x(k)&&x(I)&&("A"!==f[0]||4!==q&&5!==q)?v[q]=k+g*(I-k):v[q]=I}c.push(v)}else c=a;else c=this.toD||[];this.elem.attr("d",c,void 0,!0)};a.prototype.update=function(){var a=this.elem,m=this.prop,g=this.now,c=this.options.step;if(this[m+"Setter"])this[m+"Setter"]();else a.attr?a.element&&a.attr(m,g,null,!0):a.style[m]=g+this.unit;c&&c.call(a,g,this)};a.prototype.run=function(n,m,g){var c=this,e=c.options,l=function(e){return l.stopped?!1:c.step(e)},
f=z.requestAnimationFrame||function(c){setTimeout(c,13)},v=function(){for(var c=0;c<a.timers.length;c++)a.timers[c]()||a.timers.splice(c--,1);a.timers.length&&f(v)};n!==m||this.elem["forceAnimate:"+this.prop]?(this.startTime=+new Date,this.start=n,this.end=m,this.unit=g,this.now=this.start,this.pos=0,l.elem=this.elem,l.prop=this.prop,l()&&1===a.timers.push(l)&&f(v)):(delete e.curAnim[this.prop],e.complete&&0===Object.keys(e.curAnim).length&&e.complete.call(this.elem))};a.prototype.step=function(a){var m=
+new Date,g=this.options,c=this.elem,e=g.complete,l=g.duration,f=g.curAnim;if(c.attr&&!c.element)a=!1;else if(a||m>=l+this.startTime){this.now=this.end;this.pos=1;this.update();var v=f[this.prop]=!0;J(f,function(c){!0!==c&&(v=!1)});v&&e&&e.call(c);a=!1}else this.pos=g.easing((m-this.startTime)/l),this.now=this.start+(this.end-this.start)*this.pos,this.update(),a=!0;return a};a.prototype.initPath=function(a,m,g){function c(c,e){for(;c.length<D;){var f=c[0],h=e[D-c.length];h&&"M"===f[0]&&(c[0]="C"===
h[0]?["C",f[1],f[2],f[1],f[2],f[1],f[2]]:["L",f[1],f[2]]);c.unshift(f);v&&(f=c.pop(),c.push(c[c.length-1],f))}}function e(c,e){for(;c.length<D;)if(e=c[Math.floor(c.length/q)-1].slice(),"C"===e[0]&&(e[1]=e[5],e[2]=e[6]),v){var f=c[Math.floor(c.length/q)].slice();c.splice(c.length/2,0,e,f)}else c.push(e)}var l=a.startX,f=a.endX;g=g.slice();var v=a.isArea,q=v?2:1;m=m&&m.slice();if(!m)return[g,g];if(l&&f&&f.length){for(a=0;a<l.length;a++)if(l[a]===f[0]){var k=a;break}else if(l[0]===f[f.length-l.length+
a]){k=a;var I=!0;break}else if(l[l.length-1]===f[f.length-l.length+a]){k=l.length-a;break}"undefined"===typeof k&&(m=[])}if(m.length&&x(k)){var D=g.length+k*q;I?(c(m,g),e(g,m)):(c(g,m),e(m,g))}return[m,g]};a.prototype.fillSetter=function(){a.prototype.strokeSetter.apply(this,arguments)};a.prototype.strokeSetter=function(){this.elem.attr(this.prop,r(this.start).tweenTo(r(this.end),this.pos),null,!0)};a.timers=[];return a}()});M(a,"Core/Animation/AnimationUtilities.js",[a["Core/Animation/Fx.js"],a["Core/Utilities.js"]],
function(a,w){function r(c){return n(c)?m({duration:500,defer:0},c):{duration:c?500:0,defer:0}}function E(c,g){for(var e=a.timers.length;e--;)a.timers[e].elem!==c||g&&g!==a.timers[e].prop||(a.timers[e].stopped=!0)}var z=w.defined,x=w.getStyle,J=w.isArray,u=w.isNumber,n=w.isObject,m=w.merge,g=w.objectEach,c=w.pick;return{animate:function(c,l,f){var e,q="",k,I;if(!n(f)){var D=arguments;f={duration:D[2],easing:D[3],complete:D[4]}}u(f.duration)||(f.duration=400);f.easing="function"===typeof f.easing?
f.easing:Math[f.easing]||Math.easeInOutSine;f.curAnim=m(l);g(l,function(g,v){E(c,v);I=new a(c,f,v);k=void 0;"d"===v&&J(l.d)?(I.paths=I.initPath(c,c.pathArray,l.d),I.toD=l.d,e=0,k=1):c.attr?e=c.attr(v):(e=parseFloat(x(c,v))||0,"opacity"!==v&&(q="px"));k||(k=g);"string"===typeof k&&k.match("px")&&(k=k.replace(/px/g,""));I.run(e,k,q)})},animObject:r,getDeferredAnimation:function(c,g,f){var e=r(g),a=0,k=0;(f?[f]:c.series).forEach(function(c){c=r(c.options.animation);a=g&&z(g.defer)?e.defer:Math.max(a,
c.duration+c.defer);k=Math.min(e.duration,c.duration)});c.renderer.forExport&&(a=0);return{defer:Math.max(0,a-k),duration:Math.min(a,k)}},setAnimation:function(e,g){g.renderer.globalAnimation=c(e,g.options.chart.animation,!0)},stop:E}});M(a,"Core/Renderer/HTML/AST.js",[a["Core/Globals.js"],a["Core/Utilities.js"]],function(a,w){var r=a.SVG_NS,E=w.attr,z=w.createElement,x=w.discardElement,J=w.error,u=w.isString,n=w.objectEach,m=w.splat;try{var g=!!(new DOMParser).parseFromString("","text/html")}catch(c){g=
!1}w=function(){function c(c){this.nodes="string"===typeof c?this.parseMarkup(c):c}c.filterUserAttributes=function(e){n(e,function(g,f){var a=!0;-1===c.allowedAttributes.indexOf(f)&&(a=!1);-1!==["background","dynsrc","href","lowsrc","src"].indexOf(f)&&(a=u(g)&&c.allowedReferences.some(function(c){return 0===g.indexOf(c)}));a||(J("Highcharts warning: Invalid attribute '"+f+"' in config"),delete e[f])});return e};c.setElementHTML=function(e,g){e.innerHTML="";g&&(new c(g)).addToDOM(e)};c.prototype.addToDOM=
function(e){function g(e,l){var f;m(e).forEach(function(e){var k=e.tagName,q=e.textContent?a.doc.createTextNode(e.textContent):void 0;if(k)if("#text"===k)var v=q;else if(-1!==c.allowedTags.indexOf(k)){k=a.doc.createElementNS("svg"===k?r:l.namespaceURI||r,k);var m=e.attributes||{};n(e,function(c,h){"tagName"!==h&&"attributes"!==h&&"children"!==h&&"textContent"!==h&&(m[h]=c)});E(k,c.filterUserAttributes(m));q&&k.appendChild(q);g(e.children||[],k);v=k}else J("Highcharts warning: Invalid tagName '"+k+
"' in config");v&&l.appendChild(v);f=v});return f}return g(this.nodes,e)};c.prototype.parseMarkup=function(c){var e=[];c=c.trim();if(g)c=(new DOMParser).parseFromString(c,"text/html");else{var f=z("div");f.innerHTML=c;c={body:f}}var a=function(c,e){var f=c.nodeName.toLowerCase(),k={tagName:f};"#text"===f&&(k.textContent=c.textContent||"");if(f=c.attributes){var g={};[].forEach.call(f,function(c){g[c.name]=c.value});k.attributes=g}if(c.childNodes.length){var l=[];[].forEach.call(c.childNodes,function(c){a(c,
l)});l.length&&(k.children=l)}e.push(k)};[].forEach.call(c.body.childNodes,function(c){return a(c,e)});f&&x(f);return e};c.allowedAttributes="aria-controls aria-describedby aria-expanded aria-haspopup aria-hidden aria-label aria-labelledby aria-live aria-pressed aria-readonly aria-roledescription aria-selected class clip-path color colspan cx cy d dx dy disabled fill height href id in markerHeight markerWidth offset opacity orient padding paddingLeft paddingRight patternUnits r refX refY role scope slope src startOffset stdDeviation stroke stroke-linecap stroke-width style tableValues result rowspan summary target tabindex text-align textAnchor textLength type valign width x x1 x2 y y1 y2 zIndex".split(" ");
c.allowedReferences="https:// http:// mailto: / ../ ./ #".split(" ");c.allowedTags="a b br button caption circle clipPath code dd defs div dl dt em feComponentTransfer feFuncA feFuncB feFuncG feFuncR feGaussianBlur feOffset feMerge feMergeNode filter h1 h2 h3 h4 h5 h6 hr i img li linearGradient marker ol p path pattern pre rect small span stop strong style sub sup svg table text thead tbody tspan td th tr u ul #text".split(" ");return c}();"";return w});M(a,"Core/FormatUtilities.js",[a["Core/DefaultOptions.js"],
a["Core/Utilities.js"]],function(a,w){function r(a,g,c,e){a=+a||0;g=+g;var l=E.lang,f=(a.toString().split(".")[1]||"").split("e")[0].length,v=a.toString().split("e"),q=g;if(-1===g)g=Math.min(f,20);else if(!J(g))g=2;else if(g&&v[1]&&0>v[1]){var k=g+ +v[1];0<=k?(v[0]=(+v[0]).toExponential(k).split("e")[0],g=k):(v[0]=v[0].split(".")[0]||0,a=20>g?(v[0]*Math.pow(10,v[1])).toFixed(g):0,v[1]=0)}k=(Math.abs(v[1]?v[0]:a)+Math.pow(10,-Math.max(g,f)-1)).toFixed(g);f=String(n(k));var m=3<f.length?f.length%3:
0;c=u(c,l.decimalPoint);e=u(e,l.thousandsSep);a=(0>a?"-":"")+(m?f.substr(0,m)+e:"");a=0>+v[1]&&!q?"0":a+f.substr(m).replace(/(\d{3})(?=\d)/g,"$1"+e);g&&(a+=c+k.slice(-g));v[1]&&0!==+a&&(a+="e"+v[1]);return a}var E=a.defaultOptions,z=a.defaultTime,x=w.getNestedProperty,J=w.isNumber,u=w.pick,n=w.pInt;return{dateFormat:function(a,g,c){return z.dateFormat(a,g,c)},format:function(a,g,c){var e="{",l=!1,f=/f$/,v=/\.([0-9])/,q=E.lang,k=c&&c.time||z;c=c&&c.numberFormatter||r;for(var m=[];a;){var D=a.indexOf(e);
if(-1===D)break;var B=a.slice(0,D);if(l){B=B.split(":");e=x(B.shift()||"",g);if(B.length&&"number"===typeof e)if(B=B.join(":"),f.test(B)){var u=parseInt((B.match(v)||["","-1"])[1],10);null!==e&&(e=c(e,u,q.decimalPoint,-1<B.indexOf(",")?q.thousandsSep:""))}else e=k.dateFormat(B,e);m.push(e)}else m.push(B);a=a.slice(D+1);e=(l=!l)?"}":"{"}m.push(a);return m.join("")},numberFormat:r}});M(a,"Core/Renderer/RendererUtilities.js",[a["Core/Utilities.js"]],function(a){var r=a.clamp,C=a.pick,E=a.stableSort,
z;(function(a){function x(a,n,m){var g=a,c=g.reducedLen||n,e=function(c,e){return(e.rank||0)-(c.rank||0)},l=function(c,e){return c.target-e.target},f,v=!0,q=[],k=0;for(f=a.length;f--;)k+=a[f].size;if(k>c){E(a,e);for(k=f=0;k<=c;)k+=a[f].size,f++;q=a.splice(f-1,a.length)}E(a,l);for(a=a.map(function(c){return{size:c.size,targets:[c.target],align:C(c.align,.5)}});v;){for(f=a.length;f--;)c=a[f],e=(Math.min.apply(0,c.targets)+Math.max.apply(0,c.targets))/2,c.pos=r(e-c.size*c.align,0,n-c.size);f=a.length;
for(v=!1;f--;)0<f&&a[f-1].pos+a[f-1].size>a[f].pos&&(a[f-1].size+=a[f].size,a[f-1].targets=a[f-1].targets.concat(a[f].targets),a[f-1].align=.5,a[f-1].pos+a[f-1].size>n&&(a[f-1].pos=n-a[f-1].size),a.splice(f,1),v=!0)}g.push.apply(g,q);f=0;a.some(function(c){var e=0;return(c.targets||[]).some(function(){g[f].pos=c.pos+e;if("undefined"!==typeof m&&Math.abs(g[f].pos-g[f].target)>m)return g.slice(0,f+1).forEach(function(c){return delete c.pos}),g.reducedLen=(g.reducedLen||n)-.1*n,g.reducedLen>.1*n&&x(g,
n,m),!0;e+=g[f].size;f++;return!1})});E(g,l);return g}a.distribute=x})(z||(z={}));return z});M(a,"Core/Renderer/SVG/SVGElement.js",[a["Core/Animation/AnimationUtilities.js"],a["Core/Renderer/HTML/AST.js"],a["Core/Color/Color.js"],a["Core/Globals.js"],a["Core/Color/Palette.js"],a["Core/Utilities.js"]],function(a,w,C,E,z,x){var r=a.animate,u=a.animObject,n=a.stop,m=E.deg2rad,g=E.doc,c=E.noop,e=E.svg,l=E.SVG_NS,f=E.win,v=x.addEvent,q=x.attr,k=x.createElement,I=x.css,D=x.defined,B=x.erase,O=x.extend,
t=x.fireEvent,h=x.isArray,d=x.isFunction,b=x.isNumber,p=x.isString,G=x.merge,y=x.objectEach,L=x.pick,F=x.pInt,P=x.syncTimeout,S=x.uniqueKey;a=function(){function a(){this.element=void 0;this.onEvents={};this.opacity=1;this.renderer=void 0;this.SVG_NS=l;this.symbolCustomAttribs="x y width height r start end innerR anchorX anchorY rounded".split(" ")}a.prototype._defaultGetter=function(b){b=L(this[b+"Value"],this[b],this.element?this.element.getAttribute(b):null,0);/^[\-0-9\.]+$/.test(b)&&(b=parseFloat(b));
return b};a.prototype._defaultSetter=function(b,d,c){c.setAttribute(d,b)};a.prototype.add=function(b){var d=this.renderer,c=this.element;b&&(this.parentGroup=b);this.parentInverted=b&&b.inverted;"undefined"!==typeof this.textStr&&"text"===this.element.nodeName&&d.buildText(this);this.added=!0;if(!b||b.handleZ||this.zIndex)var K=this.zIndexSetter();K||(b?b.element:d.box).appendChild(c);if(this.onAdd)this.onAdd();return this};a.prototype.addClass=function(b,d){var c=d?"":this.attr("class")||"";b=(b||
"").split(/ /g).reduce(function(b,d){-1===c.indexOf(d)&&b.push(d);return b},c?[c]:[]).join(" ");b!==c&&this.attr("class",b);return this};a.prototype.afterSetters=function(){this.doTransform&&(this.updateTransform(),this.doTransform=!1)};a.prototype.align=function(b,d,c){var K={},h=this.renderer,H=h.alignedObjects,a,e,A;if(b){if(this.alignOptions=b,this.alignByTranslate=d,!c||p(c))this.alignTo=a=c||"renderer",B(H,this),H.push(this),c=void 0}else b=this.alignOptions,d=this.alignByTranslate,a=this.alignTo;
c=L(c,h[a],"scrollablePlotBox"===a?h.plotBox:void 0,h);a=b.align;var f=b.verticalAlign;h=(c.x||0)+(b.x||0);H=(c.y||0)+(b.y||0);"right"===a?e=1:"center"===a&&(e=2);e&&(h+=(c.width-(b.width||0))/e);K[d?"translateX":"x"]=Math.round(h);"bottom"===f?A=1:"middle"===f&&(A=2);A&&(H+=(c.height-(b.height||0))/A);K[d?"translateY":"y"]=Math.round(H);this[this.placed?"animate":"attr"](K);this.placed=!0;this.alignAttr=K;return this};a.prototype.alignSetter=function(b){var d={left:"start",center:"middle",right:"end"};
d[b]&&(this.alignValue=b,this.element.setAttribute("text-anchor",d[b]))};a.prototype.animate=function(b,d,c){var h=this,H=u(L(d,this.renderer.globalAnimation,!0));d=H.defer;L(g.hidden,g.msHidden,g.webkitHidden,!1)&&(H.duration=0);0!==H.duration?(c&&(H.complete=c),P(function(){h.element&&r(h,b,H)},d)):(this.attr(b,void 0,c),y(b,function(b,d){H.step&&H.step.call(this,b,{prop:d,pos:1,elem:this})},this));return this};a.prototype.applyTextOutline=function(b){var d=this.element;-1!==b.indexOf("contrast")&&
(b=b.replace(/contrast/g,this.renderer.getContrast(d.style.fill)));var c=b.split(" ");b=c[c.length-1];if((c=c[0])&&"none"!==c&&E.svg){this.fakeTS=!0;this.ySetter=this.xSetter;c=c.replace(/(^[\d\.]+)(.*?)$/g,function(b,d,c){return 2*Number(d)+c});this.removeTextOutline();var h=g.createElementNS(l,"tspan");q(h,{"class":"highcharts-text-outline",fill:b,stroke:b,"stroke-width":c,"stroke-linejoin":"round"});[].forEach.call(d.childNodes,function(b){var d=b.cloneNode(!0);d.removeAttribute&&["fill","stroke",
"stroke-width","stroke"].forEach(function(b){return d.removeAttribute(b)});h.appendChild(d)});var a=g.createElementNS(l,"tspan");a.textContent="\u200b";["x","y"].forEach(function(b){var c=d.getAttribute(b);c&&a.setAttribute(b,c)});h.appendChild(a);d.insertBefore(h,d.firstChild)}};a.prototype.attr=function(b,d,c,h){var K=this.element,H=this.symbolCustomAttribs,a,e=this,A,p;if("string"===typeof b&&"undefined"!==typeof d){var f=b;b={};b[f]=d}"string"===typeof b?e=(this[b+"Getter"]||this._defaultGetter).call(this,
b,K):(y(b,function(d,c){A=!1;h||n(this,c);this.symbolName&&-1!==H.indexOf(c)&&(a||(this.symbolAttr(b),a=!0),A=!0);!this.rotation||"x"!==c&&"y"!==c||(this.doTransform=!0);A||(p=this[c+"Setter"]||this._defaultSetter,p.call(this,d,c,K),!this.styledMode&&this.shadows&&/^(width|height|visibility|x|y|d|transform|cx|cy|r)$/.test(c)&&this.updateShadows(c,d,p))},this),this.afterSetters());c&&c.call(this);return e};a.prototype.clip=function(b){return this.attr("clip-path",b?"url("+this.renderer.url+"#"+b.id+
")":"none")};a.prototype.crisp=function(b,d){d=d||b.strokeWidth||0;var c=Math.round(d)%2/2;b.x=Math.floor(b.x||this.x||0)+c;b.y=Math.floor(b.y||this.y||0)+c;b.width=Math.floor((b.width||this.width||0)-2*c);b.height=Math.floor((b.height||this.height||0)-2*c);D(b.strokeWidth)&&(b.strokeWidth=d);return b};a.prototype.complexColor=function(b,d,c){var K=this.renderer,a,H,e,p,A,f,k,g,l,q,v=[],F;t(this.renderer,"complexColor",{args:arguments},function(){b.radialGradient?H="radialGradient":b.linearGradient&&
(H="linearGradient");if(H){e=b[H];A=K.gradients;f=b.stops;l=c.radialReference;h(e)&&(b[H]=e={x1:e[0],y1:e[1],x2:e[2],y2:e[3],gradientUnits:"userSpaceOnUse"});"radialGradient"===H&&l&&!D(e.gradientUnits)&&(p=e,e=G(e,K.getRadialAttr(l,p),{gradientUnits:"userSpaceOnUse"}));y(e,function(b,d){"id"!==d&&v.push(d,b)});y(f,function(b){v.push(b)});v=v.join(",");if(A[v])q=A[v].attr("id");else{e.id=q=S();var N=A[v]=K.createElement(H).attr(e).add(K.defs);N.radAttr=p;N.stops=[];f.forEach(function(b){0===b[1].indexOf("rgba")?
(a=C.parse(b[1]),k=a.get("rgb"),g=a.get("a")):(k=b[1],g=1);b=K.createElement("stop").attr({offset:b[0],"stop-color":k,"stop-opacity":g}).add(N);N.stops.push(b)})}F="url("+K.url+"#"+q+")";c.setAttribute(d,F);c.gradient=v;b.toString=function(){return F}}})};a.prototype.css=function(b){var d=this.styles,c={},h=this.element,a=["textOutline","textOverflow","width"],p="",f=!d;b&&b.color&&(b.fill=b.color);d&&y(b,function(b,h){d&&d[h]!==b&&(c[h]=b,f=!0)});if(f){d&&(b=O(d,c));if(b)if(null===b.width||"auto"===
b.width)delete this.textWidth;else if("text"===h.nodeName.toLowerCase()&&b.width)var k=this.textWidth=F(b.width);this.styles=b;k&&!e&&this.renderer.forExport&&delete b.width;if(h.namespaceURI===this.SVG_NS){var A=function(b,d){return"-"+d.toLowerCase()};y(b,function(b,d){-1===a.indexOf(d)&&(p+=d.replace(/([A-Z])/g,A)+":"+b+";")});p&&q(h,"style",p)}else I(h,b);this.added&&("text"===this.element.nodeName&&this.renderer.buildText(this),b&&b.textOutline&&this.applyTextOutline(b.textOutline))}return this};
a.prototype.dashstyleSetter=function(b){var d=this["stroke-width"];"inherit"===d&&(d=1);if(b=b&&b.toLowerCase()){var c=b.replace("shortdashdotdot","3,1,1,1,1,1,").replace("shortdashdot","3,1,1,1").replace("shortdot","1,1,").replace("shortdash","3,1,").replace("longdash","8,3,").replace(/dot/g,"1,3,").replace("dash","4,3,").replace(/,$/,"").split(",");for(b=c.length;b--;)c[b]=""+F(c[b])*L(d,NaN);b=c.join(",").replace(/NaN/g,"none");this.element.setAttribute("stroke-dasharray",b)}};a.prototype.destroy=
function(){var b=this,d=b.element||{},c=b.renderer,h=d.ownerSVGElement,a=c.isSVG&&"SPAN"===d.nodeName&&b.parentGroup||void 0;d.onclick=d.onmouseout=d.onmouseover=d.onmousemove=d.point=null;n(b);if(b.clipPath&&h){var e=b.clipPath;[].forEach.call(h.querySelectorAll("[clip-path],[CLIP-PATH]"),function(b){-1<b.getAttribute("clip-path").indexOf(e.element.id)&&b.removeAttribute("clip-path")});b.clipPath=e.destroy()}if(b.stops){for(h=0;h<b.stops.length;h++)b.stops[h].destroy();b.stops.length=0;b.stops=void 0}b.safeRemoveChild(d);
for(c.styledMode||b.destroyShadows();a&&a.div&&0===a.div.childNodes.length;)d=a.parentGroup,b.safeRemoveChild(a.div),delete a.div,a=d;b.alignTo&&B(c.alignedObjects,b);y(b,function(d,c){b[c]&&b[c].parentGroup===b&&b[c].destroy&&b[c].destroy();delete b[c]})};a.prototype.destroyShadows=function(){(this.shadows||[]).forEach(function(b){this.safeRemoveChild(b)},this);this.shadows=void 0};a.prototype.destroyTextPath=function(b,d){var c=b.getElementsByTagName("text")[0];if(c){if(c.removeAttribute("dx"),
c.removeAttribute("dy"),d.element.setAttribute("id",""),this.textPathWrapper&&c.getElementsByTagName("textPath").length){for(b=this.textPathWrapper.element.childNodes;b.length;)c.appendChild(b[0]);c.removeChild(this.textPathWrapper.element)}}else if(b.getAttribute("dx")||b.getAttribute("dy"))b.removeAttribute("dx"),b.removeAttribute("dy");this.textPathWrapper&&(this.textPathWrapper=this.textPathWrapper.destroy())};a.prototype.dSetter=function(b,d,c){h(b)&&("string"===typeof b[0]&&(b=this.renderer.pathToSegments(b)),
this.pathArray=b,b=b.reduce(function(b,d,c){return d&&d.join?(c?b+" ":"")+d.join(" "):(d||"").toString()},""));/(NaN| {2}|^$)/.test(b)&&(b="M 0 0");this[d]!==b&&(c.setAttribute(d,b),this[d]=b)};a.prototype.fadeOut=function(b){var d=this;d.animate({opacity:0},{duration:L(b,150),complete:function(){d.attr({y:-9999}).hide()}})};a.prototype.fillSetter=function(b,d,c){"string"===typeof b?c.setAttribute(d,b):b&&this.complexColor(b,d,c)};a.prototype.getBBox=function(b,c){var h=this.renderer,K=this.element,
e=this.styles,p=this.textStr,f=h.cache,k=h.cacheKeys,A=K.namespaceURI===this.SVG_NS;c=L(c,this.rotation,0);var g=h.styledMode?K&&a.prototype.getStyle.call(K,"font-size"):e&&e.fontSize,y;if(D(p)){var G=p.toString();-1===G.indexOf("<")&&(G=G.replace(/[0-9]/g,"0"));G+=["",c,g,this.textWidth,e&&e.textOverflow,e&&e.fontWeight].join()}G&&!b&&(y=f[G]);if(!y){if(A||h.forExport){try{var l=this.fakeTS&&function(b){var d=K.querySelector(".highcharts-text-outline");d&&I(d,{display:b})};d(l)&&l("none");y=K.getBBox?
O({},K.getBBox()):{width:K.offsetWidth,height:K.offsetHeight};d(l)&&l("")}catch(Y){""}if(!y||0>y.width)y={width:0,height:0}}else y=this.htmlGetBBox();h.isSVG&&(b=y.width,h=y.height,A&&(y.height=h={"11px,17":14,"13px,20":16}[e&&e.fontSize+","+Math.round(h)]||h),c&&(e=c*m,y.width=Math.abs(h*Math.sin(e))+Math.abs(b*Math.cos(e)),y.height=Math.abs(h*Math.cos(e))+Math.abs(b*Math.sin(e))));if(G&&(""===p||0<y.height)){for(;250<k.length;)delete f[k.shift()];f[G]||k.push(G);f[G]=y}}return y};a.prototype.getStyle=
function(b){return f.getComputedStyle(this.element||this,"").getPropertyValue(b)};a.prototype.hasClass=function(b){return-1!==(""+this.attr("class")).split(" ").indexOf(b)};a.prototype.hide=function(b){b?this.attr({y:-9999}):this.attr({visibility:"hidden"});return this};a.prototype.htmlGetBBox=function(){return{height:0,width:0,x:0,y:0}};a.prototype.init=function(b,d){this.element="span"===d?k(d):g.createElementNS(this.SVG_NS,d);this.renderer=b;t(this,"afterInit")};a.prototype.invert=function(b){this.inverted=
b;this.updateTransform();return this};a.prototype.on=function(b,d){var c=this.onEvents;if(c[b])c[b]();c[b]=v(this.element,b,d);return this};a.prototype.opacitySetter=function(b,d,c){this.opacity=b=Number(Number(b).toFixed(3));c.setAttribute(d,b)};a.prototype.removeClass=function(b){return this.attr("class",(""+this.attr("class")).replace(p(b)?new RegExp("(^| )"+b+"( |$)"):b," ").replace(/ +/g," ").trim())};a.prototype.removeTextOutline=function(){var b=this.element.querySelector("tspan.highcharts-text-outline");
b&&this.safeRemoveChild(b)};a.prototype.safeRemoveChild=function(b){var d=b.parentNode;d&&d.removeChild(b)};a.prototype.setRadialReference=function(b){var d=this.element.gradient&&this.renderer.gradients[this.element.gradient];this.element.radialReference=b;d&&d.radAttr&&d.animate(this.renderer.getRadialAttr(b,d.radAttr));return this};a.prototype.setTextPath=function(d,h){var a=this.element,K=this.text?this.text.element:a,e={textAnchor:"text-anchor"},p=!1,f=this.textPathWrapper,k=!f;h=G(!0,{enabled:!0,
attributes:{dy:-5,startOffset:"50%",textAnchor:"middle"}},h);var A=w.filterUserAttributes(h.attributes);if(d&&h&&h.enabled){f&&null===f.element.parentNode?(k=!0,f=f.destroy()):f&&this.removeTextOutline.call(f.parentGroup);this.options&&this.options.padding&&(A.dx=-this.options.padding);f||(this.textPathWrapper=f=this.renderer.createElement("textPath"),p=!0);var g=f.element;(h=d.element.getAttribute("id"))||d.element.setAttribute("id",h=S());if(k)for(K.setAttribute("y",0),b(A.dx)&&K.setAttribute("x",
-A.dx),d=[].slice.call(K.childNodes),k=0;k<d.length;k++){var l=d[k];l.nodeType!==Node.TEXT_NODE&&"tspan"!==l.nodeName||g.appendChild(l)}p&&f&&f.add({element:K});g.setAttributeNS("http://www.w3.org/1999/xlink","href",this.renderer.url+"#"+h);D(A.dy)&&(g.parentNode.setAttribute("dy",A.dy),delete A.dy);D(A.dx)&&(g.parentNode.setAttribute("dx",A.dx),delete A.dx);y(A,function(b,d){g.setAttribute(e[d]||d,b)});a.removeAttribute("transform");this.removeTextOutline.call(f);this.text&&!this.renderer.styledMode&&
this.attr({fill:"none","stroke-width":0});this.applyTextOutline=this.updateTransform=c}else f&&(delete this.updateTransform,delete this.applyTextOutline,this.destroyTextPath(a,d),this.updateTransform(),this.options&&this.options.rotation&&this.applyTextOutline(this.options.style.textOutline));return this};a.prototype.shadow=function(b,d,c){var h=[],a=this.element,e=this.oldShadowOptions,H={color:z.neutralColor100,offsetX:this.parentInverted?-1:1,offsetY:this.parentInverted?-1:1,opacity:.15,width:3},
p=!1,A;!0===b?A=H:"object"===typeof b&&(A=O(H,b));A&&(A&&e&&y(A,function(b,d){b!==e[d]&&(p=!0)}),p&&this.destroyShadows(),this.oldShadowOptions=A);if(!A)this.destroyShadows();else if(!this.shadows){var f=A.opacity/A.width;var k=this.parentInverted?"translate("+A.offsetY+", "+A.offsetX+")":"translate("+A.offsetX+", "+A.offsetY+")";for(H=1;H<=A.width;H++){var g=a.cloneNode(!1);var G=2*A.width+1-2*H;q(g,{stroke:b.color||z.neutralColor100,"stroke-opacity":f*H,"stroke-width":G,transform:k,fill:"none"});
g.setAttribute("class",(g.getAttribute("class")||"")+" highcharts-shadow");c&&(q(g,"height",Math.max(q(g,"height")-G,0)),g.cutHeight=G);d?d.element.appendChild(g):a.parentNode&&a.parentNode.insertBefore(g,a);h.push(g)}this.shadows=h}return this};a.prototype.show=function(b){return this.attr({visibility:b?"inherit":"visible"})};a.prototype.strokeSetter=function(b,d,c){this[d]=b;this.stroke&&this["stroke-width"]?(a.prototype.fillSetter.call(this,this.stroke,"stroke",c),c.setAttribute("stroke-width",
this["stroke-width"]),this.hasStroke=!0):"stroke-width"===d&&0===b&&this.hasStroke?(c.removeAttribute("stroke"),this.hasStroke=!1):this.renderer.styledMode&&this["stroke-width"]&&(c.setAttribute("stroke-width",this["stroke-width"]),this.hasStroke=!0)};a.prototype.strokeWidth=function(){if(!this.renderer.styledMode)return this["stroke-width"]||0;var b=this.getStyle("stroke-width"),d=0;if(b.indexOf("px")===b.length-2)d=F(b);else if(""!==b){var c=g.createElementNS(l,"rect");q(c,{width:b,"stroke-width":0});
this.element.parentNode.appendChild(c);d=c.getBBox().width;c.parentNode.removeChild(c)}return d};a.prototype.symbolAttr=function(b){var d=this;"x y r start end width height innerR anchorX anchorY clockwise".split(" ").forEach(function(c){d[c]=L(b[c],d[c])});d.attr({d:d.renderer.symbols[d.symbolName](d.x,d.y,d.width,d.height,d)})};a.prototype.textSetter=function(b){b!==this.textStr&&(delete this.textPxLength,this.textStr=b,this.added&&this.renderer.buildText(this))};a.prototype.titleSetter=function(b){var d=
this.element,c=d.getElementsByTagName("title")[0]||g.createElementNS(this.SVG_NS,"title");d.insertBefore?d.insertBefore(c,d.firstChild):d.appendChild(c);c.textContent=String(L(b,"")).replace(/<[^>]*>/g,"").replace(/&lt;/g,"<").replace(/&gt;/g,">")};a.prototype.toFront=function(){var b=this.element;b.parentNode.appendChild(b);return this};a.prototype.translate=function(b,d){return this.attr({translateX:b,translateY:d})};a.prototype.updateShadows=function(b,d,c){var h=this.shadows;if(h)for(var a=h.length;a--;)c.call(h[a],
"height"===b?Math.max(d-(h[a].cutHeight||0),0):"d"===b?this.d:d,b,h[a])};a.prototype.updateTransform=function(){var b=this.scaleX,d=this.scaleY,c=this.inverted,h=this.rotation,a=this.matrix,e=this.element,p=this.translateX||0,f=this.translateY||0;c&&(p+=this.width,f+=this.height);p=["translate("+p+","+f+")"];D(a)&&p.push("matrix("+a.join(",")+")");c?p.push("rotate(90) scale(-1,1)"):h&&p.push("rotate("+h+" "+L(this.rotationOriginX,e.getAttribute("x"),0)+" "+L(this.rotationOriginY,e.getAttribute("y")||
0)+")");(D(b)||D(d))&&p.push("scale("+L(b,1)+" "+L(d,1)+")");p.length&&e.setAttribute("transform",p.join(" "))};a.prototype.visibilitySetter=function(b,d,c){"inherit"===b?c.removeAttribute(d):this[d]!==b&&c.setAttribute(d,b);this[d]=b};a.prototype.xGetter=function(b){"circle"===this.element.nodeName&&("x"===b?b="cx":"y"===b&&(b="cy"));return this._defaultGetter(b)};a.prototype.zIndexSetter=function(b,d){var c=this.renderer,h=this.parentGroup,a=(h||c).element||c.box,e=this.element;c=a===c.box;var p=
!1;var f=this.added;var A;D(b)?(e.setAttribute("data-z-index",b),b=+b,this[d]===b&&(f=!1)):D(this[d])&&e.removeAttribute("data-z-index");this[d]=b;if(f){(b=this.zIndex)&&h&&(h.handleZ=!0);d=a.childNodes;for(A=d.length-1;0<=A&&!p;A--){h=d[A];f=h.getAttribute("data-z-index");var k=!D(f);if(h!==e)if(0>b&&k&&!c&&!A)a.insertBefore(e,d[A]),p=!0;else if(F(f)<=b||k&&(!D(b)||0<=b))a.insertBefore(e,d[A+1]||null),p=!0}p||(a.insertBefore(e,d[c?3:0]||null),p=!0)}return p};return a}();a.prototype["stroke-widthSetter"]=
a.prototype.strokeSetter;a.prototype.yGetter=a.prototype.xGetter;a.prototype.matrixSetter=a.prototype.rotationOriginXSetter=a.prototype.rotationOriginYSetter=a.prototype.rotationSetter=a.prototype.scaleXSetter=a.prototype.scaleYSetter=a.prototype.translateXSetter=a.prototype.translateYSetter=a.prototype.verticalAlignSetter=function(b,d){this[d]=b;this.doTransform=!0};"";return a});M(a,"Core/Renderer/RendererRegistry.js",[a["Core/Globals.js"]],function(a){var r;(function(r){r.rendererTypes={};var w;
r.getRendererType=function(a){void 0===a&&(a=w);return r.rendererTypes[a]||r.rendererTypes[w]};r.registerRendererType=function(C,x,E){r.rendererTypes[C]=x;if(!w||E)w=C,a.Renderer=x}})(r||(r={}));return r});M(a,"Core/Renderer/SVG/SVGLabel.js",[a["Core/Renderer/SVG/SVGElement.js"],a["Core/Utilities.js"]],function(a,w){var r=this&&this.__extends||function(){var a=function(g,c){a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(c,a){c.__proto__=a}||function(c,a){for(var e in a)a.hasOwnProperty(e)&&
(c[e]=a[e])};return a(g,c)};return function(g,c){function e(){this.constructor=g}a(g,c);g.prototype=null===c?Object.create(c):(e.prototype=c.prototype,new e)}}(),E=w.defined,z=w.extend,x=w.isNumber,J=w.merge,u=w.pick,n=w.removeEvent;return function(m){function g(c,a,l,f,v,q,k,I,D,B){var e=m.call(this)||this;e.paddingLeftSetter=e.paddingSetter;e.paddingRightSetter=e.paddingSetter;e.init(c,"g");e.textStr=a;e.x=l;e.y=f;e.anchorX=q;e.anchorY=k;e.baseline=D;e.className=B;e.addClass("button"===B?"highcharts-no-tooltip":
"highcharts-label");B&&e.addClass("highcharts-"+B);e.text=c.text(void 0,0,0,I).attr({zIndex:1});var t;"string"===typeof v&&((t=/^url\((.*?)\)$/.test(v))||e.renderer.symbols[v])&&(e.symbolKey=v);e.bBox=g.emptyBBox;e.padding=3;e.baselineOffset=0;e.needsBox=c.styledMode||t;e.deferredAttr={};e.alignFactor=0;return e}r(g,m);g.prototype.alignSetter=function(c){c={left:0,center:.5,right:1}[c];c!==this.alignFactor&&(this.alignFactor=c,this.bBox&&x(this.xSetting)&&this.attr({x:this.xSetting}))};g.prototype.anchorXSetter=
function(c,a){this.anchorX=c;this.boxAttr(a,Math.round(c)-this.getCrispAdjust()-this.xSetting)};g.prototype.anchorYSetter=function(c,a){this.anchorY=c;this.boxAttr(a,c-this.ySetting)};g.prototype.boxAttr=function(c,a){this.box?this.box.attr(c,a):this.deferredAttr[c]=a};g.prototype.css=function(c){if(c){var e={};c=J(c);g.textProps.forEach(function(a){"undefined"!==typeof c[a]&&(e[a]=c[a],delete c[a])});this.text.css(e);var l="width"in e;"fontSize"in e||"fontWeight"in e?this.updateTextPadding():l&&
this.updateBoxSize()}return a.prototype.css.call(this,c)};g.prototype.destroy=function(){n(this.element,"mouseenter");n(this.element,"mouseleave");this.text&&this.text.destroy();this.box&&(this.box=this.box.destroy());a.prototype.destroy.call(this)};g.prototype.fillSetter=function(c,a){c&&(this.needsBox=!0);this.fill=c;this.boxAttr(a,c)};g.prototype.getBBox=function(){this.textStr&&0===this.bBox.width&&0===this.bBox.height&&this.updateBoxSize();var c=this.padding,a=u(this.paddingLeft,c);return{width:this.width,
height:this.height,x:this.bBox.x-a,y:this.bBox.y-c}};g.prototype.getCrispAdjust=function(){return this.renderer.styledMode&&this.box?this.box.strokeWidth()%2/2:(this["stroke-width"]?parseInt(this["stroke-width"],10):0)%2/2};g.prototype.heightSetter=function(c){this.heightSetting=c};g.prototype.onAdd=function(){var c=this.textStr;this.text.add(this);this.attr({text:E(c)?c:"",x:this.x,y:this.y});this.box&&E(this.anchorX)&&this.attr({anchorX:this.anchorX,anchorY:this.anchorY})};g.prototype.paddingSetter=
function(c,a){x(c)?c!==this[a]&&(this[a]=c,this.updateTextPadding()):this[a]=void 0};g.prototype.rSetter=function(c,a){this.boxAttr(a,c)};g.prototype.shadow=function(c){c&&!this.renderer.styledMode&&(this.updateBoxSize(),this.box&&this.box.shadow(c));return this};g.prototype.strokeSetter=function(c,a){this.stroke=c;this.boxAttr(a,c)};g.prototype["stroke-widthSetter"]=function(c,a){c&&(this.needsBox=!0);this["stroke-width"]=c;this.boxAttr(a,c)};g.prototype["text-alignSetter"]=function(c){this.textAlign=
c};g.prototype.textSetter=function(c){"undefined"!==typeof c&&this.text.attr({text:c});this.updateTextPadding()};g.prototype.updateBoxSize=function(){var c=this.text.element.style,a={},l=this.padding,f=this.bBox=x(this.widthSetting)&&x(this.heightSetting)&&!this.textAlign||!E(this.text.textStr)?g.emptyBBox:this.text.getBBox();this.width=this.getPaddedWidth();this.height=(this.heightSetting||f.height||0)+2*l;c=this.renderer.fontMetrics(c&&c.fontSize,this.text);this.baselineOffset=l+Math.min((this.text.firstLineMetrics||
c).b,f.height||Infinity);this.heightSetting&&(this.baselineOffset+=(this.heightSetting-c.h)/2);this.needsBox&&(this.box||(l=this.box=this.symbolKey?this.renderer.symbol(this.symbolKey):this.renderer.rect(),l.addClass(("button"===this.className?"":"highcharts-label-box")+(this.className?" highcharts-"+this.className+"-box":"")),l.add(this)),l=this.getCrispAdjust(),a.x=l,a.y=(this.baseline?-this.baselineOffset:0)+l,a.width=Math.round(this.width),a.height=Math.round(this.height),this.box.attr(z(a,this.deferredAttr)),
this.deferredAttr={})};g.prototype.updateTextPadding=function(){var c=this.text;this.updateBoxSize();var a=this.baseline?0:this.baselineOffset,g=u(this.paddingLeft,this.padding);E(this.widthSetting)&&this.bBox&&("center"===this.textAlign||"right"===this.textAlign)&&(g+={center:.5,right:1}[this.textAlign]*(this.widthSetting-this.bBox.width));if(g!==c.x||a!==c.y)c.attr("x",g),c.hasBoxWidthChanged&&(this.bBox=c.getBBox(!0)),"undefined"!==typeof a&&c.attr("y",a);c.x=g;c.y=a};g.prototype.widthSetter=function(c){this.widthSetting=
x(c)?c:void 0};g.prototype.getPaddedWidth=function(){var c=this.padding,a=u(this.paddingLeft,c);c=u(this.paddingRight,c);return(this.widthSetting||this.bBox.width||0)+a+c};g.prototype.xSetter=function(c){this.x=c;this.alignFactor&&(c-=this.alignFactor*this.getPaddedWidth(),this["forceAnimate:x"]=!0);this.xSetting=Math.round(c);this.attr("translateX",this.xSetting)};g.prototype.ySetter=function(c){this.ySetting=this.y=Math.round(c);this.attr("translateY",this.ySetting)};g.emptyBBox={width:0,height:0,
x:0,y:0};g.textProps="color direction fontFamily fontSize fontStyle fontWeight lineHeight textAlign textDecoration textOutline textOverflow width".split(" ");return g}(a)});M(a,"Core/Renderer/SVG/Symbols.js",[a["Core/Utilities.js"]],function(a){function r(a,n,m,g,c){var e=[];if(c){var l=c.start||0,f=J(c.r,m);m=J(c.r,g||m);var v=(c.end||0)-.001;g=c.innerR;var q=J(c.open,.001>Math.abs((c.end||0)-l-2*Math.PI)),k=Math.cos(l),I=Math.sin(l),D=Math.cos(v),B=Math.sin(v);l=J(c.longArc,.001>v-l-Math.PI?0:1);
e.push(["M",a+f*k,n+m*I],["A",f,m,0,l,J(c.clockwise,1),a+f*D,n+m*B]);z(g)&&e.push(q?["M",a+g*D,n+g*B]:["L",a+g*D,n+g*B],["A",g,g,0,l,z(c.clockwise)?1-c.clockwise:0,a+g*k,n+g*I]);q||e.push(["Z"])}return e}function C(a,n,m,g,c){return c&&c.r?E(a,n,m,g,c):[["M",a,n],["L",a+m,n],["L",a+m,n+g],["L",a,n+g],["Z"]]}function E(a,n,m,g,c){c=c&&c.r||0;return[["M",a+c,n],["L",a+m-c,n],["C",a+m,n,a+m,n,a+m,n+c],["L",a+m,n+g-c],["C",a+m,n+g,a+m,n+g,a+m-c,n+g],["L",a+c,n+g],["C",a,n+g,a,n+g,a,n+g-c],["L",a,n+c],
["C",a,n,a,n,a+c,n]]}var z=a.defined,x=a.isNumber,J=a.pick;return{arc:r,callout:function(a,n,m,g,c){var e=Math.min(c&&c.r||0,m,g),l=e+6,f=c&&c.anchorX;c=c&&c.anchorY||0;var v=E(a,n,m,g,{r:e});if(!x(f))return v;a+f>=m?c>n+l&&c<n+g-l?v.splice(3,1,["L",a+m,c-6],["L",a+m+6,c],["L",a+m,c+6],["L",a+m,n+g-e]):v.splice(3,1,["L",a+m,g/2],["L",f,c],["L",a+m,g/2],["L",a+m,n+g-e]):0>=a+f?c>n+l&&c<n+g-l?v.splice(7,1,["L",a,c+6],["L",a-6,c],["L",a,c-6],["L",a,n+e]):v.splice(7,1,["L",a,g/2],["L",f,c],["L",a,g/2],
["L",a,n+e]):c&&c>g&&f>a+l&&f<a+m-l?v.splice(5,1,["L",f+6,n+g],["L",f,n+g+6],["L",f-6,n+g],["L",a+e,n+g]):c&&0>c&&f>a+l&&f<a+m-l&&v.splice(1,1,["L",f-6,n],["L",f,n-6],["L",f+6,n],["L",m-e,n]);return v},circle:function(a,n,m,g){return r(a+m/2,n+g/2,m/2,g/2,{start:.5*Math.PI,end:2.5*Math.PI,open:!1})},diamond:function(a,n,m,g){return[["M",a+m/2,n],["L",a+m,n+g/2],["L",a+m/2,n+g],["L",a,n+g/2],["Z"]]},rect:C,roundedRect:E,square:C,triangle:function(a,n,m,g){return[["M",a+m/2,n],["L",a+m,n+g],["L",a,
n+g],["Z"]]},"triangle-down":function(a,n,m,g){return[["M",a,n],["L",a+m,n],["L",a+m/2,n+g],["Z"]]}}});M(a,"Core/Renderer/SVG/TextBuilder.js",[a["Core/Renderer/HTML/AST.js"],a["Core/Globals.js"],a["Core/Utilities.js"]],function(a,w,C){var r=w.doc,z=w.SVG_NS,x=C.attr,J=C.isString,u=C.objectEach,n=C.pick;return function(){function m(a){var c=a.styles;this.renderer=a.renderer;this.svgElement=a;this.width=a.textWidth;this.textLineHeight=c&&c.lineHeight;this.textOutline=c&&c.textOutline;this.ellipsis=
!(!c||"ellipsis"!==c.textOverflow);this.noWrap=!(!c||"nowrap"!==c.whiteSpace);this.fontSize=c&&c.fontSize}m.prototype.buildSVG=function(){var g=this.svgElement,c=g.element,e=g.renderer,l=n(g.textStr,"").toString(),f=-1!==l.indexOf("<"),v=c.childNodes;e=this.width&&!g.added&&e.box;var q=/<br.*?>/g,k=[l,this.ellipsis,this.noWrap,this.textLineHeight,this.textOutline,this.fontSize,this.width].join();if(k!==g.textCache){g.textCache=k;delete g.actualWidth;for(k=v.length;k--;)c.removeChild(v[k]);f||this.ellipsis||
this.width||-1!==l.indexOf(" ")&&(!this.noWrap||q.test(l))?""!==l&&(e&&e.appendChild(c),l=new a(l),this.modifyTree(l.nodes),l.addToDOM(g.element),this.modifyDOM(),this.ellipsis&&-1!==(c.textContent||"").indexOf("\u2026")&&g.attr("title",this.unescapeEntities(g.textStr||"",["&lt;","&gt;"])),e&&e.removeChild(c)):c.appendChild(r.createTextNode(this.unescapeEntities(l)));J(this.textOutline)&&g.applyTextOutline&&g.applyTextOutline(this.textOutline)}};m.prototype.modifyDOM=function(){var a=this,c=this.svgElement,
e=x(c.element,"x");c.firstLineMetrics=void 0;for(var l;l=c.element.firstChild;)if(/^[\s\u200B]*$/.test(l.textContent||" "))c.element.removeChild(l);else break;[].forEach.call(c.element.querySelectorAll("tspan.highcharts-br"),function(f,g){f.nextSibling&&f.previousSibling&&(0===g&&1===f.previousSibling.nodeType&&(c.firstLineMetrics=c.renderer.fontMetrics(void 0,f.previousSibling)),x(f,{dy:a.getLineHeight(f.nextSibling),x:e}))});var f=this.width||0;if(f){var v=function(k,g){var l=k.textContent||"",
q=l.replace(/([^\^])-/g,"$1- ").split(" "),v=!a.noWrap&&(1<q.length||1<c.element.childNodes.length),t=a.getLineHeight(g),h=0,d=c.actualWidth;if(a.ellipsis)l&&a.truncate(k,l,void 0,0,Math.max(0,f-parseInt(a.fontSize||12,10)),function(b,d){return b.substring(0,d)+"\u2026"});else if(v){l=[];for(v=[];g.firstChild&&g.firstChild!==k;)v.push(g.firstChild),g.removeChild(g.firstChild);for(;q.length;)q.length&&!a.noWrap&&0<h&&(l.push(k.textContent||""),k.textContent=q.join(" ").replace(/- /g,"-")),a.truncate(k,
void 0,q,0===h?d||0:0,f,function(b,d){return q.slice(0,d).join(" ").replace(/- /g,"-")}),d=c.actualWidth,h++;v.forEach(function(b){g.insertBefore(b,k)});l.forEach(function(b){g.insertBefore(r.createTextNode(b),k);b=r.createElementNS(z,"tspan");b.textContent="\u200b";x(b,{dy:t,x:e});g.insertBefore(b,k)})}},q=function(a){[].slice.call(a.childNodes).forEach(function(e){e.nodeType===Node.TEXT_NODE?v(e,a):(-1!==e.className.baseVal.indexOf("highcharts-br")&&(c.actualWidth=0),q(e))})};q(c.element)}};m.prototype.getLineHeight=
function(a){var c;a=a.nodeType===Node.TEXT_NODE?a.parentElement:a;this.renderer.styledMode||(c=a&&/(px|em)$/.test(a.style.fontSize)?a.style.fontSize:this.fontSize||this.renderer.style.fontSize||12);return this.textLineHeight?parseInt(this.textLineHeight.toString(),10):this.renderer.fontMetrics(c,a||this.svgElement.element).h};m.prototype.modifyTree=function(a){var c=this,e=function(g,f){var l=g.tagName,q=c.renderer.styledMode,k=g.attributes||{};if("b"===l||"strong"===l)q?k["class"]="highcharts-strong":
k.style="font-weight:bold;"+(k.style||"");else if("i"===l||"em"===l)q?k["class"]="highcharts-emphasized":k.style="font-style:italic;"+(k.style||"");J(k.style)&&(k.style=k.style.replace(/(;| |^)color([ :])/,"$1fill$2"));"br"===l&&(k["class"]="highcharts-br",g.textContent="\u200b",(f=a[f+1])&&f.textContent&&(f.textContent=f.textContent.replace(/^ +/gm,"")));"#text"!==l&&"a"!==l&&(g.tagName="tspan");g.attributes=k;g.children&&g.children.filter(function(c){return"#text"!==c.tagName}).forEach(e)};a.forEach(e)};
m.prototype.truncate=function(a,c,e,l,f,v){var g=this.svgElement,k=g.renderer,m=g.rotation,D=[],B=e?1:0,n=(c||e||"").length,t=n,h,d=function(b,d){d=d||b;var h=a.parentNode;if(h&&"undefined"===typeof D[d])if(h.getSubStringLength)try{D[d]=l+h.getSubStringLength(0,e?d+1:d)}catch(L){""}else k.getSpanWidth&&(a.textContent=v(c||e,b),D[d]=l+k.getSpanWidth(g,a));return D[d]};g.rotation=0;var b=d(a.textContent.length);if(l+b>f){for(;B<=n;)t=Math.ceil((B+n)/2),e&&(h=v(e,t)),b=d(t,h&&h.length-1),B===n?B=n+1:
b>f?n=t-1:B=t;0===n?a.textContent="":c&&n===c.length-1||(a.textContent=h||v(c||e,t))}e&&e.splice(0,t);g.actualWidth=b;g.rotation=m};m.prototype.unescapeEntities=function(a,c){u(this.renderer.escapes,function(e,g){c&&-1!==c.indexOf(e)||(a=a.toString().replace(new RegExp(e,"g"),g))});return a};return m}()});M(a,"Core/Renderer/SVG/SVGRenderer.js",[a["Core/Renderer/HTML/AST.js"],a["Core/Color/Color.js"],a["Core/Globals.js"],a["Core/Color/Palette.js"],a["Core/Renderer/RendererRegistry.js"],a["Core/Renderer/SVG/SVGElement.js"],
a["Core/Renderer/SVG/SVGLabel.js"],a["Core/Renderer/SVG/Symbols.js"],a["Core/Renderer/SVG/TextBuilder.js"],a["Core/Utilities.js"]],function(a,w,C,E,z,x,J,u,n,m){var g=C.charts,c=C.deg2rad,e=C.doc,l=C.isFirefox,f=C.isMS,v=C.isWebKit,q=C.noop,k=C.SVG_NS,I=C.symbolSizes,D=C.win,B=m.addEvent,r=m.attr,t=m.createElement,h=m.css,d=m.defined,b=m.destroyObjectProperties,p=m.extend,G=m.isArray,y=m.isNumber,L=m.isObject,F=m.isString,P=m.merge,S=m.pick,Q=m.pInt,V=m.uniqueKey,fa;C=function(){function H(b,d,c,
a,h,e,p){this.width=this.url=this.style=this.isSVG=this.imgCount=this.height=this.gradients=this.globalAnimation=this.defs=this.chartIndex=this.cacheKeys=this.cache=this.boxWrapper=this.box=this.alignedObjects=void 0;this.init(b,d,c,a,h,e,p)}H.prototype.init=function(b,d,c,a,p,A,H){var K=this.createElement("svg").attr({version:"1.1","class":"highcharts-root"}),f=K.element;H||K.css(this.getStyle(a));b.appendChild(f);r(b,"dir","ltr");-1===b.innerHTML.indexOf("xmlns")&&r(f,"xmlns",this.SVG_NS);this.isSVG=
!0;this.box=f;this.boxWrapper=K;this.alignedObjects=[];this.url=this.getReferenceURL();this.createElement("desc").add().element.appendChild(e.createTextNode("Created with Highcharts 9.2.2"));this.defs=this.createElement("defs").add();this.allowHTML=A;this.forExport=p;this.styledMode=H;this.gradients={};this.cache={};this.cacheKeys=[];this.imgCount=0;this.setSize(d,c,!1);var k;l&&b.getBoundingClientRect&&(d=function(){h(b,{left:0,top:0});k=b.getBoundingClientRect();h(b,{left:Math.ceil(k.left)-k.left+
"px",top:Math.ceil(k.top)-k.top+"px"})},d(),this.unSubPixelFix=B(D,"resize",d))};H.prototype.definition=function(b){return(new a([b])).addToDOM(this.defs.element)};H.prototype.getReferenceURL=function(){if((l||v)&&e.getElementsByTagName("base").length){if(!d(fa)){var b=V();b=(new a([{tagName:"svg",attributes:{width:8,height:8},children:[{tagName:"defs",children:[{tagName:"clipPath",attributes:{id:b},children:[{tagName:"rect",attributes:{width:4,height:4}}]}]},{tagName:"rect",attributes:{id:"hitme",
width:8,height:8,"clip-path":"url(#"+b+")",fill:"rgba(0,0,0,0.001)"}}]}])).addToDOM(e.body);h(b,{position:"fixed",top:0,left:0,zIndex:9E5});var c=e.elementFromPoint(6,6);fa="hitme"===(c&&c.id);e.body.removeChild(b)}if(fa)return D.location.href.split("#")[0].replace(/<[^>]*>/g,"").replace(/([\('\)])/g,"\\$1").replace(/ /g,"%20")}return""};H.prototype.getStyle=function(b){return this.style=p({fontFamily:'"Lucida Grande", "Lucida Sans Unicode", Arial, Helvetica, sans-serif',fontSize:"12px"},b)};H.prototype.setStyle=
function(b){this.boxWrapper.css(this.getStyle(b))};H.prototype.isHidden=function(){return!this.boxWrapper.getBBox().width};H.prototype.destroy=function(){var d=this.defs;this.box=null;this.boxWrapper=this.boxWrapper.destroy();b(this.gradients||{});this.gradients=null;d&&(this.defs=d.destroy());this.unSubPixelFix&&this.unSubPixelFix();return this.alignedObjects=null};H.prototype.createElement=function(b){var d=new this.Element;d.init(this,b);return d};H.prototype.getRadialAttr=function(b,d){return{cx:b[0]-
b[2]/2+(d.cx||0)*b[2],cy:b[1]-b[2]/2+(d.cy||0)*b[2],r:(d.r||0)*b[2]}};H.prototype.buildText=function(b){(new n(b)).buildSVG()};H.prototype.getContrast=function(b){b=w.parse(b).rgba;b[0]*=1;b[1]*=1.2;b[2]*=.5;return 459<b[0]+b[1]+b[2]?"#000000":"#FFFFFF"};H.prototype.button=function(b,d,c,h,e,A,H,k,g,y){var K=this.label(b,d,c,g,void 0,void 0,y,void 0,"button"),G=this.styledMode,l=0,t=e?P(e):{};b=t&&t.style||{};t=a.filterUserAttributes(t);K.attr(P({padding:8,r:2},t));if(!G){t=P({fill:E.neutralColor3,
stroke:E.neutralColor20,"stroke-width":1,style:{color:E.neutralColor80,cursor:"pointer",fontWeight:"normal"}},{style:b},t);var N=t.style;delete t.style;A=P(t,{fill:E.neutralColor10},a.filterUserAttributes(A||{}));var q=A.style;delete A.style;H=P(t,{fill:E.highlightColor10,style:{color:E.neutralColor100,fontWeight:"bold"}},a.filterUserAttributes(H||{}));var v=H.style;delete H.style;k=P(t,{style:{color:E.neutralColor20}},a.filterUserAttributes(k||{}));var F=k.style;delete k.style}B(K.element,f?"mouseover":
"mouseenter",function(){3!==l&&K.setState(1)});B(K.element,f?"mouseout":"mouseleave",function(){3!==l&&K.setState(l)});K.setState=function(b){1!==b&&(K.state=l=b);K.removeClass(/highcharts-button-(normal|hover|pressed|disabled)/).addClass("highcharts-button-"+["normal","hover","pressed","disabled"][b||0]);G||K.attr([t,A,H,k][b||0]).css([N,q,v,F][b||0])};G||K.attr(t).css(p({cursor:"default"},N));return K.on("touchstart",function(b){return b.stopPropagation()}).on("click",function(b){3!==l&&h.call(K,
b)})};H.prototype.crispLine=function(b,c,a){void 0===a&&(a="round");var h=b[0],e=b[1];d(h[1])&&h[1]===e[1]&&(h[1]=e[1]=Math[a](h[1])-c%2/2);d(h[2])&&h[2]===e[2]&&(h[2]=e[2]=Math[a](h[2])+c%2/2);return b};H.prototype.path=function(b){var d=this.styledMode?{}:{fill:"none"};G(b)?d.d=b:L(b)&&p(d,b);return this.createElement("path").attr(d)};H.prototype.circle=function(b,d,c){b=L(b)?b:"undefined"===typeof b?{}:{x:b,y:d,r:c};d=this.createElement("circle");d.xSetter=d.ySetter=function(b,d,c){c.setAttribute("c"+
d,b)};return d.attr(b)};H.prototype.arc=function(b,d,c,a,h,e){L(b)?(a=b,d=a.y,c=a.r,b=a.x):a={innerR:a,start:h,end:e};b=this.symbol("arc",b,d,c,c,a);b.r=c;return b};H.prototype.rect=function(b,d,c,a,h,e){h=L(b)?b.r:h;var p=this.createElement("rect");b=L(b)?b:"undefined"===typeof b?{}:{x:b,y:d,width:Math.max(c,0),height:Math.max(a,0)};this.styledMode||("undefined"!==typeof e&&(b["stroke-width"]=e,b=p.crisp(b)),b.fill="none");h&&(b.r=h);p.rSetter=function(b,d,c){p.r=b;r(c,{rx:b,ry:b})};p.rGetter=function(){return p.r||
0};return p.attr(b)};H.prototype.setSize=function(b,d,c){this.width=b;this.height=d;this.boxWrapper.animate({width:b,height:d},{step:function(){this.attr({viewBox:"0 0 "+this.attr("width")+" "+this.attr("height")})},duration:S(c,!0)?void 0:0});this.alignElements()};H.prototype.g=function(b){var d=this.createElement("g");return b?d.attr({"class":"highcharts-"+b}):d};H.prototype.image=function(b,d,c,a,h,e){var A={preserveAspectRatio:"none"},H=function(b,d){b.setAttributeNS?b.setAttributeNS("http://www.w3.org/1999/xlink",
"href",d):b.setAttribute("hc-svg-href",d)};1<arguments.length&&p(A,{x:d,y:c,width:a,height:h});var f=this.createElement("image").attr(A);A=function(d){H(f.element,b);e.call(f,d)};if(e){H(f.element,"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==");var K=new D.Image;B(K,"load",A);K.src=b;K.complete&&A({})}else H(f.element,b);return f};H.prototype.symbol=function(b,c,a,H,f,A){var K=this,k=/^url\((.*?)\)$/,y=k.test(b),G=!y&&(this.symbols[b]?b:"circle"),l=G&&this.symbols[G],
q;if(l){"number"===typeof c&&(q=l.call(this.symbols,Math.round(c||0),Math.round(a||0),H||0,f||0,A));var v=this.path(q);K.styledMode||v.attr("fill","none");p(v,{symbolName:G||void 0,x:c,y:a,width:H,height:f});A&&p(v,A)}else if(y){var F=b.match(k)[1];var m=v=this.image(F);m.imgwidth=S(I[F]&&I[F].width,A&&A.width);m.imgheight=S(I[F]&&I[F].height,A&&A.height);var L=function(b){return b.attr({width:b.width,height:b.height})};["width","height"].forEach(function(b){m[b+"Setter"]=function(b,c){var a=this["img"+
c];this[c]=b;d(a)&&(A&&"within"===A.backgroundSize&&this.width&&this.height&&(a=Math.round(a*Math.min(this.width/this.imgwidth,this.height/this.imgheight))),this.element&&this.element.setAttribute(c,a),this.alignByTranslate||(b=((this[c]||0)-a)/2,this.attr("width"===c?{translateX:b}:{translateY:b})))}});d(c)&&m.attr({x:c,y:a});m.isImg=!0;d(m.imgwidth)&&d(m.imgheight)?L(m):(m.attr({width:0,height:0}),t("img",{onload:function(){var b=g[K.chartIndex];0===this.width&&(h(this,{position:"absolute",top:"-999em"}),
e.body.appendChild(this));I[F]={width:this.width,height:this.height};m.imgwidth=this.width;m.imgheight=this.height;m.element&&L(m);this.parentNode&&this.parentNode.removeChild(this);K.imgCount--;if(!K.imgCount&&b&&!b.hasLoaded)b.onload()},src:F}),this.imgCount++)}return v};H.prototype.clipRect=function(b,d,c,a){var h=V()+"-",e=this.createElement("clipPath").attr({id:h}).add(this.defs);b=this.rect(b,d,c,a,0).add(e);b.id=h;b.clipPath=e;b.count=0;return b};H.prototype.text=function(b,c,a,h){var e={};
if(h&&(this.allowHTML||!this.forExport))return this.html(b,c,a);e.x=Math.round(c||0);a&&(e.y=Math.round(a));d(b)&&(e.text=b);b=this.createElement("text").attr(e);if(!h||this.forExport&&!this.allowHTML)b.xSetter=function(b,d,c){for(var a=c.getElementsByTagName("tspan"),h=c.getAttribute(d),e=0,p;e<a.length;e++)p=a[e],p.getAttribute(d)===h&&p.setAttribute(d,b);c.setAttribute(d,b)};return b};H.prototype.fontMetrics=function(b,d){b=!this.styledMode&&/px/.test(b)||!D.getComputedStyle?b||d&&d.style&&d.style.fontSize||
this.style&&this.style.fontSize:d&&x.prototype.getStyle.call(d,"font-size");b=/px/.test(b)?Q(b):12;d=24>b?b+3:Math.round(1.2*b);return{h:d,b:Math.round(.8*d),f:b}};H.prototype.rotCorr=function(b,d,a){var h=b;d&&a&&(h=Math.max(h*Math.cos(d*c),4));return{x:-b/3*Math.sin(d*c),y:h}};H.prototype.pathToSegments=function(b){for(var d=[],c=[],a={A:8,C:7,H:2,L:3,M:3,Q:5,S:5,T:3,V:2},h=0;h<b.length;h++)F(c[0])&&y(b[h])&&c.length===a[c[0].toUpperCase()]&&b.splice(h,0,c[0].replace("M","L").replace("m","l")),
"string"===typeof b[h]&&(c.length&&d.push(c.slice(0)),c.length=0),c.push(b[h]);d.push(c.slice(0));return d};H.prototype.label=function(b,d,c,a,h,e,p,H,f){return new J(this,b,d,c,a,h,e,p,H,f)};H.prototype.alignElements=function(){this.alignedObjects.forEach(function(b){return b.align()})};return H}();p(C.prototype,{Element:x,SVG_NS:k,escapes:{"&":"&amp;","<":"&lt;",">":"&gt;","'":"&#39;",'"':"&quot;"},symbols:u,draw:q});z.registerRendererType("svg",C,!0);"";return C});M(a,"Core/Renderer/HTML/HTMLElement.js",
[a["Core/Globals.js"],a["Core/Renderer/SVG/SVGElement.js"],a["Core/Utilities.js"]],function(a,w,C){var r=this&&this.__extends||function(){var c=function(a,e){c=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(c,a){c.__proto__=a}||function(c,a){for(var e in a)a.hasOwnProperty(e)&&(c[e]=a[e])};return c(a,e)};return function(a,e){function f(){this.constructor=a}c(a,e);a.prototype=null===e?Object.create(e):(f.prototype=e.prototype,new f)}}(),z=a.isFirefox,x=a.isMS,J=a.isWebKit,u=a.win,
n=C.css,m=C.defined,g=C.extend,c=C.pick,e=C.pInt;return function(a){function f(){return null!==a&&a.apply(this,arguments)||this}r(f,a);f.compose=function(c){if(-1===f.composedClasses.indexOf(c)){f.composedClasses.push(c);var a=f.prototype,e=c.prototype;e.getSpanCorrection=a.getSpanCorrection;e.htmlCss=a.htmlCss;e.htmlGetBBox=a.htmlGetBBox;e.htmlUpdateTransform=a.htmlUpdateTransform;e.setSpanRotation=a.setSpanRotation}return c};f.prototype.getSpanCorrection=function(c,a,e){this.xCorr=-c*e;this.yCorr=
-a};f.prototype.htmlCss=function(a){var e="SPAN"===this.element.tagName&&a&&"width"in a,f=c(e&&a.width,void 0);if(e){delete a.width;this.textWidth=f;var l=!0}a&&"ellipsis"===a.textOverflow&&(a.whiteSpace="nowrap",a.overflow="hidden");this.styles=g(this.styles,a);n(this.element,a);l&&this.htmlUpdateTransform();return this};f.prototype.htmlGetBBox=function(){var c=this.element;return{x:c.offsetLeft,y:c.offsetTop,width:c.offsetWidth,height:c.offsetHeight}};f.prototype.htmlUpdateTransform=function(){if(this.added){var c=
this.renderer,a=this.element,f=this.translateX||0,g=this.translateY||0,l=this.x||0,B=this.y||0,r=this.textAlign||"left",t={left:0,center:.5,right:1}[r],h=this.styles;h=h&&h.whiteSpace;n(a,{marginLeft:f,marginTop:g});!c.styledMode&&this.shadows&&this.shadows.forEach(function(b){n(b,{marginLeft:f+1,marginTop:g+1})});this.inverted&&[].forEach.call(a.childNodes,function(b){c.invertChild(b,a)});if("SPAN"===a.tagName){var d=this.rotation,b=this.textWidth&&e(this.textWidth),p=[d,r,a.innerHTML,this.textWidth,
this.textAlign].join(),G=void 0;(G=b!==this.oldTextWidth)&&!(G=b>this.oldTextWidth)&&((G=this.textPxLength)||(n(a,{width:"",whiteSpace:h||"nowrap"}),G=a.offsetWidth),G=G>b);G&&(/[ \-]/.test(a.textContent||a.innerText)||"ellipsis"===a.style.textOverflow)?(n(a,{width:b+"px",display:"block",whiteSpace:h||"normal"}),this.oldTextWidth=b,this.hasBoxWidthChanged=!0):this.hasBoxWidthChanged=!1;p!==this.cTT&&(G=c.fontMetrics(a.style.fontSize,a).b,!m(d)||d===(this.oldRotation||0)&&r===this.oldAlign||this.setSpanRotation(d,
t,G),this.getSpanCorrection(!m(d)&&this.textPxLength||a.offsetWidth,G,t,d,r));n(a,{left:l+(this.xCorr||0)+"px",top:B+(this.yCorr||0)+"px"});this.cTT=p;this.oldRotation=d;this.oldAlign=r}}else this.alignOnAdd=!0};f.prototype.setSpanRotation=function(c,a,e){var f={},g=x&&!/Edge/.test(u.navigator.userAgent)?"-ms-transform":J?"-webkit-transform":z?"MozTransform":u.opera?"-o-transform":void 0;g&&(f[g]=f.transform="rotate("+c+"deg)",f[g+(z?"Origin":"-origin")]=f.transformOrigin=100*a+"% "+e+"px",n(this.element,
f))};f.composedClasses=[];return f}(w)});M(a,"Core/Renderer/HTML/HTMLRenderer.js",[a["Core/Renderer/HTML/AST.js"],a["Core/Renderer/SVG/SVGElement.js"],a["Core/Renderer/SVG/SVGRenderer.js"],a["Core/Utilities.js"]],function(a,w,C,E){var r=this&&this.__extends||function(){var a=function(g,c){a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(a,c){a.__proto__=c}||function(a,c){for(var e in c)c.hasOwnProperty(e)&&(a[e]=c[e])};return a(g,c)};return function(g,c){function e(){this.constructor=
g}a(g,c);g.prototype=null===c?Object.create(c):(e.prototype=c.prototype,new e)}}(),x=E.attr,J=E.createElement,u=E.extend,n=E.pick;return function(m){function g(){return null!==m&&m.apply(this,arguments)||this}r(g,m);g.compose=function(c){-1===g.composedClasses.indexOf(c)&&(g.composedClasses.push(c),c.prototype.html=g.prototype.html);return c};g.prototype.html=function(c,e,g){var f=this.createElement("span"),l=f.element,q=f.renderer,k=q.isSVG,m=function(c,a){["opacity","visibility"].forEach(function(e){c[e+
"Setter"]=function(f,h,d){var b=c.div?c.div.style:a;w.prototype[e+"Setter"].call(this,f,h,d);b&&(b[h]=f)}});c.addedSetters=!0};f.textSetter=function(c){c!==this.textStr&&(delete this.bBox,delete this.oldTextWidth,a.setElementHTML(this.element,n(c,"")),this.textStr=c,f.doTransform=!0)};k&&m(f,f.element.style);f.xSetter=f.ySetter=f.alignSetter=f.rotationSetter=function(c,a){"align"===a?f.alignValue=f.textAlign=c:f[a]=c;f.doTransform=!0};f.afterSetters=function(){this.doTransform&&(this.htmlUpdateTransform(),
this.doTransform=!1)};f.attr({text:c,x:Math.round(e),y:Math.round(g)}).css({position:"absolute"});q.styledMode||f.css({fontFamily:this.style.fontFamily,fontSize:this.style.fontSize});l.style.whiteSpace="nowrap";f.css=f.htmlCss;k&&(f.add=function(c){var a=q.box.parentNode,e=[];if(this.parentGroup=c){var g=c.div;if(!g){for(;c;)e.push(c),c=c.parentGroup;e.reverse().forEach(function(c){function d(b,d){c[d]=b;"translateX"===d?k.left=b+"px":k.top=b+"px";c.doTransform=!0}var b=x(c.element,"class"),h=c.styles||
{};g=c.div=c.div||J("div",b?{className:b}:void 0,{position:"absolute",left:(c.translateX||0)+"px",top:(c.translateY||0)+"px",display:c.display,opacity:c.opacity,cursor:h.cursor,pointerEvents:h.pointerEvents,visibility:c.visibility},g||a);var k=g.style;u(c,{classSetter:function(b){return function(d){this.element.setAttribute("class",d);b.className=d}}(g),on:function(){e[0].div&&f.on.apply({element:e[0].div,onEvents:c.onEvents},arguments);return c},translateXSetter:d,translateYSetter:d});c.addedSetters||
m(c)})}}else g=a;g.appendChild(l);f.added=!0;f.alignOnAdd&&f.htmlUpdateTransform();return f});return f};g.composedClasses=[];return g}(C)});M(a,"Core/Axis/AxisDefaults.js",[a["Core/Color/Palette.js"]],function(a){var r;(function(r){r.defaultXAxisOptions={alignTicks:!0,allowDecimals:void 0,panningEnabled:!0,zIndex:2,zoomEnabled:!0,dateTimeLabelFormats:{millisecond:{main:"%H:%M:%S.%L",range:!1},second:{main:"%H:%M:%S",range:!1},minute:{main:"%H:%M",range:!1},hour:{main:"%H:%M",range:!1},day:{main:"%e. %b"},
week:{main:"%e. %b"},month:{main:"%b '%y"},year:{main:"%Y"}},endOnTick:!1,gridLineDashStyle:"Solid",gridZIndex:1,labels:{autoRotation:void 0,autoRotationLimit:80,distance:void 0,enabled:!0,indentation:10,overflow:"justify",padding:5,reserveSpace:void 0,rotation:void 0,staggerLines:0,step:0,useHTML:!1,x:0,zIndex:7,style:{color:a.neutralColor60,cursor:"default",fontSize:"11px"}},maxPadding:.01,minorGridLineDashStyle:"Solid",minorTickLength:2,minorTickPosition:"outside",minPadding:.01,offset:void 0,
opposite:!1,reversed:void 0,reversedStacks:!1,showEmpty:!0,showFirstLabel:!0,showLastLabel:!0,startOfWeek:1,startOnTick:!1,tickLength:10,tickPixelInterval:100,tickmarkPlacement:"between",tickPosition:"outside",title:{align:"middle",rotation:0,useHTML:!1,x:0,y:0,style:{color:a.neutralColor60}},type:"linear",uniqueNames:!0,visible:!0,minorGridLineColor:a.neutralColor5,minorGridLineWidth:1,minorTickColor:a.neutralColor40,lineColor:a.highlightColor20,lineWidth:1,gridLineColor:a.neutralColor10,gridLineWidth:void 0,
tickColor:a.highlightColor20};r.defaultYAxisOptions={reversedStacks:!0,endOnTick:!0,maxPadding:.05,minPadding:.05,tickPixelInterval:72,showLastLabel:!0,labels:{x:-8},startOnTick:!0,title:{rotation:270,text:"Values"},stackLabels:{animation:{},allowOverlap:!1,enabled:!1,crop:!0,overflow:"justify",formatter:function(){var a=this.axis.chart.numberFormatter;return a(this.total,-1)},style:{color:a.neutralColor100,fontSize:"11px",fontWeight:"bold",textOutline:"1px contrast"}},gridLineWidth:1,lineWidth:0};
r.defaultLeftAxisOptions={labels:{x:-15},title:{rotation:270}};r.defaultRightAxisOptions={labels:{x:15},title:{rotation:90}};r.defaultBottomAxisOptions={labels:{autoRotation:[-45],x:0},margin:15,title:{rotation:0}};r.defaultTopAxisOptions={labels:{autoRotation:[-45],x:0},margin:15,title:{rotation:0}}})(r||(r={}));return r});M(a,"Core/Foundation.js",[a["Core/Utilities.js"]],function(a){var r=a.addEvent,C=a.isFunction,E=a.objectEach,z=a.removeEvent;return{registerEventOptions:function(a,w){a.eventOptions=
a.eventOptions||{};E(w.events,function(u,n){a.eventOptions[n]!==u&&(a.eventOptions[n]&&(z(a,n,a.eventOptions[n]),delete a.eventOptions[n]),C(u)&&(a.eventOptions[n]=u,r(a,n,u)))})}}});M(a,"Core/Axis/Tick.js",[a["Core/FormatUtilities.js"],a["Core/Globals.js"],a["Core/Utilities.js"]],function(a,w,C){var r=w.deg2rad,z=C.clamp,x=C.correctFloat,J=C.defined,u=C.destroyObjectProperties,n=C.extend,m=C.fireEvent,g=C.isNumber,c=C.merge,e=C.objectEach,l=C.pick;w=function(){function f(c,a,e,f,g){this.isNewLabel=
this.isNew=!0;this.axis=c;this.pos=a;this.type=e||"";this.parameters=g||{};this.tickmarkOffset=this.parameters.tickmarkOffset;this.options=this.parameters.options;m(this,"init");e||f||this.addLabel()}f.prototype.addLabel=function(){var c=this,e=c.axis,f=e.options,I=e.chart,D=e.categories,B=e.logarithmic,r=e.names,t=c.pos,h=l(c.options&&c.options.labels,f.labels),d=e.tickPositions,b=t===d[0],p=t===d[d.length-1],G=(!h.step||1===h.step)&&1===e.tickInterval;d=d.info;var y=c.label,L;D=this.parameters.category||
(D?l(D[t],r[t],t):t);B&&g(D)&&(D=x(B.lin2log(D)));if(e.dateTime)if(d){var F=I.time.resolveDTLFormat(f.dateTimeLabelFormats[!f.grid&&d.higherRanks[t]||d.unitName]);var P=F.main}else g(D)&&(P=e.dateTime.getXDateFormat(D,f.dateTimeLabelFormats||{}));c.isFirst=b;c.isLast=p;var S={axis:e,chart:I,dateTimeLabelFormat:P,isFirst:b,isLast:p,pos:t,tick:c,tickPositionInfo:d,value:D};m(this,"labelFormat",S);var Q=function(b){return h.formatter?h.formatter.call(b,b):h.format?(b.text=e.defaultLabelFormatter.call(b),
a.format(h.format,b,I)):e.defaultLabelFormatter.call(b,b)};f=Q.call(S,S);var u=F&&F.list;c.shortenLabel=u?function(){for(L=0;L<u.length;L++)if(n(S,{dateTimeLabelFormat:u[L]}),y.attr({text:Q.call(S,S)}),y.getBBox().width<e.getSlotWidth(c)-2*h.padding)return;y.attr({text:""})}:void 0;G&&e._addedPlotLB&&c.moveLabel(f,h);J(y)||c.movedLabel?y&&y.textStr!==f&&!G&&(!y.textWidth||h.style.width||y.styles.width||y.css({width:null}),y.attr({text:f}),y.textPxLength=y.getBBox().width):(c.label=y=c.createLabel({x:0,
y:0},f,h),c.rotation=0)};f.prototype.createLabel=function(a,e,f){var g=this.axis,k=g.chart;if(a=J(e)&&f.enabled?k.renderer.text(e,a.x,a.y,f.useHTML).add(g.labelGroup):null)k.styledMode||a.css(c(f.style)),a.textPxLength=a.getBBox().width;return a};f.prototype.destroy=function(){u(this,this.axis)};f.prototype.getPosition=function(c,a,e,f){var g=this.axis,k=g.chart,l=f&&k.oldChartHeight||k.chartHeight;c={x:c?x(g.translate(a+e,null,null,f)+g.transB):g.left+g.offset+(g.opposite?(f&&k.oldChartWidth||k.chartWidth)-
g.right-g.left:0),y:c?l-g.bottom+g.offset-(g.opposite?g.height:0):x(l-g.translate(a+e,null,null,f)-g.transB)};c.y=z(c.y,-1E5,1E5);m(this,"afterGetPosition",{pos:c});return c};f.prototype.getLabelPosition=function(c,a,e,f,g,l,n,t){var h=this.axis,d=h.transA,b=h.isLinked&&h.linkedParent?h.linkedParent.reversed:h.reversed,p=h.staggerLines,k=h.tickRotCorr||{x:0,y:0},y=f||h.reserveSpaceDefault?0:-h.labelOffset*("center"===h.labelAlign?.5:1),q={},F=g.y;J(F)||(F=0===h.side?e.rotation?-8:-e.getBBox().height:
2===h.side?k.y+8:Math.cos(e.rotation*r)*(k.y-e.getBBox(!1,0).height/2));c=c+g.x+y+k.x-(l&&f?l*d*(b?-1:1):0);a=a+F-(l&&!f?l*d*(b?1:-1):0);p&&(e=n/(t||1)%p,h.opposite&&(e=p-e-1),a+=h.labelOffset/p*e);q.x=c;q.y=Math.round(a);m(this,"afterGetLabelPosition",{pos:q,tickmarkOffset:l,index:n});return q};f.prototype.getLabelSize=function(){return this.label?this.label.getBBox()[this.axis.horiz?"height":"width"]:0};f.prototype.getMarkPath=function(c,a,e,f,g,l){return l.crispLine([["M",c,a],["L",c+(g?0:-e),
a+(g?e:0)]],f)};f.prototype.handleOverflow=function(c){var a=this.axis,e=a.options.labels,f=c.x,g=a.chart.chartWidth,m=a.chart.spacing,v=l(a.labelLeft,Math.min(a.pos,m[3]));m=l(a.labelRight,Math.max(a.isRadial?0:a.pos+a.len,g-m[1]));var t=this.label,h=this.rotation,d={left:0,center:.5,right:1}[a.labelAlign||t.attr("align")],b=t.getBBox().width,p=a.getSlotWidth(this),G={},y=p,L=1,F;if(h||"justify"!==e.overflow)0>h&&f-d*b<v?F=Math.round(f/Math.cos(h*r)-v):0<h&&f+d*b>m&&(F=Math.round((g-f)/Math.cos(h*
r)));else if(g=f+(1-d)*b,f-d*b<v?y=c.x+y*(1-d)-v:g>m&&(y=m-c.x+y*d,L=-1),y=Math.min(p,y),y<p&&"center"===a.labelAlign&&(c.x+=L*(p-y-d*(p-Math.min(b,y)))),b>y||a.autoRotation&&(t.styles||{}).width)F=y;F&&(this.shortenLabel?this.shortenLabel():(G.width=Math.floor(F)+"px",(e.style||{}).textOverflow||(G.textOverflow="ellipsis"),t.css(G)))};f.prototype.moveLabel=function(c,a){var f=this,g=f.label,l=f.axis,m=l.reversed,q=!1;g&&g.textStr===c?(f.movedLabel=g,q=!0,delete f.label):e(l.ticks,function(a){q||
a.isNew||a===f||!a.label||a.label.textStr!==c||(f.movedLabel=a.label,q=!0,a.labelPos=f.movedLabel.xy,delete a.label)});if(!q&&(f.labelPos||g)){var t=f.labelPos||g.xy;g=l.horiz?m?0:l.width+l.left:t.x;l=l.horiz?t.y:m?l.width+l.left:0;f.movedLabel=f.createLabel({x:g,y:l},c,a);f.movedLabel&&f.movedLabel.attr({opacity:0})}};f.prototype.render=function(a,c,e){var f=this.axis,g=f.horiz,k=this.pos,q=l(this.tickmarkOffset,f.tickmarkOffset);k=this.getPosition(g,k,q,c);q=k.x;var t=k.y;f=g&&q===f.pos+f.len||
!g&&t===f.pos?-1:1;g=l(e,this.label&&this.label.newOpacity,1);e=l(e,1);this.isActive=!0;this.renderGridLine(c,e,f);this.renderMark(k,e,f);this.renderLabel(k,c,g,a);this.isNew=!1;m(this,"afterRender")};f.prototype.renderGridLine=function(c,a,e){var f=this.axis,g=f.options,k={},m=this.pos,t=this.type,h=l(this.tickmarkOffset,f.tickmarkOffset),d=f.chart.renderer,b=this.gridLine,p=g.gridLineWidth,G=g.gridLineColor,y=g.gridLineDashStyle;"minor"===this.type&&(p=g.minorGridLineWidth,G=g.minorGridLineColor,
y=g.minorGridLineDashStyle);b||(f.chart.styledMode||(k.stroke=G,k["stroke-width"]=p||0,k.dashstyle=y),t||(k.zIndex=1),c&&(a=0),this.gridLine=b=d.path().attr(k).addClass("highcharts-"+(t?t+"-":"")+"grid-line").add(f.gridGroup));if(b&&(e=f.getPlotLinePath({value:m+h,lineWidth:b.strokeWidth()*e,force:"pass",old:c})))b[c||this.isNew?"attr":"animate"]({d:e,opacity:a})};f.prototype.renderMark=function(c,a,e){var f=this.axis,g=f.options,k=f.chart.renderer,m=this.type,t=f.tickSize(m?m+"Tick":"tick"),h=c.x;
c=c.y;var d=l(g["minor"!==m?"tickWidth":"minorTickWidth"],!m&&f.isXAxis?1:0);g=g["minor"!==m?"tickColor":"minorTickColor"];var b=this.mark,p=!b;t&&(f.opposite&&(t[0]=-t[0]),b||(this.mark=b=k.path().addClass("highcharts-"+(m?m+"-":"")+"tick").add(f.axisGroup),f.chart.styledMode||b.attr({stroke:g,"stroke-width":d})),b[p?"attr":"animate"]({d:this.getMarkPath(h,c,t[0],b.strokeWidth()*e,f.horiz,k),opacity:a}))};f.prototype.renderLabel=function(c,a,e,f){var k=this.axis,m=k.horiz,q=k.options,t=this.label,
h=q.labels,d=h.step;k=l(this.tickmarkOffset,k.tickmarkOffset);var b=c.x;c=c.y;var p=!0;t&&g(b)&&(t.xy=c=this.getLabelPosition(b,c,t,m,h,k,f,d),this.isFirst&&!this.isLast&&!q.showFirstLabel||this.isLast&&!this.isFirst&&!q.showLastLabel?p=!1:!m||h.step||h.rotation||a||0===e||this.handleOverflow(c),d&&f%d&&(p=!1),p&&g(c.y)?(c.opacity=e,t[this.isNewLabel?"attr":"animate"](c),this.isNewLabel=!1):(t.attr("y",-9999),this.isNewLabel=!0))};f.prototype.replaceMovedLabel=function(){var c=this.label,a=this.axis,
e=a.reversed;if(c&&!this.isNew){var f=a.horiz?e?a.left:a.width+a.left:c.xy.x;e=a.horiz?c.xy.y:e?a.width+a.top:a.top;c.animate({x:f,y:e,opacity:0},void 0,c.destroy);delete this.label}a.isDirty=!0;this.label=this.movedLabel;delete this.movedLabel};return f}();"";return w});M(a,"Core/Axis/Axis.js",[a["Core/Animation/AnimationUtilities.js"],a["Core/Axis/AxisDefaults.js"],a["Core/Color/Color.js"],a["Core/Color/Palette.js"],a["Core/DefaultOptions.js"],a["Core/Foundation.js"],a["Core/Globals.js"],a["Core/Axis/Tick.js"],
a["Core/Utilities.js"]],function(a,w,C,E,z,x,J,u,n){var m=a.animObject,g=z.defaultOptions,c=x.registerEventOptions,e=J.deg2rad,l=n.arrayMax,f=n.arrayMin,v=n.clamp,q=n.correctFloat,k=n.defined,r=n.destroyObjectProperties,D=n.erase,B=n.error,O=n.extend,t=n.fireEvent,h=n.getMagnitude,d=n.isArray,b=n.isNumber,p=n.isString,G=n.merge,y=n.normalizeTickInterval,L=n.objectEach,F=n.pick,P=n.relativeLength,S=n.removeEvent,Q=n.splat,V=n.syncTimeout;a=function(){function a(b,a){this.zoomEnabled=this.width=this.visible=
this.userOptions=this.translationSlope=this.transB=this.transA=this.top=this.ticks=this.tickRotCorr=this.tickPositions=this.tickmarkOffset=this.tickInterval=this.tickAmount=this.side=this.series=this.right=this.positiveValuesOnly=this.pos=this.pointRangePadding=this.pointRange=this.plotLinesAndBandsGroups=this.plotLinesAndBands=this.paddedTicks=this.overlap=this.options=this.offset=this.names=this.minPixelPadding=this.minorTicks=this.minorTickInterval=this.min=this.maxLabelLength=this.max=this.len=
this.left=this.labelFormatter=this.labelEdge=this.isLinked=this.height=this.hasVisibleSeries=this.hasNames=this.eventOptions=this.coll=this.closestPointRange=this.chart=this.categories=this.bottom=this.alternateBands=void 0;this.init(b,a)}a.prototype.init=function(a,d){var h=d.isX;this.chart=a;this.horiz=a.inverted&&!this.isZAxis?!h:h;this.isXAxis=h;this.coll=this.coll||(h?"xAxis":"yAxis");t(this,"init",{userOptions:d});this.opposite=F(d.opposite,this.opposite);this.side=F(d.side,this.side,this.horiz?
this.opposite?0:2:this.opposite?1:3);this.setOptions(d);var e=this.options,f=e.labels,p=e.type;this.userOptions=d;this.minPixelPadding=0;this.reversed=F(e.reversed,this.reversed);this.visible=e.visible;this.zoomEnabled=e.zoomEnabled;this.hasNames="category"===p||!0===e.categories;this.categories=e.categories||this.hasNames;this.names||(this.names=[],this.names.keys={});this.plotLinesAndBandsGroups={};this.positiveValuesOnly=!!this.logarithmic;this.isLinked=k(e.linkedTo);this.ticks={};this.labelEdge=
[];this.minorTicks={};this.plotLinesAndBands=[];this.alternateBands={};this.len=0;this.minRange=this.userMinRange=e.minRange||e.maxZoom;this.range=e.range;this.offset=e.offset||0;this.min=this.max=null;d=F(e.crosshair,Q(a.options.tooltip.crosshairs)[h?0:1]);this.crosshair=!0===d?{}:d;-1===a.axes.indexOf(this)&&(h?a.axes.splice(a.xAxis.length,0,this):a.axes.push(this),a[this.coll].push(this));this.series=this.series||[];a.inverted&&!this.isZAxis&&h&&"undefined"===typeof this.reversed&&(this.reversed=
!0);this.labelRotation=b(f.rotation)?f.rotation:void 0;c(this,e);t(this,"afterInit")};a.prototype.setOptions=function(b){this.options=G(w.defaultXAxisOptions,"yAxis"===this.coll&&w.defaultYAxisOptions,[w.defaultTopAxisOptions,w.defaultRightAxisOptions,w.defaultBottomAxisOptions,w.defaultLeftAxisOptions][this.side],G(g[this.coll],b));t(this,"afterSetOptions",{userOptions:b})};a.prototype.defaultLabelFormatter=function(a){var d=this.axis;a=this.chart.numberFormatter;var c=b(this.value)?this.value:NaN,
e=d.chart.time,h=this.dateTimeLabelFormat,f=g.lang,p=f.numericSymbols;f=f.numericSymbolMagnitude||1E3;var H=d.logarithmic?Math.abs(c):d.tickInterval,y=p&&p.length;if(d.categories)var k=""+this.value;else if(h)k=e.dateFormat(h,c);else if(y&&1E3<=H)for(;y--&&"undefined"===typeof k;)d=Math.pow(f,y+1),H>=d&&0===10*c%d&&null!==p[y]&&0!==c&&(k=a(c/d,-1)+p[y]);"undefined"===typeof k&&(k=1E4<=Math.abs(c)?a(c,-1):a(c,-1,void 0,""));return k};a.prototype.getSeriesExtremes=function(){var a=this,d=a.chart,c;
t(this,"getSeriesExtremes",null,function(){a.hasVisibleSeries=!1;a.dataMin=a.dataMax=a.threshold=null;a.softThreshold=!a.isXAxis;a.stacking&&a.stacking.buildStacks();a.series.forEach(function(e){if(e.visible||!d.options.chart.ignoreHiddenSeries){var h=e.options,f=h.threshold;a.hasVisibleSeries=!0;a.positiveValuesOnly&&0>=f&&(f=null);if(a.isXAxis){if(h=e.xData,h.length){h=a.logarithmic?h.filter(a.validatePositiveValue):h;c=e.getXExtremes(h);var p=c.min;var g=c.max;b(p)||p instanceof Date||(h=h.filter(b),
c=e.getXExtremes(h),p=c.min,g=c.max);h.length&&(a.dataMin=Math.min(F(a.dataMin,p),p),a.dataMax=Math.max(F(a.dataMax,g),g))}}else if(e=e.applyExtremes(),b(e.dataMin)&&(p=e.dataMin,a.dataMin=Math.min(F(a.dataMin,p),p)),b(e.dataMax)&&(g=e.dataMax,a.dataMax=Math.max(F(a.dataMax,g),g)),k(f)&&(a.threshold=f),!h.softThreshold||a.positiveValuesOnly)a.softThreshold=!1}})});t(this,"afterGetSeriesExtremes")};a.prototype.translate=function(a,d,c,e,h,f){var p=this.linkedParent||this,g=e&&p.old?p.old.min:p.min,
H=p.minPixelPadding;h=(p.isOrdinal||p.brokenAxis&&p.brokenAxis.hasBreaks||p.logarithmic&&h)&&p.lin2val;var K=1,y=0;e=e&&p.old?p.old.transA:p.transA;e||(e=p.transA);c&&(K*=-1,y=p.len);p.reversed&&(K*=-1,y-=K*(p.sector||p.len));d?(a=(a*K+y-H)/e+g,h&&(a=p.lin2val(a))):(h&&(a=p.val2lin(a)),a=b(g)?K*(a-g)*e+y+K*H+(b(f)?e*f:0):void 0);return a};a.prototype.toPixels=function(b,a){return this.translate(b,!1,!this.horiz,null,!0)+(a?0:this.pos)};a.prototype.toValue=function(b,a){return this.translate(b-(a?
0:this.pos),!0,!this.horiz,null,!0)};a.prototype.getPlotLinePath=function(a){function d(b,a,d){if("pass"!==m&&b<a||b>d)m?b=v(b,a,d):r=!0;return b}var c=this,e=c.chart,h=c.left,f=c.top,p=a.old,g=a.value,H=a.lineWidth,y=p&&e.oldChartHeight||e.chartHeight,k=p&&e.oldChartWidth||e.chartWidth,G=c.transB,l=a.translatedValue,m=a.force,L,q,n,B,r;a={value:g,lineWidth:H,old:p,force:m,acrossPanes:a.acrossPanes,translatedValue:l};t(this,"getPlotLinePath",a,function(a){l=F(l,c.translate(g,null,null,p));l=v(l,-1E5,
1E5);L=n=Math.round(l+G);q=B=Math.round(y-l-G);b(l)?c.horiz?(q=f,B=y-c.bottom,L=n=d(L,h,h+c.width)):(L=h,n=k-c.right,q=B=d(q,f,f+c.height)):(r=!0,m=!1);a.path=r&&!m?null:e.renderer.crispLine([["M",L,q],["L",n,B]],H||1)});return a.path};a.prototype.getLinearTickPositions=function(b,a,d){var c=q(Math.floor(a/b)*b);d=q(Math.ceil(d/b)*b);var e=[],h;q(c+b)===c&&(h=20);if(this.single)return[a];for(a=c;a<=d;){e.push(a);a=q(a+b,h);if(a===f)break;var f=a}return e};a.prototype.getMinorTickInterval=function(){var b=
this.options;return!0===b.minorTicks?F(b.minorTickInterval,"auto"):!1===b.minorTicks?null:b.minorTickInterval};a.prototype.getMinorTickPositions=function(){var b=this.options,a=this.tickPositions,d=this.minorTickInterval,c=this.pointRangePadding||0,e=this.min-c;c=this.max+c;var h=c-e,f=[];if(h&&h/d<this.len/3){var p=this.logarithmic;if(p)this.paddedTicks.forEach(function(b,a,c){a&&f.push.apply(f,p.getLogTickPositions(d,c[a-1],c[a],!0))});else if(this.dateTime&&"auto"===this.getMinorTickInterval())f=
f.concat(this.getTimeTicks(this.dateTime.normalizeTimeTickInterval(d),e,c,b.startOfWeek));else for(b=e+(a[0]-e)%d;b<=c&&b!==f[0];b+=d)f.push(b)}0!==f.length&&this.trimTicks(f);return f};a.prototype.adjustForMinRange=function(){var b=this.options,a=this.logarithmic,d=this.min,c=this.max,e=0,h,p,g,y;this.isXAxis&&"undefined"===typeof this.minRange&&!a&&(k(b.min)||k(b.max)?this.minRange=null:(this.series.forEach(function(b){g=b.xData;y=b.xIncrement?1:g.length-1;if(1<g.length)for(h=y;0<h;h--)if(p=g[h]-
g[h-1],!e||p<e)e=p}),this.minRange=Math.min(5*e,this.dataMax-this.dataMin)));if(c-d<this.minRange){var G=this.dataMax-this.dataMin>=this.minRange;var t=this.minRange;var m=(t-c+d)/2;m=[d-m,F(b.min,d-m)];G&&(m[2]=this.logarithmic?this.logarithmic.log2lin(this.dataMin):this.dataMin);d=l(m);c=[d+t,F(b.max,d+t)];G&&(c[2]=a?a.log2lin(this.dataMax):this.dataMax);c=f(c);c-d<t&&(m[0]=c-t,m[1]=F(b.min,c-t),d=l(m))}this.min=d;this.max=c};a.prototype.getClosest=function(){var b;this.categories?b=1:this.series.forEach(function(a){var d=
a.closestPointRange,c=a.visible||!a.chart.options.chart.ignoreHiddenSeries;!a.noSharedTooltip&&k(d)&&c&&(b=k(b)?Math.min(b,d):d)});return b};a.prototype.nameToX=function(b){var a=d(this.categories),c=a?this.categories:this.names,e=b.options.x;b.series.requireSorting=!1;k(e)||(e=this.options.uniqueNames?a?c.indexOf(b.name):F(c.keys[b.name],-1):b.series.autoIncrement());if(-1===e){if(!a)var h=c.length}else h=e;"undefined"!==typeof h&&(this.names[h]=b.name,this.names.keys[b.name]=h);return h};a.prototype.updateNames=
function(){var b=this,a=this.names;0<a.length&&(Object.keys(a.keys).forEach(function(b){delete a.keys[b]}),a.length=0,this.minRange=this.userMinRange,(this.series||[]).forEach(function(a){a.xIncrement=null;if(!a.points||a.isDirtyData)b.max=Math.max(b.max,a.xData.length-1),a.processData(),a.generatePoints();a.data.forEach(function(d,c){if(d&&d.options&&"undefined"!==typeof d.name){var e=b.nameToX(d);"undefined"!==typeof e&&e!==d.x&&(d.x=e,a.xData[c]=e)}})}))};a.prototype.setAxisTranslation=function(){var b=
this,a=b.max-b.min,d=b.linkedParent,c=!!b.categories,e=b.isXAxis,h=b.axisPointRange||0,f=0,g=0,y=b.transA;if(e||c||h){var k=b.getClosest();d?(f=d.minPointOffset,g=d.pointRangePadding):b.series.forEach(function(a){var d=c?1:e?F(a.options.pointRange,k,0):b.axisPointRange||0,A=a.options.pointPlacement;h=Math.max(h,d);if(!b.single||c)a=a.is("xrange")?!e:e,f=Math.max(f,a&&p(A)?0:d/2),g=Math.max(g,a&&"on"===A?0:d)});d=b.ordinal&&b.ordinal.slope&&k?b.ordinal.slope/k:1;b.minPointOffset=f*=d;b.pointRangePadding=
g*=d;b.pointRange=Math.min(h,b.single&&c?1:a);e&&(b.closestPointRange=k)}b.translationSlope=b.transA=y=b.staticScale||b.len/(a+g||1);b.transB=b.horiz?b.left:b.bottom;b.minPixelPadding=y*f;t(this,"afterSetAxisTranslation")};a.prototype.minFromRange=function(){return this.max-this.range};a.prototype.setTickInterval=function(a){var d=this,c=d.chart,e=d.logarithmic,f=d.options,p=d.isXAxis,g=d.isLinked,l=f.tickPixelInterval,G=d.categories,H=d.softThreshold,m=f.maxPadding,L=f.minPadding,n=f.tickInterval,
v=b(d.threshold)?d.threshold:null;d.dateTime||G||g||this.getTickAmount();var r=F(d.userMin,f.min);var P=F(d.userMax,f.max);if(g){d.linkedParent=c[d.coll][f.linkedTo];var D=d.linkedParent.getExtremes();d.min=F(D.min,D.dataMin);d.max=F(D.max,D.dataMax);f.type!==d.linkedParent.options.type&&B(11,1,c)}else{if(H&&k(v))if(d.dataMin>=v)D=v,L=0;else if(d.dataMax<=v){var I=v;m=0}d.min=F(r,D,d.dataMin);d.max=F(P,I,d.dataMax)}e&&(d.positiveValuesOnly&&!a&&0>=Math.min(d.min,F(d.dataMin,d.min))&&B(10,1,c),d.min=
q(e.log2lin(d.min),16),d.max=q(e.log2lin(d.max),16));d.range&&k(d.max)&&(d.userMin=d.min=r=Math.max(d.dataMin,d.minFromRange()),d.userMax=P=d.max,d.range=null);t(d,"foundExtremes");d.beforePadding&&d.beforePadding();d.adjustForMinRange();!(G||d.axisPointRange||d.stacking&&d.stacking.usePercentage||g)&&k(d.min)&&k(d.max)&&(c=d.max-d.min)&&(!k(r)&&L&&(d.min-=c*L),!k(P)&&m&&(d.max+=c*m));b(d.userMin)||(b(f.softMin)&&f.softMin<d.min&&(d.min=r=f.softMin),b(f.floor)&&(d.min=Math.max(d.min,f.floor)));b(d.userMax)||
(b(f.softMax)&&f.softMax>d.max&&(d.max=P=f.softMax),b(f.ceiling)&&(d.max=Math.min(d.max,f.ceiling)));H&&k(d.dataMin)&&(v=v||0,!k(r)&&d.min<v&&d.dataMin>=v?d.min=d.options.minRange?Math.min(v,d.max-d.minRange):v:!k(P)&&d.max>v&&d.dataMax<=v&&(d.max=d.options.minRange?Math.max(v,d.min+d.minRange):v));b(d.min)&&b(d.max)&&!this.chart.polar&&d.min>d.max&&(k(d.options.min)?d.max=d.min:k(d.options.max)&&(d.min=d.max));d.tickInterval=d.min===d.max||"undefined"===typeof d.min||"undefined"===typeof d.max?1:
g&&d.linkedParent&&!n&&l===d.linkedParent.options.tickPixelInterval?n=d.linkedParent.tickInterval:F(n,this.tickAmount?(d.max-d.min)/Math.max(this.tickAmount-1,1):void 0,G?1:(d.max-d.min)*l/Math.max(d.len,l));p&&!a&&(d.series.forEach(function(b){b.forceCrop=b.forceCropping&&b.forceCropping();b.processData(d.min!==(d.old&&d.old.min)||d.max!==(d.old&&d.old.max))}),t(this,"postProcessData"));d.setAxisTranslation();t(this,"initialAxisTranslation");d.pointRange&&!n&&(d.tickInterval=Math.max(d.pointRange,
d.tickInterval));a=F(f.minTickInterval,d.dateTime&&!d.series.some(function(b){return b.noSharedTooltip})?d.closestPointRange:0);!n&&d.tickInterval<a&&(d.tickInterval=a);d.dateTime||d.logarithmic||n||(d.tickInterval=y(d.tickInterval,void 0,h(d.tickInterval),F(f.allowDecimals,.5>d.tickInterval||void 0!==this.tickAmount),!!this.tickAmount));this.tickAmount||(d.tickInterval=d.unsquish());this.setTickPositions()};a.prototype.setTickPositions=function(){var b=this.options,d=b.tickPositions,a=this.getMinorTickInterval(),
c=this.hasVerticalPanning(),e="colorAxis"===this.coll,h=(e||!c)&&b.startOnTick;c=(e||!c)&&b.endOnTick;e=b.tickPositioner;this.tickmarkOffset=this.categories&&"between"===b.tickmarkPlacement&&1===this.tickInterval?.5:0;this.minorTickInterval="auto"===a&&this.tickInterval?this.tickInterval/5:a;this.single=this.min===this.max&&k(this.min)&&!this.tickAmount&&(parseInt(this.min,10)===this.min||!1!==b.allowDecimals);this.tickPositions=a=d&&d.slice();!a&&(this.ordinal&&this.ordinal.positions||!((this.max-
this.min)/this.tickInterval>Math.max(2*this.len,200))?a=this.dateTime?this.getTimeTicks(this.dateTime.normalizeTimeTickInterval(this.tickInterval,b.units),this.min,this.max,b.startOfWeek,this.ordinal&&this.ordinal.positions,this.closestPointRange,!0):this.logarithmic?this.logarithmic.getLogTickPositions(this.tickInterval,this.min,this.max):this.getLinearTickPositions(this.tickInterval,this.min,this.max):(a=[this.min,this.max],B(19,!1,this.chart)),a.length>this.len&&(a=[a[0],a.pop()],a[0]===a[1]&&
(a.length=1)),this.tickPositions=a,e&&(e=e.apply(this,[this.min,this.max])))&&(this.tickPositions=a=e);this.paddedTicks=a.slice(0);this.trimTicks(a,h,c);this.isLinked||(this.single&&2>a.length&&!this.categories&&!this.series.some(function(b){return b.is("heatmap")&&"between"===b.options.pointPlacement})&&(this.min-=.5,this.max+=.5),d||e||this.adjustTickAmount());t(this,"afterSetTickPositions")};a.prototype.trimTicks=function(b,d,a){var c=b[0],e=b[b.length-1],h=!this.isOrdinal&&this.minPointOffset||
0;t(this,"trimTicks");if(!this.isLinked){if(d&&-Infinity!==c)this.min=c;else for(;this.min-h>b[0];)b.shift();if(a)this.max=e;else for(;this.max+h<b[b.length-1];)b.pop();0===b.length&&k(c)&&!this.options.tickPositions&&b.push((e+c)/2)}};a.prototype.alignToOthers=function(){var b={},d=this.options,a;!1!==this.chart.options.chart.alignTicks&&d.alignTicks&&!1!==d.startOnTick&&!1!==d.endOnTick&&!this.logarithmic&&this.chart[this.coll].forEach(function(d){var c=d.options;c=[d.horiz?c.left:c.top,c.width,
c.height,c.pane].join();d.series.length&&(b[c]?a=!0:b[c]=1)});return a};a.prototype.getTickAmount=function(){var b=this.options,d=b.tickPixelInterval,a=b.tickAmount;!k(b.tickInterval)&&!a&&this.len<d&&!this.isRadial&&!this.logarithmic&&b.startOnTick&&b.endOnTick&&(a=2);!a&&this.alignToOthers()&&(a=Math.ceil(this.len/d)+1);4>a&&(this.finalTickAmt=a,a=5);this.tickAmount=a};a.prototype.adjustTickAmount=function(){var d=this.options,a=this.tickInterval,c=this.tickPositions,e=this.tickAmount,h=this.finalTickAmt,
f=c&&c.length,p=F(this.threshold,this.softThreshold?0:null);if(this.hasData()&&b(this.min)&&b(this.max)){if(f<e){for(;c.length<e;)c.length%2||this.min===p?c.push(q(c[c.length-1]+a)):c.unshift(q(c[0]-a));this.transA*=(f-1)/(e-1);this.min=d.startOnTick?c[0]:Math.min(this.min,c[0]);this.max=d.endOnTick?c[c.length-1]:Math.max(this.max,c[c.length-1])}else f>e&&(this.tickInterval*=2,this.setTickPositions());if(k(h)){for(a=d=c.length;a--;)(3===h&&1===a%2||2>=h&&0<a&&a<d-1)&&c.splice(a,1);this.finalTickAmt=
void 0}}};a.prototype.setScale=function(){var b=!1,d=!1;this.series.forEach(function(a){b=b||a.isDirtyData||a.isDirty;d=d||a.xAxis&&a.xAxis.isDirty||!1});this.setAxisSize();var a=this.len!==(this.old&&this.old.len);a||b||d||this.isLinked||this.forceRedraw||this.userMin!==(this.old&&this.old.userMin)||this.userMax!==(this.old&&this.old.userMax)||this.alignToOthers()?(this.stacking&&this.stacking.resetStacks(),this.forceRedraw=!1,this.getSeriesExtremes(),this.setTickInterval(),this.isDirty||(this.isDirty=
a||this.min!==(this.old&&this.old.min)||this.max!==(this.old&&this.old.max))):this.stacking&&this.stacking.cleanStacks();b&&this.panningState&&(this.panningState.isDirty=!0);t(this,"afterSetScale")};a.prototype.setExtremes=function(b,d,a,c,e){var h=this,f=h.chart;a=F(a,!0);h.series.forEach(function(b){delete b.kdTree});e=O(e,{min:b,max:d});t(h,"setExtremes",e,function(){h.userMin=b;h.userMax=d;h.eventArgs=e;a&&f.redraw(c)})};a.prototype.zoom=function(b,d){var a=this,c=this.dataMin,e=this.dataMax,
h=this.options,f=Math.min(c,F(h.min,c)),p=Math.max(e,F(h.max,e));b={newMin:b,newMax:d};t(this,"zoom",b,function(b){var d=b.newMin,h=b.newMax;if(d!==a.min||h!==a.max)a.allowZoomOutside||(k(c)&&(d<f&&(d=f),d>p&&(d=p)),k(e)&&(h<f&&(h=f),h>p&&(h=p))),a.displayBtn="undefined"!==typeof d||"undefined"!==typeof h,a.setExtremes(d,h,!1,void 0,{trigger:"zoom"});b.zoomed=!0});return b.zoomed};a.prototype.setAxisSize=function(){var b=this.chart,d=this.options,a=d.offsets||[0,0,0,0],c=this.horiz,e=this.width=Math.round(P(F(d.width,
b.plotWidth-a[3]+a[1]),b.plotWidth)),h=this.height=Math.round(P(F(d.height,b.plotHeight-a[0]+a[2]),b.plotHeight)),f=this.top=Math.round(P(F(d.top,b.plotTop+a[0]),b.plotHeight,b.plotTop));d=this.left=Math.round(P(F(d.left,b.plotLeft+a[3]),b.plotWidth,b.plotLeft));this.bottom=b.chartHeight-h-f;this.right=b.chartWidth-e-d;this.len=Math.max(c?e:h,0);this.pos=c?d:f};a.prototype.getExtremes=function(){var b=this.logarithmic;return{min:b?q(b.lin2log(this.min)):this.min,max:b?q(b.lin2log(this.max)):this.max,
dataMin:this.dataMin,dataMax:this.dataMax,userMin:this.userMin,userMax:this.userMax}};a.prototype.getThreshold=function(b){var d=this.logarithmic,a=d?d.lin2log(this.min):this.min;d=d?d.lin2log(this.max):this.max;null===b||-Infinity===b?b=a:Infinity===b?b=d:a>b?b=a:d<b&&(b=d);return this.translate(b,0,1,0,1)};a.prototype.autoLabelAlign=function(b){var d=(F(b,0)-90*this.side+720)%360;b={align:"center"};t(this,"autoLabelAlign",b,function(b){15<d&&165>d?b.align="right":195<d&&345>d&&(b.align="left")});
return b.align};a.prototype.tickSize=function(b){var d=this.options,a=F(d["tick"===b?"tickWidth":"minorTickWidth"],"tick"===b&&this.isXAxis&&!this.categories?1:0),c=d["tick"===b?"tickLength":"minorTickLength"];if(a&&c){"inside"===d[b+"Position"]&&(c=-c);var e=[c,a]}b={tickSize:e};t(this,"afterTickSize",b);return b.tickSize};a.prototype.labelMetrics=function(){var b=this.tickPositions&&this.tickPositions[0]||0;return this.chart.renderer.fontMetrics(this.options.labels.style.fontSize,this.ticks[b]&&
this.ticks[b].label)};a.prototype.unsquish=function(){var d=this.options.labels,a=this.horiz,c=this.tickInterval,h=this.len/(((this.categories?1:0)+this.max-this.min)/c),f=d.rotation,p=this.labelMetrics(),g=Math.max(this.max-this.min,0),y=function(b){var d=b/(h||1);d=1<d?Math.ceil(d):1;d*c>g&&Infinity!==b&&Infinity!==h&&g&&(d=Math.ceil(g/c));return q(d*c)},k=c,l,G,t=Number.MAX_VALUE;if(a){if(!d.staggerLines&&!d.step)if(b(f))var m=[f];else h<d.autoRotationLimit&&(m=d.autoRotation);m&&m.forEach(function(b){if(b===
f||b&&-90<=b&&90>=b){G=y(Math.abs(p.h/Math.sin(e*b)));var d=G+Math.abs(b/360);d<t&&(t=d,l=b,k=G)}})}else d.step||(k=y(p.h));this.autoRotation=m;this.labelRotation=F(l,b(f)?f:0);return k};a.prototype.getSlotWidth=function(d){var a=this.chart,c=this.horiz,e=this.options.labels,h=Math.max(this.tickPositions.length-(this.categories?0:1),1),f=a.margin[3];if(d&&b(d.slotWidth))return d.slotWidth;if(c&&2>e.step)return e.rotation?0:(this.staggerLines||1)*this.len/h;if(!c){d=e.style.width;if(void 0!==d)return parseInt(String(d),
10);if(f)return f-a.spacing[3]}return.33*a.chartWidth};a.prototype.renderUnsquish=function(){var b=this.chart,d=b.renderer,a=this.tickPositions,c=this.ticks,e=this.options.labels,h=e.style,f=this.horiz,g=this.getSlotWidth(),y=Math.max(1,Math.round(g-2*e.padding)),k={},G=this.labelMetrics(),l=h.textOverflow,t=0;p(e.rotation)||(k.rotation=e.rotation||0);a.forEach(function(b){b=c[b];b.movedLabel&&b.replaceMovedLabel();b&&b.label&&b.label.textPxLength>t&&(t=b.label.textPxLength)});this.maxLabelLength=
t;if(this.autoRotation)t>y&&t>G.h?k.rotation=this.labelRotation:this.labelRotation=0;else if(g){var m=y;if(!l){var F="clip";for(y=a.length;!f&&y--;){var L=a[y];if(L=c[L].label)L.styles&&"ellipsis"===L.styles.textOverflow?L.css({textOverflow:"clip"}):L.textPxLength>g&&L.css({width:g+"px"}),L.getBBox().height>this.len/a.length-(G.h-G.f)&&(L.specificTextOverflow="ellipsis")}}}k.rotation&&(m=t>.5*b.chartHeight?.33*b.chartHeight:t,l||(F="ellipsis"));if(this.labelAlign=e.align||this.autoLabelAlign(this.labelRotation))k.align=
this.labelAlign;a.forEach(function(b){var d=(b=c[b])&&b.label,a=h.width,e={};d&&(d.attr(k),b.shortenLabel?b.shortenLabel():m&&!a&&"nowrap"!==h.whiteSpace&&(m<d.textPxLength||"SPAN"===d.element.tagName)?(e.width=m+"px",l||(e.textOverflow=d.specificTextOverflow||F),d.css(e)):d.styles&&d.styles.width&&!e.width&&!a&&d.css({width:null}),delete d.specificTextOverflow,b.rotation=k.rotation)},this);this.tickRotCorr=d.rotCorr(G.b,this.labelRotation||0,0!==this.side)};a.prototype.hasData=function(){return this.series.some(function(b){return b.hasData()})||
this.options.showEmpty&&k(this.min)&&k(this.max)};a.prototype.addTitle=function(b){var d=this.chart.renderer,a=this.horiz,c=this.opposite,e=this.options.title,h=this.chart.styledMode,f;this.axisTitle||((f=e.textAlign)||(f=(a?{low:"left",middle:"center",high:"right"}:{low:c?"right":"left",middle:"center",high:c?"left":"right"})[e.align]),this.axisTitle=d.text(e.text||"",0,0,e.useHTML).attr({zIndex:7,rotation:e.rotation,align:f}).addClass("highcharts-axis-title"),h||this.axisTitle.css(G(e.style)),this.axisTitle.add(this.axisGroup),
this.axisTitle.isNew=!0);h||e.style.width||this.isRadial||this.axisTitle.css({width:this.len+"px"});this.axisTitle[b?"show":"hide"](b)};a.prototype.generateTick=function(b){var d=this.ticks;d[b]?d[b].addLabel():d[b]=new u(this,b)};a.prototype.getOffset=function(){var b=this,d=this,a=d.chart,c=a.renderer,e=d.options,h=d.tickPositions,f=d.ticks,p=d.horiz,g=d.side,y=a.inverted&&!d.isZAxis?[1,0,3,2][g]:g,G=d.hasData(),l=e.title,m=e.labels,q=a.axisOffset;a=a.clipOffset;var v=[-1,1,1,-1][g],n=e.className,
B=d.axisParent,r,P=0,D=0,ca=0;d.showAxis=r=G||e.showEmpty;d.staggerLines=d.horiz&&m.staggerLines||void 0;if(!d.axisGroup){var ia=function(d,a,e){return c.g(d).attr({zIndex:e}).addClass("highcharts-"+b.coll.toLowerCase()+a+" "+(b.isRadial?"highcharts-radial-axis"+a+" ":"")+(n||"")).add(B)};d.gridGroup=ia("grid","-grid",e.gridZIndex);d.axisGroup=ia("axis","",e.zIndex);d.labelGroup=ia("axis-labels","-labels",m.zIndex)}G||d.isLinked?(h.forEach(function(b){d.generateTick(b)}),d.renderUnsquish(),d.reserveSpaceDefault=
0===g||2===g||{1:"left",3:"right"}[g]===d.labelAlign,F(m.reserveSpace,"center"===d.labelAlign?!0:null,d.reserveSpaceDefault)&&h.forEach(function(b){ca=Math.max(f[b].getLabelSize(),ca)}),d.staggerLines&&(ca*=d.staggerLines),d.labelOffset=ca*(d.opposite?-1:1)):L(f,function(b,d){b.destroy();delete f[d]});if(l&&l.text&&!1!==l.enabled&&(d.addTitle(r),r&&!1!==l.reserveSpace)){d.titleOffset=P=d.axisTitle.getBBox()[p?"height":"width"];var I=l.offset;D=k(I)?0:F(l.margin,p?5:10)}d.renderLine();d.offset=v*F(e.offset,
q[g]?q[g]+(e.margin||0):0);d.tickRotCorr=d.tickRotCorr||{x:0,y:0};l=0===g?-d.labelMetrics().h:2===g?d.tickRotCorr.y:0;G=Math.abs(ca)+D;ca&&(G=G-l+v*(p?F(m.y,d.tickRotCorr.y+8*v):m.x));d.axisTitleMargin=F(I,G);d.getMaxLabelDimensions&&(d.maxLabelDimensions=d.getMaxLabelDimensions(f,h));p=this.tickSize("tick");q[g]=Math.max(q[g],(d.axisTitleMargin||0)+P+v*d.offset,G,h&&h.length&&p?p[0]+v*d.offset:0);e=e.offset?0:2*Math.floor(d.axisLine.strokeWidth()/2);a[y]=Math.max(a[y],e);t(this,"afterGetOffset")};
a.prototype.getLinePath=function(b){var d=this.chart,a=this.opposite,c=this.offset,e=this.horiz,h=this.left+(a?this.width:0)+c;c=d.chartHeight-this.bottom-(a?this.height:0)+c;a&&(b*=-1);return d.renderer.crispLine([["M",e?this.left:h,e?c:this.top],["L",e?d.chartWidth-this.right:h,e?c:d.chartHeight-this.bottom]],b)};a.prototype.renderLine=function(){this.axisLine||(this.axisLine=this.chart.renderer.path().addClass("highcharts-axis-line").add(this.axisGroup),this.chart.styledMode||this.axisLine.attr({stroke:this.options.lineColor,
"stroke-width":this.options.lineWidth,zIndex:7}))};a.prototype.getTitlePosition=function(){var b=this.horiz,d=this.left,a=this.top,c=this.len,e=this.options.title,h=b?d:a,f=this.opposite,p=this.offset,g=e.x,y=e.y,k=this.axisTitle,G=this.chart.renderer.fontMetrics(e.style.fontSize,k);k=Math.max(k.getBBox(null,0).height-G.h-1,0);c={low:h+(b?0:c),middle:h+c/2,high:h+(b?c:0)}[e.align];d=(b?a+this.height:d)+(b?1:-1)*(f?-1:1)*this.axisTitleMargin+[-k,k,G.f,-k][this.side];b={x:b?c+g:d+(f?this.width:0)+p+
g,y:b?d+y-(f?this.height:0)+p:c+y};t(this,"afterGetTitlePosition",{titlePosition:b});return b};a.prototype.renderMinorTick=function(b,d){var a=this.minorTicks;a[b]||(a[b]=new u(this,b,"minor"));d&&a[b].isNew&&a[b].render(null,!0);a[b].render(null,!1,1)};a.prototype.renderTick=function(b,d,a){var c=this.ticks;if(!this.isLinked||b>=this.min&&b<=this.max||this.grid&&this.grid.isColumn)c[b]||(c[b]=new u(this,b)),a&&c[b].isNew&&c[b].render(d,!0,-1),c[b].render(d)};a.prototype.render=function(){var d=this,
a=d.chart,c=d.logarithmic,e=d.options,h=d.isLinked,f=d.tickPositions,p=d.axisTitle,g=d.ticks,y=d.minorTicks,k=d.alternateBands,G=e.stackLabels,l=e.alternateGridColor,F=d.tickmarkOffset,q=d.axisLine,v=d.showAxis,n=m(a.renderer.globalAnimation),B,r;d.labelEdge.length=0;d.overlap=!1;[g,y,k].forEach(function(b){L(b,function(b){b.isActive=!1})});if(d.hasData()||h){var P=d.chart.hasRendered&&d.old&&b(d.old.min);d.minorTickInterval&&!d.categories&&d.getMinorTickPositions().forEach(function(b){d.renderMinorTick(b,
P)});f.length&&(f.forEach(function(b,a){d.renderTick(b,a,P)}),F&&(0===d.min||d.single)&&(g[-1]||(g[-1]=new u(d,-1,null,!0)),g[-1].render(-1)));l&&f.forEach(function(b,e){r="undefined"!==typeof f[e+1]?f[e+1]+F:d.max-F;0===e%2&&b<d.max&&r<=d.max+(a.polar?-F:F)&&(k[b]||(k[b]=new J.PlotLineOrBand(d)),B=b+F,k[b].options={from:c?c.lin2log(B):B,to:c?c.lin2log(r):r,color:l,className:"highcharts-alternate-grid"},k[b].render(),k[b].isActive=!0)});d._addedPlotLB||(d._addedPlotLB=!0,(e.plotLines||[]).concat(e.plotBands||
[]).forEach(function(b){d.addPlotBandOrLine(b)}))}[g,y,k].forEach(function(b){var d=[],c=n.duration;L(b,function(b,a){b.isActive||(b.render(a,!1,0),b.isActive=!1,d.push(a))});V(function(){for(var a=d.length;a--;)b[d[a]]&&!b[d[a]].isActive&&(b[d[a]].destroy(),delete b[d[a]])},b!==k&&a.hasRendered&&c?c:0)});q&&(q[q.isPlaced?"animate":"attr"]({d:this.getLinePath(q.strokeWidth())}),q.isPlaced=!0,q[v?"show":"hide"](v));p&&v&&(e=d.getTitlePosition(),b(e.y)?(p[p.isNew?"attr":"animate"](e),p.isNew=!1):(p.attr("y",
-9999),p.isNew=!0));G&&G.enabled&&d.stacking&&d.stacking.renderStackTotals();d.old={len:d.len,max:d.max,min:d.min,transA:d.transA,userMax:d.userMax,userMin:d.userMin};d.isDirty=!1;t(this,"afterRender")};a.prototype.redraw=function(){this.visible&&(this.render(),this.plotLinesAndBands.forEach(function(b){b.render()}));this.series.forEach(function(b){b.isDirty=!0})};a.prototype.getKeepProps=function(){return this.keepProps||a.keepProps};a.prototype.destroy=function(b){var d=this,a=d.plotLinesAndBands,
c=this.eventOptions;t(this,"destroy",{keepEvents:b});b||S(d);[d.ticks,d.minorTicks,d.alternateBands].forEach(function(b){r(b)});if(a)for(b=a.length;b--;)a[b].destroy();"axisLine axisTitle axisGroup gridGroup labelGroup cross scrollbar".split(" ").forEach(function(b){d[b]&&(d[b]=d[b].destroy())});for(var e in d.plotLinesAndBandsGroups)d.plotLinesAndBandsGroups[e]=d.plotLinesAndBandsGroups[e].destroy();L(d,function(b,a){-1===d.getKeepProps().indexOf(a)&&delete d[a]});this.eventOptions=c};a.prototype.drawCrosshair=
function(b,d){var a=this.crosshair,c=F(a&&a.snap,!0),e=this.chart,h,f=this.cross;t(this,"drawCrosshair",{e:b,point:d});b||(b=this.cross&&this.cross.e);if(a&&!1!==(k(d)||!c)){c?k(d)&&(h=F("colorAxis"!==this.coll?d.crosshairPos:null,this.isXAxis?d.plotX:this.len-d.plotY)):h=b&&(this.horiz?b.chartX-this.pos:this.len-b.chartY+this.pos);if(k(h)){var p={value:d&&(this.isXAxis?d.x:F(d.stackY,d.y)),translatedValue:h};e.polar&&O(p,{isCrosshair:!0,chartX:b&&b.chartX,chartY:b&&b.chartY,point:d});p=this.getPlotLinePath(p)||
null}if(!k(p)){this.hideCrosshair();return}c=this.categories&&!this.isRadial;f||(this.cross=f=e.renderer.path().addClass("highcharts-crosshair highcharts-crosshair-"+(c?"category ":"thin ")+(a.className||"")).attr({zIndex:F(a.zIndex,2)}).add(),e.styledMode||(f.attr({stroke:a.color||(c?C.parse(E.highlightColor20).setOpacity(.25).get():E.neutralColor20),"stroke-width":F(a.width,1)}).css({"pointer-events":"none"}),a.dashStyle&&f.attr({dashstyle:a.dashStyle})));f.show().attr({d:p});c&&!a.width&&f.attr({"stroke-width":this.transA});
this.cross.e=b}else this.hideCrosshair();t(this,"afterDrawCrosshair",{e:b,point:d})};a.prototype.hideCrosshair=function(){this.cross&&this.cross.hide();t(this,"afterHideCrosshair")};a.prototype.hasVerticalPanning=function(){var b=this.chart.options.chart.panning;return!!(b&&b.enabled&&/y/.test(b.type))};a.prototype.validatePositiveValue=function(d){return b(d)&&0<d};a.prototype.update=function(b,d){var a=this.chart;b=G(this.userOptions,b);this.destroy(!0);this.init(a,b);a.isDirtyBox=!0;F(d,!0)&&a.redraw()};
a.prototype.remove=function(b){for(var d=this.chart,a=this.coll,c=this.series,e=c.length;e--;)c[e]&&c[e].remove(!1);D(d.axes,this);D(d[a],this);d[a].forEach(function(b,d){b.options.index=b.userOptions.index=d});this.destroy();d.isDirtyBox=!0;F(b,!0)&&d.redraw()};a.prototype.setTitle=function(b,d){this.update({title:b},d)};a.prototype.setCategories=function(b,d){this.update({categories:b},d)};a.defaultOptions=w.defaultXAxisOptions;a.keepProps="extKey hcEvents names series userMax userMin".split(" ");
return a}();"";return a});M(a,"Core/Axis/DateTimeAxis.js",[a["Core/Utilities.js"]],function(a){var r=a.addEvent,C=a.getMagnitude,E=a.normalizeTickInterval,z=a.timeUnits,x;(function(a){function u(){return this.chart.time.getTimeTicks.apply(this.chart.time,arguments)}function n(a){"datetime"!==a.userOptions.type?this.dateTime=void 0:this.dateTime||(this.dateTime=new g(this))}var m=[];a.compose=function(a){-1===m.indexOf(a)&&(m.push(a),a.keepProps.push("dateTime"),a.prototype.getTimeTicks=u,r(a,"init",
n));return a};var g=function(){function a(a){this.axis=a}a.prototype.normalizeTimeTickInterval=function(a,c){var e=c||[["millisecond",[1,2,5,10,20,25,50,100,200,500]],["second",[1,2,5,10,15,30]],["minute",[1,2,5,10,15,30]],["hour",[1,2,3,4,6,8,12]],["day",[1,2]],["week",[1,2]],["month",[1,2,3,4,6]],["year",null]];c=e[e.length-1];var g=z[c[0]],l=c[1],k;for(k=0;k<e.length&&!(c=e[k],g=z[c[0]],l=c[1],e[k+1]&&a<=(g*l[l.length-1]+z[e[k+1][0]])/2);k++);g===z.year&&a<5*g&&(l=[1,2,5]);a=E(a/g,l,"year"===c[0]?
Math.max(C(a/g),1):1);return{unitRange:g,count:a,unitName:c[0]}};a.prototype.getXDateFormat=function(a,c){var e=this.axis;return e.closestPointRange?e.chart.time.getDateFormat(e.closestPointRange,a,e.options.startOfWeek,c)||c.year:c.day};return a}();a.Additions=g})(x||(x={}));return x});M(a,"Core/Axis/LogarithmicAxis.js",[a["Core/Utilities.js"]],function(a){var r=a.addEvent,C=a.getMagnitude,E=a.normalizeTickInterval,z=a.pick,x;(function(a){function u(a){var c=this.logarithmic;"logarithmic"!==a.userOptions.type?
this.logarithmic=void 0:c||(this.logarithmic=new g(this))}function n(){var a=this.logarithmic;a&&(this.lin2val=function(c){return a.lin2log(c)},this.val2lin=function(c){return a.log2lin(c)})}var m=[];a.compose=function(a){-1===m.indexOf(a)&&(m.push(a),a.keepProps.push("logarithmic"),r(a,"init",u),r(a,"afterInit",n));return a};var g=function(){function a(a){this.axis=a}a.prototype.getLogTickPositions=function(a,c,f,g){var e=this.axis,k=e.len,l=e.options,m=[];g||(this.minorAutoInterval=void 0);if(.5<=
a)a=Math.round(a),m=e.getLinearTickPositions(a,c,f);else if(.08<=a){var n=Math.floor(c),v,t=l=void 0;for(k=.3<a?[1,2,4]:.15<a?[1,2,4,6,8]:[1,2,3,4,5,6,7,8,9];n<f+1&&!t;n++){var h=k.length;for(v=0;v<h&&!t;v++){var d=this.log2lin(this.lin2log(n)*k[v]);d>c&&(!g||l<=f)&&"undefined"!==typeof l&&m.push(l);l>f&&(t=!0);l=d}}}else c=this.lin2log(c),f=this.lin2log(f),a=g?e.getMinorTickInterval():l.tickInterval,a=z("auto"===a?null:a,this.minorAutoInterval,l.tickPixelInterval/(g?5:1)*(f-c)/((g?k/e.tickPositions.length:
k)||1)),a=E(a,void 0,C(a)),m=e.getLinearTickPositions(a,c,f).map(this.log2lin),g||(this.minorAutoInterval=a/5);g||(e.tickInterval=a);return m};a.prototype.lin2log=function(a){return Math.pow(10,a)};a.prototype.log2lin=function(a){return Math.log(a)/Math.LN10};return a}();a.Additions=g})(x||(x={}));return x});M(a,"Core/Axis/PlotLineOrBand/PlotLineOrBandAxis.js",[a["Core/Utilities.js"]],function(a){var r=a.erase,C=a.extend,E=a.isNumber,z;(function(a){var x=[],u;a.compose=function(a,g){u||(u=a);-1===
x.indexOf(g)&&(x.push(g),C(g.prototype,n.prototype));return g};var n=function(){function a(){}a.prototype.getPlotBandPath=function(a,c,e){void 0===e&&(e=this.options);var g=this.getPlotLinePath({value:c,force:!0,acrossPanes:e.acrossPanes}),f=[],m=this.horiz;c=!E(this.min)||!E(this.max)||a<this.min&&c<this.min||a>this.max&&c>this.max;a=this.getPlotLinePath({value:a,force:!0,acrossPanes:e.acrossPanes});e=1;if(a&&g){if(c){var q=a.toString()===g.toString();e=0}for(c=0;c<a.length;c+=2){var k=a[c],n=a[c+
1],r=g[c],B=g[c+1];"M"!==k[0]&&"L"!==k[0]||"M"!==n[0]&&"L"!==n[0]||"M"!==r[0]&&"L"!==r[0]||"M"!==B[0]&&"L"!==B[0]||(m&&r[1]===k[1]?(r[1]+=e,B[1]+=e):m||r[2]!==k[2]||(r[2]+=e,B[2]+=e),f.push(["M",k[1],k[2]],["L",n[1],n[2]],["L",B[1],B[2]],["L",r[1],r[2]],["Z"]));f.isFlat=q}}return f};a.prototype.addPlotBand=function(a){return this.addPlotBandOrLine(a,"plotBands")};a.prototype.addPlotLine=function(a){return this.addPlotBandOrLine(a,"plotLines")};a.prototype.addPlotBandOrLine=function(a,c){var e=this,
g=this.userOptions,f=new u(this,a);this.visible&&(f=f.render());if(f){this._addedPlotLB||(this._addedPlotLB=!0,(g.plotLines||[]).concat(g.plotBands||[]).forEach(function(a){e.addPlotBandOrLine(a)}));if(c){var m=g[c]||[];m.push(a);g[c]=m}this.plotLinesAndBands.push(f)}return f};a.prototype.removePlotBandOrLine=function(a){var c=this.plotLinesAndBands,e=this.options,g=this.userOptions;if(c){for(var f=c.length;f--;)c[f].id===a&&c[f].destroy();[e.plotLines||[],g.plotLines||[],e.plotBands||[],g.plotBands||
[]].forEach(function(c){for(f=c.length;f--;)(c[f]||{}).id===a&&r(c,c[f])})}};a.prototype.removePlotBand=function(a){this.removePlotBandOrLine(a)};a.prototype.removePlotLine=function(a){this.removePlotBandOrLine(a)};return a}()})(z||(z={}));return z});M(a,"Core/Axis/PlotLineOrBand/PlotLineOrBand.js",[a["Core/Color/Palette.js"],a["Core/Axis/PlotLineOrBand/PlotLineOrBandAxis.js"],a["Core/Utilities.js"]],function(a,w,C){var r=C.arrayMax,z=C.arrayMin,x=C.defined,J=C.destroyObjectProperties,u=C.erase,n=
C.fireEvent,m=C.merge,g=C.objectEach,c=C.pick;C=function(){function e(a,c){this.axis=a;c&&(this.options=c,this.id=c.id)}e.compose=function(a){return w.compose(e,a)};e.prototype.render=function(){n(this,"render");var e=this,f=e.axis,v=f.horiz,q=f.logarithmic,k=e.options,r=k.color,D=c(k.zIndex,0),B=k.events,u={},t=f.chart.renderer,h=k.label,d=e.label,b=k.to,p=k.from,G=k.value,y=e.svgElem,L=[],F=x(p)&&x(b);L=x(G);var P=!y,S={"class":"highcharts-plot-"+(F?"band ":"line ")+(k.className||"")},Q=F?"bands":
"lines";q&&(p=q.log2lin(p),b=q.log2lin(b),G=q.log2lin(G));f.chart.styledMode||(L?(S.stroke=r||a.neutralColor40,S["stroke-width"]=c(k.width,1),k.dashStyle&&(S.dashstyle=k.dashStyle)):F&&(S.fill=r||a.highlightColor10,k.borderWidth&&(S.stroke=k.borderColor,S["stroke-width"]=k.borderWidth)));u.zIndex=D;Q+="-"+D;(q=f.plotLinesAndBandsGroups[Q])||(f.plotLinesAndBandsGroups[Q]=q=t.g("plot-"+Q).attr(u).add());P&&(e.svgElem=y=t.path().attr(S).add(q));if(L)L=f.getPlotLinePath({value:G,lineWidth:y.strokeWidth(),
acrossPanes:k.acrossPanes});else if(F)L=f.getPlotBandPath(p,b,k);else return;!e.eventsAdded&&B&&(g(B,function(b,d){y.on(d,function(b){B[d].apply(e,[b])})}),e.eventsAdded=!0);(P||!y.d)&&L&&L.length?y.attr({d:L}):y&&(L?(y.show(!0),y.animate({d:L})):y.d&&(y.hide(),d&&(e.label=d=d.destroy())));h&&(x(h.text)||x(h.formatter))&&L&&L.length&&0<f.width&&0<f.height&&!L.isFlat?(h=m({align:v&&F&&"center",x:v?!F&&4:10,verticalAlign:!v&&F&&"middle",y:v?F?16:10:F?6:-4,rotation:v&&!F&&90},h),this.renderLabel(h,L,
F,D)):d&&d.hide();return e};e.prototype.renderLabel=function(a,c,e,g){var f=this.axis,l=f.chart.renderer,q=this.label;q||(this.label=q=l.text(this.getLabelText(a),0,0,a.useHTML).attr({align:a.textAlign||a.align,rotation:a.rotation,"class":"highcharts-plot-"+(e?"band":"line")+"-label "+(a.className||""),zIndex:g}).add(),f.chart.styledMode||q.css(m({textOverflow:"ellipsis"},a.style)));g=c.xBounds||[c[0][1],c[1][1],e?c[2][1]:c[0][1]];c=c.yBounds||[c[0][2],c[1][2],e?c[2][2]:c[0][2]];e=z(g);l=z(c);q.align(a,
!1,{x:e,y:l,width:r(g)-e,height:r(c)-l});q.alignValue&&"left"!==q.alignValue||q.css({width:(90===q.rotation?f.height-(q.alignAttr.y-f.top):f.width-(q.alignAttr.x-f.left))+"px"});q.show(!0)};e.prototype.getLabelText=function(a){return x(a.formatter)?a.formatter.call(this):a.text};e.prototype.destroy=function(){u(this.axis.plotLinesAndBands,this);delete this.axis;J(this)};return e}();"";"";return C});M(a,"Core/Tooltip.js",[a["Core/FormatUtilities.js"],a["Core/Globals.js"],a["Core/Color/Palette.js"],
a["Core/Renderer/RendererUtilities.js"],a["Core/Renderer/RendererRegistry.js"],a["Core/Utilities.js"]],function(a,w,C,E,z,x){var r=a.format,u=w.doc,n=E.distribute,m=x.addEvent,g=x.clamp,c=x.css,e=x.defined,l=x.discardElement,f=x.extend,v=x.fireEvent,q=x.isArray,k=x.isNumber,I=x.isString,D=x.merge,B=x.pick,O=x.splat,t=x.syncTimeout;a=function(){function a(a,b){this.container=void 0;this.crosshairs=[];this.distance=0;this.isHidden=!0;this.isSticky=!1;this.now={};this.options={};this.outside=!1;this.chart=
a;this.init(a,b)}a.prototype.applyFilter=function(){var a=this.chart;a.renderer.definition({tagName:"filter",attributes:{id:"drop-shadow-"+a.index,opacity:.5},children:[{tagName:"feGaussianBlur",attributes:{"in":"SourceAlpha",stdDeviation:1}},{tagName:"feOffset",attributes:{dx:1,dy:1}},{tagName:"feComponentTransfer",children:[{tagName:"feFuncA",attributes:{type:"linear",slope:.3}}]},{tagName:"feMerge",children:[{tagName:"feMergeNode"},{tagName:"feMergeNode",attributes:{"in":"SourceGraphic"}}]}]})};
a.prototype.bodyFormatter=function(a){return a.map(function(b){var a=b.series.tooltipOptions;return(a[(b.point.formatPrefix||"point")+"Formatter"]||b.point.tooltipFormatter).call(b.point,a[(b.point.formatPrefix||"point")+"Format"]||"")})};a.prototype.cleanSplit=function(a){this.chart.series.forEach(function(b){var d=b&&b.tt;d&&(!d.isActive||a?b.tt=d.destroy():d.isActive=!1)})};a.prototype.defaultFormatter=function(a){var b=this.points||O(this);var d=[a.tooltipFooterHeaderFormatter(b[0])];d=d.concat(a.bodyFormatter(b));
d.push(a.tooltipFooterHeaderFormatter(b[0],!0));return d};a.prototype.destroy=function(){this.label&&(this.label=this.label.destroy());this.split&&this.tt&&(this.cleanSplit(this.chart,!0),this.tt=this.tt.destroy());this.renderer&&(this.renderer=this.renderer.destroy(),l(this.container));x.clearTimeout(this.hideTimer);x.clearTimeout(this.tooltipTimeout)};a.prototype.getAnchor=function(a,b){var d=this.chart,c=d.pointer,e=d.inverted,h=d.plotTop,f=d.plotLeft,g,k,t=0,l=0;a=O(a);this.followPointer&&b?("undefined"===
typeof b.chartX&&(b=c.normalize(b)),c=[b.chartX-f,b.chartY-h]):a[0].tooltipPos?c=a[0].tooltipPos:(a.forEach(function(b){g=b.series.yAxis;k=b.series.xAxis;t+=b.plotX||0;l+=b.plotLow?(b.plotLow+(b.plotHigh||0))/2:b.plotY||0;k&&g&&(e?(t+=h+d.plotHeight-k.len-k.pos,l+=f+d.plotWidth-g.len-g.pos):(t+=k.pos-f,l+=g.pos-h))}),t/=a.length,l/=a.length,c=[e?d.plotWidth-l:t,e?d.plotHeight-t:l],this.shared&&1<a.length&&b&&(e?c[0]=b.chartX-f:c[1]=b.chartY-h));return c.map(Math.round)};a.prototype.getLabel=function(){var a=
this,b=this.chart.styledMode,h=this.options,f="tooltip"+(e(h.className)?" "+h.className:""),g=h.style.pointerEvents||(!this.followPointer&&h.stickOnContact?"auto":"none"),k=function(){a.inContact=!0},t=function(b){var d=a.chart.hoverSeries;a.inContact=a.shouldStickOnContact()&&a.chart.pointer.inClass(b.relatedTarget,"highcharts-tooltip");if(!a.inContact&&d&&d.onMouseOut)d.onMouseOut()},l,q=this.chart.renderer;if(!this.label){if(this.outside){var n=this.chart.options.chart.style,v=z.getRendererType();
this.container=l=w.doc.createElement("div");l.className="highcharts-tooltip-container";c(l,{position:"absolute",top:"1px",pointerEvents:g,zIndex:Math.max(this.options.style.zIndex||0,(n&&n.zIndex||0)+3)});m(l,"mouseenter",k);m(l,"mouseleave",t);w.doc.body.appendChild(l);this.renderer=q=new v(l,0,0,n,void 0,void 0,q.styledMode)}this.split?this.label=q.g(f):(this.label=q.label("",0,0,h.shape,void 0,void 0,h.useHTML,void 0,f).attr({padding:h.padding,r:h.borderRadius}),b||this.label.attr({fill:h.backgroundColor,
"stroke-width":h.borderWidth}).css(h.style).css({pointerEvents:g}).shadow(h.shadow));b&&h.shadow&&(this.applyFilter(),this.label.attr({filter:"url(#drop-shadow-"+this.chart.index+")"}));if(a.outside&&!a.split){var r=this.label,B=r.xSetter,D=r.ySetter;r.xSetter=function(b){B.call(r,a.distance);l.style.left=b+"px"};r.ySetter=function(b){D.call(r,a.distance);l.style.top=b+"px"}}this.label.on("mouseenter",k).on("mouseleave",t).attr({zIndex:8}).add()}return this.label};a.prototype.getPosition=function(a,
b,c){var d=this.chart,e=this.distance,h={},f=d.inverted&&c.h||0,g=this.outside,p=g?u.documentElement.clientWidth-2*e:d.chartWidth,k=g?Math.max(u.body.scrollHeight,u.documentElement.scrollHeight,u.body.offsetHeight,u.documentElement.offsetHeight,u.documentElement.clientHeight):d.chartHeight,l=d.pointer.getChartPosition(),t=function(h){var f="x"===h;return[h,f?p:k,f?a:b].concat(g?[f?a*l.scaleX:b*l.scaleY,f?l.left-e+(c.plotX+d.plotLeft)*l.scaleX:l.top-e+(c.plotY+d.plotTop)*l.scaleY,0,f?p:k]:[f?a:b,f?
c.plotX+d.plotLeft:c.plotY+d.plotTop,f?d.plotLeft:d.plotTop,f?d.plotLeft+d.plotWidth:d.plotTop+d.plotHeight])},m=t("y"),q=t("x"),n,v=!this.followPointer&&B(c.ttBelow,!d.inverted===!!c.negative),r=function(b,a,d,c,p,k,y){var t=g?"y"===b?e*l.scaleY:e*l.scaleX:e,G=(d-c)/2,A=c<p-e,m=p+e+c<a,F=p-t-d+G;p=p+t-G;if(v&&m)h[b]=p;else if(!v&&A)h[b]=F;else if(A)h[b]=Math.min(y-c,0>F-f?F:F-f);else if(m)h[b]=Math.max(k,p+f+d>a?p:p+f);else return!1},D=function(b,a,d,c,f){var g;f<e||f>a-e?g=!1:h[b]=f<d/2?1:f>a-c/
2?a-c-2:f-d/2;return g},A=function(b){var a=m;m=q;q=a;n=b},U=function(){!1!==r.apply(0,m)?!1!==D.apply(0,q)||n||(A(!0),U()):n?h.x=h.y=0:(A(!0),U())};(d.inverted||1<this.len)&&A();U();return h};a.prototype.hide=function(a){var b=this;x.clearTimeout(this.hideTimer);a=B(a,this.options.hideDelay);this.isHidden||(this.hideTimer=t(function(){b.getLabel().fadeOut(a?void 0:a);b.isHidden=!0},a))};a.prototype.init=function(a,b){this.chart=a;this.options=b;this.crosshairs=[];this.now={x:0,y:0};this.isHidden=
!0;this.split=b.split&&!a.inverted&&!a.polar;this.shared=b.shared||this.split;this.outside=B(b.outside,!(!a.scrollablePixelsX&&!a.scrollablePixelsY))};a.prototype.shouldStickOnContact=function(){return!(this.followPointer||!this.options.stickOnContact)};a.prototype.isStickyOnContact=function(){return!(!this.shouldStickOnContact()||!this.inContact)};a.prototype.move=function(a,b,c,e){var d=this,h=d.now,g=!1!==d.options.animation&&!d.isHidden&&(1<Math.abs(a-h.x)||1<Math.abs(b-h.y)),p=d.followPointer||
1<d.len;f(h,{x:g?(2*h.x+a)/3:a,y:g?(h.y+b)/2:b,anchorX:p?void 0:g?(2*h.anchorX+c)/3:c,anchorY:p?void 0:g?(h.anchorY+e)/2:e});d.getLabel().attr(h);d.drawTracker();g&&(x.clearTimeout(this.tooltipTimeout),this.tooltipTimeout=setTimeout(function(){d&&d.move(a,b,c,e)},32))};a.prototype.refresh=function(a,b){var d=this.chart,c=this.options,e=O(a),h=e[0],f=[],g=c.formatter||this.defaultFormatter,k=this.shared,l=d.styledMode,t={};if(c.enabled){x.clearTimeout(this.hideTimer);this.followPointer=!this.split&&
h.series.tooltipOptions.followPointer;var m=this.getAnchor(a,b),n=m[0],r=m[1];!k||!q(a)&&a.series&&a.series.noSharedTooltip?t=h.getLabelConfig():(d.pointer.applyInactiveState(e),e.forEach(function(b){b.setState("hover");f.push(b.getLabelConfig())}),t={x:h.category,y:h.y},t.points=f);this.len=f.length;a=g.call(t,this);g=h.series;this.distance=B(g.tooltipOptions.distance,16);if(!1===a)this.hide();else{if(this.split)this.renderSplit(a,e);else if(e=n,k=r,b&&d.pointer.isDirectTouch&&(e=b.chartX-d.plotLeft,
k=b.chartY-d.plotTop),d.polar||!1===g.options.clip||g.shouldShowTooltip(e,k))b=this.getLabel(),c.style.width&&!l||b.css({width:this.chart.spacingBox.width+"px"}),b.attr({text:a&&a.join?a.join(""):a}),b.removeClass(/highcharts-color-[\d]+/g).addClass("highcharts-color-"+B(h.colorIndex,g.colorIndex)),l||b.attr({stroke:c.borderColor||h.color||g.color||C.neutralColor60}),this.updatePosition({plotX:n,plotY:r,negative:h.negative,ttBelow:h.ttBelow,h:m[2]||0});else{this.hide();return}this.isHidden&&this.label&&
this.label.attr({opacity:1}).show();this.isHidden=!1}v(this,"refresh")}};a.prototype.renderSplit=function(a,b){function d(b,a,d,e,h){void 0===h&&(h=!0);d?(a=Y?0:J,b=g(b-e/2,N.left,N.right-e-(c.outside?T:0))):(a-=da,b=h?b-e-z:b+z,b=g(b,h?b:N.left,N.right));return{x:b,y:a}}var c=this,e=c.chart,h=c.chart,k=h.chartWidth,l=h.chartHeight,t=h.plotHeight,m=h.plotLeft,q=h.plotTop,r=h.pointer,v=h.scrollablePixelsY;v=void 0===v?0:v;var D=h.scrollablePixelsX,x=h.scrollingContainer;x=void 0===x?{scrollLeft:0,
scrollTop:0}:x;var w=x.scrollLeft;x=x.scrollTop;var O=h.styledMode,z=c.distance,A=c.options,U=c.options.positioner,N=c.outside&&"number"!==typeof D?u.documentElement.getBoundingClientRect():{left:w,right:w+k,top:x,bottom:x+l},W=c.getLabel(),X=this.renderer||e.renderer,Y=!(!e.xAxis[0]||!e.xAxis[0].opposite);e=r.getChartPosition();var T=e.left;e=e.top;var da=q+x,E=0,J=t-v;I(a)&&(a=[!1,a]);a=a.slice(0,b.length+1).reduce(function(a,e,h){if(!1!==e&&""!==e){h=b[h-1]||{isHeader:!0,plotX:b[0].plotX,plotY:t,
series:{}};var f=h.isHeader,p=f?c:h.series;e=e.toString();var k=p.tt,l=h.isHeader;var y=h.series;var G="highcharts-color-"+B(h.colorIndex,y.colorIndex,"none");k||(k={padding:A.padding,r:A.borderRadius},O||(k.fill=A.backgroundColor,k["stroke-width"]=A.borderWidth),k=X.label("",0,0,A[l?"headerShape":"shape"],void 0,void 0,A.useHTML).addClass((l?"highcharts-tooltip-header ":"")+"highcharts-tooltip-box "+G).attr(k).add(W));k.isActive=!0;k.attr({text:e});O||k.css(A.style).shadow(A.shadow).attr({stroke:A.borderColor||
h.color||y.color||C.neutralColor80});p=p.tt=k;l=p.getBBox();e=l.width+p.strokeWidth();f&&(E=l.height,J+=E,Y&&(da-=E));y=h.plotX;y=void 0===y?0:y;G=h.plotY;G=void 0===G?0:G;k=h.series;if(h.isHeader){y=m+y;var F=q+t/2}else{var n=k.xAxis,ca=k.yAxis;y=n.pos+g(y,-z,n.len+z);k.shouldShowTooltip(0,ca.pos-q+G,{ignoreX:!0})&&(F=ca.pos+G)}y=g(y,N.left-z,N.right+z);"number"===typeof F?(l=l.height+1,G=U?U.call(c,e,l,h):d(y,F,f,e),a.push({align:U?0:void 0,anchorX:y,anchorY:F,boxWidth:e,point:h,rank:B(G.rank,f?
1:0),size:l,target:G.y,tt:p,x:G.x})):p.isActive=!1}return a},[]);!U&&a.some(function(b){var a=(c.outside?T:0)+b.anchorX;return a<N.left&&a+b.boxWidth<N.right?!0:a<T-N.left+b.boxWidth&&N.right-a>a})&&(a=a.map(function(b){var a=d(b.anchorX,b.anchorY,b.point.isHeader,b.boxWidth,!1);return f(b,{target:a.y,x:a.x})}));c.cleanSplit();n(a,J);var ba=T,ea=T;a.forEach(function(b){var a=b.x,d=b.boxWidth;b=b.isHeader;b||(c.outside&&T+a<ba&&(ba=T+a),!b&&c.outside&&ba+d>ea&&(ea=T+a))});a.forEach(function(b){var a=
b.x,d=b.anchorX,e=b.pos,h=b.point.isHeader;e={visibility:"undefined"===typeof e?"hidden":"inherit",x:a,y:e+da,anchorX:d,anchorY:b.anchorY};if(c.outside&&a<d){var f=T-ba;0<f&&(h||(e.x=a+f,e.anchorX=d+f),h&&(e.x=(ea-ba)/2,e.anchorX=d+f))}b.tt.attr(e)});a=c.container;v=c.renderer;c.outside&&a&&v&&(h=W.getBBox(),v.setSize(h.width+h.x,h.height+h.y,!1),a.style.left=ba+"px",a.style.top=e+"px")};a.prototype.drawTracker=function(){if(this.followPointer||!this.options.stickOnContact)this.tracker&&this.tracker.destroy();
else{var a=this.chart,b=this.label,c=this.shared?a.hoverPoints:a.hoverPoint;if(b&&c){var e={x:0,y:0,width:0,height:0};c=this.getAnchor(c);var h=b.getBBox();c[0]+=a.plotLeft-b.translateX;c[1]+=a.plotTop-b.translateY;e.x=Math.min(0,c[0]);e.y=Math.min(0,c[1]);e.width=0>c[0]?Math.max(Math.abs(c[0]),h.width-c[0]):Math.max(Math.abs(c[0]),h.width);e.height=0>c[1]?Math.max(Math.abs(c[1]),h.height-Math.abs(c[1])):Math.max(Math.abs(c[1]),h.height);this.tracker?this.tracker.attr(e):(this.tracker=b.renderer.rect(e).addClass("highcharts-tracker").add(b),
a.styledMode||this.tracker.attr({fill:"rgba(0,0,0,0)"}))}}};a.prototype.styledModeFormat=function(a){return a.replace('style="font-size: 10px"','class="highcharts-header"').replace(/style="color:{(point|series)\.color}"/g,'class="highcharts-color-{$1.colorIndex}"')};a.prototype.tooltipFooterHeaderFormatter=function(a,b){var d=a.series,c=d.tooltipOptions,e=d.xAxis,h=e&&e.dateTime;e={isFooter:b,labelConfig:a};var f=c.xDateFormat,g=c[b?"footerFormat":"headerFormat"];v(this,"headerFormatter",e,function(b){h&&
!f&&k(a.key)&&(f=h.getXDateFormat(a.key,c.dateTimeLabelFormats));h&&f&&(a.point&&a.point.tooltipDateKeys||["key"]).forEach(function(b){g=g.replace("{point."+b+"}","{point."+b+":"+f+"}")});d.chart.styledMode&&(g=this.styledModeFormat(g));b.text=r(g,{point:a,series:d},this.chart)});return e.text};a.prototype.update=function(a){this.destroy();D(!0,this.chart.options.tooltip.userOptions,a);this.init(this.chart,D(!0,this.options,a))};a.prototype.updatePosition=function(a){var b=this.chart,d=this.options,
e=b.pointer,h=this.getLabel();e=e.getChartPosition();var f=(d.positioner||this.getPosition).call(this,h.width,h.height,a),g=a.plotX+b.plotLeft;a=a.plotY+b.plotTop;if(this.outside){d=d.borderWidth+2*this.distance;this.renderer.setSize(h.width+d,h.height+d,!1);if(1!==e.scaleX||1!==e.scaleY)c(this.container,{transform:"scale("+e.scaleX+", "+e.scaleY+")"}),g*=e.scaleX,a*=e.scaleY;g+=e.left-f.x;a+=e.top-f.y}this.move(Math.round(f.x),Math.round(f.y||0),g,a)};return a}();"";return a});M(a,"Core/Series/Point.js",
[a["Core/Renderer/HTML/AST.js"],a["Core/Animation/AnimationUtilities.js"],a["Core/DefaultOptions.js"],a["Core/FormatUtilities.js"],a["Core/Utilities.js"]],function(a,w,C,E,z){var r=w.animObject,J=C.defaultOptions,u=E.format,n=z.addEvent,m=z.defined,g=z.erase,c=z.extend,e=z.fireEvent,l=z.getNestedProperty,f=z.isArray,v=z.isFunction,q=z.isNumber,k=z.isObject,I=z.merge,D=z.objectEach,B=z.pick,O=z.syncTimeout,t=z.removeEvent,h=z.uniqueKey;w=function(){function d(){this.colorIndex=this.category=void 0;
this.formatPrefix="point";this.id=void 0;this.isNull=!1;this.percentage=this.options=this.name=void 0;this.selected=!1;this.total=this.series=void 0;this.visible=!0;this.x=void 0}d.prototype.animateBeforeDestroy=function(){var b=this,a={x:b.startXPos,opacity:0},d=b.getGraphicalProps();d.singular.forEach(function(d){b[d]=b[d].animate("dataLabel"===d?{x:b[d].startXPos,y:b[d].startYPos,opacity:0}:a)});d.plural.forEach(function(a){b[a].forEach(function(a){a.element&&a.animate(c({x:b.startXPos},a.startYPos?
{x:a.startXPos,y:a.startYPos}:{}))})})};d.prototype.applyOptions=function(b,a){var e=this.series,h=e.options.pointValKey||e.pointValKey;b=d.prototype.optionsToObject.call(this,b);c(this,b);this.options=this.options?c(this.options,b):b;b.group&&delete this.group;b.dataLabels&&delete this.dataLabels;h&&(this.y=d.prototype.getNestedProperty.call(this,h));this.formatPrefix=(this.isNull=B(this.isValid&&!this.isValid(),null===this.x||!q(this.y)))?"null":"point";this.selected&&(this.state="select");"name"in
this&&"undefined"===typeof a&&e.xAxis&&e.xAxis.hasNames&&(this.x=e.xAxis.nameToX(this));"undefined"===typeof this.x&&e?this.x="undefined"===typeof a?e.autoIncrement():a:q(b.x)&&e.options.relativeXValue&&(this.x=e.autoIncrement(b.x));return this};d.prototype.destroy=function(){function b(){if(a.graphic||a.dataLabel||a.dataLabels)t(a),a.destroyElements();for(f in a)a[f]=null}var a=this,d=a.series,c=d.chart;d=d.options.dataSorting;var e=c.hoverPoints,h=r(a.series.chart.renderer.globalAnimation),f;a.legendItem&&
c.legend.destroyItem(a);e&&(a.setState(),g(e,a),e.length||(c.hoverPoints=null));if(a===c.hoverPoint)a.onMouseOut();d&&d.enabled?(this.animateBeforeDestroy(),O(b,h.duration)):b();c.pointCount--};d.prototype.destroyElements=function(b){var a=this;b=a.getGraphicalProps(b);b.singular.forEach(function(b){a[b]=a[b].destroy()});b.plural.forEach(function(b){a[b].forEach(function(b){b.element&&b.destroy()});delete a[b]})};d.prototype.firePointEvent=function(b,a,d){var c=this,h=this.series.options;(h.point.events[b]||
c.options&&c.options.events&&c.options.events[b])&&c.importEvents();"click"===b&&h.allowPointSelect&&(d=function(b){c.select&&c.select(null,b.ctrlKey||b.metaKey||b.shiftKey)});e(c,b,a,d)};d.prototype.getClassName=function(){return"highcharts-point"+(this.selected?" highcharts-point-select":"")+(this.negative?" highcharts-negative":"")+(this.isNull?" highcharts-null-point":"")+("undefined"!==typeof this.colorIndex?" highcharts-color-"+this.colorIndex:"")+(this.options.className?" "+this.options.className:
"")+(this.zone&&this.zone.className?" "+this.zone.className.replace("highcharts-negative",""):"")};d.prototype.getGraphicalProps=function(b){var a=this,d=[],c={singular:[],plural:[]},e;b=b||{graphic:1,dataLabel:1};b.graphic&&d.push("graphic","upperGraphic","shadowGroup");b.dataLabel&&d.push("dataLabel","dataLabelUpper","connector");for(e=d.length;e--;){var h=d[e];a[h]&&c.singular.push(h)}["dataLabel","connector"].forEach(function(d){var e=d+"s";b[d]&&a[e]&&c.plural.push(e)});return c};d.prototype.getLabelConfig=
function(){return{x:this.category,y:this.y,color:this.color,colorIndex:this.colorIndex,key:this.name||this.category,series:this.series,point:this,percentage:this.percentage,total:this.total||this.stackTotal}};d.prototype.getNestedProperty=function(b){if(b)return 0===b.indexOf("custom.")?l(b,this.options):this[b]};d.prototype.getZone=function(){var b=this.series,a=b.zones;b=b.zoneAxis||"y";var d,c=0;for(d=a[c];this[b]>=d.value;)d=a[++c];this.nonZonedColor||(this.nonZonedColor=this.color);this.color=
d&&d.color&&!this.options.color?d.color:this.nonZonedColor;return d};d.prototype.hasNewShapeType=function(){return(this.graphic&&(this.graphic.symbolName||this.graphic.element.nodeName))!==this.shapeType};d.prototype.init=function(b,a,d){this.series=b;this.applyOptions(a,d);this.id=m(this.id)?this.id:h();this.resolveColor();b.chart.pointCount++;e(this,"afterInit");return this};d.prototype.optionsToObject=function(b){var a=this.series,c=a.options.keys,e=c||a.pointArrayMap||["y"],h=e.length,g={},k=
0,l=0;if(q(b)||null===b)g[e[0]]=b;else if(f(b))for(!c&&b.length>h&&(a=typeof b[0],"string"===a?g.name=b[0]:"number"===a&&(g.x=b[0]),k++);l<h;)c&&"undefined"===typeof b[k]||(0<e[l].indexOf(".")?d.prototype.setNestedProperty(g,b[k],e[l]):g[e[l]]=b[k]),k++,l++;else"object"===typeof b&&(g=b,b.dataLabels&&(a._hasPointLabels=!0),b.marker&&(a._hasPointMarkers=!0));return g};d.prototype.resolveColor=function(){var b=this.series,a=b.chart.styledMode;var d=b.chart.options.chart.colorCount;delete this.nonZonedColor;
if(b.options.colorByPoint){if(!a){d=b.options.colors||b.chart.options.colors;var c=d[b.colorCounter];d=d.length}a=b.colorCounter;b.colorCounter++;b.colorCounter===d&&(b.colorCounter=0)}else a||(c=b.color),a=b.colorIndex;this.colorIndex=B(this.options.colorIndex,a);this.color=B(this.options.color,c)};d.prototype.setNestedProperty=function(b,a,d){d.split(".").reduce(function(b,d,c,e){b[d]=e.length-1===c?a:k(b[d],!0)?b[d]:{};return b[d]},b);return b};d.prototype.tooltipFormatter=function(b){var a=this.series,
d=a.tooltipOptions,c=B(d.valueDecimals,""),e=d.valuePrefix||"",h=d.valueSuffix||"";a.chart.styledMode&&(b=a.chart.tooltip.styledModeFormat(b));(a.pointArrayMap||["y"]).forEach(function(a){a="{point."+a;if(e||h)b=b.replace(RegExp(a+"}","g"),e+a+"}"+h);b=b.replace(RegExp(a+"}","g"),a+":,."+c+"f}")});return u(b,{point:this,series:this.series},a.chart)};d.prototype.update=function(b,a,d,c){function e(){h.applyOptions(b);var c=g&&h.hasDummyGraphic;c=null===h.y?!c:c;g&&c&&(h.graphic=g.destroy(),delete h.hasDummyGraphic);
k(b,!0)&&(g&&g.element&&b&&b.marker&&"undefined"!==typeof b.marker.symbol&&(h.graphic=g.destroy()),b&&b.dataLabels&&h.dataLabel&&(h.dataLabel=h.dataLabel.destroy()),h.connector&&(h.connector=h.connector.destroy()));t=h.index;f.updateParallelArrays(h,t);l.data[t]=k(l.data[t],!0)||k(b,!0)?h.options:B(b,l.data[t]);f.isDirty=f.isDirtyData=!0;!f.fixedBox&&f.hasCartesianSeries&&(p.isDirtyBox=!0);"point"===l.legendType&&(p.isDirtyLegend=!0);a&&p.redraw(d)}var h=this,f=h.series,g=h.graphic,p=f.chart,l=f.options,
t;a=B(a,!0);!1===c?e():h.firePointEvent("update",{options:b},e)};d.prototype.remove=function(b,a){this.series.removePoint(this.series.data.indexOf(this),b,a)};d.prototype.select=function(b,a){var d=this,c=d.series,e=c.chart;this.selectedStaging=b=B(b,!d.selected);d.firePointEvent(b?"select":"unselect",{accumulate:a},function(){d.selected=d.options.selected=b;c.options.data[c.data.indexOf(d)]=d.options;d.setState(b&&"select");a||e.getSelectedPoints().forEach(function(b){var a=b.series;b.selected&&
b!==d&&(b.selected=b.options.selected=!1,a.options.data[a.data.indexOf(b)]=b.options,b.setState(e.hoverPoints&&a.options.inactiveOtherPoints?"inactive":""),b.firePointEvent("unselect"))})});delete this.selectedStaging};d.prototype.onMouseOver=function(b){var a=this.series.chart,d=a.pointer;b=b?d.normalize(b):d.getChartCoordinatesFromPoint(this,a.inverted);d.runPointActions(b,this)};d.prototype.onMouseOut=function(){var b=this.series.chart;this.firePointEvent("mouseOut");this.series.options.inactiveOtherPoints||
(b.hoverPoints||[]).forEach(function(b){b.setState()});b.hoverPoints=b.hoverPoint=null};d.prototype.importEvents=function(){if(!this.hasImportedEvents){var b=this,a=I(b.series.options.point,b.options).events;b.events=a;D(a,function(a,d){v(a)&&n(b,d,a)});this.hasImportedEvents=!0}};d.prototype.setState=function(b,d){var h=this.series,f=this.state,g=h.options.states[b||"normal"]||{},k=J.plotOptions[h.type].marker&&h.options.marker,p=k&&!1===k.enabled,l=k&&k.states&&k.states[b||"normal"]||{},t=!1===
l.enabled,m=this.marker||{},n=h.chart,v=k&&h.markerAttribs,r=h.halo,D,I=h.stateMarkerGraphic;b=b||"";if(!(b===this.state&&!d||this.selected&&"select"!==b||!1===g.enabled||b&&(t||p&&!1===l.enabled)||b&&m.states&&m.states[b]&&!1===m.states[b].enabled)){this.state=b;v&&(D=h.markerAttribs(this,b));if(this.graphic&&!this.hasDummyGraphic){f&&this.graphic.removeClass("highcharts-point-"+f);b&&this.graphic.addClass("highcharts-point-"+b);if(!n.styledMode){var u=h.pointAttribs(this,b);var x=B(n.options.chart.animation,
g.animation);h.options.inactiveOtherPoints&&q(u.opacity)&&((this.dataLabels||[]).forEach(function(b){b&&b.animate({opacity:u.opacity},x)}),this.connector&&this.connector.animate({opacity:u.opacity},x));this.graphic.animate(u,x)}D&&this.graphic.animate(D,B(n.options.chart.animation,l.animation,k.animation));I&&I.hide()}else{if(b&&l){f=m.symbol||h.symbol;I&&I.currentSymbol!==f&&(I=I.destroy());if(D)if(I)I[d?"animate":"attr"]({x:D.x,y:D.y});else f&&(h.stateMarkerGraphic=I=n.renderer.symbol(f,D.x,D.y,
D.width,D.height).add(h.markerGroup),I.currentSymbol=f);!n.styledMode&&I&&I.attr(h.pointAttribs(this,b))}I&&(I[b&&this.isInside?"show":"hide"](),I.element.point=this,I.addClass(this.getClassName(),!0))}g=g.halo;D=(I=this.graphic||I)&&I.visibility||"inherit";g&&g.size&&I&&"hidden"!==D&&!this.isCluster?(r||(h.halo=r=n.renderer.path().add(I.parentGroup)),r.show()[d?"animate":"attr"]({d:this.haloPath(g.size)}),r.attr({"class":"highcharts-halo highcharts-color-"+B(this.colorIndex,h.colorIndex)+(this.className?
" "+this.className:""),visibility:D,zIndex:-1}),r.point=this,n.styledMode||r.attr(c({fill:this.color||h.color,"fill-opacity":g.opacity},a.filterUserAttributes(g.attributes||{})))):r&&r.point&&r.point.haloPath&&r.animate({d:r.point.haloPath(0)},null,r.hide);e(this,"afterSetState",{state:b})}};d.prototype.haloPath=function(b){return this.series.chart.renderer.symbols.circle(Math.floor(this.plotX)-b,this.plotY-b,2*b,2*b)};return d}();"";return w});M(a,"Core/Pointer.js",[a["Core/Color/Color.js"],a["Core/Globals.js"],
a["Core/Color/Palette.js"],a["Core/Tooltip.js"],a["Core/Utilities.js"]],function(a,w,C,E,z){var r=a.parse,J=w.charts,u=w.noop,n=z.addEvent,m=z.attr,g=z.css,c=z.defined,e=z.extend,l=z.find,f=z.fireEvent,v=z.isNumber,q=z.isObject,k=z.objectEach,I=z.offset,D=z.pick,B=z.splat;a=function(){function a(a,c){this.lastValidTouch={};this.pinchDown=[];this.runChartClick=!1;this.eventsToUnbind=[];this.chart=a;this.hasDragged=!1;this.options=c;this.init(a,c)}a.prototype.applyInactiveState=function(a){var c=[],
d;(a||[]).forEach(function(b){d=b.series;c.push(d);d.linkedParent&&c.push(d.linkedParent);d.linkedSeries&&(c=c.concat(d.linkedSeries));d.navigatorSeries&&c.push(d.navigatorSeries)});this.chart.series.forEach(function(b){-1===c.indexOf(b)?b.setState("inactive",!0):b.options.inactiveOtherPoints&&b.setAllPointsToState("inactive")})};a.prototype.destroy=function(){var c=this;this.eventsToUnbind.forEach(function(a){return a()});this.eventsToUnbind=[];w.chartCount||(a.unbindDocumentMouseUp&&(a.unbindDocumentMouseUp=
a.unbindDocumentMouseUp()),a.unbindDocumentTouchEnd&&(a.unbindDocumentTouchEnd=a.unbindDocumentTouchEnd()));clearInterval(c.tooltipTimeout);k(c,function(a,d){c[d]=void 0})};a.prototype.drag=function(a){var c=this.chart,d=c.options.chart,b=this.zoomHor,e=this.zoomVert,f=c.plotLeft,g=c.plotTop,k=c.plotWidth,l=c.plotHeight,t=this.mouseDownX||0,m=this.mouseDownY||0,n=q(d.panning)?d.panning&&d.panning.enabled:d.panning,v=d.panKey&&a[d.panKey+"Key"],B=a.chartX,D=a.chartY,I=this.selectionMarker;if(!I||!I.touch)if(B<
f?B=f:B>f+k&&(B=f+k),D<g?D=g:D>g+l&&(D=g+l),this.hasDragged=Math.sqrt(Math.pow(t-B,2)+Math.pow(m-D,2)),10<this.hasDragged){var u=c.isInsidePlot(t-f,m-g,{visiblePlotOnly:!0});c.hasCartesianSeries&&(this.zoomX||this.zoomY)&&u&&!v&&!I&&(this.selectionMarker=I=c.renderer.rect(f,g,b?1:k,e?1:l,0).attr({"class":"highcharts-selection-marker",zIndex:7}).add(),c.styledMode||I.attr({fill:d.selectionMarkerFill||r(C.highlightColor80).setOpacity(.25).get()}));I&&b&&(b=B-t,I.attr({width:Math.abs(b),x:(0<b?0:b)+
t}));I&&e&&(b=D-m,I.attr({height:Math.abs(b),y:(0<b?0:b)+m}));u&&!I&&n&&c.pan(a,d.panning)}};a.prototype.dragStart=function(a){var c=this.chart;c.mouseIsDown=a.type;c.cancelClick=!1;c.mouseDownX=this.mouseDownX=a.chartX;c.mouseDownY=this.mouseDownY=a.chartY};a.prototype.drop=function(a){var h=this,d=this.chart,b=this.hasPinched;if(this.selectionMarker){var k={originalEvent:a,xAxis:[],yAxis:[]},l=this.selectionMarker,t=l.attr?l.attr("x"):l.x,m=l.attr?l.attr("y"):l.y,q=l.attr?l.attr("width"):l.width,
n=l.attr?l.attr("height"):l.height,r;if(this.hasDragged||b)d.axes.forEach(function(d){if(d.zoomEnabled&&c(d.min)&&(b||h[{xAxis:"zoomX",yAxis:"zoomY"}[d.coll]])&&v(t)&&v(m)){var e=d.horiz,f="touchend"===a.type?d.minPixelPadding:0,g=d.toValue((e?t:m)+f);e=d.toValue((e?t+q:m+n)-f);k[d.coll].push({axis:d,min:Math.min(g,e),max:Math.max(g,e)});r=!0}}),r&&f(d,"selection",k,function(a){d.zoom(e(a,b?{animation:!1}:null))});v(d.index)&&(this.selectionMarker=this.selectionMarker.destroy());b&&this.scaleGroups()}d&&
v(d.index)&&(g(d.container,{cursor:d._cursor}),d.cancelClick=10<this.hasDragged,d.mouseIsDown=this.hasDragged=this.hasPinched=!1,this.pinchDown=[])};a.prototype.findNearestKDPoint=function(a,c,d){var b=this.chart,e=b.hoverPoint;b=b.tooltip;if(e&&b&&b.isStickyOnContact())return e;var h;a.forEach(function(b){var a=!(b.noSharedTooltip&&c)&&0>b.options.findNearestPointBy.indexOf("y");b=b.searchPoint(d,a);if((a=q(b,!0)&&b.series)&&!(a=!q(h,!0))){a=h.distX-b.distX;var e=h.dist-b.dist,f=(b.series.group&&
b.series.group.zIndex)-(h.series.group&&h.series.group.zIndex);a=0<(0!==a&&c?a:0!==e?e:0!==f?f:h.series.index>b.series.index?-1:1)}a&&(h=b)});return h};a.prototype.getChartCoordinatesFromPoint=function(a,c){var d=a.series,b=d.xAxis;d=d.yAxis;var e=a.shapeArgs;if(b&&d){var h=D(a.clientX,a.plotX),f=a.plotY||0;a.isNode&&e&&v(e.x)&&v(e.y)&&(h=e.x,f=e.y);return c?{chartX:d.len+d.pos-f,chartY:b.len+b.pos-h}:{chartX:h+b.pos,chartY:f+d.pos}}if(e&&e.x&&e.y)return{chartX:e.x,chartY:e.y}};a.prototype.getChartPosition=
function(){if(this.chartPosition)return this.chartPosition;var a=this.chart.container,c=I(a);this.chartPosition={left:c.left,top:c.top,scaleX:1,scaleY:1};var d=a.offsetWidth;a=a.offsetHeight;2<d&&2<a&&(this.chartPosition.scaleX=c.width/d,this.chartPosition.scaleY=c.height/a);return this.chartPosition};a.prototype.getCoordinates=function(a){var c={xAxis:[],yAxis:[]};this.chart.axes.forEach(function(d){c[d.isXAxis?"xAxis":"yAxis"].push({axis:d,value:d.toValue(a[d.horiz?"chartX":"chartY"])})});return c};
a.prototype.getHoverData=function(a,c,d,b,e,g){var h=[];b=!(!b||!a);var k={chartX:g?g.chartX:void 0,chartY:g?g.chartY:void 0,shared:e};f(this,"beforeGetHoverData",k);var p=c&&!c.stickyTracking?[c]:d.filter(function(b){return k.filter?k.filter(b):b.visible&&!(!e&&b.directTouch)&&D(b.options.enableMouseTracking,!0)&&b.stickyTracking});var t=b||!g?a:this.findNearestKDPoint(p,e,g);c=t&&t.series;t&&(e&&!c.noSharedTooltip?(p=d.filter(function(b){return k.filter?k.filter(b):b.visible&&!(!e&&b.directTouch)&&
D(b.options.enableMouseTracking,!0)&&!b.noSharedTooltip}),p.forEach(function(b){var a=l(b.points,function(b){return b.x===t.x&&!b.isNull});q(a)&&(b.chart.isBoosting&&(a=b.getPoint(a)),h.push(a))})):h.push(t));k={hoverPoint:t};f(this,"afterGetHoverData",k);return{hoverPoint:k.hoverPoint,hoverSeries:c,hoverPoints:h}};a.prototype.getPointFromEvent=function(a){a=a.target;for(var c;a&&!c;)c=a.point,a=a.parentNode;return c};a.prototype.onTrackerMouseOut=function(a){a=a.relatedTarget||a.toElement;var c=
this.chart.hoverSeries;this.isDirectTouch=!1;if(!(!c||!a||c.stickyTracking||this.inClass(a,"highcharts-tooltip")||this.inClass(a,"highcharts-series-"+c.index)&&this.inClass(a,"highcharts-tracker")))c.onMouseOut()};a.prototype.inClass=function(a,c){for(var d;a;){if(d=m(a,"class")){if(-1!==d.indexOf(c))return!0;if(-1!==d.indexOf("highcharts-container"))return!1}a=a.parentNode}};a.prototype.init=function(a,c){this.options=c;this.chart=a;this.runChartClick=!(!c.chart.events||!c.chart.events.click);this.pinchDown=
[];this.lastValidTouch={};E&&(a.tooltip=new E(a,c.tooltip),this.followTouchMove=D(c.tooltip.followTouchMove,!0));this.setDOMEvents()};a.prototype.normalize=function(a,c){var d=a.touches,b=d?d.length?d.item(0):D(d.changedTouches,a.changedTouches)[0]:a;c||(c=this.getChartPosition());d=b.pageX-c.left;b=b.pageY-c.top;d/=c.scaleX;b/=c.scaleY;return e(a,{chartX:Math.round(d),chartY:Math.round(b)})};a.prototype.onContainerClick=function(a){var c=this.chart,d=c.hoverPoint;a=this.normalize(a);var b=c.plotLeft,
g=c.plotTop;c.cancelClick||(d&&this.inClass(a.target,"highcharts-tracker")?(f(d.series,"click",e(a,{point:d})),c.hoverPoint&&d.firePointEvent("click",a)):(e(a,this.getCoordinates(a)),c.isInsidePlot(a.chartX-b,a.chartY-g,{visiblePlotOnly:!0})&&f(c,"click",a)))};a.prototype.onContainerMouseDown=function(a){var c=1===((a.buttons||a.button)&1);a=this.normalize(a);if(w.isFirefox&&0!==a.button)this.onContainerMouseMove(a);if("undefined"===typeof a.button||c)this.zoomOption(a),c&&a.preventDefault&&a.preventDefault(),
this.dragStart(a)};a.prototype.onContainerMouseLeave=function(c){var e=J[D(a.hoverChartIndex,-1)],d=this.chart.tooltip;d&&d.shouldStickOnContact()&&this.inClass(c.relatedTarget,"highcharts-tooltip-container")||(c=this.normalize(c),e&&(c.relatedTarget||c.toElement)&&(e.pointer.reset(),e.pointer.chartPosition=void 0),d&&!d.isHidden&&this.reset())};a.prototype.onContainerMouseEnter=function(a){delete this.chartPosition};a.prototype.onContainerMouseMove=function(a){var c=this.chart;a=this.normalize(a);
this.setHoverChartIndex();a.preventDefault||(a.returnValue=!1);("mousedown"===c.mouseIsDown||this.touchSelect(a))&&this.drag(a);c.openMenu||!this.inClass(a.target,"highcharts-tracker")&&!c.isInsidePlot(a.chartX-c.plotLeft,a.chartY-c.plotTop,{visiblePlotOnly:!0})||(this.inClass(a.target,"highcharts-no-tooltip")?this.reset(!1,0):this.runPointActions(a))};a.prototype.onDocumentTouchEnd=function(c){var e=J[D(a.hoverChartIndex,-1)];e&&e.pointer.drop(c)};a.prototype.onContainerTouchMove=function(a){if(this.touchSelect(a))this.onContainerMouseMove(a);
else this.touch(a)};a.prototype.onContainerTouchStart=function(a){if(this.touchSelect(a))this.onContainerMouseDown(a);else this.zoomOption(a),this.touch(a,!0)};a.prototype.onDocumentMouseMove=function(a){var c=this.chart,d=this.chartPosition;a=this.normalize(a,d);var b=c.tooltip;!d||b&&b.isStickyOnContact()||c.isInsidePlot(a.chartX-c.plotLeft,a.chartY-c.plotTop,{visiblePlotOnly:!0})||this.inClass(a.target,"highcharts-tracker")||this.reset()};a.prototype.onDocumentMouseUp=function(c){var e=J[D(a.hoverChartIndex,
-1)];e&&e.pointer.drop(c)};a.prototype.pinch=function(a){var c=this,d=c.chart,b=c.pinchDown,f=a.touches||[],g=f.length,k=c.lastValidTouch,l=c.hasZoom,m={},t=1===g&&(c.inClass(a.target,"highcharts-tracker")&&d.runTrackerClick||c.runChartClick),q={},n=c.selectionMarker;1<g?c.initiated=!0:1===g&&this.followTouchMove&&(c.initiated=!1);l&&c.initiated&&!t&&!1!==a.cancelable&&a.preventDefault();[].map.call(f,function(b){return c.normalize(b)});"touchstart"===a.type?([].forEach.call(f,function(a,d){b[d]=
{chartX:a.chartX,chartY:a.chartY}}),k.x=[b[0].chartX,b[1]&&b[1].chartX],k.y=[b[0].chartY,b[1]&&b[1].chartY],d.axes.forEach(function(b){if(b.zoomEnabled){var a=d.bounds[b.horiz?"h":"v"],c=b.minPixelPadding,e=b.toPixels(Math.min(D(b.options.min,b.dataMin),b.dataMin)),h=b.toPixels(Math.max(D(b.options.max,b.dataMax),b.dataMax)),f=Math.max(e,h);a.min=Math.min(b.pos,Math.min(e,h)-c);a.max=Math.max(b.pos+b.len,f+c)}}),c.res=!0):c.followTouchMove&&1===g?this.runPointActions(c.normalize(a)):b.length&&(n||
(c.selectionMarker=n=e({destroy:u,touch:!0},d.plotBox)),c.pinchTranslate(b,f,m,n,q,k),c.hasPinched=l,c.scaleGroups(m,q),c.res&&(c.res=!1,this.reset(!1,0)))};a.prototype.pinchTranslate=function(a,c,d,b,e,f){this.zoomHor&&this.pinchTranslateDirection(!0,a,c,d,b,e,f);this.zoomVert&&this.pinchTranslateDirection(!1,a,c,d,b,e,f)};a.prototype.pinchTranslateDirection=function(a,c,d,b,e,f,g,k){var h=this.chart,l=a?"x":"y",p=a?"X":"Y",m="chart"+p,y=a?"width":"height",t=h["plot"+(a?"Left":"Top")],q=h.inverted,
n=h.bounds[a?"h":"v"],r=1===c.length,v=c[0][m],B=!r&&c[1][m];c=function(){"number"===typeof I&&20<Math.abs(v-B)&&(D=k||Math.abs(N-I)/Math.abs(v-B));A=(t-N)/D+v;G=h["plot"+(a?"Width":"Height")]/D};var G,A,D=k||1,N=d[0][m],I=!r&&d[1][m];c();d=A;if(d<n.min){d=n.min;var L=!0}else d+G>n.max&&(d=n.max-G,L=!0);L?(N-=.8*(N-g[l][0]),"number"===typeof I&&(I-=.8*(I-g[l][1])),c()):g[l]=[N,I];q||(f[l]=A-t,f[y]=G);f=q?1/D:D;e[y]=G;e[l]=d;b[q?a?"scaleY":"scaleX":"scale"+p]=D;b["translate"+p]=f*t+(N-f*v)};a.prototype.reset=
function(a,c){var d=this.chart,b=d.hoverSeries,e=d.hoverPoint,h=d.hoverPoints,f=d.tooltip,g=f&&f.shared?h:e;a&&g&&B(g).forEach(function(b){b.series.isCartesian&&"undefined"===typeof b.plotX&&(a=!1)});if(a)f&&g&&B(g).length&&(f.refresh(g),f.shared&&h?h.forEach(function(b){b.setState(b.state,!0);b.series.isCartesian&&(b.series.xAxis.crosshair&&b.series.xAxis.drawCrosshair(null,b),b.series.yAxis.crosshair&&b.series.yAxis.drawCrosshair(null,b))}):e&&(e.setState(e.state,!0),d.axes.forEach(function(b){b.crosshair&&
e.series[b.coll]===b&&b.drawCrosshair(null,e)})));else{if(e)e.onMouseOut();h&&h.forEach(function(b){b.setState()});if(b)b.onMouseOut();f&&f.hide(c);this.unDocMouseMove&&(this.unDocMouseMove=this.unDocMouseMove());d.axes.forEach(function(b){b.hideCrosshair()});this.hoverX=d.hoverPoints=d.hoverPoint=null}};a.prototype.runPointActions=function(c,e){var d=this.chart,b=d.tooltip&&d.tooltip.options.enabled?d.tooltip:void 0,h=b?b.shared:!1,f=e||d.hoverPoint,g=f&&f.series||d.hoverSeries;e=this.getHoverData(f,
g,d.series,(!c||"touchmove"!==c.type)&&(!!e||g&&g.directTouch&&this.isDirectTouch),h,c);f=e.hoverPoint;g=e.hoverSeries;var k=e.hoverPoints;e=g&&g.tooltipOptions.followPointer&&!g.tooltipOptions.split;h=h&&g&&!g.noSharedTooltip;if(f&&(f!==d.hoverPoint||b&&b.isHidden)){(d.hoverPoints||[]).forEach(function(b){-1===k.indexOf(b)&&b.setState()});if(d.hoverSeries!==g)g.onMouseOver();this.applyInactiveState(k);(k||[]).forEach(function(b){b.setState("hover")});d.hoverPoint&&d.hoverPoint.firePointEvent("mouseOut");
if(!f.series)return;d.hoverPoints=k;d.hoverPoint=f;f.firePointEvent("mouseOver");b&&b.refresh(h?k:f,c)}else e&&b&&!b.isHidden&&(f=b.getAnchor([{}],c),d.isInsidePlot(f[0],f[1],{visiblePlotOnly:!0})&&b.updatePosition({plotX:f[0],plotY:f[1]}));this.unDocMouseMove||(this.unDocMouseMove=n(d.container.ownerDocument,"mousemove",function(b){var d=J[a.hoverChartIndex];if(d)d.pointer.onDocumentMouseMove(b)}),this.eventsToUnbind.push(this.unDocMouseMove));d.axes.forEach(function(b){var a=D((b.crosshair||{}).snap,
!0),e;a&&((e=d.hoverPoint)&&e.series[b.coll]===b||(e=l(k,function(a){return a.series[b.coll]===b})));e||!a?b.drawCrosshair(c,e):b.hideCrosshair()})};a.prototype.scaleGroups=function(a,c){var d=this.chart;d.series.forEach(function(b){var e=a||b.getPlotBox();b.xAxis&&b.xAxis.zoomEnabled&&b.group&&(b.group.attr(e),b.markerGroup&&(b.markerGroup.attr(e),b.markerGroup.clip(c?d.clipRect:null)),b.dataLabelsGroup&&b.dataLabelsGroup.attr(e))});d.clipRect.attr(c||d.clipBox)};a.prototype.setDOMEvents=function(){var c=
this,e=this.chart.container,d=e.ownerDocument;e.onmousedown=this.onContainerMouseDown.bind(this);e.onmousemove=this.onContainerMouseMove.bind(this);e.onclick=this.onContainerClick.bind(this);this.eventsToUnbind.push(n(e,"mouseenter",this.onContainerMouseEnter.bind(this)));this.eventsToUnbind.push(n(e,"mouseleave",this.onContainerMouseLeave.bind(this)));a.unbindDocumentMouseUp||(a.unbindDocumentMouseUp=n(d,"mouseup",this.onDocumentMouseUp.bind(this)));for(var b=this.chart.renderTo.parentElement;b&&
"BODY"!==b.tagName;)this.eventsToUnbind.push(n(b,"scroll",function(){delete c.chartPosition})),b=b.parentElement;w.hasTouch&&(this.eventsToUnbind.push(n(e,"touchstart",this.onContainerTouchStart.bind(this),{passive:!1})),this.eventsToUnbind.push(n(e,"touchmove",this.onContainerTouchMove.bind(this),{passive:!1})),a.unbindDocumentTouchEnd||(a.unbindDocumentTouchEnd=n(d,"touchend",this.onDocumentTouchEnd.bind(this),{passive:!1})))};a.prototype.setHoverChartIndex=function(){var c=this.chart,e=w.charts[D(a.hoverChartIndex,
-1)];if(e&&e!==c)e.pointer.onContainerMouseLeave({relatedTarget:!0});e&&e.mouseIsDown||(a.hoverChartIndex=c.index)};a.prototype.touch=function(a,c){var d=this.chart,b;this.setHoverChartIndex();if(1===a.touches.length)if(a=this.normalize(a),(b=d.isInsidePlot(a.chartX-d.plotLeft,a.chartY-d.plotTop,{visiblePlotOnly:!0}))&&!d.openMenu){c&&this.runPointActions(a);if("touchmove"===a.type){c=this.pinchDown;var e=c[0]?4<=Math.sqrt(Math.pow(c[0].chartX-a.chartX,2)+Math.pow(c[0].chartY-a.chartY,2)):!1}D(e,
!0)&&this.pinch(a)}else c&&this.reset();else 2===a.touches.length&&this.pinch(a)};a.prototype.touchSelect=function(a){return!(!this.chart.options.chart.zoomBySingleTouch||!a.touches||1!==a.touches.length)};a.prototype.zoomOption=function(a){var c=this.chart,d=c.options.chart;c=c.inverted;var b=d.zoomType||"";/touch/.test(a.type)&&(b=D(d.pinchType,b));this.zoomX=a=/x/.test(b);this.zoomY=d=/y/.test(b);this.zoomHor=a&&!c||d&&c;this.zoomVert=d&&!c||a&&c;this.hasZoom=a||d};return a}();"";return a});M(a,
"Core/MSPointer.js",[a["Core/Globals.js"],a["Core/Pointer.js"],a["Core/Utilities.js"]],function(a,w,C){function r(){var a=[];a.item=function(a){return this[a]};e(f,function(c){a.push({pageX:c.pageX,pageY:c.pageY,target:c.target})});return a}function z(a,c,e,f){var g=J[w.hoverChartIndex||NaN];"touch"!==a.pointerType&&a.pointerType!==a.MSPOINTER_TYPE_TOUCH||!g||(g=g.pointer,f(a),g[c]({type:e,target:a.currentTarget,preventDefault:n,touches:r()}))}var x=this&&this.__extends||function(){var a=function(c,
e){a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(a,c){a.__proto__=c}||function(a,c){for(var e in c)c.hasOwnProperty(e)&&(a[e]=c[e])};return a(c,e)};return function(c,e){function f(){this.constructor=c}a(c,e);c.prototype=null===e?Object.create(e):(f.prototype=e.prototype,new f)}}(),J=a.charts,u=a.doc,n=a.noop,m=a.win,g=C.addEvent,c=C.css,e=C.objectEach,l=C.removeEvent,f={},v=!!m.PointerEvent;return function(e){function k(){return null!==e&&e.apply(this,arguments)||this}x(k,e);k.isRequired=
function(){return!(a.hasTouch||!m.PointerEvent&&!m.MSPointerEvent)};k.prototype.batchMSEvents=function(a){a(this.chart.container,v?"pointerdown":"MSPointerDown",this.onContainerPointerDown);a(this.chart.container,v?"pointermove":"MSPointerMove",this.onContainerPointerMove);a(u,v?"pointerup":"MSPointerUp",this.onDocumentPointerUp)};k.prototype.destroy=function(){this.batchMSEvents(l);e.prototype.destroy.call(this)};k.prototype.init=function(a,f){e.prototype.init.call(this,a,f);this.hasZoom&&c(a.container,
{"-ms-touch-action":"none","touch-action":"none"})};k.prototype.onContainerPointerDown=function(a){z(a,"onContainerTouchStart","touchstart",function(a){f[a.pointerId]={pageX:a.pageX,pageY:a.pageY,target:a.currentTarget}})};k.prototype.onContainerPointerMove=function(a){z(a,"onContainerTouchMove","touchmove",function(a){f[a.pointerId]={pageX:a.pageX,pageY:a.pageY};f[a.pointerId].target||(f[a.pointerId].target=a.currentTarget)})};k.prototype.onDocumentPointerUp=function(a){z(a,"onDocumentTouchEnd",
"touchend",function(a){delete f[a.pointerId]})};k.prototype.setDOMEvents=function(){e.prototype.setDOMEvents.call(this);(this.hasZoom||this.followTouchMove)&&this.batchMSEvents(g)};return k}(w)});M(a,"Core/Legend/Legend.js",[a["Core/Animation/AnimationUtilities.js"],a["Core/FormatUtilities.js"],a["Core/Globals.js"],a["Core/Series/Point.js"],a["Core/Renderer/RendererUtilities.js"],a["Core/Utilities.js"]],function(a,w,C,E,z,x){var r=a.animObject,u=a.setAnimation,n=w.format;a=C.isFirefox;var m=C.marginNames;
C=C.win;var g=z.distribute,c=x.addEvent,e=x.createElement,l=x.css,f=x.defined,v=x.discardElement,q=x.find,k=x.fireEvent,I=x.isNumber,D=x.merge,B=x.pick,O=x.relativeLength,t=x.stableSort,h=x.syncTimeout;z=x.wrap;x=function(){function a(a,d){this.allItems=[];this.contentGroup=this.box=void 0;this.display=!1;this.group=void 0;this.offsetWidth=this.maxLegendWidth=this.maxItemWidth=this.legendWidth=this.legendHeight=this.lastLineHeight=this.lastItemY=this.itemY=this.itemX=this.itemMarginTop=this.itemMarginBottom=
this.itemHeight=this.initialItemY=0;this.options={};this.padding=0;this.pages=[];this.proximate=!1;this.scrollGroup=void 0;this.widthOption=this.totalItemWidth=this.titleHeight=this.symbolWidth=this.symbolHeight=0;this.chart=a;this.init(a,d)}a.prototype.init=function(a,d){this.chart=a;this.setOptions(d);d.enabled&&(this.render(),c(this.chart,"endResize",function(){this.legend.positionCheckboxes()}),this.proximate?this.unchartrender=c(this.chart,"render",function(){this.legend.proximatePositions();
this.legend.positionItems()}):this.unchartrender&&this.unchartrender())};a.prototype.setOptions=function(a){var b=B(a.padding,8);this.options=a;this.chart.styledMode||(this.itemStyle=a.itemStyle,this.itemHiddenStyle=D(this.itemStyle,a.itemHiddenStyle));this.itemMarginTop=a.itemMarginTop||0;this.itemMarginBottom=a.itemMarginBottom||0;this.padding=b;this.initialItemY=b-5;this.symbolWidth=B(a.symbolWidth,16);this.pages=[];this.proximate="proximate"===a.layout&&!this.chart.inverted;this.baseline=void 0};
a.prototype.update=function(a,d){var b=this.chart;this.setOptions(D(!0,this.options,a));this.destroy();b.isDirtyLegend=b.isDirtyBox=!0;B(d,!0)&&b.redraw();k(this,"afterUpdate")};a.prototype.colorizeItem=function(a,d){a.legendGroup[d?"removeClass":"addClass"]("highcharts-legend-item-hidden");if(!this.chart.styledMode){var b=this.options,c=a.legendItem,e=a.legendLine,h=a.legendSymbol,f=this.itemHiddenStyle.color;b=d?b.itemStyle.color:f;var g=d?a.color||f:f,l=a.options&&a.options.marker,p={fill:g};c&&
c.css({fill:b,color:b});e&&e.attr({stroke:g});h&&(l&&h.isMarker&&(p=a.pointAttribs(),d||(p.stroke=p.fill=f)),h.attr(p))}k(this,"afterColorizeItem",{item:a,visible:d})};a.prototype.positionItems=function(){this.allItems.forEach(this.positionItem,this);this.chart.isResizing||this.positionCheckboxes()};a.prototype.positionItem=function(a){var b=this,d=this.options,c=d.symbolPadding,e=!d.rtl,h=a._legendItemPos;d=h[0];h=h[1];var g=a.checkbox,l=a.legendGroup;l&&l.element&&(c={translateX:e?d:this.legendWidth-
d-2*c-4,translateY:h},e=function(){k(b,"afterPositionItem",{item:a})},f(l.translateY)?l.animate(c,void 0,e):(l.attr(c),e()));g&&(g.x=d,g.y=h)};a.prototype.destroyItem=function(a){var b=a.checkbox;["legendItem","legendLine","legendSymbol","legendGroup"].forEach(function(b){a[b]&&(a[b]=a[b].destroy())});b&&v(a.checkbox)};a.prototype.destroy=function(){function a(a){this[a]&&(this[a]=this[a].destroy())}this.getAllItems().forEach(function(b){["legendItem","legendGroup"].forEach(a,b)});"clipRect up down pager nav box title group".split(" ").forEach(a,
this);this.display=null};a.prototype.positionCheckboxes=function(){var a=this.group&&this.group.alignAttr,d=this.clipHeight||this.legendHeight,c=this.titleHeight;if(a){var e=a.translateY;this.allItems.forEach(function(b){var h=b.checkbox;if(h){var f=e+c+h.y+(this.scrollOffset||0)+3;l(h,{left:a.translateX+b.checkboxOffset+h.x-20+"px",top:f+"px",display:this.proximate||f>e-6&&f<e+d-6?"":"none"})}},this)}};a.prototype.renderTitle=function(){var a=this.options,d=this.padding,c=a.title,e=0;c.text&&(this.title||
(this.title=this.chart.renderer.label(c.text,d-3,d-4,null,null,null,a.useHTML,null,"legend-title").attr({zIndex:1}),this.chart.styledMode||this.title.css(c.style),this.title.add(this.group)),c.width||this.title.css({width:this.maxLegendWidth+"px"}),a=this.title.getBBox(),e=a.height,this.offsetWidth=a.width,this.contentGroup.attr({translateY:e}));this.titleHeight=e};a.prototype.setText=function(a){var b=this.options;a.legendItem.attr({text:b.labelFormat?n(b.labelFormat,a,this.chart):b.labelFormatter.call(a)})};
a.prototype.renderItem=function(a){var b=this.chart,d=b.renderer,c=this.options,e=this.symbolWidth,h=c.symbolPadding||0,f=this.itemStyle,g=this.itemHiddenStyle,k="horizontal"===c.layout?B(c.itemDistance,20):0,l=!c.rtl,m=!a.series,n=!m&&a.series.drawLegendSymbol?a.series:a,q=n.options,t=this.createCheckboxForItem&&q&&q.showCheckbox,v=c.useHTML,r=a.options.className,I=a.legendItem;q=e+h+k+(t?20:0);I||(a.legendGroup=d.g("legend-item").addClass("highcharts-"+n.type+"-series highcharts-color-"+a.colorIndex+
(r?" "+r:"")+(m?" highcharts-series-"+a.index:"")).attr({zIndex:1}).add(this.scrollGroup),a.legendItem=I=d.text("",l?e+h:-h,this.baseline||0,v),b.styledMode||I.css(D(a.visible?f:g)),I.attr({align:l?"left":"right",zIndex:2}).add(a.legendGroup),this.baseline||(this.fontMetrics=d.fontMetrics(b.styledMode?12:f.fontSize,I),this.baseline=this.fontMetrics.f+3+this.itemMarginTop,I.attr("y",this.baseline),this.symbolHeight=c.symbolHeight||this.fontMetrics.f,c.squareSymbol&&(this.symbolWidth=B(c.symbolWidth,
Math.max(this.symbolHeight,16)),q=this.symbolWidth+h+k+(t?20:0),l&&I.attr("x",this.symbolWidth+h))),n.drawLegendSymbol(this,a),this.setItemEvents&&this.setItemEvents(a,I,v));t&&!a.checkbox&&this.createCheckboxForItem&&this.createCheckboxForItem(a);this.colorizeItem(a,a.visible);!b.styledMode&&f.width||I.css({width:(c.itemWidth||this.widthOption||b.spacingBox.width)-q+"px"});this.setText(a);b=I.getBBox();a.itemWidth=a.checkboxOffset=c.itemWidth||a.legendItemWidth||b.width+q;this.maxItemWidth=Math.max(this.maxItemWidth,
a.itemWidth);this.totalItemWidth+=a.itemWidth;this.itemHeight=a.itemHeight=Math.round(a.legendItemHeight||b.height||this.symbolHeight)};a.prototype.layoutItem=function(a){var b=this.options,d=this.padding,c="horizontal"===b.layout,e=a.itemHeight,h=this.itemMarginBottom,f=this.itemMarginTop,g=c?B(b.itemDistance,20):0,k=this.maxLegendWidth;b=b.alignColumns&&this.totalItemWidth>k?this.maxItemWidth:a.itemWidth;c&&this.itemX-d+b>k&&(this.itemX=d,this.lastLineHeight&&(this.itemY+=f+this.lastLineHeight+
h),this.lastLineHeight=0);this.lastItemY=f+this.itemY+h;this.lastLineHeight=Math.max(e,this.lastLineHeight);a._legendItemPos=[this.itemX,this.itemY];c?this.itemX+=b:(this.itemY+=f+e+h,this.lastLineHeight=e);this.offsetWidth=this.widthOption||Math.max((c?this.itemX-d-(a.checkbox?0:g):b)+d,this.offsetWidth)};a.prototype.getAllItems=function(){var a=[];this.chart.series.forEach(function(b){var d=b&&b.options;b&&B(d.showInLegend,f(d.linkedTo)?!1:void 0,!0)&&(a=a.concat(b.legendItems||("point"===d.legendType?
b.data:b)))});k(this,"afterGetAllItems",{allItems:a});return a};a.prototype.getAlignment=function(){var a=this.options;return this.proximate?a.align.charAt(0)+"tv":a.floating?"":a.align.charAt(0)+a.verticalAlign.charAt(0)+a.layout.charAt(0)};a.prototype.adjustMargins=function(a,d){var b=this.chart,c=this.options,e=this.getAlignment();e&&[/(lth|ct|rth)/,/(rtv|rm|rbv)/,/(rbh|cb|lbh)/,/(lbv|lm|ltv)/].forEach(function(h,g){h.test(e)&&!f(a[g])&&(b[m[g]]=Math.max(b[m[g]],b.legend[(g+1)%2?"legendHeight":
"legendWidth"]+[1,-1,-1,1][g]*c[g%2?"x":"y"]+B(c.margin,12)+d[g]+(b.titleOffset[g]||0)))})};a.prototype.proximatePositions=function(){var a=this.chart,d=[],c="left"===this.options.align;this.allItems.forEach(function(b){var e;var h=c;if(b.yAxis){b.xAxis.options.reversed&&(h=!h);b.points&&(e=q(h?b.points:b.points.slice(0).reverse(),function(a){return I(a.plotY)}));h=this.itemMarginTop+b.legendItem.getBBox().height+this.itemMarginBottom;var f=b.yAxis.top-a.plotTop;b.visible?(e=e?e.plotY:b.yAxis.height,
e+=f-.3*h):e=f+b.yAxis.height;d.push({target:e,size:h,item:b})}},this);g(d,a.plotHeight).forEach(function(b){b.item._legendItemPos&&(b.item._legendItemPos[1]=a.plotTop-a.spacing[0]+b.pos)})};a.prototype.render=function(){var a=this.chart,d=a.renderer,c=this.options,e=this.padding,h=this.getAllItems(),f=this.group,g=this.box;this.itemX=e;this.itemY=this.initialItemY;this.lastItemY=this.offsetWidth=0;this.widthOption=O(c.width,a.spacingBox.width-e);var l=a.spacingBox.width-2*e-c.x;-1<["rm","lm"].indexOf(this.getAlignment().substring(0,
2))&&(l/=2);this.maxLegendWidth=this.widthOption||l;f||(this.group=f=d.g("legend").addClass(c.className||"").attr({zIndex:7}).add(),this.contentGroup=d.g().attr({zIndex:1}).add(f),this.scrollGroup=d.g().add(this.contentGroup));this.renderTitle();t(h,function(a,b){return(a.options&&a.options.legendIndex||0)-(b.options&&b.options.legendIndex||0)});c.reversed&&h.reverse();this.allItems=h;this.display=l=!!h.length;this.itemHeight=this.totalItemWidth=this.maxItemWidth=this.lastLineHeight=0;h.forEach(this.renderItem,
this);h.forEach(this.layoutItem,this);h=(this.widthOption||this.offsetWidth)+e;var m=this.lastItemY+this.lastLineHeight+this.titleHeight;m=this.handleOverflow(m);m+=e;g||(this.box=g=d.rect().addClass("highcharts-legend-box").attr({r:c.borderRadius}).add(f),g.isNew=!0);a.styledMode||g.attr({stroke:c.borderColor,"stroke-width":c.borderWidth||0,fill:c.backgroundColor||"none"}).shadow(c.shadow);0<h&&0<m&&(g[g.isNew?"attr":"animate"](g.crisp.call({},{x:0,y:0,width:h,height:m},g.strokeWidth())),g.isNew=
!1);g[l?"show":"hide"]();a.styledMode&&"none"===f.getStyle("display")&&(h=m=0);this.legendWidth=h;this.legendHeight=m;l&&this.align();this.proximate||this.positionItems();k(this,"afterRender")};a.prototype.align=function(a){void 0===a&&(a=this.chart.spacingBox);var b=this.chart,d=this.options,c=a.y;/(lth|ct|rth)/.test(this.getAlignment())&&0<b.titleOffset[0]?c+=b.titleOffset[0]:/(lbh|cb|rbh)/.test(this.getAlignment())&&0<b.titleOffset[2]&&(c-=b.titleOffset[2]);c!==a.y&&(a=D(a,{y:c}));this.group.align(D(d,
{width:this.legendWidth,height:this.legendHeight,verticalAlign:this.proximate?"top":d.verticalAlign}),!0,a)};a.prototype.handleOverflow=function(a){var b=this,d=this.chart,c=d.renderer,e=this.options,h=e.y,f="top"===e.verticalAlign,g=this.padding,k=e.maxHeight,l=e.navigation,m=B(l.animation,!0),n=l.arrowSize||12,q=this.pages,t=this.allItems,v=function(a){"number"===typeof a?N.attr({height:a}):N&&(b.clipRect=N.destroy(),b.contentGroup.clip());b.contentGroup.div&&(b.contentGroup.div.style.clip=a?"rect("+
g+"px,9999px,"+(g+a)+"px,0)":"auto")},r=function(a){b[a]=c.circle(0,0,1.3*n).translate(n/2,n/2).add(U);d.styledMode||b[a].attr("fill","rgba(0,0,0,0.0001)");return b[a]},I,A;h=d.spacingBox.height+(f?-h:h)-g;var U=this.nav,N=this.clipRect;"horizontal"!==e.layout||"middle"===e.verticalAlign||e.floating||(h/=2);k&&(h=Math.min(h,k));q.length=0;a&&0<h&&a>h&&!1!==l.enabled?(this.clipHeight=I=Math.max(h-20-this.titleHeight-g,0),this.currentPage=B(this.currentPage,1),this.fullHeight=a,t.forEach(function(a,
b){var d=a._legendItemPos[1],c=Math.round(a.legendItem.getBBox().height),e=q.length;if(!e||d-q[e-1]>I&&(A||d)!==q[e-1])q.push(A||d),e++;a.pageIx=e-1;A&&(t[b-1].pageIx=e-1);b===t.length-1&&d+c-q[e-1]>I&&d!==A&&(q.push(d),a.pageIx=e);d!==A&&(A=d)}),N||(N=b.clipRect=c.clipRect(0,g,9999,0),b.contentGroup.clip(N)),v(I),U||(this.nav=U=c.g().attr({zIndex:1}).add(this.group),this.up=c.symbol("triangle",0,0,n,n).add(U),r("upTracker").on("click",function(){b.scroll(-1,m)}),this.pager=c.text("",15,10).addClass("highcharts-legend-navigation"),
d.styledMode||this.pager.css(l.style),this.pager.add(U),this.down=c.symbol("triangle-down",0,0,n,n).add(U),r("downTracker").on("click",function(){b.scroll(1,m)})),b.scroll(0),a=h):U&&(v(),this.nav=U.destroy(),this.scrollGroup.attr({translateY:1}),this.clipHeight=0);return a};a.prototype.scroll=function(a,d){var b=this,c=this.chart,e=this.pages,f=e.length,g=this.clipHeight,l=this.options.navigation,m=this.pager,p=this.padding,n=this.currentPage+a;n>f&&(n=f);0<n&&("undefined"!==typeof d&&u(d,c),this.nav.attr({translateX:p,
translateY:g+this.padding+7+this.titleHeight,visibility:"visible"}),[this.up,this.upTracker].forEach(function(a){a.attr({"class":1===n?"highcharts-legend-nav-inactive":"highcharts-legend-nav-active"})}),m.attr({text:n+"/"+f}),[this.down,this.downTracker].forEach(function(a){a.attr({x:18+this.pager.getBBox().width,"class":n===f?"highcharts-legend-nav-inactive":"highcharts-legend-nav-active"})},this),c.styledMode||(this.up.attr({fill:1===n?l.inactiveColor:l.activeColor}),this.upTracker.css({cursor:1===
n?"default":"pointer"}),this.down.attr({fill:n===f?l.inactiveColor:l.activeColor}),this.downTracker.css({cursor:n===f?"default":"pointer"})),this.scrollOffset=-e[n-1]+this.initialItemY,this.scrollGroup.animate({translateY:this.scrollOffset}),this.currentPage=n,this.positionCheckboxes(),a=r(B(d,c.renderer.globalAnimation,!0)),h(function(){k(b,"afterScroll",{currentPage:n})},a.duration))};a.prototype.setItemEvents=function(a,d,c){var b=this,e=b.chart.renderer.boxWrapper,h=a instanceof E,f="highcharts-legend-"+
(h?"point":"series")+"-active",g=b.chart.styledMode,l=function(d){b.allItems.forEach(function(b){a!==b&&[b].concat(b.linkedSeries||[]).forEach(function(a){a.setState(d,!h)})})};(c?[d,a.legendSymbol]:[a.legendGroup]).forEach(function(c){if(c)c.on("mouseover",function(){a.visible&&l("inactive");a.setState("hover");a.visible&&e.addClass(f);g||d.css(b.options.itemHoverStyle)}).on("mouseout",function(){b.chart.styledMode||d.css(D(a.visible?b.itemStyle:b.itemHiddenStyle));l("");e.removeClass(f);a.setState()}).on("click",
function(b){var d=function(){a.setVisible&&a.setVisible();l(a.visible?"inactive":"")};e.removeClass(f);b={browserEvent:b};a.firePointEvent?a.firePointEvent("legendItemClick",b,d):k(a,"legendItemClick",b,d)})})};a.prototype.createCheckboxForItem=function(a){a.checkbox=e("input",{type:"checkbox",className:"highcharts-legend-checkbox",checked:a.selected,defaultChecked:a.selected},this.options.itemCheckboxStyle,this.chart.container);c(a.checkbox,"click",function(b){k(a.series||a,"checkboxClick",{checked:b.target.checked,
item:a},function(){a.select()})})};return a}();(/Trident\/7\.0/.test(C.navigator&&C.navigator.userAgent)||a)&&z(x.prototype,"positionItem",function(a,b){var d=this,c=function(){b._legendItemPos&&a.call(d,b)};c();d.bubbleLegend||setTimeout(c)});"";return x});M(a,"Core/Series/SeriesRegistry.js",[a["Core/Globals.js"],a["Core/DefaultOptions.js"],a["Core/Series/Point.js"],a["Core/Utilities.js"]],function(a,w,C,E){var r=w.defaultOptions,x=E.error,J=E.extendClass,u=E.merge,n;(function(m){function g(a,e){var c=
r.plotOptions||{},f=e.defaultOptions;e.prototype.pointClass||(e.prototype.pointClass=C);e.prototype.type=a;f&&(c[a]=f);m.seriesTypes[a]=e}m.seriesTypes=a.seriesTypes;m.getSeries=function(a,e){void 0===e&&(e={});var c=a.options.chart;c=e.type||c.type||c.defaultSeriesType||"";var f=m.seriesTypes[c];m||x(17,!0,a,{missingModuleFor:c});c=new f;"function"===typeof c.init&&c.init(a,e);return c};m.registerSeriesType=g;m.seriesType=function(a,e,l,f,n){var c=r.plotOptions||{};e=e||"";c[a]=u(c[e],l);g(a,J(m.seriesTypes[e]||
function(){},f));m.seriesTypes[a].prototype.type=a;n&&(m.seriesTypes[a].prototype.pointClass=J(C,n));return m.seriesTypes[a]}})(n||(n={}));return n});M(a,"Core/Chart/Chart.js",[a["Core/Animation/AnimationUtilities.js"],a["Core/Axis/Axis.js"],a["Core/FormatUtilities.js"],a["Core/Foundation.js"],a["Core/Globals.js"],a["Core/Legend/Legend.js"],a["Core/MSPointer.js"],a["Core/DefaultOptions.js"],a["Core/Color/Palette.js"],a["Core/Pointer.js"],a["Core/Renderer/RendererRegistry.js"],a["Core/Series/SeriesRegistry.js"],
a["Core/Renderer/SVG/SVGRenderer.js"],a["Core/Time.js"],a["Core/Utilities.js"],a["Core/Renderer/HTML/AST.js"]],function(a,w,C,E,z,x,J,u,n,m,g,c,e,l,f,v){var q=a.animate,k=a.animObject,r=a.setAnimation,D=C.numberFormat,B=E.registerEventOptions,O=z.charts,t=z.doc,h=z.marginNames,d=z.svg,b=z.win,p=u.defaultOptions,G=u.defaultTime,y=c.seriesTypes,L=f.addEvent,F=f.attr,P=f.cleanRecursively,S=f.createElement,Q=f.css,V=f.defined,fa=f.discardElement,H=f.erase,K=f.error,M=f.extend,ha=f.find,R=f.fireEvent,
Z=f.getStyle,A=f.isArray,U=f.isNumber,N=f.isObject,W=f.isString,X=f.merge,Y=f.objectEach,T=f.pick,da=f.pInt,ka=f.relativeLength,ja=f.removeEvent,ba=f.splat,ea=f.syncTimeout,ma=f.uniqueKey;a=function(){function a(a,b,d){this.series=this.renderTo=this.renderer=this.pointer=this.pointCount=this.plotWidth=this.plotTop=this.plotLeft=this.plotHeight=this.plotBox=this.options=this.numberFormatter=this.margin=this.legend=this.labelCollectors=this.isResizing=this.index=this.eventOptions=this.container=this.colorCounter=
this.clipBox=this.chartWidth=this.chartHeight=this.bounds=this.axisOffset=this.axes=void 0;this.sharedClips={};this.yAxis=this.xAxis=this.userOptions=this.titleOffset=this.time=this.symbolCounter=this.spacingBox=this.spacing=void 0;this.getArgs(a,b,d)}a.chart=function(b,d,c){return new a(b,d,c)};a.prototype.getArgs=function(a,b,d){W(a)||a.nodeName?(this.renderTo=a,this.init(b,d)):this.init(a,b)};a.prototype.init=function(a,b){var d=a.plotOptions||{};R(this,"init",{args:arguments},function(){var c=
X(p,a),e=c.chart;Y(c.plotOptions,function(a,b){N(a)&&(a.tooltip=d[b]&&X(d[b].tooltip)||void 0)});c.tooltip.userOptions=a.chart&&a.chart.forExport&&a.tooltip.userOptions||a.tooltip;this.userOptions=a;this.margin=[];this.spacing=[];this.bounds={h:{},v:{}};this.labelCollectors=[];this.callback=b;this.isResizing=0;this.options=c;this.axes=[];this.series=[];this.time=a.time&&Object.keys(a.time).length?new l(a.time):z.time;this.numberFormatter=e.numberFormatter||D;this.styledMode=e.styledMode;this.hasCartesianSeries=
e.showAxes;this.index=O.length;O.push(this);z.chartCount++;B(this,e);this.xAxis=[];this.yAxis=[];this.pointCount=this.colorCounter=this.symbolCounter=0;R(this,"afterInit");this.firstRender()})};a.prototype.initSeries=function(a){var b=this.options.chart;b=a.type||b.type||b.defaultSeriesType;var d=y[b];d||K(17,!0,this,{missingModuleFor:b});b=new d;"function"===typeof b.init&&b.init(this,a);return b};a.prototype.setSeriesData=function(){this.getSeriesOrderByLinks().forEach(function(a){a.points||a.data||
!a.enabledDataSorting||a.setData(a.options.data,!1)})};a.prototype.getSeriesOrderByLinks=function(){return this.series.concat().sort(function(a,b){return a.linkedSeries.length||b.linkedSeries.length?b.linkedSeries.length-a.linkedSeries.length:0})};a.prototype.orderSeries=function(a){var b=this.series;a=a||0;for(var d=b.length;a<d;++a)b[a]&&(b[a].index=a,b[a].name=b[a].getName())};a.prototype.isInsidePlot=function(a,b,d){void 0===d&&(d={});var c=this.inverted,e=this.plotBox,h=this.plotLeft,f=this.plotTop,
g=this.scrollablePlotBox,k=0;var l=0;d.visiblePlotOnly&&this.scrollingContainer&&(l=this.scrollingContainer,k=l.scrollLeft,l=l.scrollTop);var m=d.series;e=d.visiblePlotOnly&&g||e;g=d.inverted?b:a;b=d.inverted?a:b;a={x:g,y:b,isInsidePlot:!0};if(!d.ignoreX){var A=m&&(c?m.yAxis:m.xAxis)||{pos:h,len:Infinity};g=d.paneCoordinates?A.pos+g:h+g;g>=Math.max(k+h,A.pos)&&g<=Math.min(k+h+e.width,A.pos+A.len)||(a.isInsidePlot=!1)}!d.ignoreY&&a.isInsidePlot&&(c=m&&(c?m.xAxis:m.yAxis)||{pos:f,len:Infinity},d=d.paneCoordinates?
c.pos+b:f+b,d>=Math.max(l+f,c.pos)&&d<=Math.min(l+f+e.height,c.pos+c.len)||(a.isInsidePlot=!1));R(this,"afterIsInsidePlot",a);return a.isInsidePlot};a.prototype.redraw=function(a){R(this,"beforeRedraw");var b=this.hasCartesianSeries?this.axes:this.colorAxis||[],d=this.series,c=this.pointer,e=this.legend,h=this.userOptions.legend,f=this.renderer,g=f.isHidden(),k=[],l=this.isDirtyBox,m=this.isDirtyLegend;this.setResponsive&&this.setResponsive(!1);r(this.hasRendered?a:!1,this);g&&this.temporaryDisplay();
this.layOutTitles();for(a=d.length;a--;){var A=d[a];if(A.options.stacking||A.options.centerInCategory){var p=!0;if(A.isDirty){var n=!0;break}}}if(n)for(a=d.length;a--;)A=d[a],A.options.stacking&&(A.isDirty=!0);d.forEach(function(a){a.isDirty&&("point"===a.options.legendType?("function"===typeof a.updateTotals&&a.updateTotals(),m=!0):h&&(h.labelFormatter||h.labelFormat)&&(m=!0));a.isDirtyData&&R(a,"updatedData")});m&&e&&e.options.enabled&&(e.render(),this.isDirtyLegend=!1);p&&this.getStacks();b.forEach(function(a){a.updateNames();
a.setScale()});this.getMargins();b.forEach(function(a){a.isDirty&&(l=!0)});b.forEach(function(a){var b=a.min+","+a.max;a.extKey!==b&&(a.extKey=b,k.push(function(){R(a,"afterSetExtremes",M(a.eventArgs,a.getExtremes()));delete a.eventArgs}));(l||p)&&a.redraw()});l&&this.drawChartBox();R(this,"predraw");d.forEach(function(a){(l||a.isDirty)&&a.visible&&a.redraw();a.isDirtyData=!1});c&&c.reset(!0);f.draw();R(this,"redraw");R(this,"render");g&&this.temporaryDisplay(!0);k.forEach(function(a){a.call()})};
a.prototype.get=function(a){function b(b){return b.id===a||b.options&&b.options.id===a}for(var d=this.series,c=ha(this.axes,b)||ha(this.series,b),e=0;!c&&e<d.length;e++)c=ha(d[e].points||[],b);return c};a.prototype.getAxes=function(){var a=this,b=this.options,d=b.xAxis=ba(b.xAxis||{});b=b.yAxis=ba(b.yAxis||{});R(this,"getAxes");d.forEach(function(a,b){a.index=b;a.isX=!0});b.forEach(function(a,b){a.index=b});d.concat(b).forEach(function(b){new w(a,b)});R(this,"afterGetAxes")};a.prototype.getSelectedPoints=
function(){return this.series.reduce(function(a,b){b.getPointsCollection().forEach(function(b){T(b.selectedStaging,b.selected)&&a.push(b)});return a},[])};a.prototype.getSelectedSeries=function(){return this.series.filter(function(a){return a.selected})};a.prototype.setTitle=function(a,b,d){this.applyDescription("title",a);this.applyDescription("subtitle",b);this.applyDescription("caption",void 0);this.layOutTitles(d)};a.prototype.applyDescription=function(a,b){var d=this,c="title"===a?{color:n.neutralColor80,
fontSize:this.options.isStock?"16px":"18px"}:{color:n.neutralColor60};c=this.options[a]=X(!this.styledMode&&{style:c},this.options[a],b);var e=this[a];e&&b&&(this[a]=e=e.destroy());c&&!e&&(e=this.renderer.text(c.text,0,0,c.useHTML).attr({align:c.align,"class":"highcharts-"+a,zIndex:c.zIndex||4}).add(),e.update=function(b){d[{title:"setTitle",subtitle:"setSubtitle",caption:"setCaption"}[a]](b)},this.styledMode||e.css(c.style),this[a]=e)};a.prototype.layOutTitles=function(a){var b=[0,0,0],d=this.renderer,
c=this.spacingBox;["title","subtitle","caption"].forEach(function(a){var e=this[a],h=this.options[a],f=h.verticalAlign||"top";a="title"===a?"top"===f?-3:0:"top"===f?b[0]+2:0;var g;if(e){this.styledMode||(g=h.style&&h.style.fontSize);g=d.fontMetrics(g,e).b;e.css({width:(h.width||c.width+(h.widthAdjust||0))+"px"});var k=Math.round(e.getBBox(h.useHTML).height);e.align(M({y:"bottom"===f?g:a+g,height:k},h),!1,"spacingBox");h.floating||("top"===f?b[0]=Math.ceil(b[0]+k):"bottom"===f&&(b[2]=Math.ceil(b[2]+
k)))}},this);b[0]&&"top"===(this.options.title.verticalAlign||"top")&&(b[0]+=this.options.title.margin);b[2]&&"bottom"===this.options.caption.verticalAlign&&(b[2]+=this.options.caption.margin);var e=!this.titleOffset||this.titleOffset.join(",")!==b.join(",");this.titleOffset=b;R(this,"afterLayOutTitles");!this.isDirtyBox&&e&&(this.isDirtyBox=this.isDirtyLegend=e,this.hasRendered&&T(a,!0)&&this.isDirtyBox&&this.redraw())};a.prototype.getChartSize=function(){var a=this.options.chart,b=a.width;a=a.height;
var d=this.renderTo;V(b)||(this.containerWidth=Z(d,"width"));V(a)||(this.containerHeight=Z(d,"height"));this.chartWidth=Math.max(0,b||this.containerWidth||600);this.chartHeight=Math.max(0,ka(a,this.chartWidth)||(1<this.containerHeight?this.containerHeight:400))};a.prototype.temporaryDisplay=function(a){var b=this.renderTo;if(a)for(;b&&b.style;)b.hcOrigStyle&&(Q(b,b.hcOrigStyle),delete b.hcOrigStyle),b.hcOrigDetached&&(t.body.removeChild(b),b.hcOrigDetached=!1),b=b.parentNode;else for(;b&&b.style;){t.body.contains(b)||
b.parentNode||(b.hcOrigDetached=!0,t.body.appendChild(b));if("none"===Z(b,"display",!1)||b.hcOricDetached)b.hcOrigStyle={display:b.style.display,height:b.style.height,overflow:b.style.overflow},a={display:"block",overflow:"hidden"},b!==this.renderTo&&(a.height=0),Q(b,a),b.offsetWidth||b.style.setProperty("display","block","important");b=b.parentNode;if(b===t.body)break}};a.prototype.setClassName=function(a){this.container.className="highcharts-container "+(a||"")};a.prototype.getContainer=function(){var a=
this.options,b=a.chart,c=ma(),h,f=this.renderTo;f||(this.renderTo=f=b.renderTo);W(f)&&(this.renderTo=f=t.getElementById(f));f||K(13,!0,this);var k=da(F(f,"data-highcharts-chart"));U(k)&&O[k]&&O[k].hasRendered&&O[k].destroy();F(f,"data-highcharts-chart",this.index);f.innerHTML="";b.skipClone||f.offsetWidth||this.temporaryDisplay();this.getChartSize();k=this.chartWidth;var l=this.chartHeight;Q(f,{overflow:"hidden"});this.styledMode||(h=M({position:"relative",overflow:"hidden",width:k+"px",height:l+
"px",textAlign:"left",lineHeight:"normal",zIndex:0,"-webkit-tap-highlight-color":"rgba(0,0,0,0)",userSelect:"none","touch-action":"manipulation",outline:"none"},b.style||{}));this.container=c=S("div",{id:c},h,f);this._cursor=c.style.cursor;this.renderer=new (b.renderer||!d?g.getRendererType(b.renderer):e)(c,k,l,void 0,b.forExport,a.exporting&&a.exporting.allowHTML,this.styledMode);r(void 0,this);this.setClassName(b.className);if(this.styledMode)for(var m in a.defs)this.renderer.definition(a.defs[m]);
else this.renderer.setStyle(b.style);this.renderer.chartIndex=this.index;R(this,"afterGetContainer")};a.prototype.getMargins=function(a){var b=this.spacing,d=this.margin,c=this.titleOffset;this.resetMargins();c[0]&&!V(d[0])&&(this.plotTop=Math.max(this.plotTop,c[0]+b[0]));c[2]&&!V(d[2])&&(this.marginBottom=Math.max(this.marginBottom,c[2]+b[2]));this.legend&&this.legend.display&&this.legend.adjustMargins(d,b);R(this,"getMargins");a||this.getAxisMargins()};a.prototype.getAxisMargins=function(){var a=
this,b=a.axisOffset=[0,0,0,0],d=a.colorAxis,c=a.margin,e=function(a){a.forEach(function(a){a.visible&&a.getOffset()})};a.hasCartesianSeries?e(a.axes):d&&d.length&&e(d);h.forEach(function(d,e){V(c[e])||(a[d]+=b[e])});a.setChartSize()};a.prototype.reflow=function(a){var d=this,c=d.options.chart,e=d.renderTo,h=V(c.width)&&V(c.height),g=c.width||Z(e,"width");c=c.height||Z(e,"height");e=a?a.target:b;delete d.pointer.chartPosition;if(!h&&!d.isPrinting&&g&&c&&(e===b||e===t)){if(g!==d.containerWidth||c!==
d.containerHeight)f.clearTimeout(d.reflowTimeout),d.reflowTimeout=ea(function(){d.container&&d.setSize(void 0,void 0,!1)},a?100:0);d.containerWidth=g;d.containerHeight=c}};a.prototype.setReflow=function(a){var d=this;!1===a||this.unbindReflow?!1===a&&this.unbindReflow&&(this.unbindReflow=this.unbindReflow()):(this.unbindReflow=L(b,"resize",function(a){d.options&&d.reflow(a)}),L(this,"destroy",this.unbindReflow))};a.prototype.setSize=function(a,b,d){var c=this,e=c.renderer;c.isResizing+=1;r(d,c);d=
e.globalAnimation;c.oldChartHeight=c.chartHeight;c.oldChartWidth=c.chartWidth;"undefined"!==typeof a&&(c.options.chart.width=a);"undefined"!==typeof b&&(c.options.chart.height=b);c.getChartSize();c.styledMode||(d?q:Q)(c.container,{width:c.chartWidth+"px",height:c.chartHeight+"px"},d);c.setChartSize(!0);e.setSize(c.chartWidth,c.chartHeight,d);c.axes.forEach(function(a){a.isDirty=!0;a.setScale()});c.isDirtyLegend=!0;c.isDirtyBox=!0;c.layOutTitles();c.getMargins();c.redraw(d);c.oldChartHeight=null;R(c,
"resize");ea(function(){c&&R(c,"endResize",null,function(){--c.isResizing})},k(d).duration)};a.prototype.setChartSize=function(a){var b=this.inverted,d=this.renderer,c=this.chartWidth,e=this.chartHeight,h=this.options.chart,f=this.spacing,g=this.clipOffset,k,l,m,A;this.plotLeft=k=Math.round(this.plotLeft);this.plotTop=l=Math.round(this.plotTop);this.plotWidth=m=Math.max(0,Math.round(c-k-this.marginRight));this.plotHeight=A=Math.max(0,Math.round(e-l-this.marginBottom));this.plotSizeX=b?A:m;this.plotSizeY=
b?m:A;this.plotBorderWidth=h.plotBorderWidth||0;this.spacingBox=d.spacingBox={x:f[3],y:f[0],width:c-f[3]-f[1],height:e-f[0]-f[2]};this.plotBox=d.plotBox={x:k,y:l,width:m,height:A};b=2*Math.floor(this.plotBorderWidth/2);c=Math.ceil(Math.max(b,g[3])/2);e=Math.ceil(Math.max(b,g[0])/2);this.clipBox={x:c,y:e,width:Math.floor(this.plotSizeX-Math.max(b,g[1])/2-c),height:Math.max(0,Math.floor(this.plotSizeY-Math.max(b,g[2])/2-e))};a||(this.axes.forEach(function(a){a.setAxisSize();a.setAxisTranslation()}),
d.alignElements());R(this,"afterSetChartSize",{skipAxes:a})};a.prototype.resetMargins=function(){R(this,"resetMargins");var a=this,b=a.options.chart;["margin","spacing"].forEach(function(d){var c=b[d],e=N(c)?c:[c,c,c,c];["Top","Right","Bottom","Left"].forEach(function(c,h){a[d][h]=T(b[d+c],e[h])})});h.forEach(function(b,d){a[b]=T(a.margin[d],a.spacing[d])});a.axisOffset=[0,0,0,0];a.clipOffset=[0,0,0,0]};a.prototype.drawChartBox=function(){var a=this.options.chart,b=this.renderer,d=this.chartWidth,
c=this.chartHeight,e=this.styledMode,h=this.plotBGImage,f=a.backgroundColor,g=a.plotBackgroundColor,k=a.plotBackgroundImage,l=this.plotLeft,m=this.plotTop,A=this.plotWidth,p=this.plotHeight,n=this.plotBox,q=this.clipRect,N=this.clipBox,t=this.chartBackground,v=this.plotBackground,r=this.plotBorder,B,y="animate";t||(this.chartBackground=t=b.rect().addClass("highcharts-background").add(),y="attr");if(e)var I=B=t.strokeWidth();else{I=a.borderWidth||0;B=I+(a.shadow?8:0);f={fill:f||"none"};if(I||t["stroke-width"])f.stroke=
a.borderColor,f["stroke-width"]=I;t.attr(f).shadow(a.shadow)}t[y]({x:B/2,y:B/2,width:d-B-I%2,height:c-B-I%2,r:a.borderRadius});y="animate";v||(y="attr",this.plotBackground=v=b.rect().addClass("highcharts-plot-background").add());v[y](n);e||(v.attr({fill:g||"none"}).shadow(a.plotShadow),k&&(h?(k!==h.attr("href")&&h.attr("href",k),h.animate(n)):this.plotBGImage=b.image(k,l,m,A,p).add()));q?q.animate({width:N.width,height:N.height}):this.clipRect=b.clipRect(N);y="animate";r||(y="attr",this.plotBorder=
r=b.rect().addClass("highcharts-plot-border").attr({zIndex:1}).add());e||r.attr({stroke:a.plotBorderColor,"stroke-width":a.plotBorderWidth||0,fill:"none"});r[y](r.crisp({x:l,y:m,width:A,height:p},-r.strokeWidth()));this.isDirtyBox=!1;R(this,"afterDrawChartBox")};a.prototype.propFromSeries=function(){var a=this,b=a.options.chart,d=a.options.series,c,e,h;["inverted","angular","polar"].forEach(function(f){e=y[b.type||b.defaultSeriesType];h=b[f]||e&&e.prototype[f];for(c=d&&d.length;!h&&c--;)(e=y[d[c].type])&&
e.prototype[f]&&(h=!0);a[f]=h})};a.prototype.linkSeries=function(){var a=this,b=a.series;b.forEach(function(a){a.linkedSeries.length=0});b.forEach(function(b){var d=b.options.linkedTo;W(d)&&(d=":previous"===d?a.series[b.index-1]:a.get(d))&&d.linkedParent!==b&&(d.linkedSeries.push(b),b.linkedParent=d,d.enabledDataSorting&&b.setDataSortingOptions(),b.visible=T(b.options.visible,d.options.visible,b.visible))});R(this,"afterLinkSeries")};a.prototype.renderSeries=function(){this.series.forEach(function(a){a.translate();
a.render()})};a.prototype.renderLabels=function(){var a=this,b=a.options.labels;b.items&&b.items.forEach(function(d){var c=M(b.style,d.style),e=da(c.left)+a.plotLeft,h=da(c.top)+a.plotTop+12;delete c.left;delete c.top;a.renderer.text(d.html,e,h).attr({zIndex:2}).css(c).add()})};a.prototype.render=function(){var a=this.axes,b=this.colorAxis,d=this.renderer,c=this.options,e=function(a){a.forEach(function(a){a.visible&&a.render()})},h=0;this.setTitle();this.legend=new x(this,c.legend);this.getStacks&&
this.getStacks();this.getMargins(!0);this.setChartSize();c=this.plotWidth;a.some(function(a){if(a.horiz&&a.visible&&a.options.labels.enabled&&a.series.length)return h=21,!0});var f=this.plotHeight=Math.max(this.plotHeight-h,0);a.forEach(function(a){a.setScale()});this.getAxisMargins();var g=1.1<c/this.plotWidth,k=1.05<f/this.plotHeight;if(g||k)a.forEach(function(a){(a.horiz&&g||!a.horiz&&k)&&a.setTickInterval(!0)}),this.getMargins();this.drawChartBox();this.hasCartesianSeries?e(a):b&&b.length&&e(b);
this.seriesGroup||(this.seriesGroup=d.g("series-group").attr({zIndex:3}).add());this.renderSeries();this.renderLabels();this.addCredits();this.setResponsive&&this.setResponsive();this.hasRendered=!0};a.prototype.addCredits=function(a){var d=this,c=X(!0,this.options.credits,a);c.enabled&&!this.credits&&(this.credits=this.renderer.text(c.text+(this.mapCredits||""),0,0).addClass("highcharts-credits").on("click",function(){c.href&&(b.location.href=c.href)}).attr({align:c.position.align,zIndex:8}),d.styledMode||
this.credits.css(c.style),this.credits.add().align(c.position),this.credits.update=function(a){d.credits=d.credits.destroy();d.addCredits(a)})};a.prototype.destroy=function(){var a=this,b=a.axes,d=a.series,c=a.container,e=c&&c.parentNode,h;R(a,"destroy");a.renderer.forExport?H(O,a):O[a.index]=void 0;z.chartCount--;a.renderTo.removeAttribute("data-highcharts-chart");ja(a);for(h=b.length;h--;)b[h]=b[h].destroy();this.scroller&&this.scroller.destroy&&this.scroller.destroy();for(h=d.length;h--;)d[h]=
d[h].destroy();"title subtitle chartBackground plotBackground plotBGImage plotBorder seriesGroup clipRect credits pointer rangeSelector legend resetZoomButton tooltip renderer".split(" ").forEach(function(b){var d=a[b];d&&d.destroy&&(a[b]=d.destroy())});c&&(c.innerHTML="",ja(c),e&&fa(c));Y(a,function(b,d){delete a[d]})};a.prototype.firstRender=function(){var a=this,b=a.options;if(!a.isReadyToRender||a.isReadyToRender()){a.getContainer();a.resetMargins();a.setChartSize();a.propFromSeries();a.getAxes();
(A(b.series)?b.series:[]).forEach(function(b){a.initSeries(b)});a.linkSeries();a.setSeriesData();R(a,"beforeRender");m&&(J.isRequired()?a.pointer=new J(a,b):a.pointer=new m(a,b));a.render();a.pointer.getChartPosition();if(!a.renderer.imgCount&&!a.hasLoaded)a.onload();a.temporaryDisplay(!0)}};a.prototype.onload=function(){this.callbacks.concat([this.callback]).forEach(function(a){a&&"undefined"!==typeof this.index&&a.apply(this,[this])},this);R(this,"load");R(this,"render");V(this.index)&&this.setReflow(this.options.chart.reflow);
this.hasLoaded=!0};a.prototype.addSeries=function(a,b,d){var c=this,e;a&&(b=T(b,!0),R(c,"addSeries",{options:a},function(){e=c.initSeries(a);c.isDirtyLegend=!0;c.linkSeries();e.enabledDataSorting&&e.setData(a.data,!1);R(c,"afterAddSeries",{series:e});b&&c.redraw(d)}));return e};a.prototype.addAxis=function(a,b,d,c){return this.createAxis(b?"xAxis":"yAxis",{axis:a,redraw:d,animation:c})};a.prototype.addColorAxis=function(a,b,d){return this.createAxis("colorAxis",{axis:a,redraw:b,animation:d})};a.prototype.createAxis=
function(a,b){a=new w(this,X(b.axis,{index:this[a].length,isX:"xAxis"===a}));T(b.redraw,!0)&&this.redraw(b.animation);return a};a.prototype.showLoading=function(a){var b=this,d=b.options,c=d.loading,e=function(){h&&Q(h,{left:b.plotLeft+"px",top:b.plotTop+"px",width:b.plotWidth+"px",height:b.plotHeight+"px"})},h=b.loadingDiv,f=b.loadingSpan;h||(b.loadingDiv=h=S("div",{className:"highcharts-loading highcharts-loading-hidden"},null,b.container));f||(b.loadingSpan=f=S("span",{className:"highcharts-loading-inner"},
null,h),L(b,"redraw",e));h.className="highcharts-loading";v.setElementHTML(f,T(a,d.lang.loading,""));b.styledMode||(Q(h,M(c.style,{zIndex:10})),Q(f,c.labelStyle),b.loadingShown||(Q(h,{opacity:0,display:""}),q(h,{opacity:c.style.opacity||.5},{duration:c.showDuration||0})));b.loadingShown=!0;e()};a.prototype.hideLoading=function(){var a=this.options,b=this.loadingDiv;b&&(b.className="highcharts-loading highcharts-loading-hidden",this.styledMode||q(b,{opacity:0},{duration:a.loading.hideDuration||100,
complete:function(){Q(b,{display:"none"})}}));this.loadingShown=!1};a.prototype.update=function(a,b,d,c){var e=this,h={credits:"addCredits",title:"setTitle",subtitle:"setSubtitle",caption:"setCaption"},f=a.isResponsiveOptions,g=[],k,m;R(e,"update",{options:a});f||e.setResponsive(!1,!0);a=P(a,e.options);e.userOptions=X(e.userOptions,a);var A=a.chart;if(A){X(!0,e.options.chart,A);"className"in A&&e.setClassName(A.className);"reflow"in A&&e.setReflow(A.reflow);if("inverted"in A||"polar"in A||"type"in
A){e.propFromSeries();var p=!0}"alignTicks"in A&&(p=!0);"events"in A&&B(this,A);Y(A,function(a,b){-1!==e.propsRequireUpdateSeries.indexOf("chart."+b)&&(k=!0);-1!==e.propsRequireDirtyBox.indexOf(b)&&(e.isDirtyBox=!0);-1!==e.propsRequireReflow.indexOf(b)&&(f?e.isDirtyBox=!0:m=!0)});!e.styledMode&&A.style&&e.renderer.setStyle(e.options.chart.style||{})}!e.styledMode&&a.colors&&(this.options.colors=a.colors);a.time&&(this.time===G&&(this.time=new l(a.time)),X(!0,e.options.time,a.time));Y(a,function(b,
d){if(e[d]&&"function"===typeof e[d].update)e[d].update(b,!1);else if("function"===typeof e[h[d]])e[h[d]](b);else"colors"!==d&&-1===e.collectionsWithUpdate.indexOf(d)&&X(!0,e.options[d],a[d]);"chart"!==d&&-1!==e.propsRequireUpdateSeries.indexOf(d)&&(k=!0)});this.collectionsWithUpdate.forEach(function(b){if(a[b]){var c=[];e[b].forEach(function(a,b){a.options.isInternal||c.push(T(a.options.index,b))});ba(a[b]).forEach(function(a,h){var f=V(a.id),g;f&&(g=e.get(a.id));!g&&e[b]&&(g=e[b][c?c[h]:h])&&f&&
V(g.options.id)&&(g=void 0);g&&g.coll===b&&(g.update(a,!1),d&&(g.touched=!0));!g&&d&&e.collectionsWithInit[b]&&(e.collectionsWithInit[b][0].apply(e,[a].concat(e.collectionsWithInit[b][1]||[]).concat([!1])).touched=!0)});d&&e[b].forEach(function(a){a.touched||a.options.isInternal?delete a.touched:g.push(a)})}});g.forEach(function(a){a.chart&&a.remove&&a.remove(!1)});p&&e.axes.forEach(function(a){a.update({},!1)});k&&e.getSeriesOrderByLinks().forEach(function(a){a.chart&&a.update({},!1)},this);p=A&&
A.width;A=A&&(W(A.height)?ka(A.height,p||e.chartWidth):A.height);m||U(p)&&p!==e.chartWidth||U(A)&&A!==e.chartHeight?e.setSize(p,A,c):T(b,!0)&&e.redraw(c);R(e,"afterUpdate",{options:a,redraw:b,animation:c})};a.prototype.setSubtitle=function(a,b){this.applyDescription("subtitle",a);this.layOutTitles(b)};a.prototype.setCaption=function(a,b){this.applyDescription("caption",a);this.layOutTitles(b)};a.prototype.showResetZoom=function(){function a(){b.zoomOut()}var b=this,d=p.lang,c=b.options.chart.resetZoomButton,
e=c.theme,h=e.states,f="chart"===c.relativeTo||"spacingBox"===c.relativeTo?null:"scrollablePlotBox";R(this,"beforeShowResetZoom",null,function(){b.resetZoomButton=b.renderer.button(d.resetZoom,null,null,a,e,h&&h.hover).attr({align:c.position.align,title:d.resetZoomTitle}).addClass("highcharts-reset-zoom").add().align(c.position,!1,f)});R(this,"afterShowResetZoom")};a.prototype.zoomOut=function(){R(this,"selection",{resetSelection:!0},this.zoom)};a.prototype.zoom=function(a){var b=this,d=b.pointer,
c=b.inverted?d.mouseDownX:d.mouseDownY,e=!1,h;!a||a.resetSelection?(b.axes.forEach(function(a){h=a.zoom()}),d.initiated=!1):a.xAxis.concat(a.yAxis).forEach(function(a){var f=a.axis,g=b.inverted?f.left:f.top,k=b.inverted?g+f.width:g+f.height,l=f.isXAxis,A=!1;if(!l&&c>=g&&c<=k||l||!V(c))A=!0;d[l?"zoomX":"zoomY"]&&A&&(h=f.zoom(a.min,a.max),f.displayBtn&&(e=!0))});var f=b.resetZoomButton;e&&!f?b.showResetZoom():!e&&N(f)&&(b.resetZoomButton=f.destroy());h&&b.redraw(T(b.options.chart.animation,a&&a.animation,
100>b.pointCount))};a.prototype.pan=function(a,b){var d=this,c=d.hoverPoints;b="object"===typeof b?b:{enabled:b,type:"x"};var e=d.options.chart,h=d.options.mapNavigation&&d.options.mapNavigation.enabled;e&&e.panning&&(e.panning=b);var f=b.type,g;R(this,"pan",{originalEvent:a},function(){c&&c.forEach(function(a){a.setState()});var b=d.xAxis;"xy"===f?b=b.concat(d.yAxis):"y"===f&&(b=d.yAxis);var e={};b.forEach(function(b){if(b.options.panningEnabled&&!b.options.isInternal){var c=b.horiz,k=a[c?"chartX":
"chartY"];c=c?"mouseDownX":"mouseDownY";var l=d[c],A=b.minPointOffset||0,m=b.reversed&&!d.inverted||!b.reversed&&d.inverted?-1:1,p=b.getExtremes(),n=b.toValue(l-k,!0)+A*m,q=b.toValue(l+b.len-k,!0)-(A*m||b.isXAxis&&b.pointRangePadding||0),t=q<n;m=b.hasVerticalPanning();l=t?q:n;n=t?n:q;var N=b.panningState;!m||b.isXAxis||N&&!N.isDirty||b.series.forEach(function(a){var b=a.getProcessedData(!0);b=a.getExtremes(b.yData,!0);N||(N={startMin:Number.MAX_VALUE,startMax:-Number.MAX_VALUE});U(b.dataMin)&&U(b.dataMax)&&
(N.startMin=Math.min(T(a.options.threshold,Infinity),b.dataMin,N.startMin),N.startMax=Math.max(T(a.options.threshold,-Infinity),b.dataMax,N.startMax))});m=Math.min(T(N&&N.startMin,p.dataMin),A?p.min:b.toValue(b.toPixels(p.min)-b.minPixelPadding));q=Math.max(T(N&&N.startMax,p.dataMax),A?p.max:b.toValue(b.toPixels(p.max)+b.minPixelPadding));b.panningState=N;b.isOrdinal||(A=m-l,0<A&&(n+=A,l=m),A=n-q,0<A&&(n=q,l-=A),b.series.length&&l!==p.min&&n!==p.max&&l>=m&&n<=q&&(b.setExtremes(l,n,!1,!1,{trigger:"pan"}),
d.resetZoomButton||h||l===m||n===q||!f.match("y")||(d.showResetZoom(),b.displayBtn=!1),g=!0),e[c]=k)}});Y(e,function(a,b){d[b]=a});g&&d.redraw(!1);Q(d.container,{cursor:"move"})})};return a}();M(a.prototype,{callbacks:[],collectionsWithInit:{xAxis:[a.prototype.addAxis,[!0]],yAxis:[a.prototype.addAxis,[!1]],series:[a.prototype.addSeries]},collectionsWithUpdate:["xAxis","yAxis","series"],propsRequireDirtyBox:"backgroundColor borderColor borderWidth borderRadius plotBackgroundColor plotBackgroundImage plotBorderColor plotBorderWidth plotShadow shadow".split(" "),
propsRequireReflow:"margin marginTop marginRight marginBottom marginLeft spacing spacingTop spacingRight spacingBottom spacingLeft".split(" "),propsRequireUpdateSeries:"chart.inverted chart.polar chart.ignoreHiddenSeries chart.type colors plotOptions time tooltip".split(" ")});"";return a});M(a,"Core/Legend/LegendSymbol.js",[a["Core/Utilities.js"]],function(a){var r=a.merge,C=a.pick,E;(function(a){a.drawLineMarker=function(a){var x=this.options,u=a.symbolWidth,n=a.symbolHeight,m=n/2,g=this.chart.renderer,
c=this.legendGroup;a=a.baseline-Math.round(.3*a.fontMetrics.b);var e={},l=x.marker;this.chart.styledMode||(e={"stroke-width":x.lineWidth||0},x.dashStyle&&(e.dashstyle=x.dashStyle));this.legendLine=g.path([["M",0,a],["L",u,a]]).addClass("highcharts-graph").attr(e).add(c);l&&!1!==l.enabled&&u&&(x=Math.min(C(l.radius,m),m),0===this.symbol.indexOf("url")&&(l=r(l,{width:n,height:n}),x=0),this.legendSymbol=u=g.symbol(this.symbol,u/2-x,a-x,2*x,2*x,l).addClass("highcharts-point").add(c),u.isMarker=!0)};a.drawRectangle=
function(a,r){var u=a.symbolHeight,n=a.options.squareSymbol;r.legendSymbol=this.chart.renderer.rect(n?(a.symbolWidth-u)/2:0,a.baseline-u+1,n?u:a.symbolWidth,u,C(a.options.symbolRadius,u/2)).addClass("highcharts-point").attr({zIndex:3}).add(r.legendGroup)}})(E||(E={}));return E});M(a,"Core/Series/SeriesDefaults.js",[a["Core/Color/Palette.js"]],function(a){return{lineWidth:2,allowPointSelect:!1,crisp:!0,showCheckbox:!1,animation:{duration:1E3},events:{},marker:{enabledThreshold:2,lineColor:a.backgroundColor,
lineWidth:0,radius:4,states:{normal:{animation:!0},hover:{animation:{duration:50},enabled:!0,radiusPlus:2,lineWidthPlus:1},select:{fillColor:a.neutralColor20,lineColor:a.neutralColor100,lineWidth:2}}},point:{events:{}},dataLabels:{animation:{},align:"center",defer:!0,formatter:function(){var a=this.series.chart.numberFormatter;return"number"!==typeof this.y?"":a(this.y,-1)},padding:5,style:{fontSize:"11px",fontWeight:"bold",color:"contrast",textOutline:"1px contrast"},verticalAlign:"bottom",x:0,y:0},
cropThreshold:300,opacity:1,pointRange:0,softThreshold:!0,states:{normal:{animation:!0},hover:{animation:{duration:50},lineWidthPlus:1,marker:{},halo:{size:10,opacity:.25}},select:{animation:{duration:0}},inactive:{animation:{duration:50},opacity:.2}},stickyTracking:!0,turboThreshold:1E3,findNearestPointBy:"x"}});M(a,"Core/Series/Series.js",[a["Core/Animation/AnimationUtilities.js"],a["Core/DefaultOptions.js"],a["Core/Foundation.js"],a["Core/Globals.js"],a["Core/Legend/LegendSymbol.js"],a["Core/Color/Palette.js"],
a["Core/Series/Point.js"],a["Core/Series/SeriesDefaults.js"],a["Core/Series/SeriesRegistry.js"],a["Core/Renderer/SVG/SVGElement.js"],a["Core/Utilities.js"]],function(a,w,C,E,z,x,J,u,n,m,g){var c=a.animObject,e=a.setAnimation,l=w.defaultOptions,f=C.registerEventOptions,v=E.hasTouch,q=E.svg,k=E.win,r=n.seriesTypes,D=g.addEvent,B=g.arrayMax,O=g.arrayMin,t=g.clamp,h=g.cleanRecursively,d=g.correctFloat,b=g.defined,p=g.erase,G=g.error,y=g.extend,L=g.find,F=g.fireEvent,P=g.getNestedProperty,S=g.isArray,
Q=g.isNumber,V=g.isString,M=g.merge,H=g.objectEach,K=g.pick,la=g.removeEvent,ha=g.splat,R=g.syncTimeout;a=function(){function a(){this.zones=this.yAxis=this.xAxis=this.userOptions=this.tooltipOptions=this.processedYData=this.processedXData=this.points=this.options=this.linkedSeries=this.index=this.eventsToUnbind=this.eventOptions=this.data=this.chart=this._i=void 0}a.prototype.init=function(a,b){F(this,"init",{options:b});var d=this,c=a.series;this.eventsToUnbind=[];d.chart=a;d.options=d.setOptions(b);
b=d.options;d.linkedSeries=[];d.bindAxes();y(d,{name:b.name,state:"",visible:!1!==b.visible,selected:!0===b.selected});f(this,b);var e=b.events;if(e&&e.click||b.point&&b.point.events&&b.point.events.click||b.allowPointSelect)a.runTrackerClick=!0;d.getColor();d.getSymbol();d.parallelArrays.forEach(function(a){d[a+"Data"]||(d[a+"Data"]=[])});d.isCartesian&&(a.hasCartesianSeries=!0);var h;c.length&&(h=c[c.length-1]);d._i=K(h&&h._i,-1)+1;d.opacity=d.options.opacity;a.orderSeries(this.insert(c));b.dataSorting&&
b.dataSorting.enabled?d.setDataSortingOptions():d.points||d.data||d.setData(b.data,!1);F(this,"afterInit")};a.prototype.is=function(a){return r[a]&&this instanceof r[a]};a.prototype.insert=function(a){var b=this.options.index,d;if(Q(b)){for(d=a.length;d--;)if(b>=K(a[d].options.index,a[d]._i)){a.splice(d+1,0,this);break}-1===d&&a.unshift(this);d+=1}else a.push(this);return K(d,a.length-1)};a.prototype.bindAxes=function(){var a=this,b=a.options,d=a.chart,c;F(this,"bindAxes",null,function(){(a.axisTypes||
[]).forEach(function(e){var h=0;d[e].forEach(function(d){c=d.options;if(b[e]===h&&!c.isInternal||"undefined"!==typeof b[e]&&b[e]===c.id||"undefined"===typeof b[e]&&0===c.index)a.insert(d.series),a[e]=d,d.isDirty=!0;c.isInternal||h++});a[e]||a.optionalAxis===e||G(18,!0,d)})});F(this,"afterBindAxes")};a.prototype.updateParallelArrays=function(a,b){var d=a.series,c=arguments,e=Q(b)?function(c){var e="y"===c&&d.toYData?d.toYData(a):a[c];d[c+"Data"][b]=e}:function(a){Array.prototype[b].apply(d[a+"Data"],
Array.prototype.slice.call(c,2))};d.parallelArrays.forEach(e)};a.prototype.hasData=function(){return this.visible&&"undefined"!==typeof this.dataMax&&"undefined"!==typeof this.dataMin||this.visible&&this.yData&&0<this.yData.length};a.prototype.autoIncrement=function(a){var b=this.options,d=b.pointIntervalUnit,c=b.relativeXValue,e=this.chart.time,h=this.xIncrement,f;h=K(h,b.pointStart,0);this.pointInterval=f=K(this.pointInterval,b.pointInterval,1);c&&Q(a)&&(f*=a);d&&(b=new e.Date(h),"day"===d?e.set("Date",
b,e.get("Date",b)+f):"month"===d?e.set("Month",b,e.get("Month",b)+f):"year"===d&&e.set("FullYear",b,e.get("FullYear",b)+f),f=b.getTime()-h);if(c&&Q(a))return h+f;this.xIncrement=h+f;return h};a.prototype.setDataSortingOptions=function(){var a=this.options;y(this,{requireSorting:!1,sorted:!1,enabledDataSorting:!0,allowDG:!1});b(a.pointRange)||(a.pointRange=1)};a.prototype.setOptions=function(a){var d=this.chart,c=d.options,e=c.plotOptions,h=d.userOptions||{};a=M(a);d=d.styledMode;var f={plotOptions:e,
userOptions:a};F(this,"setOptions",f);var g=f.plotOptions[this.type],k=h.plotOptions||{};this.userOptions=f.userOptions;h=M(g,e.series,h.plotOptions&&h.plotOptions[this.type],a);this.tooltipOptions=M(l.tooltip,l.plotOptions.series&&l.plotOptions.series.tooltip,l.plotOptions[this.type].tooltip,c.tooltip.userOptions,e.series&&e.series.tooltip,e[this.type].tooltip,a.tooltip);this.stickyTracking=K(a.stickyTracking,k[this.type]&&k[this.type].stickyTracking,k.series&&k.series.stickyTracking,this.tooltipOptions.shared&&
!this.noSharedTooltip?!0:h.stickyTracking);null===g.marker&&delete h.marker;this.zoneAxis=h.zoneAxis;e=this.zones=(h.zones||[]).slice();!h.negativeColor&&!h.negativeFillColor||h.zones||(c={value:h[this.zoneAxis+"Threshold"]||h.threshold||0,className:"highcharts-negative"},d||(c.color=h.negativeColor,c.fillColor=h.negativeFillColor),e.push(c));e.length&&b(e[e.length-1].value)&&e.push(d?{}:{color:this.color,fillColor:this.fillColor});F(this,"afterSetOptions",{options:h});return h};a.prototype.getName=
function(){return K(this.options.name,"Series "+(this.index+1))};a.prototype.getCyclic=function(a,d,c){var e=this.chart,h=this.userOptions,f=a+"Index",g=a+"Counter",k=c?c.length:K(e.options.chart[a+"Count"],e[a+"Count"]);if(!d){var l=K(h[f],h["_"+f]);b(l)||(e.series.length||(e[g]=0),h["_"+f]=l=e[g]%k,e[g]+=1);c&&(d=c[l])}"undefined"!==typeof l&&(this[f]=l);this[a]=d};a.prototype.getColor=function(){this.chart.styledMode?this.getCyclic("color"):this.options.colorByPoint?this.color=x.neutralColor20:
this.getCyclic("color",this.options.color||l.plotOptions[this.type].color,this.chart.options.colors)};a.prototype.getPointsCollection=function(){return(this.hasGroupedData?this.points:this.data)||[]};a.prototype.getSymbol=function(){this.getCyclic("symbol",this.options.marker.symbol,this.chart.options.symbols)};a.prototype.findPointIndex=function(a,b){var d=a.id,c=a.x,e=this.points,h=this.options.dataSorting,f,g;if(d)h=this.chart.get(d),h instanceof J&&(f=h);else if(this.linkedParent||this.enabledDataSorting||
this.options.relativeXValue)if(f=function(b){return!b.touched&&b.index===a.index},h&&h.matchByName?f=function(b){return!b.touched&&b.name===a.name}:this.options.relativeXValue&&(f=function(b){return!b.touched&&b.options.x===a.x}),f=L(e,f),!f)return;if(f){var k=f&&f.index;"undefined"!==typeof k&&(g=!0)}"undefined"===typeof k&&Q(c)&&(k=this.xData.indexOf(c,b));-1!==k&&"undefined"!==typeof k&&this.cropped&&(k=k>=this.cropStart?k-this.cropStart:k);!g&&Q(k)&&e[k]&&e[k].touched&&(k=void 0);return k};a.prototype.updateData=
function(a,d){var c=this.options,e=c.dataSorting,h=this.points,f=[],g=this.requireSorting,k=a.length===h.length,l,m,A,p=!0;this.xIncrement=null;a.forEach(function(a,d){var m=b(a)&&this.pointClass.prototype.optionsToObject.call({series:this},a)||{},p=m.x;if(m.id||Q(p)){if(m=this.findPointIndex(m,A),-1===m||"undefined"===typeof m?f.push(a):h[m]&&a!==c.data[m]?(h[m].update(a,!1,null,!1),h[m].touched=!0,g&&(A=m+1)):h[m]&&(h[m].touched=!0),!k||d!==m||e&&e.enabled||this.hasDerivedData)l=!0}else f.push(a)},
this);if(l)for(a=h.length;a--;)(m=h[a])&&!m.touched&&m.remove&&m.remove(!1,d);else!k||e&&e.enabled?p=!1:(a.forEach(function(a,b){a!==h[b].y&&h[b].update&&h[b].update(a,!1,null,!1)}),f.length=0);h.forEach(function(a){a&&(a.touched=!1)});if(!p)return!1;f.forEach(function(a){this.addPoint(a,!1,null,null,!1)},this);null===this.xIncrement&&this.xData&&this.xData.length&&(this.xIncrement=B(this.xData),this.autoIncrement());return!0};a.prototype.setData=function(a,b,d,c){var e=this,h=e.points,f=h&&h.length||
0,g=e.options,k=e.chart,l=g.dataSorting,m=e.xAxis,A=g.turboThreshold,p=this.xData,n=this.yData,q=e.pointArrayMap;q=q&&q.length;var t=g.keys,v,r=0,B=1,y=null;a=a||[];var N=a.length;b=K(b,!0);l&&l.enabled&&(a=this.sortData(a));!1!==c&&N&&f&&!e.cropped&&!e.hasGroupedData&&e.visible&&!e.isSeriesBoosting&&(v=this.updateData(a,d));if(!v){e.xIncrement=null;e.colorCounter=0;this.parallelArrays.forEach(function(a){e[a+"Data"].length=0});if(A&&N>A)if(y=e.getFirstValidPoint(a),Q(y))for(d=0;d<N;d++)p[d]=this.autoIncrement(),
n[d]=a[d];else if(S(y))if(q)for(d=0;d<N;d++)c=a[d],p[d]=c[0],n[d]=c.slice(1,q+1);else for(t&&(r=t.indexOf("x"),B=t.indexOf("y"),r=0<=r?r:0,B=0<=B?B:1),d=0;d<N;d++)c=a[d],p[d]=c[r],n[d]=c[B];else G(12,!1,k);else for(d=0;d<N;d++)"undefined"!==typeof a[d]&&(c={series:e},e.pointClass.prototype.applyOptions.apply(c,[a[d]]),e.updateParallelArrays(c,d));n&&V(n[0])&&G(14,!0,k);e.data=[];e.options.data=e.userOptions.data=a;for(d=f;d--;)h[d]&&h[d].destroy&&h[d].destroy();m&&(m.minRange=m.userMinRange);e.isDirty=
k.isDirtyBox=!0;e.isDirtyData=!!h;d=!1}"point"===g.legendType&&(this.processData(),this.generatePoints());b&&k.redraw(d)};a.prototype.sortData=function(a){var d=this,c=d.options.dataSorting.sortKey||"y",e=function(a,d){return b(d)&&a.pointClass.prototype.optionsToObject.call({series:a},d)||{}};a.forEach(function(b,c){a[c]=e(d,b);a[c].index=c},this);a.concat().sort(function(a,b){a=P(c,a);b=P(c,b);return b<a?-1:b>a?1:0}).forEach(function(a,b){a.x=b},this);d.linkedSeries&&d.linkedSeries.forEach(function(b){var d=
b.options,c=d.data;d.dataSorting&&d.dataSorting.enabled||!c||(c.forEach(function(d,h){c[h]=e(b,d);a[h]&&(c[h].x=a[h].x,c[h].index=h)}),b.setData(c,!1))});return a};a.prototype.getProcessedData=function(a){var b=this.xAxis,d=this.options,c=d.cropThreshold,e=a||this.getExtremesFromAll||d.getExtremesFromAll,h=this.isCartesian;a=b&&b.val2lin;d=!(!b||!b.logarithmic);var f=0,g=this.xData,k=this.yData,l=this.requireSorting;var m=!1;var A=g.length;if(b){m=b.getExtremes();var p=m.min;var n=m.max;m=b.categories&&
!b.names.length}if(h&&this.sorted&&!e&&(!c||A>c||this.forceCrop))if(g[A-1]<p||g[0]>n)g=[],k=[];else if(this.yData&&(g[0]<p||g[A-1]>n)){var q=this.cropData(this.xData,this.yData,p,n);g=q.xData;k=q.yData;f=q.start;q=!0}for(c=g.length||1;--c;)if(b=d?a(g[c])-a(g[c-1]):g[c]-g[c-1],0<b&&("undefined"===typeof t||b<t))var t=b;else 0>b&&l&&!m&&(G(15,!1,this.chart),l=!1);return{xData:g,yData:k,cropped:q,cropStart:f,closestPointRange:t}};a.prototype.processData=function(a){var b=this.xAxis;if(this.isCartesian&&
!this.isDirty&&!b.isDirty&&!this.yAxis.isDirty&&!a)return!1;a=this.getProcessedData();this.cropped=a.cropped;this.cropStart=a.cropStart;this.processedXData=a.xData;this.processedYData=a.yData;this.closestPointRange=this.basePointRange=a.closestPointRange};a.prototype.cropData=function(a,b,d,c,e){var h=a.length,f,g=0,k=h;e=K(e,this.cropShoulder);for(f=0;f<h;f++)if(a[f]>=d){g=Math.max(0,f-e);break}for(d=f;d<h;d++)if(a[d]>c){k=d+e;break}return{xData:a.slice(g,k),yData:b.slice(g,k),start:g,end:k}};a.prototype.generatePoints=
function(){var a=this.options,b=a.data,d=this.processedXData,c=this.processedYData,e=this.pointClass,h=d.length,f=this.cropStart||0,g=this.hasGroupedData,k=a.keys,l=[];a=a.dataGrouping&&a.dataGrouping.groupAll?f:0;var m,p,n=this.data;if(!n&&!g){var q=[];q.length=b.length;n=this.data=q}k&&g&&(this.options.keys=!1);for(p=0;p<h;p++){q=f+p;if(g){var t=(new e).init(this,[d[p]].concat(ha(c[p])));t.dataGroup=this.groupMap[a+p];t.dataGroup.options&&(t.options=t.dataGroup.options,y(t,t.dataGroup.options),
delete t.dataLabels)}else(t=n[q])||"undefined"===typeof b[q]||(n[q]=t=(new e).init(this,b[q],d[p]));t&&(t.index=g?a+p:q,l[p]=t)}this.options.keys=k;if(n&&(h!==(m=n.length)||g))for(p=0;p<m;p++)p!==f||g||(p+=h),n[p]&&(n[p].destroyElements(),n[p].plotX=void 0);this.data=n;this.points=l;F(this,"afterGeneratePoints")};a.prototype.getXExtremes=function(a){return{min:O(a),max:B(a)}};a.prototype.getExtremes=function(a,b){var d=this.xAxis,c=this.yAxis,e=this.processedXData||this.xData,h=[],f=this.requireSorting?
this.cropShoulder:0;c=c?c.positiveValuesOnly:!1;var g,k=0,l=0,m=0;a=a||this.stackedYData||this.processedYData||[];var p=a.length;if(d){var n=d.getExtremes();k=n.min;l=n.max}for(g=0;g<p;g++){var A=e[g];n=a[g];var q=(Q(n)||S(n))&&(n.length||0<n||!c);A=b||this.getExtremesFromAll||this.options.getExtremesFromAll||this.cropped||!d||(e[g+f]||A)>=k&&(e[g-f]||A)<=l;if(q&&A)if(q=n.length)for(;q--;)Q(n[q])&&(h[m++]=n[q]);else h[m++]=n}a={dataMin:O(h),dataMax:B(h)};F(this,"afterGetExtremes",{dataExtremes:a});
return a};a.prototype.applyExtremes=function(){var a=this.getExtremes();this.dataMin=a.dataMin;this.dataMax=a.dataMax;return a};a.prototype.getFirstValidPoint=function(a){for(var b=a.length,d=0,c=null;null===c&&d<b;)c=a[d],d++;return c};a.prototype.translate=function(){this.processedXData||this.processData();this.generatePoints();var a=this.options,c=a.stacking,e=this.xAxis,h=e.categories,f=this.enabledDataSorting,g=this.yAxis,k=this.points,l=k.length,m=!!this.modifyValue,p=this.pointPlacementToXValue(),
n=!!p,q=a.threshold,v=a.startFromThreshold?q:0,r=this.zoneAxis||"y",B,y,I=Number.MAX_VALUE;for(B=0;B<l;B++){var D=k[B],u=D.x,G=void 0,x=void 0,w=D.y,L=D.low,z=c&&g.stacking&&g.stacking.stacks[(this.negStacks&&w<(v?0:q)?"-":"")+this.stackKey];if(g.positiveValuesOnly&&!g.validatePositiveValue(w)||e.positiveValuesOnly&&!e.validatePositiveValue(u))D.isNull=!0;D.plotX=y=d(t(e.translate(u,0,0,0,1,p,"flags"===this.type),-1E5,1E5));if(c&&this.visible&&z&&z[u]){var C=this.getStackIndicator(C,u,this.index);
D.isNull||(G=z[u],x=G.points[C.key])}S(x)&&(L=x[0],w=x[1],L===v&&C.key===z[u].base&&(L=K(Q(q)&&q,g.min)),g.positiveValuesOnly&&0>=L&&(L=null),D.total=D.stackTotal=G.total,D.percentage=G.total&&D.y/G.total*100,D.stackY=w,this.irregularWidths||G.setOffset(this.pointXOffset||0,this.barW||0));D.yBottom=b(L)?t(g.translate(L,0,1,0,1),-1E5,1E5):null;m&&(w=this.modifyValue(w,D));D.plotY=void 0;Q(w)&&(G=g.translate(w,!1,!0,!1,!0),"undefined"!==typeof G&&(D.plotY=t(G,-1E5,1E5)));D.isInside=this.isPointInside(D);
D.clientX=n?d(e.translate(u,0,0,0,1,p)):y;D.negative=D[r]<(a[r+"Threshold"]||q||0);D.category=h&&"undefined"!==typeof h[D.x]?h[D.x]:D.x;if(!D.isNull&&!1!==D.visible){"undefined"!==typeof H&&(I=Math.min(I,Math.abs(y-H)));var H=y}D.zone=this.zones.length&&D.getZone();!D.graphic&&this.group&&f&&(D.isNew=!0)}this.closestPointRangePx=I;F(this,"afterTranslate")};a.prototype.getValidPoints=function(a,b,d){var c=this.chart;return(a||this.points||[]).filter(function(a){return b&&!c.isInsidePlot(a.plotX,a.plotY,
{inverted:c.inverted})?!1:!1!==a.visible&&(d||!a.isNull)})};a.prototype.getClipBox=function(a,b){var d=this.options,c=this.chart,e=c.inverted,h=this.xAxis,f=h&&this.yAxis,g=c.options.chart.scrollablePlotArea||{};a&&!1===d.clip&&f?a=e?{y:-c.chartWidth+f.len+f.pos,height:c.chartWidth,width:c.chartHeight,x:-c.chartHeight+h.len+h.pos}:{y:-f.pos,height:c.chartHeight,width:c.chartWidth,x:-h.pos}:(a=this.clipBox||c.clipBox,b&&(a.width=c.plotSizeX,a.x=(c.scrollablePixelsX||0)*(g.scrollPositionX||0)));return b?
{width:a.width,x:a.x}:a};a.prototype.getSharedClipKey=function(a){if(this.sharedClipKey)return this.sharedClipKey;var b=[a&&a.duration,a&&a.easing,a&&a.defer,this.getClipBox(a).height,this.options.xAxis,this.options.yAxis].join();if(!1!==this.options.clip||a)this.sharedClipKey=b;return b};a.prototype.setClip=function(a){var b=this.chart,d=this.options,c=b.renderer,e=b.inverted,h=this.clipBox,f=this.getClipBox(a),g=this.getSharedClipKey(a),k=b.sharedClips[g],l=b.sharedClips[g+"m"];a&&(f.width=0,e&&
(f.x=b.plotHeight+(!1!==d.clip?0:b.plotTop)));k?b.hasLoaded||k.attr(f):(a&&(b.sharedClips[g+"m"]=l=c.clipRect(e?(b.plotSizeX||0)+99:-99,e?-b.plotLeft:-b.plotTop,99,e?b.chartWidth:b.chartHeight)),b.sharedClips[g]=k=c.clipRect(f),k.count={length:0});a&&!k.count[this.index]&&(k.count[this.index]=!0,k.count.length+=1);if(!1!==d.clip||a)this.group.clip(a||h?k:b.clipRect),this.markerGroup.clip(l);a||(k.count[this.index]&&(delete k.count[this.index],--k.count.length),0===k.count.length&&(h||(b.sharedClips[g]=
k.destroy()),l&&(b.sharedClips[g+"m"]=l.destroy())))};a.prototype.animate=function(a){var b=this.chart,d=c(this.options.animation),e=this.sharedClipKey;if(a)this.setClip(d);else if(e){a=b.sharedClips[e];e=b.sharedClips[e+"m"];var h=this.getClipBox(d,!0);a&&a.animate(h,d);e&&e.animate({width:h.width+99,x:h.x-(b.inverted?0:99)},d)}};a.prototype.afterAnimate=function(){this.setClip();F(this,"afterAnimate");this.finishedAnimating=!0};a.prototype.drawPoints=function(){var a=this.points,b=this.chart,d=
this.options.marker,c=this[this.specialGroup]||this.markerGroup,e=this.xAxis,h=K(d.enabled,!e||e.isRadial?!0:null,this.closestPointRangePx>=d.enabledThreshold*d.radius),f,g;if(!1!==d.enabled||this._hasPointMarkers)for(f=0;f<a.length;f++){var k=a[f];var l=(g=k.graphic)?"animate":"attr";var m=k.marker||{};var p=!!k.marker;if((h&&"undefined"===typeof m.enabled||m.enabled)&&!k.isNull&&!1!==k.visible){var n=K(m.symbol,this.symbol,"rect");var q=this.markerAttribs(k,k.selected&&"select");this.enabledDataSorting&&
(k.startXPos=e.reversed?-(q.width||0):e.width);var t=!1!==k.isInside;g?g[t?"show":"hide"](t).animate(q):t&&(0<(q.width||0)||k.hasImage)&&(k.graphic=g=b.renderer.symbol(n,q.x,q.y,q.width,q.height,p?m:d).add(c),this.enabledDataSorting&&b.hasRendered&&(g.attr({x:k.startXPos}),l="animate"));g&&"animate"===l&&g[t?"show":"hide"](t).animate(q);if(g&&!b.styledMode)g[l](this.pointAttribs(k,k.selected&&"select"));g&&g.addClass(k.getClassName(),!0)}else g&&(k.graphic=g.destroy())}};a.prototype.markerAttribs=
function(a,b){var d=this.options,c=d.marker,e=a.marker||{},h=e.symbol||c.symbol,f=K(e.radius,c.radius);b&&(c=c.states[b],b=e.states&&e.states[b],f=K(b&&b.radius,c&&c.radius,f+(c&&c.radiusPlus||0)));a.hasImage=h&&0===h.indexOf("url");a.hasImage&&(f=0);a={x:d.crisp?Math.floor(a.plotX-f):a.plotX-f,y:a.plotY-f};f&&(a.width=a.height=2*f);return a};a.prototype.pointAttribs=function(a,b){var d=this.options.marker,c=a&&a.options,e=c&&c.marker||{},h=c&&c.color,f=a&&a.color,g=a&&a.zone&&a.zone.color,k=this.color;
a=K(e.lineWidth,d.lineWidth);c=1;k=h||g||f||k;h=e.fillColor||d.fillColor||k;f=e.lineColor||d.lineColor||k;b=b||"normal";d=d.states[b];b=e.states&&e.states[b]||{};a=K(b.lineWidth,d.lineWidth,a+K(b.lineWidthPlus,d.lineWidthPlus,0));h=b.fillColor||d.fillColor||h;f=b.lineColor||d.lineColor||f;c=K(b.opacity,d.opacity,c);return{stroke:f,"stroke-width":a,fill:h,opacity:c}};a.prototype.destroy=function(a){var b=this,d=b.chart,c=/AppleWebKit\/533/.test(k.navigator.userAgent),e=b.data||[],h,f,l,n;F(b,"destroy");
this.removeEvents(a);(b.axisTypes||[]).forEach(function(a){(n=b[a])&&n.series&&(p(n.series,b),n.isDirty=n.forceRedraw=!0)});b.legendItem&&b.chart.legend.destroyItem(b);for(f=e.length;f--;)(l=e[f])&&l.destroy&&l.destroy();b.clips&&b.clips.forEach(function(a){return a.destroy()});g.clearTimeout(b.animationTimeout);H(b,function(a,b){a instanceof m&&!a.survive&&(h=c&&"group"===b?"hide":"destroy",a[h]())});d.hoverSeries===b&&(d.hoverSeries=void 0);p(d.series,b);d.orderSeries();H(b,function(d,c){a&&"hcEvents"===
c||delete b[c]})};a.prototype.applyZones=function(){var a=this,b=this.chart,d=b.renderer,c=this.zones,e=this.clips||[],h=this.graph,f=this.area,g=Math.max(b.chartWidth,b.chartHeight),k=this[(this.zoneAxis||"y")+"Axis"],l=b.inverted,m,p,n,q,v,r,B,y,D=!1;if(c.length&&(h||f)&&k&&"undefined"!==typeof k.min){var I=k.reversed;var F=k.horiz;h&&!this.showLine&&h.hide();f&&f.hide();var u=k.getExtremes();c.forEach(function(c,A){m=I?F?b.plotWidth:0:F?0:k.toPixels(u.min)||0;m=t(K(p,m),0,g);p=t(Math.round(k.toPixels(K(c.value,
u.max),!0)||0),0,g);D&&(m=p=k.toPixels(u.max));q=Math.abs(m-p);v=Math.min(m,p);r=Math.max(m,p);k.isXAxis?(n={x:l?r:v,y:0,width:q,height:g},F||(n.x=b.plotHeight-n.x)):(n={x:0,y:l?r:v,width:g,height:q},F&&(n.y=b.plotWidth-n.y));l&&d.isVML&&(n=k.isXAxis?{x:0,y:I?v:r,height:n.width,width:b.chartWidth}:{x:n.y-b.plotLeft-b.spacingBox.x,y:0,width:n.height,height:b.chartHeight});e[A]?e[A].animate(n):e[A]=d.clipRect(n);B=a["zone-area-"+A];y=a["zone-graph-"+A];h&&y&&y.clip(e[A]);f&&B&&B.clip(e[A]);D=c.value>
u.max;a.resetZones&&0===p&&(p=void 0)});this.clips=e}else a.visible&&(h&&h.show(!0),f&&f.show(!0))};a.prototype.invertGroups=function(a){function b(){["group","markerGroup"].forEach(function(b){d[b]&&(c.renderer.isVML&&d[b].attr({width:d.yAxis.len,height:d.xAxis.len}),d[b].width=d.yAxis.len,d[b].height=d.xAxis.len,d[b].invert(d.isRadialSeries?!1:a))})}var d=this,c=d.chart;d.xAxis&&(d.eventsToUnbind.push(D(c,"resize",b)),b(),d.invertGroups=b)};a.prototype.plotGroup=function(a,d,c,e,h){var f=this[a],
g=!f;c={visibility:c,zIndex:e||.1};"undefined"===typeof this.opacity||this.chart.styledMode||"inactive"===this.state||(c.opacity=this.opacity);g&&(this[a]=f=this.chart.renderer.g().add(h));f.addClass("highcharts-"+d+" highcharts-series-"+this.index+" highcharts-"+this.type+"-series "+(b(this.colorIndex)?"highcharts-color-"+this.colorIndex+" ":"")+(this.options.className||"")+(f.hasClass("highcharts-tracker")?" highcharts-tracker":""),!0);f.attr(c)[g?"attr":"animate"](this.getPlotBox());return f};
a.prototype.getPlotBox=function(){var a=this.chart,b=this.xAxis,d=this.yAxis;a.inverted&&(b=d,d=this.xAxis);return{translateX:b?b.left:a.plotLeft,translateY:d?d.top:a.plotTop,scaleX:1,scaleY:1}};a.prototype.removeEvents=function(a){a||la(this);this.eventsToUnbind.length&&(this.eventsToUnbind.forEach(function(a){a()}),this.eventsToUnbind.length=0)};a.prototype.render=function(){var a=this,b=a.chart,d=a.options,e=c(d.animation),h=a.visible?"inherit":"hidden",f=d.zIndex,g=a.hasRendered,k=b.seriesGroup,
l=b.inverted,m=!a.finishedAnimating&&b.renderer.isSVG&&e.duration;F(this,"render");var p=a.plotGroup("group","series",h,f,k);a.markerGroup=a.plotGroup("markerGroup","markers",h,f,k);m&&a.animate&&a.animate(!0);p.inverted=K(a.invertible,a.isCartesian)?l:!1;a.drawGraph&&(a.drawGraph(),a.applyZones());a.visible&&a.drawPoints();a.drawDataLabels&&a.drawDataLabels();a.redrawPoints&&a.redrawPoints();a.drawTracker&&!1!==a.options.enableMouseTracking&&a.drawTracker();a.invertGroups(l);!1===d.clip||a.sharedClipKey||
g||p.clip(b.clipRect);m&&a.animate&&a.animate();g||(m&&e.defer&&(m+=e.defer),a.animationTimeout=R(function(){a.afterAnimate()},m||0));a.isDirty=!1;a.hasRendered=!0;F(a,"afterRender")};a.prototype.redraw=function(){var a=this.chart,b=this.isDirty||this.isDirtyData,d=this.group,c=this.xAxis,e=this.yAxis;d&&(a.inverted&&d.attr({width:a.plotWidth,height:a.plotHeight}),d.animate({translateX:K(c&&c.left,a.plotLeft),translateY:K(e&&e.top,a.plotTop)}));this.translate();this.render();b&&delete this.kdTree};
a.prototype.searchPoint=function(a,b){var d=this.xAxis,c=this.yAxis,e=this.chart.inverted;return this.searchKDTree({clientX:e?d.len-a.chartY+d.pos:a.chartX-d.pos,plotY:e?c.len-a.chartX+c.pos:a.chartY-c.pos},b,a)};a.prototype.buildKDTree=function(a){function b(a,c,e){var h=a&&a.length;if(h){var f=d.kdAxisArray[c%e];a.sort(function(a,b){return a[f]-b[f]});h=Math.floor(h/2);return{point:a[h],left:b(a.slice(0,h),c+1,e),right:b(a.slice(h+1),c+1,e)}}}this.buildingKdTree=!0;var d=this,c=-1<d.options.findNearestPointBy.indexOf("y")?
2:1;delete d.kdTree;R(function(){d.kdTree=b(d.getValidPoints(null,!d.directTouch),c,c);d.buildingKdTree=!1},d.options.kdNow||a&&"touchstart"===a.type?0:1)};a.prototype.searchKDTree=function(a,d,c){function e(a,d,c,l){var m=d.point,p=h.kdAxisArray[c%l],n=m,q=b(a[f])&&b(m[f])?Math.pow(a[f]-m[f],2):null;var t=b(a[g])&&b(m[g])?Math.pow(a[g]-m[g],2):null;t=(q||0)+(t||0);m.dist=b(t)?Math.sqrt(t):Number.MAX_VALUE;m.distX=b(q)?Math.sqrt(q):Number.MAX_VALUE;p=a[p]-m[p];t=0>p?"left":"right";q=0>p?"right":"left";
d[t]&&(t=e(a,d[t],c+1,l),n=t[k]<n[k]?t:m);d[q]&&Math.sqrt(p*p)<n[k]&&(a=e(a,d[q],c+1,l),n=a[k]<n[k]?a:n);return n}var h=this,f=this.kdAxisArray[0],g=this.kdAxisArray[1],k=d?"distX":"dist";d=-1<h.options.findNearestPointBy.indexOf("y")?2:1;this.kdTree||this.buildingKdTree||this.buildKDTree(c);if(this.kdTree)return e(a,this.kdTree,d,d)};a.prototype.pointPlacementToXValue=function(){var a=this.options,b=a.pointRange,d=this.xAxis;a=a.pointPlacement;"between"===a&&(a=d.reversed?-.5:.5);return Q(a)?a*(b||
d.pointRange):0};a.prototype.isPointInside=function(a){return"undefined"!==typeof a.plotY&&"undefined"!==typeof a.plotX&&0<=a.plotY&&a.plotY<=this.yAxis.len&&0<=a.plotX&&a.plotX<=this.xAxis.len};a.prototype.drawTracker=function(){var a=this,b=a.options,d=b.trackByArea,c=[].concat(d?a.areaPath:a.graphPath),e=a.chart,h=e.pointer,f=e.renderer,g=e.options.tooltip.snap,k=a.tracker,l=function(b){if(e.hoverSeries!==a)a.onMouseOver()},m="rgba(192,192,192,"+(q?.0001:.002)+")";k?k.attr({d:c}):a.graph&&(a.tracker=
f.path(c).attr({visibility:a.visible?"visible":"hidden",zIndex:2}).addClass(d?"highcharts-tracker-area":"highcharts-tracker-line").add(a.group),e.styledMode||a.tracker.attr({"stroke-linecap":"round","stroke-linejoin":"round",stroke:m,fill:d?m:"none","stroke-width":a.graph.strokeWidth()+(d?0:2*g)}),[a.tracker,a.markerGroup,a.dataLabelsGroup].forEach(function(a){if(a&&(a.addClass("highcharts-tracker").on("mouseover",l).on("mouseout",function(a){h.onTrackerMouseOut(a)}),b.cursor&&!e.styledMode&&a.css({cursor:b.cursor}),
v))a.on("touchstart",l)}));F(this,"afterDrawTracker")};a.prototype.addPoint=function(a,b,d,c,e){var h=this.options,f=this.data,g=this.chart,k=this.xAxis;k=k&&k.hasNames&&k.names;var l=h.data,m=this.xData,p;b=K(b,!0);var n={series:this};this.pointClass.prototype.applyOptions.apply(n,[a]);var q=n.x;var t=m.length;if(this.requireSorting&&q<m[t-1])for(p=!0;t&&m[t-1]>q;)t--;this.updateParallelArrays(n,"splice",t,0,0);this.updateParallelArrays(n,t);k&&n.name&&(k[q]=n.name);l.splice(t,0,a);p&&(this.data.splice(t,
0,null),this.processData());"point"===h.legendType&&this.generatePoints();d&&(f[0]&&f[0].remove?f[0].remove(!1):(f.shift(),this.updateParallelArrays(n,"shift"),l.shift()));!1!==e&&F(this,"addPoint",{point:n});this.isDirtyData=this.isDirty=!0;b&&g.redraw(c)};a.prototype.removePoint=function(a,b,d){var c=this,h=c.data,f=h[a],g=c.points,k=c.chart,l=function(){g&&g.length===h.length&&g.splice(a,1);h.splice(a,1);c.options.data.splice(a,1);c.updateParallelArrays(f||{series:c},"splice",a,1);f&&f.destroy();
c.isDirty=!0;c.isDirtyData=!0;b&&k.redraw()};e(d,k);b=K(b,!0);f?f.firePointEvent("remove",null,l):l()};a.prototype.remove=function(a,b,d,c){function e(){h.destroy(c);f.isDirtyLegend=f.isDirtyBox=!0;f.linkSeries();K(a,!0)&&f.redraw(b)}var h=this,f=h.chart;!1!==d?F(h,"remove",null,e):e()};a.prototype.update=function(a,b){a=h(a,this.userOptions);F(this,"update",{options:a});var d=this,c=d.chart,e=d.userOptions,f=d.initialType||d.type,g=c.options.plotOptions,k=r[f].prototype,l=d.finishedAnimating&&{animation:!1},
m={},p,n=["eventOptions","navigatorSeries","baseSeries"],q=a.type||e.type||c.options.chart.type,t=!(this.hasDerivedData||q&&q!==this.type||"undefined"!==typeof a.pointStart||"undefined"!==typeof a.pointInterval||"undefined"!==typeof a.relativeXValue||d.hasOptionChanged("dataGrouping")||d.hasOptionChanged("pointStart")||d.hasOptionChanged("pointInterval")||d.hasOptionChanged("pointIntervalUnit")||d.hasOptionChanged("keys"));q=q||f;t&&(n.push("data","isDirtyData","points","processedXData","processedYData",
"xIncrement","cropped","_hasPointMarkers","_hasPointLabels","clips","nodes","layout","mapMap","mapData","minY","maxY","minX","maxX"),!1!==a.visible&&n.push("area","graph"),d.parallelArrays.forEach(function(a){n.push(a+"Data")}),a.data&&(a.dataSorting&&y(d.options.dataSorting,a.dataSorting),this.setData(a.data,!1)));a=M(e,l,{index:"undefined"===typeof e.index?d.index:e.index,pointStart:K(g&&g.series&&g.series.pointStart,e.pointStart,d.xData[0])},!t&&{data:d.options.data},a);t&&a.data&&(a.data=d.options.data);
n=["group","markerGroup","dataLabelsGroup","transformGroup"].concat(n);n.forEach(function(a){n[a]=d[a];delete d[a]});g=!1;if(r[q]){if(g=q!==d.type,d.remove(!1,!1,!1,!0),g)if(Object.setPrototypeOf)Object.setPrototypeOf(d,r[q].prototype);else{l=Object.hasOwnProperty.call(d,"hcEvents")&&d.hcEvents;for(p in k)d[p]=void 0;y(d,r[q].prototype);l?d.hcEvents=l:delete d.hcEvents}}else G(17,!0,c,{missingModuleFor:q});n.forEach(function(a){d[a]=n[a]});d.init(c,a);if(t&&this.points){var v=d.options;!1===v.visible?
(m.graphic=1,m.dataLabel=1):d._hasPointLabels||(a=v.marker,k=v.dataLabels,!a||!1!==a.enabled&&(e.marker&&e.marker.symbol)===a.symbol||(m.graphic=1),k&&!1===k.enabled&&(m.dataLabel=1));this.points.forEach(function(a){a&&a.series&&(a.resolveColor(),Object.keys(m).length&&a.destroyElements(m),!1===v.showInLegend&&a.legendItem&&c.legend.destroyItem(a))},this)}d.initialType=f;c.linkSeries();g&&d.linkedSeries.length&&(d.isDirtyData=!0);F(this,"afterUpdate");K(b,!0)&&c.redraw(t?void 0:!1)};a.prototype.setName=
function(a){this.name=this.options.name=this.userOptions.name=a;this.chart.isDirtyLegend=!0};a.prototype.hasOptionChanged=function(a){var b=this.options[a],d=this.chart.options.plotOptions,c=this.userOptions[a];return c?b!==c:b!==K(d&&d[this.type]&&d[this.type][a],d&&d.series&&d.series[a],b)};a.prototype.onMouseOver=function(){var a=this.chart,b=a.hoverSeries;a.pointer.setHoverChartIndex();if(b&&b!==this)b.onMouseOut();this.options.events.mouseOver&&F(this,"mouseOver");this.setState("hover");a.hoverSeries=
this};a.prototype.onMouseOut=function(){var a=this.options,b=this.chart,d=b.tooltip,c=b.hoverPoint;b.hoverSeries=null;if(c)c.onMouseOut();this&&a.events.mouseOut&&F(this,"mouseOut");!d||this.stickyTracking||d.shared&&!this.noSharedTooltip||d.hide();b.series.forEach(function(a){a.setState("",!0)})};a.prototype.setState=function(a,b){var d=this,c=d.options,e=d.graph,h=c.inactiveOtherPoints,f=c.states,g=K(f[a||"normal"]&&f[a||"normal"].animation,d.chart.options.chart.animation),k=c.lineWidth,l=0,m=c.opacity;
a=a||"";if(d.state!==a&&([d.group,d.markerGroup,d.dataLabelsGroup].forEach(function(b){b&&(d.state&&b.removeClass("highcharts-series-"+d.state),a&&b.addClass("highcharts-series-"+a))}),d.state=a,!d.chart.styledMode)){if(f[a]&&!1===f[a].enabled)return;a&&(k=f[a].lineWidth||k+(f[a].lineWidthPlus||0),m=K(f[a].opacity,m));if(e&&!e.dashstyle)for(c={"stroke-width":k},e.animate(c,g);d["zone-graph-"+l];)d["zone-graph-"+l].animate(c,g),l+=1;h||[d.group,d.markerGroup,d.dataLabelsGroup,d.labelBySeries].forEach(function(a){a&&
a.animate({opacity:m},g)})}b&&h&&d.points&&d.setAllPointsToState(a||void 0)};a.prototype.setAllPointsToState=function(a){this.points.forEach(function(b){b.setState&&b.setState(a)})};a.prototype.setVisible=function(a,b){var d=this,c=d.chart,e=d.legendItem,h=c.options.chart.ignoreHiddenSeries,f=d.visible,g=(d.visible=a=d.options.visible=d.userOptions.visible="undefined"===typeof a?!f:a)?"show":"hide";["group","dataLabelsGroup","markerGroup","tracker","tt"].forEach(function(a){if(d[a])d[a][g]()});if(c.hoverSeries===
d||(c.hoverPoint&&c.hoverPoint.series)===d)d.onMouseOut();e&&c.legend.colorizeItem(d,a);d.isDirty=!0;d.options.stacking&&c.series.forEach(function(a){a.options.stacking&&a.visible&&(a.isDirty=!0)});d.linkedSeries.forEach(function(b){b.setVisible(a,!1)});h&&(c.isDirtyBox=!0);F(d,g);!1!==b&&c.redraw()};a.prototype.show=function(){this.setVisible(!0)};a.prototype.hide=function(){this.setVisible(!1)};a.prototype.select=function(a){this.selected=a=this.options.selected="undefined"===typeof a?!this.selected:
a;this.checkbox&&(this.checkbox.checked=a);F(this,a?"select":"unselect")};a.prototype.shouldShowTooltip=function(a,b,d){void 0===d&&(d={});d.series=this;d.visiblePlotOnly=!0;return this.chart.isInsidePlot(a,b,d)};a.defaultOptions=u;return a}();y(a.prototype,{axisTypes:["xAxis","yAxis"],coll:"series",colorCounter:0,cropShoulder:1,directTouch:!1,drawLegendSymbol:z.drawLineMarker,isCartesian:!0,kdAxisArray:["clientX","plotY"],parallelArrays:["x","y"],pointClass:J,requireSorting:!0,sorted:!0});n.series=
a;"";"";return a});M(a,"Extensions/ScrollablePlotArea.js",[a["Core/Animation/AnimationUtilities.js"],a["Core/Axis/Axis.js"],a["Core/Chart/Chart.js"],a["Core/Series/Series.js"],a["Core/Renderer/RendererRegistry.js"],a["Core/Utilities.js"]],function(a,w,C,E,z,x){var r=a.stop,u=x.addEvent,n=x.createElement,m=x.merge,g=x.pick;u(C,"afterSetChartSize",function(a){var c=this.options.chart.scrollablePlotArea,g=c&&c.minWidth;c=c&&c.minHeight;if(!this.renderer.forExport){if(g){if(this.scrollablePixelsX=g=Math.max(0,
g-this.chartWidth)){this.scrollablePlotBox=this.renderer.scrollablePlotBox=m(this.plotBox);this.plotBox.width=this.plotWidth+=g;this.inverted?this.clipBox.height+=g:this.clipBox.width+=g;var f={1:{name:"right",value:g}}}}else c&&(this.scrollablePixelsY=g=Math.max(0,c-this.chartHeight))&&(this.scrollablePlotBox=this.renderer.scrollablePlotBox=m(this.plotBox),this.plotBox.height=this.plotHeight+=g,this.inverted?this.clipBox.width+=g:this.clipBox.height+=g,f={2:{name:"bottom",value:g}});f&&!a.skipAxes&&
this.axes.forEach(function(a){f[a.side]?a.getPlotLinePath=function(){var c=f[a.side].name,e=this[c];this[c]=e-f[a.side].value;var g=w.prototype.getPlotLinePath.apply(this,arguments);this[c]=e;return g}:(a.setAxisSize(),a.setAxisTranslation())})}});u(C,"render",function(){this.scrollablePixelsX||this.scrollablePixelsY?(this.setUpScrolling&&this.setUpScrolling(),this.applyFixed()):this.fixedDiv&&this.applyFixed()});C.prototype.setUpScrolling=function(){var a=this,e={WebkitOverflowScrolling:"touch",
overflowX:"hidden",overflowY:"hidden"};this.scrollablePixelsX&&(e.overflowX="auto");this.scrollablePixelsY&&(e.overflowY="auto");this.scrollingParent=n("div",{className:"highcharts-scrolling-parent"},{position:"relative"},this.renderTo);this.scrollingContainer=n("div",{className:"highcharts-scrolling"},e,this.scrollingParent);u(this.scrollingContainer,"scroll",function(){a.pointer&&delete a.pointer.chartPosition});this.innerContainer=n("div",{className:"highcharts-inner-container"},null,this.scrollingContainer);
this.innerContainer.appendChild(this.container);this.setUpScrolling=null};C.prototype.moveFixedElements=function(){var a=this.container,e=this.fixedRenderer,g=".highcharts-contextbutton .highcharts-credits .highcharts-legend .highcharts-legend-checkbox .highcharts-navigator-series .highcharts-navigator-xaxis .highcharts-navigator-yaxis .highcharts-navigator .highcharts-reset-zoom .highcharts-drillup-button .highcharts-scrollbar .highcharts-subtitle .highcharts-title".split(" "),f;this.scrollablePixelsX&&
!this.inverted?f=".highcharts-yaxis":this.scrollablePixelsX&&this.inverted?f=".highcharts-xaxis":this.scrollablePixelsY&&!this.inverted?f=".highcharts-xaxis":this.scrollablePixelsY&&this.inverted&&(f=".highcharts-yaxis");f&&g.push(f+":not(.highcharts-radial-axis)",f+"-labels:not(.highcharts-radial-axis-labels)");g.forEach(function(c){[].forEach.call(a.querySelectorAll(c),function(a){(a.namespaceURI===e.SVG_NS?e.box:e.box.parentNode).appendChild(a);a.style.pointerEvents="auto"})})};C.prototype.applyFixed=
function(){var a=!this.fixedDiv,e=this.options.chart,l=e.scrollablePlotArea,f=z.getRendererType();a?(this.fixedDiv=n("div",{className:"highcharts-fixed"},{position:"absolute",overflow:"hidden",pointerEvents:"none",zIndex:(e.style&&e.style.zIndex||0)+2,top:0},null,!0),this.scrollingContainer&&this.scrollingContainer.parentNode.insertBefore(this.fixedDiv,this.scrollingContainer),this.renderTo.style.overflow="visible",this.fixedRenderer=e=new f(this.fixedDiv,this.chartWidth,this.chartHeight,this.options.chart.style),
this.scrollableMask=e.path().attr({fill:this.options.chart.backgroundColor||"#fff","fill-opacity":g(l.opacity,.85),zIndex:-1}).addClass("highcharts-scrollable-mask").add(),u(this,"afterShowResetZoom",this.moveFixedElements),u(this,"afterDrilldown",this.moveFixedElements),u(this,"afterLayOutTitles",this.moveFixedElements)):this.fixedRenderer.setSize(this.chartWidth,this.chartHeight);if(this.scrollableDirty||a)this.scrollableDirty=!1,this.moveFixedElements();e=this.chartWidth+(this.scrollablePixelsX||
0);f=this.chartHeight+(this.scrollablePixelsY||0);r(this.container);this.container.style.width=e+"px";this.container.style.height=f+"px";this.renderer.boxWrapper.attr({width:e,height:f,viewBox:[0,0,e,f].join(" ")});this.chartBackground.attr({width:e,height:f});this.scrollingContainer.style.height=this.chartHeight+"px";a&&(l.scrollPositionX&&(this.scrollingContainer.scrollLeft=this.scrollablePixelsX*l.scrollPositionX),l.scrollPositionY&&(this.scrollingContainer.scrollTop=this.scrollablePixelsY*l.scrollPositionY));
f=this.axisOffset;a=this.plotTop-f[0]-1;l=this.plotLeft-f[3]-1;e=this.plotTop+this.plotHeight+f[2]+1;f=this.plotLeft+this.plotWidth+f[1]+1;var m=this.plotLeft+this.plotWidth-(this.scrollablePixelsX||0),q=this.plotTop+this.plotHeight-(this.scrollablePixelsY||0);a=this.scrollablePixelsX?[["M",0,a],["L",this.plotLeft-1,a],["L",this.plotLeft-1,e],["L",0,e],["Z"],["M",m,a],["L",this.chartWidth,a],["L",this.chartWidth,e],["L",m,e],["Z"]]:this.scrollablePixelsY?[["M",l,0],["L",l,this.plotTop-1],["L",f,this.plotTop-
1],["L",f,0],["Z"],["M",l,q],["L",l,this.chartHeight],["L",f,this.chartHeight],["L",f,q],["Z"]]:[["M",0,0]];"adjustHeight"!==this.redrawTrigger&&this.scrollableMask.attr({d:a})};u(w,"afterInit",function(){this.chart.scrollableDirty=!0});u(E,"show",function(){this.chart.scrollableDirty=!0});""});M(a,"Core/Axis/StackingAxis.js",[a["Core/Animation/AnimationUtilities.js"],a["Core/Axis/Axis.js"],a["Core/Utilities.js"]],function(a,w,C){var r=a.getDeferredAnimation,z=C.addEvent,x=C.destroyObjectProperties,
J=C.fireEvent,u=C.isNumber,n=C.objectEach,m;(function(a){function c(){var a=this.stacking;if(a){var c=a.stacks;n(c,function(a,e){x(a);c[e]=null});a&&a.stackTotalGroup&&a.stackTotalGroup.destroy()}}function e(){this.stacking||(this.stacking=new f(this))}var g=[];a.compose=function(a){-1===g.indexOf(a)&&(g.push(a),z(a,"init",e),z(a,"destroy",c));return a};var f=function(){function a(a){this.oldStacks={};this.stacks={};this.stacksTouched=0;this.axis=a}a.prototype.buildStacks=function(){var a=this.axis,
c=a.series,e=a.options.reversedStacks,f=c.length,g;if(!a.isXAxis){this.usePercentage=!1;for(g=f;g--;){var l=c[e?g:f-g-1];l.setStackedPoints();l.setGroupedPoints()}for(g=0;g<f;g++)c[g].modifyStacks();J(a,"afterBuildStacks")}};a.prototype.cleanStacks=function(){if(!this.axis.isXAxis){if(this.oldStacks)var a=this.stacks=this.oldStacks;n(a,function(a){n(a,function(a){a.cumulative=a.total})})}};a.prototype.resetStacks=function(){var a=this,c=a.stacks;a.axis.isXAxis||n(c,function(c){n(c,function(e,f){u(e.touched)&&
e.touched<a.stacksTouched?(e.destroy(),delete c[f]):(e.total=null,e.cumulative=null)})})};a.prototype.renderStackTotals=function(){var a=this.axis,c=a.chart,e=c.renderer,f=this.stacks;a=r(c,a.options.stackLabels&&a.options.stackLabels.animation||!1);var g=this.stackTotalGroup=this.stackTotalGroup||e.g("stack-labels").attr({visibility:"visible",zIndex:6,opacity:0}).add();g.translate(c.plotLeft,c.plotTop);n(f,function(a){n(a,function(a){a.render(g)})});g.animate({opacity:1},a)};return a}();a.Additions=
f})(m||(m={}));return m});M(a,"Extensions/Stacking.js",[a["Core/Axis/Axis.js"],a["Core/Chart/Chart.js"],a["Core/FormatUtilities.js"],a["Core/Globals.js"],a["Core/Series/Series.js"],a["Core/Axis/StackingAxis.js"],a["Core/Utilities.js"]],function(a,w,C,E,z,x,J){var r=C.format,n=J.correctFloat,m=J.defined,g=J.destroyObjectProperties,c=J.isArray,e=J.isNumber,l=J.objectEach,f=J.pick,v=function(){function a(a,c,e,f,g){var k=a.chart.inverted;this.axis=a;this.isNegative=e;this.options=c=c||{};this.x=f;this.total=
null;this.points={};this.hasValidPoints=!1;this.stack=g;this.rightCliff=this.leftCliff=0;this.alignOptions={align:c.align||(k?e?"left":"right":"center"),verticalAlign:c.verticalAlign||(k?"middle":e?"bottom":"top"),y:c.y,x:c.x};this.textAlign=c.textAlign||(k?e?"right":"left":"center")}a.prototype.destroy=function(){g(this,this.axis)};a.prototype.render=function(a){var c=this.axis.chart,e=this.options,g=e.format;g=g?r(g,this,c):e.formatter.call(this);this.label?this.label.attr({text:g,visibility:"hidden"}):
(this.label=c.renderer.label(g,null,null,e.shape,null,null,e.useHTML,!1,"stack-labels"),g={r:e.borderRadius||0,text:g,rotation:e.rotation,padding:f(e.padding,5),visibility:"hidden"},c.styledMode||(g.fill=e.backgroundColor,g.stroke=e.borderColor,g["stroke-width"]=e.borderWidth,this.label.css(e.style)),this.label.attr(g),this.label.added||this.label.add(a));this.label.labelrank=c.plotSizeY};a.prototype.setOffset=function(a,c,g,l,n){var k=this.axis,h=k.chart;l=k.translate(k.stacking.usePercentage?100:
l?l:this.total,0,0,0,1);g=k.translate(g?g:0);g=m(l)&&Math.abs(l-g);a=f(n,h.xAxis[0].translate(this.x))+a;k=m(l)&&this.getStackBox(h,this,a,l,c,g,k);c=this.label;g=this.isNegative;a="justify"===f(this.options.overflow,"justify");var d=this.textAlign;c&&k&&(n=c.getBBox(),l=c.padding,d="left"===d?h.inverted?-l:l:"right"===d?n.width:h.inverted&&"center"===d?n.width/2:h.inverted?g?n.width+l:-l:n.width/2,g=h.inverted?n.height/2:g?-l:n.height,this.alignOptions.x=f(this.options.x,0),this.alignOptions.y=f(this.options.y,
0),k.x-=d,k.y-=g,c.align(this.alignOptions,null,k),h.isInsidePlot(c.alignAttr.x+d-this.alignOptions.x,c.alignAttr.y+g-this.alignOptions.y)?c.show():(c.alignAttr.y=-9999,a=!1),a&&z.prototype.justifyDataLabel.call(this.axis,c,this.alignOptions,c.alignAttr,n,k),c.attr({x:c.alignAttr.x,y:c.alignAttr.y}),f(!a&&this.options.crop,!0)&&((h=e(c.x)&&e(c.y)&&h.isInsidePlot(c.x-l+c.width,c.y)&&h.isInsidePlot(c.x+l,c.y))||c.hide()))};a.prototype.getStackBox=function(a,c,e,f,g,l,h){var d=c.axis.reversed,b=a.inverted,
k=h.height+h.pos-(b?a.plotLeft:a.plotTop);c=c.isNegative&&!d||!c.isNegative&&d;return{x:b?c?f-h.right:f-l+h.pos-a.plotLeft:e+a.xAxis[0].transB-a.plotLeft,y:b?h.height-e-g:c?k-f-l:k-f,width:b?l:g,height:b?g:l}};return a}();w.prototype.getStacks=function(){var a=this,c=a.inverted;a.yAxis.forEach(function(a){a.stacking&&a.stacking.stacks&&a.hasVisibleSeries&&(a.stacking.oldStacks=a.stacking.stacks)});a.series.forEach(function(e){var g=e.xAxis&&e.xAxis.options||{};!e.options.stacking||!0!==e.visible&&
!1!==a.options.chart.ignoreHiddenSeries||(e.stackKey=[e.type,f(e.options.stack,""),c?g.top:g.left,c?g.height:g.width].join())})};x.compose(a);z.prototype.setGroupedPoints=function(){var a=this.yAxis.stacking;this.options.centerInCategory&&(this.is("column")||this.is("columnrange"))&&!this.options.stacking&&1<this.chart.series.length?z.prototype.setStackedPoints.call(this,"group"):a&&l(a.stacks,function(c,e){"group"===e.slice(-5)&&(l(c,function(a){return a.destroy()}),delete a.stacks[e])})};z.prototype.setStackedPoints=
function(a){var e=a||this.options.stacking;if(e&&(!0===this.visible||!1===this.chart.options.chart.ignoreHiddenSeries)){var g=this.processedXData,l=this.processedYData,q=[],r=l.length,t=this.options,h=t.threshold,d=f(t.startFromThreshold&&h,0);t=t.stack;a=a?this.type+","+e:this.stackKey;var b="-"+a,p=this.negStacks,u=this.yAxis,y=u.stacking.stacks,x=u.stacking.oldStacks,F,w;u.stacking.stacksTouched+=1;for(w=0;w<r;w++){var z=g[w];var C=l[w];var E=this.getStackIndicator(E,z,this.index);var J=E.key;
var H=(F=p&&C<(d?0:h))?b:a;y[H]||(y[H]={});y[H][z]||(x[H]&&x[H][z]?(y[H][z]=x[H][z],y[H][z].total=null):y[H][z]=new v(u,u.options.stackLabels,F,z,t));H=y[H][z];null!==C?(H.points[J]=H.points[this.index]=[f(H.cumulative,d)],m(H.cumulative)||(H.base=J),H.touched=u.stacking.stacksTouched,0<E.index&&!1===this.singleStacks&&(H.points[J][0]=H.points[this.index+","+z+",0"][0])):H.points[J]=H.points[this.index]=null;"percent"===e?(F=F?a:b,p&&y[F]&&y[F][z]?(F=y[F][z],H.total=F.total=Math.max(F.total,H.total)+
Math.abs(C)||0):H.total=n(H.total+(Math.abs(C)||0))):"group"===e?(c(C)&&(C=C[0]),null!==C&&(H.total=(H.total||0)+1)):H.total=n(H.total+(C||0));H.cumulative="group"===e?(H.total||1)-1:f(H.cumulative,d)+(C||0);null!==C&&(H.points[J].push(H.cumulative),q[w]=H.cumulative,H.hasValidPoints=!0)}"percent"===e&&(u.stacking.usePercentage=!0);"group"!==e&&(this.stackedYData=q);u.stacking.oldStacks={}}};z.prototype.modifyStacks=function(){var a=this,c=a.stackKey,e=a.yAxis.stacking.stacks,f=a.processedXData,g,
l=a.options.stacking;a[l+"Stacker"]&&[c,"-"+c].forEach(function(c){for(var h=f.length,d,b;h--;)if(d=f[h],g=a.getStackIndicator(g,d,a.index,c),b=(d=e[c]&&e[c][d])&&d.points[g.key])a[l+"Stacker"](b,d,h)})};z.prototype.percentStacker=function(a,c,e){c=c.total?100/c.total:0;a[0]=n(a[0]*c);a[1]=n(a[1]*c);this.stackedYData[e]=a[1]};z.prototype.getStackIndicator=function(a,c,e,f){!m(a)||a.x!==c||f&&a.key!==f?a={x:c,index:0,key:f}:a.index++;a.key=[e,c,a.index].join();return a};E.StackItem=v;"";return E.StackItem});
M(a,"Series/Line/LineSeries.js",[a["Core/Color/Palette.js"],a["Core/Series/Series.js"],a["Core/Series/SeriesRegistry.js"],a["Core/Utilities.js"]],function(a,w,C,E){var r=this&&this.__extends||function(){var a=function(n,m){a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(a,c){a.__proto__=c}||function(a,c){for(var e in c)c.hasOwnProperty(e)&&(a[e]=c[e])};return a(n,m)};return function(n,m){function g(){this.constructor=n}a(n,m);n.prototype=null===m?Object.create(m):(g.prototype=m.prototype,
new g)}}(),x=E.defined,J=E.merge;E=function(u){function n(){var a=null!==u&&u.apply(this,arguments)||this;a.data=void 0;a.options=void 0;a.points=void 0;return a}r(n,u);n.prototype.drawGraph=function(){var m=this,g=this.options,c=(this.gappedPath||this.getGraphPath).call(this),e=this.chart.styledMode,l=[["graph","highcharts-graph"]];e||l[0].push(g.lineColor||this.color||a.neutralColor20,g.dashStyle);l=m.getZonesGraphs(l);l.forEach(function(a,l){var f=a[0],k=m[f],n=k?"animate":"attr";k?(k.endX=m.preventGraphAnimation?
null:c.xMap,k.animate({d:c})):c.length&&(m[f]=k=m.chart.renderer.path(c).addClass(a[1]).attr({zIndex:1}).add(m.group));k&&!e&&(f={stroke:a[2],"stroke-width":g.lineWidth,fill:m.fillGraph&&m.color||"none"},a[3]?f.dashstyle=a[3]:"square"!==g.linecap&&(f["stroke-linecap"]=f["stroke-linejoin"]="round"),k[n](f).shadow(2>l&&g.shadow));k&&(k.startX=c.xMap,k.isArea=c.isArea)})};n.prototype.getGraphPath=function(a,g,c){var e=this,l=e.options,f=[],m=[],n,k=l.step;a=a||e.points;var r=a.reversed;r&&a.reverse();
(k={right:1,center:2}[k]||k&&3)&&r&&(k=4-k);a=this.getValidPoints(a,!1,!(l.connectNulls&&!g&&!c));a.forEach(function(q,r){var v=q.plotX,t=q.plotY,h=a[r-1];(q.leftCliff||h&&h.rightCliff)&&!c&&(n=!0);q.isNull&&!x(g)&&0<r?n=!l.connectNulls:q.isNull&&!g?n=!0:(0===r||n?r=[["M",q.plotX,q.plotY]]:e.getPointSpline?r=[e.getPointSpline(a,q,r)]:k?(r=1===k?[["L",h.plotX,t]]:2===k?[["L",(h.plotX+v)/2,h.plotY],["L",(h.plotX+v)/2,t]]:[["L",v,h.plotY]],r.push(["L",v,t])):r=[["L",v,t]],m.push(q.x),k&&(m.push(q.x),
2===k&&m.push(q.x)),f.push.apply(f,r),n=!1)});f.xMap=m;return e.graphPath=f};n.prototype.getZonesGraphs=function(a){this.zones.forEach(function(g,c){c=["zone-graph-"+c,"highcharts-graph highcharts-zone-graph-"+c+" "+(g.className||"")];this.chart.styledMode||c.push(g.color||this.color,g.dashStyle||this.options.dashStyle);a.push(c)},this);return a};n.defaultOptions=J(w.defaultOptions,{});return n}(w);C.registerSeriesType("line",E);"";return E});M(a,"Series/Area/AreaSeries.js",[a["Core/Color/Color.js"],
a["Core/Legend/LegendSymbol.js"],a["Core/Series/SeriesRegistry.js"],a["Core/Utilities.js"]],function(a,w,C,E){var r=this&&this.__extends||function(){var a=function(c,e){a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(a,c){a.__proto__=c}||function(a,c){for(var e in c)c.hasOwnProperty(e)&&(a[e]=c[e])};return a(c,e)};return function(c,e){function g(){this.constructor=c}a(c,e);c.prototype=null===e?Object.create(e):(g.prototype=e.prototype,new g)}}(),x=a.parse,J=C.seriesTypes.line;a=
E.extend;var u=E.merge,n=E.objectEach,m=E.pick;E=function(a){function c(){var c=null!==a&&a.apply(this,arguments)||this;c.data=void 0;c.options=void 0;c.points=void 0;return c}r(c,a);c.prototype.drawGraph=function(){this.areaPath=[];a.prototype.drawGraph.apply(this);var c=this,g=this.areaPath,f=this.options,n=[["area","highcharts-area",this.color,f.fillColor]];this.zones.forEach(function(a,e){n.push(["zone-area-"+e,"highcharts-area highcharts-zone-area-"+e+" "+a.className,a.color||c.color,a.fillColor||
f.fillColor])});n.forEach(function(a){var e=a[0],l=c[e],n=l?"animate":"attr",q={};l?(l.endX=c.preventGraphAnimation?null:g.xMap,l.animate({d:g})):(q.zIndex=0,l=c[e]=c.chart.renderer.path(g).addClass(a[1]).add(c.group),l.isArea=!0);c.chart.styledMode||(q.fill=m(a[3],x(a[2]).setOpacity(m(f.fillOpacity,.75)).get()));l[n](q);l.startX=g.xMap;l.shiftUnit=f.step?2:1})};c.prototype.getGraphPath=function(a){var c=J.prototype.getGraphPath,e=this.options,g=e.stacking,n=this.yAxis,k,r=[],u=[],B=this.index,x=
n.stacking.stacks[this.stackKey],t=e.threshold,h=Math.round(n.getThreshold(e.threshold));e=m(e.connectNulls,"percent"===g);var d=function(b,d,c){var e=a[b];b=g&&x[e.x].points[B];var f=e[c+"Null"]||0;c=e[c+"Cliff"]||0;e=!0;if(c||f){var k=(f?b[0]:b[1])+c;var l=b[0]+c;e=!!f}else!g&&a[d]&&a[d].isNull&&(k=l=t);"undefined"!==typeof k&&(u.push({plotX:p,plotY:null===k?h:n.getThreshold(k),isNull:e,isCliff:!0}),r.push({plotX:p,plotY:null===l?h:n.getThreshold(l),doCurve:!1}))};a=a||this.points;g&&(a=this.getStackPoints(a));
for(k=0;k<a.length;k++){g||(a[k].leftCliff=a[k].rightCliff=a[k].leftNull=a[k].rightNull=void 0);var b=a[k].isNull;var p=m(a[k].rectPlotX,a[k].plotX);var G=g?m(a[k].yBottom,h):h;if(!b||e)e||d(k,k-1,"left"),b&&!g&&e||(u.push(a[k]),r.push({x:k,plotX:p,plotY:G})),e||d(k,k+1,"right")}k=c.call(this,u,!0,!0);r.reversed=!0;b=c.call(this,r,!0,!0);(G=b[0])&&"M"===G[0]&&(b[0]=["L",G[1],G[2]]);b=k.concat(b);b.length&&b.push(["Z"]);c=c.call(this,u,!1,e);b.xMap=k.xMap;this.areaPath=b;return c};c.prototype.getStackPoints=
function(a){var c=this,e=[],g=[],r=this.xAxis,k=this.yAxis,u=k.stacking.stacks[this.stackKey],x={},B=k.series,w=B.length,t=k.options.reversedStacks?1:-1,h=B.indexOf(c);a=a||this.points;if(this.options.stacking){for(var d=0;d<a.length;d++)a[d].leftNull=a[d].rightNull=void 0,x[a[d].x]=a[d];n(u,function(a,b){null!==a.total&&g.push(b)});g.sort(function(a,b){return a-b});var b=B.map(function(a){return a.visible});g.forEach(function(a,d){var f=0,l,n;if(x[a]&&!x[a].isNull)e.push(x[a]),[-1,1].forEach(function(e){var f=
1===e?"rightNull":"leftNull",k=0,m=u[g[d+e]];if(m)for(var p=h;0<=p&&p<w;){var r=B[p].index;l=m.points[r];l||(r===c.index?x[a][f]=!0:b[p]&&(n=u[a].points[r])&&(k-=n[1]-n[0]));p+=t}x[a][1===e?"rightCliff":"leftCliff"]=k});else{for(var p=h;0<=p&&p<w;){if(l=u[a].points[B[p].index]){f=l[1];break}p+=t}f=m(f,0);f=k.translate(f,0,1,0,1);e.push({isNull:!0,plotX:r.translate(a,0,0,0,1),x:a,plotY:f,yBottom:f})}})}return e};c.defaultOptions=u(J.defaultOptions,{threshold:0});return c}(J);a(E.prototype,{singleStacks:!1,
drawLegendSymbol:w.drawRectangle});C.registerSeriesType("area",E);"";return E});M(a,"Series/Spline/SplineSeries.js",[a["Core/Series/SeriesRegistry.js"],a["Core/Utilities.js"]],function(a,w){var r=this&&this.__extends||function(){var a=function(r,n){a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(a,g){a.__proto__=g}||function(a,g){for(var c in g)g.hasOwnProperty(c)&&(a[c]=g[c])};return a(r,n)};return function(r,n){function m(){this.constructor=r}a(r,n);r.prototype=null===n?Object.create(n):
(m.prototype=n.prototype,new m)}}(),E=a.seriesTypes.line,z=w.merge,x=w.pick;w=function(a){function u(){var n=null!==a&&a.apply(this,arguments)||this;n.data=void 0;n.options=void 0;n.points=void 0;return n}r(u,a);u.prototype.getPointSpline=function(a,m,g){var c=m.plotX||0,e=m.plotY||0,l=a[g-1];g=a[g+1];if(l&&!l.isNull&&!1!==l.doCurve&&!m.isCliff&&g&&!g.isNull&&!1!==g.doCurve&&!m.isCliff){a=l.plotY||0;var f=g.plotX||0;g=g.plotY||0;var n=0;var r=(1.5*c+(l.plotX||0))/2.5;var k=(1.5*e+a)/2.5;f=(1.5*c+
f)/2.5;var u=(1.5*e+g)/2.5;f!==r&&(n=(u-k)*(f-c)/(f-r)+e-u);k+=n;u+=n;k>a&&k>e?(k=Math.max(a,e),u=2*e-k):k<a&&k<e&&(k=Math.min(a,e),u=2*e-k);u>g&&u>e?(u=Math.max(g,e),k=2*e-u):u<g&&u<e&&(u=Math.min(g,e),k=2*e-u);m.rightContX=f;m.rightContY=u}m=["C",x(l.rightContX,l.plotX,0),x(l.rightContY,l.plotY,0),x(r,c,0),x(k,e,0),c,e];l.rightContX=l.rightContY=void 0;return m};u.defaultOptions=z(E.defaultOptions);return u}(E);a.registerSeriesType("spline",w);"";return w});M(a,"Series/AreaSpline/AreaSplineSeries.js",
[a["Series/Area/AreaSeries.js"],a["Series/Spline/SplineSeries.js"],a["Core/Legend/LegendSymbol.js"],a["Core/Series/SeriesRegistry.js"],a["Core/Utilities.js"]],function(a,w,C,E,z){var r=this&&this.__extends||function(){var a=function(g,c){a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(a,c){a.__proto__=c}||function(a,c){for(var e in c)c.hasOwnProperty(e)&&(a[e]=c[e])};return a(g,c)};return function(g,c){function e(){this.constructor=g}a(g,c);g.prototype=null===c?Object.create(c):
(e.prototype=c.prototype,new e)}}(),J=a.prototype,u=z.extend,n=z.merge;z=function(m){function g(){var a=null!==m&&m.apply(this,arguments)||this;a.data=void 0;a.points=void 0;a.options=void 0;return a}r(g,m);g.defaultOptions=n(w.defaultOptions,a.defaultOptions);return g}(w);u(z.prototype,{getGraphPath:J.getGraphPath,getStackPoints:J.getStackPoints,drawGraph:J.drawGraph,drawLegendSymbol:C.drawRectangle});E.registerSeriesType("areaspline",z);"";return z});M(a,"Series/Column/ColumnSeries.js",[a["Core/Animation/AnimationUtilities.js"],
a["Core/Color/Color.js"],a["Core/Globals.js"],a["Core/Legend/LegendSymbol.js"],a["Core/Color/Palette.js"],a["Core/Series/Series.js"],a["Core/Series/SeriesRegistry.js"],a["Core/Utilities.js"]],function(a,w,C,E,z,x,J,u){var n=this&&this.__extends||function(){var a=function(c,d){a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(a,d){a.__proto__=d}||function(a,d){for(var b in d)d.hasOwnProperty(b)&&(a[b]=d[b])};return a(c,d)};return function(c,d){function b(){this.constructor=c}a(c,d);
c.prototype=null===d?Object.create(d):(b.prototype=d.prototype,new b)}}(),m=a.animObject,g=w.parse,c=C.hasTouch;a=C.noop;var e=u.clamp,l=u.css,f=u.defined,r=u.extend,q=u.fireEvent,k=u.isArray,I=u.isNumber,D=u.merge,B=u.pick,O=u.objectEach;u=function(a){function h(){var d=null!==a&&a.apply(this,arguments)||this;d.borderWidth=void 0;d.data=void 0;d.group=void 0;d.options=void 0;d.points=void 0;return d}n(h,a);h.prototype.animate=function(a){var b=this,d=this.yAxis,c=b.options,h=this.chart.inverted,
f={},g=h?"translateX":"translateY";if(a)f.scaleY=.001,a=e(d.toPixels(c.threshold),d.pos,d.pos+d.len),h?f.translateX=a-d.len:f.translateY=a,b.clipBox&&b.setClip(),b.group.attr(f);else{var k=Number(b.group.attr(g));b.group.animate({scaleY:1},r(m(b.options.animation),{step:function(a,c){b.group&&(f[g]=k+c.pos*(d.pos-k),b.group.attr(f))}}))}};h.prototype.init=function(d,b){a.prototype.init.apply(this,arguments);var c=this;d=c.chart;d.hasRendered&&d.series.forEach(function(a){a.type===c.type&&(a.isDirty=
!0)})};h.prototype.getColumnMetrics=function(){var a=this,b=a.options,c=a.xAxis,e=a.yAxis,h=c.options.reversedStacks;h=c.reversed&&!h||!c.reversed&&h;var f={},g,k=0;!1===b.grouping?k=1:a.chart.series.forEach(function(b){var d=b.yAxis,c=b.options;if(b.type===a.type&&(b.visible||!a.chart.options.chart.ignoreHiddenSeries)&&e.len===d.len&&e.pos===d.pos){if(c.stacking&&"group"!==c.stacking){g=b.stackKey;"undefined"===typeof f[g]&&(f[g]=k++);var h=f[g]}else!1!==c.grouping&&(h=k++);b.columnIndex=h}});var l=
Math.min(Math.abs(c.transA)*(c.ordinal&&c.ordinal.slope||b.pointRange||c.closestPointRange||c.tickInterval||1),c.len),m=l*b.groupPadding,n=(l-2*m)/(k||1);b=Math.min(b.maxPointWidth||c.len,B(b.pointWidth,n*(1-2*b.pointPadding)));a.columnMetrics={width:b,offset:(n-b)/2+(m+((a.columnIndex||0)+(h?1:0))*n-l/2)*(h?-1:1),paddedWidth:n,columnCount:k};return a.columnMetrics};h.prototype.crispCol=function(a,b,c,e){var d=this.chart,h=this.borderWidth,f=-(h%2?.5:0);h=h%2?.5:1;d.inverted&&d.renderer.isVML&&(h+=
1);this.options.crisp&&(c=Math.round(a+c)+f,a=Math.round(a)+f,c-=a);e=Math.round(b+e)+h;f=.5>=Math.abs(b)&&.5<e;b=Math.round(b)+h;e-=b;f&&e&&(--b,e+=1);return{x:a,y:b,width:c,height:e}};h.prototype.adjustForMissingColumns=function(a,b,c,e){var d=this,h=this.options.stacking;if(!c.isNull&&1<e.columnCount){var f=0,g=0;O(this.yAxis.stacking&&this.yAxis.stacking.stacks,function(a){if("number"===typeof c.x&&(a=a[c.x.toString()])){var b=a.points[d.index],e=a.total;h?(b&&(f=g),a.hasValidPoints&&g++):k(b)&&
(f=b[1],g=e||0)}});a=(c.plotX||0)+((g-1)*e.paddedWidth+b)/2-b-f*e.paddedWidth}return a};h.prototype.translate=function(){var a=this,b=a.chart,c=a.options,h=a.dense=2>a.closestPointRange*a.xAxis.transA;h=a.borderWidth=B(c.borderWidth,h?0:1);var g=a.xAxis,k=a.yAxis,l=c.threshold,m=a.translatedThreshold=k.getThreshold(l),n=B(c.minPointLength,5),r=a.getColumnMetrics(),t=r.width,q=a.pointXOffset=r.offset,v=a.dataMin,u=a.dataMax,w=a.barW=Math.max(t,1+2*h);b.inverted&&(m-=.5);c.pointPadding&&(w=Math.ceil(w));
x.prototype.translate.apply(a);a.points.forEach(function(d){var h=B(d.yBottom,m),p=999+Math.abs(h),y=d.plotX||0;p=e(d.plotY,-p,k.len+p);var x=Math.min(p,h),F=Math.max(p,h)-x,D=t,G=y+q,z=w;n&&Math.abs(F)<n&&(F=n,y=!k.reversed&&!d.negative||k.reversed&&d.negative,I(l)&&I(u)&&d.y===l&&u<=l&&(k.min||0)<l&&(v!==u||(k.max||0)<=l)&&(y=!y),x=Math.abs(x-m)>n?h-n:m-(y?n:0));f(d.options.pointWidth)&&(D=z=Math.ceil(d.options.pointWidth),G-=Math.round((D-t)/2));c.centerInCategory&&(G=a.adjustForMissingColumns(G,
D,d,r));d.barX=G;d.pointWidth=D;d.tooltipPos=b.inverted?[e(k.len+k.pos-b.plotLeft-p,k.pos-b.plotLeft,k.len+k.pos-b.plotLeft),g.len+g.pos-b.plotTop-G-z/2,F]:[g.left-b.plotLeft+G+z/2,e(p+k.pos-b.plotTop,k.pos-b.plotTop,k.len+k.pos-b.plotTop),F];d.shapeType=a.pointClass.prototype.shapeType||"rect";d.shapeArgs=a.crispCol.apply(a,d.isNull?[G,m,z,0]:[G,x,z,F])})};h.prototype.drawGraph=function(){this.group[this.dense?"addClass":"removeClass"]("highcharts-dense-data")};h.prototype.pointAttribs=function(a,
b){var d=this.options,c=this.pointAttrToOptions||{},e=c.stroke||"borderColor",h=c["stroke-width"]||"borderWidth",f=a&&a.color||this.color,k=a&&a[e]||d[e]||f;c=a&&a.options.dashStyle||d.dashStyle;var l=a&&a[h]||d[h]||this[h]||0,m=B(a&&a.opacity,d.opacity,1);if(a&&this.zones.length){var n=a.getZone();f=a.options.color||n&&(n.color||a.nonZonedColor)||this.color;n&&(k=n.borderColor||k,c=n.dashStyle||c,l=n.borderWidth||l)}b&&a&&(a=D(d.states[b],a.options.states&&a.options.states[b]||{}),b=a.brightness,
f=a.color||"undefined"!==typeof b&&g(f).brighten(a.brightness).get()||f,k=a[e]||k,l=a[h]||l,c=a.dashStyle||c,m=B(a.opacity,m));e={fill:f,stroke:k,"stroke-width":l,opacity:m};c&&(e.dashstyle=c);return e};h.prototype.drawPoints=function(){var a=this,b=this.chart,c=a.options,e=b.renderer,h=c.animationLimit||250,f;a.points.forEach(function(d){var g=d.graphic,k=!!g,l=g&&b.pointCount<h?"animate":"attr";if(I(d.plotY)&&null!==d.y){f=d.shapeArgs;g&&d.hasNewShapeType()&&(g=g.destroy());a.enabledDataSorting&&
(d.startXPos=a.xAxis.reversed?-(f?f.width||0:0):a.xAxis.width);g||(d.graphic=g=e[d.shapeType](f).add(d.group||a.group))&&a.enabledDataSorting&&b.hasRendered&&b.pointCount<h&&(g.attr({x:d.startXPos}),k=!0,l="animate");if(g&&k)g[l](D(f));if(c.borderRadius)g[l]({r:c.borderRadius});b.styledMode||g[l](a.pointAttribs(d,d.selected&&"select")).shadow(!1!==d.allowShadow&&c.shadow,null,c.stacking&&!c.borderRadius);g&&(g.addClass(d.getClassName(),!0),g.attr({visibility:d.visible?"inherit":"hidden"}))}else g&&
(d.graphic=g.destroy())})};h.prototype.drawTracker=function(){var a=this,b=a.chart,e=b.pointer,h=function(a){var b=e.getPointFromEvent(a);"undefined"!==typeof b&&(e.isDirectTouch=!0,b.onMouseOver(a))},f;a.points.forEach(function(a){f=k(a.dataLabels)?a.dataLabels:a.dataLabel?[a.dataLabel]:[];a.graphic&&(a.graphic.element.point=a);f.forEach(function(b){b.div?b.div.point=a:b.element.point=a})});a._hasTracking||(a.trackerGroups.forEach(function(d){if(a[d]){a[d].addClass("highcharts-tracker").on("mouseover",
h).on("mouseout",function(a){e.onTrackerMouseOut(a)});if(c)a[d].on("touchstart",h);!b.styledMode&&a.options.cursor&&a[d].css(l).css({cursor:a.options.cursor})}}),a._hasTracking=!0);q(this,"afterDrawTracker")};h.prototype.remove=function(){var a=this,b=a.chart;b.hasRendered&&b.series.forEach(function(b){b.type===a.type&&(b.isDirty=!0)});x.prototype.remove.apply(a,arguments)};h.defaultOptions=D(x.defaultOptions,{borderRadius:0,centerInCategory:!1,groupPadding:.2,marker:null,pointPadding:.1,minPointLength:0,
cropThreshold:50,pointRange:null,states:{hover:{halo:!1,brightness:.1},select:{color:z.neutralColor20,borderColor:z.neutralColor100}},dataLabels:{align:void 0,verticalAlign:void 0,y:void 0},startFromThreshold:!0,stickyTracking:!1,tooltip:{distance:6},threshold:0,borderColor:z.backgroundColor});return h}(x);r(u.prototype,{cropShoulder:0,directTouch:!0,drawLegendSymbol:E.drawRectangle,getSymbol:a,negStacks:!0,trackerGroups:["group","dataLabelsGroup"]});J.registerSeriesType("column",u);"";"";return u});
M(a,"Core/Series/DataLabel.js",[a["Core/Animation/AnimationUtilities.js"],a["Core/FormatUtilities.js"],a["Core/Color/Palette.js"],a["Core/Utilities.js"]],function(a,w,C,E){var r=a.getDeferredAnimation,x=w.format,J=E.defined,u=E.extend,n=E.fireEvent,m=E.isArray,g=E.merge,c=E.objectEach,e=E.pick,l=E.splat,f;(function(a){function f(a,c,b,f,g){var d=this,h=this.chart,k=this.isCartesian&&h.inverted,l=this.enabledDataSorting,m=e(a.dlBox&&a.dlBox.centerX,a.plotX,-9999),n=e(a.plotY,-9999),p=c.getBBox(),r=
b.rotation,t=b.align,q=h.isInsidePlot(m,Math.round(n),{inverted:k,paneCoordinates:!0,series:d}),v=function(b){l&&d.xAxis&&!B&&d.setDataLabelStartPos(a,c,g,q,b)},B="justify"===e(b.overflow,l?"none":"justify"),x=this.visible&&!1!==a.visible&&(a.series.forceDL||l&&!B||q||e(b.inside,!!this.options.stacking)&&f&&h.isInsidePlot(m,k?f.x+1:f.y+f.height-1,{inverted:k,paneCoordinates:!0,series:d}));if(x){var w=h.renderer.fontMetrics(h.styledMode?void 0:b.style.fontSize,c).b;f=u({x:k?this.yAxis.len-n:m,y:Math.round(k?
this.xAxis.len-m:n),width:0,height:0},f);u(b,{width:p.width,height:p.height});r?(B=!1,m=h.renderer.rotCorr(w,r),m={x:f.x+(b.x||0)+f.width/2+m.x,y:f.y+(b.y||0)+{top:0,middle:.5,bottom:1}[b.verticalAlign]*f.height},v(m),c[g?"attr":"animate"](m).attr({align:t}),v=(r+720)%360,v=180<v&&360>v,"left"===t?m.y-=v?p.height:0:"center"===t?(m.x-=p.width/2,m.y-=p.height/2):"right"===t&&(m.x-=p.width,m.y-=v?0:p.height),c.placed=!0,c.alignAttr=m):(v(f),c.align(b,void 0,f),m=c.alignAttr);B&&0<=f.height?this.justifyDataLabel(c,
b,m,p,f,g):e(b.crop,!0)&&(x=h.isInsidePlot(m.x,m.y,{paneCoordinates:!0,series:d})&&h.isInsidePlot(m.x+p.width,m.y+p.height,{paneCoordinates:!0,series:d}));if(b.shape&&!r)c[g?"attr":"animate"]({anchorX:k?h.plotWidth-a.plotY:a.plotX,anchorY:k?h.plotHeight-a.plotX:a.plotY})}g&&l&&(c.placed=!1);x||l&&!B||(c.hide(!0),c.placed=!1)}function k(a,c){var b=c.filter;return b?(c=b.operator,a=a[b.property],b=b.value,">"===c&&a>b||"<"===c&&a<b||">="===c&&a>=b||"<="===c&&a<=b||"=="===c&&a==b||"==="===c&&a===b?!0:
!1):!0}function v(){var a=this,d=a.chart,b=a.options,f=a.points,g=a.hasRendered||0,t=d.renderer,q=b.dataLabels,v,u=q.animation;u=q.defer?r(d,u,a):{defer:0,duration:0};q=B(B(d.options.plotOptions&&d.options.plotOptions.series&&d.options.plotOptions.series.dataLabels,d.options.plotOptions&&d.options.plotOptions[a.type]&&d.options.plotOptions[a.type].dataLabels),q);n(this,"drawDataLabels");if(m(q)||q.enabled||a._hasPointLabels){var w=a.plotGroup("dataLabelsGroup","data-labels",g?"inherit":"hidden",q.zIndex||
6);w.attr({opacity:+g});!g&&(g=a.dataLabelsGroup)&&(a.visible&&w.show(!0),g[b.animation?"animate":"attr"]({opacity:1},u));f.forEach(function(f){v=l(B(q,f.dlOptions||f.options&&f.options.dataLabels));v.forEach(function(h,g){var l=h.enabled&&(!f.isNull||f.dataLabelOnNull)&&k(f,h),m=f.connectors?f.connectors[g]:f.connector,n=f.dataLabels?f.dataLabels[g]:f.dataLabel,p=e(h.distance,f.labelDistance),r=!n;if(l){var q=f.getLabelConfig();var v=e(h[f.formatPrefix+"Format"],h.format);q=J(v)?x(v,q,d):(h[f.formatPrefix+
"Formatter"]||h.formatter).call(q,h);v=h.style;var u=h.rotation;d.styledMode||(v.color=e(h.color,v.color,a.color,C.neutralColor100),"contrast"===v.color?(f.contrastColor=t.getContrast(f.color||a.color),v.color=!J(p)&&h.inside||0>p||b.stacking?f.contrastColor:C.neutralColor100):delete f.contrastColor,b.cursor&&(v.cursor=b.cursor));var B={r:h.borderRadius||0,rotation:u,padding:h.padding,zIndex:1};d.styledMode||(B.fill=h.backgroundColor,B.stroke=h.borderColor,B["stroke-width"]=h.borderWidth);c(B,function(a,
b){"undefined"===typeof a&&delete B[b]})}!n||l&&J(q)?l&&J(q)&&(n?B.text=q:(f.dataLabels=f.dataLabels||[],n=f.dataLabels[g]=u?t.text(q,0,-9999,h.useHTML).addClass("highcharts-data-label"):t.label(q,0,-9999,h.shape,null,null,h.useHTML,null,"data-label"),g||(f.dataLabel=n),n.addClass(" highcharts-data-label-color-"+f.colorIndex+" "+(h.className||"")+(h.useHTML?" highcharts-tracker":""))),n.options=h,n.attr(B),d.styledMode||n.css(v).shadow(h.shadow),n.added||n.add(w),h.textPath&&!h.useHTML&&(n.setTextPath(f.getDataLabelPath&&
f.getDataLabelPath(n)||f.graphic,h.textPath),f.dataLabelPath&&!h.textPath.enabled&&(f.dataLabelPath=f.dataLabelPath.destroy())),a.alignDataLabel(f,n,h,null,r)):(f.dataLabel=f.dataLabel&&f.dataLabel.destroy(),f.dataLabels&&(1===f.dataLabels.length?delete f.dataLabels:delete f.dataLabels[g]),g||delete f.dataLabel,m&&(f.connector=f.connector.destroy(),f.connectors&&(1===f.connectors.length?delete f.connectors:delete f.connectors[g])))})})}n(this,"afterDrawDataLabels")}function w(a,c,b,e,f,g){var d=this.chart,
h=c.align,k=c.verticalAlign,l=a.box?0:a.padding||0,m=c.x;m=void 0===m?0:m;var n=c.y;n=void 0===n?0:n;var p=(b.x||0)+l;if(0>p){"right"===h&&0<=m?(c.align="left",c.inside=!0):m-=p;var r=!0}p=(b.x||0)+e.width-l;p>d.plotWidth&&("left"===h&&0>=m?(c.align="right",c.inside=!0):m+=d.plotWidth-p,r=!0);p=b.y+l;0>p&&("bottom"===k&&0<=n?(c.verticalAlign="top",c.inside=!0):n-=p,r=!0);p=(b.y||0)+e.height-l;p>d.plotHeight&&("top"===k&&0>=n?(c.verticalAlign="bottom",c.inside=!0):n+=d.plotHeight-p,r=!0);r&&(c.x=m,
c.y=n,a.placed=!g,a.align(c,void 0,f));return r}function B(a,c){var b=[],d;if(m(a)&&!m(c))b=a.map(function(a){return g(a,c)});else if(m(c)&&!m(a))b=c.map(function(b){return g(a,b)});else if(m(a)||m(c))for(d=Math.max(a.length,c.length);d--;)b[d]=g(a[d],c[d]);else b=g(a,c);return b}function z(a,c,b,e,f){var d=this.chart,h=d.inverted,g=this.xAxis,k=g.reversed,l=h?c.height/2:c.width/2;a=(a=a.pointWidth)?a/2:0;c.startXPos=h?f.x:k?-l-a:g.width-l+a;c.startYPos=h?k?this.yAxis.height-l+a:-l-a:f.y;e?"hidden"===
c.visibility&&(c.show(),c.attr({opacity:0}).animate({opacity:1})):c.attr({opacity:1}).animate({opacity:0},void 0,c.hide);d.hasRendered&&(b&&c.attr({x:c.startXPos,y:c.startYPos}),c.placed=!0)}var t=[];a.compose=function(a){if(-1===t.indexOf(a)){var c=a.prototype;t.push(a);c.alignDataLabel=f;c.drawDataLabels=v;c.justifyDataLabel=w;c.setDataLabelStartPos=z}}})(f||(f={}));"";return f});M(a,"Series/Column/ColumnDataLabel.js",[a["Core/Series/DataLabel.js"],a["Core/Series/SeriesRegistry.js"],a["Core/Utilities.js"]],
function(a,w,C){var r=w.series,z=C.merge,x=C.pick,J;(function(u){function n(a,c,e,l,f){var g=this.chart.inverted,m=a.series,k=a.dlBox||a.shapeArgs,n=x(a.below,a.plotY>x(this.translatedThreshold,m.yAxis.len)),u=x(e.inside,!!this.options.stacking);k&&(l=z(k),0>l.y&&(l.height+=l.y,l.y=0),k=l.y+l.height-m.yAxis.len,0<k&&k<l.height&&(l.height-=k),g&&(l={x:m.yAxis.len-l.y-l.height,y:m.xAxis.len-l.x-l.width,width:l.height,height:l.width}),u||(g?(l.x+=n?0:l.width,l.width=0):(l.y+=n?l.height:0,l.height=0)));
e.align=x(e.align,!g||u?"center":n?"right":"left");e.verticalAlign=x(e.verticalAlign,g||u?"middle":n?"top":"bottom");r.prototype.alignDataLabel.call(this,a,c,e,l,f);e.inside&&a.contrastColor&&c.css({color:a.contrastColor})}var m=[];u.compose=function(g){a.compose(r);-1===m.indexOf(g)&&(m.push(g),g.prototype.alignDataLabel=n)}})(J||(J={}));return J});M(a,"Series/Bar/BarSeries.js",[a["Series/Column/ColumnSeries.js"],a["Core/Series/SeriesRegistry.js"],a["Core/Utilities.js"]],function(a,w,C){var r=this&&
this.__extends||function(){var a=function(r,n){a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(a,g){a.__proto__=g}||function(a,g){for(var c in g)g.hasOwnProperty(c)&&(a[c]=g[c])};return a(r,n)};return function(r,n){function m(){this.constructor=r}a(r,n);r.prototype=null===n?Object.create(n):(m.prototype=n.prototype,new m)}}(),z=C.extend,x=C.merge;C=function(w){function u(){var a=null!==w&&w.apply(this,arguments)||this;a.data=void 0;a.options=void 0;a.points=void 0;return a}r(u,w);
u.defaultOptions=x(a.defaultOptions,{});return u}(a);z(C.prototype,{inverted:!0});w.registerSeriesType("bar",C);"";return C});M(a,"Series/Scatter/ScatterSeries.js",[a["Series/Column/ColumnSeries.js"],a["Series/Line/LineSeries.js"],a["Core/Series/SeriesRegistry.js"],a["Core/Utilities.js"]],function(a,w,C,E){var r=this&&this.__extends||function(){var a=function(m,g){a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(a,e){a.__proto__=e}||function(a,e){for(var c in e)e.hasOwnProperty(c)&&
(a[c]=e[c])};return a(m,g)};return function(m,g){function c(){this.constructor=m}a(m,g);m.prototype=null===g?Object.create(g):(c.prototype=g.prototype,new c)}}(),x=E.addEvent,J=E.extend,u=E.merge;E=function(a){function m(){var g=null!==a&&a.apply(this,arguments)||this;g.data=void 0;g.options=void 0;g.points=void 0;return g}r(m,a);m.prototype.applyJitter=function(){var a=this,c=this.options.jitter,e=this.points.length;c&&this.points.forEach(function(g,f){["x","y"].forEach(function(l,m){var k="plot"+
l.toUpperCase();if(c[l]&&!g.isNull){var n=a[l+"Axis"];var r=c[l]*n.transA;if(n&&!n.isLog){var q=Math.max(0,g[k]-r);n=Math.min(n.len,g[k]+r);m=1E4*Math.sin(f+m*e);g[k]=q+(n-q)*(m-Math.floor(m));"x"===l&&(g.clientX=g.plotX)}}})})};m.prototype.drawGraph=function(){this.options.lineWidth?a.prototype.drawGraph.call(this):this.graph&&(this.graph=this.graph.destroy())};m.defaultOptions=u(w.defaultOptions,{lineWidth:0,findNearestPointBy:"xy",jitter:{x:0,y:0},marker:{enabled:!0},tooltip:{headerFormat:'<span style="color:{point.color}">\u25cf</span> <span style="font-size: 10px"> {series.name}</span><br/>',
pointFormat:"x: <b>{point.x}</b><br/>y: <b>{point.y}</b><br/>"}});return m}(w);J(E.prototype,{drawTracker:a.prototype.drawTracker,sorted:!1,requireSorting:!1,noSharedTooltip:!0,trackerGroups:["group","markerGroup","dataLabelsGroup"],takeOrdinalPosition:!1});x(E,"afterTranslate",function(){this.applyJitter()});C.registerSeriesType("scatter",E);"";return E});M(a,"Mixins/CenteredSeries.js",[a["Core/Globals.js"],a["Core/Series/Series.js"],a["Core/Utilities.js"]],function(a,w,C){var r=C.isNumber,z=C.pick,
x=C.relativeLength,J=a.deg2rad;return a.CenteredSeriesMixin={getCenter:function(){var a=this.options,n=this.chart,m=2*(a.slicedOffset||0),g=n.plotWidth-2*m,c=n.plotHeight-2*m,e=a.center,l=Math.min(g,c),f=a.size,r=a.innerSize||0;"string"===typeof f&&(f=parseFloat(f));"string"===typeof r&&(r=parseFloat(r));a=[z(e[0],"50%"),z(e[1],"50%"),z(f&&0>f?void 0:a.size,"100%"),z(r&&0>r?void 0:a.innerSize||0,"0%")];!n.angular||this instanceof w||(a[3]=0);for(e=0;4>e;++e)f=a[e],n=2>e||2===e&&/%$/.test(f),a[e]=
x(f,[g,c,l,a[2]][e])+(n?m:0);a[3]>a[2]&&(a[3]=a[2]);return a},getStartAndEndRadians:function(a,n){a=r(a)?a:0;n=r(n)&&n>a&&360>n-a?n:a+360;return{start:J*(a+-90),end:J*(n+-90)}}}});M(a,"Series/Pie/PiePoint.js",[a["Core/Animation/AnimationUtilities.js"],a["Core/Series/Point.js"],a["Core/Utilities.js"]],function(a,w,C){var r=this&&this.__extends||function(){var a=function(c,e){a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(a,c){a.__proto__=c}||function(a,c){for(var e in c)c.hasOwnProperty(e)&&
(a[e]=c[e])};return a(c,e)};return function(c,e){function g(){this.constructor=c}a(c,e);c.prototype=null===e?Object.create(e):(g.prototype=e.prototype,new g)}}(),z=a.setAnimation,x=C.addEvent,J=C.defined;a=C.extend;var u=C.isNumber,n=C.pick,m=C.relativeLength;w=function(a){function c(){var c=null!==a&&a.apply(this,arguments)||this;c.labelDistance=void 0;c.options=void 0;c.series=void 0;return c}r(c,a);c.prototype.getConnectorPath=function(){var a=this.labelPosition,c=this.series.options.dataLabels,
f=this.connectorShapes,g=c.connectorShape;f[g]&&(g=f[g]);return g.call(this,{x:a.final.x,y:a.final.y,alignment:a.alignment},a.connectorPosition,c)};c.prototype.getTranslate=function(){return this.sliced?this.slicedTranslation:{translateX:0,translateY:0}};c.prototype.haloPath=function(a){var c=this.shapeArgs;return this.sliced||!this.visible?[]:this.series.chart.renderer.symbols.arc(c.x,c.y,c.r+a,c.r+a,{innerR:c.r-1,start:c.start,end:c.end})};c.prototype.init=function(){var c=this;a.prototype.init.apply(this,
arguments);this.name=n(this.name,"Slice");var g=function(a){c.slice("select"===a.type)};x(this,"select",g);x(this,"unselect",g);return this};c.prototype.isValid=function(){return u(this.y)&&0<=this.y};c.prototype.setVisible=function(a,c){var e=this,g=this.series,l=g.chart,k=g.options.ignoreHiddenPoint;c=n(c,k);a!==this.visible&&(this.visible=this.options.visible=a="undefined"===typeof a?!this.visible:a,g.options.data[g.data.indexOf(this)]=this.options,["graphic","dataLabel","connector","shadowGroup"].forEach(function(c){if(e[c])e[c][a?
"show":"hide"](a)}),this.legendItem&&l.legend.colorizeItem(this,a),a||"hover"!==this.state||this.setState(""),k&&(g.isDirty=!0),c&&l.redraw())};c.prototype.slice=function(a,c,f){var e=this.series;z(f,e.chart);n(c,!0);this.sliced=this.options.sliced=J(a)?a:!this.sliced;e.options.data[e.data.indexOf(this)]=this.options;this.graphic&&this.graphic.animate(this.getTranslate());this.shadowGroup&&this.shadowGroup.animate(this.getTranslate())};return c}(w);a(w.prototype,{connectorShapes:{fixedOffset:function(a,
c,e){var g=c.breakAt;c=c.touchingSliceAt;return[["M",a.x,a.y],e.softConnector?["C",a.x+("left"===a.alignment?-5:5),a.y,2*g.x-c.x,2*g.y-c.y,g.x,g.y]:["L",g.x,g.y],["L",c.x,c.y]]},straight:function(a,c){c=c.touchingSliceAt;return[["M",a.x,a.y],["L",c.x,c.y]]},crookedLine:function(a,c,e){c=c.touchingSliceAt;var g=this.series,f=g.center[0],n=g.chart.plotWidth,r=g.chart.plotLeft;g=a.alignment;var k=this.shapeArgs.r;e=m(e.crookDistance,1);n="left"===g?f+k+(n+r-f-k)*(1-e):r+(f-k)*e;e=["L",n,a.y];f=!0;if("left"===
g?n>a.x||n<c.x:n<a.x||n>c.x)f=!1;a=[["M",a.x,a.y]];f&&a.push(e);a.push(["L",c.x,c.y]);return a}}});return w});M(a,"Series/Pie/PieSeries.js",[a["Mixins/CenteredSeries.js"],a["Series/Column/ColumnSeries.js"],a["Core/Globals.js"],a["Core/Legend/LegendSymbol.js"],a["Core/Color/Palette.js"],a["Series/Pie/PiePoint.js"],a["Core/Series/Series.js"],a["Core/Series/SeriesRegistry.js"],a["Core/Renderer/SVG/Symbols.js"],a["Core/Utilities.js"]],function(a,w,C,E,z,x,J,u,n,m){var g=this&&this.__extends||function(){var a=
function(c,e){a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(a,c){a.__proto__=c}||function(a,c){for(var e in c)c.hasOwnProperty(e)&&(a[e]=c[e])};return a(c,e)};return function(c,e){function f(){this.constructor=c}a(c,e);c.prototype=null===e?Object.create(e):(f.prototype=e.prototype,new f)}}(),c=a.getStartAndEndRadians;C=C.noop;var e=m.clamp,l=m.extend,f=m.fireEvent,r=m.merge,q=m.pick,k=m.relativeLength;m=function(a){function l(){var c=null!==a&&a.apply(this,arguments)||this;c.center=
void 0;c.data=void 0;c.maxLabelDistance=void 0;c.options=void 0;c.points=void 0;return c}g(l,a);l.prototype.animate=function(a){var c=this,e=c.points,f=c.startAngleRad;a||e.forEach(function(a){var b=a.graphic,d=a.shapeArgs;b&&d&&(b.attr({r:q(a.startR,c.center&&c.center[3]/2),start:f,end:f}),b.animate({r:d.r,start:d.start,end:d.end},c.options.animation))})};l.prototype.drawEmpty=function(){var a=this.startAngleRad,c=this.endAngleRad,e=this.options;if(0===this.total&&this.center){var f=this.center[0];
var d=this.center[1];this.graph||(this.graph=this.chart.renderer.arc(f,d,this.center[1]/2,0,a,c).addClass("highcharts-empty-series").add(this.group));this.graph.attr({d:n.arc(f,d,this.center[2]/2,0,{start:a,end:c,innerR:this.center[3]/2})});this.chart.styledMode||this.graph.attr({"stroke-width":e.borderWidth,fill:e.fillColor||"none",stroke:e.color||z.neutralColor20})}else this.graph&&(this.graph=this.graph.destroy())};l.prototype.drawPoints=function(){var a=this.chart.renderer;this.points.forEach(function(c){c.graphic&&
c.hasNewShapeType()&&(c.graphic=c.graphic.destroy());c.graphic||(c.graphic=a[c.shapeType](c.shapeArgs).add(c.series.group),c.delayedRendering=!0)})};l.prototype.generatePoints=function(){a.prototype.generatePoints.call(this);this.updateTotals()};l.prototype.getX=function(a,c,f){var h=this.center,d=this.radii?this.radii[f.index]||0:h[2]/2;a=Math.asin(e((a-h[1])/(d+f.labelDistance),-1,1));return h[0]+(c?-1:1)*Math.cos(a)*(d+f.labelDistance)+(0<f.labelDistance?(c?-1:1)*this.options.dataLabels.padding:
0)};l.prototype.hasData=function(){return!!this.processedXData.length};l.prototype.redrawPoints=function(){var a=this,c=a.chart,e=c.renderer,f=a.options.shadow,d,b,g,k;this.drawEmpty();!f||a.shadowGroup||c.styledMode||(a.shadowGroup=e.g("shadow").attr({zIndex:-1}).add(a.group));a.points.forEach(function(h){var l={};b=h.graphic;if(!h.isNull&&b){var m=void 0;k=h.shapeArgs;d=h.getTranslate();c.styledMode||(m=h.shadowGroup,f&&!m&&(m=h.shadowGroup=e.g("shadow").add(a.shadowGroup)),m&&m.attr(d),g=a.pointAttribs(h,
h.selected&&"select"));h.delayedRendering?(b.setRadialReference(a.center).attr(k).attr(d),c.styledMode||b.attr(g).attr({"stroke-linejoin":"round"}).shadow(f,m),h.delayedRendering=!1):(b.setRadialReference(a.center),c.styledMode||r(!0,l,g),r(!0,l,k,d),b.animate(l));b.attr({visibility:h.visible?"inherit":"hidden"});b.addClass(h.getClassName(),!0)}else b&&(h.graphic=b.destroy())})};l.prototype.sortByAngle=function(a,c){a.sort(function(a,e){return"undefined"!==typeof a.angle&&(e.angle-a.angle)*c})};l.prototype.translate=
function(a){this.generatePoints();var e=this.options,g=e.slicedOffset,h=g+(e.borderWidth||0),d=c(e.startAngle,e.endAngle),b=this.startAngleRad=d.start;d=(this.endAngleRad=d.end)-b;var l=this.points,m=e.dataLabels.distance;e=e.ignoreHiddenPoint;var n=l.length,r,v=0;a||(this.center=a=this.getCenter());for(r=0;r<n;r++){var u=l[r];var x=b+v*d;!u.isValid()||e&&!u.visible||(v+=u.percentage/100);var w=b+v*d;var B={x:a[0],y:a[1],r:a[2]/2,innerR:a[3]/2,start:Math.round(1E3*x)/1E3,end:Math.round(1E3*w)/1E3};
u.shapeType="arc";u.shapeArgs=B;u.labelDistance=q(u.options.dataLabels&&u.options.dataLabels.distance,m);u.labelDistance=k(u.labelDistance,B.r);this.maxLabelDistance=Math.max(this.maxLabelDistance||0,u.labelDistance);w=(w+x)/2;w>1.5*Math.PI?w-=2*Math.PI:w<-Math.PI/2&&(w+=2*Math.PI);u.slicedTranslation={translateX:Math.round(Math.cos(w)*g),translateY:Math.round(Math.sin(w)*g)};B=Math.cos(w)*a[2]/2;var z=Math.sin(w)*a[2]/2;u.tooltipPos=[a[0]+.7*B,a[1]+.7*z];u.half=w<-Math.PI/2||w>Math.PI/2?1:0;u.angle=
w;x=Math.min(h,u.labelDistance/5);u.labelPosition={natural:{x:a[0]+B+Math.cos(w)*u.labelDistance,y:a[1]+z+Math.sin(w)*u.labelDistance},"final":{},alignment:0>u.labelDistance?"center":u.half?"right":"left",connectorPosition:{breakAt:{x:a[0]+B+Math.cos(w)*x,y:a[1]+z+Math.sin(w)*x},touchingSliceAt:{x:a[0]+B,y:a[1]+z}}}}f(this,"afterTranslate")};l.prototype.updateTotals=function(){var a=this.points,c=a.length,e=this.options.ignoreHiddenPoint,f,d=0;for(f=0;f<c;f++){var b=a[f];!b.isValid()||e&&!b.visible||
(d+=b.y)}this.total=d;for(f=0;f<c;f++)b=a[f],b.percentage=0<d&&(b.visible||!e)?b.y/d*100:0,b.total=d};l.defaultOptions=r(J.defaultOptions,{center:[null,null],clip:!1,colorByPoint:!0,dataLabels:{allowOverlap:!0,connectorPadding:5,connectorShape:"fixedOffset",crookDistance:"70%",distance:30,enabled:!0,formatter:function(){return this.point.isNull?void 0:this.point.name},softConnector:!0,x:0},fillColor:void 0,ignoreHiddenPoint:!0,inactiveOtherPoints:!0,legendType:"point",marker:null,size:null,showInLegend:!1,
slicedOffset:10,stickyTracking:!1,tooltip:{followPointer:!0},borderColor:z.backgroundColor,borderWidth:1,lineWidth:void 0,states:{hover:{brightness:.1}}});return l}(J);l(m.prototype,{axisTypes:[],directTouch:!0,drawGraph:void 0,drawLegendSymbol:E.drawRectangle,drawTracker:w.prototype.drawTracker,getCenter:a.getCenter,getSymbol:C,isCartesian:!1,noSharedTooltip:!0,pointAttribs:w.prototype.pointAttribs,pointClass:x,requireSorting:!1,searchPoint:C,trackerGroups:["group","dataLabelsGroup"]});u.registerSeriesType("pie",
m);"";return m});M(a,"Series/Pie/PieDataLabel.js",[a["Core/Series/DataLabel.js"],a["Core/Globals.js"],a["Core/Color/Palette.js"],a["Core/Renderer/RendererUtilities.js"],a["Core/Series/SeriesRegistry.js"],a["Core/Utilities.js"]],function(a,w,C,E,z,x){var r=w.noop,u=E.distribute,n=z.series,m=x.arrayMax,g=x.clamp,c=x.defined,e=x.merge,l=x.pick,f=x.relativeLength,v;(function(q){function k(){var a=this,f=a.data,d=a.chart,b=a.options.dataLabels||{},g=b.connectorPadding,k=d.plotWidth,r=d.plotHeight,q=d.plotLeft,
v=Math.round(d.chartWidth/3),w=a.center,x=w[2]/2,B=w[1],z=[[],[]],D=[0,0,0,0],E=a.dataLabelPositioners,I,J,M,O,Z,A,U,N,W,X,Y,T;a.visible&&(b.enabled||a._hasPointLabels)&&(f.forEach(function(a){a.dataLabel&&a.visible&&a.dataLabel.shortened&&(a.dataLabel.attr({width:"auto"}).css({width:"auto",textOverflow:"clip"}),a.dataLabel.shortened=!1)}),n.prototype.drawDataLabels.apply(a),f.forEach(function(a){a.dataLabel&&(a.visible?(z[a.half].push(a),a.dataLabel._pos=null,!c(b.style.width)&&!c(a.options.dataLabels&&
a.options.dataLabels.style&&a.options.dataLabels.style.width)&&a.dataLabel.getBBox().width>v&&(a.dataLabel.css({width:Math.round(.7*v)+"px"}),a.dataLabel.shortened=!0)):(a.dataLabel=a.dataLabel.destroy(),a.dataLabels&&1===a.dataLabels.length&&delete a.dataLabels))}),z.forEach(function(e,f){var h=e.length,m=[],n;if(h){a.sortByAngle(e,f-.5);if(0<a.maxLabelDistance){var p=Math.max(0,B-x-a.maxLabelDistance);var t=Math.min(B+x+a.maxLabelDistance,d.plotHeight);e.forEach(function(a){0<a.labelDistance&&a.dataLabel&&
(a.top=Math.max(0,B-x-a.labelDistance),a.bottom=Math.min(B+x+a.labelDistance,d.plotHeight),n=a.dataLabel.getBBox().height||21,a.distributeBox={target:a.labelPosition.natural.y-a.top+n/2,size:n,rank:a.y},m.push(a.distributeBox))});p=t+n-p;u(m,p,p/5)}for(Y=0;Y<h;Y++){I=e[Y];A=I.labelPosition;O=I.dataLabel;X=!1===I.visible?"hidden":"inherit";W=p=A.natural.y;m&&c(I.distributeBox)&&("undefined"===typeof I.distributeBox.pos?X="hidden":(U=I.distributeBox.size,W=E.radialDistributionY(I)));delete I.positionIndex;
if(b.justify)N=E.justify(I,x,w);else switch(b.alignTo){case "connectors":N=E.alignToConnectors(e,f,k,q);break;case "plotEdges":N=E.alignToPlotEdges(O,f,k,q);break;default:N=E.radialDistributionX(a,I,W,p)}O._attr={visibility:X,align:A.alignment};T=I.options.dataLabels||{};O._pos={x:N+l(T.x,b.x)+({left:g,right:-g}[A.alignment]||0),y:W+l(T.y,b.y)-10};A.final.x=N;A.final.y=W;l(b.crop,!0)&&(Z=O.getBBox().width,p=null,N-Z<g&&1===f?(p=Math.round(Z-N+g),D[3]=Math.max(p,D[3])):N+Z>k-g&&0===f&&(p=Math.round(N+
Z-k+g),D[1]=Math.max(p,D[1])),0>W-U/2?D[0]=Math.max(Math.round(-W+U/2),D[0]):W+U/2>r&&(D[2]=Math.max(Math.round(W+U/2-r),D[2])),O.sideOverflow=p)}}}),0===m(D)||this.verifyDataLabelOverflow(D))&&(this.placeDataLabels(),this.points.forEach(function(c){T=e(b,c.options.dataLabels);if(J=l(T.connectorWidth,1)){var f;M=c.connector;if((O=c.dataLabel)&&O._pos&&c.visible&&0<c.labelDistance){X=O._attr.visibility;if(f=!M)c.connector=M=d.renderer.path().addClass("highcharts-data-label-connector highcharts-color-"+
c.colorIndex+(c.className?" "+c.className:"")).add(a.dataLabelsGroup),d.styledMode||M.attr({"stroke-width":J,stroke:T.connectorColor||c.color||C.neutralColor60});M[f?"attr":"animate"]({d:c.getConnectorPath()});M.attr("visibility",X)}else M&&(c.connector=M.destroy())}}))}function v(){this.points.forEach(function(a){var c=a.dataLabel,d;c&&a.visible&&((d=c._pos)?(c.sideOverflow&&(c._attr.width=Math.max(c.getBBox().width-c.sideOverflow,0),c.css({width:c._attr.width+"px",textOverflow:(this.options.dataLabels.style||
{}).textOverflow||"ellipsis"}),c.shortened=!0),c.attr(c._attr),c[c.moved?"animate":"attr"](d),c.moved=!0):c&&c.attr({y:-9999}));delete a.distributeBox},this)}function w(a){var c=this.center,d=this.options,b=d.center,e=d.minSize||80,k=null!==d.size;if(!k){if(null!==b[0])var l=Math.max(c[2]-Math.max(a[1],a[3]),e);else l=Math.max(c[2]-a[1]-a[3],e),c[0]+=(a[3]-a[1])/2;null!==b[1]?l=g(l,e,c[2]-Math.max(a[0],a[2])):(l=g(l,e,c[2]-a[0]-a[2]),c[1]+=(a[0]-a[2])/2);l<c[2]?(c[2]=l,c[3]=Math.min(f(d.innerSize||
0,l),l),this.translate(c),this.drawDataLabels&&this.drawDataLabels()):k=!0}return k}var x=[],z={radialDistributionY:function(a){return a.top+a.distributeBox.pos},radialDistributionX:function(a,c,d,b){return a.getX(d<c.top+2||d>c.bottom-2?b:d,c.half,c)},justify:function(a,c,d){return d[0]+(a.half?-1:1)*(c+a.labelDistance)},alignToPlotEdges:function(a,c,d,b){a=a.getBBox().width;return c?a+b:d-a-b},alignToConnectors:function(a,c,d,b){var e=0,f;a.forEach(function(a){f=a.dataLabel.getBBox().width;f>e&&
(e=f)});return c?e+b:d-e-b}};q.compose=function(c){a.compose(n);-1===x.indexOf(c)&&(x.push(c),c=c.prototype,c.dataLabelPositioners=z,c.alignDataLabel=r,c.drawDataLabels=k,c.placeDataLabels=v,c.verifyDataLabelOverflow=w)}})(v||(v={}));return v});M(a,"Extensions/OverlappingDataLabels.js",[a["Core/Chart/Chart.js"],a["Core/Utilities.js"]],function(a,w){function r(a,g){var c=!1;if(a){var e=a.newOpacity;a.oldOpacity!==e&&(a.alignAttr&&a.placed?(a[e?"removeClass":"addClass"]("highcharts-data-label-hidden"),
c=!0,a.alignAttr.opacity=e,a[a.isOld?"animate":"attr"](a.alignAttr,null,function(){g.styledMode||a.css({pointerEvents:e?"auto":"none"})}),z(g,"afterHideOverlappingLabel")):a.attr({opacity:e}));a.isOld=!0}return c}var E=w.addEvent,z=w.fireEvent,x=w.isArray,J=w.isNumber,u=w.objectEach,n=w.pick;E(a,"render",function(){var a=this,g=[];(this.labelCollectors||[]).forEach(function(a){g=g.concat(a())});(this.yAxis||[]).forEach(function(a){a.stacking&&a.options.stackLabels&&!a.options.stackLabels.allowOverlap&&
u(a.stacking.stacks,function(a){u(a,function(a){a.label&&"hidden"!==a.label.visibility&&g.push(a.label)})})});(this.series||[]).forEach(function(c){var e=c.options.dataLabels;c.visible&&(!1!==e.enabled||c._hasPointLabels)&&(e=function(c){return c.forEach(function(c){c.visible&&(x(c.dataLabels)?c.dataLabels:c.dataLabel?[c.dataLabel]:[]).forEach(function(e){var f=e.options;e.labelrank=n(f.labelrank,c.labelrank,c.shapeArgs&&c.shapeArgs.height);f.allowOverlap?(e.oldOpacity=e.opacity,e.newOpacity=1,r(e,
a)):g.push(e)})})},e(c.nodes||[]),e(c.points))});this.hideOverlappingLabels(g)});a.prototype.hideOverlappingLabels=function(a){var g=this,c=a.length,e=g.renderer,l,f,m,n=!1;var k=function(a){var c,f=a.box?0:a.padding||0,g=c=0,d;if(a&&(!a.alignAttr||a.placed)){var b=a.alignAttr||{x:a.attr("x"),y:a.attr("y")};var k=a.parentGroup;a.width||(c=a.getBBox(),a.width=c.width,a.height=c.height,c=e.fontMetrics(null,a.element).h);var l=a.width-2*f;(d={left:"0",center:"0.5",right:"1"}[a.alignValue])?g=+d*l:J(a.x)&&
Math.round(a.x)!==a.translateX&&(g=a.x-a.translateX);return{x:b.x+(k.translateX||0)+f-(g||0),y:b.y+(k.translateY||0)+f-c,width:a.width-2*f,height:a.height-2*f}}};for(f=0;f<c;f++)if(l=a[f])l.oldOpacity=l.opacity,l.newOpacity=1,l.absoluteBox=k(l);a.sort(function(a,c){return(c.labelrank||0)-(a.labelrank||0)});for(f=0;f<c;f++){var u=(k=a[f])&&k.absoluteBox;for(l=f+1;l<c;++l){var w=(m=a[l])&&m.absoluteBox;!u||!w||k===m||0===k.newOpacity||0===m.newOpacity||w.x>=u.x+u.width||w.x+w.width<=u.x||w.y>=u.y+u.height||
w.y+w.height<=u.y||((k.labelrank<m.labelrank?k:m).newOpacity=0)}}a.forEach(function(a){r(a,g)&&(n=!0)});n&&z(g,"afterHideAllOverlappingLabels")}});M(a,"Core/Responsive.js",[a["Core/Utilities.js"]],function(a){var r=a.extend,C=a.find,E=a.isArray,z=a.isObject,x=a.merge,J=a.objectEach,u=a.pick,n=a.splat,m=a.uniqueKey,g;(function(a){var c=[];a.compose=function(a){-1===c.indexOf(a)&&(c.push(a),r(a.prototype,g.prototype));return a};var g=function(){function a(){}a.prototype.currentOptions=function(a){function c(a,
f,g,k){var h;J(a,function(a,b){if(!k&&-1<e.collectionsWithUpdate.indexOf(b)&&f[b])for(a=n(a),g[b]=[],h=0;h<Math.max(a.length,f[b].length);h++)f[b][h]&&(void 0===a[h]?g[b][h]=f[b][h]:(g[b][h]={},c(a[h],f[b][h],g[b][h],k+1)));else z(a)?(g[b]=E(a)?[]:{},c(a,f[b]||{},g[b],k+1)):g[b]="undefined"===typeof f[b]?null:f[b]})}var e=this,f={};c(a,this.options,f,0);return f};a.prototype.matchResponsiveRule=function(a,c){var e=a.condition;(e.callback||function(){return this.chartWidth<=u(e.maxWidth,Number.MAX_VALUE)&&
this.chartHeight<=u(e.maxHeight,Number.MAX_VALUE)&&this.chartWidth>=u(e.minWidth,0)&&this.chartHeight>=u(e.minHeight,0)}).call(this)&&c.push(a._id)};a.prototype.setResponsive=function(a,c){var e=this,f=this.options.responsive,g=this.currentResponsive,l=[];!c&&f&&f.rules&&f.rules.forEach(function(a){"undefined"===typeof a._id&&(a._id=m());e.matchResponsiveRule(a,l)},this);c=x.apply(void 0,l.map(function(a){return C((f||{}).rules||[],function(c){return c._id===a})}).map(function(a){return a&&a.chartOptions}));
c.isResponsiveOptions=!0;l=l.toString()||void 0;l!==(g&&g.ruleIds)&&(g&&this.update(g.undoOptions,a,!0),l?(g=this.currentOptions(c),g.isResponsiveOptions=!0,this.currentResponsive={ruleIds:l,mergedOptions:c,undoOptions:g},this.update(c,a,!0)):this.currentResponsive=void 0)};return a}()})(g||(g={}));"";"";return g});M(a,"masters/highcharts.src.js",[a["Core/Globals.js"],a["Core/Utilities.js"],a["Core/DefaultOptions.js"],a["Core/Animation/Fx.js"],a["Core/Animation/AnimationUtilities.js"],a["Core/Renderer/HTML/AST.js"],
a["Core/FormatUtilities.js"],a["Core/Renderer/RendererUtilities.js"],a["Core/Renderer/SVG/SVGElement.js"],a["Core/Renderer/SVG/SVGRenderer.js"],a["Core/Renderer/HTML/HTMLElement.js"],a["Core/Renderer/HTML/HTMLRenderer.js"],a["Core/Axis/Axis.js"],a["Core/Axis/DateTimeAxis.js"],a["Core/Axis/LogarithmicAxis.js"],a["Core/Axis/PlotLineOrBand/PlotLineOrBand.js"],a["Core/Axis/Tick.js"],a["Core/Tooltip.js"],a["Core/Series/Point.js"],a["Core/Pointer.js"],a["Core/MSPointer.js"],a["Core/Legend/Legend.js"],a["Core/Chart/Chart.js"],
a["Core/Series/Series.js"],a["Core/Series/SeriesRegistry.js"],a["Series/Column/ColumnSeries.js"],a["Series/Column/ColumnDataLabel.js"],a["Series/Pie/PieSeries.js"],a["Series/Pie/PieDataLabel.js"],a["Core/Series/DataLabel.js"],a["Core/Responsive.js"],a["Core/Color/Color.js"],a["Core/Time.js"]],function(a,w,C,E,z,x,J,u,n,m,g,c,e,l,f,v,q,k,I,D,B,M,t,h,d,b,p,G,y,L,F,P,S){a.animate=z.animate;a.animObject=z.animObject;a.getDeferredAnimation=z.getDeferredAnimation;a.setAnimation=z.setAnimation;a.stop=z.stop;
a.timers=E.timers;a.AST=x;a.Axis=e;a.Chart=t;a.chart=t.chart;a.Fx=E;a.Legend=M;a.PlotLineOrBand=v;a.Point=I;a.Pointer=B.isRequired()?B:D;a.Series=h;a.SVGElement=n;a.SVGRenderer=m;a.Tick=q;a.Time=S;a.Tooltip=k;a.Color=P;a.color=P.parse;c.compose(m);g.compose(n);a.defaultOptions=C.defaultOptions;a.getOptions=C.getOptions;a.time=C.defaultTime;a.setOptions=C.setOptions;a.dateFormat=J.dateFormat;a.format=J.format;a.numberFormat=J.numberFormat;a.addEvent=w.addEvent;a.arrayMax=w.arrayMax;a.arrayMin=w.arrayMin;
a.attr=w.attr;a.clearTimeout=w.clearTimeout;a.correctFloat=w.correctFloat;a.createElement=w.createElement;a.css=w.css;a.defined=w.defined;a.destroyObjectProperties=w.destroyObjectProperties;a.discardElement=w.discardElement;a.distribute=u.distribute;a.erase=w.erase;a.error=w.error;a.extend=w.extend;a.extendClass=w.extendClass;a.find=w.find;a.fireEvent=w.fireEvent;a.getMagnitude=w.getMagnitude;a.getStyle=w.getStyle;a.inArray=w.inArray;a.isArray=w.isArray;a.isClass=w.isClass;a.isDOMElement=w.isDOMElement;
a.isFunction=w.isFunction;a.isNumber=w.isNumber;a.isObject=w.isObject;a.isString=w.isString;a.keys=w.keys;a.merge=w.merge;a.normalizeTickInterval=w.normalizeTickInterval;a.objectEach=w.objectEach;a.offset=w.offset;a.pad=w.pad;a.pick=w.pick;a.pInt=w.pInt;a.relativeLength=w.relativeLength;a.removeEvent=w.removeEvent;a.seriesType=d.seriesType;a.splat=w.splat;a.stableSort=w.stableSort;a.syncTimeout=w.syncTimeout;a.timeUnits=w.timeUnits;a.uniqueKey=w.uniqueKey;a.useSerialIds=w.useSerialIds;a.wrap=w.wrap;
p.compose(b);L.compose(h);l.compose(e);f.compose(e);y.compose(G);v.compose(e);F.compose(t);return a});a["masters/highcharts.src.js"]._modules=a;return a["masters/highcharts.src.js"]});
//# sourceMappingURL=highcharts.js.map

File diff suppressed because it is too large Load diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 208 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 262 B

File diff suppressed because it is too large Load diff

View file

@ -1,594 +0,0 @@
.clearfix {
clear: both;
}
.hidden {
visibility: hidden;
}
.container {
width: auto;
padding: 30px;
margin: auto;
}
* {
font-family: 'Source Sans Pro', sans-serif;
}
body {
margin: 0;
background-color: #15151d;
font-size: 1em;
overflow-x: hidden;
}
h3 {
text-transform: uppercase;
margin-bottom: 3px;
}
p {
margin: 0 0 1em 0;
}
a {
color: #8085e8;
text-decoration: none;
font-weight: bold;
}
a:hover {
color: #90ee7e;
}
#nav a.dump {
padding: 0px;
margin: 0px;
}
/*
==========
=== Header
==========
*/
#top {
background-color: #252530;
}
#top .container {
padding: 0;
}
#top h1 {
color: #eeeaea;
font-weight: 100;
margin: 0;
font-size: 1.5em;
}
.cell {
width: 33%;
display: inline-block;
vertical-align: middle;
}
.cell:nth-child(4) {
text-align: right;
color:#eeeaea;
font-size: 0.9em;
}
#logo {
display: block;
}
#logo img {
max-width: 200px;
width: 100%;
margin: 15px;
margin-left: 33px;
height: 32px;
}
/* Search bar */
#search-div {
color: #252530;
display: block;
margin-bottom: 20px;
border: 1px solid #252530;
}
div#search-div i {
margin: 5px;
color: #252530;
font-size: 14px;
}
input#search {
height: 18px;
font-family: "Courier New", Courier, monospace;
font-size: 0.9em;
background-color: transparent;
border: none;
outline: none;
color: #252530;
width:80%;
}
.ui-autocomplete {
max-height: 500px;
max-width: 400px;
overflow-y: auto;
overflow-x: auto;
}
.ui-menu .ui-menu-item a {
font-size:14px;
zoom:1;
font-family: "Courier New", Courier, monospace;
}
.ui-widget-content a {
color: #222222 /*{fcContent}*/;
}
/*
==============
=== END Header
==============
*/
/*
==========
=== Footer
==========
*/
#footer {
background-color: #15151d;
color: #eeeaea;
}
#footer-copy {
float: left;
font-size: 14px;
line-height: 18px;
}
#footer-social {
float: right;
}
#footer-social a {
color: #eeeaea;
font-size: 18px;
margin-left: 10px;
}
#footer-social a:hover {
color: #90ee7e;
}
#footer .container {
padding: 10px;
}
#scrollTop {
position: fixed;
bottom: 75px;
right: 50px;
background-color: #90ee7e;
padding: 10px;
border-radius: 2px;
color: white;
display: none;
}
#scrollTop:hover {
color: black;
}
/*
==============
=== END Footer
==============
*/
#reference-loading {
margin-top: 300px;
text-align: center;
}
/*
===========
=== Wrapper
===========
*/
#splashText {
display: none;
}
.nav-section h3 {
font-size: 24px;
margin-top: 0;
}
#wrapper{
background-color: #d6d1d1;
}
#wrapper .container {
padding: 0;
}
#wrapper-inner {
background-color: #ffffff;
/*border: 1px solid silver;*/
}
.tree a {
color: #252530;
}
#nav .tree, #nav .tree * {
font-family: "Courier New", Courier, monospace;
}
#nav .header p {
font-weight: normal;
color: #666;
}
#nav h1,
#details h1,
#details h2 {
font-weight: 100;
margin-bottom: 1em;
}
#nav h1,
#details h2 {
text-transform: uppercase;
}
#nav {
min-height: 100%;
border-right: 1px solid silver;
}
#nav-wrap {
width: 30%;
float:left;
overflow: auto;
}
#nav a,#nav a:visited {
font-weight: bold;
padding: 0 2px;
margin: 1px;
}
.nav-section {
padding: 30px;
position: relative;
}
.nav-section:last-child {
border-bottom: none;
}
#nav .level {
margin-left: 13px;
display: none;
}
#nav .level-0 {
display: block;
}
#nav a.level-0 {
margin-left: 1em;
}
#nav .menuitem {
position: relative;
}
#nav .value {
width: 40%;
overflow: hidden;
color: silver;
position: absolute;
white-space: nowrap;
}
#nav .value-string, #nav .value-color {
color: #39A832;
}
#nav .value-number {
color: #297EA8;
}
a.hilighted {
background-color: #C5F7BE;
}
#nav .plus {
display: block;
position: absolute;
left: -12px;
top: 0;
width: 9px;
height: 9px;
font-family: FontAwesome;
color: gray;
}
#nav .plus:before {
}
#nav .collapsed>.plus:before {
content: "\f0da";
}
#nav .expanded>.plus:before {
content: "\f0d7";
}
#nav .dots {
padding: 0 4px;
}
#nav .expanded>.dots {
display: none;
}
#nav .dots.loading {
background: url(./../images/ajax-loader.gif) no-repeat center;
}
#nav .dots.error {
color: red;
font-weight: bold;
}
#nav .dots.loading span {
visibility: hidden;
}
#nav code {
color:#8085e8;
font-weight: bold;
}
#nav span.typed {
margin-left: 15px;
}
#nav .collapsed span.typed {
margin-left: 0;
}
#nav .collapsed br.typed {
display: none;
}
#methods-and-properties-toc ul {
margin-left: 0;
padding-left: 1em;
}
#options-tree,#global-options-tree,#objects-tree {
font-size: 0.9em;
}
pre,code {
font-family: "Courier New", Courier, monospace;
}
#overview {
margin-left: 420px;
}
#details-wrap {
float: right;
width: 70%;
overflow:auto;
margin:0px;
padding:0px;
}
/* Member styling */
.member {
padding: 30px;
overflow-y: hidden;
position: relative;
border-top: 1px solid silver;
}
.member:first-child {
color:green;
}
.member.deprecated * {
color: silver !important;
}
.member.hilighted {
background-color: #eefdec;
}
.member .title, .member .title a, .member .returnType {
font-family: "Courier New", Courier, monospace;
font-size: 1.1em;
font-weight: bold;
margin-bottom: 5px;
display: inline-block;
}
.member .title a{
text-decoration: underline;
}
.member .default {
display: none;
}
.member .since {
float: right;
font-size: 0.8em;
}
.member .description {
color: #666;
}
.member .context {
padding: 1em 0;
}
.description code {
color: #666;
font-weight: normal;
}
.section {
padding-top: 25px;
}
.section .demo, .member .demo {
font-style: italic;
margin-top: 1.5em;
margin-bottom:0.5em;
margin-left: 1.5em;
}
.section .member .demo {
margin-left: 0em;
}
.section h1,
.section h2,
.section .section-description {
padding-left: 25px;
}
.section h1 {
margin: 0px;
font-family: "Courier New", Courier, monospace;
}
.section-description {
margin: 0 0 1em 0;
}
/*gert*/
.menuitem div {
margin-left: 8px;
}
.tree {
padding-left: 24px;
}
div.edit {
float: right
}
/*edit form*/
form#optionAttribute td.inp {
width: 450px;
}
form#optionAttribute td input {
width: 100%;
}
form#optionAttribute td textarea {
width: 100%;
}
form#optionAttribute td input[type="checkbox"] {
width: 20px;
}
.pencil {
background-image: url(./../images/edit.png);
}
.remove {
background-image: url(./../images/delete.gif);
}
.add {
background-image: url(./../images/add.png);
}
.copy {
background-image: url(./../images/copy.png);
}
.pencil, .add, .remove, .copy {
background-repeat: no-repeat;
background-position: center;
float: right;
position: relative;
width: 10px;
padding: 8px;
}
.pencil a,.add a,.remove a, .copy a {
text-decoration: none;
padding: 5px;
}
.deprecated, .error {
color: red;
font-weight: bold;
}
dl#inhMembers dd a,span.returnType {
margin-left: 3px;
}
/* fix for icons changing containers height, affects updateHeights, javascript function */
#footer-social i:before {
line-height: 1.5;
}
@media screen and (max-width: 767px) {
.nav-section-inner {
display: none;
}
#nav-wrap {
width: 100%;
}
#details-wrap {
width: 100%;
}
.nav-section {
padding: 0px;
}
#search-div{
margin:30px;
}
#wrapper,
#wrapper-inner,
#details-wrap {
height: auto !important;
}
.cell {
width: 48%;
text-align: center !important;
}
.cell:nth-child(1) {
width: 100%;
}
#splashText {
padding: 30px;
text-align: center;
}
#splashText.section {
border: none;
}
#splashText img {
width: 100%;
max-width: 380px;
}
#scrollTop {
display: block;
}
.section {
padding-top: 0px;
}
#logo img {
margin-left:0px;
margin-right:0px;
}
}
@media screen and (max-width: 479px) {
#footer-copy,
#footer-social {
float: none;
text-align: center;
padding: 5px 0;
}
.cell {
width: 100%;
}
.ui-autocomplete {
max-height: 300px;
max-width: 275px;
overflow-x:auto;
}

View file

@ -1,122 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, minimum-scale=1, maximum-scale=1">
<title>Highcharts API Reference</title>
<link href="css/font-awesome.css" rel="stylesheet">
<link rel="stylesheet" href="css/jquery-ui.css" />
<link rel="apple-touch-icon" sizes="57x57" href="images/apple-touch-icon-57x57.png">
<link rel="apple-touch-icon" sizes="114x114" href="images/apple-touch-icon-114x114.png">
<link rel="apple-touch-icon" sizes="72x72" href="images/apple-touch-icon-72x72.png">
<link rel="apple-touch-icon" sizes="144x144" href="images/apple-touch-icon-144x144.png">
<link rel="apple-touch-icon" sizes="60x60" href="images/apple-touch-icon-60x60.png">
<link rel="apple-touch-icon" sizes="120x120" href="images/apple-touch-icon-120x120.png">
<link rel="apple-touch-icon" sizes="76x76" href="images/apple-touch-icon-76x76.png">
<link rel="apple-touch-icon" sizes="152x152" href="images/apple-touch-icon-152x152.png">
<link rel="apple-touch-icon" sizes="180x180" href="images/apple-touch-icon-180x180.png">
<link rel="icon" type="image/png" href="images/favicon-192x192.png" sizes="192x192">
<link rel="icon" type="image/png" href="images/favicon-160x160.png" sizes="160x160">
<link rel="icon" type="image/png" href="images/favicon-96x96.png" sizes="96x96">
<link rel="icon" type="image/png" href="images/favicon-16x16.png" sizes="16x16">
<link rel="icon" type="image/png" href="images/favicon-32x32.png" sizes="32x32">
<meta name="msapplication-TileColor" content="#2b5797">
<meta name="msapplication-TileImage" content="/mstile-144x144.png">
<link href="css/ref.css" rel="stylesheet"
type="text/css" />
<script src="js/jquery.min.js"></script>
<script src="js/jquery-ui.min.js"></script>
<script type="text/javascript">
var PRODUCTNAME = 'Highcharts'.toLowerCase(),
runDB = false;
</script>
<script src="js/ref.js"
type="text/javascript"></script>
</head>
<body>
<div id="top">
<div class="container">
<div class="cell">
<a href="http://www.highcharts.com/products/highcharts" title="Highcharts Home Page" id="logo"><img
alt="Highcharts Home Page"
src="images/Highcharts.svg"
border="0"></a>
</div>
<div class="cell" style="text-align: center;">
<h1>Options Reference v.4.1.6</h1>
</div>
<div class="cell hidden-offline">See also options for <a href="/highstock">Highstock</a>, <a href="/highmaps">Highmaps</a>
</div>
<div class="clearfix"></div>
</div>
</div>
<div id="wrapper">
<div class="container">
<div id="wrapper-inner">
<div id="nav-wrap">
<div id="nav">
<div class="nav-section first">
<div class="ui-widget" id="search-div">
<div id="search-wrap">
<i class="fa fa-search"></i><input id="search"/>
</div>
</div>
<div class="nav-section-inner">
<h3 id="options-header">Configuration options</h3>
<p>For initial declarative chart setup. View as <a class="dump" href="highcharts/option/dump.json">JSON</a>.</p>
<div id="global-options-tree">
<code>Highcharts.setOptions({</code>
<div id="global-options" class="tree"></div>
<code>});</code>
</div>
<div id="options-tree">
<code>$("#container").highcharts({</code>
<div id="options" class="tree"></div>
<code>});</code>
</div>
</div>
</div>
<div class="nav-section">
<div class="nav-section-inner">
<h3>Methods and properties</h3>
<p>For dynamically modifying the chart. View as <a class="dump" href="highcharts/object/dump.json">JSON</a>. </p>
<div id="methods-and-properties-toc"></div>
<div id="objects-tree">
<div id="objects" class="tree"></div>
</div>
</div>
</div>
</div>
</div>
<div id="details-wrap">
<div id="details">
<div id="splashText" class="section">
<img src="images/splash.svg" />
</div>
</div>
</div>
<div class="clearfix"></div>
</div>
</div>
</div>
<div id="footer">
<div class="container">
<div id="footer-copy">
&copy;&nbsp;Highcharts 2013. All rights reserved.
</div>
<div id="footer-social">
<a href="https://www.facebook.com/Highcharts" title="Facebook" class="social-icon"><i class="fa fa-facebook"></i></a>
<a href="https://twitter.com/Highcharts" title="Twitter" class="social-icon"><i class="fa fa-twitter"></i></a>
<a href="http://www.linkedin.com/company/highsoft-solutions-as" title="LinkedIn" class="social-icon"><i class="fa fa-linkedin"></i></a>
<a href="https://github.com/highslide-software/highcharts.com" title="Github" class="social-icon"><i class="fa fa-github"></i></a>
</div>
<div class="clearfix"></div>
</div>
</div>
<a id="scrollTop" href="#top" style="display: none;"><i class="fa fa-arrow-up"></i></a>
</body>
</html>

View file

@ -1,54 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Warstwa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="380" height="70"
xml:space="preserve">
<g transform="translate(-25,-30)">
<g>
<path fill="#eeeaea" d="M138.475,69.712h-17.02v9.77c0,1.037-0.813,1.851-1.849,1.851c-1.037,0-1.85-0.813-1.85-1.851V57.725
c0-1.037,0.813-1.852,1.85-1.852c1.036,0,1.849,0.813,1.849,1.852v8.436h17.02v-8.436c0-1.037,0.814-1.852,1.85-1.852
c1.036,0,1.85,0.813,1.85,1.852v21.754c0,1.037-0.814,1.851-1.85,1.851c-1.036,0-1.85-0.813-1.85-1.851V69.712z"/>
<path fill="#eeeaea" d="M156.973,79.479c0,1.037-0.814,1.851-1.852,1.851s-1.852-0.813-1.852-1.851V57.725
c0-1.037,0.814-1.852,1.852-1.852s1.852,0.813,1.852,1.852V79.479z"/>
<path fill="#eeeaea" d="M184.125,70.378c0-1.036,0.814-1.774,1.852-1.774c1.034,0,1.852,0.813,1.852,1.849v5.847
c0,0.444-0.226,1.109-0.595,1.479c-2.367,2.369-5.549,3.773-9.176,3.773c-7.178,0-12.949-5.771-12.949-12.948
c0-7.181,5.771-12.949,12.949-12.949c3.627,0,6.809,1.405,9.176,3.771c0.738,0.74,0.738,1.852,0,2.592
c-0.741,0.738-1.922,0.813-2.663,0.072c-1.702-1.699-3.923-2.736-6.513-2.736c-5.104,0-9.249,4.144-9.249,9.25
c0,5.104,4.146,9.25,9.249,9.25c2.367,0,4.441-0.813,6.067-2.222V70.378z"/>
<path fill="#eeeaea" d="M218.162,69.712h-17.019v9.77c0,1.037-0.817,1.851-1.852,1.851c-1.037,0-1.849-0.813-1.849-1.851V57.725
c0-1.037,0.812-1.852,1.849-1.852c1.034,0,1.852,0.813,1.852,1.852v8.436h17.019v-8.436c0-1.037,0.813-1.852,1.849-1.852
c1.037,0,1.852,0.813,1.852,1.852v21.754c0,1.037-0.813,1.851-1.852,1.851c-1.033,0-1.849-0.813-1.849-1.851V69.712z"/>
<path fill="#eeeaea" d="M242.948,81.552c-7.182,0-12.949-5.771-12.949-12.948c0-7.181,5.77-12.949,12.949-12.949
c3.627,0,6.809,1.405,9.176,3.771c0.738,0.74,0.738,1.852,0,2.592c-0.741,0.738-1.925,0.813-2.666,0.072
c-1.699-1.699-3.92-2.736-6.51-2.736c-5.106,0-9.249,4.144-9.249,9.25c0,5.104,4.143,9.25,9.249,9.25
c2.59,0,4.884-0.962,6.586-2.664c0.74-0.741,1.849-0.741,2.59,0c0.738,0.738,0.738,1.85,0,2.589
C249.756,80.146,246.574,81.552,242.948,81.552z"/>
<path fill="#eeeaea" d="M281.569,69.712h-17.02v9.77c0,1.037-0.813,1.851-1.852,1.851c-1.034,0-1.85-0.813-1.85-1.851V57.725
c0-1.037,0.813-1.852,1.85-1.852c1.035,0,1.852,0.813,1.852,1.852v8.436h17.02v-8.436c0-1.037,0.813-1.852,1.853-1.852
c1.034,0,1.849,0.813,1.849,1.852v21.754c0,1.037-0.813,1.851-1.849,1.851c-1.037,0-1.853-0.813-1.853-1.851V69.712z"/>
<path fill="#eeeaea" d="M308.758,57.503l10.507,20.646c0.223,0.443,0.445,1.036,0.445,1.554c0,1.036-0.668,1.628-1.702,1.628
c-0.741,0-1.481-0.222-2.001-1.258l-3.253-6.438h-13.547l-3.183,6.438c-0.517,1.036-1.256,1.258-1.994,1.258
c-1.037,0-1.702-0.593-1.702-1.628c0-0.519,0.22-1.109,0.442-1.554l10.506-20.646c0.668-1.405,2.002-1.628,2.74-1.628
C306.76,55.875,308.09,56.096,308.758,57.503z M300.985,70.083h9.988l-4.957-9.99L300.985,70.083z"/>
<path fill="#eeeaea" d="M340.159,56.023c4.441,0,8.064,3.255,8.064,7.694c0,3.923-2.813,6.884-6.511,7.549l6.731,7.104
c0.664,0.666,0.889,1.85,0.146,2.516c-0.736,0.741-2.145,0.521-2.886-0.296l-8.729-9.176h-6.511v8.142
c0,1.034-0.815,1.774-1.854,1.774c-1.033,0-1.85-0.813-1.85-1.851V57.873c0-1.035,0.814-1.85,1.85-1.85H340.159z M330.468,59.575
v8.288h9.691c2.59,0,4.367-1.776,4.367-4.146c0-2.365-1.777-4.144-4.367-4.144L330.468,59.575L330.468,59.575z"/>
<path fill="#eeeaea" d="M365.047,59.575h-9.249c-1.033,0-1.849-0.74-1.849-1.776c0-1.034,0.813-1.773,1.849-1.773h22.201
c1.037,0,1.852,0.74,1.852,1.773c0,1.037-0.813,1.776-1.852,1.776h-9.249V79.48c0,1.037-0.813,1.851-1.849,1.851
c-1.037,0-1.854-0.813-1.854-1.851V59.575z"/>
<path fill="#eeeaea" d="M388.724,66.013c0-9.25,5.698-10.359,9.99-10.359c1.035,0,1.85,0.813,1.85,1.85
c0,1.036-0.813,1.851-1.85,1.851c-3.479,0-6.29,0.738-6.29,6.66v5.18c0,9.25-5.698,10.358-9.989,10.358
c-1.035,0-1.85-0.813-1.85-1.85s0.814-1.85,1.85-1.85c3.479,0,6.289-0.74,6.289-6.66V66.013z"/>
</g>
<polygon fill="#8087E8" points="67.981,30.52 56.757,56.73 42.009,91.171 76.301,76.685 94.465,69.013 "/>
<polygon fill="#30426B" points="73.7,62.25 76.302,76.685 94.466,69.013 "/>
<polygon fill="#6699A1" points="67.981,30.52 73.7,62.251 94.465,69.013 "/>
<polygon fill="#78758C" points="73.7,62.25 94.466,69.013 56.758,56.729 42.009,91.171 76.302,76.685 "/>
<polygon fill="#A3EDBA" points="42.009,91.171 56.757,56.73 26.442,46.855 "/>
<polygon fill="#6699A1" points="76.302,76.685 79.628,95.13 94.466,69.013 "/>
<polygon fill="#8087E8" points="67.981,30.52 56.757,56.73 73.7,62.251 "/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

View file

@ -1,43 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="256" width="1020" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
<metadata>
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
<dc:title/>
</cc:Work>
</rdf:RDF>
</metadata>
<g transform="translate(0,-796.36218)">
<g transform="matrix(1.6460977,0,0,1.6460984,-8.1132563,652.37875)">
<g style="letter-spacing:0px;word-spacing:0px;" font-weight="normal" font-size="68.34341431px" font-style="normal" font-stretch="normal" line-height="125%" font-variant="normal" font-family="Reenie Beanie" fill="#8085e8">
<path d="m39.2,174c-0.00003,2.05-0.365,3.66-1.09,4.82-0.729,1.16-1.8,2.24-3.21,3.25-0.364,0.228-0.865,0.502-1.5,0.821-0.638,0.319-1.34,0.615-2.12,0.888-0.775,0.273-1.59,0.501-2.46,0.683-0.866,0.182-1.66,0.273-2.39,0.273-2.05,0-3.6-0.216-4.65-0.649-1.05-0.432-1.57-0.945-1.57-1.54-0.000011-0.638,0.182-1.16,0.546-1.57s0.683-0.638,0.957-0.684l0.753,0.546c0.227,0.228,0.545,0.468,0.955,0.719s1.07,0.376,1.98,0.376c0.865,0.00001,1.91-0.148,3.14-0.444s2.4-0.752,3.52-1.37c1.12-0.615,2.07-1.38,2.87-2.29,0.797-0.911,1.2-1.96,1.2-3.14-0.000027-1.05-0.786-2.01-2.36-2.9-1.57-0.888-4.04-1.49-7.42-1.81-1.73-0.136-3.44-0.352-5.13-0.649-1.69-0.296-3.2-0.706-4.54-1.23s-2.43-1.18-3.25-1.98c-0.82-0.797-1.23-1.79-1.23-2.97-0.000004-1.14,0.319-2.23,0.957-3.28s1.42-2.02,2.36-2.9c0.934-0.888,1.9-1.67,2.9-2.36,1-0.683,1.85-1.25,2.53-1.71,0.546-0.318,1.31-0.74,2.29-1.26,0.98-0.524,2.03-1.03,3.14-1.5,1.12-0.478,2.23-0.888,3.35-1.23,1.12-0.341,2.06-0.512,2.84-0.512,0.912,0.00004,1.53,0.251,1.85,0.752,0.318,0.501,0.478,1.21,0.478,2.12-0.000026,0.775-0.0911,1.59-0.273,2.46-0.182,0.866-0.387,1.71-0.615,2.53s-0.444,1.54-0.649,2.15c-0.204,0.615-0.353,1.01-0.444,1.2-0.182,0.41-0.387,0.683-0.615,0.82-0.228,0.136-0.387,0.204-0.478,0.204-0.182,0.00002-0.273-0.114-0.273-0.342-0.000022-0.136,0.034-0.398,0.102-0.785,0.0681-0.387,0.159-0.854,0.273-1.4,0.114-0.547,0.205-1.14,0.273-1.78,0.0681-0.637,0.102-1.28,0.102-1.91-0.000023-1-0.0456-1.73-0.137-2.19-0.0911-0.455-0.456-0.683-1.09-0.683-0.637,0.00004-1.5,0.171-2.6,0.512-1.09,0.341-2.21,0.763-3.35,1.26-1.23,0.546-2.42,1.25-3.59,2.12-1.16,0.866-2.2,1.75-3.11,2.67-0.911,0.911-1.65,1.79-2.22,2.63-0.569,0.843-0.854,1.51-0.854,2.02-0.000006,0.546,0.376,1.06,1.13,1.54,0.752,0.478,1.71,0.9,2.87,1.26,1.16,0.365,2.45,0.684,3.86,0.957s2.8,0.478,4.17,0.614c1.14,0.136,2.39,0.318,3.76,0.546s2.64,0.593,3.83,1.09c1.18,0.501,2.19,1.17,3.01,2.02,0.82,0.843,1.23,1.93,1.23,3.25z"/>
<path d="m61.9,177c0.0459,0.0918,0.0688,0.229,0.0688,0.411-0.000022,0.274-0.205,0.684-0.615,1.23-0.136,0.182-0.432,0.478-0.888,0.888s-1.07,0.82-1.85,1.23c-0.774,0.41-1.72,0.774-2.84,1.09-1.12,0.318-2.43,0.478-3.93,0.478-1.05,0-2.07-0.239-3.07-0.717s-1.89-1.18-2.67-2.12c-0.774-0.934-1.41-2.1-1.91-3.49-0.501-1.39-0.752-3.02-0.752-4.89-0.000003-1.78,0.228-3.44,0.683-4.99s1.04-2.92,1.74-4.1c0.706-1.18,1.49-2.12,2.36-2.8,0.866-0.683,1.71-1.03,2.53-1.03,0.729,0.00003,1.47,0.148,2.22,0.444,0.752,0.296,1.44,0.672,2.05,1.13,0.615,0.456,1.1,0.969,1.47,1.54,0.365,0.569,0.547,1.15,0.547,1.74-0.000017,0.683-0.308,1.39-0.923,2.12-0.615,0.729-1.36,1.4-2.22,2.02-0.866,0.615-1.73,1.12-2.6,1.5-0.866,0.387-1.55,0.581-2.05,0.581-0.273,0.00001-0.511-0.125-0.716-0.376s-0.308-0.559-0.308-0.923c-0.000008-0.638,0.285-1.14,0.854-1.5,0.569-0.364,1.2-0.695,1.88-0.991,0.683-0.296,1.31-0.649,1.88-1.06,0.569-0.41,0.854-0.98,0.854-1.71-0.000013-0.0918-0.114-0.32-0.342-0.684s-0.843-0.546-1.85-0.546c-0.455,0.00002-0.978,0.262-1.57,0.786s-1.16,1.23-1.71,2.12c-0.547,0.889-1,1.94-1.37,3.14-0.364,1.21-0.546,2.52-0.546,3.93-0.000006,1.18,0.217,2.26,0.65,3.21,0.433,0.957,0.991,1.77,1.67,2.43,0.683,0.661,1.48,1.17,2.39,1.54,0.911,0.364,1.85,0.546,2.8,0.546,0.683,0,1.42-0.148,2.22-0.444,0.797-0.296,1.55-0.615,2.26-0.957,0.706-0.342,1.32-0.661,1.84-0.957,0.523-0.296,0.854-0.444,0.992-0.444,0.136,0.00001,0.284,0.0685,0.443,0.205,0.159,0.137,0.262,0.274,0.308,0.41z"/>
<path d="m99.3,170c-0.000036,0.82-0.376,1.83-1.13,3.04-0.752,1.21-1.77,2.38-3.04,3.52-1.28,1.14-2.76,2.11-4.44,2.9-1.69,0.797-3.44,1.2-5.26,1.2-0.82,0.00001-1.69-0.137-2.6-0.41-0.911-0.273-1.8-0.672-2.67-1.2-0.866-0.524-1.64-1.16-2.32-1.91-0.683-0.752-1.19-1.61-1.5-2.56-0.273,0.273-0.602,0.728-0.99,1.37-0.387,0.638-0.809,1.29-1.26,1.95-0.456,0.66-0.957,1.23-1.5,1.71-0.546,0.478-1.12,0.717-1.71,0.717-0.592,0.00001-1.08-0.308-1.47-0.923-0.387-0.615-0.695-1.3-0.923-2.05-0.228-0.752-0.388-1.47-0.479-2.15-0.0911-0.683-0.137-1.07-0.137-1.16-0.000003-0.548,0.16-1.58,0.479-3.11s0.797-3.11,1.43-4.75c0.638-1.64,1.45-3.1,2.43-4.37,0.98-1.28,2.13-1.91,3.45-1.91,0.501,0.00003,0.831,0.216,0.991,0.649,0.16,0.432,0.24,0.854,0.24,1.26v2.05c0.227,0.182,0.465,0.308,0.716,0.376,0.251,0.0688,0.479,0.16,0.684,0.273s0.365,0.284,0.479,0.512,0.171,0.592,0.171,1.09c-0.000015,0.32-0.023,0.605-0.0688,0.855-0.0459,0.25-0.0688,0.489-0.0688,0.717-0.000015,1.18,0.0911,2.35,0.273,3.49s0.547,2.15,1.09,3.04c0.547,0.888,1.3,1.62,2.26,2.19,0.957,0.57,2.23,0.855,3.83,0.855,2.01,0.00001,3.7-0.422,5.09-1.26,1.39-0.843,2.55-1.78,3.49-2.8,0.934-1.02,1.67-1.96,2.22-2.8,0.546-0.843,1-1.26,1.37-1.26,0.592,0.00002,0.888,0.296,0.888,0.888zm-24-3.01c-0.000011-0.182-0.0456-0.353-0.137-0.512-0.0911-0.159-0.137-0.307-0.137-0.443-0.000011-0.182,0.0455-0.342,0.137-0.479,0.0911-0.137,0.137-0.319,0.137-0.547-0.000011-0.136-0.0456-0.238-0.137-0.307-0.0911-0.0681-0.137-0.148-0.137-0.24-0.41,0.0918-0.832,0.479-1.26,1.16-0.433,0.683-0.843,1.48-1.23,2.39-0.387,0.911-0.695,1.83-0.922,2.77-0.227,0.934-0.341,1.7-0.341,2.29-0.000008,0.318,0.0911,0.842,0.273,1.57,0.182,0.729,0.387,1.21,0.615,1.44,0.774-1.59,1.49-3.14,2.15-4.65,0.66-1.5,0.991-2.98,0.991-4.44z"/>
<path d="m116,163c-0.00001,0.318-0.137,0.58-0.41,0.785s-0.592,0.376-0.957,0.513-0.73,0.24-1.09,0.308c-0.364,0.0682-0.66,0.102-0.888,0.102-0.683,0.00002-1.14-0.0455-1.37-0.137-0.228-0.091-0.41-0.137-0.546-0.137-1.14,0.00002-2.05,0.0911-2.73,0.273-0.683,0.182-1.22,0.478-1.61,0.888-0.387,0.41-0.638,0.923-0.752,1.54-0.114,0.615-0.171,1.36-0.171,2.22-0.00001,1.46,0.057,2.62,0.171,3.49,0.114,0.866,0.228,1.57,0.341,2.12,0.113,0.546,0.227,0.968,0.341,1.26,0.114,0.296,0.171,0.581,0.171,0.855-0.00001,0.364-0.194,0.752-0.581,1.16-0.387,0.41-0.74,0.615-1.06,0.615-0.546,0-1.04-0.49-1.47-1.47-0.433-0.98-0.798-2.14-1.09-3.49-0.296-1.34-0.535-2.68-0.717-4s-0.273-2.32-0.273-3.01c0-0.776,0.0681-1.52,0.204-2.22,0.136-0.706,0.318-1.32,0.546-1.84,0.228-0.524,0.479-0.946,0.752-1.26,0.273-0.319,0.547-0.479,0.821-0.479,0.228,0.00003,0.41,0.08,0.546,0.24s0.25,0.342,0.341,0.547c0.0911,0.205,0.194,0.387,0.308,0.546s0.262,0.239,0.444,0.239c0.41,0.00003,1.07-0.205,1.98-0.615,0.911-0.41,2.03-0.615,3.35-0.615,1.23,0.00002,2.15,0.0341,2.77,0.102,0.615,0.0682,1.22,0.216,1.81,0.444,0.136,0.0459,0.307,0.148,0.512,0.308,0.205,0.159,0.308,0.399,0.308,0.719z"/>
<path d="m141,172c-0.00002,0.456-0.0685,0.923-0.205,1.4-0.137,0.478-0.274,0.877-0.41,1.2-0.0918,0.138-0.513,0.605-1.26,1.4-0.752,0.797-1.69,1.63-2.8,2.49-1.12,0.866-2.37,1.65-3.76,2.36-1.39,0.706-2.72,1.06-4,1.06-0.774,0-1.56-0.137-2.36-0.411-0.797-0.274-1.54-0.718-2.22-1.33-0.683-0.615-1.24-1.38-1.67-2.29-0.432-0.911-0.649-2.03-0.649-3.35,0-2.19,0.364-4.17,1.09-5.95,0.729-1.78,1.46-3.19,2.19-4.24,0.32-0.501,0.741-1.01,1.26-1.54,0.524-0.524,1.04-1,1.54-1.43,0.501-0.432,0.968-0.786,1.4-1.06,0.433-0.274,0.741-0.411,0.923-0.411,0.41,0.00002,0.786,0.114,1.13,0.342,0.341,0.228,0.512,0.456,0.512,0.684-0.00001,0.364-0.102,0.672-0.307,0.922-0.204,0.25-0.489,0.524-0.854,0.82s-0.798,0.684-1.3,1.16c-0.501,0.479-1.03,1.11-1.57,1.88-1.09,1.5-1.9,3.04-2.43,4.61-0.524,1.57-0.786,2.95-0.786,4.13s0.444,2.13,1.33,2.84c0.888,0.706,1.81,1.06,2.77,1.06,1.73,0,3.27-0.387,4.61-1.16,1.34-0.774,2.5-1.64,3.45-2.6,0.957-0.957,1.73-1.82,2.32-2.6,0.592-0.774,1.02-1.16,1.3-1.16,0.502,0.00001,0.753,0.387,0.753,1.16z"/>
<path d="m169,171c0.228,0.228,0.342,0.365,0.342,0.411-0.00003,0.0904-0.125,0.363-0.375,0.819-0.25,0.455-0.581,0.934-0.991,1.43-0.41,0.501-0.854,0.946-1.33,1.33-0.478,0.387-0.946,0.581-1.4,0.581-0.957,0.00001-1.73-0.194-2.32-0.581-0.592-0.387-1.08-0.877-1.47-1.47-0.387-0.592-0.683-1.24-0.888-1.95-0.205-0.706-0.376-1.38-0.512-2.02-0.0918-0.32-0.183-0.48-0.273-0.48-0.138,0.00002-0.411,0.49-0.821,1.47s-0.853,2.05-1.33,3.21c-0.478,1.16-0.934,2.23-1.37,3.21-0.433,0.98-0.718,1.47-0.854,1.47-0.82,0.00001-1.52-0.353-2.08-1.06-0.569-0.706-1.03-1.53-1.37-2.46-0.342-0.934-0.604-1.89-0.786-2.87s-0.296-1.74-0.342-2.29c-0.136-1.23-0.432-3.28-0.887-6.15s-0.843-6.36-1.16-10.5c-0.0904-0.865-0.193-1.65-0.307-2.36-0.114-0.706-0.24-1.49-0.376-2.36-0.137-0.866-0.251-1.85-0.342-2.94-0.0911-1.09-0.137-2.44-0.137-4.03,0-0.0903,0.0229-0.386,0.0688-0.887s0.114-1.05,0.205-1.64c0.0911-0.592,0.239-1.12,0.444-1.57,0.205-0.456,0.444-0.684,0.716-0.684,0.32,0.00005,0.616,0.194,0.89,0.581,0.273,0.387,0.512,0.832,0.717,1.33,0.205,0.501,0.353,0.98,0.444,1.44,0.0911,0.456,0.137,0.775,0.137,0.957-0.00001,0.683-0.0455,1.32-0.137,1.91-0.0911,0.592-0.137,1.14-0.137,1.64,0,0.683,0.057,1.55,0.171,2.6s0.262,2.12,0.444,3.21,0.341,2.15,0.478,3.18c0.136,1.03,0.25,1.86,0.342,2.5-0.00001,0.0445,0.0455,0.363,0.137,0.955,0.0911,0.592,0.194,1.33,0.308,2.22,0.114,0.889,0.228,1.85,0.342,2.87,0.114,1.03,0.239,2.03,0.375,3.01s0.261,1.85,0.375,2.6c0.114,0.752,0.194,1.29,0.24,1.61-0.00001,0.136,0.0341,0.33,0.102,0.58,0.0681,0.25,0.136,0.535,0.204,0.854,0.0681,0.319,0.148,0.615,0.24,0.888,0.0918,0.273,0.206,0.479,0.342,0.616,0.273-0.546,0.625-1.39,1.06-2.53,0.433-1.14,0.889-2.3,1.37-3.49,0.478-1.18,0.934-2.22,1.37-3.11,0.433-0.888,0.809-1.33,1.13-1.33,0.364,0.00002,0.66,0.0685,0.888,0.205,0.228,0.137,0.524,0.251,0.888,0.341,0.456,0.182,0.684,0.421,0.684,0.717-0.00002,0.296,0.0452,0.649,0.136,1.06,0.0918,0.548,0.24,1.27,0.445,2.15,0.205,0.889,0.444,1.75,0.717,2.6,0.273,0.843,0.592,1.56,0.956,2.15,0.364,0.592,0.729,0.889,1.09,0.888,0.182,0.00001,0.433-0.239,0.752-0.717s0.752-0.74,1.3-0.786c0.0917,0.00001,0.252,0.057,0.48,0.171s0.455,0.262,0.682,0.444z"/>
<path d="m224,135c0.0459,0.0918,0.0688,0.252,0.0688,0.48-0.00003,0.228-0.00003,0.478,0,0.751-0.00003,0.32-0.114,0.48-0.342,0.48-0.0918,0.00005-0.206-0.0229-0.342-0.0688-0.136-0.0458-0.25-0.0917-0.342-0.138-0.82-0.364-1.81-0.831-2.97-1.4s-2.47-0.854-3.93-0.854c-1.64,0.00005-2.96,0.615-3.96,1.84-1,1.23-1.77,2.65-2.29,4.27-0.524,1.62-0.866,3.2-1.03,4.75-0.159,1.55-0.239,2.67-0.239,3.35-0.00001,0.501,0.0796,1.29,0.239,2.36s0.376,2.18,0.65,3.32,0.593,2.18,0.957,3.11c0.364,0.934,0.729,1.51,1.09,1.74,0.274,0.00002,0.764-0.0229,1.47-0.0688s1.29-0.0688,1.74-0.0688c0.774,0.00003,1.5,0.0685,2.19,0.205,0.683,0.137,1.39,0.205,2.12,0.205,0.182,0.00003,0.455,0.00003,0.82,0,0.364,0.00003,0.74,0.023,1.13,0.0688,0.387,0.0459,0.717,0.126,0.991,0.239,0.273,0.113,0.41,0.261,0.41,0.443-0.00002,0.228-0.16,0.433-0.479,0.615s-0.683,0.33-1.09,0.444c-0.41,0.114-0.819,0.194-1.23,0.24-0.41,0.0459-0.729,0.0688-0.957,0.0688-0.228,0.00002-0.524-0.0114-0.888-0.0344-0.364-0.0229-0.763-0.0573-1.2-0.103-0.433-0.0459-0.843-0.0799-1.23-0.102-0.387-0.0222-0.717-0.0333-0.99-0.0334-0.73,0.00002-1.17,0.0796-1.33,0.239-0.159,0.159-0.239,0.467-0.239,0.923-0.00001,0.683,0.308,1.6,0.923,2.77,0.615,1.16,1.29,2.4,2.02,3.73,0.729,1.32,1.4,2.69,2.02,4.1,0.615,1.41,0.923,2.71,0.923,3.9-0.00002,0.227-0.057,0.648-0.171,1.26-0.114,0.615-0.274,1.24-0.479,1.88-0.205,0.638-0.49,1.21-0.854,1.71-0.364,0.501-0.774,0.752-1.23,0.752-0.364,0.00001-0.695-0.103-0.991-0.308s-0.444-0.559-0.444-1.06c-0.00001-0.729,0.194-1.41,0.581-2.05,0.387-0.638,0.581-1.32,0.581-2.05-0.00001-0.364-0.171-0.979-0.512-1.84-0.341-0.866-0.763-1.83-1.26-2.9-0.501-1.07-1.05-2.2-1.64-3.38-0.592-1.18-1.15-2.27-1.67-3.25-0.524-0.98-0.968-1.79-1.33-2.43-0.364-0.638-0.569-0.98-0.615-1.03-0.911,0.32-1.84,0.639-2.8,0.958-0.957,0.319-1.82,0.797-2.6,1.43-0.318,0.32-0.615,0.48-0.888,0.48-0.455,0.00002-0.876-0.182-1.26-0.547-0.387-0.365-0.581-0.775-0.581-1.23,0-0.502,0.148-0.901,0.444-1.2,0.296-0.296,0.581-0.512,0.853-0.649,0.41-0.228,1.05-0.479,1.91-0.752,0.866-0.273,1.73-0.501,2.6-0.683,0.318-0.0917,0.615-0.172,0.888-0.24,0.274-0.0681,0.411-0.216,0.411-0.444-0.138-0.455-0.332-1.06-0.582-1.81-0.25-0.752-0.501-1.65-0.752-2.7s-0.468-2.22-0.65-3.52-0.273-2.7-0.273-4.2c-0.00001-1.64,0.194-3.37,0.581-5.19s1-3.5,1.85-5.02c0.843-1.53,1.9-2.78,3.18-3.76s2.8-1.47,4.58-1.47c0.819,0.00005,1.73,0.08,2.73,0.24s1.93,0.388,2.77,0.684c0.843,0.296,1.55,0.661,2.12,1.09,0.569,0.432,0.854,0.922,0.854,1.47z"/>
<path d="m240,169c-0.00002,1-0.137,1.96-0.41,2.87-0.273,0.911-0.638,1.71-1.09,2.39-0.455,0.683-0.991,1.22-1.61,1.61-0.615,0.387-1.29,0.581-2.02,0.581-1.28,0-2.28-0.365-3.01-1.09-0.729-0.729-1.29-1.57-1.67-2.53-0.388-0.957-0.639-1.92-0.752-2.9s-0.17-1.72-0.17-2.22c0-0.82,0.125-1.74,0.375-2.77s0.592-1.97,1.03-2.84c0.433-0.866,0.923-1.59,1.47-2.19,0.546-0.592,1.12-0.888,1.71-0.888,0.136,0.00003,0.352,0.0456,0.649,0.137,0.296,0.0911,0.604,0.228,0.923,0.41s0.604,0.41,0.855,0.683,0.422,0.593,0.512,0.958c0.502,0.0445,1,0.226,1.5,0.545,0.501,0.319,0.774,0.57,0.82,0.752,0.364,1.18,0.603,2.37,0.717,3.55s0.171,2.16,0.171,2.94zm-3.07-1.23c-0.00001-0.683-0.0685-1.4-0.205-2.15-0.137-0.752-0.411-1.52-0.821-2.29-0.0904,0.0459-0.204,0.0688-0.342,0.0688-0.182,0.00002-0.33-0.0226-0.444-0.0678s-0.216-0.0678-0.307-0.0678c-0.546,0.00002-0.979,0.148-1.3,0.444-0.319,0.296-0.559,0.683-0.719,1.16-0.16,0.478-0.262,0.991-0.308,1.54-0.0452,0.546-0.0678,1.07-0.0678,1.57,0,0.501,0.0226,1.06,0.0678,1.67,0.0452,0.615,0.148,1.2,0.308,1.74,0.16,0.546,0.376,1.01,0.65,1.4,0.273,0.387,0.638,0.581,1.09,0.581,0.455,0.00001,0.842-0.239,1.16-0.717,0.319-0.478,0.57-1.04,0.752-1.67,0.182-0.638,0.308-1.26,0.376-1.88,0.0688-0.615,0.103-1.06,0.103-1.33z"/>
<path d="m263,163c-0.00002,0.318-0.137,0.58-0.41,0.785s-0.592,0.376-0.957,0.513-0.73,0.24-1.09,0.308c-0.364,0.0682-0.66,0.102-0.888,0.102-0.683,0.00002-1.14-0.0455-1.37-0.137-0.228-0.091-0.41-0.137-0.546-0.137-1.14,0.00002-2.05,0.0911-2.73,0.273-0.683,0.182-1.22,0.478-1.61,0.888-0.387,0.41-0.638,0.923-0.752,1.54-0.114,0.615-0.171,1.36-0.171,2.22,0,1.46,0.057,2.62,0.171,3.49,0.114,0.866,0.228,1.57,0.341,2.12,0.113,0.546,0.227,0.968,0.341,1.26,0.114,0.296,0.171,0.581,0.171,0.855-0.00001,0.364-0.194,0.752-0.581,1.16-0.387,0.41-0.74,0.615-1.06,0.615-0.546,0-1.04-0.49-1.47-1.47-0.433-0.98-0.798-2.14-1.09-3.49-0.296-1.34-0.535-2.68-0.717-4s-0.273-2.32-0.273-3.01c-0.00001-0.776,0.0681-1.52,0.204-2.22,0.136-0.706,0.318-1.32,0.546-1.84,0.228-0.524,0.479-0.946,0.752-1.26,0.273-0.319,0.547-0.479,0.821-0.479,0.228,0.00003,0.41,0.08,0.546,0.24s0.25,0.342,0.341,0.547c0.0911,0.205,0.194,0.387,0.308,0.546s0.262,0.239,0.444,0.239c0.41,0.00003,1.07-0.205,1.98-0.615,0.911-0.41,2.03-0.615,3.35-0.615,1.23,0.00002,2.15,0.0341,2.77,0.102,0.615,0.0682,1.22,0.216,1.81,0.444,0.136,0.0459,0.307,0.148,0.512,0.308,0.205,0.159,0.308,0.399,0.308,0.719z"/>
<path d="m309,169c-0.00001,1-0.137,1.96-0.41,2.87-0.273,0.911-0.638,1.71-1.09,2.39-0.455,0.683-0.991,1.22-1.61,1.61-0.615,0.387-1.29,0.581-2.02,0.581-1.28,0-2.28-0.365-3.01-1.09-0.729-0.729-1.29-1.57-1.67-2.53-0.388-0.957-0.639-1.92-0.752-2.9s-0.17-1.72-0.17-2.22c-0.00001-0.82,0.125-1.74,0.375-2.77s0.592-1.97,1.03-2.84c0.433-0.866,0.923-1.59,1.47-2.19,0.546-0.592,1.12-0.888,1.71-0.888,0.136,0.00003,0.352,0.0456,0.649,0.137,0.296,0.0911,0.604,0.228,0.923,0.41s0.604,0.41,0.855,0.683,0.422,0.593,0.512,0.958c0.502,0.0445,1,0.226,1.5,0.545,0.501,0.319,0.774,0.57,0.82,0.752,0.364,1.18,0.603,2.37,0.717,3.55s0.171,2.16,0.171,2.94zm-3.07-1.23c-0.00001-0.683-0.0685-1.4-0.205-2.15-0.137-0.752-0.411-1.52-0.821-2.29-0.0904,0.0459-0.204,0.0688-0.342,0.0688-0.182,0.00002-0.33-0.0226-0.444-0.0678s-0.216-0.0678-0.307-0.0678c-0.546,0.00002-0.979,0.148-1.3,0.444-0.319,0.296-0.559,0.683-0.719,1.16-0.16,0.478-0.262,0.991-0.308,1.54-0.0452,0.546-0.0678,1.07-0.0678,1.57-0.00001,0.501,0.0226,1.06,0.0678,1.67,0.0452,0.615,0.148,1.2,0.308,1.74,0.16,0.546,0.376,1.01,0.65,1.4,0.273,0.387,0.638,0.581,1.09,0.581,0.455,0.00001,0.842-0.239,1.16-0.717,0.319-0.478,0.57-1.04,0.752-1.67,0.182-0.638,0.308-1.26,0.376-1.88,0.0688-0.615,0.103-1.06,0.103-1.33z"/>
<path d="m338,164c-0.00002,1.18-0.33,2.32-0.991,3.42-0.66,1.09-1.47,2.11-2.43,3.04-0.957,0.934-2,1.8-3.14,2.6-1.14,0.797-2.19,1.49-3.14,2.08-0.911,0.638-1.66,1.16-2.25,1.57-0.592,0.41-0.889,0.729-0.888,0.957-0.00001,0.592,0.0681,1.42,0.204,2.49s0.307,2.23,0.512,3.49c0.205,1.25,0.41,2.54,0.615,3.86s0.354,2.53,0.445,3.62c-0.00002,0.0459,0.034,0.251,0.102,0.615,0.0681,0.364,0.159,0.774,0.273,1.23,0.114,0.455,0.205,0.877,0.273,1.26,0.0681,0.387,0.102,0.627,0.102,0.719-0.00001,0.318-0.0111,0.671-0.0334,1.06-0.0223,0.387-0.0904,0.752-0.204,1.09-0.114,0.342-0.285,0.627-0.513,0.855s-0.524,0.342-0.888,0.342c-0.502-0.00001-0.867-0.217-1.09-0.65-0.227-0.433-0.341-0.855-0.341-1.26-0.00001-0.0904,0.0111-0.181,0.0334-0.273,0.0222-0.0918,0.0333-0.206,0.0334-0.342-0.00002-0.501-0.182-1.84-0.546-4.03s-0.774-4.8-1.23-7.83c-0.455-3.03-0.865-6.29-1.23-9.77-0.364-3.49-0.546-6.78-0.546-9.88-0.00001-0.228,0.0226-0.49,0.0678-0.786s0.0678-0.558,0.0678-0.786c-0.456,0.0459-1.13,0.251-2.02,0.616-0.888,0.365-1.77,0.809-2.63,1.33-0.866,0.524-1.63,1.07-2.29,1.64-0.66,0.569-0.991,1.08-0.991,1.54h-0.478c-0.138,0.00002-0.309-0.0911-0.514-0.273s-0.387-0.387-0.546-0.615-0.307-0.456-0.444-0.683-0.205-0.387-0.205-0.479c0.00001-0.957,0.57-1.86,1.71-2.7,1.14-0.843,2.56-1.6,4.27-2.26s3.59-1.18,5.64-1.57c2.05-0.387,3.99-0.581,5.81-0.581,1.78,0.00003,3.27,0.205,4.48,0.615s2.18,0.9,2.9,1.47c0.729,0.569,1.25,1.15,1.57,1.74,0.319,0.592,0.479,1.09,0.479,1.5zm-3.35-0.204c-0.00002-0.456-0.57-0.923-1.71-1.4-1.14-0.478-2.48-0.717-4.03-0.717-1.37,0.00002-2.37,0.0456-3.01,0.137-0.638,0.0911-1.07,0.183-1.3,0.274-0.0918,0.729-0.16,1.59-0.205,2.6-0.0452,1-0.0678,2.03-0.0678,3.07-0.00001,1.09,0.0341,2.15,0.102,3.18,0.0681,1.02,0.147,1.88,0.238,2.56,0.638-0.41,1.52-0.968,2.63-1.67,1.12-0.706,2.22-1.5,3.32-2.39,1.09-0.888,2.04-1.82,2.84-2.8,0.797-0.98,1.2-1.92,1.2-2.84z"/>
<path d="m360,153c-0.592,0.683-1.44,1.35-2.53,2.02-1.09,0.661-2.19,1.26-3.28,1.81-1.09,0.546-2.05,1.01-2.87,1.4-0.82,0.387-1.23,0.649-1.23,0.785-0.00001,0.138,0.0911,0.548,0.273,1.23,0.182,0.683,0.398,1.49,0.649,2.43,0.25,0.934,0.512,1.9,0.786,2.9s0.502,1.89,0.684,2.67c0.0904,0.456,0.204,1.05,0.341,1.78,0.137,0.729,0.262,1.46,0.376,2.19,0.114,0.729,0.217,1.38,0.308,1.95,0.0911,0.569,0.137,0.877,0.137,0.923-0.00001,0.683-0.114,1.39-0.342,2.12-0.228,0.729-0.592,1.09-1.09,1.09-0.274,0-0.525-0.114-0.753-0.342s-0.433-0.49-0.615-0.786-0.319-0.581-0.41-0.854c-0.0911-0.273-0.137-0.478-0.137-0.614-0.00001-0.0918,0.0115-0.229,0.0344-0.411s0.0344-0.387,0.0344-0.615c-0.00002-0.865-0.137-2.12-0.411-3.76-0.0904-0.501-0.272-1.28-0.545-2.32-0.273-1.05-0.547-2.12-0.821-3.21-0.318-1.28-0.683-2.67-1.09-4.17-0.182-0.638-0.296-0.957-0.342-0.957-0.32,0.00002-0.855,0.194-1.61,0.581-0.752,0.387-1.61,0.866-2.56,1.44-0.957,0.57-1.96,1.19-3.01,1.85s-2.03,1.28-2.94,1.84c-0.911,0.569-1.7,1.05-2.36,1.43-0.66,0.387-1.06,0.581-1.2,0.581-0.592,0.00002-1.07-0.205-1.43-0.615-0.364-0.41-0.546-0.866-0.546-1.37,0-0.274,0.376-0.673,1.13-1.2,0.752-0.523,1.69-1.1,2.8-1.74,1.12-0.638,2.32-1.3,3.62-1.98,1.3-0.683,2.51-1.3,3.62-1.84,1.12-0.546,2.05-1,2.8-1.37,0.752-0.365,1.13-0.547,1.13-0.547-0.41-2.1-0.752-3.96-1.03-5.6-0.228-1.41-0.445-2.71-0.65-3.9-0.205-1.18-0.308-1.82-0.308-1.91,0-0.592,0.125-1.04,0.376-1.33,0.251-0.296,0.536-0.444,0.854-0.444,0.502,0.00004,0.821,0.342,0.957,1.03,0.501,2.46,0.967,4.65,1.4,6.56s0.855,3.46,1.26,4.65c0.41-0.0904,1.12-0.352,2.12-0.785s2.05-0.9,3.14-1.4c1.09-0.501,2.08-0.945,2.97-1.33,0.888-0.387,1.4-0.581,1.54-0.581,0.273,0.00003,0.443,0.0914,0.512,0.274,0.0688,0.183,0.148,0.342,0.239,0.479z"/>
<path d="m368,153c-0.00001,0.0904-0.16,0.272-0.479,0.545s-0.695,0.558-1.13,0.854c-0.432,0.296-0.877,0.558-1.33,0.786-0.456,0.228-0.82,0.342-1.09,0.342-0.182,0.00003-0.421-0.0114-0.717-0.0344-0.296-0.0229-0.592-0.103-0.888-0.239s-0.558-0.33-0.786-0.581-0.342-0.582-0.342-0.992c0-0.637,0.228-1.24,0.683-1.81s1.05-0.855,1.78-0.855c0.136,0.00004,0.444,0.057,0.922,0.171s0.968,0.262,1.47,0.444c0.501,0.182,0.946,0.387,1.33,0.615,0.387,0.228,0.581,0.479,0.581,0.753zm2.25,25.6c-0.00001,0.318-0.239,0.592-0.717,0.82s-0.832,0.342-1.06,0.342c-0.455,0.00001-0.865-0.296-1.23-0.888s-0.684-1.28-0.957-2.05c-0.273-0.774-0.501-1.51-0.683-2.22-0.182-0.706-0.318-1.2-0.409-1.47-0.138-0.456-0.32-1-0.547-1.64-0.227-0.638-0.444-1.25-0.649-1.85-0.205-0.592-0.376-1.12-0.513-1.57-0.137-0.455-0.205-0.706-0.205-0.752-0.00001-0.638,0.125-1.23,0.375-1.78,0.25-0.546,0.558-0.82,0.924-0.82,0.41,0.00002,0.843,0.319,1.3,0.957,0.455,0.638,0.899,1.45,1.33,2.43,0.432,0.98,0.831,2.05,1.2,3.21,0.365,1.16,0.684,2.25,0.957,3.28,0.273,1.02,0.489,1.91,0.649,2.67,0.159,0.752,0.239,1.2,0.239,1.33z"/>
<path d="m386,169c-0.00001,1-0.137,1.96-0.41,2.87-0.273,0.911-0.638,1.71-1.09,2.39-0.455,0.683-0.991,1.22-1.61,1.61-0.615,0.387-1.29,0.581-2.02,0.581-1.28,0-2.28-0.365-3.01-1.09-0.729-0.729-1.29-1.57-1.67-2.53-0.388-0.957-0.639-1.92-0.752-2.9s-0.17-1.72-0.17-2.22c-0.00001-0.82,0.125-1.74,0.375-2.77s0.592-1.97,1.03-2.84c0.433-0.866,0.923-1.59,1.47-2.19,0.546-0.592,1.12-0.888,1.71-0.888,0.136,0.00003,0.352,0.0456,0.649,0.137,0.296,0.0911,0.604,0.228,0.923,0.41s0.604,0.41,0.855,0.683,0.422,0.593,0.512,0.958c0.502,0.0445,1,0.226,1.5,0.545,0.501,0.319,0.774,0.57,0.82,0.752,0.364,1.18,0.603,2.37,0.717,3.55s0.171,2.16,0.171,2.94zm-3.07-1.23c-0.00001-0.683-0.0685-1.4-0.205-2.15-0.137-0.752-0.411-1.52-0.821-2.29-0.0904,0.0459-0.204,0.0688-0.342,0.0688-0.182,0.00002-0.33-0.0226-0.444-0.0678s-0.216-0.0678-0.307-0.0678c-0.546,0.00002-0.979,0.148-1.3,0.444-0.319,0.296-0.559,0.683-0.719,1.16-0.16,0.478-0.262,0.991-0.308,1.54-0.0452,0.546-0.0678,1.07-0.0678,1.57-0.00001,0.501,0.0226,1.06,0.0678,1.67,0.0452,0.615,0.148,1.2,0.308,1.74,0.16,0.546,0.376,1.01,0.65,1.4,0.273,0.387,0.638,0.581,1.09,0.581,0.455,0.00001,0.842-0.239,1.16-0.717,0.319-0.478,0.57-1.04,0.752-1.67,0.182-0.638,0.308-1.26,0.376-1.88,0.0688-0.615,0.103-1.06,0.103-1.33z"/>
<path d="m414,176c-0.00003,0.273-0.0911,0.545-0.273,0.819-0.182,0.273-0.398,0.524-0.649,0.752-0.25,0.228-0.524,0.422-0.82,0.581s-0.558,0.239-0.786,0.239c-0.774,0-1.77-0.171-2.97-0.512-1.21-0.341-2.18-0.876-2.9-1.6-0.774-0.774-1.46-1.7-2.05-2.77-0.592-1.07-1.25-2.65-1.98-4.75-0.501,2.01-1.08,3.99-1.74,5.95s-1.72,3.76-3.18,5.4c-0.0904,0.0904-0.227,0.136-0.411,0.136-0.318,0-0.66-0.16-1.02-0.479-0.364-0.319-0.546-0.638-0.546-0.956-0.00001-0.318-0.0344-1.06-0.103-2.22-0.0688-1.16-0.149-2.46-0.24-3.9-0.0911-1.43-0.171-2.89-0.239-4.37-0.0681-1.48-0.102-2.7-0.102-3.66-0.00001-0.456,0.0229-1.06,0.0688-1.81,0.0459-0.752,0.182-1.4,0.409-1.95,0.0459-0.0917,0.217-0.274,0.513-0.547s0.626-0.41,0.991-0.41c0.32,0.00002,0.502,0.205,0.547,0.615,0.0452,0.41,0.0678,0.866,0.0678,1.37v10.8c0,0.228,0.0344,0.547,0.103,0.956,0.0688,0.41,0.171,0.705,0.308,0.887,0.501-1.09,0.967-2.38,1.4-3.86s0.855-2.89,1.26-4.24c0.41-1.34,0.82-2.48,1.23-3.42,0.41-0.934,0.82-1.4,1.23-1.4,0.456,0.00003,0.821,0.0911,1.09,0.273,0.273,0.182,0.501,0.547,0.683,1.09,0.228,1.32,0.411,2.49,0.547,3.52,0.137,1.02,0.308,1.95,0.513,2.77s0.501,1.58,0.888,2.29c0.387,0.706,0.922,1.36,1.6,1.95,0.638,0.592,1.36,1.03,2.15,1.3,0.797,0.273,1.49,0.41,2.08,0.41,0.274,0.00001,0.57-0.057,0.888-0.171s0.546-0.171,0.684-0.171c0.182,0.00001,0.353,0.16,0.512,0.479s0.239,0.525,0.239,0.616z"/>
<path d="m433,175c-0.00002,0.774-0.262,1.45-0.786,2.02-0.524,0.569-1.19,1.05-1.98,1.43-0.797,0.387-1.67,0.695-2.63,0.923-0.957,0.228-1.87,0.399-2.73,0.512-0.866,0.113-1.63,0.181-2.29,0.204-0.661,0.023-1.08,0.0344-1.26,0.0344-1,0.00001-1.78-0.16-2.32-0.479-0.546-0.319-0.82-0.888-0.82-1.71,0-0.274,0.0226-0.513,0.0678-0.719,0.0452-0.205,0.228-0.308,0.547-0.308,0.136,0.00001,0.364,0.0341,0.683,0.102,0.319,0.0681,0.57,0.102,0.752,0.102,0.182,0.00001,0.763-0.0341,1.74-0.102,0.98-0.0681,2.03-0.193,3.14-0.375,1.12-0.182,2.12-0.444,3.01-0.786,0.888-0.342,1.33-0.786,1.33-1.33-0.00001-0.0904-0.467-0.375-1.4-0.853-0.934-0.478-2.34-1.29-4.2-2.43-1.46-0.911-2.48-1.83-3.08-2.77-0.592-0.934-0.888-2.2-0.888-3.79,0-1,0.217-1.82,0.65-2.46,0.433-0.638,1.03-1.14,1.78-1.5,0.752-0.364,1.62-0.626,2.6-0.785s2.02-0.239,3.11-0.239c0.0918,0.00003,0.377,0.0456,0.855,0.137,0.478,0.0911,0.991,0.239,1.54,0.444,0.547,0.205,1.04,0.456,1.47,0.752,0.432,0.296,0.649,0.626,0.649,0.991-0.00002,0.0904-0.0796,0.227-0.239,0.409s-0.421,0.524-0.785,1.03c-0.138-0.0459-0.377-0.114-0.719-0.205-0.341-0.091-0.729-0.194-1.16-0.308-0.433-0.114-0.877-0.205-1.33-0.273-0.455-0.0681-0.82-0.102-1.09-0.102-1.18,0.00002-2.14,0.216-2.87,0.649-0.729,0.432-1.09,1.26-1.09,2.49-0.00001,0.592,0.239,1.14,0.717,1.64,0.478,0.501,1.08,0.968,1.81,1.4,0.729,0.433,1.51,0.866,2.36,1.3,0.843,0.432,1.63,0.899,2.36,1.4,0.729,0.501,1.33,1.04,1.81,1.61,0.479,0.569,0.718,1.22,0.719,1.95z"/>
<path d="m489,171c0.228,0.228,0.342,0.365,0.342,0.411-0.00002,0.0904-0.125,0.363-0.375,0.819-0.25,0.455-0.581,0.934-0.991,1.43-0.41,0.501-0.854,0.946-1.33,1.33-0.478,0.387-0.946,0.581-1.4,0.581-0.957,0.00001-1.73-0.194-2.32-0.581-0.592-0.387-1.08-0.877-1.47-1.47-0.387-0.592-0.683-1.24-0.888-1.95-0.205-0.706-0.376-1.38-0.512-2.02-0.0918-0.32-0.183-0.48-0.273-0.48-0.138,0.00002-0.411,0.49-0.821,1.47s-0.853,2.05-1.33,3.21c-0.478,1.16-0.934,2.23-1.37,3.21-0.433,0.98-0.718,1.47-0.854,1.47-0.82,0.00001-1.52-0.353-2.08-1.06-0.569-0.706-1.03-1.53-1.37-2.46-0.342-0.934-0.604-1.89-0.786-2.87s-0.296-1.74-0.342-2.29c-0.136-1.23-0.432-3.28-0.887-6.15s-0.843-6.36-1.16-10.5c-0.0904-0.865-0.193-1.65-0.307-2.36-0.114-0.706-0.24-1.49-0.376-2.36-0.137-0.866-0.251-1.85-0.342-2.94-0.0911-1.09-0.137-2.44-0.137-4.03,0-0.0903,0.0229-0.386,0.0688-0.887s0.114-1.05,0.205-1.64c0.0911-0.592,0.239-1.12,0.444-1.57,0.205-0.456,0.444-0.684,0.716-0.684,0.32,0.00005,0.616,0.194,0.89,0.581,0.273,0.387,0.512,0.832,0.717,1.33,0.205,0.501,0.353,0.98,0.444,1.44,0.0911,0.456,0.137,0.775,0.137,0.957-0.00001,0.683-0.0455,1.32-0.137,1.91-0.0911,0.592-0.137,1.14-0.137,1.64-0.00001,0.683,0.057,1.55,0.171,2.6s0.262,2.12,0.444,3.21,0.341,2.15,0.478,3.18c0.136,1.03,0.25,1.86,0.342,2.5-0.00001,0.0445,0.0455,0.363,0.137,0.955,0.0911,0.592,0.194,1.33,0.308,2.22,0.114,0.889,0.228,1.85,0.342,2.87,0.114,1.03,0.239,2.03,0.375,3.01s0.261,1.85,0.375,2.6c0.114,0.752,0.194,1.29,0.24,1.61-0.00001,0.136,0.034,0.33,0.102,0.58,0.0681,0.25,0.136,0.535,0.204,0.854,0.0681,0.319,0.148,0.615,0.24,0.888,0.0917,0.273,0.206,0.479,0.342,0.616,0.273-0.546,0.625-1.39,1.06-2.53,0.433-1.14,0.889-2.3,1.37-3.49,0.478-1.18,0.934-2.22,1.37-3.11,0.433-0.888,0.809-1.33,1.13-1.33,0.364,0.00002,0.66,0.0685,0.888,0.205,0.228,0.137,0.524,0.251,0.888,0.341,0.456,0.182,0.684,0.421,0.684,0.717-0.00002,0.296,0.0452,0.649,0.136,1.06,0.0918,0.548,0.24,1.27,0.445,2.15,0.205,0.889,0.444,1.75,0.717,2.6,0.273,0.843,0.592,1.56,0.956,2.15,0.364,0.592,0.729,0.889,1.09,0.888,0.182,0.00001,0.433-0.239,0.752-0.717s0.752-0.74,1.3-0.786c0.0918,0.00001,0.252,0.057,0.48,0.171s0.455,0.262,0.682,0.444z"/>
<path d="m512,177c0.0459,0.0918,0.0688,0.229,0.0688,0.411-0.00002,0.274-0.205,0.684-0.615,1.23-0.136,0.182-0.432,0.478-0.888,0.888s-1.07,0.82-1.85,1.23c-0.774,0.41-1.72,0.774-2.84,1.09-1.12,0.318-2.43,0.478-3.93,0.478-1.05,0-2.07-0.239-3.07-0.717s-1.89-1.18-2.67-2.12c-0.774-0.934-1.41-2.1-1.91-3.49-0.501-1.39-0.752-3.02-0.752-4.89,0-1.78,0.228-3.44,0.683-4.99s1.04-2.92,1.74-4.1c0.706-1.18,1.49-2.12,2.36-2.8,0.866-0.683,1.71-1.03,2.53-1.03,0.729,0.00003,1.47,0.148,2.22,0.444,0.752,0.296,1.44,0.672,2.05,1.13,0.615,0.456,1.1,0.969,1.47,1.54,0.365,0.569,0.547,1.15,0.547,1.74-0.00001,0.683-0.308,1.39-0.923,2.12-0.615,0.729-1.36,1.4-2.22,2.02-0.866,0.615-1.73,1.12-2.6,1.5-0.866,0.387-1.55,0.581-2.05,0.581-0.273,0.00001-0.511-0.125-0.716-0.376s-0.308-0.559-0.308-0.923c-0.00001-0.638,0.285-1.14,0.854-1.5,0.569-0.364,1.2-0.695,1.88-0.991,0.683-0.296,1.31-0.649,1.88-1.06,0.569-0.41,0.854-0.98,0.854-1.71-0.00002-0.0918-0.114-0.32-0.342-0.684s-0.843-0.546-1.85-0.546c-0.455,0.00002-0.978,0.262-1.57,0.786s-1.16,1.23-1.71,2.12c-0.547,0.889-1,1.94-1.37,3.14-0.364,1.21-0.546,2.52-0.546,3.93,0,1.18,0.217,2.26,0.65,3.21,0.433,0.957,0.991,1.77,1.67,2.43,0.683,0.661,1.48,1.17,2.39,1.54,0.911,0.364,1.85,0.546,2.8,0.546,0.683,0,1.42-0.148,2.22-0.444,0.797-0.296,1.55-0.615,2.26-0.957,0.706-0.342,1.32-0.661,1.84-0.957,0.523-0.296,0.854-0.444,0.992-0.444,0.136,0.00001,0.284,0.0685,0.443,0.205,0.159,0.137,0.262,0.274,0.308,0.41z"/>
<path d="m533,163c-0.00002,0.318-0.137,0.58-0.41,0.785s-0.592,0.376-0.957,0.513-0.73,0.24-1.09,0.308c-0.364,0.0682-0.66,0.102-0.888,0.102-0.683,0.00002-1.14-0.0455-1.37-0.137-0.228-0.091-0.41-0.137-0.546-0.137-1.14,0.00002-2.05,0.0911-2.73,0.273-0.683,0.182-1.22,0.478-1.61,0.888-0.387,0.41-0.638,0.923-0.752,1.54-0.114,0.615-0.171,1.36-0.171,2.22-0.00001,1.46,0.057,2.62,0.171,3.49,0.114,0.866,0.228,1.57,0.341,2.12,0.113,0.546,0.227,0.968,0.341,1.26,0.114,0.296,0.171,0.581,0.171,0.855-0.00001,0.364-0.194,0.752-0.581,1.16-0.387,0.41-0.74,0.615-1.06,0.615-0.546,0-1.04-0.49-1.47-1.47-0.433-0.98-0.798-2.14-1.09-3.49-0.296-1.34-0.535-2.68-0.717-4s-0.273-2.32-0.273-3.01c0-0.776,0.0681-1.52,0.204-2.22,0.136-0.706,0.318-1.32,0.546-1.84,0.228-0.524,0.479-0.946,0.752-1.26,0.273-0.319,0.547-0.479,0.821-0.479,0.228,0.00003,0.41,0.08,0.546,0.24s0.25,0.342,0.341,0.547c0.0911,0.205,0.194,0.387,0.308,0.546s0.262,0.239,0.444,0.239c0.41,0.00003,1.07-0.205,1.98-0.615,0.911-0.41,2.03-0.615,3.35-0.615,1.23,0.00002,2.15,0.0341,2.77,0.102,0.615,0.0682,1.22,0.216,1.81,0.444,0.136,0.0459,0.307,0.148,0.512,0.308,0.205,0.159,0.308,0.399,0.308,0.719z"/>
<path d="m558,177c0.0459,0.0918,0.0688,0.229,0.0688,0.411-0.00002,0.274-0.205,0.684-0.615,1.23-0.136,0.182-0.432,0.478-0.888,0.888s-1.07,0.82-1.85,1.23c-0.774,0.41-1.72,0.774-2.84,1.09-1.12,0.318-2.43,0.478-3.93,0.478-1.05,0-2.07-0.239-3.07-0.717s-1.89-1.18-2.67-2.12c-0.774-0.934-1.41-2.1-1.91-3.49-0.501-1.39-0.752-3.02-0.752-4.89,0-1.78,0.228-3.44,0.683-4.99s1.04-2.92,1.74-4.1c0.706-1.18,1.49-2.12,2.36-2.8,0.866-0.683,1.71-1.03,2.53-1.03,0.729,0.00003,1.47,0.148,2.22,0.444,0.752,0.296,1.44,0.672,2.05,1.13,0.615,0.456,1.1,0.969,1.47,1.54,0.365,0.569,0.547,1.15,0.547,1.74-0.00001,0.683-0.308,1.39-0.923,2.12-0.615,0.729-1.36,1.4-2.22,2.02-0.866,0.615-1.73,1.12-2.6,1.5-0.866,0.387-1.55,0.581-2.05,0.581-0.273,0.00001-0.511-0.125-0.716-0.376s-0.308-0.559-0.308-0.923c0-0.638,0.285-1.14,0.854-1.5,0.569-0.364,1.2-0.695,1.88-0.991,0.683-0.296,1.31-0.649,1.88-1.06,0.569-0.41,0.854-0.98,0.854-1.71-0.00001-0.0918-0.114-0.32-0.342-0.684s-0.843-0.546-1.85-0.546c-0.455,0.00002-0.978,0.262-1.57,0.786s-1.16,1.23-1.71,2.12c-0.547,0.889-1,1.94-1.37,3.14-0.364,1.21-0.546,2.52-0.546,3.93,0,1.18,0.217,2.26,0.65,3.21,0.433,0.957,0.991,1.77,1.67,2.43,0.683,0.661,1.48,1.17,2.39,1.54,0.911,0.364,1.85,0.546,2.8,0.546,0.683,0,1.42-0.148,2.22-0.444,0.797-0.296,1.55-0.615,2.26-0.957,0.706-0.342,1.32-0.661,1.84-0.957,0.523-0.296,0.854-0.444,0.992-0.444,0.136,0.00001,0.284,0.0685,0.443,0.205,0.159,0.137,0.262,0.274,0.308,0.41z"/>
</g>
<g stroke-linejoin="miter" transform="translate(77.31638,-1.3284405)" stroke="#8085e8" stroke-linecap="butt" stroke-dasharray="none" stroke-miterlimit="4" fill="none">
<path d="m786,141c75.8,1.01,67.7-26.3,62.6-68.7-6-42.6-6-42.6-6-42.6" transform="matrix(0.60749736,0,0,0.6074971,4.9287817,87.469516)" stroke-width="4"/>
<path d="m498,126c12.9-8.59,19.6-22.1,19.6-22.1s0.614,3.07,12.9,9.2c12.3,6.14,10.4,5.52,10.4,5.52" stroke-width="2.42998885999999990"/>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 445 B

File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show more